[
  {
    "path": ".authors.yml",
    "content": "- name: Jaime Rodríguez-Guerra\n  email: jaimergp@users.noreply.github.com\n  aliases:\n  - jaimergp\n  num_commits: 174\n  first_commit: 2022-01-31 17:24:37\n  github: jaimergp\n- name: Jannis Leidel\n  email: jannis@leidel.info\n  num_commits: 43\n  first_commit: 2022-02-17 14:48:48\n  github: jezdez\n- name: pre-commit-ci[bot]\n  email: 66853113+pre-commit-ci[bot]@users.noreply.github.com\n  num_commits: 112\n  first_commit: 2022-11-22 08:39:31\n  github: pre-commit-ci[bot]\n- name: Christopher Ostrouchov\n  email: chris.ostrouchov@gmail.com\n  num_commits: 10\n  first_commit: 2023-01-24 15:12:29\n  github: costrouc\n- name: Daniel Holth\n  email: dholth@anaconda.com\n  num_commits: 32\n  first_commit: 2022-10-19 21:11:39\n  github: dholth\n- name: Matthew R. Becker\n  email: beckermr@users.noreply.github.com\n  num_commits: 1\n  first_commit: 2022-01-19 18:26:25\n  github: beckermr\n- name: conda-bot\n  email: 18747875+conda-bot@users.noreply.github.com\n  aliases:\n  - Conda Bot\n  num_commits: 103\n  first_commit: 2022-11-15 16:45:31\n  github: conda-bot\n- name: Ken Odegard\n  email: kodegard@anaconda.com\n  num_commits: 10\n  first_commit: 2022-03-04 23:25:33\n  github: kenodegard\n- name: Albert DeFusco\n  email: albert.defusco+gh@me.com\n  num_commits: 1\n  first_commit: 2023-03-01 13:29:51\n  github: AlbertDeFusco\n- name: John Kirkham\n  github: jakirkham\n  email: jakirkham@gmail.com\n  num_commits: 1\n  first_commit: 2023-04-18 12:42:06\n- name: Travis Hathaway\n  email: travis.j.hathaway@gmail.com\n  num_commits: 8\n  first_commit: 2023-11-10 15:58:32\n  github: travishathaway\n- name: Klaus Zimmermann\n  email: klaus.zimmermann@quansight.com\n  num_commits: 1\n  first_commit: 2024-06-11 10:52:46\n- name: Thomas Lam\n  email: 79589038+tl-hbk@users.noreply.github.com\n  num_commits: 1\n  first_commit: 2024-03-19 14:05:09\n  github: tl-hbk\n- name: dependabot[bot]\n  email: 49699333+dependabot[bot]@users.noreply.github.com\n  num_commits: 26\n  first_commit: 2024-07-22 19:11:59\n  github: dependabot[bot]\n- name: Jonathan J. Helmus\n  email: jjhelmus@gmail.com\n  num_commits: 4\n  first_commit: 2024-09-20 12:11:32\n  github: jjhelmus\n- name: Kevin Markham\n  email: justmarkham@users.noreply.github.com\n  num_commits: 1\n  first_commit: 2024-08-12 11:49:20\n  github: justmarkham\n- name: Julien Jerphanion\n  email: git@jjerphan.xyz\n  github: jjerphan\n  num_commits: 1\n  first_commit: 2025-03-05 00:42:28\n- name: Agriya Khetarpal\n  email: 74401230+agriyakhetarpal@users.noreply.github.com\n  github: agriyakhetarpal\n  num_commits: 1\n  first_commit: 2025-10-16 17:26:43\n- name: Stacy Noland\n  email: 46572585+stacynoland@users.noreply.github.com\n  github: stacynoland\n  num_commits: 1\n  first_commit: 2025-11-24 12:33:24\n- name: Ryan Keith\n  email: rkeith@anaconda.com\n  num_commits: 1\n  first_commit: 2025-12-11 16:50:18\n  github: ryanskeith\n- name: Sophia Castellarin\n  email: scastellarin@openteams.com\n  num_commits: 1\n  first_commit: 2026-01-07 03:17:00\n  github: soapy1\n- name: John Costa\n  email: costajohnt@gmail.com\n  github: costajohnt\n  num_commits: 1\n  first_commit: 2026-04-27 03:34:42\n- name: Dan Yeaw\n  email: dan@yeaw.me\n  num_commits: 1\n  first_commit: 2026-05-01 18:41:55\n"
  },
  {
    "path": ".devcontainer/apt-deps.txt",
    "content": "git\nless\nhtop\nnano\nssh\n"
  },
  {
    "path": ".devcontainer/conda-forge/devcontainer.json",
    "content": "// For format details, see https://aka.ms/devcontainer.json. For config options, see the\n{\n    \"name\": \"Miniforge (default-channel=conda-forge)\",\n    \"image\": \"condaforge/miniforge3:latest\",\n    // Uncomment to force x64 instead of native (slower!)\n    // \"runArgs\": [\"--platform=linux/amd64\"],\n    // Features to add to the dev container. More info: https://containers.dev/features.\n    // \"features\": {},\n    // Use 'forwardPorts' to make a list of ports inside the container available locally.\n    // \"forwardPorts\": [],\n    \"mounts\": [\n        \"source=${localWorkspaceFolder}/../conda,target=/workspaces/conda,type=bind,consistency=cached\",\n        \"source=${localWorkspaceFolder}/../mamba,target=/workspaces/mamba,type=bind,consistency=cached\"\n    ],\n    // Use 'postCreateCommand' to run commands after the container is created.\n    \"postCreateCommand\": \"bash /workspaces/conda-libmamba-solver/.devcontainer/post_create.sh conda-forge\",\n    // Use 'postStartCommand' to run commands after the container is started.\n    \"postStartCommand\": \"bash /workspaces/conda-libmamba-solver/.devcontainer/post_start.sh\",\n    // Configure tool-specific properties.\n    \"customizations\": {\n        \"vscode\": {\n            \"settings\": {\n                \"python.defaultInterpreterPath\": \"/opt/conda/bin/python\",\n                \"python.testing.pytestArgs\": [\n                    \"tests\"\n                ],\n                \"python.testing.unittestEnabled\": false,\n                \"python.testing.pytestEnabled\": true\n            },\n            \"extensions\": [\n                \"charliermarsh.ruff\",\n                \"eamodio.gitlens\",\n                \"ms-toolsai.jupyter\",\n                \"be5invis.toml\"\n            ]\n        }\n    }\n    // Adjust to connect as non-root instead. More info: https://aka.ms/dev-containers-non-root.\n    // \"remoteUser\": \"root\",\n}\n"
  },
  {
    "path": ".devcontainer/defaults/devcontainer.json",
    "content": "// For format details, see https://aka.ms/devcontainer.json\n{\n    \"name\": \"Miniconda (default-channel=defaults)\",\n    \"image\": \"continuumio/miniconda3:latest\",\n    // Uncomment to force x64 instead of native (slower!)\n    // \"runArgs\": [\"--platform=linux/amd64\"],\n    // Features to add to the dev container. More info: https://containers.dev/features.\n    // \"features\": {},\n    // Use 'forwardPorts' to make a list of ports inside the container available locally.\n    // \"forwardPorts\": [],\n    \"mounts\": [\n        \"source=${localWorkspaceFolder}/../conda,target=/workspaces/conda,type=bind,consistency=cached\",\n        \"source=${localWorkspaceFolder}/../mamba,target=/workspaces/mamba,type=bind,consistency=cached\"\n    ],\n    // Use 'postCreateCommand' to run commands after the container is created.\n    \"postCreateCommand\": \"bash /workspaces/conda-libmamba-solver/.devcontainer/post_create.sh defaults\",\n    // Use 'postStartCommand' to run commands after the container is started.\n    \"postStartCommand\": \"bash /workspaces/conda-libmamba-solver/.devcontainer/post_start.sh defaults\",\n    // Configure tool-specific properties.\n    \"customizations\": {\n        \"vscode\": {\n            \"settings\": {\n                \"python.defaultInterpreterPath\": \"/opt/conda/bin/python\",\n                \"python.testing.pytestArgs\": [\n                    \"tests\"\n                ],\n                \"python.testing.unittestEnabled\": false,\n                \"python.testing.pytestEnabled\": true\n            },\n            \"extensions\": [\n                \"charliermarsh.ruff\",\n                \"eamodio.gitlens\",\n                \"ms-toolsai.jupyter\",\n                \"be5invis.toml\"\n            ]\n        }\n    }\n    // Adjust to connect as non-root instead. More info: https://aka.ms/dev-containers-non-root.\n    // \"remoteUser\": \"root\",\n}\n"
  },
  {
    "path": ".devcontainer/post_create.sh",
    "content": "#!/bin/bash\n\n# This script assumes we are running in a Miniconda container where:\n# - /opt/conda is the Miniconda or Miniforge installation directory\n# - https://github.com/conda/conda is mounted at /workspaces/conda\n# - https://github.com/conda/conda-libmamba-solver is mounted at\n#   /workspaces/conda-libmamba-solver\n# - https://github.com/mamba-org/mamba is (optionally) mounted at\n#   /workspaces/mamba\n\nset -euo pipefail\n\nHERE=$(dirname $0)\nBASE_CONDA=${BASE_CONDA:-/opt/conda}\nSRC_CONDA=${SRC_CONDA:-/workspaces/conda}\nSRC_CONDA_LIBMAMBA_SOLVER=${SRC_CONDA_LIBMAMBA_SOLVER:-/workspaces/conda-libmamba-solver}\n\nif which apt-get > /dev/null; then\n    echo \"Installing system dependencies\"\n    apt-get update\n    DEBIAN_FRONTEND=noninteractive xargs -a \"$HERE/apt-deps.txt\" apt-get install -y\nfi\n\n\nif [ ! -f \"$SRC_CONDA/pyproject.toml\" ]; then\n    echo \"https://github.com/conda/conda not found! Please clone or mount to $SRC_CONDA\"\n    exit 1\nfi\n\n# Clear history to avoid unneeded conflicts\necho \"Clearing base history...\"\necho '' > \"$BASE_CONDA/conda-meta/history\"\n\necho \"Setting default channel...\"\n\"$BASE_CONDA/bin/conda\" config --append channels $1\n\necho \"Installing dev & test dependencies...\"\n\"$BASE_CONDA/bin/conda\" install -n base -c $1 --yes \\\n    --file=\"$SRC_CONDA/tests/requirements.txt\" \\\n    --file=\"$SRC_CONDA/tests/requirements-ci.txt\" \\\n    --file=\"$SRC_CONDA/tests/requirements-Linux.txt\" \\\n    --file=\"$SRC_CONDA/tests/requirements-s3.txt\" \\\n    --file=\"$SRC_CONDA_LIBMAMBA_SOLVER/dev/requirements.txt\" \\\n    --file=\"$SRC_CONDA_LIBMAMBA_SOLVER/tests/requirements.txt\" \\\n    conda-forge::editables \\\n    conda-pypi \\\n    pre-commit\n"
  },
  {
    "path": ".devcontainer/post_start.sh",
    "content": "#!/bin/bash\n\n# This script assumes we are running in a Miniconda container where:\n# - /opt/conda is the Miniconda or Miniforge installation directory\n# - https://github.com/conda/conda is mounted at /workspaces/conda\n# - https://github.com/conda/conda-libmamba-solver is mounted at\n#   /workspaces/conda-libmamba-solver\n# - https://github.com/mamba-org/mamba is (optionally) mounted at\n#   /workspaces/mamba\n\nset -euo pipefail\n\nBASE_CONDA=${BASE_CONDA:-/opt/conda}\nSRC_CONDA=${SRC_CONDA:-/workspaces/conda}\nSRC_CONDA_LIBMAMBA_SOLVER=${SRC_CONDA_LIBMAMBA_SOLVER:-/workspaces/conda-libmamba-solver}\nSRC_MAMBA=${SRC_MAMBA:-/workspaces/mamba}\n\ncat >> ~/.bashrc <<EOF\nfunction develop-mamba() (\n  # Runs in a subshell to avoid polluting the current shell\n  set -euo pipefail\n  if ! conda config --show channels | grep -q conda-forge; then\n    echo \"Miniconda not compatible with develop-mamba\"\n    exit 1\n  fi\n  if [ ! -f \"$SRC_MAMBA/libmamba/CMakeLists.txt\" ]; then\n    echo \"Could not find mamba-org/mamba at $SRC_MAMBA\"\n    exit 1\n  fi\n  if [ -f \"$SRC_MAMBA/mamba/setup.py\" ]; then\n    echo \"Mamba 1.x found at $SRC_MAMBA\"\n    mamba_version=1\n    environment_yaml=\"$SRC_MAMBA/mamba/environment-dev.yml\"\n  else\n    echo \"Mamba 2.x found at $SRC_MAMBA\"\n    environment_yaml=\"$SRC_MAMBA/dev/environment-dev.yml\"\n    mamba_version=2\n  fi\n  # Install mamba dev dependencies only once:\n  if [ ! -f ~/.mamba-develop-installed ]; then\n    # remove \"sel(win)\" in environment yaml hack since conda does not understand\n    # libmamba specific specs\n    sed '/sel(.*)/d' \"\\$environment_yaml\" > /tmp/mamba-environment-dev.yml\n    # Environment.yml is missing make\n    echo \"  - make\" >> /tmp/mamba-environment-dev.yml\n    \"$BASE_CONDA/condabin/conda\" env update \\\n      --quiet \\\n      --prefix \"$BASE_CONDA\" \\\n      --file /tmp/mamba-environment-dev.yml\n    # Clean build directory to avoid issues with stale build files\n    test -f \"$SRC_MAMBA/build/CMakeCache.txt\" && rm -rf \"$SRC_MAMBA/build\"\n  fi\n  # Compile\n  cd \"$SRC_MAMBA\"\n  \"$BASE_CONDA/bin/cmake\" -B build/ \\\n      -DBUILD_LIBMAMBA=ON \\\n      -DBUILD_SHARED=ON \\\n      -DCMAKE_INSTALL_PREFIX=\"$BASE_CONDA\" \\\n      -DCMAKE_PREFIX_PATH=\"$BASE_CONDA\" \\\n      -DBUILD_LIBMAMBAPY=ON\n  \"$BASE_CONDA/bin/cmake\" --build build/ -j\\${NPROC:-2}\n  if [ ! -f ~/.mamba-develop-installed ]; then\n    \"$BASE_CONDA/condabin/conda\" remove -p \"$BASE_CONDA\" -yq --force libmambapy libmamba\n  fi\n  make install -C build/\n  cd -\n  \"$BASE_CONDA/bin/pip\" install -e \"$SRC_MAMBA/libmambapy/\" --no-deps\n  if [ \"\\$mamba_version\" == \"1\" ]; then\n    test -f \"$BASE_CONDA/conda-meta/mamba-\"*\".json\" && \"$BASE_CONDA/bin/pip\" install -e \"$SRC_MAMBA/mamba/\" --no-deps\n  else\n    echo \"Mamba binary installation not supported yet\"\n  fi\n  touch ~/.mamba-develop-installed || true\n)\nEOF\n\ncd \"$SRC_CONDA\"\necho \"Initializing conda in dev mode...\"\n\"$BASE_CONDA/bin/python\" -m conda init --dev bash\ncd -\n\necho \"Installing conda-libmamba-solver in dev mode...\"\n\"$BASE_CONDA/bin/conda\" pypi install -e \"$SRC_CONDA_LIBMAMBA_SOLVER\"\n\nset -x\nconda list -p \"$BASE_CONDA\"\nconda info\nconda config --show-sources\nset +x\necho \"Source ~/.bashrc and run develop-mamba() for dev-install; mamba at $SRC_MAMBA\"\n"
  },
  {
    "path": ".flake8",
    "content": "[flake8]\nmax-line-length = 99\nignore = E126,E133,E226,E241,E242,E302,E704,E731,E722,W503,E402,W504,F821,E203\nexclude = tests/*,conda_libmamba_solver/mamba_utils.py\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "# Syntax for this file at https://help.github.com/articles/about-codeowners/\n\n*       @conda/conda-maintainers\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/0_bug.yml",
    "content": "# edit this in https://github.com/conda/infrastructure\n\nname: Bug Report\ndescription: Create a bug report.\nlabels:\n  - type::bug\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Because processing new bug reports is time-consuming, we would like to ask you to fill out the following form to the best of your ability and as completely as possible.\n\n        > [!NOTE]\n        > Bug reports that are incomplete or missing information may be closed as inactionable.\n\n        Since there are already a lot of open issues, please also take a moment to search existing ones to see if your bug has already been reported. If you find something related, please upvote that issue and provide additional details as necessary.\n\n        💐 Thank you for helping to make `conda/conda-libmamba-solver` better. We would be unable to improve `conda/conda-libmamba-solver` without our community!\n  - type: checkboxes\n    id: checks\n    attributes:\n      label: Checklist\n      description: Please confirm and check all of the following options.\n      options:\n        - label: I added a descriptive title\n          required: true\n        - label: I searched open reports and couldn't find a duplicate\n          required: true\n  - type: textarea\n    id: what\n    attributes:\n      label: What happened?\n      description: What should have happened instead? Please provide as many details as possible. The more information provided, the more likely we are able to replicate your problem and offer a solution.\n    validations:\n      required: true\n  - type: textarea\n    id: info\n    attributes:\n      label: Conda Info\n      description: |\n        Let's collect some basic information about your conda install.\n\n        Please run the following command from your command line and paste the output below.\n\n        ```bash\n        conda info\n        ```\n      render: shell\n  - type: textarea\n    id: config\n    attributes:\n      label: Conda Config\n      description: |\n        Let's collect any customizations you may have for your conda install.\n\n        Please run the following command from your command line and paste the output below.\n\n        ```bash\n        conda config --show-sources\n        ```\n      render: shell\n  - type: textarea\n    id: list\n    attributes:\n      label: Conda list\n      description: |\n        The packages installed into your environment can offer clues as to the problem you are facing.\n\n        Please activate the environment within which you are encountering this bug, run the following command from your command line, and paste the output below.\n\n        ```bash\n        conda list --show-channel-urls\n        ```\n      render: shell\n\n  - type: textarea\n    id: context\n    attributes:\n      label: Additional Context\n      description: Include any additional information (or screenshots) that you think would be valuable.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/1_feature.yml",
    "content": "# edit this in https://github.com/conda/infrastructure\n\nname: Feature Request\ndescription: Create a feature request.\nlabels:\n  - type::feature\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Because processing new feature requests is time-consuming, we would like to ask you to fill out the following form to the best of your ability and as completely as possible.\n\n        > [!NOTE]\n        > Feature requests that are incomplete or missing information may be closed as inactionable.\n\n        Since there are already a lot of open issues, please also take a moment to search existing ones to see if your feature request has already been submitted. If you find something related, please upvote that issue and provide additional details as necessary.\n\n        💐 Thank you for helping to make `conda/conda-libmamba-solver` better. We would be unable to improve `conda/conda-libmamba-solver` without our community!\n  - type: checkboxes\n    id: checks\n    attributes:\n      label: Checklist\n      description: Please confirm and check all of the following options.\n      options:\n        - label: I added a descriptive title\n          required: true\n        - label: I searched open requests and couldn't find a duplicate\n          required: true\n  - type: textarea\n    id: idea\n    attributes:\n      label: What is the idea?\n      description: Describe what the feature is and the desired state.\n    validations:\n      required: true\n  - type: textarea\n    id: why\n    attributes:\n      label: Why is this needed?\n      description: Who would benefit from this feature? Why would this add value to them? What problem does this solve?\n  - type: textarea\n    id: what\n    attributes:\n      label: What should happen?\n      description: What should be the user experience with the feature? Describe from a user perspective what they would do and see.\n  - type: textarea\n    id: context\n    attributes:\n      label: Additional Context\n      description: Include any additional information that you think would be valuable.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/2_documentation.yml",
    "content": "# edit this in https://github.com/conda/infrastructure\n\nname: Documentation\ndescription: Create a documentation related issue.\nlabels:\n  - type::documentation\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        > [!NOTE]\n        > Documentation requests that are incomplete or missing information may be closed as inactionable.\n\n        Since there are already a lot of open issues, please also take a moment to search existing ones to see if your bug has already been reported. If you find something related, please upvote that issue and provide additional details as necessary.\n\n        💐 Thank you for helping to make conda better. We would be unable to improve conda without our community!\n  - type: checkboxes\n    id: checks\n    attributes:\n      label: Checklist\n      description: Please confirm and check all of the following options.\n      options:\n        - label: I added a descriptive title\n          required: true\n        - label: I searched open reports and couldn't find a duplicate\n          required: true\n  - type: textarea\n    id: what\n    attributes:\n      label: What happened?\n      description: Mention here any typos, broken links, or missing, incomplete, or outdated information, etc. that you have noticed in the conda docs or CLI help.\n    validations:\n      required: true\n  - type: textarea\n    id: context\n    attributes:\n      label: Additional Context\n      description: Include any additional information (or screenshots) that you think would be valuable.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/epic.yml",
    "content": "# edit this in https://github.com/conda/infrastructure\n\nname: Epic\ndescription: A collection of related tickets.\nlabels:\n  - epic\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        This form is intended for grouping and collecting together related tickets to better gauge the scope of a problem/feature.\n\n        If you are attempting to report a bug, propose a new feature, or some other code change please use one of the other forms available.\n\n        > [!NOTE]\n        > Epics that are incomplete or missing information may be closed as inactionable.\n\n        Since there are already a lot of open issues, please also take a moment to search existing ones to see if a similar epic has already been opened. If you find something related, please upvote that issue and provide additional details as necessary.\n\n        💐 Thank you for helping to make `conda/conda-libmamba-solver` better. We would be unable to improve `conda/conda-libmamba-solver` without our community!\n\n  - type: checkboxes\n    id: checks\n    attributes:\n      label: Checklist\n      description: Please confirm and check all of the following options.\n      options:\n        - label: I added a descriptive title\n          required: true\n        - label: I searched open issues and couldn't find a duplicate\n          required: true\n\n  - type: textarea\n    id: what\n    attributes:\n      label: What?\n      description: >-\n        What feature or problem will be addressed in this epic?\n      placeholder: Please describe here.\n    validations:\n      required: true\n\n  - type: textarea\n    id: why\n    attributes:\n      label: Why?\n      description: >-\n        Why is the reported issue(s) a problem, or why is the proposed feature needed?\n        (Research and spike issues can be linked here.)\n      value: |\n        - [ ] <supporting issue from user, research, or spike>\n      placeholder: Please describe here and/or link to relevant supporting issues.\n    validations:\n      required: true\n\n  - type: textarea\n    id: user_impact\n    attributes:\n      label: User impact\n      description: >-\n        In what specific way(s) will users benefit from this change? (e.g. use cases or performance improvements)\n      placeholder: Please describe here.\n    validations:\n      required: true\n\n  - type: textarea\n    id: goals\n    attributes:\n      label: Goals\n      description: >-\n        What goal(s) should this epic accomplish?\n      value: |\n        - [ ] <goal>\n    validations:\n      required: true\n\n  - type: textarea\n    id: tasks\n    attributes:\n      label: Tasks\n      description: >-\n        What needs to be done to implement this change?\n      value: |\n        - [ ] <task or PR>\n    validations:\n      required: false\n\n  - type: textarea\n    id: blocked_by\n    attributes:\n      label: 'This epic is blocked by:'\n      description: >-\n        Epics and issues that block this epic.\n      value: |\n        - [ ] <dependency epic or issue>\n    validations:\n      required: false\n\n  - type: textarea\n    id: blocks\n    attributes:\n      label: 'This epic blocks:'\n      description: >-\n        Epics and issues that are blocked by this epic.\n      value: |\n        - [ ] <dependency epic or issue>\n    validations:\n      required: false\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "<!-- Hello! Thanks for submitting a PR! To help make things go a bit more\n     smoothly, we would appreciate it if you follow this template. -->\n\n### Description\n\n<!-- Good things to put here include:\n       - reasons for the change (please link any relevant issues!),\n       - any noteworthy (or hacky) choices to be aware of,\n       - or what the problem resolved here looked like. -->\n\n### Checklist - did you ...\n\n<!-- If any of the following items aren't relevant to your contribution,\n     please either tick them or use ~strikethrough~ so we know you've gone\n     through the checklist. -->\n\n- [ ] Add a file to the `news` directory ([using the template](https://github.com/conda/conda-libmamba-solver/blob/main/news/TEMPLATE)) for the next release's release notes?\n     <!-- All \"significant\" changes should get an entry:\n            - user-facing changes or enhancements\n            - bug fixes\n            - deprecations\n            - documentation updates\n            - etc -->\n- [ ] Add / update necessary tests?\n- [ ] Add / update outdated documentation?\n\n\n<!-- Just as a reminder, everyone in all conda org spaces (including PRs)\n     must follow the Conda Org Code of Conduct (link below).\n\n     Finally, once again, thanks for your time and effort. If you have any\n     feedback in regards to your experience contributing here, please\n     let us know!\n\n     Helpful links:\n       - Conda Org COC: https://github.com/conda/conda-libmamba-solver/blob/main/CODE_OF_CONDUCT.md\n       - Contributing docs: https://github.com/conda/conda-libmamba-solver/blob/main/CONTRIBUTING.md -->\n"
  },
  {
    "path": ".github/TEST_FAILURE_REPORT_TEMPLATE.md",
    "content": "---\ntitle: \"{{ env.TITLE }}\"\nlabels: [type::bug, type::testing]\n---\n\nThe {{ workflow }} workflow failed on {{ date | date(\"YYYY-MM-DD HH:mm\") }} UTC\n\nFull run: https://github.com/conda/conda-libmamba-solver/actions/runs/{{ env.RUN_ID }}\n\n(This post will be updated if another test fails, as long as this issue remains open.)\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: \"weekly\"\n    groups:\n      github-actions:\n        patterns:\n          - '*'\n"
  },
  {
    "path": ".github/disclaimer.txt",
    "content": "Copyright (C) 2022 Anaconda, Inc\nCopyright (C) 2023 conda\nSPDX-License-Identifier: BSD-3-Clause\n"
  },
  {
    "path": ".github/labels.yml",
    "content": "# Builds\n- name: build::review\n  description: trigger a build for this PR\n  color: \"7B4052\"\n"
  },
  {
    "path": ".github/template-files/config.yml",
    "content": "conda/governance:\n  # [required] community files\n  - CODE_OF_CONDUCT.md\n\nconda/conda:\n  # issue template details for templates/issues/bug.yml template\n  - .github/template-files/templates/issue_template_details.yml\n\nconda/infrastructure:\n  # [required] general workflows\n  - .github/workflows/cla.yml\n  - .github/workflows/update.yml\n\n  # [optional] to include repo in https://github.com/orgs/conda/projects/2\n  - .github/workflows/issues.yml\n  - .github/workflows/labels.yml\n  - .github/workflows/project.yml\n\n  # [optional] stale bot workflows\n  - .github/workflows/stale.yml\n  - .github/workflows/lock.yml\n\n  # [optional] general processes for the conda org\n  - src: templates/HOW_WE_USE_GITHUB.md\n    dst: HOW_WE_USE_GITHUB.md\n\n  # [optional] standard issue templates\n  - src: templates/issues/bug.yml\n    dst: .github/ISSUE_TEMPLATE/0_bug.yml\n\n  - src: templates/issues/feature.yml\n    dst: .github/ISSUE_TEMPLATE/1_feature.yml\n\n  - src: templates/issues/documentation.yml\n    dst: .github/ISSUE_TEMPLATE/2_documentation.yml\n\n  - src: templates/issues/epic.yml\n    dst: .github/ISSUE_TEMPLATE/epic.yml\n\n  # [optional] standard PR template\n  - src: templates/pull_requests/news_tests_docs.md\n    dst: .github/template-files/templates/pull_request_template_details.md\n  - src: templates/pull_requests/base.md\n    dst: .github/PULL_REQUEST_TEMPLATE.md\n\n  # [optional] rever release files\n  - src: templates/releases/RELEASE.md\n    dst: RELEASE.md\n    with:\n      canary_channel: https://anaconda.org/conda-canary\n      placeholder: YY.MM.MICRO\n      placeholder_x: YY.MM.x\n  - src: templates/releases/rever.xsh\n    dst: rever.xsh\n  - src: templates/releases/TEMPLATE\n    dst: news/TEMPLATE\n"
  },
  {
    "path": ".github/template-files/templates/issue_template_details.yml",
    "content": "  - type: textarea\n    id: info\n    attributes:\n      label: Conda Info\n      description: |\n        Let's collect some basic information about your conda install.\n\n        Please run the following command from your command line and paste the output below.\n\n        ```bash\n        conda info\n        ```\n      render: shell\n  - type: textarea\n    id: config\n    attributes:\n      label: Conda Config\n      description: |\n        Let's collect any customizations you may have for your conda install.\n\n        Please run the following command from your command line and paste the output below.\n\n        ```bash\n        conda config --show-sources\n        ```\n      render: shell\n  - type: textarea\n    id: list\n    attributes:\n      label: Conda list\n      description: |\n        The packages installed into your environment can offer clues as to the problem you are facing.\n\n        Please activate the environment within which you are encountering this bug, run the following command from your command line, and paste the output below.\n\n        ```bash\n        conda list --show-channel-urls\n        ```\n      render: shell\n"
  },
  {
    "path": ".github/template-files/templates/pull_request_template_details.md",
    "content": "### Checklist - did you ...\n\n<!-- If any of the following items aren't relevant to your contribution,\n     please either tick them or use ~strikethrough~ so we know you've gone\n     through the checklist. -->\n\n- [ ] Add a file to the `news` directory ([using the template](https://github.com/conda/conda-libmamba-solver/blob/main/news/TEMPLATE)) for the next release's release notes?\n     <!-- All \"significant\" changes should get an entry:\n            - user-facing changes or enhancements\n            - bug fixes\n            - deprecations\n            - documentation updates\n            - etc -->\n- [ ] Add / update necessary tests?\n- [ ] Add / update outdated documentation?\n"
  },
  {
    "path": ".github/workflows/builds-review.yaml",
    "content": "name: Review builds\n\non:\n  pull_request:\n    types:\n      - labeled\n\njobs:\n  build:\n    if: |\n      github.event_name == 'pull_request' &&\n      github.event.label.name == 'build::review'\n    strategy:\n      matrix:\n        include:\n          - runner: ubuntu-latest\n            subdir: noarch\n    runs-on: ${{ matrix.runner }}\n    steps:\n\n      - name: Remove build label\n        uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0\n        with:\n          github-token: ${{ secrets.CANARY_ACTION_TOKEN }}\n          script: |\n            const { data: pullRequest } = await github.rest.pulls.get({\n              ...context.repo,\n              pull_number: context.issue.number,\n            })\n            const buildLabel = '${{ github.event.label.name }}'\n            const labels = pullRequest.labels.map(label => label.name)\n            const hasBuildLabel = labels.includes(buildLabel)\n            if (hasBuildLabel) {\n                await github.rest.issues.removeLabel({\n                  ...context.repo,\n                  issue_number: context.issue.number,\n                  name: buildLabel,\n                })\n            }\n      # Clean checkout of specific git ref needed for package metadata version\n      # which needs env vars GIT_DESCRIBE_TAG and GIT_BUILD_STR:\n      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          ref: ${{ github.ref }}\n          clean: true\n          fetch-depth: 0\n\n      - name: Create and upload review build\n        uses: conda/actions/canary-release@7f6830b1428a9bd47f0b068892c77eae95207037 # v26.1.0\n        with:\n          package-name: conda-libmamba-solver\n          subdir: ${{ matrix.subdir }}\n          anaconda-org-channel: conda-canary\n          anaconda-org-label: '${{ github.event.repository.name }}-pr-${{ github.event.number }}'\n          anaconda-org-token: ${{ secrets.ANACONDA_ORG_CONDA_CANARY_TOKEN }}\n          comment-headline: 'Review build status'\n          comment-token: ${{ secrets.CANARY_ACTION_TOKEN }}\n          conda-build-arguments: '--override-channels -c conda-forge/label/mamba_dev -c conda-forge'\n"
  },
  {
    "path": ".github/workflows/cla.yml",
    "content": "name: CLA\n\non:\n  issue_comment:\n    types:\n      - created\n  pull_request_target:\n\njobs:\n  check:\n    if: >-\n      !github.event.repository.fork\n      && (\n        github.event.issue.pull_request\n        && github.event.comment.body == '@conda-bot check'\n        || github.event_name == 'pull_request_target'\n      )\n    runs-on: ubuntu-slim\n    steps:\n      - name: Check CLA\n        uses: conda/actions/check-cla@7f6830b1428a9bd47f0b068892c77eae95207037 # v26.1.0\n        with:\n          # [required]\n          # A token with ability to comment, label, and modify the commit status\n          # (`pull_request: write` and `statuses: write` for fine-grained PAT; `repo` for classic PAT)\n          # (default: secrets.GITHUB_TOKEN)\n          token: ${{ secrets.CLA_ACTION_TOKEN }}\n          # [required]\n          # Label to apply to contributor's PR once CLA is signed\n          label: cla-signed\n\n          # [required]\n          # Token for opening signee PR in the provided `cla_repo`\n          # (`pull_request: write` for fine-grained PAT; `repo` and `workflow` for classic PAT)\n          cla_token: ${{ secrets.CLA_FORK_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/docs.yml",
    "content": "name: Docs\n\non:\n  # Runs on pushes targeting the default branch\n  push:\n    branches: [\"main\"]\n  pull_request:\n    paths:\n      - \"docs/**\"\n  # Allows you to run this workflow manually from the Actions tab\n  workflow_dispatch:\n\n# Allow one concurrent deployment\nconcurrency:\n  group: \"pages\"\n  cancel-in-progress: true\n\njobs:\n  docs:\n    runs-on: ubuntu-latest\n    defaults:\n      run:\n        shell: bash -el {0}\n    steps:\n      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n\n      - uses: conda-incubator/setup-miniconda@fc2d68f6413eb2d87b895e92f8584b5b94a10167 # v3.3.0\n        with:\n          activate-environment: conda-libmamba-solver\n          environment-file: docs/environment.yml\n          python-version: '3.11'\n          auto-activate-base: false\n\n      - name: Build Documentation\n        run: |\n          cd docs\n          make dirhtml\n\n      - name: Upload artifact\n        uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4.0.0\n        with:\n          # Upload entire repository\n          path: 'docs/_build/dirhtml'\n\n  pages:\n    runs-on: ubuntu-latest\n    if: github.ref == 'refs/heads/main'\n    needs: [docs]\n\n    # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages\n    permissions:\n      contents: read\n      pages: write\n      id-token: write\n\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n\n    steps:\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0\n"
  },
  {
    "path": ".github/workflows/issues.yml",
    "content": "name: Automate Issues\n\non:\n  # NOTE: github.event is issue_comment payload:\n  # https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#issue_comment\n  issue_comment:\n    types: [created]\n\nenv:\n  FEEDBACK_LBL: pending::feedback\n  SUPPORT_LBL: pending::support\n\njobs:\n  # NOTE: will update label if anyone responds, not just the author/reporter\n  # TODO: create conda-issue-sorting team and modify this to toggle label based on\n  # whether a non-issue-sorting engineer commented\n  pending_support:\n    # if [pending::feedback] and anyone responds\n    if: >-\n      !github.event.repository.fork\n      && !github.event.issue.pull_request\n      && contains(github.event.issue.labels.*.name, 'pending::feedback')\n    runs-on: ubuntu-slim\n    steps:\n      # remove [pending::feedback]\n      - uses: actions-ecosystem/action-remove-labels@2ce5d41b4b6aa8503e285553f75ed56e0a40bae0 # v1.3.0\n        with:\n          labels: ${{ env.FEEDBACK_LBL }}\n          github_token: ${{ secrets.PROJECT_TOKEN }}\n      # add [pending::support], if still open\n      - uses: actions-ecosystem/action-add-labels@18f1af5e3544586314bbe15c0273249c770b2daf # v1.1.3\n        if: github.event.issue.state == 'open'\n        with:\n          labels: ${{ env.SUPPORT_LBL }}\n          github_token: ${{ secrets.PROJECT_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/labels.yml",
    "content": "name: Sync Labels\n\non:\n  # NOTE: github.event is workflow_dispatch payload:\n  # https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#workflow_dispatch\n  workflow_dispatch:\n    inputs:\n      delete-unmapped:\n        description: Delete labels not mapped in either global or local label configurations.\n        default: false\n        type: boolean\n\n      dry-run:\n        description: Run label synchronization workflow without making any changes.\n        default: false\n        type: boolean\n\njobs:\n  sync:\n    if: '!github.event.repository.fork'\n    runs-on: ubuntu-slim\n    env:\n      GLOBAL: https://raw.githubusercontent.com/conda/infra/main/.github/global.yml\n      LOCAL: .github/labels.yml\n    steps:\n      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n\n      - id: has_local\n        uses: andstor/file-existence-action@558493d6c74bf472d87c84eab196434afc2fa029 # v3.1.0\n        with:\n          files: ${{ env.LOCAL }}\n\n      - name: Global Only\n        uses: EndBug/label-sync@52074158190acb45f3077f9099fea818aa43f97a # v2.3.3\n        if: steps.has_local.outputs.files_exists == 'false'\n        with:\n          config-file: ${{ env.GLOBAL }}\n          delete-other-labels: ${{ inputs.delete-unmapped }}\n          dry-run: ${{ inputs.dry-run }}\n\n      - name: Global & Local\n        uses: EndBug/label-sync@52074158190acb45f3077f9099fea818aa43f97a # v2.3.3\n        if: steps.has_local.outputs.files_exists == 'true'\n        with:\n          config-file: |\n            ${{ env.GLOBAL }}\n            ${{ env.LOCAL }}\n          delete-other-labels: ${{ inputs.delete-unmapped }}\n          dry-run: ${{ inputs.dry-run }}\n"
  },
  {
    "path": ".github/workflows/lock.yml",
    "content": "name: Lock\n\non:\n  # NOTE: github.event is workflow_dispatch payload:\n  # https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#workflow_dispatch\n  workflow_dispatch:\n\n  schedule:\n    - cron: 0 6 * * *\n\npermissions:\n  issues: write\n  pull-requests: write\n\njobs:\n  lock:\n    if: '!github.event.repository.fork'\n    runs-on: ubuntu-slim\n    steps:\n      - uses: dessant/lock-threads@7266a7ce5c1df01b1c6db85bf8cd86c737dadbe7 # v6.0.0\n        with:\n          # Number of days of inactivity before a closed issue is locked\n          issue-inactive-days: 180\n          # Do not lock issues created before a given timestamp, value must follow ISO 8601\n          exclude-issue-created-before: ''\n          # Do not lock issues with these labels, value must be a comma separated list of labels or ''\n          exclude-any-issue-labels: ''\n          # Labels to add before locking an issue, value must be a comma separated list of labels or ''\n          add-issue-labels: locked\n          # Reason for locking an issue, value must be one of resolved, off-topic, too heated, spam or ''\n          issue-lock-reason: resolved\n          # Number of days of inactivity before a closed pull request is locked\n          pr-inactive-days: 365\n          # Do not lock pull requests created before a given timestamp, value must follow ISO 8601\n          exclude-pr-created-before: ''\n          # Do not lock pull requests with these labels, value must be a comma separated list of labels or ''\n          exclude-any-pr-labels: ''\n          # Labels to add before locking a pull request, value must be a comma separated list of labels or ''\n          add-pr-labels: locked\n          # Reason for locking a pull request, value must be one of resolved, off-topic, too heated, spam or ''\n          pr-lock-reason: resolved\n\n          # Limit locking to issues, pull requests or discussions, value must be a comma separated list of issues, prs, discussions or ''\n          process-only: issues, prs\n"
  },
  {
    "path": ".github/workflows/performance.yml",
    "content": "name: Performance\n\non:\n  pull_request:\n    types:\n      - labeled\n  workflow_run:\n    workflows:\n      - CI\n    branches:\n      - main\n    types:\n      - completed\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}\n  cancel-in-progress: true\n\nenv:\n  CONDA_SOLVER: libmamba\n\njobs:\n  linux:\n    if: |\n      (github.event_name == 'pull_request' &&\n      github.event.label.name == 'performance::run') ||\n      (github.event.workflow_run.conclusion == 'success')\n    name: Linux, Python ${{ matrix.python-version }}\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        python-version: [\"3.9\"]\n\n    env:\n      OS: \"linux\"\n      PYTHON: ${{ matrix.python-version }}\n\n    steps:\n      - name: Checkout our source\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          path: conda-libmamba-solver\n          fetch-depth: 0\n\n      - name: Checkout conda\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          fetch-depth: 0\n          repository: conda/conda\n          path: conda\n\n      - name: Run performance tests\n        run: >\n          docker run\n          --rm\n          -v ${GITHUB_WORKSPACE}/conda:/opt/conda-src\n          -v ${GITHUB_WORKSPACE}/conda-libmamba-solver:/opt/conda-libmamba-solver-src\n          -e TEST_SPLITS\n          -e TEST_GROUP\n          -e CONDA_SOLVER\n          ghcr.io/conda/conda-ci:main-linux-python${{ matrix.python-version }}\n          bash -c \"sudo /opt/conda/condabin/conda install -p /opt/conda \\\n                        --file /opt/conda-libmamba-solver-src/dev/requirements.txt &&\n                   /opt/conda/bin/python -m pip install /opt/conda-libmamba-solver-src \\\n                        --no-deps -vvv &&\n                   source /opt/conda-src/dev/linux/bashrc.sh &&\n                   /opt/conda/bin/python -m pytest /opt/conda-libmamba-solver-src \\\n                        -vv --durations=0 --timeout=1800 -m 'slow'\"\n\n  macos:\n    if: |\n      (github.event_name == 'pull_request' &&\n      github.event.label.name == 'performance::run') ||\n      (github.event.workflow_run.conclusion == 'success')\n    name: MacOS, Python ${{ matrix.python-version }}\n    runs-on: macos-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        python-version: [\"3.9\"]\n\n    env:\n      OS: \"macos\"\n      PYTHON: ${{ matrix.python-version }}\n\n    steps:\n      - name: Checkout our source\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          path: conda-libmamba-solver\n          fetch-depth: 0\n\n      - name: Checkout conda\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          fetch-depth: 0\n          repository: conda/conda\n          ref: libmamba\n          path: conda\n\n      - uses: conda-incubator/setup-miniconda@fc2d68f6413eb2d87b895e92f8584b5b94a10167 # v3.3.0\n        with:\n          activate-environment: conda-test-env\n          use-only-tar-bz2: true # IMPORTANT: This needs to be set for caching to work properly!\n\n      - name: Setup environment\n        shell: bash -l {0}\n        working-directory: conda\n        run: |\n          set -euxo pipefail\n          # restoring the default for changeps1 to have parity with dev\n          conda config --set changeps1 true\n          # make sure the caching works correctly\n          conda config --set use_only_tar_bz2 true\n          # install all test requirements\n          conda install --yes \\\n            --file tests/requirements.txt \\\n            --file ../conda-libmamba-solver/dev/requirements.txt \\\n            python=${{ matrix.python-version }}\n          conda update openssl ca-certificates certifi\n          conda info\n          python -c \"from mamba import __version__; print('mamba', __version__)\"\n\n      - name: Install conda-libmamba-solver\n        shell: bash -l {0}\n        working-directory: conda-libmamba-solver\n        run: |\n          python -m pip install . -vv --no-deps\n\n      - name: Run performance tests\n        shell: bash -l {0}\n        working-directory: conda\n        run: |\n          eval \"$(sudo ${CONDA_PREFIX}/bin/python -m conda init bash --dev)\"\n          python -m pytest ${GITHUB_WORKSPACE}/conda-libmamba-solver -vv --durations=0 --timeout=1800 -m \"slow\"\n\n  windows:\n    if: |\n      (github.event_name == 'pull_request' &&\n      github.event.label.name == 'performance::run') ||\n      (github.event.workflow_run.conclusion == 'success')\n    name: Windows, Python ${{ matrix.python-version }}\n    runs-on: windows-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        python-version: [\"3.9\"]\n\n    env:\n      OS: \"windows\"\n      PYTHON: ${{ matrix.python-version }}\n\n    steps:\n      - name: Checkout our source\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          path: conda-libmamba-solver\n          fetch-depth: 0\n\n      - name: Checkout conda\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          fetch-depth: 0\n          repository: conda/conda\n          ref: libmamba\n          path: conda\n\n      - name: Set temp dirs correctly\n        # https://github.com/actions/virtual-environments/issues/712\n        run: |\n          echo \"TMPDIR=$env:USERPROFILE\\AppData\\Local\\Temp\" >> $env:GITHUB_ENV\n          echo \"TEMP=$env:USERPROFILE\\AppData\\Local\\Temp\" >> $env:GITHUB_ENV\n          echo \"TMP=$env:USERPROFILE\\AppData\\Local\\Temp\" >> $env:GITHUB_ENV\n\n      - name: Setup environment\n        shell: cmd\n        working-directory: conda\n        run: |\n          :: add mamba to requirements\n          type ..\\conda-libmamba-solver\\dev\\requirements.txt >> .\\tests\\requirements.txt\n          if errorlevel 1 exit 1\n          :: initialize conda dev\n          call .\\dev\\windows\\setup.bat\n          if errorlevel 1 exit 1\n          call .\\dev-init.bat\n          if errorlevel 1 exit 1\n          python -c \"from mamba import __version__; print('mamba', __version__)\"\n          if errorlevel 1 exit 1\n          conda info -a\n          if errorlevel 1 exit 1\n\n      - name: Install conda-libmamba-solver\n        shell: cmd\n        working-directory: conda\n        run: |\n          call .\\dev-init.bat\n          if errorlevel 1 exit 1\n          python -m pip install --no-deps -vv \"%GITHUB_WORKSPACE%\\conda-libmamba-solver\"\n          if errorlevel 1 exit 1\n\n      - name: Run performance tests\n        shell: cmd\n        working-directory: conda\n        run: |\n          CALL dev-init.bat\n          if errorlevel 1 exit 1\n          python -m pytest \"%GITHUB_WORKSPACE%\\conda-libmamba-solver\" -vv --durations=0 --timeout=1800 -m \"slow\"\n          if errorlevel 1 exit 1\n"
  },
  {
    "path": ".github/workflows/project.yml",
    "content": "name: Add to Project\n\non:\n  pull_request_target:\n    types:\n      - opened\n\njobs:\n  add_to_project:\n    if: '!github.event.repository.fork'\n    runs-on: ubuntu-slim\n    steps:\n      - uses: actions/add-to-project@244f685bbc3b7adfa8466e08b698b5577571133e # v1.0.2\n        with:\n          # PRs are added to the Review project\n          project-url: https://github.com/orgs/conda/projects/16\n          github-token: ${{ secrets.PROJECT_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/stale.yml",
    "content": "name: Stale\n\non:\n  # NOTE: github.event is workflow_dispatch payload:\n  # https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#workflow_dispatch\n  workflow_dispatch:\n    inputs:\n      dryrun:\n        description: 'dryrun: Preview stale issues/prs without marking them (true|false)'\n        required: true\n        type: boolean\n        default: true\n\n  schedule:\n    - cron: 0 4 * * *\n\npermissions:\n  issues: write\n  pull-requests: write\n\njobs:\n  stale:\n    if: '!github.event.repository.fork'\n    runs-on: ubuntu-slim\n    strategy:\n      matrix:\n        include:\n          - only-issue-labels: ''\n            days-before-issue-stale: 365\n            days-before-issue-close: 30\n          # [type::support] issues have a more aggressive stale/close timeline\n          - only-issue-labels: type::support\n            days-before-issue-stale: 90\n            days-before-issue-close: 21\n    steps:\n      - uses: conda/actions/read-yaml@7f6830b1428a9bd47f0b068892c77eae95207037 # v26.1.0\n        id: read_yaml\n        with:\n          path: https://raw.githubusercontent.com/conda/infra/main/.github/messages.yml\n\n      - uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10.2.0\n        id: stale\n        with:\n          # Only issues with these labels are checked whether they are stale\n          only-issue-labels: ${{ matrix.only-issue-labels }}\n\n          # Idle number of days before marking issues stale\n          days-before-issue-stale: ${{ matrix.days-before-issue-stale }}\n          # Idle number of days before closing stale issues/PRs\n          days-before-issue-close: ${{ matrix.days-before-issue-close }}\n          # Idle number of days before marking PRs stale\n          days-before-pr-stale: 365\n          # Idle number of days before closing stale PRs\n          days-before-pr-close: 30\n\n          # Comment on the staled issues\n          stale-issue-message: ${{ fromJSON(steps.read_yaml.outputs.value)['stale-issue'] }}\n          # Label to apply on staled issues\n          stale-issue-label: stale\n          # Label to apply on closed issues\n          close-issue-label: stale::closed\n          # Reason to use when closing issues\n          close-issue-reason: not_planned\n\n          # Comment on the staled PRs\n          stale-pr-message: ${{ fromJSON(steps.read_yaml.outputs.value)['stale-pr'] }}\n          # Label to apply on staled PRs\n          stale-pr-label: stale\n          # Label to apply on closed PRs\n          close-pr-label: stale::closed\n\n          # Remove stale label from issues/PRs on updates/comments\n          remove-stale-when-updated: true\n          # Add specified labels to issues/PRs when they become unstale\n          labels-to-add-when-unstale: stale::recovered\n          # Remove specified labels to issues/PRs when they become unstale\n          labels-to-remove-when-unstale: stale,stale::closed\n\n          # Max number of operations per run\n          operations-per-run: ${{ secrets.STALE_OPERATIONS_PER_RUN || 100 }}\n          # Dry-run\n          debug-only: ${{ github.event.inputs.dryrun || false }}\n          # Order to get issues/PRs\n          ascending: true\n          # Delete branch after closing a stale PR\n          delete-branch: false\n\n          # Issues with these labels will never be considered stale\n          exempt-issue-labels: stale::recovered,epic\n          # Issues with these labels will never be considered stale\n          exempt-pr-labels: stale::recovered,epic\n          # Exempt all issues/PRs with milestones from stale\n          exempt-all-milestones: true\n          # Assignees on issues/PRs exempted from stale\n          exempt-assignees: mingwandroid\n\n      - name: Print outputs\n        run: echo ${{ join(steps.stale.outputs.*, ',') }}\n"
  },
  {
    "path": ".github/workflows/tests.yml",
    "content": "name: Tests\n\non:\n  # https://docs.github.com/en/webhooks-and-events/webhooks/webhook-events-and-payloads#push\n  push:\n    branches:\n      - main\n      - feature/**\n      - '[0-9].*.x'  # e.g., 4.14.x\n      - '[0-9][0-9].*.x'  # e.g., 23.3.x\n\n  # https://docs.github.com/en/webhooks-and-events/webhooks/webhook-events-and-payloads#pull_request\n  pull_request:\n\n  # https://docs.github.com/en/webhooks-and-events/webhooks/webhook-events-and-payloads#workflow_dispatch\n  workflow_dispatch:\n\n  # CONDA-LIBMAMBA-SOLVER CHANGE\n  schedule:\n    - cron: \"15 7 * * 1-5\"  # Mon to Fri, 7:15am\n  # /CONDA-LIBMAMBA-SOLVER CHANGE\n\nconcurrency:\n  # Concurrency group that uses the workflow name and PR number if available\n  # or commit SHA as a fallback. If a new build is triggered under that\n  # concurrency group while a previous build is running it will be canceled.\n  # Repeated pushes to a PR will cancel all previous builds, while multiple\n  # merges to main will not cancel.\n  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}\n  cancel-in-progress: true\n\nenv:\n  # https://conda.github.io/conda-libmamba-solver/user-guide/configuration/#advanced-options\n  CONDA_LIBMAMBA_SOLVER_NO_CHANNELS_FROM_INSTALLED: true\n  # Reruns on upstream tests\n  PYTEST_RERUN_FAILURES: 1\n  # Reruns on our tests\n  PYTEST_RERUN_FAILURES_CLS: 0\n  # upstream conda tests that we want to skip\n  PYTEST_ADDOPTS: \"-k \\\"not test_get_index_lazy and not test_strict_resolve_get_reduced_index and not test_reorder_channel_priority\\\"\"\n  # for conda-libmamba-solver\n  PYTEST_CLS_ADDOPTS: \"-m \\\"not slow and not benchmark and not trouble\\\"\"\n  # See https://github.com/conda/conda/pull/13694\n  # we can't break classic from here; no need to test it\n  # those tests will still be available for local debugging if necessary\n  CONDA_TEST_SOLVERS: libmamba\n  CONDA_REF: main # pin conda version to latest for more stable tests\n\njobs:\n  # detect whether any code changes are included in this PR\n  changes:\n    runs-on: ubuntu-latest\n    permissions:\n      # necessary to detect changes\n      # https://github.com/dorny/paths-filter#supported-workflows\n      pull-requests: read\n    outputs:\n      code: ${{ steps.filter.outputs.code }}\n    steps:\n      - name: Checkout Source\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        # dorny/paths-filter needs git clone for non-PR events\n        # https://github.com/dorny/paths-filter#supported-workflows\n        if: github.event_name != 'pull_request'\n\n      - name: Filter Changes\n        uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1\n        id: filter\n        with:\n          # CONDA-LIBMAMBA-SOLVER CHANGE\n          # changed some paths:\n          filters: |\n            code:\n              - 'conda_libmamba_solver/**'\n              - '*.py'\n              - '.github/workflows/tests.yml'\n              - 'tests/**'\n              - 'dev/requirements.txt'\n              - 'pyproject.toml'\n          # /CONDA-LIBMAMBA-SOLVER CHANGE\n\n  # windows test suite\n  windows:\n    # only run test suite if there are code changes\n    needs: changes\n    if: needs.changes.outputs.code == 'true'\n\n    runs-on: windows-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        # test lower version (w/ defaults) and upper version (w/ defaults and conda-forge)\n        python-version: ['3.10', '3.13']\n        default-channel: [defaults, conda-forge]\n        test-type: [conda-libmamba-solver, unit, integration]\n        test-group: [1, 2, 3]\n        exclude:\n          - default-channel: conda-forge\n            python-version: '3.10'\n          - test-type: unit\n            test-group: 3\n          - test-type: conda-libmamba-solver  # CONDA-LIBMAMBA-SOLVER CHANGE\n            test-group: 2  # CONDA-LIBMAMBA-SOLVER CHANGE\n          - test-type: conda-libmamba-solver  # CONDA-LIBMAMBA-SOLVER CHANGE\n            test-group: 3  # CONDA-LIBMAMBA-SOLVER CHANGE\n    env:\n      ErrorActionPreference: Stop  # powershell exit immediately on error\n      PYTEST_MARKER: ${{ matrix.test-type == 'unit' && 'not integration' || 'integration' }}\n      PYTEST_SPLITS: ${{ matrix.test-type == 'unit' && '2' || '3' }}\n    steps:\n      - name: Checkout conda/conda # CONDA-LIBMAMBA-SOLVER CHANGE\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          fetch-depth: 0\n          repository: conda/conda  # CONDA-LIBMAMBA-SOLVER CHANGE\n          path: conda  # CONDA-LIBMAMBA-SOLVER CHANGE\n          ref: ${{ env.CONDA_REF }}\n\n      # CONDA-LIBMAMBA-SOLVER CHANGE\n      - name: Checkout conda-libmamba-solver\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          fetch-depth: 0\n          path: conda-libmamba-solver\n      # /CONDA-LIBMAMBA-SOLVER CHANGE\n\n      - name: Hash + Timestamp\n        shell: bash  # use bash to run date command\n        run: echo \"HASH=${{ runner.os }}-${{ runner.arch }}-Py${{ matrix.python-version }}-${{ matrix.default-channel }}-${{ matrix.test-type }}-${{ matrix.test-group }}-$(date -u \"+%Y%m\")\" >> $GITHUB_ENV\n\n      - name: Cache Conda\n        uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4\n        with:\n          path: ~/conda_pkgs_dir\n          key: cache-${{ env.HASH }}\n\n      - name: Setup Miniconda\n        uses: conda-incubator/setup-miniconda@fc2d68f6413eb2d87b895e92f8584b5b94a10167 # v3.3.0\n        with:\n          # CONDA-LIBMAMBA-SOLVER CHANGE: add conda\\\n          condarc-file: conda\\.github\\condarc-${{ matrix.default-channel }}\n          run-post: false  # skip post cleanup\n\n      - name: Upgrade conda-libmamba-solver (without sharded repodata)\n        shell: bash -el {0}\n        run: CONDA_PLUGINS_USE_SHARDED_REPODATA=0 conda install --yes -n base conda-canary/label/dev::conda-libmamba-solver\n\n      - name: Conda Install\n        working-directory: conda  # CONDA-LIBMAMBA-SOLVER CHANGE\n        # CONDA-LIBMAMBA-SOLVER CHANGE: add conda-libmamba-solver requirements.txt\n        run: >\n          conda install\n          --yes\n          --file tests\\requirements.txt\n          --file tests\\requirements-${{ runner.os }}.txt\n          --file tests\\requirements-ci.txt\n          --file tests\\requirements-s3.txt\n          --file ..\\conda-libmamba-solver\\dev\\requirements.txt\n          ${{ matrix.test-type == 'conda-libmamba-solver' && '--file ..\\\\conda-libmamba-solver\\\\tests\\\\requirements.txt' || '' }}\n          python=${{ matrix.python-version }}\n\n      - name: Conda Remove anaconda-auth\n        run: conda remove --yes -n base anaconda-auth anaconda-anon-usage conda-anaconda-telemetry conda-anaconda-tos\n\n\n      # CONDA-LIBMAMBA-SOLVER CHANGE\n      - name: Install conda-libmamba-solver\n        run: python -m pip install -e conda-libmamba-solver/ -vv --no-deps --no-build-isolation\n      #/ CONDA-LIBMAMBA-SOLVER CHANGE\n\n      - name: Conda Info\n        run: python -m conda info --verbose\n\n      - name: Conda Config\n        run: conda config --show-sources\n\n      - name: Conda List Extra\n        run: |\n          conda env list\n          conda list -n base\n          conda list --show-channel-urls\n\n      - name: Setup PowerShell\n        # for tests/shell, so only necessary for integration tests\n        if: matrix.test-type == 'integration'\n        run: |\n          Invoke-Expression \"& { $(Invoke-RestMethod https://aka.ms/install-powershell.ps1) }\"\n          \"PWSHPATH=$env:LOCALAPPDATA\\Microsoft\\powershell\" | Out-File -FilePath $env:GITHUB_ENV -Append\n\n      - name: PowerShell Info\n        # for tests/shell, so only necessary for integration tests\n        if: matrix.test-type == 'integration'\n        run: |\n          Get-Command -All powershell\n          Get-Command -All \"$env:PWSHPATH\\pwsh.exe\"\n\n      - name: Run Upstream Tests\n        working-directory: conda  # CONDA-LIBMAMBA-SOLVER CHANGE\n        if: ${{ matrix.test-type != 'conda-libmamba-solver' }}  # CONDA-LIBMAMBA-SOLVER CHANGE\n        run: python -m pytest\n          --durations-path=durations\\${{ runner.os }}.json\n          --group=${{ matrix.test-group }}\n          --splits=${{ env.PYTEST_SPLITS }}\n          --reruns=${{ env.PYTEST_RERUN_FAILURES }}\n          -m \"${{ env.PYTEST_MARKER }}\"\n\n      # CONDA-LIBMAMBA-SOLVER CHANGE\n      - name: Run conda-libmamba-solver Tests\n        working-directory: conda-libmamba-solver\n        if: ${{ matrix.test-type == 'conda-libmamba-solver' }}\n        shell: bash -el {0}\n        run: |\n          python -m pip install -e ../conda/ --no-deps --no-build-isolation\n          python -m conda init --all\n          . $CONDA_PREFIX/etc/profile.d/conda.sh\n          python -m pytest -vv ${{ env.PYTEST_CLS_ADDOPTS }} --reruns=${{ env.PYTEST_RERUN_FAILURES_CLS }} --durations=16\n      #/ CONDA-LIBMAMBA-SOLVER CHANGE\n\n      - name: Upload Coverage\n        uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0\n        if: false  # CONDA-LIBMAMBA-SOLVER CHANGE\n        with:\n          flags: ${{ runner.os }},${{ runner.arch }},${{ matrix.python-version }},${{ matrix.test-type }}\n\n      - name: Upload Test Results\n        if: '!cancelled()'\n        uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0\n        with:\n          name: test-results-${{ env.HASH }}\n          # CONDA-LIBMAMBA-SOLVER CHANGE: need to prepend conda/ to the paths\n          path: |\n            conda\\.coverage\n            conda\\durations\\${{ runner.os }}.json\n            conda\\test-report.xml\n          retention-days: 1  # temporary, combined in aggregate below\n\n  # linux test suite\n  linux:\n    # only run test suite if there are code changes\n    needs: changes\n    if: needs.changes.outputs.code == 'true'\n\n    runs-on: ${{ matrix.runs-on }}\n    defaults:\n      run:\n        # https://github.com/conda-incubator/setup-miniconda#use-a-default-shell\n        shell: bash -el {0}  # bash exit immediately on error + login shell\n    strategy:\n      fail-fast: false\n      matrix:\n        # test all lower versions (w/ defaults) and upper version (w/ defaults and conda-forge)\n        runs-on: [ubuntu-latest, ubuntu-24.04-arm]\n        python-version: ['3.10', '3.11', '3.12', '3.13']\n        default-channel: [defaults, conda-forge]\n        test-type: [conda-libmamba-solver, unit, integration]\n        test-group: [1, 2, 3]\n        exclude:\n          - python-version: '3.10'\n            default-channel: conda-forge\n          - python-version: '3.11'\n            default-channel: conda-forge\n          - python-version: '3.12'\n            default-channel: conda-forge\n          - test-type: unit\n            test-group: 3\n          - runs-on: ubuntu-24.04-arm\n            python-version: '3.10'\n          - runs-on: ubuntu-24.04-arm\n            python-version: '3.11'\n          - runs-on: ubuntu-24.04-arm\n            python-version: '3.12'\n          - test-type: conda-libmamba-solver  # CONDA-LIBMAMBA-SOLVER CHANGE\n            test-group: 2  # CONDA-LIBMAMBA-SOLVER CHANGE\n          - test-type: conda-libmamba-solver  # CONDA-LIBMAMBA-SOLVER CHANGE\n            test-group: 3  # CONDA-LIBMAMBA-SOLVER CHANGE\n    env:\n      PYTEST_MARKER: ${{ matrix.test-type == 'unit' && 'not integration' || 'integration' }}\n      PYTEST_SPLITS: ${{ matrix.test-type == 'unit' && '2' || '3' }}\n\n    steps:\n      - name: Checkout conda/conda # CONDA-LIBMAMBA-SOLVER CHANGE\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          fetch-depth: 0\n          repository: conda/conda  # CONDA-LIBMAMBA-SOLVER CHANGE\n          path: conda  # CONDA-LIBMAMBA-SOLVER CHANGE\n          ref: ${{ env.CONDA_REF }}\n\n      # CONDA-LIBMAMBA-SOLVER CHANGE\n      - name: Checkout conda-libmamba-solver\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          fetch-depth: 0\n          path: conda-libmamba-solver\n      # /CONDA-LIBMAMBA-SOLVER CHANGE\n\n      - name: Hash + Timestamp\n        run: echo \"HASH=${{ runner.os }}-${{ runner.arch }}-Py${{ matrix.python-version }}-${{ matrix.default-channel }}-${{ matrix.test-type }}-${{ matrix.test-group }}-$(date -u \"+%Y%m\")\" >> $GITHUB_ENV\n\n      - name: Cache Conda\n        uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4\n        with:\n          path: ~/conda_pkgs_dir\n          key: cache-${{ env.HASH }}\n\n      - name: Setup Miniconda\n        uses: conda-incubator/setup-miniconda@fc2d68f6413eb2d87b895e92f8584b5b94a10167 # v3.3.0\n        with:\n          # CONDA-LIBMAMBA-SOLVER CHANGE: add conda/\n          condarc-file: conda/.github/condarc-${{ matrix.default-channel }}\n          run-post: false  # skip post cleanup\n\n      - name: Upgrade conda-libmamba-solver (without sharded repodata)\n        run: CONDA_PLUGINS_USE_SHARDED_REPODATA=0 conda install --yes -n base conda-canary/label/dev::conda-libmamba-solver\n\n      - name: Conda Install\n        working-directory: conda\n        run: >\n          conda install\n          --yes\n          --file tests/requirements.txt\n          --file tests/requirements-${{ runner.os }}.txt\n          --file tests/requirements-ci.txt\n          --file tests/requirements-s3.txt\n          --file ../conda-libmamba-solver/dev/requirements.txt\n          ${{ matrix.test-type == 'conda-libmamba-solver' && '--file ../conda-libmamba-solver/tests/requirements.txt' || '' }}\n          python=${{ matrix.python-version }}\n\n      - name: Conda Remove anaconda-auth\n        run: conda remove --yes -n base anaconda-auth anaconda-anon-usage conda-anaconda-telemetry conda-anaconda-tos\n\n      # CONDA-LIBMAMBA-SOLVER CHANGE\n      - name: Install conda-libmamba-solver\n        run: python -m pip install -e conda-libmamba-solver/ -vv --no-deps --no-build-isolation\n      #/ CONDA-LIBMAMBA-SOLVER CHANGE\n\n      - name: Conda Info\n        run: python -m conda info --verbose\n\n      - name: Conda Config\n        run: conda config --show-sources\n\n      - name: Conda List Extra\n        run: |\n          conda env list\n          conda list -n base\n          conda list --show-channel-urls\n\n      - name: Setup Shells\n        # for tests/shell, so only necessary for integration tests\n        if: matrix.test-type == 'integration'\n        run: sudo apt update && sudo apt install ash csh fish tcsh xonsh zsh\n\n      - name: Run Tests\n        working-directory: conda  # CONDA-LIBMAMBA-SOLVER CHANGE\n        if: ${{ matrix.test-type != 'conda-libmamba-solver' }}  # CONDA-LIBMAMBA-SOLVER CHANGE\n        run: python -m pytest\n          --durations-path=durations/${{ runner.os }}.json\n          --group=${{ matrix.test-group }}\n          --splits=${{ env.PYTEST_SPLITS }}\n          --reruns=${{ env.PYTEST_RERUN_FAILURES }}\n          -m \"${{ env.PYTEST_MARKER }}\"\n\n      # CONDA-LIBMAMBA-SOLVER CHANGE\n      - name: Run conda-libmamba-solver Tests\n        working-directory: conda-libmamba-solver\n        if: ${{ matrix.test-type == 'conda-libmamba-solver' }}\n        run: |\n          python -m pip install -e ../conda/ --no-deps --no-build-isolation\n          python -m conda init --all\n          . $CONDA_PREFIX/etc/profile.d/conda.sh\n          python -m pytest -vv ${{ env.PYTEST_CLS_ADDOPTS }} --reruns=${{ env.PYTEST_RERUN_FAILURES_CLS }} --durations=16\n      #/ CONDA-LIBMAMBA-SOLVER CHANGE\n\n      - name: Upload Coverage\n        uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0\n        if: false # CONDA-LIBMAMBA-SOLVER CHANGE\n        with:\n          flags: ${{ runner.os }},${{ runner.arch }},${{ matrix.python-version }},${{ matrix.test-type }}\n\n      - name: Upload Test Results\n        if: '!cancelled()'\n        uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0\n        with:\n          name: test-results-${{ env.HASH }}\n          path: |\n            conda/.coverage\n            conda/durations/${{ runner.os }}.json\n            conda/test-report.xml\n          retention-days: 1  # temporary, combined in aggregate below\n\n  # linux benchmarks\n  linux-benchmarks:\n    needs: changes\n    if: false # needs.changes.outputs.code == 'true'  # disable for now.\n\n    runs-on: ubuntu-latest\n    defaults:\n      run:\n        # https://github.com/conda-incubator/setup-miniconda#use-a-default-shell\n        shell: bash -el {0}  # bash exit immediately on error + login shell\n    strategy:\n      fail-fast: false\n      matrix:\n        python-version: ['3.12']\n\n    steps:\n      - name: Checkout Source\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          fetch-depth: 0\n\n      - name: Hash + Timestamp\n        run: echo \"HASH=${{ runner.os }}-${{ runner.arch }}-Py${{ matrix.python-version }}-benchmark-$(date -u \"+%Y%m\")\" >> $GITHUB_ENV\n\n      - name: Cache Conda\n        uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4\n        with:\n          path: ~/conda_pkgs_dir\n          key: cache-${{ env.HASH }}\n\n      - name: Setup Miniconda\n        uses: conda-incubator/setup-miniconda@fc2d68f6413eb2d87b895e92f8584b5b94a10167 # v3.3.0\n\n      - name: Conda Install\n        run: conda install\n          --yes\n          --file tests/requirements.txt\n          python=${{ matrix.python-version }}\n\n      - name: Conda Info\n        run: python -m conda info --verbose\n\n      - name: Conda Config\n        run: conda config --show-sources\n\n      - name: Conda List\n        run: conda list --show-channel-urls\n\n      - name: Run Benchmarks\n        uses: CodSpeedHQ/action@d872884a306dd4853acf0f584f4b706cf0cc72a2 # v4.13.0\n        with:\n          token: ${{ secrets.CODSPEED_TOKEN }}\n          run: $CONDA/envs/test/bin/pytest --codspeed\n          mode: instrumentation\n\n  # linux-qemu test suite\n  linux-qemu:\n    # only run test suite if there are code changes\n    # CONDA-LIBMAMBA-SOLVER CHANGE\n    # needs: changes\n    if: false\n    # needs.changes.outputs.code == 'true'\n    #/ CONDA-LIBMAMBA-SOLVER CHANGE\n\n    # Run one single fast test per docker+qemu emulated linux platform to test that\n    # test execution is possible there (container+tools+dependencies work). Can be\n    # changed / extended to run specific tests in case there are platform related\n    # things to test. Running more tests is time consuming due to emulation\n    # (factor 2-10x slower).\n    runs-on: ubuntu-latest\n    defaults:\n      run:\n        # https://github.com/conda-incubator/setup-miniconda#use-a-default-shell\n        shell: bash -el {0}  # bash exit immediately on error + login shell\n    strategy:\n      fail-fast: false\n      matrix:\n        python-version: ['3.12']\n        image: ['continuumio/miniconda3:latest', 'condaforge/miniforge3:latest']\n        platform: [arm64, ppc64le, s390x]\n        exclude:\n          - image: 'continuumio/miniconda3:latest'\n            platform: ppc64le\n          - image: 'condaforge/miniforge3:latest'\n            platform: s390x\n\n    steps:\n      - name: Checkout Source\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          fetch-depth: 0\n\n      - name: Setup QEMU\n        uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0\n\n      - name: Run Tests\n        run: docker run\n          --rm\n          --volume ${PWD}:/opt/conda-src\n          --workdir /opt/conda-src\n          --platform linux/${{ matrix.platform }}\n          ${{ matrix.image }}\n          bash -lc\n          \". /opt/conda/etc/profile.d/conda.sh\n          && set -x\n          && conda create\n            --name test\n            --yes\n            --file tests/requirements.txt\n            --file tests/requirements-${{ runner.os }}.txt\n            --file tests/requirements-ci.txt\n            python=${{ matrix.python-version }}\n          && conda activate test\n          && python -m conda info --verbose\n          && conda config --show-sources\n          && conda list --show-channel-urls\n          && python -m pytest tests/test_api.py::test_DepsModifier_contract\"\n\n  # macos test suite\n  macos:\n    # only run test suite if there are code changes\n    needs: changes\n    if: needs.changes.outputs.code == 'true'\n\n    runs-on: ${{ (matrix.arch == 'osx-64' && 'macos-15-intel') || 'macos-latest' }}\n    defaults:\n      run:\n        # https://github.com/conda-incubator/setup-miniconda#use-a-default-shell\n        shell: bash -el {0}  # bash exit immediately on error + login shell\n    strategy:\n      fail-fast: false\n      matrix:\n        # test lower version (w/ osx-64 & conda-forge & unit tests) and upper version (w/ osx-arm64 & defaults & integration tests)\n        arch: [osx-64, osx-arm64]\n        python-version: ['3.10', '3.13']\n        default-channel: [defaults, conda-forge]\n        test-type: [conda-libmamba-solver, unit, integration]  # CONDA-LIBMAMBA-SOLVER CHANGE\n        test-group: [1, 2, 3]\n        exclude:\n          - arch: osx-64\n            python-version: '3.13'\n          - arch: osx-64\n            default-channel: defaults\n          - arch: osx-64\n            test-type: integration\n          - arch: osx-arm64\n            python-version: '3.10'\n          - arch: osx-arm64\n            default-channel: conda-forge\n          - arch: osx-arm64\n            test-type: unit\n          - arch: osx-arm64  # CONDA-LIBMAMBA-SOLVER CHANGE\n            test-type: conda-libmamba-solver  # CONDA-LIBMAMBA-SOLVER CHANGE\n          - test-type: unit\n            test-group: 3\n          - test-type: conda-libmamba-solver  # CONDA-LIBMAMBA-SOLVER CHANGE\n            test-group: 2  # CONDA-LIBMAMBA-SOLVER CHANGE\n          - test-type: conda-libmamba-solver  # CONDA-LIBMAMBA-SOLVER CHANGE\n            test-group: 3  # CONDA-LIBMAMBA-SOLVER CHANGE\n    env:\n      PYTEST_MARKER: ${{ matrix.test-type == 'unit' && 'not integration' || 'integration' }}\n      PYTEST_SPLITS: ${{ matrix.test-type == 'unit' && '2' || '3' }}\n\n    steps:\n      - name: Checkout conda/conda # CONDA-LIBMAMBA-SOLVER CHANGE\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          fetch-depth: 0\n          repository: conda/conda  # CONDA-LIBMAMBA-SOLVER CHANGE\n          path: conda  # CONDA-LIBMAMBA-SOLVER CHANGE\n          ref: ${{ env.CONDA_REF }}\n\n      # CONDA-LIBMAMBA-SOLVER CHANGE\n      - name: Checkout conda-libmamba-solver\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          fetch-depth: 0\n          path: conda-libmamba-solver\n      # /CONDA-LIBMAMBA-SOLVER CHANGE\n\n      - name: Hash + Timestamp\n        run: echo \"HASH=${{ runner.os }}-${{ runner.arch }}-Py${{ matrix.python-version }}-${{ matrix.default-channel }}-${{ matrix.test-type }}-${{ matrix.test-group }}-$(date -u \"+%Y%m\")\" >> $GITHUB_ENV\n\n      - name: Cache Conda\n        uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4\n        with:\n          path: ~/conda_pkgs_dir\n          key: cache-${{ env.HASH }}\n\n      - name: Setup Miniconda\n        uses: conda-incubator/setup-miniconda@fc2d68f6413eb2d87b895e92f8584b5b94a10167 # v3.3.0\n        with:\n          # CONDA-LIBMAMBA-SOLVER CHANGE: add conda/\n          condarc-file: conda/.github/condarc-${{ matrix.default-channel }}\n          run-post: false  # skip post cleanup\n          # conda not preinstalled in arm64 runners\n          miniconda-version: ${{ (matrix.default-channel == 'defaults' && matrix.arch == 'osx-arm64') && 'latest' || null }}\n          miniforge-version: ${{ (matrix.default-channel == 'conda-forge' && matrix.arch == 'osx-64') && 'latest' || null }}\n          architecture: ${{ runner.arch }}\n\n      - name: Upgrade conda-libmamba-solver (without sharded repodata)\n        run: CONDA_PLUGINS_USE_SHARDED_REPODATA=0 conda install --yes -n base conda-canary/label/dev::conda-libmamba-solver\n\n      - name: Conda Install\n        working-directory: conda # CONDA-LIBMAMBA-SOLVER CHANGE\n        # CONDA-LIBMAMBA-SOLVER CHANGE: add conda-libmamba-solver requirements.txt\n        run: >\n          conda install\n          --yes\n          --file tests/requirements.txt\n          --file tests/requirements-ci.txt\n          --file tests/requirements-s3.txt\n          --file ../conda-libmamba-solver/dev/requirements.txt\n          ${{ matrix.test-type == 'conda-libmamba-solver' && '--file ../conda-libmamba-solver/tests/requirements.txt' || '' }}\n          python=${{ matrix.python-version }}\n\n      - name: Conda Remove anaconda-auth\n        if: matrix.arch != 'osx-64'\n        run: conda remove --yes -n base anaconda-auth anaconda-anon-usage conda-anaconda-telemetry conda-anaconda-tos\n\n      # CONDA-LIBMAMBA-SOLVER CHANGE\n      - name: Install conda-libmamba-solver\n        run: python -m pip install -e conda-libmamba-solver/ -vv --no-deps --no-build-isolation\n      #/ CONDA-LIBMAMBA-SOLVER CHANGE\n\n      - name: Conda Info\n        run: python -m conda info --verbose\n\n      - name: Conda Config\n        run: conda config --show-sources\n\n      - name: Conda List\n        run: conda list --show-channel-urls\n\n      - name: Setup Shells\n        # for tests/shell, so only necessary for integration tests\n        if: matrix.test-type == 'integration'\n        run: brew update && brew install fish xonsh\n\n      - name: Run Tests\n        working-directory: conda  # CONDA-LIBMAMBA-SOLVER CHANGE\n        if: ${{ matrix.test-type != 'conda-libmamba-solver' }}  # CONDA-LIBMAMBA-SOLVER CHANGE\n        run: python -m pytest\n          --durations-path=durations/${{ runner.os }}.json\n          --group=${{ matrix.test-group }}\n          --splits=${{ env.PYTEST_SPLITS }}\n          --reruns=${{ env.PYTEST_RERUN_FAILURES }}\n          -m \"${{ env.PYTEST_MARKER }}\"\n\n      # CONDA-LIBMAMBA-SOLVER CHANGE\n      - name: Run conda-libmamba-solver Tests\n        working-directory: conda-libmamba-solver\n        if: ${{ matrix.test-type == 'conda-libmamba-solver' }}\n        run: |\n          python -m pip install -e ../conda/ --no-deps --no-build-isolation\n          python -m conda init --all\n          . $CONDA_PREFIX/etc/profile.d/conda.sh\n          python -m pytest -vv ${{ env.PYTEST_CLS_ADDOPTS }} --reruns=${{ env.PYTEST_RERUN_FAILURES_CLS }} --durations=16\n      #/ CONDA-LIBMAMBA-SOLVER CHANGE\n\n      - name: Upload Coverage\n        uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0\n        if: false  # CONDA-LIBMAMBA-SOLVER CHANGE\n        with:\n          flags: ${{ runner.os }},${{ runner.arch }},${{ matrix.python-version }},${{ matrix.test-type }}\n\n      - name: Upload Test Results\n        if: '!cancelled()'\n        uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0\n        with:\n          name: test-results-${{ env.HASH }}\n          # CONDA-LIBMAMBA-SOLVER CHANGE: need to prepend conda/ to the paths\n          path: |\n            conda/.coverage\n            conda/durations/${{ runner.os }}.json\n            conda/test-report.xml\n          retention-days: 1  # temporary, combined in aggregate below\n\n  # aggregate and upload\n  aggregate:\n    # only aggregate test suite if there are code changes\n    needs: [changes, windows, linux, linux-benchmarks, linux-qemu, macos]\n    if: >-\n      !cancelled()\n      && needs.changes.outputs.code == 'true'\n\n    runs-on: ubuntu-latest\n    steps:\n      - name: Download Artifacts\n        uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1\n\n      - name: Upload Combined Test Results\n        # provides one downloadable archive of all matrix run test results for further analysis\n        uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0\n        with:\n          name: test-results-${{ github.sha }}-all\n          path: test-results-*\n          retention-days: 7  # for durations.yml workflow\n\n      - name: Test Summary\n        uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4\n        with:\n          paths: test-results-*/test-report.xml\n\n  # required check\n  analyze:\n    needs: [windows, linux, linux-qemu, linux-benchmarks, macos, aggregate]\n    if: '!cancelled()'\n\n    runs-on: ubuntu-latest\n    steps:\n      - name: Determine Success\n        uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe # v1.2.2\n        id: alls-green # CONDA-LIBMAMBA-SOLVER CHANGE\n        with:\n          # permit jobs to be skipped if there are no code changes (see changes job)\n          allowed-skips: ${{ toJSON(needs) }}\n          jobs: ${{ toJSON(needs) }}\n\n      # CONDA-LIBMAMBA-SOLVER CHANGE\n      - name: Checkout our source\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        if: always() && github.event_name == 'schedule' && steps.alls-green.outputs.result == 'failure'\n\n      - name: Report failures\n        if: always() && github.event_name == 'schedule' && steps.alls-green.outputs.result == 'failure'\n        uses: JasonEtco/create-an-issue@1b14a70e4d8dc185e5cc76d3bec9eab20257b2c5 # v2.9.2\n        env:\n          GITHUB_TOKEN: ${{ secrets.CONDA_LIBMAMBA_SOLVER_ISSUES }}\n          RUN_ID: ${{ github.run_id }}\n          TITLE: \"Scheduled tests failed\"\n        with:\n          filename: .github/TEST_FAILURE_REPORT_TEMPLATE.md\n          update_existing: true\n      # /CONDA-LIBMAMBA-SOLVER CHANGE\n\n  # canary builds\n  build:\n    name: Build canary\n    needs: [analyze]\n    # only build canary build if\n    # - prior steps succeeded,\n    # - this is the main repo, and\n    # - we are on the main, feature, or release branch\n    if: >-\n      !cancelled()\n      && !github.event.repository.fork\n      && (\n        github.ref_name == 'main'\n        || startsWith(github.ref_name, 'feature/')\n        || endsWith(github.ref_name, '.x')\n      )\n    runs-on: ubuntu-latest\n    steps:\n      # Clean checkout of specific git ref needed for package metadata version\n      # which needs env vars GIT_DESCRIBE_TAG and GIT_BUILD_STR:\n      - name: Checkout Source\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          ref: ${{ github.ref }}\n          clean: true\n          fetch-depth: 0\n\n      # Explicitly use Python 3.11 since each of the OSes has a different default Python\n      - name: Setup Python\n        uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0\n        with:\n          python-version: '3.11'\n\n      - name: Detect Label\n        shell: python\n        run: |\n          from pathlib import Path\n          from re import match\n          from os import environ\n\n          if \"${{ github.ref_name }}\" == \"main\":\n              # main branch commits are uploaded to the dev label\n              label = \"dev\"\n          elif \"${{ github.ref_name }}\".startswith(\"feature/\"):\n              # feature branch commits are uploaded to a custom label\n              label = \"${{ github.ref_name }}\"\n          else:\n              # release branch commits are added to the rc label\n              # see https://github.com/conda/infrastructure/issues/760\n              _, name = \"${{ github.repository }}\".split(\"/\")\n              label = f\"rc-{name}-${{ github.ref_name }}\"\n\n          Path(environ[\"GITHUB_ENV\"]).write_text(f\"ANACONDA_ORG_LABEL={label}\")\n\n      - name: Create & Upload\n        uses: conda/actions/canary-release@7f6830b1428a9bd47f0b068892c77eae95207037 # v26.1.0\n        env:\n          # Run conda-build in isolated activation to properly package conda\n          _CONDA_BUILD_ISOLATED_ACTIVATION: 1\n        with:\n          package-name: ${{ github.event.repository.name }}\n          subdir: noarch\n          anaconda-org-channel: conda-canary\n          anaconda-org-label: ${{ env.ANACONDA_ORG_LABEL }}\n          anaconda-org-token: ${{ secrets.ANACONDA_ORG_CONDA_CANARY_TOKEN }}\n          conda-build-arguments: --override-channels --channel conda-forge\n"
  },
  {
    "path": ".github/workflows/update.yml",
    "content": "name: Update Repository\n\non:\n  # every Sunday at 00:36 UTC\n  # https://crontab.guru/#36_2_*_*_0\n  schedule:\n    - cron: 36 2 * * 0\n\n  workflow_dispatch:\n\n  issue_comment:\n    types:\n      - created\n\njobs:\n  update:\n    if: >-\n      !github.event.repository.fork\n      && (\n        github.event_name == 'schedule'\n        || github.event_name == 'workflow_dispatch'\n        || (\n          github.event_name == 'issue_comment'\n          && github.event.issue.pull_request\n          && (\n            github.event.comment.body == '@conda-bot render'\n            || github.event.comment.body == '@conda-bot recreate'\n          )\n        )\n      )\n    runs-on: ubuntu-slim\n    steps:\n      - if: github.event_name == 'issue_comment'\n        uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0\n        with:\n          comment-id: ${{ github.event.comment.id }}\n          reactions: eyes\n          reactions-edit-mode: replace\n          token: ${{ secrets.SYNC_TOKEN }}\n\n      - if: github.event.comment.body == '@conda-bot render'\n        name: Configure git origin\n        run: |\n          echo REPOSITORY=$(curl --silent ${{ github.event.issue.pull_request.url }} | jq --raw-output '.head.repo.full_name') >> $GITHUB_ENV\n          echo REF=$(curl --silent ${{ github.event.issue.pull_request.url }} | jq --raw-output '.head.ref') >> $GITHUB_ENV\n\n      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          repository: ${{ env.REPOSITORY || github.repository }}\n          ref: ${{ env.REF || '' }}\n          token: ${{ secrets.SYNC_TOKEN }}\n\n      - name: Configure git user\n        run: |\n          git config --global user.name 'Conda Bot'\n          git config --global user.email '18747875+conda-bot@users.noreply.github.com'\n\n      - uses: conda/actions/combine-durations@7f6830b1428a9bd47f0b068892c77eae95207037 # v26.1.0\n        id: durations\n        continue-on-error: true\n\n      - uses: conda/actions/template-files@7f6830b1428a9bd47f0b068892c77eae95207037 # v26.1.0\n        id: templates\n        continue-on-error: true\n\n      - name: Commit changes\n        # no-op if there are no updates\n        continue-on-error: true\n        run: |\n          git add .\n          git commit --message \"🤖 updated file(s)\"\n\n      - if: github.event.comment.body != '@conda-bot render'\n        name: Create fork\n        # no-op if the repository is already forked\n        run: echo FORK=$(gh repo fork --clone=false --default-branch-only 2>&1 | awk '{print $1}') >> $GITHUB_ENV\n        env:\n          GH_TOKEN: ${{ secrets.SYNC_TOKEN }}\n\n      - if: github.event.comment.body != '@conda-bot render'\n        id: create\n        # no-op if no commits were made\n        uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1\n        with:\n          push-to-fork: ${{ env.FORK }}\n          token: ${{ secrets.SYNC_TOKEN }}\n          branch: update\n          delete-branch: true\n          title: 🤖 Update infrastructure file(s)\n          body: |\n            [update.yml]: ${{ github.server_url }}/${{ github.repository }}/blob/main/.github/workflows/update.yml\n\n            Your friendly repository updater.\n\n            ${{ steps.durations.outputs.summary }}\n\n            ${{ steps.templates.outputs.summary }}\n\n            This PR was triggered by @${{ github.triggering_actor }} via ${{ github.event_name }}.\n\n            <details>\n            <summary>Commands</summary>\n\n            Trigger actions by commenting on this PR:\n\n            - `@conda-bot render` will run rendering workflows and commit and push any changes to this PR\n            - `@conda-bot recreate` will recreate this PR, overwriting any edits that have been made to it\n\n            </details>\n\n            ###### Auto-generated by the [`update.yml`][update.yml] workflow, see ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}.\n\n      - if: github.event.comment.body == '@conda-bot render'\n        id: update\n        name: Push changes\n        run: git push --force-with-lease\n\n      - if: always() && github.event_name == 'issue_comment'\n        uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0\n        with:\n          comment-id: ${{ github.event.comment.id }}\n          reactions: ${{ (steps.create.conclusion == 'success' || steps.update.conclusion == 'success') && 'hooray' || 'confused' }}\n          reactions-edit-mode: replace\n          token: ${{ secrets.SYNC_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\n.pybuilder/\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n#   For a library or package, you might want to ignore these files since the code is\n#   intended to run in multiple environments; otherwise, check them in:\n# .python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# poetry\n#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\n#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control\n#poetry.lock\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# Cython debug symbols\ncython_debug/\n\n# PyCharm\n#  JetBrains specific template is maintainted in a separate JetBrains.gitignore that can\n#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore\n#  and can be added to the global gitignore or merged into this file.  For a more nuclear\n#  option (not recommended) you can uncomment the following to ignore the entire idea folder.\n#.idea/\n.vscode/\n\n# rever\nrever/\n\n# setuptools_scm\n_version.py\n\n# codspeed\n.codspeed/\n"
  },
  {
    "path": ".mailmap",
    "content": "# This file was autogenerated by rever: https://regro.github.io/rever-docs/\n# This prevent git from showing duplicates with various logging commands.\n# See the git documentation for more details. The syntax is:\n#\n#   good-name <good-email> bad-name <bad-email>\n#\n# You can skip bad-name if it is the same as good-name and is unique in the repo.\n#\n# This file is up-to-date if the command git log --format=\"%aN <%aE>\" | sort -u\n# gives no duplicates.\n\nAgriya Khetarpal <74401230+agriyakhetarpal@users.noreply.github.com>\nAlbert DeFusco <albert.defusco+gh@me.com>\nChristopher Ostrouchov <chris.ostrouchov@gmail.com>\nDan Yeaw <dan@yeaw.me>\nDaniel Holth <dholth@anaconda.com>\nJaime Rodríguez-Guerra <jaimergp@users.noreply.github.com> jaimergp <jaimergp@users.noreply.github.com>\nJannis Leidel <jannis@leidel.info>\nJohn Costa <costajohnt@gmail.com>\nJohn Kirkham <jakirkham@gmail.com>\nJonathan J. Helmus <jjhelmus@gmail.com>\nJulien Jerphanion <git@jjerphan.xyz>\nKen Odegard <kodegard@anaconda.com>\nKevin Markham <justmarkham@users.noreply.github.com>\nKlaus Zimmermann <klaus.zimmermann@quansight.com>\nMatthew R. Becker <beckermr@users.noreply.github.com>\nRyan Keith <rkeith@anaconda.com>\nSophia Castellarin <scastellarin@openteams.com>\nStacy Noland <46572585+stacynoland@users.noreply.github.com>\nThomas Lam <79589038+tl-hbk@users.noreply.github.com>\nTravis Hathaway <travis.j.hathaway@gmail.com>\nconda-bot <18747875+conda-bot@users.noreply.github.com> Conda Bot <18747875+conda-bot@users.noreply.github.com>\ndependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\npre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "content": "# disable autofixing PRs, commenting \"pre-commit.ci autofix\" on a pull request triggers a autofix\nci:\n  autofix_prs: false\n# generally speaking we ignore all vendored code as well as tests data\nexclude: |\n  (?x)^(\n    tests/data/.* |\n    conda_libmamba_solver/mamba_utils\\.py\n  )$\nrepos:\n  # generic verification and formatting\n  - repo: https://github.com/pre-commit/pre-commit-hooks\n    rev: v6.0.0\n    hooks:\n      # standard end of line/end of file cleanup\n      - id: mixed-line-ending\n      - id: end-of-file-fixer\n      - id: trailing-whitespace\n      # ensure syntaxes are valid\n      - id: check-toml\n      - id: check-yaml\n        exclude: |\n          (?x)^(\n            (conda\\.)?recipe/meta.yaml\n          )\n      # catch git merge/rebase problems\n      - id: check-merge-conflict\n  - repo: https://github.com/asottile/blacken-docs\n    rev: 1.20.0\n    hooks:\n      # auto format Python codes within docstrings\n      - id: blacken-docs\n        additional_dependencies: [black]\n  - repo: https://github.com/astral-sh/ruff-pre-commit\n    rev: v0.15.12\n    hooks:\n      # lint & attempt to correct failures (e.g. pyupgrade)\n      - id: ruff-check\n        args: [--fix]\n      # compatible replacement for black\n      - id: ruff-format\n  - repo: meta\n    # see https://pre-commit.com/#meta-hooks\n    hooks:\n      - id: check-hooks-apply\n      - id: check-useless-excludes\n  - repo: https://github.com/PyCQA/bandit\n    rev: 1.9.4\n    hooks:\n      - id: bandit\n        args: [--exit-zero]\n        exclude: ^(tests/)\n  - repo: https://github.com/Lucas-C/pre-commit-hooks\n    rev: v1.5.6\n    hooks:\n      - id: insert-license\n        files: \\.py$\n        args: [--license-filepath, .github/disclaimer.txt, --no-extra-eol]\n        exclude: ^(tests/repodata_time_machine.py|mamba_utils\\.py|tests/channel_testing/helpers\\.py|tests/channel_testing/reposerver\\.py)  # extend global exclude\n"
  },
  {
    "path": "AUTHORS.md",
    "content": "All of the people who have made at least one contribution to conda-libmamba-solver.\nAuthors are sorted alphabetically.\n\n* Agriya Khetarpal\n* Albert DeFusco\n* Christopher Ostrouchov\n* Dan Yeaw\n* Daniel Holth\n* Jaime Rodríguez-Guerra\n* Jannis Leidel\n* John Costa\n* John Kirkham\n* Jonathan J. Helmus\n* Julien Jerphanion\n* Ken Odegard\n* Kevin Markham\n* Klaus Zimmermann\n* Matthew R. Becker\n* Ryan Keith\n* Sophia Castellarin\n* Stacy Noland\n* Thomas Lam\n* Travis Hathaway\n* conda-bot\n* dependabot[bot]\n* pre-commit-ci[bot]\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\n> The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),\n> and this project adheres to [calendar versioning](https://calver.org/) in the `YY.M.MICRO`format.\n\n<!--\nPopulate these categories as PRs are merged to `main`. When a release is cut,\ncopy to its corresponding section, deleting empty sections if any.\nRemember to update the hyperlinks at the bottom.\n--->\n\n[//]: # (current developments)\n\n\n\n\n## 26.4.1 (2026-05-01)\n\n### Bug fixes\n\n* Show the target platform instead of the host platform in the progress\n  message during cross-platform lockfile export. (#911)\n* Open the sharded repodata cache (`repodata_shards.db`) in WAL mode with a\n  longer SQLite busy timeout, so the pipelined cache reader thread no longer\n  races with the network writer thread and raises\n  `sqlite3.OperationalError: database is locked`. Fall back to the default\n  journal mode on filesystems where WAL is not supported. (#924)\n* Fix `add_pip_as_python_dependency` not being honored when sharded repodata\n  is enabled. (#918 via #929)\n\n### Contributors\n\n* @costajohnt made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/911\n* @danyeaw made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/929\n* @dholth\n* @jezdez\n* @conda-bot\n* @pre-commit-ci[bot]\n\n\n\n## 26.4.0 (2026-04-16)\n\n### Enhancements\n\n* Enable `use_sharded_repodata` by default. The solver will check for\n  `repodata_shards.msgpack.zst` and use sharded repodata if it is present in at\n  least one channel. Sharded repodata can be disabled with `conda config --set\n  plugins.use_sharded_repodata false` or the environment variable\n  `CONDA_PLUGINS_USE_SHARDED_REPODATA=0`. (#836)\n\n### Bug fixes\n\n* Improve timeout behavior when fetching shards. (#890)\n* Fix race condition while reading shards index cache. (#890)\n\n### Contributors\n\n* @dholth\n* @conda-bot\n* @dependabot[bot]\n* @pre-commit-ci[bot]\n\n\n\n## 26.3.0 (2026-03-04)\n\n### ✨ Special Announcement ✨\n\nFollowing the preliminary support for fetching [CEP 16](https://conda.org/learn/ceps/cep-0016) sharded repodata in conda-libmamba-solver 25.11.0, this release marks this feature as ready to be used by a wider audience.\n\nSee below's 25.11.0 release for more information on how to enable it.\n\n### Enhancements\n\n* Add offline mode support for sharded repodata. When offline mode is enabled,\n  the solver will use cached shards even if they are expired, and gracefully\n  fall back to non-sharded repodata if no cache exists. Missing shards in\n  offline mode return empty shards rather than failing. (#710)\n\n### Bug fixes\n\n* Remove `.tar.bz2` with matching `.conda`-format packages during shard\n  traversal if `conda` is not in \"use_only_tar_bz2\" mode; needed as shards\n  directly adds individual packages to the solver. (#710)\n* Fall back to `repodata.json` path if no channel has\n  `repodata_shards.msgpack.zst` instead of computing repodata subsets for\n  monolithic channels. (#716)\n* Ensure `track_features` fields are recorded properly in `conda-meta/*.json`. (#804 via #805)\n* Remove sqlite3 sharded repodata cache and create another on error. (#823)\n* Ensure that channel order is preserved when fetching data from shards. (#824 via #828)\n* Explicitly close sqlite3 connections after shard traversal to avoid a Python\n  3.13+ warning. (#843).\n* Fall back to `repodata.json`, but don't mark shards as unavailable, unless we\n  receive a 4xx error code besides 416. (#844)\n* Use relative join on `s3://`-hosted `repodata_shards.msgpack.zst` and shards\n  `base_url`, instead of truncating to just `base_url`. (#866)\n\n### Docs\n\n* Update documentation to reflect that the cudatoolkit/cpuonly issue has returned. (#815)\n\n### Other\n\n* Use lazy `PrefixData` getter to remove custom workaround for `conda` update checks. (#784 via #817)\n* Refactor `LibMambaIndexHelper._channel_urls` to preserve arch/noarch in\n  `Channel()` objects; simplify sharded channel handling. (#841)\n* The `cpuonly` mutex no longer correctly prevents CUDA packages from being\n  installed. For a time it appeared to work when non-cuda systems showed a\n  virtual package `__cuda=0=0`, but with no `__cuda` package the mutex appears\n  to no longer work. Reversing (#131 via #741)\n\n### Contributors\n\n* @dholth\n* @jaimergp\n* @jezdez\n* @ryanskeith\n* @soapy1\n* @conda-bot\n* @dependabot[bot]\n* @pre-commit-ci[bot]\n\n\n\n## 25.11.0 (2025-11-24)\n\n### ✨ Special Announcement ✨\n\nThis release includes preliminary support for fetching [CEP 16](https://conda.org/learn/ceps/cep-0016) sharded repodata, a substantially more efficient way of distributing the necessary metadata to install packages in your environments.\n\nYou can try it by:\n\n- Enabling it in your settings with `conda config --set plugins.use_sharded_repodata true`\n- Setting this environment variable: `CONDA_PLUGINS_USE_SHARDED_REPODATA=1`\n\nNote that sharded repodata requires that the target channels expose the necessary metadata too, so it will only work with CEP-16-ready deployments. `conda-libmamba-solver` will fallback to traditional (monolithic) repodata if not available, so you can mix sharded and non-sharded channels without problems.\n\n### Enhancements\n\n* Add experimental support for [CEP 16](https://conda.org/learn/ceps/cep-0016) sharded repodata. Enable it with `conda config --set plugins.use_sharded_repodata true` or `CONDA_PLUGINS_USE_SHARDED_REPODATA=1`. (#684, #695, #696, #715 via #722, #730, #748, #736, #756, #762)\n  * When sharded repodata is enabled, the solver checks every channel for an index,\n  `repodata_shards.msgpack.zst`, and re-checks every 7 days if not found. It builds a subset of\n  repodata by recursively traversing the dependencies of all installed and requested packages,\n  using shards to fetch only the package metadata that could possibly be part of the solution from\n  each channel. This smaller amount of package metadata is sent to the solver. Sharded repodata can\n  save a significant amount of bandwith, memory, and parse time when installing packages.\n  * Cache shards in a sqlite database in `${CONDA_PREFIX}/pkgs/cache/repodata_shards.db`.\n  * This implementation does not use shards for `conda search` or other repodata uses that do not\n  include a solve.\n* Add support for [CEP 17](https://conda.org/learn/ceps/cep-0017/) `python_site_packages_path`. (#560 via #628)\n* Add new messaging for when `conda` is outdated, environment is [frozen](https://conda.org/learn/ceps/cep-0022/), and `conda-self` is installed. (#753 via #766)\n* Add a codspeed benchmarking GitHub action and a few benchmarks. (#754 via #755)\n\n### Bug fixes\n\n* Constrain the torchvision version in `test_pytorch_gpu`. (#659 via #661)\n* Correctly record channel platform in conda-meta record files. (#662 via #663)\n* Import `CondaSolver` from its canonical location in `conda.plugins.types`. (#691)\n* The `cpuonly` mutex now correctly prevents CUDA packages from being installed, matching classic solver behavior. (#131 via #741)\n\n### Deprecations\n\n* Replace deprecated `conda.core.index._supplement_index_with_system` with `conda.core.index.Index().system_packages`. (#654 via #655)\n* Drop support for Python 3.9. (#747)\n\n### Docs\n\n* Update documentation to reflect that the cudatoolkit/cpuonly issue has been resolved for the libmamba solver. (#131)\n* Document the [sharded repodata implementation](https://conda.github.io/conda-libmamba-solver/dev/sharded/). (#756, #745)\n\n### Other\n\n* Improve repository server in test suite. (#700)\n* Add Python 3.13 to the CI matrix. (#747)\n* Test osx-64 with `conda-forge`, and osx-arm64 with `defaults`, since Anaconda does not build osx-64 dependencies anymore. (#729, #747)\n\n## Contributors\n\n* @agriyakhetarpal made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/741\n* @dholth\n* @jaimergp\n* @jezdez\n* @jjhelmus\n* @kenodegard\n* @stacynoland made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/766\n* @travishathaway\n\n\n\n## 25.4.0 (2025-04-25)\n\n### Enhancements\n\n* Use `conda.reporters.get_spinner()` to support conda reporter plugins. (#641)\n\n### Bug fixes\n\n* Always percent-encode spaces in `file://` channel URLs. (#640)\n* Fix a bug where auto-selection of GPU variants of `pytorch` and `torchvision` didn't work as expected. (#646 via #647)\n* Avoid `libmamba` `MatchSpec` parsing errors by skipping nameless channel information in passed specs. (#645 via #648)\n\n### Contributors\n\n* @jaimergp\n\n\n\n## 25.3.0 (2025-03-14)\n\n### Bug fixes\n\n* Fix issue with content trust post-solve hooks that prevented signatures from being verified when the solved package records didn't include subdir information in their channel metadata. (#616 via #617)\n* Protect against `conda.base.context.context.restore_free_channel` deprecation by using `getattr`. (#629)\n* Remove all packages with `--no-deps`, not just the last one to be analyzed. (#632)\n\n### Docs\n\n* Mention conda ecosystem's adaptation of `libsolv`. (#624)\n\n### Contributors\n\n* @jaimergp\n* @jjerphan\n* @kenodegard\n\n\n## 25.1.1 (2025-01-24)\n\n### Bug fixes\n\n* Consider whether the full spec matches anything installed (not just name) when `--satisfied-skip-solve` is in use. (#605 via #606)\n\n### Contributors\n\n* @jaimergp\n\n\n\n## 25.1.0 (2025-01-21)\n\n### Bug fixes\n\n* Fix dependency handling in `conda env update --prune`. (#595 via #596)\n* Accept both `pathlib.Path()` and `str` for `LibMambaSolver()` prefix. (#586)\n\n### Contributors\n\n* @dholth\n* @jaimergp\n\n\n\n## 24.11.1 (2024-12-04)\n\n### Bug fixes\n\n* Ensure `PackageRecord` URLs are percent-decoded before passing them back to `conda`. (#583)\n\n### Contributors\n\n* @jaimergp\n\n\n\n## 24.11.0 (2024-11-27)\n\n🚀 This release ships compatibility for `libmamba 2.x`. It's a major rewrite! Make sure to check the changelog entry for `24.11.0rc` for more details.\n\n### Bug fixes\n\n* Load SOLV repodata cache in offline mode too. (#570)\n\n### Contributors\n\n* @jaimergp\n\n\n\n## 24.11.0rc (2024-10-31)\n\n### Enhancements\n\n* Require `libmambapy` v2. This is a big refactor in `libmamba` internals, which also allowed us to remove a lot of code in `conda-libmamba-solver`. (#457)\n\n### Deprecations\n\n* `CONDA_LIBMAMBA_SOLVER_NO_CHANNELS_FROM_INSTALLED` has no effect anymore. Channels coming from installed packages are no longer added to the channel list. (#411 via #457)\n* Removed `conda_libmamba_solver.state.BaseIndexHelper`. The base class is now `conda_libmamba_solver.index.IndexHelper`. (#457)\n* Verbose logging in `libsolv` has a big overhead in `libmamba` v2, so we have disabled it by default (even if the user adds `-vvv` flags to the CLI). To opt-in, please set `CONDA_LIBMAMBA_SOLVER_DEBUG_LIBSOLV` to a truthy value. (#457)\n* Python 3.8 is no longer supported. The minimum version is now 3.9. (#457)\n\n### Contributors\n\n* @jaimergp\n\n\n\n## 24.9.0 (2024-09-25)\n\n### Bug fixes\n\n* Use `Solver` instance configuration to initialize the `libmamba` context without implicitly relying on the `conda` context settings. (#525)\n* Fix conda-build compatibility regression where arch-specific outputs can't be found in the test phase if a `noarch` output was built first. (#531)\n\n### Docs\n\n* Add installation workarounds FAQ with conda-standalone. (#505 via #511)\n* Update user guide to reflect conda-libmamba-solver being the default solver in conda. (#516 via #517)\n* Include `mamba-org/mamba` as a required cloned repository for setting up a dev environment. (#528)\n\n### Contributors\n\n* @jaimergp\n* @jjhelmus made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/528\n* @justmarkham made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/510\n\n\n\n## 24.7.0 (2024-07-17)\n\n### Bug fixes\n\n* Allow wildcards in package names for `conda remove` (e.g. `conda remove \"python-*\"`). (#434 via #435)\n* Avoid duplicate channel listing when using channel-pinned specs like `channel::package`. (#449)\n* Fix a performance regression where `.solv` repodata cache files were not being loaded when available. (#481 via #482)\n* Do not ignore virtual packages as input specs. (#480 via #485)\n* Pin `libmambapy <2` to defend against upcoming API changes. (#492)\n\n### Docs\n\n* Document development workflows with devcontainers. (#451)\n\n### Other\n\n* Add DevContainer configurations for local development workflows. (#451)\n\n### Contributors\n\n* @jaimergp\n* @tl-hbk made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/449\n* @zklaus made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/476\n\n\n\n## 24.1.0 (2024-01-29)\n\n### Enhancements\n\n* Prioritize explicitly requested specs with stricter constraints over implicit ones or name-only specs (e.g. a CLI-specified `name=version=build` will be sent to the solver before CLI-specified `name=version` and `name`). This happens to fix #391. (#381)\n* Load `pkgs_dirs` records when called in offline mode. (#396 via #423)\n\n### Bug fixes\n\n* Fix a regression introduced in #378, where certain solves would hard crash due to the given specs input order. (#391 via #381)\n* Properly propagate customized local channels (conda-build workspaces). Requires `libmamba 1.5.6` or above. (#398 via #401)\n* Do not raise an error if an unsupported `MatchSpec` field can be safely dropped instead. Currently ignoring `url`, `md5` and `sha256`. (#418 via #421, #427 via #429).\n* Do not crash if a stateless repodata cache is accessed with `--offline` or `--use-index-cache`. (#396 via #423).\n\n### Other\n\n* Remove old `SolverOutputState.specs` preparation logic from `state.py`, which was no longer in use since 23.9.0. Instead, enumerate all known specs in a certain order (see Enhancements for details). This list is then consumed by `Solver._specs_to_tasks()` as usual. (#381)\n\n### Contributors\n\n* @isuruf made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/401\n* @jaimergp\n\n\n\n## 23.12.0 (2023-12-12)\n\n### Enhancements\n\n* Add some boundary checks to `CONDA_LIBMAMBA_SOLVER_MAX_ATTEMPTS`. (#394, #403)\n\n### Bug fixes\n\n* Instantiate `IndexHelper` in offline mode for compatibility with conda-build. Otherwise\n  the index can get out of sync during long build processes. (#386 via #395)\n\n### Docs\n\n* Use new conda-sphinx-theme for documentation site. (#367 via #370)\n* Reorganize the layout of the documentation site. (#370)\n\n### Contributors\n\n* @dholth\n* @jaimergp\n* @jezdez\n* @travishathaway made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/370\n\n\n## 23.11.1 (2023-11-16)\n\n### Enhancements\n\n* Raise a friendlier `InvalidSpec` error instead of `RuntimeError` when libmamba detects a problem in the configured solver jobs. (#352 via #357)\n* Ensure specs, `SolverInputState.installed` and `SolverInputState.virtual` containers are consistently sorted. (#378)\n\n### Bug fixes\n\n* Configure pinned specs just once to avoid solver bugs related with their persistence (i.e. inability to downgrade environments if pinned specs are present and a transient dependency needs to be removed). (#354 via #355)\n* Detect whether a channel is part of a multichannel so the latter is used in the `PackageRecord` entries for conda-build. Fixes an issue with conda-build and custom multichannels. (#363 via #365)\n* Allow authenticated URLs in `default_channels` and other multichannels. (#364 via #366)\n* Preserve authentication while reloading local channels. (#366)\n\n### Contributors\n\n* @jaimergp\n\n\n## 23.11.0 (2023-11-02)\n\n### Bug fixes\n\n* Do not use `libmamba`'s default signal handler so users can `Ctrl-C` from `conda`. (#337 via #340)\n* Defer conda-build-specific exception definition and import until it is needed by the solver. (#342)\n* Interpret \"excluded by strict priority\" solver errors as proper satisfiability conflicts and avoid printing related yet uninformative warnings. (#343)\n* Ensure that historic specs are kept in the environment, even if that means raising a conflict. (#341 via #345)\n\n### Docs\n\n* Document environment variables used for advanced configuration. (#349)\n\n### Other\n\n* Require `libmambapy >=1.5.3` for improved signal handling and `MatchSpec` syntax compliance. (#347)\n\n### Contributors\n\n* @dholth\n* @jaimergp\n\n\n\n## 23.9.3 (2023-10-24)\n\n### Bug fixes\n\n* Massage bracket-containing specs (e.g. `ca-certificates[version='>=2023']`) so they are understood by `libmambapy.Query`, fixing a bug where `conda` would erroneously complain about no package records matching the configured pinned specs. (#327 via #328)\n\n### Contributors\n\n* @jaimergp\n\n\n\n## 23.9.2 (2023-10-19)\n\n### Bug fixes\n\n* Use the conda version reported at runtime (instead of the one reported by `conda list`) to figure out whether there are conda updates available. (#316)\n* Allow the index to be empty in `--offline` runs with no local cache available for the configured channels. (#323)\n\n### Contributors\n\n* @costrouc\n* @jaimergp\n\n\n\n## 23.9.1 (2023-09-29)\n\n### Enhancements\n\n* Increase performance of `notify_conda_outdated` logic. (#298)\n\n### Bug fixes\n\n* Prevent solver from bouncing between two compatible solutions when the same command is run twice in a row. (#302)\n\n### Contributors\n\n* @costrouc\n* @jaimergp\n\n\n\n## 23.9.0 (2023-09-28)\n\n### Enhancements\n\n* Expose libmamba's `repoquery` search features as a conda subcommand plugin. (#258)\n* Rewrite how we create tasks for `libsolv`, making use of `libmamba`'s `add_pin` features. Requires `libmambapy >=1.5.1`. (#270, #288)\n* Name-only pins will lock the corresponding package if installed. ([conda#13031](https://github.com/conda/conda/pull/13031) via #289)\n* Use the `.solv` cache for repodata if available and recent. (#295)\n\n### Bug fixes\n\n* Handle commands with no channels passed gracefully. (#256)\n* Workaround for missing `noarch` field in returned `PackageRecord` payload. (#257)\n* Port logic from [conda/conda#9614](https://github.com/conda/conda/pull/9614), which fixes\n  a bug where the `--prune` flag was not working correctly in `conda env update` commands.\n  (#270)\n* Ensure environments are not aggressively updated to higher priority channels under some conditions. (#240 via #270, #285)\n* Do not inject those channels from installed packages that do not exist or are unavailable. (#262 via #274)\n* Correctly print all configured channels in `PackagesNotFoundError` exceptions. (#284)\n* Do not crash if a `MatchSpec` with a build string is specified in the CLI and there's a pinned spec for the same package name. (#286 via #289)\n* Only apply `defaults::pkg` workarounds for the default value `default_channels`. (#292)\n\n### Deprecations\n\n* Users won't be able to override pinned specs with incompatible CLI specs anymore. Instead they must modify their pinned specs explicitly. ([conda#9016](https://github.com/conda/conda/issues/9016) via #289, #294)\n\n### Docs\n\n* Document intentional deviations from conda's `classic` solver behavior. (#289)\n\n### Other\n\n* Explain why `defaults::pkg_name` is broken libmamba 1.5.x ([details](https://github.com/mamba-org/mamba/issues/2431)). (#266)\n\n\n\n## 23.7.0 (2023-07-31)\n\n### Enhancements\n\n* Add basic integrations for local channels in conda-build. (#194)\n\n### Bug fixes\n\n* Add backwards-compatible support for the new namespaced settings in `libmamba.Context`. (#192 via #193)\n* Fixes an error where a user-supplied package in the CLI would get dropped if the argument happened to match a larger string in the argument list. (#221 via #222)\n* Fix authentication in package downloads. (#216 via #226)\n* Fix unhandled channels coming from injected virtual packages in `conda-lock`. (#230 via #234)\n* Handle URL-encoded channels correctly with recent `libmamba` versions. (#247 via #248)\n\n### Docs\n\n* Added notes about development workflows with libmamba from source. (#191)\n\n### Other\n\n* Adding libmamba/libmambapy as development dependencies within docker images. (#191)\n\n### Contributors\n\n* @costrouc\n* @jaimergp\n* @conda-bot\n* @pre-commit-ci[bot]\n\n\n\n## 23.5.0 (2023-05-25)\n\n### Enhancements\n\n* Provide a `CONDA_LIBMAMBA_SOLVER_NO_CHANNELS_FROM_INSTALLED` environment variable to prevent\n  channels from being injected from installed packages. This is useful for air-gapped environments\n  where outside channels are not available. (#108 via #184)\n* Simplify `libmambapy.Context` initialization so we only set the bits that we use. (#209)\n* Use the new `RepoInterface` and remove the `SubdirData` subclass workarounds, which requires `conda 23.5.0`.\n  (#210)\n\n### Bug fixes\n\n* Fix an issue where running `conda update <package>` would result in the package being _downgraded_ if no newer versions were available. (#71 via #158)\n* Ensure unauthenticated channels are not re-injected in the channel lists from installed packages\n  if an authenticated equivalent is already present. (#108 via #184)\n* Honor `context.repodata_threads`. (#200)\n* Do not set `quiet` manually when `context.json` is true. (#187)\n\n### Deprecations\n\n* Remove unneeded user-agent tests. (#183)\n\n### Docs\n\n* Document known solver behavior differences. (#115, #131 via #197)\n* Update development docs to reflect changes in build system and other inaccuracies. (#208)\n\n### Other\n\n* Add tests reproducing the known solver differences. (#115, #131 via #197)\n* Skip tests on libmamba 1.4.2 temporarily to workaround some test failures. Tracked by #186. (#187)\n\n### Contributors\n\n* @jakirkham made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/189\n* @costrouc\n* @jaimergp\n* @jezdez\n* @kenodegard\n* @conda-bot\n* @pre-commit-ci[bot]\n\n\n\n## 23.3.0 (2023-03-31)\n\n### Enhancements\n\n* Simplify exception parsing and enable new (experimental) conflict reports in `libmamba`. (#102 via #103, #160)\n* Use `conda`'s `SubdirData` for all repodata fetching and caching. (#59, #68 via #65, #171)\n\n### Bug fixes\n\n* Disable lockfiles within libmambapy to conform with conda's behavior of not using them. (#120)\n* Fix JSON serialization errors in some exceptions. (#140 via #142)\n* Fix API breakage upstream: `SubdirData.cache_path_json` property changed from `str` to `PrefixPath`. Depend directly on `boltons.setutils.IndexedSet`. (#151)\n* Updated bundled conda recipe and corresponding CI workflow. (#166)\n* Bumped minimum conda version from 22.11.1 -> 23.3.0 due to change in boltons IndexedSet. (#170)\n* Add workaround for `defaults::<pkg_name>` specs. (#173 via #172)\n\n### Deprecations\n\n* Python 3.7 is no longer supported. The minimum version is now 3.8. (#174)\n\n### Other\n\n* Change the build-system to `hatchling` + `hatch-cvs` for a `setuptools-scm`-like versioning setup. (#128 via #127)\n* Add conda-forge based CI environments. (#133)\n* Fix cache directory in flaky test. (#157)\n* CI: Pin `minio` to `2023-03-13T19-46-17Z` to avoid breaking changes. (#159)\n* Require `libmamba 1.4.1` or greater and remove unused code paths. (#165)\n\n### Contributors\n\n* @AlbertDeFusco made their first contribution in https://github.com/conda/conda-libmamba-solver/pull/142\n* @costrouc\n* @jaimergp\n* @jezdez\n* @conda-bot\n* @pre-commit-ci[bot]\n\n\n\n## [23.1.0] - 2023-01-31\n\n### Bug fixes\n\n* Fix \"Packages Not Found\" error messages to be more accurate and informative. (#96 via #101)\n* Ensure solves are deterministic and input order independent. (#75 via #111)\n* Fix compatibility errors with newer conda versions >=23.1.0 since we are using an internal API SubdirData. (#118 via #119)\n\n### Docs\n\n* Mention expected versions and how to upgrade from experimental builds. (#89 via #93)\n\n### Other\n\n* CI: Add scheduled runs with self-reported issues. (#60 via #106)\n* Fix typo in workflow documentation so it is consistent with the setup page. (#110)\n\n### Contributors\n\n* @costrouc made their first contribution in #110\n* @jaimergp\n* @jezdez\n* @conda-bot\n* @pre-commit-ci[bot]\n\n\n## [22.12.0] - 2022-12-01\n\n### Upgrade notice\nTo upgrade to `conda-libmamba-solver 22.12.0` please update to `conda 22.11.0` using the \"classic\" solver first:\n\n```\n$ CONDA_EXPERIMENTAL_SOLVER=classic conda install -n base conda=22.11.0\n```\n\nand then install a new version of conda-libmamba-solver:\n\n```\n$ CONDA_EXPERIMENTAL_SOLVER=classic conda install -n base conda-libmamba-solver=22.12.0\n```\n\nAfterwards, please use the new `CONDA_SOLVER` environment variable and ``--solver`` as mentioned below.\n\n### Added\n\n* Added a new documentation site: https://conda.github.io/conda-libmamba-solver/ (#58)\n* Added [CEP 4](https://github.com/conda-incubator/ceps/blob/main/cep-4.md) compatible plugin for conda's `solvers` plugin hook. (#63)\n\n### Changed\n\n* The `conda-libmamba-solver` package is now generally available, removes the `experimental` label. (#53)\n* The index will also load channels only listed as part the installed packages in the active prefix. (#52)\n* Updated compatibility to [mamba 1.0.0](https://github.com/mamba-org/mamba/releases/tag/2022.11.01) and [conda 22.11.0](https://github.com/conda/conda/releases/tag/22.11.0). (#78)\n\n### Deprecated\n\n* Deprecate support for Python 3.6.x.\n\n### Fixed\n\n* Fixed a wrong dependency on libmambapy. (#90)\n\n* If missing or empty, package records will have their `subdir` field populated by the channel platform. (#53)\n\n## [22.8.1] - 2022-08-25\n\n### Fixed\n\n* Amend packaging metadata (#51)\n\n## [22.8.0] - 2022-08-24\n\n### Added\n\n* Check if conda is outdated with `libmamba` instead of relying on conda's implementation (#46)\n\n### Changed\n\n* Rely on conda's `SubdirData` as a fallback for channel protocols not supported by `libmamba` (#49)\n\n### Deprecated\n\n* Deprecate `libmamba-draft` solver variant (#45)\n\n### Removed\n\n* Remove legacy debugging code and file-logging based on stream capture (#48)\n\n## [22.6.0] - 2022-06-28\n\n### Added\n\n* Custom user agent (#29)\n* Compatibility with conda-build (#30)\n\n### Changed\n\n* Enable support for user-defined `repodata_fn` while ignoring `current_repodata.json` (#34)\n* Faster Python version changes (#33)\n* Remove base environment protection (#43)\n\n### Fixed\n\n* Fix libmamba 0.23 compatibility (#35)\n* Fix handling of `*`-enabled build strings (#36)\n* Fix `escape_channel_url` problems (#32)\n* Fix error reporting if S3-backed channels are used (#41)\n\n## [22.3.1] - 2022-03-23\n\n### Fixed\n\n* Make sure `noarch` packages get reinstalled if Python version changed (#26)\n* Accept star-only version specs (e.g. `libblas=*=*mkl`) and fix support for `channel::package` syntax (#25)\n* Enable support for authenticated channels (#23)\n\n## [22.3.0] - 2022-03-09\n\n_First public release_\n\n## [22.2.0] - 2022-02-01\n\n_Internal pre-release as a separate repository._\n\n<!-- Hyperlinks --->\n\n[Unreleased]: https://github.com/conda/conda-libmamba-solver/compare/22.8.1..main\n[22.3.1]: https://github.com/conda/conda-libmamba-solver/releases/tag/22.3.1\n[22.3.0]: https://github.com/conda/conda-libmamba-solver/releases/tag/22.3.0\n[22.2.0]: https://github.com/conda/conda-libmamba-solver/releases/tag/22.2.0\n[22.6.0]: https://github.com/conda/conda-libmamba-solver/releases/tag/22.6.0\n[22.8.0]: https://github.com/conda/conda-libmamba-solver/releases/tag/22.8.0\n[22.8.1]: https://github.com/conda/conda-libmamba-solver/releases/tag/22.8.1\n[22.12.0]: https://github.com/conda/conda-libmamba-solver/releases/tag/22.12.0\n[23.1.0]: https://github.com/conda/conda-libmamba-solver/releases/tag/23.1.0\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Conda Organization Code of Conduct\n\n# The Short Version\n\nBe kind to others. Do not insult or put down others. Behave professionally. Remember that harassment and sexist, racist, or exclusionary jokes are not appropriate for the conda Organization.\n\nAll communication should be appropriate for a professional audience including people of many different backgrounds. Sexual language and imagery is not appropriate.\n\nThe conda Organization is dedicated to providing a harassment-free community for everyone, regardless of gender, sexual orientation, gender identity and expression, disability, physical appearance, body size, race, or religion. We do not tolerate harassment of community members in any form.\n\nThank you for helping make this a welcoming, friendly community for all.\n\n## Report an Incident\n\n* Report a code of conduct incident [using a form](https://form.jotform.com/221527028480048).\n* Report a code of conduct incident via email: [conduct@conda.org](mailto:conduct@conda.org).\n* Contact [an individual committee member](#committee-membership) or [CoC event representative](#coc-representatives) to report an incident in confidence.\n\n&nbsp;\n\nAnd now the longer version...\n\n# Conda Organization Diversity Statement\n\nThe conda Organization welcomes and encourages participation in our community by people of all backgrounds and identities. We are committed to promoting and sustaining a culture that values mutual respect, tolerance, and learning, and we work together as a community to help each other live out these values.\n\nWe have created this diversity statement because we believe that a diverse community is stronger, more vibrant, and produces better software and better science. A diverse community where people treat each other with respect has more potential contributors, more sources for ideas, and fewer shared assumptions that might hinder development or research.\n\nAlthough we have phrased the formal diversity statement generically to make it all-inclusive, we recognize that there are specific identities that are impacted by systemic discrimination and marginalization. We welcome all people to participate in the conda Organization community regardless of their identity or background.\n\n# Conda Organization Code of Conduct: Introduction & Scope\n\nThis code of conduct should be honored by everyone who participates in the conda Organization community. It should be honored in any conda Organization-related activities, by anyone claiming affiliation with the conda Organization, and especially when someone is representing the conda Organization in any role (including as an event volunteer or speaker).\n\nThis code of conduct applies to all spaces managed by the conda Organization, including all public and private mailing lists, issue trackers, wikis, forums, and any other communication channel used by our community. The code of conduct equally applies at conda Organization events and governs standards of behavior for attendees, speakers, volunteers, booth staff, and event sponsors.\n\nThis code is not exhaustive or complete. It serves to distill our understanding of a collaborative, inclusive community culture. Please try to follow this code in spirit as much as in letter, to create a friendly and productive environment that enriches the conda Organization community.\n\nThe conda Organization Code of Conduct follows below.\n\n# Standards for Behavior\n\nThe conda Organization is a worldwide community. All communication should be appropriate for a professional audience including people of many different backgrounds.\n\n**Please always be kind and courteous. There's never a need to be mean or rude or disrespectful.** Thank you for helping make this a welcoming, friendly community for all.\n\nWe strive to:\n\n**Be empathetic, welcoming, friendly, and patient.** We remember that the conda Organization is crafted by human beings who deserve to be treated with kindness and empathy. We work together to resolve conflict and assume good intentions. We may all experience some frustration from time to time, but we do not allow frustration to turn into a personal attack. A community where people feel uncomfortable or threatened is not a productive one.\n\n**Be collaborative.** Our work depends on the participation of many people, and in turn others depend on our work. Open source communities depend on effective and friendly collaboration to achieve their goals.\n\n**Be inquisitive.** Nobody knows everything! Asking questions early avoids many problems later, so we encourage questions, although we may direct them to the appropriate forum. We will try hard to be responsive and helpful.\n\n**Be careful in the words that we choose.** We are careful and respectful in our communication and we take responsibility for our own speech. Be kind to others. Do not insult or put down other members of the community.\n\n## Unacceptable Behavior\n\nWe are committed to making participation in this community a harassment-free experience.\n\nWe will not accept harassment or other exclusionary behaviors, such as:\n\n- The use of sexualized language or imagery\n- Excessive profanity (please avoid curse words; people differ greatly in their sensitivity to swearing)\n- Posting sexually explicit or violent material\n- Violent or intimidating threats or language directed against another person\n- Inappropriate physical contact and/or unwelcome sexual attention or sexual comments\n- Sexist, racist, or otherwise discriminatory jokes and language\n- Trolling or insulting and derogatory comments\n- Written or verbal comments which have the effect of excluding people on the basis of membership in a specific group, including level of experience, gender, gender identity and expression, sexual orientation, disability, neurotype, personal appearance, body size, race, ethnicity, age, religion, or nationality\n- Public or private harassment\n- Sharing private content, such as emails sent privately or non-publicly, or direct message history, without the sender's consent\n- Continuing to initiate interaction (such as photography, recording, messaging, or conversation) with someone after being asked to stop\n- Sustained disruption of talks, events, or communications, such as heckling of a speaker\n- Publishing (or threatening to post) other people's personally identifying information (\"doxing\"), such as physical or electronic addresses, without explicit permission\n- Other unethical or unprofessional conduct\n- Advocating for, or encouraging, any of the above behaviors\n\nThe conda Organization prioritizes marginalized people’s safety over privileged people’s comfort. The conda CoC Committee reserves the right not to act on complaints including, but not limited to:\n\n* ‘Reverse’ -isms, including ‘reverse racism,’ ‘reverse sexism,’ and ‘cisphobia’.\n* Reasonable communication of boundaries, such as “leave me alone,” “go away,” or “I’m not discussing this with you.”\n* Communicating in a ‘tone’ you don’t find congenial.\n* Criticizing racist, sexist, cissexist, or otherwise oppressive behavior or assumptions.\n\n## Behavior Outside of conda Organization Spaces\n\nThe CoC Committee does not influence behavior and membership in spaces outside the conda Organization. However, if you are being harassed by a member of the conda community outside our spaces, you may still report it to the CoC Committee. We will take all good-faith reports of harassment by conda community members seriously. This includes harassment outside our spaces and harassment that took place at any point in time.\n\nThe CoC Committee reserves the right to exclude people from conda Organization spaces based on their past behavior, including behavior outside conda Organization spaces and behavior towards people who are not in the conda community.\n\n# Confidentiality and Public Statements to the Community\n\nThe CoC Committee will keep the identity of the reporter confidential.\n\nWhenever possible, CoC cases will be reported to the community. The level of detail in reports will vary from case to case. Reports will describe at least the type of infraction that was reported, and the Committee's decision and any action taken.  In most cases, the report will not include personally identifiable information.\n\n# Live Events\n\n> **If you feel your safety is in jeopardy or the situation is an emergency, we urge you to contact local law enforcement before making a report to the event's Code of Conduct committee members, [representatives](#coc-representatives), or other staff.** (In the U.S., call 911.)\n\nLive events present particular challenges:\n\n**Code of conduct reports, and consequences that stem from them, merit a thoughtful and deliberative process.  Decisions and consequences matter for the reporter, the reported, and for the community at large.  However, many reports, especially at live events, require rapid action to quickly address the behavior being reported.**\n\nTo better support situations where immediate action may be required, these guidelines are used *during* live events:\n\n* All conda Organization events will have specific, named Code of Conduct contacts for the events.\n* The names and contact mechanisms for the Code of Conduct representatives will be clearly and frequently communicated to event participants.\n\n## CoC Representatives\n\nEvery conda Organization associated event will have named CoC Committee members or *CoC representatives* that are the first point of contact for that event. Who these people are will be clearly and frequently communicated to event participants. CoC approved representatives are used when there are no committee members participating in the event.\n\n## Live Events: Reporting and Actions\nAt conda Organization events, Code of Conduct committee members or representatives will attempt to gather and write down [information](#what-to-include-in-a-report) from anyone making a verbal report at a live event. Recording the details in writing is exceedingly important in order for us to effectively respond to reports. If event staff write down a report taken verbally, then the person making the report will be asked to review the written report for accuracy.\n\nFor reports made during live events, or in any situation where urgent action is needed:\n\n* Any two (or more) event organizers, event staff, CoC Committee members or CoC representatives can decide if immediate action is to be taken and what that action is. In exceptionally dangerous situations, this decision can be made by a single person.\n* These rapid decisions can be reconsidered during the event as more information becomes available.\n* The scope of any rapid decision is limited to the current event / situation.\n* The report, any related information, and any decisions and consequences will be reported to the full Code of Conduct Committee as soon as possible.\n\nThe full Code of Conduct Committee will then consider the report using the full timeline and processes defined below.  The Committee may decide to apply consequences in other spaces beyond the space where the behavior was reported.\n\nPotential *immediate* consequences for violating the conda Organization Code of Conduct at a live event include, but are not limited to:\n\n- Warning the person to cease their behavior and that any further reports will result in sanctions\n- Requiring that the person avoid any interaction with, and physical proximity to, the person they are harassing for the remainder of the event\n- Ending a talk that violates the policy early\n- Not publishing the video or slides of a talk that violated the policy\n- Not allowing a speaker who violated the policy to give (further) talks at the event now or in the future\n- Immediately ending any event volunteer responsibilities and privileges the reported person holds\n- Expelling the person from the event without a refund\n- Requiring that the person immediately leave the event and not return\n- Any other response that the CoC members, representatives, or event staff deem necessary and appropriate to the situation\n\n# Reporting Guidelines\n\nIf you believe someone is violating the code of conduct, please report this in a timely manner. Code of conduct violations reduce the value of the community for everyone. The conda Code of Conduct (CoC) Committee and the conda Organization take reports of misconduct very seriously and are committed to preserving and maintaining the welcoming nature of our community.\n\n> [!NOTE]\n> You are also encouraged to reach out to the conda Code of Conduct (CoC) Committee if you want clarification on something, if you notice some borderline behavior, or just have a concern. Send us a note at [conduct@conda.org](mailto:conduct@conda.org).\n\nAll complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances.  The conda CoC Committee commits to maintaining confidentiality with regard to the reporter of an incident.\n\nFor possibly unintentional breaches of the code of conduct, you may want to respond to the person and point out this code of conduct (either in public or in private, whatever is most appropriate). If you would prefer not to do that, please report the issue to the conda CoC Committee directly.\n\nTake care of each other. Alert someone if you notice a dangerous situation, someone in distress, or violations of this code of conduct, even if they seem inconsequential.\n\n## How to Submit a Report\n\nThe CoC Committee is committed to promptly addressing any reported issues. If you have experienced or witnessed behavior that violates the conda Organization Code of Conduct, please let us know.\n\nYou can report an incident\n\n* via the **[Incident Reporting Form](https://form.jotform.com/221527028480048)**\n* via email: [conduct@conda.org](mailto:conduct@conda.org)\n* contact [an individual committee member](#committee-membership) or [CoC event representative](#coc-representatives) to report an incident in confidence.\n\nReports submitted via the form or committee email address are sent to the [full conda Code of Conduct Committee](#committee-membership).\n\n## What to Include in a Report\n\nOur ability to address any code of conduct breaches in a timely and effective manner is impacted by the amount of information you can provide, so, we ask you to include as much of the following information as you can**:\n\n- **Your contact info** (so we can get in touch with you if we need to follow up). This will be kept confidential. You can also file a report [anonymously](#anonymous-reporting).\n- The **approximate time and location of the incident** (please be as specific as possible).\n- **Identifying information** (e.g. name, nickname, screen name, physical description) of the individual whose behavior is being reported.\n- **Description of the behavior** (if reporting harassing language, please be specific about the words used), **your account of what happened**, and any available **supporting records** (e.g. email, GitHub issue, screenshots, etc.).\n- **Description of the circumstances/context** surrounding the incident.\n- Let us know **if the incident is ongoing**, and/or if this is part of an ongoing pattern of behavior.\n- Names and contact info, if possible, of **anyone else who witnessed** or was involved in this incident. (Did anyone else observe the incident?)\n- **Any other relevant information** you believe we should have.\n\n## Anonymous Reporting\n\nThe reporting form supports anonymous incident reporting.  Anonymous reporting works best when the behavior happened in a public space and was witnessed by many.  If an incident is reported anonymously and was not witnessed by others, then the committee may be limited in what actions it can take and what it can report to the larger community.  Nevertheless, the CoC Committee is still interested in receiving these reports.  They are helpful when determining what we need to address as a community, and when looking for evidence of repeated behavior.\n\n## Conflicts of Interest\n\nCommittee members are expected to recuse themselves if they have a conflict of interest, and are required to recuse themselves if they are the accused or the target of the reported behavior. In addition, the CoC Committee can [vote](#voting-and-decision-making) to remove a committee member from a case, if the committee feels that the member has a conflict of interest.  This [vote](#voting-and-decision-making) requires a simple majority. <!-- codespell:ignore recuse -->\n\nIf you are concerned about making a report that will be read by all committee members, you are strongly encouraged to contact [individual committee members](#committee-membership) directly.\n\n# Enforcement: What Happens After a Report is Filed?\n\n## Acknowledgment and Responding to Immediate Needs\n\nCoC Committee members and/or event staff will attempt to ensure your safety and help with any immediate needs. The CoC Committee will make every effort to **acknowledge receipt within 24 hours** (and we'll aim for much more quickly than that).\n\n## Reviewing the Report\n\nThe CoC Committee will make all efforts to **review the incident within three days** and determine:\n\n- Whether this is an ongoing situation, or if there is a threat to anyone's physical safety\n- What happened\n- Whether this event constitutes a code of conduct violation\n- Who the bad actor was, if any\n\n## Contacting the Person Reported\n\nAfter the CoC Committee has had time to review and discuss the report, someone will attempt to contact the person who is the subject of the report to inform them of what has been reported about them. We will then ask that person for their account of what happened.\n\n## Response and Potential Consequences\n\nOnce the CoC Committee has completed our investigation of the report, we will make a decision as to how to respond. The person making a report will not normally be consulted as to the proposed resolution of the issue, except insofar as we need to understand how to help them feel safe.\n\nPotential consequences for violating the conda Organization code of conduct include:\n\n- Nothing (if we determine that no violation occurred)\n- Private feedback or reprimand from the CoC Committee to the individual(s) involved\n- Warning the person to cease their behavior and that any further reports will result in sanctions\n- A public announcement that an incident occurred\n- Mediation (only if both reporter and reportee agree)\n- An imposed vacation (e.g. asking someone to \"take a week off\" from a mailing list)\n- A permanent or temporary ban from some or all the conda Organization spaces (mailing lists, GitHub repos, in-person events, etc.)\n- Assistance to the complainant with a report to other bodies, for example, institutional offices or appropriate law enforcement agencies\n- Removing a person from the conda Organization membership or other formal affiliation\n- Publishing an account of the harassment and calling for the resignation of the alleged harasser from their responsibilities (may be called for if the person is an event leader, or refuses to stand aside from the conflict of interest, or similar)\n- Any other response that the CoC Committee deems necessary and appropriate to the situation\n\nNo one espousing views or values contrary to the standards of our code of conduct will be permitted to hold any position representing the conda Organization, including volunteer positions. The CoC Committee has the right and responsibility to remove, edit, or reject comments, commits, code, website edits, issues, and other contributions that are not aligned with this code of conduct.\n\nWe aim to **respond within one week** to the original reporter with either a resolution or an explanation of why the situation is not yet resolved.\n\nWe will contact the person who is the subject of the report to let them know what actions will be taken as a result of the report, if any.\n\nOur policy is to make sure that everyone aware of the initial incident is also made aware that official action has been taken, while still respecting the privacy of individuals. In addition, we will also usually [notify the community](#confidentiality-and-public-statements-to-the-community) that an incident has been reported, what type of incident it was, and what the response was, again respecting the privacy of individuals.\n\n## Appealing a Decision\n\nTo appeal a decision of the CoC Committee, contact the [Committee Co-Chairs](#committee-membership), with your appeal. Please include as much detail as possible about why you are appealing the decision. The Co-Chairs will review the appeal, possibly consulting with the full Committee, and then issue a decision.\n\n# Timeline Summary:\n\n| Time | Event | Details |\n| ---- | ---- | ---- |\n| Within 24 Hours | Acknowledge | The CoC Committee will make every effort to **acknowledge receipt of a report within 24 hours**. |\n| Within 3 Days | Review | The CoC Committee aims to **review the incident within three days**. |\n| Within 1 Week | Resolve | We will **respond within one week** to the original reporter with either a resolution or an explanation of why the situation is not yet resolved. |\n\n# Voting and Decision Making\n\nCommittee votes and decisions require both a minimum quorum size for the vote to be counted, and then a minimum percentage of cast affirmative votes to pass.\n\nExcept where otherwise noted, votes require a quorum and a simple majority to pass:\n\n* Minimum Quorum:\n  * More than 50% of eligible committee members must vote.\n    * Eligibile members do not include those excluded because of [conflicts of interest](#conflicts-of-interest).\n* Affirmative vote threshold:\n  * More than 50% of the votes cast need to be affirmative to take action.\n\n# Committee Membership\n\nYou can reach the entire CoC Committee by emailing [conduct@conda.org](mailto:conduct@conda.org).\n\n| Name | Employer / Funding | Steering Council Member | Current Term Ends |\n| ---- | ---- | ---- | --- |\n| [Eric Dill](https://github.com/ericdill) | [Anaconda](https://anaconda.com/) | | 2026-07-01 |\n| [Dasha Gurova](https://github.com/dashagurova) | [Anaconda](https://anaconda.com/) | | 2026-07-01 |\n| [Bianca Henderson](https://github.com/beeankha) | [Red Hat](https://redhat.com/) | | 2026-07-01 |\n| [Katherine Kinnaman](https://github.com/kathatherine) | [Anaconda](https://anadonda.com/) | | 2026-07-01 |\n| [Mahe Iram Khan](https://github.com/ForgottenProgramme) | [Anaconda](https://anaconda.com/) | | 2025-07-01 |\n| [Ken Odegard](https://github.com/kenodegard) | [Anaconda](https://anaconda.com/) | | 2025-07-01 |\n| [Crystal Soja](https://github.com/csoja), Co-Chair | [Anaconda](https://anaconda.com/) | | 2025-07-01 |\n| [Jaime Rodríguez-Guerra](https://github.com/jaimergp), Co-Chair | [Quansight](https://quansight.com/) | yes | 2025-07-01 |\n\n# Terms and New Members\n\n* Committee members are appointed for two year terms. Committee members can choose to renew their memberships.\n* Committee members can resign before their term ends.\n* Committee members can also be removed by a [simple majority vote](#voting-and-decision-making) from their fellow committee members.\n* New committee members are added by a simple majority vote as well.\n\n# Eligibility\n\nAnyone from the community who is interested and able to do CoC Committee work is eligible to be nominated for the committee.  New committee members can be nominated by any community member, including nominating themselves.\n\n## Shared Funding\n\nUnlike the Steering Council, we are not limiting the number of Committee members who share a common source of funding. However, if a report involves someone who shares funding with CoC Committee members, then the remainder of the committee may vote to exclude some or all Committee members with that same funding, even if that excludes a majority of the CoC Committee. This should be done only if the separately funded Committee members feel that the common funding is interfering with decision making.\n\nNote: This requires tracking the funding sources of CoC Committee members.\n\n## Overlap with Steering Council Membership\n\nCommittee members can also be on the conda Organization Steering Council.  However, Steering Council members have to make up less than 50% of the Code of Conduct Committee.\n\n# Updating this Code of Conduct\n\nThe conda Organization's Code of Conduct can be updated by a [simple majority vote](#voting-and-decision-making) of the CoC Committee.\n\n\n# License\n\nThis code of conduct is based on the [NumFOCUS code of conduct template](https://github.com/numfocus/numfocus/blob/8759e21481552f213489e3718979ccecf68e9ead/manual/numfocus-coc.md) as it existed on 2022/03/08 (which is the 2019/11/20 version).  Several added sections are based on the [Galaxy Community Code of Conduct](https://galaxyproject.org/community/coc/).\n\nThe NumFOCUS code of conduct template was itself adapted from numerous sources, including the [*Geek Feminism wiki, created by the Ada Initiative and other volunteers, which is under a Creative Commons Zero license*](http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy), the [*Contributor Covenant version 1.2.0*](http://contributor-covenant.org/version/1/2/0/), the [*Bokeh Code of Conduct*](https://github.com/bokeh/bokeh/blob/master/CODE_OF_CONDUCT.md), the [*SciPy Code of Conduct*](https://github.com/jupyter/governance/blob/master/conduct/enforcement.md), the [*Carpentries Code of Conduct*](https://docs.carpentries.org/topic_folders/policies/code-of-conduct.html#enforcement-manual), and the [*NeurIPS Code of Conduct*](https://neurips.cc/public/CodeOfConduct).\n\n**The conda Organization Code of Conduct is licensed under the [Creative Commons Attribution 3.0 Unported License](https://creativecommons.org/licenses/by/3.0/).**\n"
  },
  {
    "path": "HOW_WE_USE_GITHUB.md",
    "content": "<!-- edit this in https://github.com/conda/infrastructure -->\n# How We Use GitHub\n\n<!-- absolute URLs -->\n[conda-org]: https://github.com/conda\n\n[project-refinement]: https://github.com/orgs/conda/projects/22/views/14\n[project-backlog]: https://github.com/orgs/conda/projects/22/views/2\n[project-current-sprint]: https://github.com/orgs/conda/projects/22/views/10\n[project-review]: https://github.com/orgs/conda/projects/16\n\n[docs-toc]: https://github.blog/changelog/2021-04-13-table-of-contents-support-in-markdown-files/\n[docs-saved-reply]: https://docs.github.com/en/get-started/writing-on-github/working-with-saved-replies/creating-a-saved-reply\n\n[infrastructure]: https://github.com/conda/infrastructure\n[workflow-sync]: https://github.com/conda/infrastructure/blob/main/.github/workflows/sync.yml\n[labels-global]: https://github.com/conda/infrastructure/blob/main/.github/global.yml\n\n<!-- relative URLs -->\n[workflow-cla]: https://github.com/conda/conda-libmamba-solver/blob/main/.github/workflows/cla.yml\n[workflow-issues]: https://github.com/conda/conda-libmamba-solver/blob/main/.github/workflows/issues.yml\n[workflow-labels]: https://github.com/conda/conda-libmamba-solver/blob/main/.github/workflows/labels.yml\n[workflow-lock]: https://github.com/conda/conda-libmamba-solver/blob/main/.github/workflows/lock.yml\n[workflow-project]: https://github.com/conda/conda-libmamba-solver/blob/main/.github/workflows/project.yml\n[workflow-stale]: https://github.com/conda/conda-libmamba-solver/blob/main/.github/workflows/stale.yml\n[labels-local]: https://github.com/conda/conda-libmamba-solver/blob/main/.github/labels.yml\n[labels-page]: https://github.com/conda/conda-libmamba-solver/labels\n\nThis document seeks to outline how we as a community use GitHub Issues to track bugs and feature requests while still catering to development practices & project management (_e.g._, release cycles, feature planning, priority sorting, etc.).\n\n<!-- only include high-level topics or particularly noteworthy sections here -->\n**Topics:**\n\n- [What is \"Issue Sorting\"?](#what-is-issue-sorting)\n- [Labeling](#labeling)\n- [Types of Issues](#types-of-issues)\n  - [Standard Issue](#standard-issue)\n  - [Epics](#epics)\n  - [Spikes](#spikes)\n- [Working on Issues](#working-on-issues)\n- [Development Processes](#development-processes)\n- [Code Review and Merging](#code-review-and-merging)\n\n> [!NOTE]\n> This document is written in the style of an FAQ. For easier navigation, use [GitHub's table of contents feature][docs-toc].\n\n## What is \"Issue Sorting\"?\n\n> [!NOTE]\n> \"Issue sorting\" is similar to that of \"triaging\", but we've chosen to use different terminology because \"triaging\" is a word related to very weighty topics (_e.g._, injuries and war) and we would like to be sensitive to those connotations. Additionally, we are taking a more \"fuzzy\" approach to sorting (_e.g._, severities may not be assigned, etc.).\n\n\"Issue Sorting\" refers to the process of assessing the priority of incoming issues. Below is a high-level diagram of the flow of issues:\n\n```mermaid\nflowchart LR\n    subgraph flow_sorting [Issue Sorting in Issue Tracker]\n        state_sorting{{Maintainer sorting}}\n    end\n\n    subgraph flow_roadmap [Roadmap Board]\n        board_refinement{{Refinement}}\n        board_backlog{{Backlog}}\n\n        board_refinement-->board_backlog\n        board_backlog-- reprioritize -->board_backlog\n        board_progress{{Current Sprint - In Progress}}\n    end\n\n    state_new(New Issues)\n    state_closed(Closed)\n\n    state_new-->state_sorting\n    state_sorting-- accepted for work -->board_refinement\n    state_sorting-- duplicate, off-topic, support resolved -->state_closed\n    board_backlog-- pending work -->board_progress\n    board_refinement-- not actionable -->state_closed\n    board_backlog-- resolved, irrelevant -->state_closed\n    board_progress-- resolved -->state_closed\n```\n\n### Why sort issues?\n\nAt the most basic \"bird's eye view\" level, sorted issues will fall into the category of four main priority levels:\n\n- Do now\n- Do sometime\n- Provide user support\n- Never do (_i.e._, close)\n\nAt its core, sorting enables new issues to be placed into these four categories, which helps to ensure that they will be processed at a velocity similar to or exceeding the rate at which new issues are coming in. One of the benefits of actively sorting issues is to avoid engineer burnout and to make necessary work sustainable; this is done by eliminating a never-ending backlog that has not been reviewed by any maintainers.\n\nThere will always be broad-scope design and architecture implementations that the maintainers will be interested in pursuing; by actively organizing issues, they will be able to more easily track and tackle both specific and big-picture goals.\n\n### Who does the sorting?\n\nCore maintainers help with sorting issues, making decisions regarding closing issues and setting feature work priorities, among other sorting-related tasks.\n\n### How does issue sorting and board intake work?\n\nNew issues that are opened in any of the repositories in the [conda GitHub organization][conda-org] are reviewed in the repository issue tracker first. During sorting in the issue tracker, issues are reviewed for the following outcomes:\n\n- Mitigation via short-term workarounds and fixes\n- Redirection to the correct project\n- Determining if support can be provided for errors and questions\n- Closing out of any duplicate/off-topic issues\n\nThe core maintainers are not seeking to _resolve_ issues that arise. Instead, the goal is to understand the issue and to determine whether it is legitimate, and then to collect as much relevant information as possible so that the maintainers can make an informed decision about the appropriate resolution schedule.\n\nIssues can remain in this investigatory phase (_e.g._, querying the user for more details, asking the user to attempt other workarounds, other debugging efforts, etc.) and are likely to remain in this state the longest, but should still be progressing over the course of 1-2 weeks.\n\nItems are added to the [Refinement tab of the Roadmap Board][project-refinement] once sorting has concluded and the core maintainer has enough information to make a decision about the appropriate resolution schedule for the issue. Newly opened pull requests are automatically added to the [Review board][project-review] by [`.github/workflows/project.yml`][workflow-project].\n\nIssues that are not accepted for planned work are closed instead (_e.g._ duplicates, redirects, user errors, resolved support questions, etc.).\n\n### Where do work issues go after being sorted?\n\nOnce issues are accepted for work, they are added to the [\"Refinement\" tab of the Roadmap Board][project-refinement]. After refinement and prioritization, issues move to [\"Backlog\"][project-backlog] and then to [\"Current Sprint\"][project-current-sprint] when actively being worked. Issues are closed once the work is complete.\n\n### What is the purpose of having a \"Backlog\"?\n\nIssues are \"backlogged\" when they have been accepted and refined but are not yet planned into the current sprint.\n\n### What automation procedures are currently in place?\n\nGlobal automation procedures synced out from the [`conda/infrastructure`][infrastructure] repo include:\n\n- [Marking/Closing stale issues and pull requests][workflow-stale]:\n  - https://github.com/conda/conda-libmamba-solver/labels/type%3A%3Asupport issues are labeled as stale after 21 days of inactivity and are closed after 7 more days of inactivity (that is, closed after 30 inactive days total)\n  - non https://github.com/conda/conda-libmamba-solver/labels/type%3A%3Asupport issues are labeled as stale after 365 days of inactivity and are closed after 30 more days of inactivity (that is, closed after an approximate total of 1 year and 1 month of inactivity)\n  - all pull requests are labeled as stale after 365 days of inactivity and are closed after 30 more days of inactivity (that is, closed after an approximate total of 1 year and 1 month of inactivity)\n- [Locking of closed issues and pull requests with no further activity][workflow-lock] after 365 days\n- [Adding new pull requests to the Review board][workflow-project]\n- [Indicating an issue is ready for a maintainer's attention][workflow-issues] by toggling https://github.com/conda/conda-libmamba-solver/labels/pending%3A%3Afeedback with https://github.com/conda/conda-libmamba-solver/labels/pending%3A%3Asupport after a contributor leaves a comment\n- [Verifying that contributors have signed the CLA][workflow-cla] before allowing pull requests to be merged; if the contributor hasn't signed the CLA previously, merging is blocked until a manual review can be done\n- [Syncing out templates, labels, workflows, and documentation][workflow-sync] from [`conda/infrastructure`][infrastructure] to the other repositories\n\n### Are there any templates to use as responses for commonly-seen issues?\n\nSome of the same types of issues appear regularly (_e.g._, issues that are duplicates of others, issues that should be filed in the Anaconda issue tracker, errors that are due to a user's specific setup/environment, etc.).\n\nBelow are some boilerplate responses for the most commonly-seen issues to be sorted:\n\n<details>\n<summary><b>Duplicate Issue</b></summary>\n\n<!-- this is a code block, any links need to be embedded -->\n<pre>\n\nThis is a duplicate of <b>[link to primary issue]</b>; please feel free to continue the discussion there.\n</pre>\n\n<!-- nested admonitions do not render -->\n<!-- see https://github.com/orgs/community/discussions/16925#discussioncomment-9542248 -->\n> **Warning**\n> Apply the https://github.com/conda/conda-libmamba-solver/labels/duplicate label to the issue being closed and https://github.com/conda/conda-libmamba-solver/labels/duplicate%3A%3Aprimary to the original issue.\n\n</details>\n\n<details>\n<summary><b>Anaconda Products</b></summary>\n\n<!-- this is a code block, any links need to be embedded -->\n<pre>\nThank you for filing this issue! Unfortunately, this is off-topic for this repo because it is related to an Anaconda product.\nIf you are encountering issues with Anaconda products or services, you have several options for receiving community\nsupport:\n\n- [Anaconda community forums](https://community.anaconda.cloud)\n- [Anaconda issue tracker on GitHub](https://github.com/ContinuumIO/anaconda-issues/issues)\n</pre>\n\n<!-- nested admonitions do not render -->\n<!-- see https://github.com/orgs/community/discussions/16925#discussioncomment-9542248 -->\n> **Warning**\n> Apply the https://github.com/conda/conda-libmamba-solver/labels/off-topic  label to these issues before closing them out.\n\n</details>\n\n<details>\n<summary><b>General Off Topic</b></summary>\n\n<pre>\nUnfortunately, this issue is outside the scope of support we offer via GitHub or is not directly related to this project.\nCommunity support can be found elsewhere, though, and we encourage you to explore the following options:\n\n- [Conda discourse forum](https://conda.discourse.group/)\n- [Community chat channels](https://conda.org/community#chat)\n- [Stack Overflow posts tagged \"conda\"](https://stackoverflow.com/questions/tagged/conda)\n</pre>\n\n<!-- nested admonitions do not render -->\n<!-- see https://github.com/orgs/community/discussions/16925#discussioncomment-9542248 -->\n> **Warning**\n> Apply the https://github.com/conda/conda-libmamba-solver/labels/off-topic label to these issues before closing them out.\n\n</details>\n\nIn order to not have to manually type or copy/paste the above repeatedly, note that it's possible to add text for the most commonly-used responses via [GitHub's \"Add Saved Reply\" option][docs-saved-reply].\n\n## Labeling\n\nThis section covers the labels and conventions used during issue sorting.\n\n### How does labeling work?\n\nLabeling is a very important means for core maintainers to keep track of the current state of an issue with regards to the asynchronous nature of communicating with users. Utilizing the proper labels helps to identify the severity of the issue as well as to quickly understand the current state of a discussion.\n\nEach label has an associated description that clarifies how the label should be used. Hover on the label to see its description. Label colors are used to distinguish labels by category.\n\nGenerally speaking, labels with the same category are considered mutually exclusive, but in some cases labels sharing the same category can occur concurrently, as they indicate qualifiers as opposed to types. For example, we may have the following types, https://github.com/conda/conda-libmamba-solver/labels/type%3A%3Abug, https://github.com/conda/conda-libmamba-solver/labels/type%3A%3Afeature, and https://github.com/conda/conda-libmamba-solver/labels/type%3A%3Adocumentation, where for any one issue there would be _at most_ **one** of these to be defined (_i.e._ an issue should not be a bug _and_ a feature request at the same time). Alternatively, with issues involving specific operating systems (_i.e._, https://github.com/conda/conda-libmamba-solver/labels/os%3A%3Alinux, https://github.com/conda/conda-libmamba-solver/labels/os%3A%3Amacos, and https://github.com/conda/conda-libmamba-solver/labels/os%3A%3Awindows), an issue could be labeled with one or more, depending on the system(s) the issue occurs on.\n\nPlease note that there are also automation policies in place that are affected by labeling. For example, if an issue is labeled as https://github.com/conda/conda-libmamba-solver/labels/type%3A%3Asupport, that issue will be marked https://github.com/conda/conda-libmamba-solver/labels/stale after 21 days of inactivity and auto-closed after seven more days without activity (30 inactive days total), which is earlier than issues without this label. See [What automation procedures are currently in place?](#what-automation-procedures-are-currently-in-place) for more details.\n\n### What labels are required for each issue?\n\nAt minimum, both `type` and `source` labels should be specified on each issue before adding it to the \"Refinement\" tab of the Roadmap Board. All issues that are bugs should also be tagged with a `severity` label.\n\nThe `type` labels are exclusive of each other: each sorted issue should have exactly one `type` label. These labels give high-level information on the issue's classification (_e.g._, bug, feature, tech debt, etc.)\n\nThe `source` labels are exclusive of each other: each sorted issue should have exactly one `source` label. These labels give information on the sub-group to which the issue's author belongs (_e.g._, a partner, a frequent contributor, the wider community, etc.). Through these labels, maintainers gain insight into how well we're meeting the needs of various groups.\n\nThe `severity` labels are exclusive of each other and, while required for the https://github.com/conda/conda-libmamba-solver/labels/type%3A%3Abug label, they can also be applied to other types to indicate demand or need. These labels help us to prioritize our work. Severity is not the only factor for work prioritization, but it is an important consideration.\n\nPlease review the descriptions of the `type`, `source`, and `severity` labels on the [labels page][labels-page] prior to use.\n\n### How are new labels defined?\n\nLabels are defined using a scoped syntax with an optional high-level category (_e.g._, `source`, `tag`, `type`, etc.) and a specific topic, much like the following:\n\n- `[topic]`\n- `[category::topic]`\n- `[category::topic-phrase]`\n\nThis syntax helps with issue sorting enforcement, as it helps to ensure that sorted issues are, at minimum, categorized by type and source.\n\nThere are a number of labels that have been defined for the different repositories. In order to create a streamlined sorting process, label terminologies are standardized using similar (if not the same) labels.\n\n### How are new labels added?\n\nNew **global** labels (_i.e._, labels that apply equally to all repositories within the conda GitHub organization) are added to [`conda/infrastructure`][infrastructure]'s [`.github/global.yml` file][labels-global]; new **local** labels (_i.e._, labels specific to particular repositories) are added to each repository's [`.github/labels.yml` file][labels-local]. All new labels should follow the labeling syntax described in [\"How are new labels defined?\"](#how-are-new-labels-defined). Global labels are combined with any local labels and these aggregated labels are used by the [`.github/workflows/labels.yml` workflow][workflow-labels] to synchronize the labels available for the repository.\n\n## Types of Issues\n\n### Standard Issue\n\nStandard issues represent typical bug reports, feature requests, or other work items that have a clear definition and expected outcome.\n\n### Epics\n\nEpics are large work items that can be broken down into smaller, more manageable issues. They typically represent major features or significant changes that span multiple iterations or releases. Relate the smaller issues to the epic using the sub-issues feature in GitHub.\n\n### Spikes\n\n#### What is a spike?\n\n\"Spike\" is a term that is borrowed from extreme programming and agile development. They are used when the **outcome of an issue is unknown or even optional**. For example, when first coming across a problem that has not been solved before, a project may choose to either research the problem or create a prototype in order to better understand it.\n\nAdditionally, spikes represent work that **may or may not actually be completed or implemented**. An example of this are prototypes created to explore possible solutions. Not all prototypes are implemented and the purpose of creating a prototype is often to explore the problem space more. For research-oriented tasks, the end result of this research may be that a feature request simply is not viable at the moment and would result in putting a stop to that work.\n\nFinally, spikes are usually **timeboxed**. However, given the open source/volunteer nature of our contributions, we do not enforce this for our contributors. When a timebox is set, this means that we are limiting how long we want someone to work on said spike. We do this to prevent contributors from falling into a rabbit hole they may never return from. Instead, we set a time limit to perform work on the spike and then have the assignee report back. If the tasks defined in the spike have not yet been completed, a decision is made on whether it makes sense to perform further work on the spike.\n\n#### When do I create a spike?\n\nA spike should be created when we do not have enough information to move forward with solving a problem. That simply means that, whenever we are dealing with unknowns or processes the project team has never encountered before, it may be useful for us to create a spike.\n\nIn day-to-day work, this kind of situation may appear when new bug reports or feature requests come in that deal with problems or technologies that the project team is unfamiliar with. All issues that the project team has sufficient knowledge of should instead proceed as regular issues.\n\n#### When do I not create a spike?\n\nBelow are some common scenarios where creating a spike is not appropriate:\n\n- Writing a technical specification for a feature we know how to implement\n- Design work that would go into drafting how an API is going to look and function\n- Any work that must be completed or is not optional\n\n## Working on Issues\n\n### How do I assign myself to an issue I am actively reviewing?\n\nIf you do **not** have permissions, please indicate that you are working on an issue by leaving a comment. Someone who has permissions will assign you to the issue. If two weeks have passed without a pull request or an additional comment requesting information, you may be removed from the issue and the issue reassigned.\n\nIf you are assigned to an issue but will not be able to continue work on it, please comment to indicate that you will no longer be working on it and press `unassign me` next to your username in the `Assignees` section of the issue page (top right).\n\nIf you **do** have permissions, please assign yourself to the issue by pressing `assign myself` under the `Assignees` section of the issue page (top right).\n\n## Development Processes\n\nThe following are practices the conda organization encourages for feature\ndevelopment. While we recommend projects under the conda organization adopt\nthese practices, they are not strictly required.\n\n### How should we approach feature development?\n\nFor new features, first open an issue if one doesn’t exist. Once the feature request\nhas been accepted (indicated by the issue's status transitioning from \"Sorting\" to\n\"Refinement\"), create a specification to gather early feedback. This can include\nmockups, API/command references, a written plan in the issue, and sample CLI\narguments (without functionality).\n\n### What is our change process?\n\nFor larger features, break down the work into smaller, manageable issues\nthat are added to the backlog. As long as a feature remains on the roadmap\nor backlog, do not create long-lived feature branches that span multiple\npull requests. Instead, you should integrate small slices of an overall\nfeature directly into the main branch to avoid complex integration challenges.\n\n### Should we make unrelated changes at the same time?\n\nWhen making changes, try to follow the Campsite Rule to leave things better\nthan when you found them. You should enhance the code you encounter, even if\nprimary goal is unrelated. This could involve refactoring small sections,\nimproving readability, or fixing minor bugs.\n\n## Code Review and Merging\n\n### What are the review requirements?\n\n#### Standard Review\n\nMost code changes require one reviewer from someone on the maintainer team for\nthe repository. Instead of waiting for someone on the team to review it,\ndirectly requesting a review from the person you previously identified to work\nwith is preferred to optimize teamwork. If you paired with them during\ndevelopment, continuous review counts as this requirement.\n\n#### Second Review\n\nRequired only when the code author or the first reviewer feels like it is\nnecessary to get another set of eyes on a proposed change. In this case, they\nadd someone specific through GitHub's Request Review feature with a comment on\nwhat they want the person to look for.\n\n### What are the code review best practices?\n\nIf you are conducting a review, adhere to these best practices:\n\n- Provide comprehensive feedback in the first review to minimize review rounds\n- Reserve Request Changes for blocking issues (bugs or other major problems) —\n  Select Comment for suggestions and improvements\n- Follow-up reviews should focus on whether requested changes resolve original\n  comments\n- Code should be production-ready and maintainable when merged, but doesn't\n  need to be perfect\n- If providing feedback outside the core review focus (nitpicks, tips,\n  suggestions), clearly mark these as non-blocking comments that don't need to\n  be addressed before merging.\n\n### How do we merge code?\n\nIf you are the approving reviewer (typically the first reviewer, or the second\nreviewer when needed) and you have completed your review and approved the\nchanges, you should merge the code immediately to maintain development\nvelocity.\n\nNormally, we use squash and merge to keep a clean git history. If you are\nmerging a pull request, help ensure that the pull request title is updated.\n"
  },
  {
    "path": "LICENSE",
    "content": "BSD 3-Clause License\n\nCopyright (c) 2022, Anaconda, Inc.\nCopyright (c) 2023, conda\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of the copyright holder nor the names of its\n      contributors may be used to endorse or promote products\n      derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---\n\nThis work also includes code borrowed from mamba.utils v0.19, licensed as BSD 3-Clause\n"
  },
  {
    "path": "README.md",
    "content": "# conda-libmamba-solver\n\nThe fast mamba solver, now in conda!\n\n## What is this exactly?\n\nconda-libmamba-solver is a new solver for the\n[conda package manager](https://docs.conda.io/) which uses the solver from the\n[mamba project](https://mamba.readthedocs.io/) behind the scenes, while\ncarefully implementing conda's functionality and expected behaviors on top.\nThe library used by mamba to do the heavy-lifting is called [libsolv](https://github.com/openSUSE/libsolv).\n\nAdditional information about the project can be found in the blog post on Anaconda's weblog:\n[A Faster Solver for Conda: Libmamba](https://www.anaconda.com/blog/a-faster-conda-for-a-growing-community).\n\n## Documentation\n\nCheck the [documentation](https://conda.github.io/conda-libmamba-solver/) for\ninstructions on how to install, use and make the most out the new conda solver!\n\n\n## Build status\n\n| [![Build status](https://github.com/conda/conda-libmamba-solver/actions/workflows/tests.yml/badge.svg)](https://github.com/conda/conda-libmamba-solver/actions/workflows/tests.yml?query=branch%3Amain) [![Docs status](https://github.com/conda/conda-libmamba-solver/actions/workflows/docs.yml/badge.svg)](https://github.com/conda/conda-libmamba-solver/actions/workflows/docs.yml?query=branch%3Amain) [![codecov](https://codecov.io/gh/conda/conda-libmamba-solver/branch/main/graph/badge.svg)](https://codecov.io/gh/conda/conda-libmamba-solver) [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/conda/conda-libmamba-solver/main.svg)](https://results.pre-commit.ci/latest/github/conda/conda-libmamba-solver/main) [![CalVer version used YY.MM.MICRO](https://img.shields.io/badge/calver-YY.MM.MICRO-22bfda.svg?style=flat-square)](https://calver.org) | [![Anaconda-Server Badge](https://anaconda.org/conda-canary/conda-libmamba-solver/badges/latest_release_date.svg)](https://anaconda.org/conda-canary/conda-libmamba-solver) |\n| --- | :-: |\n| [`conda install defaults::conda-libmamba-solver`](https://anaconda.org/anaconda/conda-libmamba-solver) | [![Anaconda-Server Badge](https://anaconda.org/anaconda/conda-libmamba-solver/badges/version.svg)](https://anaconda.org/anaconda/conda-libmamba-solver) |\n| [`conda install conda-forge::conda-libmamba-solver`](https://anaconda.org/conda-forge/conda-libmamba-solver) | [![Anaconda-Server Badge](https://anaconda.org/conda-forge/conda-libmamba-solver/badges/version.svg)](https://anaconda.org/conda-forge/conda-libmamba-solver) |\n| [`conda install conda-canary/label/dev::conda-libmamba-solver`](https://anaconda.org/conda-canary/conda-libmamba-solver) | [![Anaconda-Server Badge](https://anaconda.org/conda-canary/conda-libmamba-solver/badges/version.svg)](https://anaconda.org/conda-canary/conda-libmamba-solver) |\n"
  },
  {
    "path": "RELEASE.md",
    "content": "<!-- edit this in https://github.com/conda/infrastructure -->\n\n[epic template]: https://github.com/conda/conda-libmamba-solver/issues/new?assignees=&labels=epic&template=epic.yml\n[compare]: https://github.com/conda/conda-libmamba-solver/compare\n[new release]: https://github.com/conda/conda-libmamba-solver/releases/new\n[infrastructure]: https://github.com/conda/infrastructure\n[rever docs]: https://regro.github.io/rever-docs\n[release docs]: https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes\n[merge conflicts]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/addressing-merge-conflicts/about-merge-conflicts\n[Anaconda Recipes]: https://github.com/AnacondaRecipes/conda-libmamba-solver-feedstock\n[conda-forge]: https://github.com/conda-forge/conda-libmamba-solver-feedstock\n\n# Release Process\n\n> [!NOTE]\n> Throughout this document are references to the version number as `YY.MM.MICRO`, this should be replaced with the correct version number. Do **not** prefix the version with a lowercase `v`.\n\n## 1. Open the release issue and cut a release branch. (do this ~1 week prior to release)\n\n> [!NOTE]\n> The new release branch should adhere to the naming convention of `YY.MM.x` (note the difference to `YY.MM.MICRO`). In the case of patch/hotfix releases, however, do NOT cut a new release branch; instead, use the previously-cut `YY.MM.x` release branch.\n\nUse the issue template below to create the release issue. After creating the release issue, pin it for easy access.\n\n<details>\n<summary><h3>Release Template</h3></summary>\n\n#### Title:\n```markdown\nRelease `YY.MM.x`\n```\n\n#### Body:\n```markdown\n### Summary\n\nPlaceholder for `conda-libmamba-solver YY.MM.x` release.\n\n| Pilot | <pilot> |\n|---|---|\n| Co-pilot | <copilot> |\n\n### Tasks\n\n[milestone]: https://github.com/conda/conda-libmamba-solver/milestone/<milestone>\n[process]: https://github.com/conda/conda-libmamba-solver/blob/main/RELEASE.md\n[releases]: https://github.com/conda/conda-libmamba-solver/releases\n[main]: https://github.com/AnacondaRecipes/conda-libmamba-solver-feedstock\n[conda-forge]: https://github.com/conda-forge/conda-libmamba-solver-feedstock\n[ReadTheDocs]: https://readthedocs.com/projects/continuumio-conda-libmamba-solver/\n[zulip]: https://conda.zulipchat.com/#narrow/channel/480811-releases\n\n<details open>  <!-- feel free to remove the open attribute once this section is completed -->\n<summary><h4>The week before release week</h4></summary>\n\n- [ ] Create release branch (named `YY.MM.x`)\n- [ ] Ensure release candidates are being successfully built (see `conda-canary/label/rc-conda-libmamba-solver-YY.MM.x`)\n- [ ] [Complete outstanding PRs][milestone]\n- [ ] Check for deprecated features\n- [ ] Test release candidates\n    <!-- indicate here who has signed off on testing -->\n\n</details>\n\n<details open>  <!-- feel free to remove the open attribute once this section is completed -->\n<summary><h4>Release week</h4></summary>\n\n- [ ] Create release PR (see [release process][process])\n- [ ] Create Zulip thread on [#releases][zulip]\n    - [ ] Announce `YY.MM.MICRO` in-progress\n- [ ] [Publish release][releases]\n- [ ] Merge `YY.MM.x` back into `main`\n- [ ] Activate the `YY.MM.x` branch on [ReadTheDocs][ReadTheDocs]\n- [ ] Bump/update feedstocks\n    - [ ] [Anaconda, Inc.'s feedstock][main]\n    - [ ] [conda-forge feedstock][conda-forge]\n- [ ] Hand off to packaging team(s)\n- [ ] Announce release\n    - [ ] Create & publish conda.org blog post\n    - [ ] Post on Zulip thread\n\n</details>\n```\n</details>\n\nIf a patch release is necessary, reopen the original release issue and append the following template to the release issue summary.\n\n<details>\n<summary><h3>Patch Release Template</h3></summary>\n\n#### Append to existing 'Release `YY.MM.x`' issue:\n```markdown\n<details open>  <!-- feel free to remove the open attribute once this section is completed -->\n<summary><h4>Patch YY.MM.MICRO</h4></summary>\n\n- [ ] <!-- list issues & PRs that need to be resolved here -->\n- [ ] Create release PR (see [release process][process])\n- [ ] Update Zulip thread on [#releases][zulip]\n    - [ ] Announce `YY.MM.MICRO` in-progress\n- [ ] [Publish release][releases]\n- [ ] Merge `YY.MM.x` back into `main`\n- [ ] Bump/update feedstocks\n    - [ ] [Anaconda, Inc.'s feedstock][main]\n    - [ ] [conda-forge feedstock][conda-forge]\n- [ ] Hand off to packaging team(s)\n- [ ] Announce release\n    - [ ] Post on Zulip thread\n\n</details>\n```\n\n</details>\n\n> [!NOTE]\n> The [epic template][epic template] is perfect for this; remember to remove the **`epic`** label.\n\n> [!NOTE]\n> A patch release is like a regular, i.e., follow the same steps in the process as you would for a regular release. Most patches are authored by existing contributors (most likely maintainers themselves) so running `rever <VERSION>` may succeed on the first pass.\n\n## 2. Alert various parties of the upcoming release. (do this ~1 week prior to release)\n\nLet various interested parties know about the upcoming release; at minimum, conda-forge maintainers should be informed. For major features, a blog post describing the new features should be prepared and posted once the release is completed (see the announcements section of the release issue).\n\n## 3. Manually test canary build(s).\n\n### Canary Builds for Manual Testing\n\nOnce the release PRs are filed, successful canary builds will be available on `https://anaconda.org/conda-canary/conda-libmamba-solver/files?channel=rc-conda-libmamba-solver-YY.MM.x` for manual testing.\n\n> [!NOTE]\n> You do not need to apply the `build::review` label for release PRs; every commit to the release branch builds and uploads canary builds to the respective `rc-` label.\n\n## 4. Ensure `rever.xsh` and `news/TEMPLATE` are up to date.\n\nThese are synced from [`conda/infrastructure`][infrastructure].\n\n<details>\n<summary><h2>5. Run rever. (ideally done on the Monday of release week)</h2></summary>\n\nCurrently, there are only 2 activities we use rever for, (1) aggregating the authors and (2) updating the changelog. Aggregating the authors can be an error-prone process and also suffers from a builtin circular dependency (_i.e._, to generate an updated `.authors.yml` we need an updated `.mailmap` but to have an updated `.mailmap` we need an updated `.authors.yml`). This is why the following steps are very heavy-handed (and potentially repetitive) in running rever commands, undoing commits, squashing/reordering commits, etc.\n\n1. Install [`rever`][rever docs] and activate the environment:\n\n    ```bash\n    $ conda create -n rever conda-forge::rever\n    $ conda activate rever\n    (rever) $\n    ```\n\n2. Clone and `cd` into the repository if you haven't done so already:\n\n    ```bash\n    (rever) $ git clone git@github.com:/conda-libmamba-solver.git\n    (rever) $ cd conda-libmamba-solver\n    ```\n\n2. Fetch the latest changes from the remote and checkout the release branch created a week ago:\n\n    ```bash\n    (rever) $ git fetch upstream\n    (rever) $ git checkout YY.MM.x\n    ```\n\n2. Create a versioned branch, this is where rever will make its changes:\n\n    ```bash\n    (rever) $ git checkout -b changelog-YY.MM.MICRO\n    ```\n\n2. Run `rever --activities authors <VERSION>`:\n\n    > **Note:** <!-- GH doesn't support nested admonitions, see https://github.com/orgs/community/discussions/16925 -->\n    > Include `--force` when re-running any rever commands for the same `<VERSION>`, otherwise, rever will skip the activity and no changes will be made (i.e., rever remembers if an activity has been run for a given version).\n\n    ```bash\n    (rever) $ rever --activities authors --force <VERSION>\n    ```\n\n    - If rever finds that any of the authors are not correctly represented in `.authors.yml` it will produce an error. If the author that the error pertains to is:\n        - **a new contributor**: the snippet suggested by rever should be added to the `.authors.yml` file.\n        - **an existing contributor**, a result of using a new name/email combo: find the existing author in `.authors.yml` and add the new name/email combo to that author's `aliases` and `alterative_emails`.\n\n    - Once you have successfully run `rever --activities authors` with no errors, review the commit made by rever. This commit will contain updates to one or more of the author files (`.authors.yml`, `.mailmap`, and `AUTHORS.md`). Due to the race condition between `.authors.yml` and `.mailmap`, we want to extract changes made to any of the following keys in `.authors.yml` and commit them separately from the other changes in the rever commit:\n        -  `name`\n        -  `email`\n        -  `github`\n        -  `aliases`\n        -  `alternate_emails`\n\n      Other keys (e.g., `num_commits` and `first_commit`) do not need to be included in this separate commit as they will be overwritten by rever.\n\n    - Here's a sample run where we undo the commit made by rever in order to commit the changes to `.authors.yml` separately:\n\n        ```bash\n        (rever) $ rever --activities authors --force YY.MM.MICRO\n\n        # changes were made to .authors.yml as per the prior bullet\n        (rever) $ git diff --name-only HEAD HEAD~1\n        .authors.yml\n        .mailmap\n        AUTHORS.md\n\n        # undo commit\n        (rever) $ git reset --soft HEAD~1\n\n        # undo changes made to everything except .authors.yml\n        (rever) $ git restore --staged --worktree .mailmap AUTHORS.md\n        ```\n\n    - Commit these changes to `.authors.yml`:\n\n        ```bash\n        (rever) $ git add .\n        (rever) $ git commit -m \"Update .authors.yml\"\n        ```\n\n    - Rerun `rever --activities authors --force <VERSION>` and finally check that your `.mailmap` is correct by running:\n\n        ```bash\n        git shortlog -se\n        ```\n\n      Compare this list with `AUTHORS.md`. If they have any discrepancies, additional modifications to `.authors.yml` is needed, so repeat the above steps as needed.\n\n    - Once you are pleased with how the author's file looks, we want to undo the rever commit and commit the `.mailmap` changes separately:\n\n        ```bash\n        # undo commit (but preserve changes)\n        (rever) $ git reset --soft HEAD~1\n\n        # undo changes made to everything except .mailmap\n        (rever) $ git restore --staged --worktree .authors.yml AUTHORS.md\n        ```\n\n    - Commit these changes to `.mailmap`:\n\n        ```bash\n        (rever) $ git add .\n        (rever) $ git commit -m \"Update .mailmap\"\n        ```\n\n    - Continue repeating the above processes until the `.authors.yml` and `.mailmap` are corrected to your liking. After completing this, you will have at most two commits on your release branch:\n\n        ```bash\n        (rever) $ git cherry -v <release branch>\n        + 86957814cf235879498ed7806029b8ff5f400034 Update .authors.yml\n        + 3ec7491f2f58494a62f1491987d66f499f8113ad Update .mailmap\n        ```\n\n\n4. Review news snippets (ensure they are all using the correct Markdown format, **not** reStructuredText) and add additional snippets for undocumented PRs/changes as necessary.\n\n    > **Note:** <!-- GH doesn't support nested admonitions, see https://github.com/orgs/community/discussions/16925 -->\n    > We've found it useful to name news snippets with the following format: `<PR #>-<DESCRIPTIVE SLUG>`.\n    >\n    > We've also found that we like to include the PR #s inline with the text itself, e.g.:\n    >\n    > ```markdown\n    > ## Enhancements\n    >\n    > * Add `win-arm64` as a known platform (subdir). (#11778)\n    > ```\n\n    - You can utilize [GitHub's compare view][compare] to review what changes are to be included in this release. Make sure you compare the current release branch against the previous one\n\n    - Add a new news snippet for any PRs of importance that are missing.\n\n    - Commit these changes to news snippets:\n\n        ```bash\n        (rever) $ git add .\n        (rever) $ git commit -m \"Update news\"\n        ```\n\n    - After completing this, you will have at most three commits on your release branch:\n\n        ```bash\n        (rever) $ git cherry -v <release branch>\n        + 86957814cf235879498ed7806029b8ff5f400034 Update .authors.yml\n        + 3ec7491f2f58494a62f1491987d66f499f8113ad Update .mailmap\n        + 432a9e1b41a3dec8f95a7556632f9a93fdf029fd Update news\n        ```\n\n5. Run `rever --activities changelog`:\n\n    > **Note:** <!-- GH doesn't support nested admonitions, see https://github.com/orgs/community/discussions/16925 -->\n    > This has previously been a notoriously fickle step (likely due to incorrect regex patterns in the `rever.xsh` config file and missing `github` keys in `.authors.yml`) so beware of potential hiccups. If this fails, it's highly likely to be an innocent issue.\n\n    ```bash\n    (rever) $ rever --activities changelog --force <VERSION>\n    ```\n\n    - Any necessary modifications to `.authors.yml`, `.mailmap`, or the news snippets themselves should be amended to the previous commits.\n\n    - Once you have successfully run `rever --activities changelog` with no errors simply revert the last commit (see the next step for why):\n\n        ```bash\n        # undo commit (and discard changes)\n        (rever) $ git reset --hard HEAD~1\n        ```\n\n    - After completing this, you will have at most three commits on your release branch:\n\n        ```bash\n        (rever) $ git cherry -v <release branch>\n        + 86957814cf235879498ed7806029b8ff5f400034 Update .authors.yml\n        + 3ec7491f2f58494a62f1491987d66f499f8113ad Update .mailmap\n        + 432a9e1b41a3dec8f95a7556632f9a93fdf029fd Update news\n        ```\n\n6. Now that we have successfully run the activities separately, we wish to run both together. This will ensure that the contributor list, a side-effect of the authors activity, is included in the changelog activity.\n\n    ```bash\n    (rever) $ rever --force <VERSION>\n    ```\n\n    - After completing this, you will have at most five commits on your release branch:\n\n        ```bash\n        (rever) $ git cherry -v <release branch>\n        + 86957814cf235879498ed7806029b8ff5f400034 Update .authors.yml\n        + 3ec7491f2f58494a62f1491987d66f499f8113ad Update .mailmap\n        + 432a9e1b41a3dec8f95a7556632f9a93fdf029fd Update news\n        + a5c0db938893d2c12cab12a1f7eb3e646ed80373 Update authorship for YY.MM.MICRO\n        + 5e95169d0df4bcdc2da9a6ba4a2561d90e49f75d Update CHANGELOG for YY.MM.MICRO\n        ```\n\n7. Since rever does not include stats on first-time contributors, we will need to add this manually.\n\n    - Use [GitHub's auto-generated release notes][new release] to get a list of all new contributors (and their first PR) and manually merge this list with the contributor list in `CHANGELOG.md`. See [GitHub docs][release docs] for how to auto-generate the release notes.\n\n    - Commit these final changes:\n\n        ```bash\n        (rever) $ git add .\n        (rever) $ git commit -m \"Add first-time contributions\"\n        ```\n\n    - After completing this, you will have at most six commits on your release branch:\n\n        ```bash\n        (rever) $ git cherry -v <release branch>\n        + 86957814cf235879498ed7806029b8ff5f400034 Update .authors.yml\n        + 3ec7491f2f58494a62f1491987d66f499f8113ad Update .mailmap\n        + 432a9e1b41a3dec8f95a7556632f9a93fdf029fd Update news\n        + a5c0db938893d2c12cab12a1f7eb3e646ed80373 Update authorship for YY.MM.MICRO\n        + 5e95169d0df4bcdc2da9a6ba4a2561d90e49f75d Update CHANGELOG for YY.MM.MICRO\n        + 93fdf029fd4cf235872c12cab12a1f7e8f95a755 Add first-time contributions\n        ```\n\n8. Push this versioned branch.\n\n    ```bash\n    (rever) $ git push -u upstream changelog-YY.MM.MICRO\n    ```\n\n9. Open the Release PR targeting the `YY.MM.x` branch.\n\n    <details>\n    <summary>GitHub PR Template</summary>\n\n    ```markdown\n    ## Description\n\n    ✂️ snip snip ✂️ the making of a new release.\n\n    Xref #<RELEASE ISSUE>\n    ```\n\n    </details>\n\n10. Update release issue to include a link to the release PR.\n\n11. [Create][new release] the release and **SAVE AS A DRAFT** with the following values:\n\n    > **Note:** <!-- GH doesn't support nested admonitions, see https://github.com/orgs/community/discussions/16925 -->\n    > Only publish the release after the release PR is merged, until then always **save as draft**.\n\n    | Field | Value |\n    |---|---|\n    | Choose a tag | `YY.MM.MICRO` |\n    | Target | `YY.MM.x` |\n    | Body | copy/paste blurb from `CHANGELOG.md` |\n\n</details>\n\n## 6. Wait for review and approval of release PR.\n\n## 7. Merge release PR and publish release.\n\nTo publish the release, go to the project's release page (e.g., https://github.com/conda/conda-libmamba-solver/releases) and add the release notes from `CHANGELOG.md` to the draft release you created earlier. Then publish the release.\n\n> [!NOTE]\n> Release notes can be drafted and saved ahead of time.\n\n## 8. Merge/cherry pick the release branch over to the `main` branch.\n\n<details>\n<summary>Internal process</summary>\n\n1. From the main \"< > Code\" page of the repository, select the drop down menu next to the `main` branch button and then select \"View all branches\" at the very bottom.\n\n2. Find the applicable `YY.MM.x` branch and click the \"New pull request\" button.\n\n3. \"Base\" should point to `main` while \"Compare\" should point to `YY.MM.x`.\n\n4. Ensure that all of the commits being pulled in look accurate, then select \"Create pull request\".\n\n> [!NOTE]\n> Make sure NOT to push the \"Update Branch\" button. If there are [merge conflicts][merge conflicts], create a temporary \"connector branch\" dedicated to fixing merge conflicts separately from the `YY.MM.x` and `main` branches.\n\n5. Review and merge the pull request the same as any code change pull request.\n\n> [!NOTE]\n> The commits from the release branch need to be retained in order to be able to compare individual commits; in other words, a \"merge commit\" is required when merging the resulting pull request vs. a \"squash merge\". Protected branches will require permissions to be temporarily relaxed in order to enable this action.\n\n</details>\n\n## 9. Open PRs to bump [Anaconda Recipes][Anaconda Recipes] and [conda-forge][conda-forge] feedstocks to use `YY.MM.MICRO`.\n\n> [!NOTE]\n> Conda-forge's PRs will be auto-created via the `regro-cf-autotick-bot`. Follow the instructions below if any changes need to be made to the recipe that were not automatically added (these instructions are only necessary for anyone who is _not_ a conda-forge feedstock maintainer, since maintainers can push changes directly to the autotick branch):\n> - Create a new branch based off of autotick's branch (autotick's branches usually use the `regro-cf-autotick-bot:XX.YY.[$patch_number]_[short hash]` syntax)\n> - Add any changes via commits to that new branch\n> - Open a new PR and push it against the `main` branch\n>\n> Make sure to include a comment on the original `autotick-bot` PR that a new pull request has been created, in order to avoid duplicating work!  `regro-cf-autotick-bot` will close the auto-created PR once the new PR is merged.\n>\n> For more information about this process, please read the [\"Pushing to regro-cf-autotick-bot branch\" section of the conda-forge documentation](https://conda-forge.org/docs/maintainer/updating_pkgs.html#pushing-to-regro-cf-autotick-bot-branch).\n\n\n## 10. Hand off to Anaconda's packaging team.\n\n> [!NOTE]\n> This step should NOT be done past Thursday morning EST; please start the process on a Monday, Tuesday, or Wednesday instead in order to avoid any potential debugging sessions over evenings or weekends.\n\n<details>\n<summary>Internal process</summary>\n\n1. Open packaging request in #package_requests Slack channel, include links to the Release PR and feedstock PRs.\n\n2. Message packaging team/PM to let them know that a release has occurred and that you are the release manager.\n\n</details>\n\n## 11. Continue championing and shepherding.\n\nRemember to make all relevant announcements and continue to update the release issue with the latest details as tasks are completed.\n"
  },
  {
    "path": "conda_libmamba_solver/__init__.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\ntry:\n    from ._version import version as __version__\nexcept ImportError:\n    try:\n        from importlib.metadata import version\n\n        __version__ = version(\"conda_libmamba_solver\")\n        del version\n    except ImportError:\n        __version__ = \"0.0.0.unknown\"\n\n\ndef get_solver_class(key: str = \"libmamba\"):\n    if key == \"libmamba\":\n        from .solver import LibMambaSolver\n\n        return LibMambaSolver\n    raise ValueError(\"Key must be 'libmamba'\")\n"
  },
  {
    "path": "conda_libmamba_solver/conda_build_exceptions.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nThis exception is only used in conda-build, so we can't import it directly.\nconda_build is not a dependency, but we only import this when conda-build is calling the\nsolver, so it's fine to import it here.\n\"\"\"\n\nfrom __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n    from collections.abc import Iterable\n\n    from conda.models.match_spec import MatchSpec\n\nfrom conda_build.exceptions import DependencyNeedsBuildingError\n\n\nclass ExplainedDependencyNeedsBuildingError(DependencyNeedsBuildingError):\n    \"\"\"\n    We need to subclass this to add the explanation to the error message.\n    We also add a couple of attributes to make it easier to set up.\n    \"\"\"\n\n    def __init__(\n        self,\n        matchspecs: Iterable[MatchSpec] | None = None,\n        explanation: str | None = None,\n        *args,\n        **kwargs,\n    ):\n        super().__init__(*args, **kwargs)\n        self.matchspecs = self.matchspecs or matchspecs or []\n        self.explanation = explanation\n\n    def __str__(self) -> str:\n        msg = self.message\n        if not self.explanation:\n            # print simple message in log.warning() calls\n            return msg\n        return \"\\n\".join([msg, self.explanation])\n"
  },
  {
    "path": "conda_libmamba_solver/exceptions.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nExceptions used in conda-libmamba-solver\n\"\"\"\n\nfrom conda.exceptions import UnsatisfiableError\n\n\nclass LibMambaUnsatisfiableError(UnsatisfiableError):\n    \"\"\"An exception to report unsatisfiable dependencies.\n    The error message is passed directly as a str.\n    \"\"\"\n\n    def __init__(self, message: str, **kwargs):\n        super(UnsatisfiableError, self).__init__(str(message))\n"
  },
  {
    "path": "conda_libmamba_solver/index.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nThis module provides a convenient interface between `libmamba.Solver`\nand conda's `PrefixData`. In other words, it allows to expose channels\nloaded in `conda` to the `libmamba` machinery without using the\n`libmamba` networking stack.\n\nInternally, the `libmamba`'s index is made of:\n\n- A 'Pool' object, exposed to libsolv.\n- The pool is made of `Repo` objects.\n- Each repo corresponds to a repodata.json file.\n- Each repodata comes from a channel+subdir combination.\n\nSome notes about channels\n-------------------------\n\nIn a way, conda channels are an abstraction over a collection of\nchannel subdirs. For example, when the user wants 'conda-forge', it\nactually means 'repodata.json' files from the configured platform subdir\nand 'noarch'. Some channels are actually 'MultiChannel', which provide\na collection of channels. The most common example is 'defaults', which\nincludes 'main', 'r' and 'msys2'.\n\nSo, for conda-forge on Linux amd64 we get:\n\n- https://conda.anaconda.org/conda-forge/linux-64\n- https://conda.anaconda.org/conda-forge/noarch\n\nFor defaults on macOS with Apple Silicon (M1 and friends):\n\n- https://repo.anaconda.org/main/osx-arm64\n- https://repo.anaconda.org/main/noarch\n- https://repo.anaconda.org/r/osx-arm64\n- https://repo.anaconda.org/r/noarch\n- https://repo.anaconda.org/msys2/osx-arm64\n- https://repo.anaconda.org/msys2/noarch\n\nHowever, users will just say 'defaults' or 'conda-forge', for convenience.\nThis means that we need to deal with several formats of channel information,\nwhich ultimately lead to a collection of subdir-specific URLs:\n\n- Channel names from the CLI or configuration files / env-vars\n- Channel URLs if names are not available (channel not served in anaconda.org)\n- conda.models.channel.Channel objects\n\nTheir origins can be:\n\n- Specified by the user on the command-line (-c arguments)\n- Specified by the configuration files (.condarc) or environment vars (context object)\n- Added from channel-specific MatchSpec (e.g. `conda-forge::python`)\n- Added from installed packages in target environment (e.g. a package that was installed\n  from a non-default channel remembers where it comes from)\n\nAlso note that a channel URL might have authentication in the form:\n\n- https://user:password@server.com/channel\n- https://server.com/t/your_token_goes_here/channel\n\nFinally, a channel can be mounted in a local directory and referred to via\na regular path, or a file:// URL, with or without normalization on Windows.\n\nThe approach\n------------\nWe pass the subdir-specific, authenticated URLs to conda's 'SubdirData.repo_patch',\nwhich download the JSON files but do not process them to PackageRecords.\nOnce the cache has been populated, we can instantiate 'libmamba.Repo' objects directly.\nWe maintain a map of subdir-specific URLs to `conda.model.channel.Channel`\nand `libmamba.Repo` objects.\n\"\"\"\n\nfrom __future__ import annotations\n\nimport logging\nimport os\nfrom dataclasses import dataclass\nfrom functools import partial\nfrom pathlib import Path\nfrom typing import TYPE_CHECKING\n\nfrom conda.base.constants import KNOWN_SUBDIRS, REPODATA_FN, ChannelPriority\nfrom conda.base.context import context\nfrom conda.common.compat import on_win\nfrom conda.common.io import DummyExecutor, ThreadLimitedThreadPoolExecutor, time_recorder\nfrom conda.common.url import path_to_url, remove_auth, split_anaconda_token\nfrom conda.core.package_cache_data import PackageCacheData\nfrom conda.core.subdir_data import SubdirData\nfrom conda.models.channel import Channel\nfrom conda.models.match_spec import MatchSpec\nfrom conda.models.records import PackageRecord\nfrom libmambapy import MambaNativeException, Query\nfrom libmambapy.solver.libsolv import (\n    Database,\n    PackageTypes,\n    PipAsPythonDependency,\n    Priorities,\n    RepodataOrigin,\n)\nfrom libmambapy.specs import (\n    Channel as LibmambaChannel,\n)\nfrom libmambapy.specs import (\n    ChannelResolveParams,\n    CondaURL,\n    NoArchType,\n    PackageInfo,\n)\n\nfrom conda_libmamba_solver.shards_subset import build_repodata_subset\n\nfrom .mamba_utils import logger_callback\n\nif TYPE_CHECKING:\n    from collections.abc import Callable, Iterable\n    from typing import Any, Literal\n\n    from conda.common.path import PathsType\n    from conda.gateways.repodata import RepodataState\n    from libmambapy import QueryResult\n    from libmambapy.solver.libsolv import RepoInfo\n\n    from conda_libmamba_solver.shards import ShardBase\n\n    from .shards_typing import PackageRecordDict\n    from .state import SolverInputState\n\n\nlog = logging.getLogger(f\"conda.{__name__}\")\n\n\n@dataclass\nclass _ChannelRepoInfo:\n    \"A dataclass mapping conda Channels, libmamba Repos and URLs\"\n\n    channel: Channel | None\n    repo: RepoInfo\n    url_w_cred: str\n    url_no_cred: str\n\n    @property\n    def canonical_name(self) -> str:\n        if self.channel:\n            return self.channel.canonical_name\n        url_parts = self.url_no_cred.split(\"/\")\n        if url_parts[-1] in KNOWN_SUBDIRS:\n            return url_parts[-2]\n        return url_parts[-1]\n\n\ndef _is_sharded_repodata_enabled():\n    \"\"\"\n    Flag to see whether we should check for sharded repodata.\n    \"\"\"\n    return context.plugins.use_sharded_repodata is True  # type: ignore\n\n\n_SUPPORTS_PYTHON_SITE_PACKAGES = hasattr(PackageInfo, \"python_site_packages_path\")\n\n\ndef _package_info_from_package_dict(\n    record: PackageRecordDict,\n    filename: str,\n    url: str,\n    channel_id: str,\n    add_pip_as_python_dependency=False,\n) -> PackageInfo:\n    \"\"\"\n    Build libmamba PackageInfo from an unprocessed repodata \"packages\", \"packages.conda\" entry.\n    \"\"\"\n    if (noarch := record.get(\"noarch\")) in (\"python\", \"generic\"):\n        noarch = NoArchType(noarch.title())\n    else:\n        noarch = NoArchType(\"No\")\n    # include the python_site_packages_path attribute if libmambapy includes support\n    if _SUPPORTS_PYTHON_SITE_PACKAGES:\n        extra = {\n            \"python_site_packages_path\": record.get(\"python_site_packages_path\") or \"\",\n        }\n    else:\n        extra = {}\n\n    # the dict has not been \"enriched\" with channel, subdir, url, filename\n\n    # channel examples\n    # 'https://repo.anaconda.com/pkgs/main'\n    # Channel(\"pkgs/main\"), Channel('@')\n\n    # package_url examples, full URL to package or \"\" for a virtual package,\n    # possibly a local package\n\n    # filename, the key from repodata\n\n    track_features = record.get(\"track_features\") or []\n    # track_features can be stored as a space- or comma-separated string\n    if track_features and isinstance(track_features, str):\n        track_features = track_features.replace(\" \", \",\").split(\",\")\n        track_features = list(f for f in (ff.strip() for ff in track_features) if f)\n\n    # Build depends list and append pip if conditions are met\n    depends = list(record.get(\"depends\") or [])\n    if (\n        add_pip_as_python_dependency\n        and record[\"name\"] == \"python\"\n        and record[\"version\"].startswith((\"2.\", \"3.\"))\n    ):\n        depends.append(\"pip\")\n\n    return PackageInfo(\n        name=record[\"name\"],\n        version=record[\"version\"],\n        build_string=record.get(\"build\", \"\"),\n        build_number=record.get(\"build_number\", 0),\n        channel=channel_id,\n        package_url=url,\n        platform=record.get(\"subdir\") or \"\",\n        filename=filename,\n        license=record.get(\"license\") or \"\",  # does the solver use this?\n        md5=record.get(\"md5\") or \"\",\n        sha256=record.get(\"sha256\") or \"\",\n        signatures=record.get(\"signatures\") or \"\",\n        track_features=track_features,\n        # conda can have list or tuple, but libmamba only accepts lists\n        depends=depends,\n        constrains=list(record.get(\"constrains\") or []),\n        defaulted_keys=list(record.get(\"defaulted_keys\") or []),\n        noarch=noarch,\n        size=record.get(\"size\") or 0,\n        timestamp=int(\n            (record.get(\"timestamp\") or 0) * 1000\n        ),  # XXX packages may have either seconds or milliseconds timestamps, see convert-if-out-of-range code in conda\n        **extra,\n    )\n\n\nclass LibMambaIndexHelper:\n    \"\"\"\n    Interface between conda and libmamba for the purpose of building the \"index\".\n    The index is the collection of package records that can be part of a solution.\n    It is built by collecting all the repodata.json files from channels and their\n    subdirs. For existing environments, the installed packages are also added to\n    the index (this helps with simplifying solutions and outputs). The local cache\n    can also be added as a \"channel\", which is useful in offline mode or with no\n    channels configured.\n    \"\"\"\n\n    def __init__(\n        self,\n        channels: Iterable[Channel],\n        subdirs: Iterable[str] = (),\n        repodata_fn: str = REPODATA_FN,\n        installed_records: Iterable[PackageRecord] = (),\n        pkgs_dirs: PathsType = (),\n        in_state: SolverInputState | None = None,\n    ):\n        platform_less_channels: list[Channel] = []\n        for channel in channels:\n            if channel.platform:\n                # When .platform is defined, .urls() will ignore subdirs kw. Remove!\n                log.info(\n                    \"Platform-aware channels are not supported. \"\n                    \"Ignoring platform %s from channel %s. \"\n                    \"Use subdirs keyword if necessary.\",\n                    channel.platform,\n                    channel,\n                )\n                channel = Channel(**{k: v for k, v in channel.dump().items() if k != \"platform\"})\n            platform_less_channels.append(channel)\n        self.channels = platform_less_channels\n        self.subdirs = subdirs or context.subdirs\n        self.repodata_fn = repodata_fn\n        self.in_state = in_state\n        self._add_pip_as_python_dependency = context.add_pip_as_python_dependency\n        self.db = self._init_db()\n\n        self.repos: list[_ChannelRepoInfo] = self._load_channels()\n        if pkgs_dirs:\n            self.repos.extend(self._load_pkgs_cache(pkgs_dirs))\n        if installed_records:\n            self.repos.append(self._load_installed(installed_records))\n        self._set_repo_priorities()\n\n        # These are to support lazy self.repos, but it's not currently lazy.\n        self._pkgs_dirs = pkgs_dirs\n        self._installed_records = installed_records\n\n    @classmethod\n    def from_platform_aware_channel(cls, channel: Channel) -> LibMambaIndexHelper:\n        if not channel.platform:\n            raise ValueError(f\"Channel {channel} must define 'platform' attribute.\")\n        subdir = channel.platform\n        channel = Channel(**{k: v for k, v in channel.dump().items() if k != \"platform\"})\n        return cls(channels=(channel,), subdirs=(subdir,))\n\n    def n_packages(\n        self,\n        repos: Iterable[RepoInfo] | None = None,\n        filter_: Callable | None = None,\n    ) -> int:\n        repos = repos or [repo_info.repo for repo_info in self.repos]\n        count = 0\n        for repo in repos:\n            if filter_:\n                for pkg in self.db.packages_in_repo(repo):\n                    if filter_(pkg):\n                        count += 1\n            else:\n                count += len(self.db.packages_in_repo(repo))\n        return count\n\n    def reload_channel(self, channel: Channel) -> None:\n        urls = {}\n        for url in channel.urls(with_credentials=False, subdirs=self.subdirs):\n            for repo_info in self.repos:\n                if repo_info.url_no_cred == url:\n                    log.debug(\"Reloading repo %s\", repo_info.url_no_cred)\n                    urls[repo_info.url_w_cred] = channel\n                    self.db.remove_repo(repo_info.repo)\n        for new_repo_info in self._load_channels(urls, try_solv=False):\n            for repo_info in self.repos:\n                if repo_info.url_no_cred == new_repo_info.url_no_cred:\n                    repo_info.repo = new_repo_info.repo\n        self._set_repo_priorities()\n\n    def _init_db(self) -> Database:\n        custom_channels = {\n            # Add custom channels as a workaround for this weird conda behavior\n            # See https://github.com/conda/conda/issues/13501\n            **{c.name: c for c in self.channels if c.location != context.channel_alias.location},\n            **context.custom_channels,\n        }\n        custom_channels = {\n            name: LibmambaChannel(\n                url=CondaURL.parse(channel.base_url.replace(\" \", \"%20\")),\n                display_name=name,\n                platforms=set(self.subdirs),\n            )\n            for (name, channel) in custom_channels.items()\n            if channel.base_url\n        }\n        custom_multichannels = {\n            channel_name: [\n                custom_channels.get(\n                    channel.name,\n                    LibmambaChannel(\n                        url=CondaURL.parse(channel.base_url.replace(\" \", \"%20\")),\n                        display_name=channel.name,\n                        platforms=set(self.subdirs),\n                    ),\n                )\n                for channel in channels\n                if channel.base_url\n            ]\n            for channel_name, channels in context.custom_multichannels.items()\n        }\n        params = ChannelResolveParams(\n            platforms=set(self.subdirs),\n            channel_alias=CondaURL.parse(str(context.channel_alias)),\n            custom_channels=ChannelResolveParams.ChannelMap(custom_channels),\n            custom_multichannels=ChannelResolveParams.MultiChannelMap(custom_multichannels),\n            home_dir=str(Path.home()),\n            current_working_dir=os.getcwd(),\n        )\n        db = Database(params)\n        db.set_logger(logger_callback)\n        return db\n\n    def _load_channels(\n        self,\n        urls_to_channel: dict[str, Channel] | None = None,\n        try_solv: bool = True,\n    ) -> list[_ChannelRepoInfo]:\n        if urls_to_channel is None:\n            urls_to_channel = self._channel_urls(self.subdirs, self.channels)\n\n        urls_to_channel = self._encoded_urls_to_channels(urls_to_channel)\n\n        # Prefer sharded repodata loading if enabled\n        if self.in_state and _is_sharded_repodata_enabled():\n            # _load_channel_repo_info_shards() must return ChannelRepoInfo\n            # matching the key order of urls_to_channel:\n            channel_repos_info = self._load_channel_repo_info_shards(urls_to_channel)\n            if channel_repos_info is not None:\n                return channel_repos_info\n            log.debug(\"No sharded channels available. Fall back to non-sharded path.\")\n\n        # Classic \"monolithic repodata.json\" path\n        return self._load_channel_repo_info_json(urls_to_channel, try_solv)\n\n    def _load_channel_repo_info_shards(\n        self, urls_to_channel: dict[str, Channel]\n    ) -> list[_ChannelRepoInfo] | None:\n        \"\"\"\n        Load repository information from sharded repodata cache.\n        \"\"\"\n        # make a subset of possible dependencies\n        root_packages = (*self.in_state.installed.keys(), *self.in_state.requested)\n        channel_data = build_repodata_subset(root_packages, urls_to_channel)\n        if channel_data is None:\n            return  # caller should fall back to repodata.json\n\n        channel_repo_infos = self._load_repo_info_from_repodata_dict(channel_data)\n\n        return channel_repo_infos\n\n    def _load_channel_repo_info_json(\n        self, urls_to_channel: dict[str, Channel], try_solv: bool\n    ) -> list[_ChannelRepoInfo]:\n        \"\"\"\n        Load repository information from repodata.json files.\n        \"\"\"\n        urls_to_json_path_and_state = self._fetch_repodata_jsons(tuple(urls_to_channel.keys()))\n\n        channel_repo_infos = []\n        for url_w_cred, (json_path, state) in urls_to_json_path_and_state.items():\n            url_no_token, _ = split_anaconda_token(url_w_cred)\n            url_no_cred = remove_auth(url_no_token)\n            repo = self._load_repo_info_from_json_path(\n                json_path,\n                url_no_cred,\n                state,\n                try_solv=(try_solv and not self.in_state),\n            )\n            channel_repo_infos.append(\n                _ChannelRepoInfo(\n                    channel=urls_to_channel[url_w_cred],\n                    repo=repo,\n                    url_w_cred=url_w_cred,\n                    url_no_cred=url_no_cred,\n                )\n            )\n        return channel_repo_infos\n\n    @staticmethod\n    def _channel_urls(subdirs: Iterable[str], channels: list[Channel]) -> dict[str, Channel]:\n        \"Map authenticated URLs to channel objects.\"\n        # class method for testing etc.\n        urls = {}\n        seen_noauth = set()\n        channels_with_subdirs = []\n        for channel in channels:\n            for url in channel.urls(with_credentials=True, subdirs=subdirs):\n                channels_with_subdirs.append(Channel(url))\n        for channel in channels_with_subdirs:\n            noauth_urls = [\n                url for url in channel.urls(with_credentials=False) if url.endswith(channel.subdir)\n            ]\n            if seen_noauth.issuperset(noauth_urls):\n                continue\n            auth_urls = [\n                url.replace(\" \", \"%20\")\n                for url in channel.urls(with_credentials=True)\n                if url.endswith(tuple(subdirs))\n            ]\n            if noauth_urls != auth_urls:  # authed channel always takes precedence\n                urls.update({url: channel for url in auth_urls})\n                seen_noauth.update(noauth_urls)\n                continue\n            # at this point, we are handling an unauthed channel; in some edge cases,\n            # an auth'd variant of the same channel might already be present in `urls`.\n            # we only add them if we haven't seen them yet\n            for url in noauth_urls:\n                if url not in seen_noauth:\n                    urls[url] = channel\n                    seen_noauth.add(url)\n        return urls\n\n    @staticmethod\n    def _encoded_urls_to_channels(urls_to_channel: dict[str, Channel]) -> dict[str, Channel]:\n        \"\"\"\n        Return copy of urls_to_channel with %-encoded spaces.\n\n        Usage: _encoded_urls_to_channels(_channel_urls(subdirs, channels))\n        \"\"\"\n        # conda.common.url.path_to_url does not %-encode spaces\n        encoded_urls_to_channel: dict[str, Channel] = {}\n        for url, channel in urls_to_channel.items():\n            if url.startswith(\"file://\"):\n                url = url.replace(\" \", \"%20\")\n            encoded_urls_to_channel[url] = channel\n        return encoded_urls_to_channel\n\n    def _fetch_repodata_jsons(self, urls: Iterable[str]) -> dict[str, tuple[str, RepodataState]]:\n        Executor = (\n            DummyExecutor\n            if context.debug or context.repodata_threads == 1\n            else partial(ThreadLimitedThreadPoolExecutor, max_workers=context.repodata_threads)\n        )\n        with Executor() as executor:\n            return {\n                url: (str(path), state)\n                for (url, path, state) in executor.map(self._fetch_one_repodata_json, urls)\n            }\n\n    def _fetch_one_repodata_json(self, url: str) -> tuple[str, os.PathLike, RepodataState]:\n        channel = Channel.from_url(url)\n        if not channel.subdir:\n            raise ValueError(\"Channel URLs must specify a subdir!\")\n\n        if \"PYTEST_CURRENT_TEST\" in os.environ:\n            # Workaround some testing issues - TODO: REMOVE\n            # Fix conda.testing.helpers._patch_for_local_exports by removing last line\n            for key, cached in list(SubdirData._cache_.items()):\n                if not isinstance(key, tuple):\n                    continue  # should not happen, but avoid IndexError just in case\n                if key[:2] == (url, self.repodata_fn) and cached._mtime == float(\"inf\"):\n                    del SubdirData._cache_[key]\n            # /Workaround\n\n        subdir_data = SubdirData(channel, repodata_fn=self.repodata_fn)\n        if context.offline or context.use_index_cache:\n            # This might not exist (yet, anymore), but that's ok because we'll check\n            # for existence later and safely ignore if needed\n            json_path = subdir_data.cache_path_json\n            state = subdir_data.repo_cache.load_state()\n        else:\n            # TODO: This method loads reads the whole JSON file (does not parse)\n            json_path, state = subdir_data.repo_fetch.fetch_latest_path()\n        return url, json_path, state\n\n    def _load_repo_info_from_json_path(\n        self, json_path: str, channel_url: str, state: RepodataState | None, try_solv: bool = True\n    ) -> RepoInfo | None:\n        if try_solv and on_win:\n            # .solv loading is so slow on Windows is not even worth it. Use JSON instead.\n            # https://github.com/mamba-org/mamba/pull/2753#issuecomment-1739122830\n            log.debug(\"Overriding truthy 'try_solv' as False on Windows for performance reasons.\")\n            try_solv = False\n        json_path = Path(json_path)\n        solv_path = json_path.with_suffix(\".solv\")\n        if state:\n            repodata_origin = RepodataOrigin(url=channel_url, etag=state.etag, mod=state.mod)\n        else:\n            repodata_origin = None\n        channel = Channel(channel_url)\n        channel_id = self._channel_to_id(channel)\n        if try_solv and repodata_origin:\n            try:\n                log.debug(\n                    \"Loading %s (%s) from SOLV repodata at %s\", channel_id, channel_url, solv_path\n                )\n                return self.db.add_repo_from_native_serialization(\n                    path=str(solv_path),\n                    expected=repodata_origin,\n                    channel_id=channel_id,\n                    add_pip_as_python_dependency=PipAsPythonDependency(\n                        context.add_pip_as_python_dependency\n                    ),\n                )\n            except Exception as exc:\n                log.debug(\"Failed to load from SOLV. Trying JSON.\", exc_info=exc)\n        try:\n            log.debug(\n                \"Loading %s (%s) from JSON repodata at %s\", channel_id, channel_url, json_path\n            )\n            repo = self.db.add_repo_from_repodata_json(\n                path=str(json_path),\n                url=channel_url,\n                channel_id=channel_id,\n                add_pip_as_python_dependency=PipAsPythonDependency(\n                    context.add_pip_as_python_dependency\n                ),\n                package_types=(\n                    PackageTypes.TarBz2Only\n                    if context.use_only_tar_bz2\n                    else PackageTypes.CondaOrElseTarBz2\n                ),\n            )\n        except MambaNativeException as exc:\n            if \"does not exist\" in str(exc) and context.offline:\n                # Ignore errors in offline mode. This is needed to pass\n                # tests/test_create.py::test_offline_with_empty_index_cache.\n                # In offline mode, with no repodata cache available, conda can still\n                # create a channel from the pkgs/ content. For that to work, we must\n                # not error out this early. If the package is still not found, the solver\n                # will complain that the package cannot be found.\n                log.warning(\"Could not load repodata for %s.\", channel_id)\n                log.debug(\"Ignored MambaNativeException in offline mode: %s\", exc, exc_info=exc)\n                return None\n            raise exc\n        if try_solv and repodata_origin:\n            try:\n                self.db.native_serialize_repo(\n                    repo=repo, path=str(solv_path), metadata=repodata_origin\n                )\n            except MambaNativeException as exc:\n                log.debug(\"Ignored SOLV writing error for %s\", channel_id, exc_info=exc)\n        return repo\n\n    def _channel_to_id(self, channel: Channel):\n        channel_id = channel.canonical_name\n        if channel_id in context.custom_multichannels:\n            # In multichannels, the canonical name of a \"subchannel\" is the multichannel name\n            # which makes it ambiguous for `channel::specs`. In those cases, take the channel\n            # regular name; e.g. for repo.anaconda.com/pkgs/main, do not take defaults, but\n            # pkgs/main instead.\n            channel_id = channel.name\n        return channel_id\n\n    def _load_installed(self, records: Iterable[PackageRecord]) -> _ChannelRepoInfo:\n        packages = [self._package_info_from_package_record(record) for record in records]\n        repo = self.db.add_repo_from_packages(\n            packages=packages,\n            name=\"installed\",\n            add_pip_as_python_dependency=PipAsPythonDependency.No,\n        )\n        self.db.set_installed_repo(repo)\n        return _ChannelRepoInfo(\n            channel=None, repo=repo, url_w_cred=\"installed\", url_no_cred=\"installed\"\n        )\n\n    def _load_pkgs_cache(self, pkgs_dirs: PathsType) -> list[RepoInfo]:\n        repos = []\n        for path in pkgs_dirs:\n            package_cache_data = PackageCacheData(path)\n            package_cache_data.load()\n            packages = [\n                self._package_info_from_package_record(record)\n                for record in package_cache_data.values()\n            ]\n            repo = self.db.add_repo_from_packages(packages=packages, name=path)\n            # path_to_url does not %-encode spaces\n            path_as_url = path_to_url(path).replace(\" \", \"%20\")\n            repos.append(\n                _ChannelRepoInfo(\n                    channel=None, repo=repo, url_w_cred=path_as_url, url_no_cred=path_as_url\n                )\n            )\n        return repos\n\n    @time_recorder(module_name=__name__)\n    def _load_repo_info_from_repodata_dict(\n        self, repodata_subset: dict[str, ShardBase]\n    ) -> list[_ChannelRepoInfo]:\n        \"\"\"\n        Load repository information from deserialized repodata.json-like\n        structures.\n        \"\"\"\n        repos = []\n        for channel_url, shardlike in repodata_subset.items():\n            repodata = shardlike.build_repodata()\n            # Don't like going back and forth between channel objects and URLs;\n            # build_repodata_subset() expands channels into per-subdir URLs as\n            # part of fetch:\n            channel_object = Channel(channel_url)\n            channel_id = self._channel_to_id(channel_object)\n            # must be appropriate for string concatenation:\n            base_url = shardlike.base_url\n\n            packages = []\n            for package_group in (\"packages\", \"packages.conda\"):\n                for filename, record in repodata.get(package_group, {}).items():\n                    package = _package_info_from_package_dict(\n                        record,\n                        filename,\n                        url=f\"{base_url}{filename}\",\n                        channel_id=channel_id,\n                        add_pip_as_python_dependency=self._add_pip_as_python_dependency,\n                    )\n                    packages.append(package)\n\n            repo = self.db.add_repo_from_packages(\n                packages=packages,\n                name=channel_url,\n                add_pip_as_python_dependency=PipAsPythonDependency(\n                    context.add_pip_as_python_dependency\n                ),\n            )\n            repos.append(\n                _ChannelRepoInfo(\n                    channel=channel_object,\n                    repo=repo,\n                    url_w_cred=channel_url,\n                    url_no_cred=channel_url,\n                )\n            )\n\n        return repos\n\n    def _package_info_from_package_record(self, record: PackageRecord) -> PackageInfo:\n        if record.get(\"noarch\", None) and record.noarch.value in (\"python\", \"generic\"):\n            noarch = NoArchType(record.noarch.value.title())\n        else:\n            noarch = NoArchType(\"No\")\n        # include the python_site_packages_path attribute if libmambapy includes support\n        if _SUPPORTS_PYTHON_SITE_PACKAGES:\n            extra = {\n                \"python_site_packages_path\": record.get(\"python_site_packages_path\") or \"\",\n            }\n        else:\n            extra = {}\n\n        return PackageInfo(\n            name=record.name,\n            version=record.version,\n            build_string=record.build or \"\",\n            build_number=record.build_number or 0,\n            channel=str(record.channel),\n            package_url=record.get(\"url\") or \"\",\n            platform=record.subdir,\n            filename=record.fn or f\"{record.name}-{record.version}-{record.build or ''}\",\n            license=record.get(\"license\") or \"\",\n            md5=record.get(\"md5\") or \"\",\n            sha256=record.get(\"sha256\") or \"\",\n            signatures=record.get(\"signatures\") or \"\",\n            # conda can have list or tuple, but libmamba only accepts lists\n            track_features=list(record.get(\"track_features\") or []),\n            depends=list(record.get(\"depends\") or []),\n            constrains=list(record.get(\"constrains\") or []),\n            defaulted_keys=list(record.get(\"defaulted_keys\") or []),\n            noarch=noarch,\n            size=record.get(\"size\") or 0,\n            timestamp=int((record.get(\"timestamp\") or 0) * 1000),\n            **extra,\n        )\n\n    def _set_repo_priorities(self) -> None:\n        has_priority = context.channel_priority in (\n            ChannelPriority.STRICT,\n            ChannelPriority.FLEXIBLE,\n        )\n\n        subprio_index = len(self.repos)\n        if has_priority:\n            # max channel priority value is the number of unique channels\n            channel_prio = len({repo.canonical_name for repo in self.repos})\n            current_channel_name = self.repos[0].canonical_name\n\n        for repo_info in self.repos:\n            if repo_info.repo is None:\n                continue\n            if has_priority:\n                if repo_info.canonical_name != current_channel_name:\n                    channel_prio -= 1\n                    current_channel_name = repo_info.canonical_name\n                priority = channel_prio\n            else:\n                priority = 0\n            if has_priority:\n                # NOTE: -- This was originally 0, but we need 1.\n                # Otherwise, conda/conda @ test_create::test_force_remove fails :shrug:\n                subpriority = 1\n            else:\n                subpriority = subprio_index\n                subprio_index -= 1\n\n            log.debug(\n                \"Channel: %s, prio: %s : %s\",\n                repo_info.url_no_cred,\n                priority,\n                subpriority,\n            )\n            self.db.set_repo_priority(repo_info.repo, Priorities(priority, subpriority))\n\n    # region Repoquery\n    #################\n\n    def search(\n        self,\n        queries: Iterable[str | MatchSpec] | str | MatchSpec,\n        return_type: Literal[\"records\", \"dict\", \"raw\"] = \"records\",\n    ) -> list[PackageRecord] | dict[str, Any] | QueryResult:\n        if isinstance(queries, (str, MatchSpec)):\n            queries = [queries]\n        queries = list(map(str, queries))\n        result = Query.find(self.db, queries)\n        return self._process_query_result(result, return_type)\n\n    def depends(\n        self,\n        query: str | MatchSpec,\n        tree: bool = False,\n        return_type: Literal[\"records\", \"dict\", \"raw\"] = \"records\",\n    ) -> list[PackageRecord] | dict[str, Any] | QueryResult:\n        query = str(query)\n        result = Query.depends(self.db, query, tree)\n        return self._process_query_result(result, return_type)\n\n    def whoneeds(\n        self,\n        query: str | MatchSpec,\n        tree: bool = False,\n        return_type: Literal[\"records\", \"dict\", \"raw\"] = \"records\",\n    ) -> list[PackageRecord] | dict[str, Any] | QueryResult:\n        query = str(query)\n        result = Query.whoneeds(self.db, query, tree)\n        return self._process_query_result(result, return_type)\n\n    def explicit_pool(self, specs: Iterable[MatchSpec]) -> tuple[str, ...]:\n        \"\"\"\n        Returns all the package names that (might) depend on the passed specs\n        \"\"\"\n        explicit_pool: set[str] = set()\n        for spec in specs:\n            pkg_records = self.depends(spec.dist_str())\n            for record in pkg_records:\n                explicit_pool.add(record.name)\n        return tuple(explicit_pool)\n\n    def _process_query_result(\n        self,\n        result: QueryResult,\n        return_type: Literal[\"records\", \"dict\", \"raw\"] = \"records\",\n    ) -> list[PackageRecord] | dict[str, Any] | QueryResult:\n        if return_type == \"raw\":\n            return result\n        result = result.to_dict()\n        if result.get(\"result\", {}).get(\"status\") != \"OK\":\n            query_type = result.get(\"query\", {}).get(\"type\", \"<Unknown>\")\n            query = result.get(\"query\", {}).get(\"query\", \"<Unknown>\")\n            error_msg = result.get(\"result\", {}).get(\"msg\", f\"Faulty response: {result.json()}\")\n            raise ValueError(f\"{query_type} query '{query}' failed: {error_msg}\")\n        if return_type == \"records\":\n            pkg_records = []\n            for pkg in result[\"result\"][\"pkgs\"]:\n                record = PackageRecord(**pkg)\n                pkg_records.append(record)\n            return pkg_records\n        # return_type == \"dict\"\n        return result\n\n    # endregion\n"
  },
  {
    "path": "conda_libmamba_solver/mamba_utils.py",
    "content": "# Copyright (C) 2019 QuantStack and the Mamba contributors.\n# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\n# TODO: Temporarily vendored from mamba.utils v0.19 on 2021.12.02\n# Decide what to do with it when we split into a plugin\n# 2022.02.15: updated vendored parts to v0.21.2\n# 2022.11.14: only keeping channel prioritization and context initialization logic now\n# 2024.09.24: parameterize init_api_context\n\nfrom __future__ import annotations\n\nimport os\nimport logging\nimport sys\nfrom collections.abc import Iterable\nfrom functools import lru_cache\nfrom importlib.metadata import version\nfrom pathlib import Path\nfrom typing import TYPE_CHECKING, Iterable\n\nimport libmambapy\nfrom conda.base.constants import ChannelPriority\nfrom conda.base.context import context\nfrom conda.common.compat import on_win\n\nif TYPE_CHECKING:\n    from .index import _ChannelRepoInfo\n\n\n\nlog = logging.getLogger(f\"conda.{__name__}\")\n_db_log = logging.getLogger(\"conda.libmamba.db\")\n_libmamba_context = None\n\n@lru_cache(maxsize=1)\ndef mamba_version() -> str:\n    return version(\"libmambapy\")\n\n\ndef _get_base_url(url: str, name: str | None = None) -> str:\n    tmp = url.rsplit(\"/\", 1)[0]\n    if name:\n        if tmp.endswith(name):\n            return tmp.rsplit(\"/\", 1)[0]\n    return tmp\n\n\ndef init_libmamba_context(\n    channels: Iterable[str] | None = None,\n    platform: str | None = None,\n    target_prefix: str | None = None,\n) -> libmambapy.Context:\n    global _libmamba_context\n    if _libmamba_context is None:\n        # This function has to be called BEFORE 1st initialization of the context\n        _libmamba_context = libmambapy.Context(\n            libmambapy.ContextOptions(\n                enable_signal_handling=False,\n                enable_logging=True,\n            )\n        )\n    libmamba_context = _libmamba_context\n\n    # Output params\n    libmamba_context.output_params.json = context.json\n    if libmamba_context.output_params.json:\n        libmambapy.cancel_json_output(libmamba_context)\n    libmamba_context.output_params.quiet = context.quiet\n    libmamba_context.output_params.verbosity = context.verbosity\n    libmamba_context.set_log_level(\n        {\n            4: libmambapy.LogLevel.TRACE,\n            3: libmambapy.LogLevel.DEBUG,\n            2: libmambapy.LogLevel.INFO,\n            1: libmambapy.LogLevel.WARNING,\n            0: libmambapy.LogLevel.ERROR,\n        }[context.verbosity]\n    )\n\n    # Prefix params\n    libmamba_context.prefix_params.conda_prefix = context.conda_prefix\n    libmamba_context.prefix_params.root_prefix = context.root_prefix\n    libmamba_context.prefix_params.target_prefix = str(\n        target_prefix if target_prefix is not None else context.target_prefix\n    )\n\n    # Networking params -- we always operate offline from libmamba's perspective\n    libmamba_context.remote_fetch_params.user_agent = context.user_agent\n    libmamba_context.local_repodata_ttl = context.local_repodata_ttl\n    libmamba_context.offline = True\n    libmamba_context.use_index_cache = True\n\n    # General params\n    libmamba_context.add_pip_as_python_dependency = context.add_pip_as_python_dependency\n    libmamba_context.always_yes = context.always_yes\n    libmamba_context.dry_run = context.dry_run\n    libmamba_context.envs_dirs = context.envs_dirs\n    libmamba_context.pkgs_dirs = context.pkgs_dirs\n    libmamba_context.use_lockfiles = False\n    libmamba_context.use_only_tar_bz2 = context.use_only_tar_bz2\n\n    # Channels and platforms\n    libmamba_context.platform = platform if platform is not None else context.subdir\n    libmamba_context.channels = list(channels) if channels is not None else context.channels\n    libmamba_context.channel_alias = str(\n        _get_base_url(context.channel_alias.url(with_credentials=True))\n    )\n\n    RESERVED_NAMES = {\"local\", \"defaults\"}\n    additional_custom_channels = {}\n    for el in context.custom_channels:\n        if context.custom_channels[el].canonical_name not in RESERVED_NAMES:\n            additional_custom_channels[el] = _get_base_url(\n                context.custom_channels[el].url(with_credentials=True), el\n            )\n    libmamba_context.custom_channels = additional_custom_channels\n\n    additional_custom_multichannels = {\n        \"local\": list(context.conda_build_local_paths),\n        \"defaults\": [channel.url(with_credentials=True) for channel in context.default_channels],\n    }\n    for el in context.custom_multichannels:\n        if el not in RESERVED_NAMES:\n            additional_custom_multichannels[el] = []\n            for c in context.custom_multichannels[el]:\n                additional_custom_multichannels[el].append(\n                    _get_base_url(c.url(with_credentials=True))\n                )\n    libmamba_context.custom_multichannels = additional_custom_multichannels\n\n    libmamba_context.default_channels = [\n        _get_base_url(x.url(with_credentials=True)) for x in context.default_channels\n    ]\n\n    if context.channel_priority is ChannelPriority.STRICT:\n        libmamba_context.channel_priority = libmambapy.ChannelPriority.Strict\n    elif context.channel_priority is ChannelPriority.FLEXIBLE:\n        libmamba_context.channel_priority = libmambapy.ChannelPriority.Flexible\n    elif context.channel_priority is ChannelPriority.DISABLED:\n        libmamba_context.channel_priority = libmambapy.ChannelPriority.Disabled\n\n    return libmamba_context\n\n\ndef logger_callback(level: libmambapy.solver.libsolv.LogLevel, msg: str, logger: logging.Logger =_db_log) -> None:\n    # from libmambapy.solver.libsolv import LogLevel\n    # levels = {\n    #     LogLevel.Debug: logging.DEBUG, # 0 -> 10\n    #     LogLevel.Warning: logging.WARNING, # 1 -> 30\n    #     LogLevel.Error: logging.ERROR, # 2 -> 40\n    #     LogLevel.Fatal: logging.FATAL, # 3 -> 50\n    # }\n    if level.value == 0:\n        # This incurs a large performance hit!\n        logger.debug(msg)\n    else:\n        logger.log((level.value + 2) * 10, msg)\n\n\ndef palettes_and_formats() -> tuple[libmambapy.solver.ProblemsMessageFormat, libmambapy.solver.ProblemsMessageFormat]:\n    # _indents = [\"│  \", \"   \", \"├─ \", \"└─ \"]\n    if os.getenv(\"NO_COLOR\"):\n        use_color = False\n    elif os.getenv(\"FORCE_COLOR\"):\n        use_color = True\n    else:\n        use_color = all([sys.stdout.isatty(), sys.stdin.isatty()])\n    palette_no_color = libmambapy.Palette.no_color()\n    problems_format_nocolor = libmambapy.solver.ProblemsMessageFormat()\n    problems_format_nocolor.unavailable = palette_no_color.failure\n    problems_format_nocolor.available = palette_no_color.success\n    problems_format_auto = (\n        libmambapy.solver.ProblemsMessageFormat()\n        if use_color \n        else problems_format_nocolor\n    )\n\n    return problems_format_auto, problems_format_nocolor\n\n\nproblems_format_auto, problems_format_nocolor = palettes_and_formats()\n"
  },
  {
    "path": "conda_libmamba_solver/plugin.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nEntry points for the conda plugin system\n\"\"\"\n\nfrom conda.common.configuration import PrimitiveParameter\nfrom conda.plugins import hookimpl\nfrom conda.plugins.types import CondaSetting, CondaSolver, CondaSubcommand\n\nfrom .repoquery import configure_parser, repoquery\nfrom .solver import LibMambaSolver\n\n\n@hookimpl\ndef conda_solvers():\n    \"\"\"\n    The conda plugin hook implementation to load the solver into conda.\n    \"\"\"\n    yield CondaSolver(\n        name=\"libmamba\",\n        backend=LibMambaSolver,\n    )\n\n\n@hookimpl\ndef conda_subcommands():\n    yield CondaSubcommand(\n        name=\"repoquery\",\n        summary=\"Advanced search for repodata.\",\n        action=repoquery,\n        configure_parser=configure_parser,\n    )\n\n\n@hookimpl\ndef conda_settings():\n    \"\"\"\n    Define all settings specific to the conda-libmamba-solver plugin.\n    \"\"\"\n    yield CondaSetting(\n        name=\"use_sharded_repodata\",\n        description=\"Enable use of sharded repodata when available.\",\n        parameter=PrimitiveParameter(True, element_type=bool),\n    )\n"
  },
  {
    "path": "conda_libmamba_solver/repoquery.py",
    "content": "# Copyright (C) 2019, QuantStack\n# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nImplementation of the 'conda repoquery' subcommand.\n\nBased on 'mamba repoquery' for v1.x.\n\"\"\"\n\nimport argparse\nimport json\nimport sys\nfrom itertools import chain\n\nfrom conda.base.context import context\nfrom conda.cli import conda_argparse\nfrom conda.core.prefix_data import PrefixData\nfrom conda.exceptions import CondaError\nfrom conda.models.channel import Channel\nfrom conda.models.match_spec import MatchSpec\nfrom conda.reporters import get_spinner\nfrom libmambapy import Context as LibmambaContext\n\nfrom .index import LibMambaIndexHelper\n\n\ndef configure_parser(parser: argparse.ArgumentParser):\n    package_cmds = argparse.ArgumentParser(add_help=False)\n    package_cmds.add_argument(\"specs\", help=\"The target package(s).\", nargs=\"+\")\n    package_grp = package_cmds.add_argument_group(\"Subcommand options\")\n    package_grp.add_argument(\n        \"-i\",\n        \"--installed\",\n        action=\"store_true\",\n        default=True,\n        help=argparse.SUPPRESS,\n    )\n    package_grp.add_argument(\n        \"-p\",\n        \"--platform\",\n        default=context.subdir,\n        help=\"Platform/subdir to search packages for. Defaults to current platform.\",\n    )\n    package_grp.add_argument(\n        \"--no-installed\", action=\"store_true\", help=\"Do not search currently installed packages.\"\n    )\n    package_grp.add_argument(\n        \"--pretty\", action=\"store_true\", help=\"Prettier output with more details.\"\n    )\n\n    package_grp.add_argument(\n        \"-a\",\n        \"--all-channels\",\n        action=\"store_true\",\n        help=\"Look at all channels (for depends / whoneeds).\",\n    )\n    package_grp.add_argument(\n        \"--use-cache-only\",\n        action=\"store_true\",\n        help=\"Search in pkgs_dirs too\",\n    )\n\n    view_cmds = argparse.ArgumentParser(add_help=False)\n    view_grp = view_cmds.add_argument_group(\"Dependency options\")\n    view_grp.add_argument(\n        \"-t\", \"--tree\", action=\"store_true\", help=\"Show dependencies in a tree-like format.\"\n    )\n    view_grp.add_argument(\n        \"--recursive\", action=\"store_true\", help=\"Show dependencies recursively.\"\n    )\n\n    subparser = parser.add_subparsers(dest=\"subcmd\")\n\n    whoneeds = subparser.add_parser(\n        \"whoneeds\",\n        help=\"Show packages that depend on this package.\",\n        parents=[package_cmds, view_cmds],\n    )\n\n    depends = subparser.add_parser(\n        \"depends\",\n        help=\"Show dependencies of this package.\",\n        parents=[package_cmds, view_cmds],\n    )\n\n    search = subparser.add_parser(\n        \"search\",\n        help=\"Show all available package versions.\",\n        parents=[package_cmds],\n    )\n\n    for cmd in (whoneeds, search, depends):\n        conda_argparse.add_parser_channels(cmd)\n        conda_argparse.add_parser_networking(cmd)\n        conda_argparse.add_parser_known(cmd)\n        conda_argparse.add_parser_json(cmd)\n\n\ndef repoquery(args: argparse.Namespace) -> int:\n    if not args.subcmd:\n        print(\"repoquery needs a subcommand (search, depends or whoneeds), e.g.:\", file=sys.stderr)\n        print(\"    conda repoquery search python\\n\", file=sys.stderr)\n        return 1\n\n    cli_flags = [getattr(args, attr, False) for attr in (\"tree\", \"recursive\", \"pretty\")]\n    if sum([context.json, *cli_flags]) > 1:\n        print(\"Use only one of --json, --tree, --recursive and --pretty.\", file=sys.stderr)\n        return 1\n\n    if hasattr(args, \"channel\"):\n        channels = args.channel\n    else:\n        channels = None\n    if args.all_channels or channels is None:\n        if channels:\n            print(\"WARNING: Using all channels instead of configured channels\\n\", file=sys.stderr)\n        channels = context.channels\n\n    use_installed = args.installed\n    if args.no_installed:\n        use_installed = False\n\n    # if we're asking for depends and channels are given, disregard\n    # installed packages to prevent weird mixing\n    if args.subcmd in (\"depends\", \"whoneeds\") and use_installed and channels:\n        use_installed = False\n\n    if args.subcmd == \"search\" and not args.installed:\n        only_installed = False\n    elif args.all_channels or (channels and len(channels)):\n        only_installed = False\n    else:\n        only_installed = True\n\n    if only_installed and args.no_installed:\n        print(\"No channels selected. Use -a to search all channels.\", file=sys.stderr)\n        return 1\n\n    if use_installed:\n        prefix_data = PrefixData(context.target_prefix)\n        prefix_data.load()\n        installed_records = prefix_data.iter_records()\n    else:\n        installed_records = ()\n\n    if args.use_cache_only:\n        with get_spinner(\"Collecting package metadata from pkgs_dirs\"):\n            index = LibMambaIndexHelper(\n                installed_records=(),\n                channels=(),\n                subdirs=(args.platform, \"noarch\"),\n                repodata_fn=context.repodata_fns[-1],\n                pkgs_dirs=context.pkgs_dirs,\n            )\n    else:\n        channels_from_specs = []\n        for spec in args.specs:\n            ms = MatchSpec(spec)\n            channel = ms.get_exact_value(\"channel\")\n            if channel:\n                channels_from_specs.append(channel)\n        with get_spinner(\"Collecting package metadata\"):\n            index = LibMambaIndexHelper(\n                installed_records=installed_records,\n                channels=[\n                    Channel(c) for c in chain(channels or (), dict.fromkeys(channels_from_specs))\n                ],\n                subdirs=(args.platform, \"noarch\"),\n                repodata_fn=context.repodata_fns[-1],\n            )\n\n    if args.subcmd == \"search\":\n        result = index.search(args.specs, return_type=\"raw\")\n        if context.json:\n            print(json.dumps(result.groupby(\"name\").to_dict(), indent=2))\n        elif getattr(args, \"pretty\", None):\n            print(result.pretty(show_all_builds=True))\n        else:\n            print(result.groupby(\"name\").table())\n    elif args.subcmd == \"depends\":\n        if len(args.specs) > 1:\n            raise CondaError(\"Only one query supported for 'depends'.\")\n        result = index.depends(\n            args.specs[0],\n            tree=getattr(args, \"tree\", False) or getattr(args, \"recursive\", False),\n            return_type=\"raw\",\n        )\n        if context.json:\n            print(json.dumps(result.to_dict(), indent=2))\n        elif getattr(args, \"tree\", None) or getattr(args, \"pretty\", None):\n            # TODO: Report upstream\n            raise CondaError(\"--tree currently not available for this subcommand.\")\n            print(result.tree(LibmambaContext.instance().graphics_params))\n        else:\n            print(result.sort(\"name\").table())\n    elif args.subcmd == \"whoneeds\":\n        if len(args.specs) > 1:\n            raise CondaError(\"Only one query supported for 'whoneeds'.\")\n        result = index.whoneeds(\n            args.specs[0],\n            tree=getattr(args, \"tree\", False) or getattr(args, \"recursive\", False),\n            return_type=\"raw\",\n        )\n        if context.json:\n            print(json.dumps(result.to_dict(), indent=2))\n        elif getattr(args, \"tree\", None) or getattr(args, \"pretty\", None):\n            # TODO: Report upstream\n            raise CondaError(\"--tree currently not available for this subcommand.\")\n            print(result.tree(LibmambaContext.instance().graphics_params))\n        else:\n            print(result.sort(\"name\").table())\n    else:\n        raise CondaError(f\"Unrecognized subcommand: {args.subcmd}\")\n\n    return 0\n"
  },
  {
    "path": "conda_libmamba_solver/shards.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nModels for sharded repodata, and to make monolithic repodata look like sharded\nrepodata.\n\"\"\"\n\nfrom __future__ import annotations\n\nimport abc\nimport concurrent.futures\nimport functools\nimport json\nimport logging\nfrom collections import defaultdict\nfrom typing import TYPE_CHECKING\nfrom urllib.parse import urljoin, urlparse, urlunparse, uses_relative\n\nimport conda.exceptions\nimport conda.gateways.repodata\nimport msgpack\nimport zstandard\nfrom conda.base.context import context\nfrom conda.core.subdir_data import SubdirData\nfrom conda.gateways.connection.session import get_session\nfrom conda.gateways.repodata import (\n    _add_http_value_to_dict,\n    conda_http_errors,\n)\nfrom conda.models.channel import Channel\nfrom libmambapy.bindings import specs\n\nfrom . import shards_cache\n\nlog = logging.getLogger(__name__)\n\n\nif TYPE_CHECKING:\n    from collections.abc import Iterable, KeysView\n\n    from conda.gateways.repodata import RepodataCache\n    from requests import Response\n\n    from conda_libmamba_solver.shards_typing import RepodataDict, ShardsIndexDict\n\n    from .shards_typing import PackageRecordDict, ShardDict\n\nSHARDS_CONNECTIONS_DEFAULT = 10\nZSTD_MAX_SHARD_SIZE = 2**20 * 16  # maximum size necessary when compressed data has no size header\n\n# Schemes that urljoin handles correctly (registered in urllib.parse.uses_relative)\n_URLJOIN_SAFE_SCHEMES = frozenset(uses_relative)\n\n\ndef _safe_urljoin_with_slash(base_url: str, relative_url: str = \"\") -> str:\n    \"\"\"\n    Join base_url with relative_url, ensuring proper handling of all URL schemes.\n\n    Python's urllib.parse.urljoin only handles schemes registered in\n    ``urllib.parse.uses_relative``. For unregistered schemes like ``s3://``,\n    it returns just ``\".\"`` instead of the resolved URL. This function falls\n    back to a scheme-swap workaround for those cases.\n\n    The result always ends with \"/\" to enable proper string concatenation with filenames.\n\n    See: https://github.com/conda/conda-libmamba-solver/issues/866\n    \"\"\"\n    parsed = urlparse(base_url)\n\n    # For schemes that urljoin handles correctly, use the standard behavior\n    if parsed.scheme in _URLJOIN_SAFE_SCHEMES:\n        # Standard urljoin behavior: join with relative_url, then \".\" for trailing slash\n        result = urljoin(urljoin(base_url, relative_url), \".\")\n        return result\n\n    # For unregistered schemes (e.g. s3://), urljoin drops the host.\n    # Work around that by temporarily swapping in https://, then restoring\n    # the original scheme on the result.\n    relative_parsed = urlparse(relative_url)\n    if not relative_parsed.scheme and parsed.scheme:\n        https_base_url = urlunparse(parsed._replace(scheme=\"https\"))\n        joined_https = urljoin(urljoin(https_base_url, relative_url), \".\")\n        result = urlunparse(urlparse(joined_https)._replace(scheme=parsed.scheme))\n    else:\n        result = urljoin(urljoin(base_url, relative_url), \".\")\n\n    # Ensure trailing slash for proper concatenation\n    if not result.endswith(\"/\"):\n        result += \"/\"\n\n    return result\n\n\n# For reference, the largest shard \"conda-forge/linux-64/vim\" is 2608283 bytes\n# or < 2**19*5 decompressed (486155 bytes compressed); the index is 575219 bytes\n# decompressed (514039 bytes compressed) and is mostly uncompressible hash data.\n\n\ndef _shards_connections() -> int:\n    \"\"\"\n    If context.repodata_threads is not set, find the size of the connection pool\n    in a typical https:// session. This should significantly reduce dropped\n    connections. We match requests' default 10.\n\n    Is this shared between all sessions? Or do we get a different pool for a\n    different get_session(url)?\n\n    Other adapters (file://, s3://) used in conda would have different\n    concurrency behavior;  we are not prepared to have separate threadpools per\n    connection type.\n    \"\"\"\n    if context.repodata_threads is not None:\n        return context.repodata_threads\n    return SHARDS_CONNECTIONS_DEFAULT\n\n\ndef ensure_hex_hash(record: PackageRecordDict):\n    \"\"\"\n    Convert bytes checksums to hex; leave unchanged if already str.\n    \"\"\"\n    for hash_type in \"sha256\", \"md5\":\n        if hash_value := record.get(hash_type):\n            if not isinstance(hash_value, str):\n                record[hash_type] = bytes(hash_value).hex()\n    return record\n\n\n@functools.cache\ndef spec_to_package_name(spec: str) -> str:\n    \"\"\"\n    Given a dependency spec, return the package name.\n    \"\"\"\n    # Note: hope for no MatchSpec-without-name in repodata, although it is\n    # possible in the MatchSpec grammar.\n    parsed_spec = specs.MatchSpec.parse(spec)\n    name = str(parsed_spec.name)\n    return name\n\n\ndef shard_mentioned_packages(shard: ShardDict, extra: Iterable[str] = ()) -> Iterable[str]:\n    \"\"\"\n    Return all dependency names mentioned in a shard, not including the shard's\n    own package name. Additional names can be injected via ``extra``.\n    \"\"\"\n    unique_specs = set()\n    for package in (*shard[\"packages\"].values(), *shard[\"packages.conda\"].values()):\n        ensure_hex_hash(package)  # otherwise we could do this at serialization\n        for spec in (*package.get(\"depends\", ()),):  # , *package.get(\"constrains\", ())):\n            if spec in unique_specs:\n                continue\n            unique_specs.add(spec)\n            name = spec_to_package_name(spec)\n            yield name  # not much improvement from only yielding unique names\n    yield from extra\n\n\nclass ShardBase(abc.ABC):\n    \"\"\"\n    Abstract base class for shard-like objects.\n\n    Defines the common interface for both sharded repodata (Shards)\n    and traditional repodata presented as shards (ShardLike).\n    \"\"\"\n\n    url: str\n    repodata_no_packages: RepodataDict\n    visited: dict[str, ShardDict | None]\n    _base_url: str\n\n    @property\n    @abc.abstractmethod\n    def package_names(self) -> KeysView[str]:\n        \"\"\"Return the names of all packages available in this shard collection.\"\"\"\n        ...\n\n    @property\n    def base_url(self) -> str:\n        \"\"\"\n        Return self.url joined with base_url from repodata, or self.url if no\n        base_url was present. Packages are found here.\n\n        Note base_url can be a relative or an absolute url.\n        Uses _safe_urljoin_with_slash to handle non-HTTP schemes (s3://, etc.).\n        \"\"\"\n        return _safe_urljoin_with_slash(self.url, self._base_url)\n\n    def __contains__(self, package: str) -> bool:\n        \"\"\"Check if a package is available in this shard collection.\"\"\"\n        return package in self.package_names\n\n    @abc.abstractmethod\n    def shard_url(self, package: str) -> str:\n        \"\"\"\n        Return shard URL for a given package. For monolithic repodata, should\n        not be fetched but is a unique identifier.\n\n        Raise KeyError if package is not in the index.\n        \"\"\"\n        ...\n\n    @abc.abstractmethod\n    def shard_loaded(self, package: str) -> bool:\n        \"\"\"\n        Return True if the given package's shard is in memory.\n        \"\"\"\n        ...\n\n    def visit_package(self, package: str) -> ShardDict:\n        \"\"\"\n        Return a shard that is already loaded in memory and mark as visited.\n        \"\"\"\n        ...\n\n    def visit_shard(self, package: str, shard: ShardDict):\n        \"\"\"\n        Store new shard data in the visited dict.\n        \"\"\"\n        self.visited[package] = shard\n\n    @abc.abstractmethod\n    def fetch_shard(self, package: str) -> ShardDict:\n        \"\"\"\n        Fetch an individual shard for the given package.\n        \"\"\"\n        ...\n\n    @abc.abstractmethod\n    def fetch_shards(self, packages: Iterable[str]) -> dict[str, ShardDict]:\n        \"\"\"\n        Fetch multiple shards in one go.\n        \"\"\"\n        ...\n\n    def build_repodata(self) -> RepodataDict:\n        \"\"\"\n        Return monolithic repodata including all visited shards.\n        \"\"\"\n        repodata: RepodataDict = {\n            **self.repodata_no_packages,\n            \"packages\": {},\n            \"packages.conda\": {},\n        }\n        for _, shard in self.visited.items():\n            if shard is None:\n                continue  # recorded visited but not available shards\n            for package_group in (\"packages\", \"packages.conda\"):\n                repodata[package_group].update(shard[package_group])\n        return repodata\n\n\nclass ShardLike(ShardBase):\n    \"\"\"\n    Present a \"classic\" repodata.json as per-package shards.\n    \"\"\"\n\n    def __init__(self, repodata: RepodataDict, url: str = \"\"):\n        \"\"\"\n        url: must be unique for all ShardLike used together.\n        \"\"\"\n        self.repodata_no_packages: RepodataDict = {\n            **repodata,\n            \"packages\": {},\n            \"packages.conda\": {},\n        }\n        all_packages = {\n            \"packages\": repodata.get(\"packages\", {}),\n            \"packages.conda\": repodata.get(\"packages.conda\", {}),\n        }\n        self.url = url\n\n        shards = defaultdict(lambda: {\"packages\": {}, \"packages.conda\": {}})\n\n        for group_name, group in all_packages.items():\n            for package, record in group.items():\n                name = record[\"name\"]\n                shards[name][group_name][package] = record\n\n        # defaultdict behavior no longer wanted\n        self.shards: dict[str, ShardDict] = dict(shards)  # type: ignore\n\n        # used to write out repodata subset\n        self.visited: dict[str, ShardDict | None] = {}\n\n        # alternate location for packages, if not self.url\n        try:\n            base_url = self.repodata_no_packages[\"info\"][\"base_url\"]\n            if not isinstance(base_url, str):\n                log.warning(f'repodata[\"info\"][\"base_url\"] was not a str, got {type(base_url)}')\n                raise TypeError()\n            self._base_url = base_url\n        except KeyError:\n            self._base_url = \"\"\n\n    def __repr__(self):\n        left, right = super().__repr__().split(maxsplit=1)\n        return f\"{left} {self.url} {right}\"\n\n    @property\n    def package_names(self) -> KeysView[str]:\n        return self.shards.keys()\n\n    def shard_url(self, package: str) -> str:\n        \"\"\"\n        Return shard URL for a given package.\n\n        Raise KeyError if package is not in the index.\n        \"\"\"\n        self.shards[package]\n        return f\"{self.url}#{package}\"\n\n    def shard_loaded(self, package: str) -> bool:\n        \"\"\"\n        Return True if the given package's shard is in memory.\n        \"\"\"\n        return package in self.shards\n\n    def visit_package(self, package: str) -> ShardDict:\n        \"\"\"\n        Return a shard that is already in memory and mark as visited.\n        \"\"\"\n        shard = self.fetch_shard(package)\n        assert shard is not None\n        return shard\n\n    def fetch_shard(self, package: str) -> ShardDict:\n        \"\"\"\n        \"Fetch\" an individual shard.\n\n        Update self.visited with all not-None packages.\n\n        Raise KeyError if package is not in the index.\n        \"\"\"\n        shard = self.shards[package]\n        self.visited[package] = shard\n        return shard\n\n    def fetch_shards(self, packages: Iterable[str]) -> dict[str, ShardDict]:\n        \"\"\"\n        Fetch multiple shards in one go.\n\n        Update self.visited with all not-None packages.\n        \"\"\"\n        return {package: self.fetch_shard(package) for package in packages}\n\n\ndef _shards_base_url(url, shards_base_url) -> str:\n    \"\"\"\n    Return shards_base_url joined with base_url and url.\n    Note shards_base_url can be a relative or an absolute url.\n    Uses _safe_urljoin_with_slash to handle non-HTTP schemes (s3://, etc.).\n    \"\"\"\n    if shards_base_url and not shards_base_url.endswith(\"/\"):\n        shards_base_url += \"/\"\n    return _safe_urljoin_with_slash(url, shards_base_url)\n\n\nclass Shards(ShardBase):\n    \"\"\"\n    Handle repodata_shards.msgpack.zst and individual per-package shards.\n    \"\"\"\n\n    _shards_base_url: str\n    shards_cache: shards_cache.ShardCache | None\n\n    def __init__(\n        self, shards_index: ShardsIndexDict, url: str, cache: shards_cache.ShardCache | None = None\n    ):\n        \"\"\"\n        Args:\n            shards_index: raw parsed msgpack dict. Don't change it or base_url,\n            shards_base_url will be wrong.\n            url: URL of repodata_shards.msgpack.zst\n        \"\"\"\n        self.shards_index = shards_index\n        self.url = url\n        self.shards_cache = cache\n\n        # https://github.com/conda/conda-index/pull/209 ensures that sharded\n        # repodata will always include base_url, even if it is an empty string;\n        # rattler/pixi require these keys.\n        self._base_url = shards_index[\"info\"][\"base_url\"]\n\n        # doesn't track changes to self.shards_index\n        self._shards_base_url = _shards_base_url(\n            self.url, self.shards_index[\"info\"].get(\"shards_base_url\", \"\")\n        )\n\n        # Use the channel's base URL to share session amongst subdir locations\n        channel_base_url = Channel(self.shards_base_url).base_url\n        self.session = get_session(channel_base_url)\n\n        self.repodata_no_packages = {\n            \"info\": shards_index[\"info\"],\n            \"packages\": {},\n            \"packages.conda\": {},\n            \"repodata_version\": 2,\n        }\n\n        # used to write out repodata subset\n        # not used in traversal algorithm\n        self.visited: dict[str, ShardDict | None] = {}\n\n    @property\n    def package_names(self):\n        return self.packages_index.keys()\n\n    @property\n    def packages_index(self):\n        return self.shards_index[\"shards\"]\n\n    @property\n    def shards_base_url(self) -> str:\n        \"\"\"\n        Return self.url joined with shards_base_url.\n        Note shards_base_url can be a relative or an absolute url.\n        \"\"\"\n        return self._shards_base_url\n\n    def shard_url(self, package: str) -> str:\n        \"\"\"\n        Return shard URL for a given package.\n\n        Raise KeyError if package is not in the index.\n        \"\"\"\n        shard_name = f\"{bytes(self.packages_index[package]).hex()}.msgpack.zst\"\n        # \"Individual shards are stored under the URL <shards_base_url><sha256>.msgpack.zst\"\n        return f\"{self.shards_base_url}{shard_name}\"\n\n    def shard_loaded(self, package: str) -> bool:\n        \"\"\"\n        Return True if the given package's shard is in memory.\n        \"\"\"\n        return package in self.visited\n\n    def visit_package(self, package: str) -> ShardDict:\n        \"\"\"\n        Return a shard that is already in memory and mark as visited.\n        \"\"\"\n        shard = self.visited[package]\n        return shard\n\n    def fetch_shard(self, package: str) -> ShardDict:\n        \"\"\"\n        Fetch an individual shard for the given package.\n\n        Default implementation calls fetch_shards() with a single package.\n        Subclasses may override for more efficient single-fetch operations.\n\n        Raise KeyError if package is not in the index.\n        \"\"\"\n        return self.fetch_shards([package])[package]\n\n    def fetch_shards(self, packages: Iterable[str]) -> dict[str, ShardDict]:\n        \"\"\"\n        Return mapping of *package names* to Shard for given packages.\n\n        If a shard is already in self.visited, it is not fetched again.\n        \"\"\"\n        results = {}\n\n        def fetch(s, url, package_to_fetch):\n            timeout = (\n                context.remote_connect_timeout_secs,\n                context.remote_read_timeout_secs,\n            )\n            response = s.get(url, timeout=timeout)\n            response.raise_for_status()\n            data = response.content\n\n            return shards_cache.AnnotatedRawShard(\n                url=url, package=package_to_fetch, compressed_shard=data\n            )\n\n        packages = sorted(list(packages))\n        urls_packages = {}  # package shards to fetch\n        for package in packages:\n            if package in self.visited:\n                results[package] = self.visited[package]\n            else:\n                urls_packages[self.shard_url(package)] = package\n\n        with concurrent.futures.ThreadPoolExecutor(max_workers=_shards_connections()) as executor:\n            futures = {\n                executor.submit(fetch, self.session, url, package): (url, package)\n                for url, package in urls_packages.items()\n                if package not in results\n            }\n            for future in concurrent.futures.as_completed(futures):\n                log.debug(\". %s\", futures[future])\n                url, package = futures[future]\n                self._process_fetch_result(future, url, package, results)\n\n        self.visited.update(results)\n\n        return results\n\n    def _process_fetch_result(self, future, url, package, results):\n        \"\"\"\n        Process a single fetched shard.\n        \"\"\"\n        # Fail early if no cache to store the result.\n        if self.shards_cache is None:\n            raise ValueError(\"self.shards_cache is None\")\n\n        with conda_http_errors(url, package):\n            fetch_result = future.result()\n\n        # Decompress and save record\n        results[fetch_result.package] = msgpack.loads(\n            zstandard.decompress(\n                fetch_result.compressed_shard, max_output_size=ZSTD_MAX_SHARD_SIZE\n            )\n        )\n        self.shards_cache.insert(fetch_result)\n\n\ndef _repodata_shards(url, cache: RepodataCache) -> bytes:\n    \"\"\"\n    Fetch shards index with cache.\n\n    Update cache state.\n\n    Return shards data, either newly fetched or from cache.\n\n    In offline mode, returns cached data even if expired. If no cache exists\n    in offline mode, raises RepodataIsEmpty to signal unavailability.\n    \"\"\"\n    # In offline mode, return cached data if available, even if expired\n    if context.offline:\n        if cache.cache_path_shards.exists():\n            return cache.cache_path_shards.read_bytes()\n        else:\n            # In offline mode with no cache, signal that shards are not available.\n            # The caller (fetch_shards_index) catches RepodataIsEmpty and falls back to non-sharded repodata.\n            raise conda.gateways.repodata.RepodataIsEmpty(url, status_code=404, response=None)\n\n    session = get_session(url)\n\n    state = cache.state\n    headers = {}\n    etag = state.etag\n    last_modified = state.mod\n    if etag:\n        headers[\"If-None-Match\"] = str(etag)\n    if last_modified:\n        headers[\"If-Modified-Since\"] = str(last_modified)\n    filename = \"repodata_shards.msgpack.zst\"\n\n    with conda_http_errors(url, filename):\n        timeout = (\n            context.remote_connect_timeout_secs,\n            context.remote_read_timeout_secs,\n        )\n        response: Response = session.get(\n            url, headers=headers, proxies=session.proxies, timeout=timeout\n        )\n        response.raise_for_status()\n        response_bytes = response.content\n\n    if response.status_code == 304:\n        # should we save cache-control to state here to put another n\n        # seconds on the \"make a remote request\" clock and/or touch cache\n        # mtime\n        #\n        # Hold the cache lock while reading: RepodataCache.replace() does\n        # unlink()+rename() under this same lock, so without it a concurrent\n        # writer can briefly remove the file between those two operations,\n        # causing FileNotFoundError on Windows.\n        with cache.lock(\"r+\"):\n            return cache.cache_path_shards.read_bytes()\n\n    saved_fields = {conda.gateways.repodata.URL_KEY: url}\n    for header, key in (\n        (\"Etag\", conda.gateways.repodata.ETAG_KEY),\n        (\n            \"Last-Modified\",\n            conda.gateways.repodata.LAST_MODIFIED_KEY,\n        ),\n        (\"Cache-Control\", conda.gateways.repodata.CACHE_CONTROL_KEY),\n    ):\n        _add_http_value_to_dict(response, header, saved_fields, key)\n\n    state.update(saved_fields)\n\n    # should we return the response and let caller save cache data to state?\n    return response_bytes\n\n\n# Like conda.gateways.repodata.jlap.fetch. If this returns True, then we mark\n# shards as not supported; otherwise, we will check again next time.\ndef _is_http_error_most_400_codes(status_code: str | int) -> bool:\n    \"\"\"\n    Determine whether the `HTTPError` is an HTTP 400 error code (except for 416).\n    \"\"\"\n    return isinstance(status_code, int) and 400 <= status_code < 500 and status_code != 416\n\n\ndef fetch_shards_index(sd: SubdirData, cache: shards_cache.ShardCache | None) -> Shards | None:\n    \"\"\"\n    Check a SubdirData's URL for shards.\n\n    Return shards index bytes from cache or network.\n    Return None if not found; caller should fetch normal repodata.\n\n    TODO: If this function fails to retrieve the sharded repodata index file, it will\n          mark it is as not supporting this feature in cache. This can problematic\n          because sometimes server errors can happen which will lead it to wrongly\n          assuming the channel doesn't support sharding. We need to rethink our\n          logic for determining shard support.\n    \"\"\"\n\n    fetch = sd.repo_fetch\n    repo_cache = fetch.repo_cache\n\n    # repo_cache.load_state() will clear the file on JSONDecodeError but cache.load()\n    # will raise the exception.\n    # repo_cache.load_state(\n    #     binary=True\n    # )  # won't succeed when .msgpack.zst is missing as it wants to compare the timestamp (returns empty state)\n\n    # Load state ourselves to avoid clearing when binary cached data is missing.\n    # If we fall back to monolithic repodata.json, the standard fetch code will\n    # load the state again in text mode.\n    try:\n        with repo_cache.lock(\"r+\") as state_file:\n            # cannot use pathlib.read_text / write_text on any locked file, as\n            # it will release the lock early\n            state = json.loads(state_file.read())\n            repo_cache.state.update(state)\n    except (FileNotFoundError, json.JSONDecodeError):\n        pass\n\n    cache_state = repo_cache.state\n\n    if cache_state.should_check_format(\"shards\"):\n        # look for shards index\n        shards_data = None\n        shards_index_url = f\"{sd.url_w_subdir}/repodata_shards.msgpack.zst\"\n\n        if not repo_cache.cache_path_shards.exists():\n            # avoid 304 not modified if we don't have the file\n            cache_state.etag = \"\"\n            cache_state.mod = \"\"\n        elif not repo_cache.stale():\n            # load from cache without network request\n            with repo_cache.lock(\"r+\"):\n                shards_data = repo_cache.cache_path_shards.read_bytes()\n\n        # If we don't have shards_data yet, try fetching (repodata_shards handles offline mode)\n        if shards_data is None:\n            try:\n                shards_data = _repodata_shards(shards_index_url, repo_cache)\n                cache_state.set_has_format(\"shards\", True)\n                # this will also set state[\"refresh_ns\"] = time.time_ns(); we could\n                # call cache.refresh() if we got a 304 instead:\n                repo_cache.save(shards_data)\n            except conda.gateways.repodata.UnavailableInvalidChannel as err:\n                # repodata_shards converts HTTP errors to conda errors.\n                # fetch repodata.json / repodata.json.zst instead\n                if _is_http_error_most_400_codes(err.status_code):\n                    cache_state.set_has_format(\"shards\", False)\n                repo_cache.refresh()\n            except conda.exceptions.CondaHTTPError as err:\n                # repodata_shards converts HTTP errors to conda errors.\n                # fetch repodata.json / repodata.json.zst instead\n                if (\n                    hasattr(err._caused_by, \"response\")\n                    and hasattr(err._caused_by.response, \"status_code\")\n                    and _is_http_error_most_400_codes(err._caused_by.response.status_code)\n                ):\n                    cache_state.set_has_format(\"shards\", False)\n                repo_cache.refresh()\n\n        if shards_data:\n            # basic parse (move into caller?)\n            shards_index: ShardsIndexDict = msgpack.loads(\n                zstandard.decompress(shards_data, max_output_size=ZSTD_MAX_SHARD_SIZE)\n            )  # type: ignore\n            shards = Shards(shards_index, shards_index_url, cache)\n            return shards\n\n    return None\n\n\ndef batch_retrieve_from_cache(sharded: list[Shards], packages: list[str]):\n    \"\"\"\n    Given a list of Shards objects and a list of package names, fetch all URLs\n    from a shared local cache, and update Shards with those per-package shards.\n    Return the remaining URLs that must be fetched from the network.\n    \"\"\"\n    sharded = [shardlike for shardlike in sharded if isinstance(shardlike, Shards)]\n\n    wanted = []\n    # XXX update batch_retrieve_from_cache to work with (Shards, package name)\n    # tuples instead of broadcasting across shards itself.\n    for shard in sharded:\n        for package_name in packages:\n            if package_name in shard:  # and not package_name in shard.visited\n                wanted.append((shard, package_name, shard.shard_url(package_name)))\n\n    log.debug(\"%d shards to fetch\", len(wanted))\n\n    if not sharded:\n        log.debug(\"No sharded channels found.\")\n        return wanted\n\n    shared_shard_cache = sharded[0].shards_cache\n    from_cache = shared_shard_cache.retrieve_multiple([shard_url for *_, shard_url in wanted])\n\n    # add fetched Shard objects to Shards objects visited dict\n    for shard, package, shard_url in wanted:\n        if from_cache_shard := from_cache.get(shard_url):\n            shard.visit_shard(package, from_cache_shard)\n\n    return wanted\n\n\ndef batch_retrieve_from_network(wanted: list[tuple[Shards, str, str]]):\n    \"\"\"\n    Given a list of (Shards, package name, shard URL) tuples, group by Shards and call fetch_shards\n    with a list of all URLs for that Shard.\n    \"\"\"\n    shard_packages: dict[Shards, list[str]] = defaultdict(list)\n    for shard, package, _ in wanted:\n        shard_packages[shard].append(package)\n\n    # XXX it might be better to pull networking and Session() out of Shards(),\n    # so that we can e.g. use the same session for a Channel(); typically a\n    # noarch+arch pair of subdirs.\n    # Could we share a ThreadPoolExecutor and see better session utilization?\n    for shard, packages in shard_packages.items():\n        shard.fetch_shards(packages)\n\n\ndef fetch_channels(url_to_channel: dict[str, Channel]) -> dict[str, ShardBase] | None:\n    \"\"\"\n    Args:\n        url_to_channel: not modified, must already be expanded to subdirs.\n\n    Attempt to fetch the sharded index first and then fall back to retrieving a\n    traditional `repodata.json` file.\n\n    Returns:\n        A dict mapping channel URLs to `Shard` or `ShardLike` objects. None if\n        no channels have shards. This dict preserves the key order of the input\n        `url_to_channel`.\n    \"\"\"\n    # copy incoming dict to retain order:\n    channel_data: dict[str, ShardBase | None] = {url: None for url in url_to_channel}\n\n    # The parallel version may reorder channels, does this matter?\n\n    non_sharded_channels = []\n\n    with concurrent.futures.ThreadPoolExecutor(max_workers=_shards_connections()) as executor:\n        futures = {\n            executor.submit(\n                fetch_shards_index, SubdirData(Channel(channel_url)), None\n            ): channel_url\n            for (channel_url, _) in url_to_channel.items()\n        }\n        futures_non_sharded = {}\n\n        for future in concurrent.futures.as_completed(futures):\n            channel_url = futures[future]\n            found = future.result()\n            if found:\n                channel_data[channel_url] = found\n            else:\n                non_sharded_channels.append((channel_url, Channel(channel_url)))\n\n        # If all are None then don't do ShardLike.\n        if all(value is None for value in channel_data.values()):\n            return None  # caller should interpret this as falling back to the older code path\n\n        # Latency penalty launching these requests here instead of when we\n        # non_sharded_channels.append(), but we want to leave a fallback to the\n        # non-sharded path open.\n        for channel_url, _ in non_sharded_channels:\n            futures_non_sharded[\n                executor.submit(SubdirData(Channel(channel_url)).repo_fetch.fetch_latest_parsed)\n            ] = channel_url\n\n        for future in concurrent.futures.as_completed(futures_non_sharded):\n            channel_url = futures_non_sharded[future]\n            repodata_json, _ = future.result()\n            # the filename is not strictly repodata.json since we could have\n            # fetched the same data from repodata.json.zst; but makes the\n            # urljoin consistent with shards which end with\n            # /repodata_shards.msgpack.zst\n            url = f\"{channel_url}/repodata.json\"\n            found = ShardLike(repodata_json, url)\n            channel_data[channel_url] = found\n\n    return {url: shard for url, shard in channel_data.items() if shard is not None}\n"
  },
  {
    "path": "conda_libmamba_solver/shards_cache.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nCache suitable for shards, not allowed to change because they are named\nafter their own sha256 hash.\n\"\"\"\n\nfrom __future__ import annotations\n\nimport logging\nimport sqlite3\nfrom dataclasses import dataclass\nfrom typing import TYPE_CHECKING\n\nimport msgpack\nimport zstandard\n\nif TYPE_CHECKING:\n    from pathlib import Path\n\n    from .shards_typing import ShardDict\n\nlog = logging.getLogger(__name__)\n\nSHARD_CACHE_NAME = \"repodata_shards.db\"\nZSTD_MAX_SHARD_SIZE = 2**20 * 16  # maximum size necessary when compresed data has no size header\n\n\n@dataclass\nclass AnnotatedRawShard:\n    def __init__(self, url: str, package: str, compressed_shard: bytes):\n        # prevent easy mistake of swapping url, package\n        assert \"://\" in url\n        assert \"://\" not in package\n\n        self.url = url\n        self.package = package  # remove this field to avoid confusion?\n        self.compressed_shard = compressed_shard\n\n    url: str\n    package: str\n    compressed_shard: bytes\n\n\ndef connect(dburi=\"cache.db\"):\n    \"\"\"\n    Get database connection.\n\n    dburi: uri-style sqlite database filename; accepts certain ?= parameters.\n    \"\"\"\n    conn = sqlite3.connect(dburi, uri=True, timeout=30.0)\n    conn.row_factory = sqlite3.Row\n    with conn as c:\n        try:\n            mode = c.execute(\"PRAGMA journal_mode = WAL\").fetchone()[0]\n        except sqlite3.DatabaseError:\n            mode = None\n        if mode and mode.lower().startswith(\"wal\"):\n            c.execute(\"PRAGMA synchronous = NORMAL\")\n        c.execute(\"PRAGMA foreign_keys = ON\")\n    return conn\n\n\nclass ShardCache:\n    \"\"\"\n    Handle caching for individual shards (not the index of shards).\n    \"\"\"\n\n    def __init__(self, base: Path, create=True):\n        \"\"\"\n        base: directory and filename prefix for cache.\n        \"\"\"\n        self.base = base\n        self.connect(create=create)\n\n    def __enter__(self):\n        return self\n\n    def __exit__(self, exc_type, exc_val, exec_tb):\n        self.close()\n\n    def close(self):\n        \"\"\"\n        Clean up connection. ShardCache can no longer be used after close().\n        \"\"\"\n        if self.conn:\n            self.conn.close()\n            self.conn = None\n\n    def copy(self):\n        \"\"\"\n        Copy cache with new connection. Useful for threads.\n        \"\"\"\n        return ShardCache(self.base, create=False)\n\n    def connect(self, create=True, retry=True):\n        \"\"\"\n        Args:\n            create: if True, create table if not exists.\n            retry: remove cache, log warning, and retry on error.\n        \"\"\"\n        global SHARD_CACHE_NAME\n\n        dburi = (self.base / SHARD_CACHE_NAME).as_uri()\n        self.conn = connect(dburi)\n        if not create:\n            return\n        try:\n            # this schema will also get confused if we merge packages into a single\n            # shard, but the package name should be advisory.\n            with self.conn as c:\n                c.execute(\n                    \"CREATE TABLE IF NOT EXISTS shards (\"\n                    \"url TEXT PRIMARY KEY, package TEXT, shard BLOB, \"\n                    \"timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP)\"\n                )\n        except sqlite3.DatabaseError as e:\n            # Python 3.11 adds sqlite_errorcode. This is meant to delete and\n            # retry on all DatabaseError for Python 3.10, but on Python 3.11+\n            # only retry on SQLITE_NOTADB. Other errors e.g. busy, locked, would\n            # propagate.\n            has_errorcode = hasattr(e, \"sqlite_errorcode\")\n            if retry and ((not has_errorcode) or (e.sqlite_errorcode == sqlite3.SQLITE_NOTADB)):\n                log.warning(\"%s '%s'; remove and retry.\", dburi, e)\n                try:\n                    self.remove_cache()\n                except OSError as e:\n                    # alternate filename if primary cannot be removed.\n                    log.warning(\"%s '%s'; use alternate filename.\", dburi, e)\n                    SHARD_CACHE_NAME = \"repodata_shards_1.db\"\n                # pass False so that we only retry once:\n                return self.connect(create=create, retry=False)\n            raise\n\n    def insert(self, raw_shard: AnnotatedRawShard):\n        \"\"\"\n        Args:\n            url: of shard\n            package: package name\n            raw_shard: msgpack.zst compressed shard data\n        \"\"\"\n        # decompress and return shard for convenience, also to validate? unless\n        # caller would rather retrieve the shard from another thread.\n        with self.conn as c:\n            c.execute(\n                \"INSERT OR IGNORE INTO SHARDS (url, package, shard) VALUES (?, ?, ?)\",\n                (raw_shard.url, raw_shard.package, raw_shard.compressed_shard),\n            )\n\n    def retrieve(self, url) -> ShardDict | None:\n        with self.conn as c:\n            row = c.execute(\"SELECT shard FROM shards WHERE url = ?\", (url,)).fetchone()\n            return (\n                msgpack.loads(\n                    zstandard.decompress(row[\"shard\"], max_output_size=ZSTD_MAX_SHARD_SIZE)\n                )\n                if row\n                else None\n            )  # type: ignore\n\n    def retrieve_multiple(self, urls: list[str]) -> dict[str, ShardDict | None]:\n        \"\"\"\n        Query database for cached shard urls.\n\n        Return a dict of urls in cache mapping to the Shard or None if not present.\n        \"\"\"\n        if not urls:\n            return {}  # this optimization does not save a noticeable amount of time.\n\n        # In one test reusing the context saves difference between .006s and .01s\n        # We could make this a threadlocal.\n        dctx = zstandard.ZstdDecompressor()\n\n        query = f\"SELECT url, shard FROM shards WHERE url IN ({','.join(('?',) * len(urls))}) ORDER BY url\"\n        with self.conn as c:\n            result: dict[str, ShardDict | None] = {\n                row[\"url\"]: msgpack.loads(\n                    dctx.decompress(row[\"shard\"], max_output_size=ZSTD_MAX_SHARD_SIZE)\n                )\n                if row\n                else None\n                for row in c.execute(query, urls)  # type: ignore\n            }\n            return result\n\n    def clear_cache(self):\n        \"\"\"\n        Truncate the database by removing all rows from tables\n        \"\"\"\n        with self.conn as c:\n            c.execute(\"DELETE FROM shards\")\n\n    def remove_cache(self):\n        \"\"\"\n        Remove the sharded cache database.\n        \"\"\"\n        self.close()\n        try:\n            (self.base / SHARD_CACHE_NAME).unlink()\n        except OSError:\n            # possibly workable on Windows\n            (self.base / SHARD_CACHE_NAME).rename(self.base / f\"{SHARD_CACHE_NAME}.conda_trash\")\n"
  },
  {
    "path": "conda_libmamba_solver/shards_subset.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nSharded repodata subsets.\n\nTraverse dependencies of installed and to-be-installed packages to generate a\nuseful subset for the solver.\n\nThe algorithm developed here is a direct result of the following CEP:\n\n- https://conda.org/learn/ceps/cep-0016 (Sharded Repodata)\n\nIn this algorithm we treat a (channel, package name) as a node, its dependencies\nas edges. We then traverse all edges to discover all reachable (channel, package\nname) tuples. The solver should be able to find a solution with only this\nsubset.\n\nThis subset is overgenerous since the user is unlikely to want to install very\nold packages and their dependencies. If this is too slow, we could deploy\nheuristics that automatically ignore older package versions. We could also allow\nthe user to configure minimum versions of common packages and ignore older\nversions and their dependencies, falling back to a full solve if unsatisfiable.\n\nWe treat both sharded and monolithic repodata as if they were made up of\nper-package shards, computing a subset of both. This is because it is possible\nfor the monolithic repodata to mention packages that exist in the true sharded\nrepodata but would not be found by only traversing the shards.\n\nWe treat all repodata as sharded, even if no actual sharded repodata has been\nfound.\n\n## Example usage\n\nThe following constructs several repodata (`noarch` and `linux-64`) from a\nsingle channel name and a list of root packages:\n\n``` from conda.models.channel import Channel from\nconda_libmamba_solver.shards_subset import build_repodata_subset\n\nchannel = Channel(\"conda-forge-sharded/linux-64\") channel_data =\nbuild_repodata_subset([\"python\", \"pandas\"], [channel.url()]) repodata = {}\n\nfor url in channel_data:\n    repodata[url] = channel_data.build_repodata()\n\n# ... this is what's fed to the solver ```\n\n\"\"\"\n\nfrom __future__ import annotations\n\nimport functools\nimport logging\nimport queue\nimport sys\nimport threading\nfrom collections import deque\nfrom concurrent.futures import Future, ThreadPoolExecutor\nfrom contextlib import contextmanager, suppress\nfrom dataclasses import dataclass\nfrom pathlib import Path\nfrom queue import SimpleQueue\nfrom typing import TYPE_CHECKING\n\nimport conda.gateways.repodata\nimport msgpack\nimport zstandard\nfrom conda.base.context import context\n\nfrom conda_libmamba_solver import shards_cache\nfrom conda_libmamba_solver.shards_cache import AnnotatedRawShard\n\nfrom .shards import (\n    ZSTD_MAX_SHARD_SIZE,\n    Shards,\n    _shards_connections,\n    batch_retrieve_from_cache,\n    batch_retrieve_from_network,\n    fetch_channels,\n    shard_mentioned_packages,\n)\n\nlog = logging.getLogger(__name__)\n\nif TYPE_CHECKING:\n    from collections.abc import Callable, Iterable, Iterator, Sequence\n    from queue import SimpleQueue as Queue\n    from typing import Literal, TypeVar\n\n    from conda.models.channel import Channel\n\n    from conda_libmamba_solver.shards_cache import ShardCache\n    from conda_libmamba_solver.shards_typing import ShardDict\n\n    from .shards import ShardBase\n\n# Waiting for worker threads to shutdown cleanly, or raise error.\nTHREAD_WAIT_TIMEOUT = 5  # seconds\nREACHABLE_PIPELINED_MAX_TIMEOUTS = 10  # number of times we can timeout waiting for shards\n\n\n@dataclass(order=True)\nclass Node:\n    distance: int = sys.maxsize\n    package: str = \"\"\n    channel: str = \"\"\n    visited: bool = False\n    shard_url: str = \"\"\n\n    def to_id(self) -> NodeId:\n        return NodeId(self.package, self.channel, self.shard_url)\n\n\n@dataclass(order=True, eq=True, frozen=True)\nclass NodeId:\n    package: str\n    channel: str\n    shard_url: str = \"\"\n\n    def __hash__(self):\n        return hash((self.package, self.channel, self.shard_url))\n\n\ndef _nodes_from_packages(\n    root_packages: list[str], shardlikes: Iterable[ShardBase]\n) -> Iterator[tuple[NodeId, Node]]:\n    \"\"\"\n    Yield (NodeId, Node) for all root packages found in shardlikes.\n    \"\"\"\n    for package in root_packages:\n        for shardlike in shardlikes:\n            if package in shardlike:\n                node = Node(0, package, shardlike.url, shard_url=shardlike.shard_url(package))\n                node_id = node.to_id()\n                yield node_id, node\n\n\ndef filter_redundant_packages(repodata: ShardDict, use_only_tar_bz2=False) -> ShardDict:\n    \"\"\"\n    Given repodata or a single shard, remove any .tar.bz2 packages that have a\n    .conda counterpart.\n\n    Return a shallow copy if use_only_tar_bz2==False, else unmodified input.\n    \"\"\"\n    if use_only_tar_bz2:\n        return repodata\n\n    _tar_bz2 = \".tar.bz2\"\n    _conda = \".conda\"\n    _len_tar_bz2 = len(_tar_bz2)\n\n    legacy_packages = repodata.get(\"packages\", {})\n    conda_packages = repodata.get(\"packages.conda\", {})\n\n    return {\n        **repodata,\n        \"packages\": {\n            k: v\n            for k, v in legacy_packages.items()\n            if f\"{k[:-_len_tar_bz2]}{_conda}\" not in conda_packages\n        },\n    }\n\n\n@contextmanager\ndef _install_shards_cache(shardlikes):\n    \"\"\"\n    Add shards_cache to shardlikes for duration of traversal, then remove and\n    close.\n    \"\"\"\n    with shards_cache.ShardCache(Path(conda.gateways.repodata.create_cache_dir())) as cache:\n        for shardlike in shardlikes:\n            if isinstance(shardlike, Shards):\n                shardlike.shards_cache = cache\n        yield cache\n        for shardlike in shardlikes:\n            if isinstance(shardlike, Shards):\n                shardlike.shards_cache = None\n\n\n@dataclass\nclass RepodataSubset:\n    nodes: dict[NodeId, Node]\n    shardlikes: Sequence[ShardBase]\n    DEFAULT_STRATEGY = \"pipelined\"\n\n    def __init__(self, shardlikes: Iterable[ShardBase]):\n        self.nodes = {}\n        self.shardlikes = list(shardlikes)\n        self._use_only_tar_bz2 = context.use_only_tar_bz2\n        self._add_pip_as_python_dependency = context.add_pip_as_python_dependency\n\n    @classmethod\n    def has_strategy(cls, strategy: str) -> bool:\n        \"\"\"\n        Return True if this class provides the named shard traversal strategy.\n        \"\"\"\n        return hasattr(cls, f\"reachable_{strategy}\")\n\n    def neighbors(self, node: Node) -> Iterator[Node]:\n        \"\"\"\n        Retrieve all unvisited neighbors of a node\n\n        Neighbors in the context are dependencies of a package\n        \"\"\"\n        discovered = set()\n\n        for shardlike in self.shardlikes:\n            if node.package not in shardlike:\n                continue\n\n            # check that we don't fetch the same shard twice...\n            shard = shardlike.fetch_shard(\n                node.package\n            )  # XXX this is the only place that in-memory (repodata.json) shards are found for the first time\n\n            shard = filter_redundant_packages(shard, self._use_only_tar_bz2)\n            shardlike.visit_shard(node.package, shard)\n\n            # ensure solver has \"pip\" record if add_pip_as_python_dependency:\n            extra = (\n                (\"pip\",) if self._add_pip_as_python_dependency and node.package == \"python\" else ()\n            )\n            for package in shard_mentioned_packages(shard, extra=extra):\n                node_id = NodeId(package, shardlike.url)\n\n                if node_id not in self.nodes:\n                    self.nodes[node_id] = Node(node.distance + 1, package, shardlike.url)\n                    yield self.nodes[node_id]\n\n                    if package not in discovered:\n                        # now this is per package name, not per (name, channel) tuple\n                        discovered.add(package)\n\n    def outgoing(self, node: Node):\n        \"\"\"\n        All nodes that can be reached by this node, plus cost.\n        \"\"\"\n        # If we set a greater cost for sharded repodata than the repodata that\n        # is already in memory and tracked nodes as (channel, package) tuples,\n        # we might be able to find more shards-to-fetch-in-parallel more\n        # quickly. On the other hand our goal is that the big channels will all\n        # be sharded.\n        for n in self.neighbors(node):\n            yield n, 1\n\n    def reachable(self, root_packages, *, strategy=DEFAULT_STRATEGY) -> None:\n        \"\"\"\n        Run named reachability strategy or the default.\n\n        Update `self.shardlikes` with reachable package records. Later,\n        [shardlike.build_repodata() for shardlike in shardlikes] can be used to\n        generate repodata.json-format subsets of each channel.\n        \"\"\"\n        return getattr(self, f\"reachable_{strategy}\")(root_packages)\n\n    def reachable_bfs(self, root_packages):\n        \"\"\"\n        Fetch all packages reachable from `root_packages`' by following\n        dependencies using the \"breadth-first search\" algorithm.\n\n        Update associated `self.shardlikes` to contain enough data to build a\n        repodata subset.\n        \"\"\"\n        with _install_shards_cache(self.shardlikes):\n            return self._reachable_bfs(root_packages)\n\n    def _reachable_bfs(self, root_packages):\n        \"\"\"\n        Inner reachable_bfs() implementation.\n        \"\"\"\n        self.nodes = dict(_nodes_from_packages(root_packages, self.shardlikes))\n\n        node_queue = deque(self.nodes.values())\n        sharded = [s for s in self.shardlikes if isinstance(s, Shards)]\n\n        while node_queue:\n            # Batch fetch all nodes at current level\n            to_retrieve = {node.package for node in node_queue if not node.visited}\n            if to_retrieve:\n                not_in_cache = batch_retrieve_from_cache(sharded, sorted(to_retrieve))\n                batch_retrieve_from_network(not_in_cache)\n\n            # Process one level\n            level_size = len(node_queue)\n            for _ in range(level_size):\n                node = node_queue.popleft()\n                if node.visited:  # pragma: no cover\n                    continue  # we should never add visited nodes to node_queue\n                node.visited = True\n\n                for next_node, _ in self.outgoing(node):\n                    if not next_node.visited:\n                        node_queue.append(next_node)\n\n    def reachable_pipelined(self, root_packages):\n        \"\"\"\n        Fetch all packages reachable from `root_packages`' by following\n        dependencies.\n\n        Build repodata subset using concurrent threads to follow dependencies,\n        fetch from cache, and fetch from network.\n        \"\"\"\n\n        # In offline mode shards are retrieved from the cache database as usual,\n        # but cache misses are forwarded to offline_nofetch_thread returning\n        # empty shards.\n        if context.offline:\n            network_worker = offline_nofetch_thread\n        else:\n            network_worker = network_fetch_thread\n\n        # Ignore cache on shards object, use our own. Necessary if there are no\n        # sharded channels.\n        with shards_cache.ShardCache(Path(conda.gateways.repodata.create_cache_dir())) as cache:\n            return self._reachable_pipelined(\n                root_packages, network_worker=network_worker, cache=cache\n            )\n\n    def _reachable_pipelined(\n        self,\n        root_packages,\n        network_worker: Callable[\n            [\n                Queue[Sequence[NodeId] | None],\n                Queue[list[tuple[NodeId, ShardDict] | Exception]],\n                ShardCache,\n                Sequence[ShardBase],\n            ],\n            None,\n        ],\n        cache: shards_cache.ShardCache,\n    ):\n        \"\"\"\n        Set up queues and threads for shard traversal with a configurable\n        network_worker. Called by reachable_pipelined()\n        \"\"\"\n\n        cache_in_queue: SimpleQueue[list[NodeId] | None] = SimpleQueue()\n        shard_out_queue: SimpleQueue[list[tuple[NodeId, ShardDict]] | Exception] = SimpleQueue()\n        cache_miss_queue: SimpleQueue[list[NodeId] | None] = SimpleQueue()\n\n        cache_thread = threading.Thread(\n            target=cache_fetch_thread,\n            args=(cache_in_queue, shard_out_queue, cache_miss_queue, cache),\n            daemon=True,  # may have to set to False if we ever want to run in a subinterpreter\n        )\n\n        network_thread = threading.Thread(\n            target=network_worker,\n            args=(cache_miss_queue, shard_out_queue, cache, self.shardlikes),\n            daemon=True,\n        )\n\n        try:\n            cache_thread.start()\n            network_thread.start()\n            self._pipelined_traversal(\n                root_packages, cache_in_queue, shard_out_queue, cache_thread, network_thread\n            )\n        finally:\n            cache_in_queue.put(None)\n            # These should finish almost immediately, but if not, raise an error:\n            cache_thread.join(THREAD_WAIT_TIMEOUT)\n            network_thread.join(THREAD_WAIT_TIMEOUT)\n\n    def _pipelined_traversal(\n        self,\n        root_packages,\n        cache_in_queue: Queue[list[NodeId] | None],\n        shard_out_queue: Queue[list[tuple[NodeId, ShardDict]] | Exception],\n        cache_thread: threading.Thread,\n        network_thread: threading.Thread,\n    ):\n        \"\"\"\n        Run reachability algorithm given queues to submit and receive shards.\n        \"\"\"\n        shardlikes_by_url = {s.url: s for s in self.shardlikes}\n        pending: set[NodeId] = set()\n        in_flight: set[NodeId] = set()\n        timeouts = 0\n\n        self.nodes = {}\n\n        # create start condition\n        parent_node = Node(0)\n        pending.update(self.visit_node(parent_node, root_packages))\n\n        def pump():\n            \"\"\"\n            Find shards we already have and those we need. Submit those need to\n            cache_in_queue, those we have to shard_out_queue.\n            \"\"\"\n            have, need = self.drain_pending(pending, shardlikes_by_url)\n            if need:\n                in_flight.update(need)\n                cache_in_queue.put(need)\n            if have:\n                in_flight.update(node_id for node_id, _ in have)\n                # All shards go through shard_out queue to be processed at\n                # shard_out_queue.get(). Whether they come from cache, network,\n                # or for repodata.json we \"have\" them (already in memory).\n                shard_out_queue.put(have)\n            return len(have) + len(need)\n\n        def log_timeout():\n            \"\"\"\n            Log timeout information and raise TimeoutError if max timeouts\n            exceeded.\n            \"\"\"\n            nonlocal timeouts\n            timeouts += 1\n            log.debug(\"Shard timeout %s\", timeouts)\n            log.debug(\"in_flight: %s...\", sorted(str(node_id) for node_id in in_flight)[:10])\n            log.debug(\"nodes: %d\", len(self.nodes))\n            log.debug(\"cache_thread.is_alive(): %s\", cache_thread.is_alive())\n            log.debug(\"network_thread.is_alive(): %s\", network_thread.is_alive())\n            log.debug(\"shard_out_queue.qsize(): %s\", shard_out_queue.qsize())\n            if network_thread.is_alive() and in_flight:\n                max_timeouts = int(\n                    context.remote_read_timeout_secs * (context.remote_max_retries + 1)\n                )\n            else:\n                max_timeouts = REACHABLE_PIPELINED_MAX_TIMEOUTS\n            if timeouts > max_timeouts:\n                raise TimeoutError(\"Timeout while fetching repodata shards.\")\n\n        while True:\n            pump()\n            if not in_flight:  # pending is empty right after calling pump()\n                log.debug(\"All shards have finished processing.\")\n                break\n\n            try:\n                new_shards = shard_out_queue.get(timeout=1)\n                if isinstance(new_shards, BaseException):  # error propagated from worker thread\n                    raise new_shards\n\n            except queue.Empty:\n                log_timeout()\n                continue\n\n            timeouts = 0\n            for node_id, shard in new_shards:\n                in_flight.remove(node_id)\n\n                # remove_legacy_packages if the \".conda\" format is enabled /\n                # conda is not in \".tar.bz2 only\" mode.\n                shard = filter_redundant_packages(shard, self._use_only_tar_bz2)\n\n                # add shard to appropriate ShardLike\n                parent_node = self.nodes[node_id]\n                shardlike = shardlikes_by_url[node_id.channel]\n                shardlike.visit_shard(node_id.package, shard)\n\n                # ensure solver has \"pip\" record if add_pip_as_python_dependency:\n                extra = (\n                    (\"pip\",)\n                    if self._add_pip_as_python_dependency and parent_node.package == \"python\"\n                    else ()\n                )\n                pending.update(\n                    self.visit_node(parent_node, shard_mentioned_packages(shard, extra=extra))\n                )\n\n    def visit_node(self, parent_node: Node, mentioned_packages: Iterable[str]) -> Iterable[NodeId]:\n        \"\"\"Broadcast mentioned packages across channels. yield pending NodeId's.\"\"\"\n        # NOTE we have visit for Nodes which is used in the graph traversal\n        # algorithm, and a separate visit for ShardBase which means \"include\n        # this package in the output repodata\".\n        for package in mentioned_packages:\n            for shardlike in self.shardlikes:\n                if package in shardlike:\n                    new_node_id = NodeId(package, shardlike.url, shardlike.shard_url(package))\n                    if new_node_id not in self.nodes:\n                        new_node = Node(\n                            distance=parent_node.distance + 1,\n                            package=new_node_id.package,\n                            channel=new_node_id.channel,\n                            shard_url=new_node_id.shard_url,\n                        )\n                        self.nodes[new_node_id] = new_node\n                        yield new_node_id\n\n        parent_node.visited = True\n\n    def drain_pending(\n        self, pending: set[NodeId], shardlikes_by_url: dict[str, ShardBase]\n    ) -> tuple[list[tuple[NodeId, ShardDict]], list[NodeId]]:\n        \"\"\"\n        Check pending for in-memory shards.\n        Clear pending.\n\n        Return a list of shards we have and shards we need to fetch.\n        \"\"\"\n        shards_need = []\n        shards_have = []\n        for node_id in pending:\n            # we should already have these nodes.\n            shardlike = shardlikes_by_url[node_id.channel]\n            if shardlike.shard_loaded(node_id.package):  # for monolithic repodata\n                shards_have.append((node_id, shardlike.visit_package(node_id.package)))\n            else:\n                if self.nodes[node_id].visited:  # pragma: no cover\n                    log.debug(\"Skip visited, should not be reached\")\n                    continue\n                shards_need.append(node_id)\n        pending.clear()\n        return shards_have, shards_need\n\n\ndef build_repodata_subset(\n    root_packages: Iterable[str],\n    channels: dict[str, Channel],\n    algorithm: Literal[\"bfs\", \"pipelined\"] = RepodataSubset.DEFAULT_STRATEGY,\n) -> dict[str, ShardBase] | None:\n    \"\"\"\n    Retrieve all necessary information to build a repodata subset.\n\n    Params:\n        root_packages: iterable of installed and requested package names\n        channels: Channel objects; dict form preferred.\n        algorithm: desired traversal algorithm\n\n    Return:\n        None if there are no shards available, or a mapping of channel URL's to\n        ShardBase objects where build_repodata() returns the computed subset..\n    \"\"\"\n    channel_data = fetch_channels(channels)\n    if channel_data is not None:\n        subset = RepodataSubset((*channel_data.values(),))\n        subset.reachable(root_packages, strategy=algorithm)\n        log.debug(\"%d (channel, package) nodes discovered\", len(subset.nodes))\n\n    return channel_data\n\n\n# region workers\n\nif TYPE_CHECKING:\n    _T = TypeVar(\"_T\")\n\n\ndef combine_batches_until_none(\n    in_queue: Queue[Sequence[_T] | None],\n) -> Iterator[Sequence[_T]]:\n    \"\"\"\n    Combine lists from in_queue until we see None. Yield combined lists.\n    \"\"\"\n    running = True\n    while running:\n        try:\n            # Add timeout to prevent indefinite blocking if producer thread fails\n            batch = in_queue.get(timeout=5)\n            if batch is None:\n                break\n        except queue.Empty:\n            # If we timeout, continue waiting - producer might still send data\n            continue\n\n        node_ids = list(batch)\n        with suppress(queue.Empty):\n            while True:  # loop exits with break or queue.Empty exception\n                batch = in_queue.get_nowait()\n                if batch is None:\n                    # do the work but then quit\n                    running = False\n                    break\n                else:\n                    node_ids.extend(batch)\n        yield node_ids\n\n\ndef exception_to_queue(func):\n    \"\"\"\n    Decorator to send unhandled exceptions to the second argument out_queue.\n    \"\"\"\n\n    @functools.wraps(func)\n    def wrapper(in_queue, out_queue, *args, **kwargs):\n        try:\n            return func(in_queue, out_queue, *args, **kwargs)\n        except BaseException as e:  # includes KeyboardInterrupt\n            in_queue.put(None)  # tell worker that we're done\n            out_queue.put(e)  # tell caller that we received an exception\n\n    return wrapper\n\n\n@exception_to_queue\ndef cache_fetch_thread(\n    in_queue: Queue[Sequence[NodeId] | None],\n    shard_out_queue: Queue[Sequence[tuple[NodeId, ShardDict] | Exception]],\n    network_out_queue: Queue[Sequence[NodeId] | None],\n    cache: ShardCache,\n):\n    \"\"\"\n    Fetch batches of shards from cache until in_queue sees None. Enqueue found\n    shards to shard_out_queue, and not found shards to network_out_queue.\n\n    When we see None on in_queue, send None to both out queues and exit.\n\n    Args:\n        in_queue: NodeId (URLs) to fetch.\n        shard_out_queue: fetched shards sent to queue.\n        network_out_queue: cache misses forwarded to queue. Same queue is\n            network_fetch_thread's in_queue.\n        cache: used to retrieve shards.\n    \"\"\"\n    with cache.copy() as cache:\n        for node_ids in combine_batches_until_none(in_queue):\n            cached = cache.retrieve_multiple([node_id.shard_url for node_id in node_ids])\n\n            # should we add this into retrieve_multiple?\n            found: list[tuple[NodeId, ShardDict]] = []\n            not_found: list[NodeId] = []\n            for node_id in node_ids:\n                if shard := cached.get(node_id.shard_url):\n                    found.append((node_id, shard))\n                else:\n                    not_found.append(node_id)\n\n            # Might wake up the network thread by calling it first:\n            if not_found:\n                network_out_queue.put(not_found)\n            if found:\n                shard_out_queue.put(found)\n\n    network_out_queue.put(None)\n    # no shard_out_queue.put(None); this is during mainloop shutdown.\n\n\n@exception_to_queue\ndef network_fetch_thread(\n    in_queue: Queue[Sequence[NodeId] | None],\n    shard_out_queue: Queue[list[tuple[NodeId, ShardDict] | Exception]],\n    cache: ShardCache,\n    shardlikes: Sequence[ShardBase],\n):\n    \"\"\"\n    Fetch shards from the network that are received on in_queue, until we see\n    None.\n\n    Unhandled exceptions also go to shard_out_queue, and exit this thread.\n\n    Args:\n        in_queue: NodeId (URLs) to fetch.\n        shard_out_queue: fetched shards sent to queue.\n        cache: once shards are decoded they are stored in cache.\n        shardlikes: list of (network-only) shard index objects.\n    \"\"\"\n    dctx = zstandard.ZstdDecompressor(max_window_size=ZSTD_MAX_SHARD_SIZE)\n    shardlikes_by_url = {s.url: s for s in shardlikes}\n\n    def fetch(s, url: str, node_id: NodeId):\n        timeout = (\n            context.remote_connect_timeout_secs,\n            context.remote_read_timeout_secs,\n        )\n        with s.get(url, timeout=timeout) as response:\n            response.raise_for_status()\n            data = response.content\n        return url, node_id, data\n\n    def submit(node_id: NodeId):\n        # this worker should only receive network node_id's:\n        shardlike = shardlikes_by_url[node_id.channel]\n        if not isinstance(shardlike, Shards):\n            raise TypeError(\"network_fetch_thread got non-network shardlike\")\n        session = shardlike.session\n        url = shardlikes_by_url[node_id.channel].shard_url(node_id.package)\n        return executor.submit(fetch, session, url, node_id)\n\n    def handle_result(future: Future):\n        url, node_id, data = future.result()\n        log.debug(\"Fetch thread got %s (%s bytes)\", url, len(data))\n        # Decompress and parse. If it decodes as\n        # msgpack.zst, insert into cache. Then put \"known\n        # good\" shard into out queue.\n        shard: ShardDict = msgpack.loads(\n            dctx.decompress(data, max_output_size=ZSTD_MAX_SHARD_SIZE)\n        )  # type: ignore[assign]\n        # We could send this back into the cache thread instead to\n        # serialize access to sqlite3 if lock contention becomes an issue.\n        cache.insert(AnnotatedRawShard(url, node_id.package, data))\n        shard_out_queue.put([(node_id, shard)])\n\n    def result_to_in_queue(future: Future):\n        # Simplify waiting by putting responses back into in_queue. This\n        # function is called in the ThreadPoolExecutor's thread, but we want to\n        # serialize result processing in the network_fetch_thread.\n\n        # Not in our signature; the caller doesn't need to know we are putting\n        # Future in here as well.\n        in_queue.put([future])  # type: ignore\n\n    with ThreadPoolExecutor(max_workers=_shards_connections()) as executor, cache.copy() as cache:\n        for node_ids_and_results in combine_batches_until_none(in_queue):\n            for node_id_or_result in node_ids_and_results:\n                if isinstance(node_id_or_result, Future):\n                    handle_result(node_id_or_result)\n                else:\n                    future = submit(node_id_or_result)\n                    future.add_done_callback(result_to_in_queue)\n\n        # TODO call executor.shutdown(cancel_futures=True) on error or otherwise\n        # prevent new HTTP requests from being started e.g. \"skip\" flag in\n        # fetch() function. Also possible to shutdown(wait=False).\n\n\n@exception_to_queue\ndef offline_nofetch_thread(\n    in_queue: Queue[Sequence[NodeId] | None],\n    shard_out_queue: Queue[list[tuple[NodeId, ShardDict] | Exception]],\n    cache: ShardCache,\n    shardlikes: Sequence[ShardBase],\n):\n    \"\"\"\n    For offline mode, where network requests are not allowed.\n    Pretend that every network request is an empty shard.\n    Don't save those to the cache.\n\n    Depending on how many shards are in sqlite3 and which packages were requested, the user may or may not get enough repodata for a solution.\n\n    Args:\n        in_queue: NodeId (URLs) to fetch.\n        shard_out_queue: fetched shards sent to queue.\n        cache: once shards are decoded they are stored in cache.\n        shardlikes: list of (network-only) shard index objects.\n    \"\"\"\n\n    for node_ids in combine_batches_until_none(in_queue):\n        for node_id in node_ids:\n            shard: ShardDict = {\"packages\": {}, \"packages.conda\": {}}\n            shard_out_queue.put([(node_id, shard)])\n\n\n# endregion\n"
  },
  {
    "path": "conda_libmamba_solver/shards_typing.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nTypedDict declarations for shards.\n\nThese are helpful for auto-complete, but do not validate at runtime and are not\nnormative. They are intentionally not shared with another project (conda) to\nreduce coupling.\n\"\"\"\n\nfrom __future__ import annotations\n\nfrom typing import TYPE_CHECKING, TypedDict\n\nif TYPE_CHECKING:\n    from typing import NotRequired\n\n\nclass PackageRecordDict(TypedDict):\n    \"\"\"\n    Basic package attributes that this module cares about.\n    \"\"\"\n\n    name: str\n    version: str\n    build: str\n    build_number: int\n    sha256: NotRequired[str | bytes]\n    md5: NotRequired[str | bytes]\n    depends: list[str]\n    constrains: NotRequired[list[str]]\n    noarch: NotRequired[str]\n\n\n# in this style because \"packages.conda\" is not a Python identifier\nShardDict = TypedDict(\n    \"ShardDict\",\n    {\n        \"packages\": dict[str, PackageRecordDict],\n        \"packages.conda\": dict[str, PackageRecordDict],\n    },\n)\n\n\nclass RepodataInfoDict(TypedDict):  # noqa: F811\n    base_url: str  # where packages are stored\n    shards_base_url: str  # where shards are stored\n    subdir: str\n\n\nclass RepodataDict(ShardDict):\n    \"\"\"\n    Packages plus info.\n    \"\"\"\n\n    info: RepodataInfoDict\n    repodata_version: int\n\n\nclass ShardsIndexDict(TypedDict):\n    \"\"\"\n    Shards index as deserialized from repodata_shards.msgpack.zst\n    \"\"\"\n\n    info: RepodataInfoDict\n    version: int  # TODO conda-index currently uses 'repodata_version' here\n    shards: dict[str, bytes]\n"
  },
  {
    "path": "conda_libmamba_solver/solver.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n# Copyright (C) 2024 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nThis module defines the conda.core.solve.Solver interface and its immediate helpers\n\"\"\"\n\nfrom __future__ import annotations\n\nimport json\nimport logging\nimport os\nimport re\nimport sys\nfrom collections import defaultdict\nfrom functools import cache\nfrom inspect import stack\nfrom itertools import chain\nfrom textwrap import dedent\nfrom typing import TYPE_CHECKING\n\nfrom conda import __version__ as _conda_version\nfrom conda.base.constants import (\n    REPODATA_FN,\n    UNKNOWN_CHANNEL,\n    ChannelPriority,\n)\nfrom conda.base.context import context\nfrom conda.common.constants import NULL\nfrom conda.common.io import time_recorder\nfrom conda.common.path import paths_equal\nfrom conda.common.url import percent_decode\nfrom conda.core.prefix_data import PrefixData\nfrom conda.core.solve import Solver\nfrom conda.exceptions import (\n    CondaValueError,\n    PackagesNotFoundError,\n    UnsatisfiableError,\n)\nfrom conda.models.channel import Channel\nfrom conda.models.match_spec import MatchSpec\nfrom conda.models.records import PackageRecord\nfrom conda.models.version import VersionOrder\nfrom conda.reporters import get_spinner\nfrom libmambapy.solver import Request, Solution\nfrom libmambapy.solver.libsolv import Solver as LibsolvSolver\nfrom libmambapy.specs import MatchSpec as LibmambaMatchSpec\nfrom libmambapy.specs import NoArchType\n\nfrom . import __version__\nfrom .exceptions import LibMambaUnsatisfiableError\nfrom .index import LibMambaIndexHelper\nfrom .mamba_utils import (\n    init_libmamba_context,\n    mamba_version,\n    problems_format_auto,\n    problems_format_nocolor,\n)\nfrom .state import SolverInputState, SolverOutputState\n\nif TYPE_CHECKING:\n    from collections.abc import Iterable, Mapping, Sequence\n\n    from boltons.setutils import IndexedSet\n    from conda.auxlib import _Null\n    from conda.base.constants import (\n        DepsModifier,\n        UpdateModifier,\n    )\n    from conda.common.path import PathType\n    from libmambapy.solver.libsolv import Database, UnSolvable\n    from libmambapy.specs import PackageInfo\n\nlog = logging.getLogger(f\"conda.{__name__}\")\n\n\nclass LibMambaSolver(Solver):\n    MAX_SOLVER_ATTEMPTS_CAP = 10\n    _uses_ssc = False\n\n    @staticmethod\n    @cache\n    def user_agent() -> str:\n        \"\"\"\n        Expose this identifier to allow conda to extend its user agent if required\n        \"\"\"\n        return f\"conda-libmamba-solver/{__version__} libmambapy/{mamba_version()}\"\n\n    def __init__(\n        self,\n        prefix: PathType,\n        channels: Iterable[Channel | str],\n        subdirs: Iterable[str] = (),\n        specs_to_add: Iterable[MatchSpec | str] = (),\n        specs_to_remove: Iterable[MatchSpec | str] = (),\n        repodata_fn: str = REPODATA_FN,\n        command: str | _Null = NULL,\n    ):\n        if specs_to_add and specs_to_remove:\n            raise ValueError(\n                \"Only one of `specs_to_add` and `specs_to_remove` can be set at a time\"\n            )\n        if specs_to_remove and command is NULL:\n            command = \"remove\"\n\n        super().__init__(\n            os.fspath(prefix),\n            channels,\n            subdirs=subdirs,\n            specs_to_add=specs_to_add,\n            specs_to_remove=specs_to_remove,\n            repodata_fn=repodata_fn,\n            command=command,\n        )\n        if self.subdirs is NULL or not self.subdirs:\n            self.subdirs = context.subdirs\n        if \"noarch\" not in self.subdirs:\n            # Problem: Conda build generates a custom index which happens to \"forget\" about\n            # noarch on purpose when creating the build/host environments, since it merges\n            # both as if they were all in the native subdir. This causes package-not-found\n            # errors because we are not using the patched index.\n            # Fix: just add noarch to subdirs because it should always be there anyway.\n            self.subdirs = (*self.subdirs, \"noarch\")\n\n        self._repodata_fn = self._maybe_ignore_current_repodata()\n        self._libmamba_context = init_libmamba_context(\n            channels=tuple(c.canonical_name for c in self.channels),\n            platform=next(s for s in self.subdirs if s != \"noarch\"),\n            target_prefix=str(self.prefix),\n        )\n\n    def solve_final_state(\n        self,\n        update_modifier: UpdateModifier | _Null = NULL,\n        deps_modifier: DepsModifier | _Null = NULL,\n        prune: bool | _Null = NULL,\n        ignore_pinned: bool | _Null = NULL,\n        force_remove: bool | _Null = NULL,\n        should_retry_solve: bool = False,\n    ) -> IndexedSet[PackageRecord]:\n        self._log_info()\n        in_state = SolverInputState(\n            prefix=self.prefix,\n            requested=self.specs_to_add or self.specs_to_remove,\n            update_modifier=update_modifier,\n            deps_modifier=deps_modifier,\n            prune=prune,\n            ignore_pinned=ignore_pinned,\n            force_remove=force_remove,\n            command=self._command,\n        )\n        out_state = SolverOutputState(solver_input_state=in_state)\n\n        # These tasks do _not_ require a solver...\n        maybe_final_state = out_state.early_exit()\n        if maybe_final_state is not None:\n            return maybe_final_state\n\n        channels = self._collect_channel_list(in_state)\n        conda_build_channels = self._collect_channels_subdirs_from_conda_build(seen=set(channels))\n        with get_spinner(\n            self._collect_all_metadata_spinner_message(channels, conda_build_channels),\n        ):\n            # only called here by c-l-s\n            index = self._collect_all_metadata(\n                channels=channels,\n                conda_build_channels=conda_build_channels,\n                subdirs=self.subdirs,\n                in_state=in_state,\n            )\n            out_state.check_for_pin_conflicts(index)\n\n        with get_spinner(\n            self._solving_loop_spinner_message(),\n        ):\n            # This function will copy and mutate `out_state`\n            # Make sure we get the latest copy to return the correct solution below\n            out_state = self._solving_loop(in_state, out_state, index)\n            self.neutered_specs = tuple(out_state.neutered.values())\n            solution = out_state.current_solution\n\n        # Check whether conda can be updated; this is normally done in .solve_for_diff()\n        # but we are doing it now so we can reuse the index\n        self._notify_conda_outdated(None, index, solution)\n\n        return solution\n\n    # region Metadata collection\n    ############################\n\n    def _collect_all_metadata_spinner_message(\n        self,\n        channels: Iterable[Channel],\n        conda_build_channels: Iterable[Channel | str] = (),\n    ) -> str:\n        if self._called_from_conda_build():\n            msg = \"Reloading output folder\"\n            if conda_build_channels:\n                names = list(\n                    dict.fromkeys([Channel(c).canonical_name for c in conda_build_channels])\n                )\n                msg += f\" ({', '.join(names)})\"\n            return msg\n\n        canonical_names = list(dict.fromkeys([c.canonical_name for c in channels]))\n        canonical_names_dashed = \"\\n - \".join(canonical_names)\n        return (\n            f\"Channels:\\n\"\n            f\" - {canonical_names_dashed}\\n\"\n            f\"Platform: {next((s for s in self.subdirs if s != 'noarch'), context.subdir)}\\n\"\n            f\"Collecting package metadata ({self._repodata_fn})\"\n        )\n\n    def _collect_channel_list(self, in_state: SolverInputState) -> list[Channel]:\n        # Aggregate channels and subdirs\n        deduped_channels = {}\n        for channel in chain(\n            self.channels, in_state.channels_from_specs(), in_state.maybe_free_channel()\n        ):\n            if channel_platform := getattr(channel, \"platform\", None):\n                if channel_platform not in self.subdirs:\n                    log.info(\n                        \"Channel %s defines platform %s which is not part of subdirs=%s. \"\n                        \"Ignoring platform attribute...\",\n                        channel,\n                        channel_platform,\n                        self.subdirs,\n                    )\n                # Remove 'Channel.platform' to avoid missing subdirs. Channel.urls() will ignore\n                # our explicitly passed subdirs if .platform is defined!\n                channel = Channel(**{k: v for k, v in channel.dump().items() if k != \"platform\"})\n            deduped_channels[channel] = None\n        return list(deduped_channels)\n\n    def _collect_channels_subdirs_from_conda_build(\n        self,\n        seen: set[Channel] | None = None,\n    ) -> list[Channel]:\n        if self._called_from_conda_build():\n            seen = seen or set()\n            # We need to recover the local dirs (conda-build's local, output_folder, etc)\n            # from the index. This is a bit of a hack, but it works.\n            conda_build_channels = {}\n            for record in self._index or {}:\n                if record.channel.scheme == \"file\":\n                    # Remove 'Channel.platform' to avoid missing subdirs. Channel.urls()\n                    # will ignore our explicitly passed subdirs if .platform is defined!\n                    channel = Channel(\n                        **{k: v for k, v in record.channel.dump().items() if k != \"platform\"}\n                    )\n                    if channel not in seen:\n                        conda_build_channels.setdefault(channel)\n            return list(conda_build_channels)\n        return []\n\n    @time_recorder(module_name=__name__)\n    def _collect_all_metadata(\n        self,\n        channels: Iterable[Channel],\n        conda_build_channels: Iterable[Channel],\n        subdirs: Iterable[str],\n        in_state: SolverInputState | None,\n    ) -> LibMambaIndexHelper:\n        index = LibMambaIndexHelper(\n            channels=[*conda_build_channels, *channels],\n            subdirs=subdirs,\n            repodata_fn=self._repodata_fn,\n            installed_records=(\n                *in_state.installed.values(),\n                *in_state.virtual.values(),\n            ),\n            pkgs_dirs=context.pkgs_dirs if context.offline else (),\n            in_state=in_state,\n        )\n        for channel in conda_build_channels:\n            index.reload_channel(channel)\n        return index\n\n    # endregion\n\n    # region Solving\n    ################\n\n    def _solving_loop_spinner_message(self) -> str:\n        \"\"\"This shouldn't be our responsibility, but the CLI / app's...\"\"\"\n        prefix_name = os.path.basename(self.prefix)\n        if self._called_from_conda_build():\n            if \"_env\" in prefix_name:\n                env_name = \"_\".join(prefix_name.split(\"_\")[:3])\n                return f\"Solving environment ({env_name})\"\n            else:\n                # https://github.com/conda/conda-build/blob/e0884b626a/conda_build/environ.py#L1035-L1036\n                return \"Getting pinned dependencies\"\n        return \"Solving environment\"\n\n    @time_recorder(module_name=__name__)\n    def _solving_loop(\n        self,\n        in_state: SolverInputState,\n        out_state: SolverOutputState,\n        index: LibMambaIndexHelper,\n    ) -> IndexedSet[PackageRecord]:\n        for attempt in range(1, self._max_attempts(in_state) + 1):\n            try:\n                solved, outcome = self._solve_attempt(in_state, out_state, index, attempt=attempt)\n                if solved:\n                    break\n            except (UnsatisfiableError, PackagesNotFoundError):\n                solved = False\n                break  # try with last attempt\n            else:  # didn't solve yet, but can retry\n                out_state = SolverOutputState(\n                    solver_input_state=in_state,\n                    records=dict(out_state.records),\n                    for_history=dict(out_state.for_history),\n                    neutered=dict(out_state.neutered),\n                    conflicts=dict(out_state.conflicts),\n                    pins=dict(out_state.pins),\n                )\n        if not solved:\n            log.debug(\"Last attempt: reporting all installed as conflicts\")\n            out_state.conflicts.update(\n                {\n                    name: record.to_match_spec()\n                    for name, record in in_state.installed.items()\n                    if not record.is_unmanageable\n                }\n            )\n            solved, outcome = self._solve_attempt(in_state, out_state, index, attempt=attempt + 1)\n            if not solved:\n                message = self._prepare_problems_message(outcome, index.db, out_state)\n                exc = LibMambaUnsatisfiableError(message)\n                exc.allow_retry = False\n                raise exc\n\n        # We didn't fail? Nice, let's return the calculated state\n        self._export_solution(index, out_state, outcome)\n\n        # Run post-solve tasks\n        out_state.post_solve(solver=self)\n\n        return out_state\n\n    def _solve_attempt(\n        self,\n        in_state: SolverInputState,\n        out_state: SolverOutputState,\n        index: LibMambaIndexHelper,\n        attempt: int = 1,\n    ) -> tuple[bool, Solution | UnSolvable]:\n        log.info(\"Solver attempt: #%d\", attempt)\n        log.debug(\"Current conflicts (including learnt ones): %r\", out_state.conflicts)\n        flags = self._solver_flags(in_state)\n        jobs = self._specs_to_request_jobs(in_state, out_state)\n        request = Request(jobs=jobs, flags=flags)\n        solver = LibsolvSolver()\n        outcome = solver.solve(index.db, request)\n        if isinstance(outcome, Solution):\n            out_state.conflicts.clear()\n            return True, outcome\n        old_conflicts = out_state.conflicts.copy()\n        new_conflicts = self._maybe_raise_for_problems(outcome, index, out_state, old_conflicts)\n        if log.isEnabledFor(logging.DEBUG):\n            problems_as_str = outcome.problems_to_str(index.db)\n            log.debug(\n                \"Attempt %d failed with %s conflicts:\\n%s\",\n                attempt,\n                len(new_conflicts),\n                problems_as_str,\n            )\n        out_state.conflicts.update(new_conflicts)\n        return False, outcome\n\n    def _solver_flags(self, in_state: SolverInputState) -> Request.Flags:\n        flags = {\n            \"allow_downgrade\": True,\n            # About flags.allow_uninstall = True:\n            # We used to set this to False on a global basis and then add jobs\n            # individually with ALLOW_UNINSTALL=True. Libmamba v2 has a Keep job instead now.\n            \"allow_uninstall\": True,\n            \"force_reinstall\": in_state.force_reinstall,\n            \"keep_dependencies\": True,\n            \"keep_user_specs\": True,\n            # we do the sorting ourselves, but we need it as True anyway to\n            # make test_solver.py::test_pytorch_gpu pass\n            \"order_request\": True,\n            \"strict_repo_priority\": context.channel_priority is ChannelPriority.STRICT,\n        }\n        if log.isEnabledFor(logging.DEBUG):\n            log.debug(\"Using solver flags:\\n%s\", json.dumps(flags, indent=2))\n        return Request.Flags(**flags)\n\n    def _specs_to_request_jobs(\n        self,\n        in_state: SolverInputState,\n        out_state: SolverOutputState,\n    ) -> list[Request.Job]:\n        if in_state.is_removing:\n            jobs = self._specs_to_request_jobs_remove(in_state, out_state)\n        elif self._called_from_conda_build():\n            jobs = self._specs_to_request_jobs_conda_build(in_state, out_state)\n        else:\n            jobs = self._specs_to_request_jobs_add(in_state, out_state)\n\n        request_jobs = []\n        json_friendly = {}\n        for JobType, specs in jobs.items():\n            for idx, conda_spec in enumerate(specs, 1):\n                libmamba_spec = self._conda_spec_to_libmamba_spec(conda_spec)\n                request_jobs.append(JobType(libmamba_spec))\n                if log.isEnabledFor(logging.INFO):\n                    json_friendly.setdefault(JobType.__name__, []).append(str(conda_spec))\n                if JobType == Request.Pin:\n                    conda_spec = MatchSpec(conda_spec)\n                    out_state.pins[f\"pin-{idx}\"] = conda_spec\n        if log.isEnabledFor(logging.INFO):\n            json_str = json.dumps(json_friendly, indent=2)\n            log.info(\"The solver will handle these requests:\\n%s\", json_str)\n        return request_jobs\n\n    def _specs_to_request_jobs_add(\n        self,\n        in_state: SolverInputState,\n        out_state: SolverOutputState,\n    ) -> dict[Request, list[MatchSpec | str]]:\n        tasks = defaultdict(list)\n\n        # Protect history and aggressive updates from being uninstalled if possible. From libsolv\n        # docs: \"The matching installed packages are considered to be installed by a user, thus not\n        # installed to fulfill some dependency. This is needed input for the calculation of\n        # unneeded packages for jobs that have the SOLVER_CLEANDEPS flag set.\"\n        user_installed = {\n            pkg\n            for pkg in (\n                *in_state.history,\n                *in_state.aggressive_updates,\n                *in_state.pinned,\n                *in_state.do_not_remove,\n            )\n            if pkg in in_state.installed\n        }\n\n        # Fast-track python version changes (Part 1/2)\n        # ## When the Python version changes, this implies all packages depending on\n        # ## python will be reinstalled too. This can mean that we'll have to try for every\n        # ## installed package to result in a conflict before we get to actually solve everything\n        # ## A workaround is to let all non-noarch python-depending specs to \"float\" by marking\n        # ## them as a conflict preemptively\n        python_version_might_change = False\n        installed_python = in_state.installed.get(\"python\")\n        to_be_installed_python = out_state.specs.get(\"python\")\n        if installed_python and to_be_installed_python:\n            python_version_might_change = not to_be_installed_python.match(installed_python)\n\n        for name in out_state.specs:\n            installed: PackageRecord = in_state.installed.get(name)\n            if installed:\n                installed_spec = self._check_spec_compat(installed.to_match_spec())\n            else:\n                installed_spec = None\n            requested: MatchSpec = self._check_spec_compat(in_state.requested.get(name))\n            history: MatchSpec = self._check_spec_compat(in_state.history.get(name))\n            pinned: MatchSpec = self._check_spec_compat(in_state.pinned.get(name))\n            conflicting: MatchSpec = self._check_spec_compat(out_state.conflicts.get(name))\n\n            if name in user_installed and not in_state.prune and not conflicting:\n                tasks[Request.Keep].append(installed_spec)\n\n            # These specs are explicit in some sort of way\n            if pinned and not pinned.is_name_only_spec:\n                # these are the EXPLICIT pins; conda also uses implicit pinning to\n                # constrain updates too but those can be overridden in case of conflicts.\n                # name-only pins are treated as locks when installed, see below\n                tasks[Request.Pin].append(pinned)\n            # in libmamba, pins and installs are compatible tasks (pin only constrains,\n            # does not 'request' a package). In classic, pins were actually targeted installs\n            # so they were exclusive\n            if requested:\n                if requested.is_name_only_spec and pinned and not pinned.is_name_only_spec:\n                    # for name-only specs, this is a no-op; we already added the pin above\n                    # but we will constrain it again in the install task to have better\n                    # error messages if not solvable\n                    spec = pinned\n                else:\n                    spec = requested\n                if installed:\n                    tasks[Request.Update].append(spec)\n                    if name not in (MatchSpec(spec).name for spec in tasks[Request.Keep]):\n                        tasks[Request.Keep].append(name)\n                else:\n                    tasks[Request.Install].append(spec)\n            elif name in in_state.always_update:\n                tasks[Request.Update].append(name)\n            # These specs are \"implicit\"; the solver logic massages them for better UX\n            # as long as they don't cause trouble\n            elif in_state.prune:\n                continue\n            elif name == \"python\" and installed and not pinned:\n                pyver = \".\".join(installed.version.split(\".\")[:2])\n                tasks[Request.Pin].append(f\"python {pyver}.*\")\n            elif history:\n                if conflicting and history.strictness == 3:\n                    # relax name-version-build (strictness=3) history specs that cause conflicts\n                    # this is called neutering and makes test_neutering_of_historic_specs pass\n                    version = str(history.version or \"\")\n                    if version.startswith(\"==\"):\n                        spec_str = f\"{name} {version[2:]}\"\n                    elif version.startswith((\"!=\", \">\", \"<\")):\n                        spec_str = f\"{name} {version}\"\n                    elif version:\n                        spec_str = f\"{name} {version}.*\"\n                    else:\n                        spec_str = name\n                    tasks[Request.Install].append(spec_str)\n                else:\n                    tasks[Request.Install].append(history)\n            elif installed:\n                if conflicting:\n                    # NOTE: We don't do anything now with conflicting installed.\n                    # We rely on Flags.allow_uninstall = True doing the right thing.\n                    # We are protecting important things with Keep or Freeze instead.\n                    pass\n                else:\n                    # we freeze everything else as installed\n                    lock = in_state.update_modifier.FREEZE_INSTALLED\n                    if pinned and pinned.is_name_only_spec:\n                        # name-only pins are treated as locks when installed\n                        lock = True\n                    if python_version_might_change and installed.noarch is None:\n                        for dep in installed.depends:\n                            if MatchSpec(dep).name in (\"python\", \"python_abi\"):\n                                lock = False\n                                break\n                    if lock:\n                        tasks[Request.Freeze].append(installed_spec)\n                    # enabling this else branch makes\n                    # conda/conda's tests/core/test_solve.py::test_freeze_deps_1[libmamba] fail\n                    # else:\n                    #     tasks[Request.Keep].append(name)\n\n        # Sort tasks by priority\n        # This ensures that more important tasks are added to the solver first\n        returned_tasks = {}\n        for task_type in (\n            Request.Pin,\n            Request.Install,\n            Request.Update,\n            Request.Keep,\n            Request.Freeze,\n        ):\n            if task_type in tasks:\n                returned_tasks[task_type] = tasks[task_type]\n        return returned_tasks\n\n    def _specs_to_request_jobs_remove(\n        self, in_state: SolverInputState, out_state: SolverOutputState\n    ) -> dict[Request, list[MatchSpec | str]]:\n        # TODO: Consider merging add/remove in a single logic this so there's no split\n\n        tasks = defaultdict(list)\n\n        # Protect history and aggressive updates from being uninstalled if possible\n        for name, record in out_state.records.items():\n            if name in in_state.history or name in in_state.aggressive_updates:\n                # MatchSpecs constructed from PackageRecords get parsed too\n                # strictly if exported via str(). Use .conda_build_form() directly.\n                spec = record.to_match_spec().conda_build_form()\n                tasks[Request.Keep].append(spec)\n\n        # No complications here: delete requested and their deps\n        # TODO: There are some flags to take care of here, namely:\n        # --all\n        # --no-deps\n        # --deps-only\n        for name, spec in in_state.requested.items():\n            spec = self._check_spec_compat(spec)\n            tasks[Request.Remove].append(str(spec))\n\n        return dict(tasks)\n\n    def _specs_to_request_jobs_conda_build(\n        self, in_state: SolverInputState, out_state: SolverOutputState\n    ) -> dict[Request, list[MatchSpec | str]]:\n        tasks = defaultdict(list)\n        for name, spec in in_state.requested.items():\n            if name.startswith(\"__\"):\n                continue\n            spec = self._check_spec_compat(spec)\n            spec = self._fix_version_field_for_conda_build(spec)\n            tasks[Request.Install].append(spec.conda_build_form())\n\n        return dict(tasks)\n\n    # endregion\n\n    # region Export to conda\n    ########################\n\n    def _export_solution(\n        self,\n        index: LibMambaIndexHelper,\n        out_state: SolverOutputState,\n        solution: Solution,\n    ) -> SolverOutputState:\n        for action in solution.actions:\n            record_to_install: PackageInfo = getattr(action, \"install\", None)\n            record_to_remove: PackageInfo = getattr(action, \"remove\", None)\n            if record_to_install:\n                if record_to_install.name.startswith(\"__\"):\n                    continue\n                record = self._package_info_to_package_record(record_to_install, index)\n                out_state.records[record.name] = record\n            elif record_to_remove:\n                if record_to_remove.name.startswith(\"__\"):\n                    continue\n                record = self._package_info_to_package_record(record_to_remove, index)\n                out_state.records.pop(record.name, None)\n        return out_state\n\n    def _package_info_to_package_record(\n        self,\n        pkg: PackageInfo,\n        index: LibMambaIndexHelper,\n    ) -> PackageRecord:\n        if pkg.noarch == NoArchType.Python:\n            noarch = \"python\"\n        elif pkg.noarch == NoArchType.Generic:\n            noarch = \"generic\"\n        else:\n            noarch = None\n        # The package download logic needs the URL with credentials\n        for repo_info in index.repos:\n            if pkg.package_url.startswith(repo_info.url_no_cred):\n                url = pkg.package_url.replace(repo_info.url_no_cred, repo_info.url_w_cred)\n                break\n        else:\n            url = pkg.package_url\n        url = percent_decode(url)\n\n        # Signature verification requires channel information _with_ subdir data\n        channel = Channel(pkg.channel)\n        if not channel.subdir:\n            # conda caches channels created using single values\n            # Avoid the cache by using keyword arguments\n            channel = Channel(\n                scheme=channel.scheme,\n                auth=channel.auth,\n                location=channel.location,\n                token=channel.token,\n                name=channel.name,\n                platform=pkg.platform,\n                package_filename=channel.package_filename,\n            )\n\n        return PackageRecord(\n            name=pkg.name,\n            version=pkg.version,\n            build=pkg.build_string,  # NOTE: Different attribute name\n            build_number=pkg.build_number,\n            channel=channel,\n            url=url,\n            subdir=pkg.platform,  # NOTE: Different attribute name\n            fn=pkg.filename,  # NOTE: Different attribute name\n            license=pkg.license,\n            python_site_packages_path=getattr(pkg, \"python_site_packages_path\", \"\") or None,\n            md5=pkg.md5,\n            sha256=pkg.sha256,\n            signatures=pkg.signatures,\n            track_features=pkg.track_features,\n            depends=pkg.dependencies,  # NOTE: Different attribute name\n            constrains=pkg.constrains,\n            defaulted_keys=pkg.defaulted_keys,\n            noarch=noarch,\n            size=pkg.size,\n            timestamp=pkg.timestamp,\n        )\n\n    # endregion\n\n    # region Error reporting\n    ########################\n\n    @classmethod\n    def _parse_problems(cls, unsolvable: UnSolvable, db: Database) -> Mapping[str, MatchSpec]:\n        \"\"\"\n        Problems can signal either unsatisfiability or unavailability.\n        First will raise LibmambaUnsatisfiableError.\n        Second will raise PackagesNotFoundError.\n\n        Libmamba can return spec strings in two formats:\n        - With dashes, e.g. package-1.2.3-h5487548_0\n        - à la conda-build, e.g. package 1.2.* *\n        - just names, e.g. package\n        \"\"\"\n        conflicts = []\n        not_found = []\n        problems = []\n        has_unsupported = False\n        for problem in unsolvable.problems(db):\n            if problem == \"unsupported request\":\n                has_unsupported = True\n            else:\n                problems.append(problem)\n        if has_unsupported:  # we put it at the end to prioritize other more meaningful problems\n            problems.append(\"unsupported request\")\n\n        try:\n            explained_problems = unsolvable.explain_problems(db, problems_format_nocolor)\n        except Exception as exc:\n            log.debug(\"Cannot explain problems\", exc_info=exc)\n            explained_problems = \"\"\n        for line in problems:\n            words = line.split()\n            if \"none of the providers can be installed\" in line:\n                if words[0] != \"package\" or words[2] != \"requires\":\n                    raise ValueError(f\"Unknown message: {line}\")\n                conflicts.append(cls._matchspec_from_error_str(words[1]))\n                end = words.index(\"but\")\n                conflicts.append(cls._matchspec_from_error_str(words[3:end]))\n            elif \"nothing provides\" in line:\n                start, marker = None, None\n                for i, word in enumerate(words):\n                    if word == \"needed\":\n                        marker = i\n                    elif word == \"provides\":\n                        start = i + 1\n                if marker is not None:\n                    conflicts.append(cls._matchspec_from_error_str(words[-1]))\n                not_found.append(cls._matchspec_from_error_str(words[start:marker]))\n            elif \"has constraint\" in line and \"conflicting with\" in line:\n                # package libzlib-1.2.11-h4e544f5_1014 has constraint zlib 1.2.11 *_1014\n                # conflicting with zlib-1.2.13-h998d150_0\n                conflicts.append(cls._matchspec_from_error_str(words[-1]))\n            elif \"cannot install both pin-\" in line and \"and pin-\" in line:\n                # a pin is in conflict with another pin\n                pin_a = words[3].rsplit(\"-\", 1)[0]\n                pin_b = words[5].rsplit(\"-\", 1)[0]\n                conflicts.append(MatchSpec(pin_a))\n                conflicts.append(MatchSpec(pin_b))\n            elif \"is excluded by strict repo priority\" in line:\n                # package python-3.7.6-h0371630_2 is excluded by strict repo priority\n                conflicts.append(cls._matchspec_from_error_str(words[1]))\n            elif line == \"unsupported request\":\n                # libmamba v2 has this message for package not found errors\n                # we need to double check with the explained problem\n                for explained_line in explained_problems.splitlines():\n                    explained_line = explained_line.lstrip(\"│├└─ \").strip()\n                    explained_words = explained_line.split()\n                    if \"does not exist\" in explained_line and \"which\" not in explained_line:\n                        end = explained_words.index(\"does\")\n                        not_found.append(cls._matchspec_from_error_str(explained_words[:end]))\n                        break\n            else:\n                log.debug(\"! Problem line not recognized: %s\", line)\n\n        return {\n            \"conflicts\": {s.name: s for s in conflicts},\n            \"not_found\": {s.name: s for s in not_found},\n        }\n\n    def _maybe_raise_for_problems(\n        self,\n        unsolvable: UnSolvable,\n        index: LibMambaIndexHelper,\n        out_state: SolverOutputState,\n        previous_conflicts: Mapping[str, MatchSpec] = None,\n    ) -> None:\n        parsed_problems = self._parse_problems(unsolvable, index.db)\n        # We allow conda-build (if present) to process the exception early\n        self._maybe_raise_for_conda_build(\n            {**parsed_problems[\"conflicts\"], **parsed_problems[\"not_found\"]},\n            message=self._prepare_problems_message(unsolvable, index.db, out_state),\n        )\n\n        unsatisfiable = parsed_problems[\"conflicts\"]\n        not_found = parsed_problems[\"not_found\"]\n        if not unsatisfiable and not_found:\n            if log.isEnabledFor(logging.DEBUG):\n                log.debug(\n                    \"Inferred PackagesNotFoundError %s from conflicts:\\n%s\",\n                    tuple(not_found.keys()),\n                    unsolvable.explain_problems(index.db, problems_format_nocolor),\n                )\n            # This is not a conflict, but a missing package in the channel\n            exc = PackagesNotFoundError(tuple(not_found.values()), tuple(index.channels))\n            exc.allow_retry = False\n            raise exc\n\n        previous = previous_conflicts or {}\n        previous_set = set(previous.values())\n        current_set = set(unsatisfiable.values())\n\n        diff = current_set.difference(previous_set)\n        if len(diff) > 1 and \"python\" in unsatisfiable:\n            # Only report python as conflict if it's the only conflict reported\n            # This helps us prioritize neutering for other dependencies first\n            unsatisfiable.pop(\"python\")\n\n        if (previous and (previous_set == current_set)) or len(diff) >= 10:\n            # We have same or more (up to 10) unsatisfiable now! Abort to avoid recursion\n            message = self._prepare_problems_message(unsolvable, index.db, out_state)\n            exc = LibMambaUnsatisfiableError(message)\n            # do not allow conda.cli.install to try more things\n            exc.allow_retry = False\n            raise exc\n        return unsatisfiable\n\n    def _prepare_problems_message(\n        self, unsolvable: UnSolvable, db: Database, out_state: SolverOutputState\n    ) -> str:\n        message = unsolvable.problems_to_str(db)\n        explain = True\n        if \" - \" not in message:\n            # This makes 'explain_problems()' crash. Anticipate.\n            message = \"Failed with empty error message.\"\n            explain = False\n        elif \"is excluded by strict repo priority\" in message:\n            # This will cause a lot of warnings until implemented in detail explanations\n            log.info(\"Skipping error explanation. Excluded by strict repo priority.\")\n            explain = False\n\n        if explain:\n            try:\n                explained_errors = unsolvable.explain_problems(db, problems_format_auto)\n                message += \"\\n\" + explained_errors\n            except Exception as exc:\n                log.warning(\"Failed to explain problems\", exc_info=exc)\n        if out_state.pins and \"pin on \" in message:  # add info about pins for easier debugging\n            pin_message = \"Pins seem to be involved in the conflict. Currently pinned specs:\\n\"\n            for _, spec in out_state.pins.items():\n                pin_message += f\" - {spec}\\n\"\n            message += f\"\\n\\n{pin_message}\"\n        return message\n\n    def _maybe_raise_for_conda_build(\n        self,\n        conflicting_specs: Mapping[str, MatchSpec],\n        message: str = None,\n    ) -> None:\n        # TODO: Remove this hack for conda-build compatibility >_<\n        # conda-build expects a slightly different exception format\n        # good news is that we don't need to retry much, because all\n        # conda-build envs are fresh - if we found a conflict, we report\n        # right away to let conda build handle it\n        if not self._called_from_conda_build():\n            return\n        if not conflicting_specs:\n            return\n        from .conda_build_exceptions import ExplainedDependencyNeedsBuildingError\n\n        # the patched index should contain the arch we are building this env for\n        # if the index is empty, we default to whatever platform we are running on\n        subdir = next((subdir for subdir in self.subdirs if subdir != \"noarch\"), context.subdir)\n        exc = ExplainedDependencyNeedsBuildingError(\n            packages=list(conflicting_specs.keys()),\n            matchspecs=list(conflicting_specs.values()),\n            subdir=subdir,\n            explanation=message,\n        )\n        raise exc\n\n    # endregion\n\n    # region General helpers\n    ########################\n\n    def _log_info(self) -> None:\n        log.info(\"conda version: %s\", _conda_version)\n        log.info(\"conda-libmamba-solver version: %s\", __version__)\n        log.info(\"libmambapy version: %s\", mamba_version())\n        log.info(\"Target prefix: %r\", self.prefix)\n        log.info(\"Command: %s\", sys.argv)\n\n    def _called_from_conda_build(self) -> bool:\n        \"\"\"\n        conda build calls the solver via `conda.plan.install_actions`, which\n        overrides Solver._index (populated in the classic solver, but empty for us)\n        with a custom index. We can use this to detect whether conda build is in use\n        and apply some compatibility fixes.\n        \"\"\"\n        return (\n            # conda_build.environ.get_install_actions will always pass a custom 'index'\n            # which conda.plan.install_actions uses to override our null Solver._index\n            getattr(self, \"_index\", None)\n            # Is conda build in use? In that case, it should have been imported\n            and \"conda_build\" in sys.modules\n            # Confirm conda_build.environ's 'get_install_actions' and conda.plan's\n            # 'install_actions' are in the call stack. We don't check order or\n            # contiguousness, but what are the chances at this point...?\n            # frame[3] contains the name of the function in that frame of the stack\n            and {\"install_actions\", \"get_install_actions\"} <= {frame[3] for frame in stack()}\n        )\n\n    def _check_spec_compat(self, spec: MatchSpec | None) -> MatchSpec | None:\n        if spec is None:\n            return\n        spec_fields = {}\n        for field in spec.FIELD_NAMES:\n            value = spec.get_raw_value(field)\n            if value:\n                if field == \"channel\":\n                    if str(value) == \"<unknown>\":\n                        continue\n                    if not getattr(value, \"name\", \"\"):\n                        # channels like http://localhost:8000 don't have a name\n                        # this makes mamba choke so we should skip it\n                        # however the subdir is still useful information; keep it!\n                        if getattr(value, \"platform\", \"\"):\n                            spec_fields[\"subdir\"] = value.platform\n                        continue\n                spec_fields[field] = value\n        return MatchSpec(**spec_fields)\n\n    def _conda_spec_to_libmamba_spec(self, spec: MatchSpec) -> LibmambaMatchSpec:\n        return LibmambaMatchSpec.parse(str(spec))\n\n    @staticmethod\n    def _fix_version_field_for_conda_build(spec: MatchSpec) -> MatchSpec:\n        \"\"\"Fix taken from mambabuild\"\"\"\n        if spec.version:\n            only_dot_or_digit_re = re.compile(r\"^[\\d\\.]+$\")\n            version_str = str(spec.version)\n            if re.match(only_dot_or_digit_re, version_str):\n                spec_fields = spec.conda_build_form().split()\n                if version_str.count(\".\") <= 1:\n                    spec_fields[1] = version_str + \".*\"\n                else:\n                    spec_fields[1] = version_str + \"*\"\n                return MatchSpec(\" \".join(spec_fields))\n        return spec\n\n    @staticmethod\n    def _matchspec_from_error_str(spec: str | Sequence[str]) -> MatchSpec:\n        try:\n            if isinstance(spec, str):\n                name, version, build = spec.rsplit(\"-\", 2)\n                return MatchSpec(name=name, version=version, build=build)\n            else:\n                kwargs = {\"name\": spec[0].rstrip(\",\")}\n                if len(spec) >= 2 and spec[1] != \"=*\":\n                    if spec[1].startswith(\"==\") or not spec[1].startswith(\"=\"):\n                        kwargs[\"version\"] = spec[1].rstrip(\",\")\n                    else:\n                        kwargs[\"version\"] = spec[1][1:].rstrip(\",\") + \".*\"\n                if len(spec) == 3 and spec[2] != \"*\":\n                    kwargs[\"build\"] = spec[2].rstrip(\",\")\n                return MatchSpec(**kwargs)\n        except Exception as exc:\n            raise ValueError(f\"Could not parse spec: {spec}\") from exc\n\n    def _maybe_ignore_current_repodata(self) -> str:\n        is_repodata_fn_set = False\n        for config in context.collect_all().values():\n            for key, value in config.items():\n                if key == \"repodata_fns\" and value:\n                    is_repodata_fn_set = True\n                    break\n        if self._repodata_fn == \"current_repodata.json\" and not is_repodata_fn_set:\n            log.debug(\n                \"Ignoring repodata_fn='current_repodata.json', defaulting to %s\",\n                REPODATA_FN,\n            )\n            return REPODATA_FN\n        return self._repodata_fn\n\n    def _max_attempts(self, in_state: SolverInputState, default: int = 1) -> int:\n        from_env_var = os.environ.get(\"CONDA_LIBMAMBA_SOLVER_MAX_ATTEMPTS\")\n        installed_count = len(in_state.installed)\n        if from_env_var:\n            try:\n                max_attempts_from_env = int(from_env_var)\n            except ValueError:\n                raise CondaValueError(\n                    f\"CONDA_LIBMAMBA_SOLVER_MAX_ATTEMPTS='{from_env_var}'. Must be int.\"\n                )\n            if max_attempts_from_env < 1:\n                raise CondaValueError(\n                    f\"CONDA_LIBMAMBA_SOLVER_MAX_ATTEMPTS='{max_attempts_from_env}'. Must be >=1.\"\n                )\n            elif max_attempts_from_env > installed_count:\n                log.warning(\n                    \"CONDA_LIBMAMBA_SOLVER_MAX_ATTEMPTS='%s' is higher than the number of \"\n                    \"installed packages (%s). Using that one instead.\",\n                    max_attempts_from_env,\n                    installed_count,\n                )\n                return installed_count\n            else:\n                return max_attempts_from_env\n        elif in_state.update_modifier.FREEZE_INSTALLED and installed_count:\n            # this the default, but can be overriden with --update-specs\n            # we cap at MAX_SOLVER_ATTEMPTS_CAP attempts to avoid things\n            # getting too slow in large environments\n            return min(self.MAX_SOLVER_ATTEMPTS_CAP, installed_count)\n        else:\n            return default\n\n    def _notify_conda_outdated(\n        self,\n        link_precs: Iterable[PackageRecord],\n        index: LibMambaIndexHelper | None = None,\n        final_state: Iterable[PackageRecord] | None = None,\n    ) -> None:\n        \"\"\"\n        We are overriding the base class implementation, which gets called in\n        Solver.solve_for_diff() once 'link_precs' is available. However, we\n        are going to call it before (in .solve_final_state(), right after the solve).\n        That way we can reuse the IndexHelper and SolverOutputState instances we have\n        around, which contains the channel and env information we need, before losing them.\n        \"\"\"\n        if index is None and final_state is None:\n            # The parent class 'Solver.solve_for_diff()' method will call this method again\n            # with only 'link_precs' as the argument, because that's the original method signature.\n            # We have added two optional kwargs (index and final_state) so we can call this method\n            # earlier, in .solve_final_state(), while we still have access to the index helper\n            # (which allows us to query the available packages in the channels quickly, without\n            # reloading the channels with conda) and the final_state (which gives the list of\n            # packages to be installed). So, if both index and final_state are None, we return\n            # because that means that the method is being called from .solve_for_diff() and at\n            # that point we will have already called it from .solve_for_state().\n            return\n        if not context.notify_outdated_conda or context.quiet:\n            # This check can be silenced with a specific option in the context or in quiet mode\n            return\n\n        prefix_data = PrefixData(context.root_prefix)\n        current_conda_prefix_rec = prefix_data.get(\"conda\", None)\n\n        if not current_conda_prefix_rec:\n            # We are checking whether conda can be found in the environment conda is\n            # running from. Unless something is really wrong, this should never happen.\n            return\n\n        channel_name = current_conda_prefix_rec.channel.canonical_name\n        if channel_name in (UNKNOWN_CHANNEL, \"@\", \"<develop>\", \"pypi\"):\n            channel_name = \"defaults\"\n\n        # only check the loaded index if it contains the channel conda should come from\n        # otherwise ignore\n        index_channels = {getattr(chn, \"canonical_name\", chn) for chn in index.channels}\n        if channel_name not in index_channels:\n            return\n\n        # we only want to check if a newer conda is available in the channel we installed it from\n        conda_newer_str = f\"{channel_name}::conda>{_conda_version}\"\n        conda_newer_spec = MatchSpec(conda_newer_str)\n\n        # if target prefix is the same conda is running from\n        # maybe the solution we are proposing already contains\n        # an updated conda! in that case, we don't need to check further\n        if paths_equal(self.prefix, context.conda_prefix):\n            if any(conda_newer_spec.match(record) for record in final_state):\n                return\n\n        # check if the loaded index contains records that match a more recent conda version\n        conda_newer_records = index.search(conda_newer_str)\n\n        # print instructions to stderr if we found a newer conda\n        if conda_newer_records:\n            newest = max(conda_newer_records, key=lambda x: VersionOrder(x.version))\n            conda_update_message = f\"conda update -n base -c {channel_name} conda\"\n            if prefix_data.is_frozen():\n                if prefix_data.get(\"conda-self\", None):\n                    conda_update_message = \"conda self update\"\n                else:\n                    conda_update_message += \" --override-frozen\"\n\n            print(\n                dedent(\n                    f\"\"\"\n\n                    ==> WARNING: A newer version of conda exists. <==\n                        current version: {_conda_version}\n                        latest version: {newest.version}\n\n                    Please update conda by running\n\n                        $ {conda_update_message}\n\n                    \"\"\"\n                ),\n                file=sys.stderr,\n            )\n\n    # endregion\n"
  },
  {
    "path": "conda_libmamba_solver/state.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nSolver-agnostic logic to compose the requests passed to the solver\nand accumulate its results.\n\nThe state exposed to the solver is handled by two objects whose primary\nfunction is to serve read-only information to the solver and its other helpers.\n\n- ``SolverInputState``: fully solver agnostic. It handles:\n    - The local state on disk, namely the prefix state. This includes the\n      already installed packages in the prefix (if any), the explicit requests\n      made in that prefix in the past (history), its pinned specs, packages\n      configured as aggressive updates and others.\n    - The runtime context, determined by the configuration file(s),\n      `CONDA_*` environment variables, command line flags and the requested\n      specs (if any).\n- ``IndexHelper``: can be subclassed to add solver-specific logic\n  (e.g. custom index building). It should, provide, at least, a method to\n  query the index for the _explicit pool_ of packages for a given spec (e.g.\n  its potential dependency tree). Note that the IndexHelper might need\n  pieces of ``SolverInputState`` to build the index (e.g. installed packages,\n  configured channels and subdirs...)\n\n.. todo::\n\n    Embed IndexHelper in SolverInputState?\n\nSince ``conda`` follows an iterative approach to solve a request,\nin addition the _input_ state, the Solver itself can store additional state\nin a separate helper: the ``SolverOutputState`` object. This is meant to help\naccumulate the following pieces of data:\n\n- ``specs``: a mapping of package names to its corresponding ``MatchSpec``\n  objects. These objects are passed to the actual Solver, hoping it will return\n  a solution.\n- ``records``: a mapping of package names to ``PackageRecord`` objects. It will\n  end up containing the list of package records that will compose the final state\n  of the prefix (the _solution_). Its default value is set to the currently installed\n  packages in the prefix. The solver will alter this list as needed to accommodate\n  the final solution.\n\nIf the algorithm was not iterative, the sole purpose of the solver would be to turn\nthe ``specs`` into ``records``. However, ``conda``'s logic will try to constrain the\nsolution to mimic the initial state as much as possible to reduce the amount of\nchanges in the prefix. Sometimes, the initial request is too constrained, which results\nin a number of conflicts. These conflicts are then stored in the ``conflicts`` mapping,\nwhich will determine which ``specs`` are relaxed in the next attempt. Additionally,\n``conda`` stores other solve artifacts:\n\n- ``for_history``: The explicitly requested specs in the command-line should end up\n  in the history. Some modifier flags can affect how this mapping is populated (e.g.\n  ``--update-deps``.)\n- ``neutered``: Pieces of history that were found to be conflicting in the future and\n  were annotated as such to avoid falling in the same conflict again.\n\nThe mappings stored in ``SolverOutputState`` are backed by ``TrackedMap`` objects,\nwhich allow to keep the reasons _why_ those specs or records were added to the mappings,\nas well as richer logging for each action.\n\"\"\"\n# TODO: This module could be part of conda-core once if we refactor the classic logic\n\nfrom __future__ import annotations\n\nimport logging\nfrom types import MappingProxyType\nfrom typing import TYPE_CHECKING\n\nfrom boltons.setutils import IndexedSet\nfrom conda.auxlib import NULL\nfrom conda.base.constants import DepsModifier, UpdateModifier\nfrom conda.base.context import context\nfrom conda.common.path import paths_equal\nfrom conda.core.index import Index\nfrom conda.core.prefix_data import PrefixData\nfrom conda.core.solve import get_pinned_specs\nfrom conda.exceptions import PackagesNotFoundError, SpecsConfigurationConflictError\nfrom conda.history import History\nfrom conda.models.channel import Channel\nfrom conda.models.match_spec import MatchSpec\nfrom conda.models.prefix_graph import PrefixGraph\n\nif TYPE_CHECKING:\n    from collections.abc import Iterable\n    from os import PathLike\n    from typing import Any\n\n    from conda.core.solve import Solver\n    from conda.models.records import PackageRecord\n\n    from .index import LibMambaIndexHelper\n\nfrom .utils import EnumAsBools, compatible_specs\n\nlog = logging.getLogger(f\"conda.{__name__}\")\n\n\nclass SolverInputState:\n    \"\"\"\n    Helper object to provide the input data needed to compute the state that will be\n    exposed to the solver.\n\n    Parameters\n    ----------\n    prefix\n        Path to the prefix we are operating on. This will be used to expose\n        ``PrefixData``, ``History``, pinned specs, among others.\n    requested\n        The MatchSpec objects required by the user (either in the command line or\n        through the Python API).\n    update_modifier\n        A value of ``UpdateModifier``, which has an effect on which specs are added\n        to the final list. The default value here must match the default value in the\n        ``context`` object.\n    deps_modifier\n        A value of ``DepsModifier``, which has an effect on which specs are added\n        to the final list. The default value here must match the default value in the\n        ``context`` object.\n    ignore_pinned\n        Whether pinned specs can be ignored or not. The default value here must match\n        the default value in the ``context`` object.\n    force_remove\n        Remove the specs without solving the environment (which would also remove their)\n        dependencies. The default value here must match the default value in the\n        ``context`` object.\n    force_reinstall\n        Uninstall and install the computed records even if they were already satisfied\n        in the given prefix. The default value here must match the default value in the\n        ``context`` object.\n    prune\n        Remove dangling dependencies that ended up orphan. The default value here must\n        match the default value in the ``context`` object.\n    command\n        The subcommand used to invoke this operation (e.g. ``create``, ``install``, ``remove``...).\n        It can have an effect on the computed list of records.\n    _pip_interop_enabled\n        Internal only. Whether ``PrefixData`` will also expose packages not installed by\n        ``conda`` (e.g. ``pip`` and others can put Python packages in the prefix).\n    \"\"\"\n\n    _ENUM_STR_MAP = {\n        \"NOT_SET\": DepsModifier.NOT_SET,\n        \"NO_DEPS\": DepsModifier.NO_DEPS,\n        \"ONLY_DEPS\": DepsModifier.ONLY_DEPS,\n        \"SPECS_SATISFIED_SKIP_SOLVE\": UpdateModifier.SPECS_SATISFIED_SKIP_SOLVE,\n        \"FREEZE_INSTALLED\": UpdateModifier.FREEZE_INSTALLED,\n        \"UPDATE_DEPS\": UpdateModifier.UPDATE_DEPS,\n        \"UPDATE_SPECS\": UpdateModifier.UPDATE_SPECS,\n        \"UPDATE_ALL\": UpdateModifier.UPDATE_ALL,\n    }\n    _DO_NOT_REMOVE_NAMES = (\n        \"anaconda\",\n        \"conda\",\n        \"conda-build\",\n        \"python.app\",\n        \"console_shortcut\",\n        \"powershell_shortcut\",\n    )\n\n    def __init__(\n        self,\n        prefix: str | bytes | PathLike,\n        requested: Iterable[str | MatchSpec] | None = (),\n        update_modifier: UpdateModifier | None = UpdateModifier.UPDATE_SPECS,\n        deps_modifier: DepsModifier | None = DepsModifier.NOT_SET,\n        ignore_pinned: bool | None = None,\n        force_remove: bool | None = False,\n        force_reinstall: bool | None = False,\n        prune: bool | None = False,\n        command: str | None = None,\n        _pip_interop_enabled: bool | None = None,\n    ):\n        self.prefix = prefix\n        self._prefix_data = PrefixData(prefix, interoperability=_pip_interop_enabled)\n        self._pip_interop_enabled = _pip_interop_enabled\n        self._history = History(prefix).get_requested_specs_map()\n        self._pinned = {spec.name: spec for spec in get_pinned_specs(prefix)}\n        self._aggressive_updates = {spec.name: spec for spec in context.aggressive_update_packages}\n\n        virtual = Index().system_packages\n        self._virtual = {record.name: record for record in virtual}\n\n        self._requested = {}\n        for spec in requested:\n            spec = MatchSpec(spec)\n            self._requested[spec.name] = spec\n\n        self._update_modifier = self._default_to_context_if_null(\n            \"update_modifier\", update_modifier\n        )\n        if prune and self._update_modifier == UpdateModifier.FREEZE_INSTALLED:\n            self._update_modifier = UpdateModifier.UPDATE_SPECS  # revert to default\n        self._deps_modifier = self._default_to_context_if_null(\"deps_modifier\", deps_modifier)\n        self._ignore_pinned = self._default_to_context_if_null(\"ignore_pinned\", ignore_pinned)\n        self._force_remove = self._default_to_context_if_null(\"force_remove\", force_remove)\n        self._force_reinstall = self._default_to_context_if_null(\n            \"force_reinstall\", force_reinstall\n        )\n        self._prune = prune\n        self._command = command\n\n        # special cases\n        self._do_not_remove = {p: MatchSpec(p) for p in self._DO_NOT_REMOVE_NAMES}\n\n    def _default_to_context_if_null(self, name, value, context=context) -> Any:\n        \"Obtain default value from the context if value is set to NULL; otherwise leave as is\"\n        return getattr(context, name) if value is NULL else self._ENUM_STR_MAP.get(value, value)\n\n    @property\n    def prefix_data(self) -> PrefixData:\n        \"\"\"\n        A direct reference to the ``PrefixData`` object for the given ``prefix``.\n        You will usually use this object through the ``installed`` property.\n        \"\"\"\n        return self._prefix_data\n\n    # Prefix state pools\n\n    @property\n    def installed(self) -> dict[str, PackageRecord]:\n        \"\"\"\n        This exposes the installed packages in the prefix. Note that a ``PackageRecord``\n        can generate an equivalent ``MatchSpec`` object with ``.to_match_spec()``.\n        Records are toposorted.\n        \"\"\"\n        return MappingProxyType(dict(sorted(self.prefix_data._prefix_records.items())))\n\n    @property\n    def history(self) -> dict[str, MatchSpec]:\n        \"\"\"\n        These are the specs that the user explicitly asked for in previous operations\n        on the prefix. See :class:`History` for more details.\n        \"\"\"\n        return MappingProxyType(self._history)\n\n    @property\n    def pinned(self) -> dict[str, MatchSpec]:\n        \"\"\"\n        These specs represent hard constrains on what package versions can be installed\n        on the environment. The packages here returned don't need to be already installed.\n\n        If ``ignore_pinned`` is True, this returns an empty dictionary.\n        \"\"\"\n        if self.ignore_pinned:\n            return MappingProxyType({})\n        return MappingProxyType(self._pinned)\n\n    @property\n    def virtual(self) -> dict[str, MatchSpec]:\n        \"\"\"\n        System properties exposed as virtual packages (e.g. ``__glibc=2.17``). These packages\n        cannot be (un)installed, they only represent constrains for other packages. By convention,\n        their names start with a double underscore.\n        \"\"\"\n        return MappingProxyType(dict(sorted(self._virtual.items())))\n\n    @property\n    def aggressive_updates(self) -> dict[str, MatchSpec]:\n        \"\"\"\n        Packages that the solver will always try to update. As such, they will never have an\n        associated version or build constrain. Note that the packages here returned do not need to\n        be installed.\n        \"\"\"\n        return MappingProxyType(self._aggressive_updates)\n\n    @property\n    def always_update(self) -> dict[str, MatchSpec]:\n        \"\"\"\n        Merged lists of packages that should always be updated, depending on the flags, including:\n        - aggressive_updates\n        - conda if auto_update_conda is true and we are on the base env\n        - almost all packages if update_all is true\n        - etc\n        \"\"\"\n        installed = self.installed\n        pinned = self.pinned\n        pkgs = {pkg: MatchSpec(pkg) for pkg in self.aggressive_updates if pkg in installed}\n        if context.auto_update_conda and paths_equal(self.prefix, context.root_prefix):\n            pkgs.setdefault(\"conda\", MatchSpec(\"conda\"))\n        if self.update_modifier.UPDATE_ALL:\n            for pkg in installed:\n                if pkg != \"python\" and pkg not in pinned:\n                    pkgs.setdefault(pkg, MatchSpec(pkg))\n        return MappingProxyType(pkgs)\n\n    @property\n    def do_not_remove(self) -> dict[str, MatchSpec]:\n        \"\"\"\n        Packages that are protected by the solver so they are not accidentally removed. This list\n        is not configurable, but hardcoded for legacy reasons.\n        \"\"\"\n        return MappingProxyType(self._do_not_remove)\n\n    @property\n    def requested(self) -> dict[str, MatchSpec]:\n        \"\"\"\n        Packages that the user has explicitly asked for in this operation.\n        \"\"\"\n        return MappingProxyType(self._requested)\n\n    # Types of commands\n\n    @property\n    def is_installing(self) -> bool:\n        \"\"\"\n        True if the used subcommand was ``install``.\n        \"\"\"\n        return self._command == \"install\"\n\n    @property\n    def is_updating(self) -> bool:\n        \"\"\"\n        True if the used subcommand was ``update``.\n        \"\"\"\n        return self._command == \"update\"\n\n    @property\n    def is_creating(self) -> bool:\n        \"\"\"\n        True if the used subcommand was ``create``.\n        \"\"\"\n        return self._command == \"create\"\n\n    @property\n    def is_removing(self) -> bool:\n        \"\"\"\n        True if the used subcommand was ``remove``.\n        \"\"\"\n        return self._command == \"remove\"\n\n    # modifiers\n\n    @property\n    def update_modifier(self) -> EnumAsBools:\n        \"\"\"\n        Use attribute access to test whether the modifier is set to that value\n\n        >>> update_modifier = EnumAsBools(context.update_modifier)\n        >>> update_modifier.UPDATE_SPECS\n            True\n        >>> update_modifier.UPDATE_DEPS\n            False\n        \"\"\"\n        return EnumAsBools(self._update_modifier)\n\n    @property\n    def deps_modifier(self) -> EnumAsBools:\n        \"\"\"\n        Use attribute access to test whether the modifier is set to that value\n\n        >>> deps_modifier = EnumAsBools(context.deps_modifier)\n        >>> deps_modifier.NOT_SET\n            True\n        >>> deps_modifier.DEPS_ONLY\n            False\n        \"\"\"\n        return EnumAsBools(self._deps_modifier)\n\n    # Other flags\n\n    @property\n    def ignore_pinned(self) -> bool:\n        return self._ignore_pinned\n\n    @property\n    def force_remove(self) -> bool:\n        return self._force_remove\n\n    @property\n    def force_reinstall(self) -> bool:\n        return self._force_reinstall\n\n    @property\n    def prune(self) -> bool:\n        return self._prune\n\n    #  Utility methods\n\n    def channels_from_specs(self) -> Iterable[Channel]:\n        \"\"\"\n        Collect all channels added with the `channel::package=*` syntax. For now,\n        we only collect those specifically requested by the user in the current command\n        (same as conda), but we should investigate whether history keeps channels around\n        too.\n        \"\"\"\n        for spec in self.requested.values():\n            channel = spec.get_exact_value(\"channel\")\n            if channel:\n                if spec.original_spec_str and spec.original_spec_str.startswith(\"file://\"):\n                    # Handle MatchSpec roundtrip issue with local channels\n                    channel = Channel(spec.original_spec_str.split(\"::\")[0])\n                yield channel\n\n    def maybe_free_channel(self) -> Iterable[Channel]:\n        # FUTURE: conda 25.9+ remove restore_free_channel\n        if channel := getattr(context, \"_restore_free_channel\", None):\n            context.custom_multichannels  # force deprecation warning\n        elif channel is None:\n            channel = getattr(context, \"restore_free_channel\", None)\n\n        if channel:\n            yield Channel.from_url(\"https://repo.anaconda.com/pkgs/free\")\n\n\nclass SolverOutputState:\n    \"\"\"\n    This is the main mutable object we will massage before passing the result of the computation\n    (the ``specs`` mapping) to the solver. It will also store the result of the solve (in\n    ``records``).\n\n    Parameters\n    ----------\n    solver_input_state\n        This instance provides the initial state for the output.\n    records\n        Dict of package names to ``PackageRecord`` objects. If not provided, it will be\n        initialized from the ``installed`` records in ``solver_input_state``.\n    for_history\n        Dict of package names to ``MatchSpec`` objects. These specs will be written to\n        the prefix history once the solve is complete. Its default initial value is taken from the\n        explicitly requested packages in the ``solver_input_state`` instance.\n    neutered\n        Dict of package names to ``MatchSpec`` objects. These specs are also written to\n        the prefix history, as part of the neutered specs. If not provided, their default value is\n        a blank mapping.\n    conflicts\n        If a solve attempt is not successful, conflicting specs are kept here for further\n        relaxation of the version and build constrains. If not provided, their default value is a\n        blank mapping.\n    pins\n        Packages that ended up being pinned. Mostly used for reporting and debugging. Deprecated.\n\n    Notes\n    -----\n    Almost all the attributes in this object map package names (``str``) to ``MatchSpec``\n    (_specs_ in short) objects. The only mapping with different values is ``records``, which\n    stores ``PackageRecord`` objects. A quick note on these objects:\n\n    * ``MatchSpec`` objects are a query language for packages, based on the ``PackageRecord``\n      schema. ``PackageRecord`` objects is how packages that are already installed are\n      represented. This is what you get from ``PrefixData.iter_records()``. Since they are\n      related, ``MatchSpec`` objects can be created from a ``PackageRecord`` with\n      ``.to_match_spec()``.\n    * ``MatchSpec`` objects also feature fields like ``target`` and ``optional``. These are,\n      essentially, used by the low-level classic solver (:class:`conda.resolve.Resolve`) to\n      mark specs as items it can optionally play with to satisfy the solver constrains. A\n      ``target`` marked spec is _soft-pinned_ in the sense that the solver will try to satisfy\n      that but it will stop trying if it gets in the way, so you might end up a different\n      version or build. ``optional`` seems to be in the same lines, but maybe the entire spec\n      can be dropped from the request? The key idea here is that these two fields might not be\n      directly usable by the solver, but it might need some custom adaptation. For example, for\n      ``libmamba`` we might need a separate pool that can be configured as a flexible task. See\n      more details in the first comment of ``conda.core.solve.classic.Solver._add_specs``\n    \"\"\"\n\n    def __init__(\n        self,\n        *,\n        solver_input_state: SolverInputState,\n        records: dict[str, PackageRecord] | None = None,\n        for_history: dict[str, MatchSpec] | None = None,\n        neutered: dict[str, MatchSpec] | None = None,\n        conflicts: dict[str, MatchSpec] | None = None,\n        pins: dict[str, MatchSpec] | None = None,\n    ):\n        self.solver_input_state: SolverInputState = solver_input_state\n        self.records: dict[str, PackageRecord] = records or dict(solver_input_state.installed)\n        self.for_history: dict[str, MatchSpec] = for_history or dict(solver_input_state.requested)\n        self.neutered: dict[str, MatchSpec] = neutered or {}\n        self.conflicts: dict[str, MatchSpec] = conflicts or {}\n        self.pins: dict[str, MatchSpec] = pins or {}\n\n    @property\n    def current_solution(self) -> IndexedSet[PackageRecord]:\n        \"\"\"\n        Massage currently stored records so they can be returned as the type expected by the\n        solver API. This is what you should return in ``Solver.solve_final_state()``.\n        \"\"\"\n        return IndexedSet(PrefixGraph(self.records.values()).graph)\n\n    @property\n    def specs(self) -> dict[str, MatchSpec]:\n        \"\"\"\n        Merge all possible sources of input package specs, sorted by their input category and\n        strictness. It's just meant to be an enumeration of all possible inputs, not a ready-to-use\n        list of specs for a solver.\n        \"\"\"\n        sis = self.solver_input_state\n        specs_by_strictness = {}\n        for group in (\n            \"requested\",\n            \"pinned\",\n            \"history\",\n            \"aggressive_updates\",\n        ):\n            for name, spec in sorted(\n                getattr(sis, group).items(),\n                key=sort_by_spec_strictness,\n                reverse=True,\n            ):\n                specs_by_strictness.setdefault(name, spec)\n        for record_group in (\"installed\", \"virtual\"):\n            for name, record in getattr(sis, record_group).items():\n                specs_by_strictness.setdefault(name, record.to_match_spec())\n        return specs_by_strictness\n\n    @property\n    def real_specs(self) -> dict[str, MatchSpec]:\n        \"\"\"\n        Specs that are _not_ virtual.\n        \"\"\"\n        return {name: spec for name, spec in self.specs.items() if not name.startswith(\"__\")}\n\n    @property\n    def virtual_specs(self) -> dict[str, MatchSpec]:\n        \"\"\"\n        Specs that are virtual.\n        \"\"\"\n        return {name: spec for name, spec in self.specs.items() if name.startswith(\"__\")}\n\n    def early_exit(self) -> IndexedSet[PackageRecord] | None:\n        \"\"\"\n        Operations that do not need a solver and might result in returning\n        early are collected here.\n        \"\"\"\n        sis = self.solver_input_state\n        if sis.is_removing:\n            # Make sure that requested packages to be removed match\n            # an installed record. Otherwise, raise an error.\n            # When 'remove --force' is set, remove the package without solving.\n            if sis.force_remove:\n                force_remove_solution = self.current_solution\n            not_installed: list[MatchSpec] = []\n            for name, spec in sis.requested.items():\n                for record in sis.installed.values():\n                    if spec.match(record):\n                        if sis.force_remove:\n                            force_remove_solution.remove(record)\n                        break\n                else:\n                    not_installed.append(spec)\n\n            if not_installed:\n                exc = PackagesNotFoundError(not_installed)\n                exc.allow_retry = False\n                raise exc\n\n            if sis.force_remove:\n                return force_remove_solution\n        elif sis.update_modifier.SPECS_SATISFIED_SKIP_SOLVE:\n            for name, spec in sis.requested.items():\n                if name not in sis.installed:\n                    break\n                if not any(spec.match(record) for record in sis.installed.values()):\n                    break\n            else:\n                # All specs match a package in the current environment.\n                # Return early, with the current solution (at this point, .records is set\n                # to the map of installed packages)\n                return self.current_solution\n\n    def check_for_pin_conflicts(self, index: LibMambaIndexHelper) -> None:\n        \"\"\"\n        Last part of the logic, common to addition and removal of packages. Originally,\n        the legacy logic will also minimize the conflicts here by doing a pre-solve\n        analysis, but so far we have opted for a different approach in libmamba: let the\n        solver try, fail with conflicts, and annotate those as such so they are unconstrained.\n\n        Now, this method only ensures that the pins do not cause conflicts.\n        \"\"\"\n        # ## Inconsistency analysis ###\n        # here we would call conda.core.solve.classic.Solver._find_inconsistent_packages()\n\n        # ## Check pin and requested are compatible\n        sis = self.solver_input_state\n        requested_and_pinned = set(sis.requested).intersection(sis.pinned)\n        for name in requested_and_pinned:\n            requested = sis.requested[name]\n            pin = sis.pinned[name]\n            installed = sis.installed.get(name)\n            if (\n                # name-only pins lock to installed; requested spec must match it\n                (pin.is_name_only_spec and installed and not requested.match(installed))\n                # otherwise, the pin needs to be compatible with the requested spec\n                or not compatible_specs(index, (requested, pin))\n            ):\n                pinned_specs = [\n                    (sis.installed.get(name, pin) if pin.is_name_only_spec else pin)\n                    for name, pin in sorted(sis.pinned.items())\n                ]\n                exc = SpecsConfigurationConflictError(\n                    requested_specs=sorted(sis.requested.values(), key=lambda x: x.name),\n                    pinned_specs=pinned_specs,\n                    prefix=sis.prefix,\n                )\n                exc.allow_retry = False\n                raise exc\n\n    def post_solve(self, solver: Solver) -> None:\n        \"\"\"\n        These tasks are performed _after_ the solver has done its work. It essentially\n        post-processes the ``records`` mapping.\n\n        Parameters\n        ----------\n        solver_cls\n            The class used to instantiate the Solver. If not provided, defaults to the one\n            specified in the context configuration.\n\n        Notes\n        -----\n        This method could be solver-agnostic  but unfortunately ``--update-deps`` requires a\n        second solve; that's why this method needs a solver class to be passed as an argument.\n        \"\"\"\n        # After a solve, we still need to do some refinement\n        sis = self.solver_input_state\n\n        # ## Record history ###\n        # user requested specs need to be annotated in history\n        # we control that in .for_history\n        self.for_history.update(sis.requested)\n\n        # ## Neutered ###\n        # annotate overridden history specs so they are written to disk\n        for name, spec in sis.history.items():\n            record = self.records.get(name)\n            if record and not spec.match(record):\n                self.neutered[name] = MatchSpec(name, version=record.version)\n\n        # ## Add inconsistent packages back ###\n        # direct result of the inconsistency analysis above\n\n        # ## Deps modifier ###\n        # handle the different modifiers (NO_DEPS, ONLY_DEPS, UPDATE_DEPS)\n        # this might mean removing different records by hand or even calling\n        # the solver a 2nd time\n\n        if sis.deps_modifier.NO_DEPS:\n            # In the NO_DEPS case, we need to start with the original list of packages in the\n            # environment, and then only modify packages that match the requested specs\n            #\n            # Help information notes that use of NO_DEPS is expected to lead to broken\n            # environments.\n            original_state = dict(sis.installed)\n            only_change_these = {}\n            for name, spec in sis.requested.items():\n                for record in self.records.values():\n                    if spec.match(record):\n                        only_change_these[name] = record\n\n            if sis.is_removing:\n                # TODO: This could be a pre-solve task to save time in forced removes?\n                for name in only_change_these:\n                    del original_state[name]\n            else:\n                for name, record in only_change_these.items():\n                    original_state[name] = record\n\n            self.records.clear()\n            self.records.update(original_state)\n\n        elif sis.deps_modifier.ONLY_DEPS and not sis.update_modifier.UPDATE_DEPS:\n            # Using a special instance of PrefixGraph to remove youngest child nodes that match\n            # the original requested specs.  It's important to remove only the *youngest* child\n            # nodes, because a typical use might be `conda install --only-deps python=2 flask`,\n            # and in that case we'd want to keep python.\n            #\n            # What are we supposed to do if flask was already in the environment?\n            # We can't be removing stuff here that's already in the environment.\n            #\n            # What should be recorded for the user-requested specs in this case? Probably all\n            # direct dependencies of flask.\n\n            graph = PrefixGraph(self.records.values(), sis.requested.values())\n            # this method below modifies the graph inplace _and_ returns the removed nodes\n            # (like dict.pop())\n            would_remove = graph.remove_youngest_descendant_nodes_with_specs()\n\n            # We need to distinguish the behavior between `conda remove` and the rest\n            to_remove = []\n            if sis.is_removing:\n                for record in would_remove:\n                    # do not remove records that were not requested but were installed\n                    if record.name not in sis.requested and record.name in sis.installed:\n                        continue\n                    to_remove.append(record.name)\n            else:\n                for record in would_remove:\n                    for dependency in record.depends:\n                        spec = MatchSpec(dependency)\n                        if spec.name not in self.specs:\n                            # following https://github.com/conda/conda/pull/8766\n                            self.for_history[spec.name] = spec\n                    to_remove.append(record.name)\n\n            for name in to_remove:\n                installed = sis.installed.get(name)\n                if installed:\n                    self.records[name] = installed\n                else:\n                    self.records.pop(name, None)\n\n        elif sis.update_modifier.UPDATE_DEPS:\n            # Here we have to SAT solve again :(  It's only now that we know the dependency\n            # chain of specs_to_add.\n            #\n            # UPDATE_DEPS is effectively making each spec in the dependency chain a\n            # user-requested spec. For all other specs, we drop all information but name, drop\n            # target, and add them to `requested` so it gets recorded in the history file.\n            #\n            # It's like UPDATE_ALL, but only for certain dependency chains.\n            new_specs = {}\n\n            graph = PrefixGraph(self.records.values())\n            for name, spec in sis.requested.items():\n                record = graph.get_node_by_name(name)\n                for ancestor in graph.all_ancestors(record):\n                    new_specs[ancestor.name] = MatchSpec(ancestor.name)\n\n            # Remove pinned_specs\n            for name, spec in sis.pinned.items():\n                new_specs.pop(name, None)\n            # Follow major-minor pinning business rule for python\n            if \"python\" in new_specs:\n                record = sis.installed[\"python\"]\n                version = \".\".join(record.version.split(\".\")[:2]) + \".*\"\n                new_specs[\"python\"] = MatchSpec(name=\"python\", version=version)\n            # Add in the original `requested` on top.\n            new_specs.update(sis.requested)\n\n            if sis.is_removing:\n                specs_to_add = ()\n                specs_to_remove = list(new_specs.keys())\n            else:\n                specs_to_add = list(new_specs.values())\n                specs_to_remove = ()\n\n            with context._override(\"quiet\", False):\n                # Create a new solver instance to perform a 2nd solve with deps added We do it\n                # like this to avoid overwriting state accidentally. Instead, we will import\n                # the needed state bits manually.\n                records = solver.__class__(\n                    prefix=solver.prefix,\n                    channels=solver.channels,\n                    subdirs=solver.subdirs,\n                    specs_to_add=specs_to_add,\n                    specs_to_remove=specs_to_remove,\n                    command=\"recursive_call_for_update_deps\",\n                ).solve_final_state(\n                    update_modifier=UpdateModifier.UPDATE_SPECS,  # avoid recursion!\n                    deps_modifier=sis._deps_modifier,\n                    ignore_pinned=sis.ignore_pinned,\n                    force_remove=sis.force_remove,\n                    prune=sis.prune,\n                )\n                records = {record.name: record for record in records}\n\n            self.records.clear()\n            self.records.update(records)\n            self.for_history.clear()\n            self.for_history.update(new_specs)\n\n            # Disable pruning regardless the original value\n            # TODO: Why? Dive in https://github.com/conda/conda/pull/7719\n            sis._prune = False\n\n        # ## Prune ###\n        # remove orphan leaves in the graph\n        if sis.prune:\n            graph = PrefixGraph(list(self.records.values()), list(sis.requested.values()))\n            graph.prune()\n            self.records.clear()\n            self.records.update({record.name: record for record in graph.graph})\n\n\ndef sort_by_spec_strictness(key_value_tuple: tuple[str, MatchSpec]) -> tuple[int, str]:\n    \"\"\"\n    Helper function to sort a list of (key, value) tuples by spec strictness\n    \"\"\"\n    name, spec = key_value_tuple\n    return getattr(spec, \"strictness\", 0), name\n"
  },
  {
    "path": "conda_libmamba_solver/utils.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nMiscellaneous utilities\n\"\"\"\n\nfrom __future__ import annotations\n\nfrom logging import getLogger\nfrom typing import TYPE_CHECKING\nfrom urllib.parse import quote\n\nfrom conda.common.compat import on_win\nfrom conda.common.url import urlparse\nfrom conda.exceptions import PackagesNotFoundError\n\nif TYPE_CHECKING:\n    from collections.abc import Iterable\n    from enum import Enum\n\n    from conda.models.match_spec import MatchSpec\n\n    from .index import LibMambaIndexHelper\n\nlog = getLogger(f\"conda.{__name__}\")\n\n\ndef escape_channel_url(channel: str) -> str:\n    if channel.startswith(\"file:\"):\n        if \"%\" in channel:  # it's escaped already\n            return channel\n        if on_win:\n            channel = channel.replace(\"\\\\\", \"/\")\n    parts = urlparse(channel)\n    if parts.scheme:\n        components = parts.path.split(\"/\")\n        if on_win:\n            if parts.netloc and len(parts.netloc) == 2 and parts.netloc[1] == \":\":\n                # with absolute paths (e.g. C:/something), C:, D:, etc might get parsed as netloc\n                path = \"/\".join([parts.netloc] + [quote(p) for p in components])\n                parts = parts.replace(netloc=\"\")\n            else:\n                path = \"/\".join(components[:2] + [quote(p) for p in components[2:]])\n        else:\n            path = \"/\".join([quote(p) for p in components])\n        parts = parts.replace(path=path)\n        return str(parts)\n    return channel\n\n\ndef compatible_specs(\n    index: LibMambaIndexHelper, specs: Iterable[MatchSpec], raise_not_found: bool = True\n) -> bool:\n    \"\"\"\n    Assess whether the given specs are compatible with each other.\n    This is done by querying the index for each spec and taking the\n    intersection of the results. If the intersection is empty, the\n    specs are incompatible.\n\n    If raise_not_found is True, a PackagesNotFoundError will be raised\n    when one of the specs is not found. Otherwise, False will be returned\n    because the intersection will be empty.\n    \"\"\"\n    if not len(specs) >= 2:\n        raise ValueError(\"Must specify at least two specs\")\n\n    matched = None\n    for spec in specs:\n        results = set(index.search(spec))\n        if not results:\n            if raise_not_found:\n                exc = PackagesNotFoundError([spec], index.channels)\n                exc.allow_retry = False\n                raise exc\n            return False\n        if matched is None:\n            # First spec, just set matched to the results\n            matched = results\n            continue\n        # Take the intersection of the results\n        matched &= results\n        if not matched:\n            return False\n\n    return bool(matched)\n\n\nclass EnumAsBools:\n    \"\"\"\n    Allows an Enum to be bool-evaluated with attribute access.\n\n    >>> update_modifier = UpdateModifier(\"update_deps\")\n    >>> update_modifier_as_bools = EnumAsBools(update_modifier)\n    >>> update_modifier == UpdateModifier.UPDATE_DEPS  # from this\n        True\n    >>> update_modidier_as_bools.UPDATE_DEPS  # to this\n        True\n    >>> update_modifier_as_bools.UPDATE_ALL\n        False\n    \"\"\"\n\n    def __init__(self, enum: Enum):\n        self._enum = enum\n        self._names = {v.name for v in self._enum.__class__.__members__.values()}\n\n    def __getattr__(self, name: str) -> bool:\n        if name in (\"name\", \"value\"):\n            return getattr(self._enum, name)\n        if name in self._names:\n            return self._enum.name == name\n        raise AttributeError(f\"'{name}' is not a valid name for {self._enum.__class__.__name__}\")\n\n    def __eq__(self, obj: object) -> bool:\n        return self._enum.__eq__(obj)\n\n    def _dict(self) -> dict[str, bool]:\n        return {name: self._enum.name == name for name in self._names}\n"
  },
  {
    "path": "dev/requirements.txt",
    "content": "# build-time\npip\n# run-time\nboltons>=23.0.0\nconda>=26.1\nconda-forge::libmamba>=2.0.0\nconda-forge::libmambapy>=2.0.0\nmsgpack-python>=1.1.1\n# needed for 'pip install -e conda-libmamba-solver'\nhatchling\nhatch-vcs\neditables\n"
  },
  {
    "path": "dev/scripts/BenchmarkChart.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"e28dc53c-5b9c-453d-a9ef-14dd93b85b46\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Benchmark Chart\\n\",\n    \"This notebook reads .codspeed benchmarks generated in the root of conda-libmamba-solver with `pytest -k benchmark --codspeed` e.g. and renders `test_traversal_algorithm_benchmarks` as a plotly chart.\\n\",\n    \"\\n\",\n    \"`jupyter nbconvert --clear-output --inplace <file>.ipynb` clears output from the file for better revision control.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"id\": \"f50f3e70-fc44-44db-b770-033b3cac9576\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import json\\n\",\n    \"import os\\n\",\n    \"from pathlib import Path\\n\",\n    \"\\n\",\n    \"import pandas as pd\\n\",\n    \"import plotly.express as px\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"id\": \"f410cf7e-344e-4e0b-939c-a7c3836c1c9e\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"runs = Path(\\\".codspeed\\\").glob(\\\"*.json\\\")\\n\",\n    \"most_recent = sorted(runs, key=lambda f: os.stat(f).st_mtime)[-1]\\n\",\n    \"print(most_recent)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"id\": \"3961cb90-b345-43c1-9e13-d3f5d3cecba5\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"SCENARIOS = [\\n\",\n    \"    \\\"python\\\",\\n\",\n    \"    \\\"data_science_basic\\\",\\n\",\n    \"    \\\"data_science_ml\\\",\\n\",\n    \"    \\\"web_development\\\",\\n\",\n    \"    \\\"scientific_computing\\\",\\n\",\n    \"    \\\"devops_automation\\\",\\n\",\n    \"    \\\"vaex\\\",\\n\",\n    \"]\\n\",\n    \"\\n\",\n    \"benchmarks = json.loads(most_recent.read_text())[\\\"benchmarks\\\"]\\n\",\n    \"traversal_benchmarks = []\\n\",\n    \"for benchmark in benchmarks:\\n\",\n    \"    name = benchmark[\\\"name\\\"]\\n\",\n    \"    for scenario in SCENARIOS:\\n\",\n    \"        name = name.replace(scenario.replace(\\\"_\\\", \\\"-\\\"), scenario.replace(\\\"-\\\", \\\"_\\\"))\\n\",\n    \"    if \\\"test_traversal_algorithm_benchmarks\\\" not in name:\\n\",\n    \"        continue\\n\",\n    \"    stats = benchmark[\\\"stats\\\"]\\n\",\n    \"    assert len(name.split(\\\"[\\\")[-1].strip(\\\"]\\\").split(\\\"-\\\")) == 4\\n\",\n    \"    facets = dict(\\n\",\n    \"        zip([\\\"main\\\", \\\"scenario\\\", \\\"alg\\\", \\\"cache\\\"], name.split(\\\"[\\\")[-1].strip(\\\"]\\\").split(\\\"-\\\"))\\n\",\n    \"    )\\n\",\n    \"    stats[\\\"min_s\\\"] = stats[\\\"min_ns\\\"] / 1e9\\n\",\n    \"    traversal_benchmarks.append(stats | facets)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"id\": \"109c7077-b54c-4a0d-b202-e3aba18af10f\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"df = pd.DataFrame(traversal_benchmarks)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"id\": \"d9f25b8e-9a3d-4ed7-a73b-7d4c042799a5\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"fig = px.bar(\\n\",\n    \"    df,\\n\",\n    \"    x=\\\"main\\\",\\n\",\n    \"    y=\\\"min_s\\\",\\n\",\n    \"    color=\\\"alg\\\",\\n\",\n    \"    barmode=\\\"group\\\",\\n\",\n    \"    facet_row=\\\"scenario\\\",\\n\",\n    \"    facet_col=\\\"cache\\\",\\n\",\n    \"    category_orders={\\n\",\n    \"        \\\"cache\\\": [\\\"cold\\\", \\\"warm\\\", \\\"lukewarm\\\"],\\n\",\n    \"        \\\"alg\\\": [\\\"bfs\\\", \\\"pipelined\\\", \\\"httpx\\\"],\\n\",\n    \"        \\\"main\\\": [\\\"main\\\"],\\n\",\n    \"    },\\n\",\n    \"    width=1000,\\n\",\n    \"    height=1600,\\n\",\n    \")\\n\",\n    \"fig.show()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"id\": \"a4d02d95-a8c1-46bf-881c-7b6215fc9626\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"df[df[\\\"alg\\\"] == \\\"pipelined\\\"].sum()[\\\"min_ns\\\"] / df[df[\\\"alg\\\"] == \\\"httpx\\\"].sum()[\\\"min_ns\\\"]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"id\": \"e5ed7f9f-eec2-4a66-9f0a-2ac4ed49642d\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"df[df[\\\"alg\\\"] == \\\"bfs\\\"].sum()[\\\"min_ns\\\"] / df[df[\\\"alg\\\"] == \\\"httpx\\\"].sum()[\\\"min_ns\\\"]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"id\": \"f5611550-ca78-407c-9680-1ec27eb7db80\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3 (ipykernel)\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.13.9\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 5\n}\n"
  },
  {
    "path": "dev/scripts/httpx-fetch-all-shards.py",
    "content": "#!/usr/bin/env python\n# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nCollect all repodata shards from fast.prefix.dev/conda-forge.\n\nTakes about 12.7 seconds, a few requests fail and would need to be re-tried.\n\"\"\"\n\nimport asyncio\nimport sqlite3\nimport time\n\nimport httpx\nimport msgpack\nimport zstandard\n\n\ndef connect(dburi=\"cache.db\"):\n    \"\"\"\n    Get database connection.\n\n    dburi: uri-style sqlite database filename; accepts certain ?= parameters.\n    \"\"\"\n    conn = sqlite3.connect(dburi, uri=True)\n    conn.row_factory = sqlite3.Row\n    # conn.execute(\"PRAGMA journal_mode = WAL\")\n    # conn.execute(\"PRAGMA synchronous = 1\")  # less fsync, good for WAL mode\n    conn.execute(\"PRAGMA foreign_keys = ON\")\n    return conn\n\n\ndef to_url(shard):\n    return f\"https://fast.prefix.dev/conda-forge/linux-64/shards/{shard.hex()}.msgpack.zst\"\n\n\nbase_url = \"https://fast.prefix.dev/conda-forge/linux-64/repodata_shards.msgpack.zst\"\n\n\nconn = connect(\"conda-forge-shards-httpx.db\")\nconn.execute(\n    \"CREATE TABLE IF NOT EXISTS shards (url TEXT PRIMARY KEY, package TEXT, shard BLOB)\"\n)  # also last-used?\n\n\ndef shard_urls(index):\n    for package, hash in index[\"shards\"].items():\n        yield package, to_url(hash)\n\n\nasync def get_one(sem, client, url, package):\n    try:\n        async with sem:\n            response = await client.get(url)\n        return package, url, response\n    except httpx.RemoteProtocolError as err:\n        return package, url, err\n\n\nasync def main():\n    async with httpx.AsyncClient(http2=True, timeout=60) as client:\n        # client._transport._pool._max_connections # is 100, does this have\n        # anything to do with http/2?\n        # See https://github.com/encode/httpx/issues/1171\n        # Default 5s timeout is bigger issue in request failures.\n        print(\"Max in-flight\", client._transport._pool._max_connections)\n        sem = asyncio.Semaphore(client._transport._pool._max_connections)\n        response = await client.get(base_url)\n        print(response.status_code, response.headers)\n        index = msgpack.loads(zstandard.decompress(response.content))\n        awaitables = [\n            get_one(sem, client, shard_url, package) for package, shard_url in shard_urls(index)\n        ]\n        for awaitable in asyncio.as_completed(awaitables):\n            package, url, response = await awaitable\n            if isinstance(response, Exception):\n                print(\"x\", end=\"\")\n                # add (package, url) to retry list?\n                continue\n            data = response.content\n            with conn as c:\n                c.execute(\n                    \"INSERT OR IGNORE INTO SHARDS (url, package, shard) VALUES (?, ?, ?)\",\n                    (url, package, data),\n                )\n            print(\".\", end=\"\")\n\n\nif __name__ == \"__main__\":\n    begin = time.time_ns()\n    asyncio.run(main())\n    end = time.time_ns()\n    print(f\"Took {(end - begin) / 1e9} seconds\")\n    conn.close()\n"
  },
  {
    "path": "dev/scripts/requests-fetch-all-shards.py",
    "content": "#!/usr/bin/env python\n# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nCollect all repodata shards from fast.prefix.dev/conda-forge.\n\nTakes about 23s on a hot CDN cache or 5 minutes on a cold remote cache.\n\"\"\"\n\nimport concurrent.futures\nimport sqlite3\nimport time\n\nimport msgpack\nimport requests\nimport zstandard\n\n\ndef connect(dburi=\"cache.db\"):\n    \"\"\"\n    Get database connection.\n\n    dburi: uri-style sqlite database filename; accepts certain ?= parameters.\n    \"\"\"\n    conn = sqlite3.connect(dburi, uri=True)\n    conn.row_factory = sqlite3.Row\n    conn.execute(\"PRAGMA journal_mode = WAL\")\n    conn.execute(\"PRAGMA synchronous = 1\")  # less fsync, good for WAL mode\n    conn.execute(\"PRAGMA foreign_keys = ON\")\n    return conn\n\n\ndef to_url(shard):\n    return f\"https://fast.prefix.dev/conda-forge/linux-64/shards/{shard.hex()}.msgpack.zst\"\n\n\nbase_url = \"https://fast.prefix.dev/conda-forge/linux-64/repodata_shards.msgpack.zst\"\n\ns = requests.Session()\n\nindex = msgpack.loads(zstandard.decompress(s.get(base_url).content))\n\nconn = connect(\"conda-forge-shards.db\")\nconn.execute(\"CREATE TABLE IF NOT EXISTS shards (url TEXT PRIMARY KEY, package TEXT, shard BLOB)\")\n\n\ndef shard_urls():\n    for package, hash in index[\"shards\"].items():\n        yield package, to_url(hash)\n\n\ndef fetch(s, package, url):\n    b1 = time.time_ns()\n    data = s.get(url).content\n    e1 = time.time_ns()\n    print(f\"{(e1 - b1) / 1e9}s\", package, url)\n    return data\n\n\nbegin = time.time_ns()\n\n# beneficial to have thread pool larger than requests' default 10 max\n# connections per session\nwith concurrent.futures.ThreadPoolExecutor(max_workers=20) as executor:\n    futures = {\n        executor.submit(fetch, s, package, url): (url, package) for package, url in shard_urls()\n    }\n    # May be inconvenient to cancel a large number of futures. Also, ctrl-C doesn't work reliably out of the box.\n    for future in concurrent.futures.as_completed(futures):\n        print(\".\", futures[future])\n        data = future.result()\n        url, package = futures[future]\n        with conn as c:\n            c.execute(\n                \"INSERT OR IGNORE INTO SHARDS (url, package, shard) VALUES (?, ?, ?)\",\n                (url, package, data),\n            )\n\nend = time.time_ns()\n\nconn.close()\n\nprint(f\"Took {(end - begin) / 1e9} seconds\")\n"
  },
  {
    "path": "docs/Makefile",
    "content": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line, and also\n# from the environment for the first two.\nSPHINXOPTS    ?=\nSPHINXBUILD   ?= sphinx-build\nSOURCEDIR     = .\nBUILDDIR      = _build\n\n# Put it first so that \"make\" without argument is like \"make help\".\nhelp:\n\t@$(SPHINXBUILD) -M help \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)\n\n.PHONY: help Makefile\n\n# Catch-all target: route all unknown targets to Sphinx using the new\n# \"make mode\" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).\n%: Makefile\n\t@$(SPHINXBUILD) -M $@ \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)\n"
  },
  {
    "path": "docs/_static/css/custom.css",
    "content": "/**\n * This rule is here to avoid the scrollbar appearing when this\n * is not hosted on ReadTheDocs\n */\n#rtd-footer-container {\n    display: none;\n}\n"
  },
  {
    "path": "docs/_templates/navbar_center.html",
    "content": "<ul id=\"navbar-main-elements\" class=\"navbar-nav\">\n    <li class=\"nav-item current active\">\n        <a class=\"reference internal nav-link\" href=\"{{ pathto(\"index\") }}\">{{ project }}</a>\n    </li>\n    <li class=\"nav-item {% if project == \"conda\" %}current active{% endif %}\">\n        <a class=\"reference internal nav-link\" href=\"https://docs.conda.io/projects/conda/\">Conda</a>\n    </li>\n    <li class=\"nav-item {% if project == \"conda-build\" %}current active{% endif %}\">\n        <a class=\"reference internal nav-link\" href=\"https://docs.conda.io/projects/conda-build/\">Conda-build</a>\n    </li>\n    <li class=\"nav-item {% if project == \"miniconda\" %}current active{% endif %}\">\n        <a class=\"reference internal nav-link\" href=\"https://docs.conda.io/projects/miniconda/\">Miniconda</a>\n    </li>\n</ul>\n"
  },
  {
    "path": "docs/conf.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n# Configuration file for the Sphinx documentation builder.\n#\n# For the full list of built-in configuration values, see the documentation:\n# https://www.sphinx-doc.org/en/master/usage/configuration.html\n\n# -- Project information -----------------------------------------------------\n# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information\n\nproject = html_title = \"conda-libmamba-solver\"\ncopyright = \"2022, conda-libmamba-solver contributors\"\nauthor = \"conda-libmamba-solver contributors\"\n\n# -- General configuration ---------------------------------------------------\n# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration\n\nextensions = [\n    \"myst_parser\",\n    \"sphinx.ext.napoleon\",\n    \"sphinx.ext.autosummary\",\n    \"sphinx.ext.graphviz\",\n    \"sphinx.ext.ifconfig\",\n    \"sphinx.ext.inheritance_diagram\",\n    \"sphinx.ext.viewcode\",\n    \"sphinxcontrib.mermaid\",\n    \"sphinx_sitemap\",\n    \"sphinx_design\",\n    \"sphinx_copybutton\",\n    \"sphinx_reredirects\",\n]\n\nmyst_heading_anchors = 3\nmyst_enable_extensions = [\n    \"amsmath\",\n    \"colon_fence\",\n    \"deflist\",\n    \"dollarmath\",\n    \"html_admonition\",\n    \"html_image\",\n    \"linkify\",\n    \"replacements\",\n    \"smartquotes\",\n    \"substitution\",\n    \"tasklist\",\n]\n\n\ntemplates_path = [\"_templates\"]\nexclude_patterns = [\"_build\", \"Thumbs.db\", \".DS_Store\"]\n\n# -- Options for HTML output -------------------------------------------------\n# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output\n\nhtml_theme = \"conda_sphinx_theme\"\nhtml_static_path = [\"_static\"]\n\nhtml_css_files = [\n    \"css/custom.css\",\n]\n\n# Serving the robots.txt since we want to point to the sitemap.xml file\nhtml_extra_path = [\"robots.txt\"]\n\nhtml_theme_options = {\n    \"navigation_depth\": -1,\n    \"use_edit_page_button\": True,\n    \"navbar_center\": [\"navbar_center\"],\n    \"icon_links\": [\n        {\n            \"name\": \"GitHub\",\n            \"url\": \"https://github.com/conda/conda-libmamba-solver\",\n            \"icon\": \"fa-brands fa-square-github\",\n            \"type\": \"fontawesome\",\n        },\n        {\n            \"name\": \"Element\",\n            \"url\": \"https://matrix.to/#/#conda-libmamba-solver:matrix.org\",\n            \"icon\": \"_static/element_logo.svg\",\n            \"type\": \"local\",\n        },\n        {\n            \"name\": \"Discourse\",\n            \"url\": \"https://conda.discourse.group/\",\n            \"icon\": \"fa-brands fa-discourse\",\n            \"type\": \"fontawesome\",\n        },\n    ],\n}\n\nhtml_context = {\n    \"github_user\": \"conda\",\n    \"github_repo\": \"conda-libmamba-solver\",\n    \"github_version\": \"main\",\n    \"doc_path\": \"docs\",\n}\n\n# We don't have a locale set, so we can safely ignore that for the sitemaps.\nsitemap_locales = [None]\n# We're hard-coding stable here since that's what we want Google to point to.\nsitemap_url_scheme = \"{link}\"\n\n# -- For sphinx_reredirects ------------------------------------------------\n\nredirects = {\n    \"getting-started\": \"../user-guide/\",\n    \"faq\": \"../user-guide/faq/\",\n    \"configuration\": \"../user-guide/configuration/\",\n    \"libmamba-vs-classic\": \"../user-guide/libmamba-vs-classic/\",\n    \"more-resources\": \"../user-guide/more-resources/\",\n    \"performance\": \"../user-guide/performance/\",\n    \"subcommands\": \"../user-guide/subcommands/\",\n}\n"
  },
  {
    "path": "docs/dev/future-work.md",
    "content": "# Future work\n\n```{warning} WIP\nThese will/should be expanded into issues.\n```\n\n* `MatchSpec` preparation logic contains too many exceptions for `libmamba` (e.g. differences in `update` vs `install`)\n* Clean-up `MatchSpec` exchange fixes and workarounds\n* Channel names and URLs need pre- and post- treatment (e.g. URL escaping) to workaround escaping issues, etc.\n* Investigate better usage of `libsolv` and `libmamba` flags\n* Better condense retry logic and conflict handling; we lack the \"Optional\" feature `classic` has\n* Investigate ignored tests in `pyproject.toml`\n* Conversely, investigate which other tests we should ignore in the name of simplifying the logic\n"
  },
  {
    "path": "docs/dev/implementation.md",
    "content": "# Implementation details\n\nThis document provides an overview on how the `conda-libmamba-solver` integrations are implemented,\nboth within the `conda_libmamba_solver` package itself, and as a `conda` plugin.\n\n## Repository structure\n\n* `.devcontainer`: Configuration for DevContainer development workflows.\n* `.github/workflows/`: CI pipelines to run unit and upstream tests, as well as linting and performance benchmarks. Some extra workflows might be added by the `conda/infra` settings.\n* `conda_libmamba_solver/`: The Python package. Check sections below for details.\n* `recipe/`: The conda-build recipe used for the PR build previews. It should be kept in sync with `conda-forge` and `defaults`.\n* `dev/`: Supporting configuration files to set up development environments.\n* `docs/`: Documentation sources.\n* `tests/`: pytest testing infrastructure.\n* `pyproject.toml`: Project metadata. See below for details.\n\n## Project metadata\n\nThe `pyproject.toml` file stores the required packaging metadata,\nas well as some the configuration for some tools (`black`, `pytest`, etc.).\n\nSome peculiarities:\n\n* `hatchling` is the chosen backend for the packaging.\n* The `version` is calculated from the `git` info with `hatchling-vcs`.\n* `black` uses a line length of 99 characters.\n\n## `conda_libmamba_solver` package\n\nThe package is a flat namespace:\n\n* `conda_libmamba_solver.__init__`: Defines `__version__` and the old-style plugin API.\n* `conda_libmamba_solver.exceptions`: Subclasses of `conda.exceptions`.\n* `conda_libmamba_solver.index`: Helper objects to deal with repodata fetching and loading, interfacing with `libmamba` helpers.\n* `conda_libmamba_solver.mamba_utils`: Utility functions to help set up the `libmamba` objects.\n* `conda_libmamba_solver.models`: Application-agnostic objects to assist in the metadata collection phases.\n* `conda_libmamba_solver.plugin`: The `pluggy` registration mechanism in `conda.plugins`.\n* `conda_libmamba_solver.solver`: The `conda.core.solve.Solver` subclass with all the libmamba-specific logic.\n* `conda_libmamba_solver.state`: Solver-agnostic objects to assist in the solver state specification and collection.\n* `conda_libmamba_solver.utils`: Other application-agnostic utility functions.\n\n```{note}\nRefer to each module docstrings for further details!\n```\n\n### Solver-agnostic parts\n\nThe idea behind the module separation is to have better logic reusability and separation between the `libmamba` library and the preparation logic `conda` uses.\nThe following paragraphs assume you have read the [Deep Dive guides](https://docs.conda.io/projects/conda/en/stable/dev-guide/deep-dives/solvers.html) in the `conda` documentation, but as a refresher:\n\n* The `Solver` class will take a list of `MatchSpec` objects coming from diverse sources, like:\n  * The packages the user requested in the command line or an environment file\n  * The installed packages in the target environment\n  * The explicitly requested packages in previous commands (the history)\n  * ... and some more coming from configured settings\n* All these `MatchSpecs` are then merged and sorted depending on certain preparation logic.\n* The final set of `MatchSpec` objects is used to _query_ the so-called _index_ of packages.\n* The index is a long list of `PackageRecord` objects, loaded from the `repodata.json` files obtained from the configured channels.\n* The job of the solver is to find the set of `PackageRecord` objects that better satisfies the optimization criteria for the given `MatchSpec` objects.\n\nAll the preparation steps before the actual SAT solver starts working are conda-specific, and solver-agnostic!\nIn `conda` classic, this logic is spread across the different layers, but in `conda-libmamba-solver` we tried to synthesize it in a single module.\nThis is the `conda_libmamba_solver.state` module, which contains the `SolverInputState` and `SolverOutputState` classes.\n\n* `SolverInputState` deals with the collection and management of the `MatchSpec` objects.\n* `SolverOutputState` will assist the `Solver` class maintain its state through the different solving attempts,\n  and will finally export a list of `PackageRecords`.\n  The early exit and post-solve logics are also expressed here.\n\nBoth `SolverInputState` and `SolverOutputState` classes are supported by the `TrackedMap` dictionary subclass,\nwhich logs its own changes for better debugging and developer experience while analyzing solver problems.\n\n### libmamba-specific parts\n\n`conda_libmamba_solver` interfaces with `libmamba` objects through three modules only:\n\n* `.solver`, which contains the `conda.core.solve.Solver` subclass.\n  It relies heavily on `conda_libmamba_solver.state` in an effort to only contain the logic necessary to interface with `libmamba`.\n* `.index`, which deals with the repodata fetching and loading.\n  Initially, it invoked the necessary `libmamba` objects to download and load the repodata JSON files.\n  In later releases, downloading is done with `conda` objects, and we then pass the JSON files to the `libmamba` loaders.\n* `.mamba_utils`, which contains utility functions borrowed and adapted from `mamba` itself.\n  Its main usage is the initialization of the `libmamba.Context` options from `conda`'s `Context`.\n\n### Sharded Repodata\n\nSharded repodata is implemented by building a repodata subset in Python, and\nthen sending that subset to the solver. See [sharded repodata\nimplementation](sharded).\n\n## Integrations with `conda`\n\n### With the plugin system\n\nOnce co-installed with `conda`, `conda_libmamba_solver` registers itself via the `conda.plugins.hookimpl`-decorated function in `conda.plugin`, which yields a `CondaSolver` plugin instance.\n\nAfter that, `conda` clients just need to get the configured solver via `context.plugin_manager.get_cached_solver_backend()`.\n\n### Draft integrations (pre-plugin phase)\n\n```{note}\nThis is just here as a historical trivia item.\nPlease check the Plugin implementation section for current details!\n```\n\nThe first experimental releases of `conda_libmamba_solver` used an ad-hoc mechanism based on `try/except` hooks.\n\nOn the `conda/conda` side, we had [`conda.core.solve._get_solver_class()`](https://github.com/conda/conda/blob/22.9.0/conda/core/solve.py#L57-L78):\n\n```python\ndef _get_solver_class(key=None):\n    key = key or conda.base.context.Context.experimental_solver\n    if key == \"classic\":\n        return conda.core.solve.Solver  # Classic\n    if key.startswith(\"libmamba\"):\n        try:\n            from conda_libmamba_solver import get_solver_class\n\n            return get_solver_class(key)\n        except ImportError as exc:\n            raise CondaImportError(...)\n    raise ValueError(...)\n```\n\nThe `key` values were hard-coded in `conda.base.constants`. Not very extensible!\nThis was only meant to be temporary as we iterated on the `conda-libmamba-solver` side.\nWe had one more `get_solver_class()` function in `conda_libmamba_solver` so we could easily change the `Solver` object import path without changing `conda` itself.\n\nThe default value for the `key` was set by the `Context` object, which was populated by either:\n\n* The environment variable, `CONDA_EXPERIMENTAL_SOLVER`.\n* The command-line flag, `--experimental-solver`.\n* A configuration file (e.g. `~/.condarc`).\n"
  },
  {
    "path": "docs/dev/index.md",
    "content": "# Developer Guide\n\nTo get started with developing conda-libmamba-solver, please check out\nthe following pages:\n\n- [How to set up your environment](setup)\n- [Typical development workflows](workflows)\n- [Implementation details](implementation)\n- [Performance testing](performance-testing)\n- [Sharded repodata implementation](sharded)\n- [Future work](future-work)\n- [Code of conduct](code-of-conduct)\n- [CHANGELOG](changelog)\n\n```{toctree}\n:maxdepth: 0\n:hidden:\nsetup\nworkflows\nimplementation\nperformance-testing\nsharded\nfuture-work\ncode-of-conduct\nchangelog\n```\n"
  },
  {
    "path": "docs/dev/performance-testing.md",
    "content": "# Performance testing\n\n## Codspeed\n\nPerformance testing for this project can be found on codspeed here:\n\n- https://codspeed.io/conda/conda-libmamba-solver\n\nTo run performance tests locally, run the following command in the root of the project:\n\n```shell\npytest --codspeed\n```\n\nTo profile tests, add the following decorator above it:\n\n```python\nimport pytest\n\n\n@pytest.mark.benchmark\ndef test_new_feature():\n    \"\"\"Ensure feature performs well\"\"\"\n```\n\nSee the official [codspeed documentation](https://codspeed.io/docs) for more information.\n"
  },
  {
    "path": "docs/dev/setup.md",
    "content": "# How to set up your development environment\n\n## With `devcontainer` in VS Code\n\nThe development workflow is streamlined for Linux thanks to the `devcontainer` configuration\nbundled in this repository. You'll need Docker and VS Code with the [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers):\n\n1. Clone `conda/conda`, `mamba-org/mamba` and `conda/conda-libmamba-solver` to your preferred locations\n   (e.g. `~/devel/conda`, `~/devel/mamba` and `~/devel/conda-libmamba-solver`, respectively).\n   The location does not matter as long as all repositories have the same parent directory.\n2. Open your `conda-libmamba-solver` clone with VS Code.\n3. Connect to the DevContainer image via the bottom-left menu (<kbd>❱❰</kbd>) and\n   click on \"Reopen in Container\". Pick one of the suggested configurations:\n   conda-forge or defaults. The only difference is the base installation (Miniforge and Miniconda,\n   respectively).\n4. The image will be built and after a couple minutes, you'll be dropped into a Bash shell. Enjoy!\n   Since the local repositories are mounted, you can make modifications to the source live,\n   and they will be reflected in the Docker instance automatically.\n   Run `pytest` or `conda` as needed, no need to reload Docker!\n5. If the development environment breaks, click again on <kbd>❱❰</kbd> and, this time, choose\n   \"Rebuild container\". You might need to Retry a couple times.\n\n```{note} Developing libmamba\nThe devcontainer configuration also supports libmamba 1.x development. You just need to have the\n`mamba-org/mamba` repository (branch `1.x`) cloned next to `conda` and `conda-libmamba-solver`.\nOnce the container has started, run `develop-mamba` to set it up.\nIf you are modifying C++ sources, re-run `develop-mamba` to rebuild the libraries.\n```\n\n## With regular Docker\n\nYou can reuse the devcontainer scripts with regular Docker too.\n\n1. Clone `conda/conda`, `mamba-org/mamba` and `conda/conda-libmamba-solver` to your preferred locations\n   (e.g. `~/devel/conda`, `~/devel/mamba` and `~/devel/conda-libmamba-solver`, respectively).\n   The location does not matter as long as all repositories have the same parent directory.\n2. Start a new Docker instance with this command. Adjust the local mounts as necessary.\n\n   ```bash\n   # For defaults-based images, use:\n   docker run -it --rm \\\n     -v ~/devel/conda:/workspaces/conda \\\n     -v ~/devel/mamba:/workspaces/mamba \\\n     -v ~/devel/conda-libmamba-solver:/workspaces/conda-libmamba-solver \\\n     continuumio/miniconda3:latest \\\n     bash\n   # For conda-forge-based images, use the following instead:\n   docker run -it --rm \\\n     -v ~/devel/conda:/workspaces/conda \\\n     -v ~/devel/mamba:/workspaces/mamba \\\n     -v ~/devel/conda-libmamba-solver:/workspaces/conda-libmamba-solver \\\n     condaforge/miniforge3:latest \\\n     bash\n   ```\n3. Run the `post_create` and `post_start` scripts:\n   ```bash\n   bash /workspaces/conda-libmamba-solver/.devcontainer/post_create.sh\n   bash /workspaces/conda-libmamba-solver/.devcontainer/post_start.sh\n   ```\n4. If you want to develop with mamba in editable mode, run:\n   ```bash\n   source ~/.bashrc\n   develop-mamba\n   ```\n\n## General workflow\n\nWe strongly suggest you start with the Docker-based workflow above.\nIt is a better development experience with a fully disposable environment.\nHowever, sometimes you might need to debug issues for non-Linux installations.\nIn that case, you can follow these general instructions,\nbut be careful with overwriting your existing `conda` installations,\nespecially when it comes to `shell` initialization!\n\n1. Get yourself familiar with the [\"Development environment\" guide for `conda` itself][conda_dev].\n\n2. Fork and clone the `conda-libmamba-solver` repository to your preferred location:\n\n```bash\ngit clone \"git@github.com:$YOUR_USERNAME/conda-libmamba-solver\" \"$REPO_LOCATION\"\ncd \"$REPO_LOCATION\"\n```\n\n3. Install the required dependencies for `conda-libmamba-solver`:\n\n```bash\nconda install \\\n  --file \"$REPO_LOCATION\"/dev/requirements.txt \\\n  --file \"$REPO_LOCATION\"/tests/requirements.txt\n```\n\n4. Install `conda-libmamba-solver` with `pip`:\n\n```bash\ncd $REPO_LOCATION\npython -m pip install --no-deps -e .\n```\n\n## Debugging `conda` and `conda-libmamba-solver`\n\nOnce you have followed the steps described in the general workflow\nabove you may need to investigate the state in a particular\npoint. Insert a\n[`breakpoint()`](https://docs.python.org/3/library/pdb.html) within\nthe code and run a test or conda directly to hit the breakpoint.\n\n## Debugging Mamba\n\nWhile debugging the conda workflows only requires modifying python\ncode and running conda. Debugging the mamba code requires\nrecompilation and is not as easy to jump into a debugger to\ninvestigate state.\n\n1. Get familiar with the [\"Local development\" guide for `mamba` itself][mamba_dev].\n\n2. Fork and clone the `mamba` repository to your preferred location:\n\n```bash\ngit clone \"git@github.com:$YOUR_USERNAME/mamba\" \"$REPO_LOCATION\"\ncd $REPO_LOCATION\n```\n\n3. Use the Docker image for development suggested above and re-run\n   `develop-mamba` whenever you make change to `mamba` in\n   `$REPO_LOCATION`. This should take less than a minute.\n\nWe recommend debugging via either breakpoints and using `gdb` or `print`\nstatements via `std::cout << ... << std::endl`. The\n[following](https://github.com/costrouc/mamba/commit/99ac04ee9ca26c9579c67816cfba25bf310c30fb)\nshows an example of inserting print statements into the `libmamba`\nsource in order to debug the [libsolv](https://github.com/openSUSE/libsolv) state.\n\n<!-- LINKS -->\n\n[conda_dev]: https://docs.conda.io/projects/conda/en/latest/dev-guide/development-environment.html\n[mamba_dev]: https://mamba.readthedocs.io/en/latest/developer_zone/build_locally.html\n"
  },
  {
    "path": "docs/dev/sharded.md",
    "content": "# Sharded repodata implementation\n\nThis document provides an overview on how `conda-libmamba-solver` implements\n[CEP-16 Sharded Repodata](https://conda.org/learn/ceps/cep-0016).\n\nSharded repodata splits `repodata.json` into an index mapping package names to\nshard hashes in `repodata_shards.msgpack.zst`. A shard contains repodata for\nevery package with a given name. Since shards are named after a hash of their\ncontents, they can be cached without having to check the server for freshness.\nIndividual shards only need to change when an individual package has changed, so\nonly the much smaller index has to be re-fetched often.\n\n## Sharded Repodata in conda-libmamba-solver\n\nFor `conda-libmamba-solver`, we wanted a way to implement sharded repodata in\nPython without having to touch the C++ `libmamba`.\n\nWe do this by treating all repodata as if it was sharded repodata. Starting with\na list of installed packages and to-be-installed packages, we gather all\nrepodata for those packages and look for all package names listed in their\ndependencies. We repeat the process for every discovered package name that we\nhave not already visited, fetching repodata shards or examining all artifacts\nwith that package name as found in monolithic `repodata.json`. This process\ngathers all versions of all packages that we might depend on. We do not consider\npackage versions at this stage; that's the solver's job.\n\nAs of this writing, `conda create -c conda-forge --dry-run python` finds 35\npackage names; `conda` 137 package names, and `vaex`, a dataframe library with a\ncomplex dependency tree, 678 package names. That's a lot less than the 31k\npackages total according to https://conda-forge.org/, and a manageable number to\npre-process in Python before doing a solve with `libmamba`. As long as we can\nfetch those packages quickly enough, from cache or from the network, we will\nsave RAM, disk space, bandwidth and time compared to parsing every package on\nthe channel every time.\n\n### Threading and concurrency\n\nIn order to achieve concurrency, our sharded repodata implementation uses\nthe Python [threading module](https://docs.python.org/3/library/threading.html).\nWe have two separate thread workers for fetching cache and network data. These\nthreads communicate to each other via the following queues:\n\n- **cache_in_queue** every requested shard goes here first where the cache\n  worker sees if we have a valid cache record.\n- **cache_miss_queue** for every shard not in cache, we send it this queue where\n  the network worker thread downloads it.\n- **shard_out_queue** once a shard has been fetched from either the cache or\n  network worker threads, it is placed here so we can gather all needed\n  shards at the end to build our repodata subset.\n\n:::{mermaid}\n\n    sequenceDiagram\n        loop\n            Main ->> Main: \"Fetch\" in-memory shard\n            Main ->> Cache: Fetch shard\n            Cache ->> Network: Cache miss\n            Cache ->> Main: Cache hit\n            Network ->> Main: Network result\n            Main ->> Main: Find new (channel, package) from shard data\n        end\n\n:::\n\n## Source code\n\nThe shard handling code is split into `shards.py`, `shards_cache.py`,\n`shards_subset.py` and `shards_typing.py` in `conda_libmamba_solver/`.\nAdditional code in `conda_libmamba_solver/index.py` calls\n`build_repodata_subset()` and converts the resulting repodata to `libmamba`\nobjects.\n\n### `shards.py`\n\n`shards.py` provides an interface to treat sharded repodata and monolithic\n`repodata.json` in the same way. It checks a channel for sharded repodata,\nreturning an object that implements the `ShardLike` interface.\n\n### `shards_subset.py`\n\n`shards_subset.py` accepts a list of `ShardLike` instances and a list of initial\npackages to compute a repodata subset. The traversal is simplified thanks to the\n`ShardLike` interface, so the algorithm doesn't have to worry too much about the\ntype of each channel.\n\n### `shards_cache.py`\n\n`shards_cache.py` implements a sqlite3 cache used to store individual shards.\nWhen traversing shards, the cache is checked before making a network request.\nThe shards cache is a single database for all channels in\n`$CONDA_PREFIX/pkgs/cache/repodata_shards.db`.\n\nThe shards index `repodata_shards.msgpack.zst` is cached in the same way as\n`repodata.json`, in individual files in `$CONDA_PREFIX/pkgs/cache/` named after\nURL hashes. A `has_<format>` remembers if a channel has shards, or not. If\n`has_shards` is `false` then we wait 7 days after `last_checked` to make another\nrequest looking for `repodata_shards.msgpack.zst`. The same system remembers\nwhether a channel provides `repodata.json.zst`, and stores `ETag` and\n`Last-Modified` used to refresh the cache.\n\n```\n...\n\"has_shards\": {\n    \"last_checked\": \"2025-10-15T17:19:44.408989Z\",\n    \"value\": true\n},\n```\n\n### `shards_typing.py`\n\n`shards_typing.py` provides type hints for data structures used in sharded\nrepodata, but it is not normative; it only includes fields used by the sharded\nrepodata system.\n\n### `tests/test_shards.py`\n\nThe sharded repodata tests maintain 100% code coverage of the shards-related code\n`shards*.py`.\n\n## Example dependency graph for Python\n\nThis is what Python's dependencies look like on `conda-forge` as of this writing.\n\nIf sharded repodata is asked to install Python, we look for `python` in every\nactive channel. The `python` shard(s) tells us we can fetch `bzip2`, `libffi`,\n`...` in parallel, discovering a third layer including `icu`, `ca-certificates`,\nand others. `ca-certificates` also depends on some virtual packages, but the\ntraversal quickly determine that these packages don't appear in any channel by\nchecking the `repodata_shards.msgpack.zst` index. The solver will let us know if\nthese missing packages are a problem, virtual or no.\n\nThe first draft of sharded repodata in `conda-libmamba-solver` literally\ngenerated classic `repodata.json` with package subsets to load into the solver,\nbut now we convert each record into `libmamba` `PackageInfo` objects in memory.\n\nBy giving `libmamba` every possible dependency for a specific request, it has\nenough information to produce a solution.\n\n:::{mermaid} shards_python.mmd\n"
  },
  {
    "path": "docs/dev/shards_python.mmd",
    "content": "flowchart LR\n    python --> bzip2\n    python --> libffi\n    python --> libzlib\n    python --> ncurses\n    python --> openssl\n    python --> readline\n    python --> sqlite\n    python --> tk\n    python --> tzdata\n    python --> xz\n    python --> libsqlite\n    python --> libcxx\n    python --> zlib\n    python --> __osx\n    python --> liblzma\n    python --> libexpat\n    python --> libmpdec\n    python --> python_abi\n    python --> zstd\n    python --> _python_rc\n    python --> expat\n    python --> libiconv\n    libsqlite --> icu\n    openssl --> ca-certificates\n    python_abi --> pypy3.6\n    python_abi --> pypy3.7\n    python_abi --> pypy3.8\n    python_abi --> pypy3.9\n    xz --> liblzma-devel\n    xz --> xz-gpl-tools\n    xz --> xz-tools\n    zstd --> lz4-c\n    ca-certificates --> __win\n    ca-certificates --> __unix\n"
  },
  {
    "path": "docs/dev/workflows.md",
    "content": "# Typical development workflows\n\n```{note}\nCheck out [\"How to set up your development environment\"](setup.md) if you haven't yet!\n```\n\n## Testing\n\nThe solver is a critical part of `conda` as a tool.\nIn addition to unit tests for `conda_libmamba_solver`,\nour CI also runs the full `conda/conda` integration suite.\n\n### conda-libmamba-solver tests\n\nFrom the properly mounted devcontainer (see [\"Development environment setup\"](setup.md)):\n\n```bash\n$ cd /workspaces/conda-libmamba-solver\n$ pytest\n```\n\nOr just use the PyTest integrations in VS Code (flask icon).\n\n### Upstream tests\n\nFrom the properly mounted devcontainer (see [\"Development environment setup\"](setup.md)):\n\n```bash\n$ cd /workspaces/conda\n$ CONDA_SOLVER=libmamba pytest\n```\n"
  },
  {
    "path": "docs/environment.yml",
    "content": "name: conda-libmamba-solver-docs\nchannels:\n  - conda-forge\n  - defaults\ndependencies:\n  - accessible-pygments=0.0.4\n  - alabaster=0.7.12\n  - babel=2.11.0\n  - beautifulsoup4=4.11.1\n  - brotlipy=0.7.0\n  - bzip2=1.0.8\n  - ca-certificates=2022.9.24\n  - certifi=2022.9.24\n  - cffi=1.15.1\n  - charset-normalizer=2.1.1\n  - colorama=0.4.6\n  - conda-sphinx-theme==0.1.3\n  - cryptography=38.0.3\n  - docutils=0.19\n  - idna=3.4\n  - imagesize=1.4.1\n  - importlib-metadata=5.1.0\n  - jinja2=3.1.2\n  - libffi=3.4.2\n  - libsqlite=3.40.0\n  - libzlib=1.2.13\n  - linkify-it-py=2.0.0\n  - markdown-it-py=3.0.0\n  - markupsafe=2.1.1\n  - mdit-py-plugins=0.4.0\n  - mdurl=0.1.0\n  - myst-parser=2.0.0\n  - ncurses=6.3\n  - openssl=3.0.7\n  - packaging=21.3\n  - pip=22.3.1\n  - pycparser=2.21\n  - pydata-sphinx-theme=0.14.3\n  - pygments=2.16.1\n  - pyopenssl=22.1.0\n  - pyparsing=3.0.9\n  - pysocks=1.7.1\n  - python=3.11.0\n  - python_abi=3.11\n  - pytz=2022.6\n  - pyyaml=6.0.1\n  - readline=8.1.2\n  - requests=2.28.1\n  - setuptools=65.5.1\n  - six=1.16.0\n  - snowballstemmer=2.2.0\n  - soupsieve=2.3.2.post1\n  - sphinx=7.2.6\n  - sphinx-copybutton=0.5.0\n  - sphinx-design=0.5.0\n  - sphinx-sitemap=2.2.1\n  - sphinx-reredirects=0.1.2\n  - sphinxcontrib-applehelp=1.0.2\n  - sphinxcontrib-devhelp=1.0.2\n  - sphinxcontrib-htmlhelp=2.0.0\n  - sphinxcontrib-jsmath=1.0.1\n  - sphinxcontrib-mermaid=0.7.1\n  - sphinxcontrib-qthelp=1.0.3\n  - sphinxcontrib-serializinghtml=1.1.9\n  - tk=8.6.12\n  - typing-extensions=4.4.0\n  - typing_extensions=4.4.0\n  - tzdata=2022f\n  - uc-micro-py=1.0.1\n  - urllib3=1.26.13\n  - wheel=0.38.4\n  - xz=5.2.6\n  - yaml=0.2.5\n  - zipp=3.10.0\n"
  },
  {
    "path": "docs/index.md",
    "content": "# conda-libmamba-solver\n\nWelcome to the conda-libmamba-solver documentation! The conda-libmamba-solver\nwas written to make conda faster and is now the default solver. On this site,\nyou will find information about how to configure and use this solver.\n\n## Learn\n\n::::{grid} 2\n\n:::{grid-item-card} Getting started\n:link: user-guide/index\n:link-type: doc\nNew to conda-libmamba-solver? Start here to learn the essentials\n:::\n\n:::{grid-item-card} Configuration\n:link: user-guide/configuration\n:link-type: doc\nLearn about all available configuration options\n\n::::\n\n## Development\n\n::::{grid} 2\n\n:::{grid-item-card} Development environment\n:link: dev/setup\n:link-type: doc\nLearn how to set up your development environment\n:::\n\n:::{grid-item-card} Changelog\n:link: dev/changelog\n:link-type: doc\nRecent changes and udpates to the project\n::::\n\n\n```{seealso}\nFound a bug? [File an issue here](https://github.com/conda/conda-libmamba-solver/issues/new/choose)\n```\n\n```{toctree}\n:hidden:\n\nuser-guide/index\ndev/index\n```\n"
  },
  {
    "path": "docs/robots.txt",
    "content": "User-agent: *\n\nSitemap: https://conda.github.io/conda-libmamba-solver/sitemap.xml\n"
  },
  {
    "path": "docs/user-guide/configuration.md",
    "content": "# Configuration\n\n## Basic options\n\nconda-libmamba-solver is a _solver plugin_ and can be configured with the same settings as the classic solver. This is usually done via the `conda config` subcommand. Read the [conda configuration docs](https://docs.conda.io/projects/conda/en/stable/configuration.html) and check for the general solver options there.\n\n## Advanced options\n\nAdditionally, conda-libmamba-solver can be further configured via special environment variables.\nWe do not recomment using these options in production environments. Their behavior might change in the future, or they can be entirely removed without prior notice.\n\n* `CONDA_LIBMAMBA_SOLVER_MAX_ATTEMPTS`: Maximum number of attempts to find a solution. By default, this is set to the number of installed packages in the environment. In commands that involve a large number of changes in a large environment, it can take a bit to relax the constraints enough to find a solution. This option can be used to reduce the number of attempts and \"give up\" earlier.\n* `CONDA_LIBMAMBA_SOLVER_DEBUG_LIBSOLV`: Enable verbose logging from `libsolv`. Only has an effect if combined with `-vvv` in the CLI. Note that this will incur a big performance overhead. Only use when debugging solver issues.\n\n## Sharded Repodata\n\nSharded repodata is a feature that enables faster repodata fetching and is enabled by default. If you need to disable and only use classic repodata fetching, run the following `conda config` command:\n\n```shell\nconda config --set plugins.use_sharded_repodata false\n```\n\nAlternatively, you can disable it via an environment variable:\n\n```shell\nexport CONDA_PLUGINS_USE_SHARDED_REPODATA=false\n```\n"
  },
  {
    "path": "docs/user-guide/faq.md",
    "content": "# Frequently Asked Questions\n\n## What's the difference between the available solvers in `conda`?\n\nPlease refer to the section \"Technical differences between `libmamba` and `classic`\" in\nthe [`libmamba-vs-classic`](./libmamba-vs-classic.md#technical-differences-between-libmamba-and-classic) docs.\n\n## How do I uninstall it?\n\nIf you don't want to use the solver anymore, follow these instructions:\n\n```{warning}\nPlease make sure you __follow all steps below__ to uninstall the solver!\n```\n\n1. If you configured it as the default solver, make sure you revert it with:\n\n    ```bash\n    $ conda config --remove-key solver\n    # You might also need this:\n    $ conda config --remove-key experimental_solver\n    ```\n\n2. Then, remove the package from `base` with:\n\n    ```bash\n    $ conda remove -n base conda-libmamba-solver\n    ```\n\n## How do I configure conda to use the solver permanently?\n\nUse the following command to always use `libmamba` as your default solver:\n\n```bash\n$ conda config --set solver libmamba\n```\n\nTo undo this change permanently, run:\n\n```bash\n$ conda config --remove-key solver\n# You might also need this:\n$ conda config --remove-key experimental_solver\n```\n\n## I get an error when I try to use the `--solver` flag\n\nIf you are seeing this error:\n\n```\nCondaValueError: Key 'solver' is not a known primitive parameter.\n```\n\nIt might mean you are using an old version of the conda-libmamba-solver package.\nYou can check which version is installed with `conda list -n base conda-libmamba-solver`.\n\nBefore version 22.12, the CLI flag was `--experimental-solver`.\nWe recommend you upgrade to `conda` 22.11 or above, and then `conda-libmamba-solver` 22.12 or above.\n\nSee the [22.12.0 announcement post](https://github.com/conda/conda-libmamba-solver/releases/tag/22.12.0) for more details on how to upgrade.\n\n(install-older-conda)=\n\n## I have an older `conda` and I can't install `conda-libmamba-solver`\n\nSince older `conda` versions only supported the `classic` solver, you might run into solver conflicts or too long installations if your `base` environment is too constrained. This becomes a \"chicken-and-egg\" problem where you'd need `conda-libmamba-solver` to update to a more recent `conda` with `conda-libmamba-solver`.\n\nFortunately, there's a workaround thanks to the `conda-standalone` project. This is a single binary that bundles recent `conda` versions, with `conda-libmamba-solver` included. It's not a substitute for the full `conda` user experience but it can help bootstrap and rescue conda installations.\n\n1. Download the most recent `conda-standalone` from its [Github Releases page](https://github.com/conda/conda-standalone/releases/latest). Make sure to pick the one for your operating system and platform. Once downloaded, rename it as `conda.exe` on Windows and `conda` on Linux / macOS.\n2. Write down the location of your `base` environment: `conda info --root`.\n3. Write down the main preconfigured channel in your installation: `conda config --show channels`. This is usually `defaults` or `conda-forge`.\n4. Go to the Downloads directory and run this command from your terminal:\n\nOn Windows:\n\n```console\n.\\conda.exe install -p \"[path given by step 2]\" -c [channel from step 3] \"conda>=23.10\" conda-libmamba-solver\n```\n\nOn Linux or macOS:\n\n```console\n./conda install -p \"[path given by step 2]\" -c [channel from step 3] \"conda>=23.10\" conda-libmamba-solver\n```\n\nOnce the command succeeds, you'll have `conda-libmamba-solver` installed in your base environment and will be ready to use it as normal. You can delete the conda-standalone binaries.\n"
  },
  {
    "path": "docs/user-guide/index.md",
    "content": "# User Guide\n\nThe `conda-libmamba-solver` plugin allows you to use `libmamba`, the same `libsolv`-powered solver used by `mamba` and `micromamba`, directly in `conda`.\n\n## How to install\n\nIf you have a recent `conda` (23.10 or later), you don't have to do anything. `conda-libmamba-solver` is already preconfigured as default.\nFor older versions `conda`, we simply recommend updating `conda` to a more recent version:\n\n```console\n$ conda update -n base conda\n```\n\nIf this command fails, check this entry in the FAQ section: {ref}`install-older-conda`.\n\n```{admonition} Update from the experimental versions\n:class: note\n\nPlease refer to the [v22.12.0 release notes](https://github.com/conda/conda-libmamba-solver/releases/tag/22.12.0) for more details on how to update from a previous version if you were already using the experimental builds (conda-libmamba-solver 22.9 and below).\n```\n\n## Usage\n\nFrom `conda` 23.10, `conda-libmamba-solver` is the default solver. You don't have to do anything else. It will just work.\n\n\n````{admonition} Usage with conda 23.9 and below\n`conda <23.10` won't use `conda-libmamba-solver` by default.\nIt will still rely on the `classic` solver.\n\n<details>\n\n<summary>Sporadic use</summary>\n\nTo enable it for one operation, you can use the `--solver` flag, available for `conda create|install|remove|update` commands.\n\n```\n$ conda install tensorflow --solver=libmamba\n```\n\nNote: The `--solver` flag is also exposed as an environment variable, `CONDA_SOLVER`,\nin case you need that.\n\n</details>\n\n<details>\n\n<summary>Set as default</summary>\n\nTo enable it permanently, you can add `solver: libmamba` to your `.condarc` file, either manually, or with this command:\n\n```\n$ conda config --set solver libmamba\n```\n\n</details>\n````\n\n## Revert to `classic`\n\nIf you ever need to use the classic solver temporarily, use `--solver` flag:\n\n```\n$ conda install numpy --solver=classic\n```\n\nFinally, if you need to revert the default configuration back to `classic`, you can:\n\n* Run `conda config --set solver classic` (to make your choice explicit).\n\n```{admonition} Tip\nIf you are unsure what configuration is being used by conda, you can inspect\nit with `conda config --show-sources`.\n```\n\n```{toctree}\n:hidden:\n\nsubcommands\nconfiguration\nfaq\nlibmamba-vs-classic\nperformance\nmore-resources\n```\n"
  },
  {
    "path": "docs/user-guide/libmamba-vs-classic.md",
    "content": "# `libmamba` vs `classic`\n\nThe `libmamba` solver attempts to be a drop-in replacement for the `classic` solver; however, there\nare some differences which could not be avoided. These are the three primary reasons:\n\n- Fundamental differences between the underlying solver algorithms\n- Underlying implementation details\n- Conscious decisions made by developers to improve overall user experience\n\n## Should I use `conda-libmamba-solver`?\n\nUse `conda-libmamba-solver` if:\n\n* You want a faster solver with low-memory footprint.\n* Some of your environments do not solve quick enough, or at all, with `classic`.\n* You are okay with slightly different (but metadata-compliant) solutions.\n\n```{note}\n\nUsers most often find alternative solutions surprising when they request packages with very few restraints.\nIf the given solution is not fully satisfying, try to restrict your request a bit more.\n\nFor example, if you run `conda install scipy` and do not get the latest version, try using a more explicit command: `conda install scipy=X.Y`.\n```\n\nThe classic solver could be important to you if:\n\n- Backwards compatibility is important (i.e. environments must be solved exactly as they always have been)\n- The intentional deviations from the `classic` solver (see below) are not acceptable and you prefer the old behavior\n\nThese reasons could be especially important if you continue to use long lived environments that were initially created with the `classic` solver.\n\n```{important}\nYou can always use `--solver=classic` to re-enable the `classic` solver temporarily for specific operations, even after setting `libmamba` as default.\n```\n\n## Intentional deviations from `classic`\n\nWith the release of `conda-libmamba-solver`, we took the opportunity to improve some aspects of the solver experience that were not possible to change in `classic` due to backwards compatibility restraints. The main ones are:\n\n* `conda-libmamba-solver` does not use `current_repodata.json` by default. Instead, it always uses the full `repodata.json` files. You can still use it by setting `--repodata-fn current_repodata.json` explicitly.\n* `conda-libmamba-solver` does not retry with `--freeze-installed` by default. Instead, it has a tighter retry logic that progressively relaxes the constraints on the conflicting packages.\n* `conda-libmamba-solver` does not allow the user to override the configured [pinned specs](https://docs.conda.io/projects/conda/en/stable/user-guide/tasks/manage-pkgs.html#preventing-packages-from-updating-pinning) by specifying incompatible constraints in the CLI. Instead, it will error early. To override pinned specs,\nit needs to be done explicitly in the relevant configuration file(s) (e.g. temporarily commenting out the pin spec, or modifying the pin for a more recent version).\nNote that compatible CLI specs are still allowed, and will be used to select the best solution.\nFor example, having a pinned spec for `python=3.8` will not prevent you from requesting `python=3.8.10`, but `python=3.9` will be rejected.\n* `conda-libmamba-solver` provides a way to hard-lock a given package to its currently installed version. To do so, specify _only_ the name of the package as a [pinned spec](https://docs.conda.io/projects/conda/en/stable/user-guide/tasks/manage-pkgs.html#preventing-packages-from-updating-pinning). Once installed, the solver will prevent _any_ modifications to the package. Use with care, since this can be a source of conflicts. Adequately constrained pins are a more flexible alternative.\n\n\n## Technical differences between `libmamba` and `classic`\n\nWe know `conda-libmamba-solver` brings a faster solver to `conda`, but why is that?\nAnd, why couldn't the `classic` solver just become faster?\n\n```{note}\nThe following sections provide deeper technical details about the reasons,\nboth at the implementation and algorithmic level.\n```\n\nIf you don't care about that much detail, just know that:\n\n* Deep within, both `classic` and `conda-libmamba` rely on C-based code to\n  solve the SAT problem. However, `classic` uses Python objects to define and\n  manage the SAT clauses, which incurs a large overhead.\n\n  `libmamba` lets `libsolv` do the heavy lifting, operating in C++ and C,\n  respectively. `conda-libmamba-solver` tries to delegate to the `libmamba`\n  and `libsolv` compiled libraries as soon as possible to minimize the Python\n  overhead.\n\n* `classic` has a more involved retry-logic than can incur in more\n  time-consuming solver attempts, especially for existing environments.\n\n* Both options use SAT solvers, but they invoke them differently. `classic`\n  uses a multistep, multi-objective optimization scheme, which resembles a\n  global optimization scheme.\n\n  `libsolv` opts for a backtracking alternative, closer to a local\n  optimization scheme. This can result in `libmamba` choosing a different\n  member of the whole solution ensemble.\n\n### Implementation differences\n\nLet's first analyze how both solvers are implemented.\n\nThe `classic` solver logic is distributed across several abstraction layers in `conda`.\n\n* `conda.cli.install`:\n\n  This module contains the base implementation for `conda [env] install|remove|update|create`.\n  It eventually delegates to the `Solver` class, after some preparation tasks.\n  This module can run up to 4 solver attempts by default: use `current_repodata.json` first, or retry with `repodata.json`, and with and without the `--freeze-installed` flag.\n\n* `conda.core.solve.Solver`:\n\n  This class provides a three-function API that interfaces with the `Transaction` system.\n  Almost of all the logic falls under the `Solver.solve_final_state()` method.\n\n  At this step, `classic` downloads the channels metadata, collects information about the target environment and applies the command-line instructions provided by the user.\n\n  The end result is a list of `MatchSpec` objects;\n  in other words, a list of constraints that underlying solver must use to best select the needed packages from the channels.\n\n* `conda.resolve.Resolve`:\n\n  This class receives the `MatchSpec` instructions from the higher level `Solver` class and transforms them into SAT clauses, as implemented in the `conda.common.logic.Clauses` and `conda.common._logic.Clauses` classes.\n\n  [`Resolve.solve()`][Resolve.solve] is the method that governs the algorithmic details of \"solving the environment\".\n\n* `conda.common._logic._SatSolver`:\n\n  Provides the parent class for all three SAT solver wrappers implemented as part of the `classic` logic (PycoSat, PyCryptoSat, PySat).\n\n  The default one is `PycoSat`, but you can change it with the `sat_solver` option in your configuration.\n\n* `conda.common._logic._PycoSatSolver`:\n\n  This class wraps the `pycosat` bindings to `picosat`, the underlying C library that actually solves the SAT clauses problem.\n\nFor `conda-libmamba-solver`, we initially tried to provide an implementation at the `_SatSolver` level,\nbut `libsolv` (and hence `libmamba`) didn't expose a SAT-based API.\nWe ended up with an implementation a bit higher up in the abstraction tree:\n\n* `conda.cli.install`:\n\n  We always ignore `current_repodata.json` and implement the\n  `--freeze-installed` attempts closer to the solver so we don't have\n  to re-run the preparation steps.\n\n* `conda_libmamba_solver.solver.LibMambaSolver`:\n\n  A `conda.core.solve.Solver` subclass that completely replaces the `Solver.solve_final_state()` method.\n  We used this opportunity to refactor some of the pre-solver logic (spread across different layers in `classic`) into a solver-agnostic module (`conda_libmamba_solver.state`) with nicer-to-work-with helper objects.\n  Our subclass instantiates the `libmamba` objects.\n\n* `libmambapy.Solver`:\n\n  The `libmambapy` Python package is generated by `pybind11` bindings to the underlying `libmamba` C++ library.\n  Some of the objects we rely on are `Solver` (interfaces with `libsolv`), and the `Database` object (handles the channel metadata and target environment state).\n\n* `libsolv`:\n\n  `libmamba` relies on this C project directly to handle the solving steps. Note that Anaconda's and conda-forge's distributions of `libsolv` come with a set of patches, including one to handle the conda packages' variants' prioritization (which is not present in the upstream `libsolv`). Those patches can be found in the `recipe` folder of  [`AnacondaRecipes/libsolv-feedstock`][AnacondaRecipes-libsolv-feedstock] and [`conda-forge/libsolv-feedstock`][conda-forge-libsolv-feedstock],\n  respectively.\n\nThe implementation details reveal some of the reasons for the performance differences:\n\n* `classic` uses many Python layers before it finally reaches the compiled code (`picosat`):\n    * Tens of `MatchSpec` objects reflect the input state: installed packages, system constraints and user-requested packages\n    * The channel index (repodata files) results in tens of thousands of `PackageRecord` objects\n    * The SAT clauses end up being expressed as tens or hundreds of thousands of `logic.Clauses` and `_logic.Clauses` objects.\n    * The optimization algorithm in `Resolve.solve()` invokes picosat several times, switching between Python and C contexts very often, recreating `Clauses` as necessary.\n* `conda-libmamba-solver`, in contrast, switches to C++ pretty early in the abstraction tree.\n    * Only the `MatchSpec` objects are created in the Python layer, only to be immediately forwarded to its C++ counterparts.\n    * The SAT clauses are built and handled by `libsolv`, using a [very memory-efficient approach based on 32-bit integers only][libsolv-history].\n      This allows the SAT problem to [be treated in milliseconds][libsolv-ms].\n\n### Algorithmic details\n\n#### Retry logic\n\n`classic` tries hard to minimally modify your environment, so by default, the flag `--freeze-installed` will be applied.\n\nThis means all your installed packages will be constrained to their current installed version.\nIf the SAT solver couldn't find a solution, then `classic` will analyze which packages are causing the conflict.\n\nIf the conflicting packages were not explicitly requested by the user (in the current or previous operations in the target environment),\ntheir version constraint will be relaxed and a new solving attempt will be made.\n\nIf, despite the progressive constraint relaxation, the SAT solver cannot find a solution, the `Solver` class will raise an exception to the `conda.cli.install` module.\nThis will trigger a second round of attempts, without `--freeze-installed`.\nIn simplified Python:\n\n```python\nfor repodata in (\"current_repodata.json\", \"repodata.json\"):\n    solver = Solver(repodata_fn=repodata)\n    for should_freeze in (True, False):\n        success = solver.solve(freeze_installed=True)\n        if success:\n            break\nelse:\n    raise SolverError()\n\n\nclass Solver:\n    \"Super simplified version. Actual implementation is spread across many layers\"\n\n    def solve(self, *args, **kwargs):\n        index = download_channel(channels, repodata_fn)\n        constraints = collect_metadata(target_environment, user_requested_packages)\n        while True:\n            sat_solver = SATSolver(index)\n            clauses = sat_solver.build_clauses(constraints)  # expensive!\n            success = sat_solver.solve(clauses)  # multi-step optimization\n            if success:\n                return True\n            else:\n                conflicts = sat_solver.find_conflicts()\n                initial_constraints = constraints.copy()\n                constraints.update(conflicts)\n                if initial_constraints == constraints:\n                    return False\n```\n\nA similar retry logic is implemented in `conda_libmamba_solver`, but `libsolv`\ngives us the conflicting packages as part of the solving attempt result for\nfree, which allows us to iterate faster.\n\nWe don't need a separate attempt to disable `--freeze-installed` because our\nretry logic handles conflicts and frozen packages in the same way.\n\nAdditionally, this retry logic can also be disabled or reduced with an\nenvironment variable for extreme cases (very large environments).\nThis makes the overall logic simpler and faster, which compounds\non top of the lightning-fast `libmamba` implementation.\n\n#### SAT algorithms\n\nGiven a set of `MatchSpec` objects, `classic` will apply a multistep, multi-objective optimization strategy that invokes the actual SAT solver several times:\n\n* [`conda.resolve.Resolve.solve()`][Resolve.solve] will optimize several objective metrics.\n  In no particular order, some of these rules are:\n\n  * Maximize the versions and build numbers of required packages\n  * Minimize the number of `track_features`\n  * Prefer non-`noarch` over `noarch` if both are available\n  * Minimize the number of necessary upgrades and/or removals\n\n* `conda.common._logic.Clauses.minimize()`:\n\n  This is used for each step above, and involves a series of SAT calls per\n  minimization. All of these calls involve, at some point, passing Python\n  objects over to the C context, which incurs some overhead.\n\nIn contrast, `libmamba` delegates fully to `libsolv`, which has its own logic\nfor conda-specific problems.\n\nYou can read more about it in the\n[`mamba-org/mamba` documentation][mamba_libsolv_docs], but the most important part:\n\n* `libsolv` is a backtracking SAT solver, [inspired][libsolv-history-sat] by\n  [minisat][minisat]. This means that it explores \"branches\" of a solution\n  until it finds one that satisfies the input constraints.\n\n  If we understand `classic`'s approach as a global-like optimization strategy,\n  and one could say `libsolv`'s better resembles a local optimization approach.\n\n* This means that in the presence of several compatible solutions,\n  `libsolv` might choose one that is different to the one proposed by `classic`.\n\n```{note} Tip\nLarge conda-forge migrations often rely on multiple coexisting build variants\nto ease the transition (e.g. `openssl` v1 to v3). This introduces several\nalternative branches `libsolv` can end up exploring and selecting,\nperhaps with surprising results.\n\nBeing more explicit about the requested packages usually helps get obtaining\nthe expected solution; e.g. if you want to install `scipy=1.0` (the latest\nversion), express that explicitly: `conda install scipy=1.0` instead of\n`conda install scipy`.\n```\n\n#### Index reduction\n\n`classic` prunes the channel metadata (internally referred to as the \"index\") in every `Resolve.solve()` call.\nThis reduces the search space by excluding packages that won't ever be needed by the current set of input constraints.\nConversely, this performance optimization step can get longer and longer the larger the index gets.\n\nIn `libsolv`, pruning is part of the filtering, sorting and selection mechanism that informs the solver (see [`policy.c`][policy.c] and [`selection.c`][selection.c]).\nIt runs in C, using memory-efficient data structures.\n\n### IO differences\n\n`conda-libmamba-solver` uses the same IO stack as `conda` classic. In the past, we relied on `libmamba`'s IO for repodata fetching, but this is not the case anymore.\n\n## Practical examples of solver differences\n\n### Python 3.11 + very old Pydantic\n\n> Case study inspired by [issue #115](https://github.com/conda/conda-libmamba-solver/issues/115)\n\nThe following environment file will give different solutions with `classic` and `conda-libmamba-solver`.\n\n```yaml\nname: gmso\nchannels:\n  - conda-forge\ndependencies:\n  - numpy\n  - sympy\n  - unyt <=2.8\n  - boltons\n  - lxml\n  - pydantic <1.9.0\n  - networkx\n  - ele >=0.2.0\n  - forcefield-utilities\n```\n\n- `classic`: `python 3.10` + `pydantic 1.8.2`\n- `conda-libmamba-solver`: `python 3.11` + `pydantic 0.18.2`\n\nThis is an example of an underspecified input. There's no `python` dependency (or version) listed\nin the environment file, so the solver has to figure it out. The solver doesn't necessarily know\nwhich dependency is more \"important\". `classic` will prioritize getting a more recent `pydantic` at\nthe expense of an older `python`, and `conda-libmamba-solver` will prefer having `python 3.11`,\neven if it means going all the way down to `pydantic 0.18.2` (which was packaged as `noarch`) and\nthus compatible with _any_ Python version.\n\n### cudatoolkit present in a `cpuonly` environment\n\n> Originally reported in [issue #131](https://github.com/conda/conda-libmamba-solver/issues/131)\n\nThis is an example of a [known limitation in how `libsolv` processes the `track_features`\nmetadata](https://mamba.readthedocs.io/en/latest/advanced_usage/package_resolution.html). `libsolv`\nwill only \"see\" the first level of `track_features`, which down-prioritize packages. If you depend\non 2nd-order dependencies to track prioritized variants (which conda `classic` successfully\nprocesses), you will get mixed results. This can be solved at the packaging level, where all the\nvariants rely on the package _mutex_ directly, instead of relying on packages that depend on the\nmutex.\n\n## More information\n\nIf you want to read (even more) about this, please check the following resources:\n\n* [\"Deep dive: solvers\" guide in the `conda` documentation][deep-dive]\n* [\"Package resolution\" in the `mamba` documentation][mamba-pkg-resolution]\n* [Libsolv documentation][libsolv-docs]\n* [Explore ways to use other solvers instead of interacting with SAT solver directly][conda-solvers-issue] (`conda` issue)\n* [libsolv for conda?][libsolv-issue] (`libsolv` issue)\n\n<!-- LINKS -->\n\n[AnacondaRecipes-libsolv-feedstock]: https://github.com/AnacondaRecipes/libsolv-feedstock/\n[conda-forge-libsolv-feedstock]: https://github.com/conda-forge/libsolv-feedstock/\n[policy.c]: https://github.com/openSUSE/libsolv/blob/0.7.22/src/policy.c\n[selection.c]: https://github.com/openSUSE/libsolv/blob/0.7.22/src/selection.c\n[Resolve.solve]: https://github.com/conda/conda/blob/22.9.0/conda/resolve.py#L1244\n[libsolv-history]: https://github.com/openSUSE/libsolv/blob/0.7.22/doc/libsolv-history.txt\n[libsolv-history-sat]: https://github.com/openSUSE/libsolv/blob/0.7.22/doc/libsolv-history.txt#using-sat-for-solving\n[libsolv-ms]: https://github.com/openSUSE/libsolv/issues/284#issuecomment-428927641\n[mamba_libsolv_docs]: https://mamba.readthedocs.io/en/latest/advanced_usage/package_resolution.html\n[minisat]: http://minisat.se/\n[jlap]: https://github.com/conda/conda/issues/11640\n[powerloader]: https://github.com/mamba-org/powerloader\n[deep-dive]: https://docs.conda.io/projects/conda/en/stable/dev-guide/deep-dives/solvers.html\n[mamba-pkg-resolution]: https://mamba.readthedocs.io/en/latest/advanced_usage/package_resolution.html\n[libsolv-docs]: https://github.com/openSUSE/libsolv/tree/master/doc\n[libsolv-issue]: https://github.com/openSUSE/libsolv/issues/284\n[conda-solvers-issue]: https://github.com/conda/conda/issues/7808#issuecomment-429805392\n"
  },
  {
    "path": "docs/user-guide/more-resources.md",
    "content": "# More resources\n\nIf you want to learn more about `conda-libmamba-solver` and `conda`, we have compiled a list of additional material you can check:\n\n* [\"A Faster Solver for Conda: Libmamba\"](https://www.anaconda.com/blog/a-faster-conda-for-a-growing-community) (Blog post)\n* Anaconda Webinars \"Scaling Conda\" series:\n    * [A Faster conda for a Growing Community](https://anaconda.cloud/a-faster-conda-for-a-growing-community)\n    * [A Closer Look at conda’s New libmamba Solver](https://anaconda.cloud/closer-look-at-conda-s-new-libmamba-solver)\n    * [Scaling conda: Extending conda with a New Plugin Ecosystem](https://anaconda.cloud/scaling-conda-extending-conda-a-new-plugin-ecosystem)\n<!-- * Release video (WIP) -->\n"
  },
  {
    "path": "docs/user-guide/performance.md",
    "content": "# Performance tips and tricks\n\n`conda-libmamba-solver` is much faster than classic for [many reasons](./libmamba-vs-classic.md),\nbut there are certain tricks you can use to make it even faster!\n\nThese tips apply to both solvers:\n\n- **Explicit is better**.\n  Instead of letting the solver do all the work, specify target versions for your packages.\n  `conda install python=3.11 numpy` is way better than `conda install python numpy`.\n* Use `--strict-channel-priority`.\n  Strict channel priority drastically reduces the solver search space when you are mixing channels.\n  Make this decision permanent with `conda config --set channel_priority strict`.\n* Use `--update-specs`.\n  For existing environments, do not attempt to freeze installed packages by default.\n\n## For `conda-libmamba-solver`\n\n* Experimental: `CONDA_LIBMAMBA_SOLVER_MAX_ATTEMPTS=0`.\n  Setting this environment variable will disable the retry loop, making it behave more like `micromamba`.\n\n## For conda `classic`\n\nThe above tips also apply to `classic`, but you can supplement them with:\n\n* `--repodata-fn=repodata.json` to skip using `current_repodata.json`.\n* `CONDA_UNSATISFIABLE_HINTS_CHECK_DEPTH=1` won't help solves get any faster, but failures will be reported more quickly.\n\n## References\n\n- [Understanding and Improving Conda's performance](https://www.anaconda.com/blog/understanding-and-improving-condas-performance)\n- [How We Made Conda Faster in 4.7](https://www.anaconda.com/blog/how-we-made-conda-faster-4-7)\n"
  },
  {
    "path": "docs/user-guide/subcommands.md",
    "content": "# Subcommands\n\nThe conda-libmamba-solver package also provides conda subcommand plugins in addition to the solver plugin.\n\n## `conda repoquery`\n\nA conda subcommand plugin that offers the same functionality as `mamba repoquery` and\n`micromamba repoquery`. It provides three actions:\n\n- `conda repoquery search`: Query repodata for packages matching a pattern.\n- `conda repoquery depends`: Show the dependencies of the requested package.\n- `conda repoquery whoneeds`: Show the packages that depend on the requested package.\n\nCheck the `--help` messages for each task for more information.\n"
  },
  {
    "path": "durations/Linux.json",
    "content": "{\n    \"tests/base/test_constants.py::test_ChannelPriority\": 0.008545328147680534,\n    \"tests/base/test_constants.py::test_deprecations[CONDA_PACKAGE_EXTENSIONS-TypeError]\": 0.0012750831265666137,\n    \"tests/base/test_constants.py::test_deprecations[CONDA_PACKAGE_PARTS-TypeError]\": 0.001525353767928843,\n    \"tests/base/test_constants.py::test_deprecations[ERROR_UPLOAD_URL-TypeError]\": 0.0026698171060825014,\n    \"tests/base/test_constants.py::test_null_is_falsey\": 0.007022636098624928,\n    \"tests/base/test_context.py::test_aggressive_update_packages\": 0.01628141288868955,\n    \"tests/base/test_context.py::test_category_map_covers_all_parameters\": 0.010024243102299414,\n    \"tests/base/test_context.py::test_category_map_is_class_constant\": 0.0009877110757574928,\n    \"tests/base/test_context.py::test_channel_alias_validation[bad_value-channel_alias value 'bad_value' must have scheme/protocol.]\": 0.001139643844744402,\n    \"tests/base/test_context.py::test_channel_alias_validation[https://example.com/-True]\": 0.0011568568943493525,\n    \"tests/base/test_context.py::test_channel_priority\": 0.011092189481377126,\n    \"tests/base/test_context.py::test_channel_settings\": 0.010097967555464738,\n    \"tests/base/test_context.py::test_channels_defaults_condarc\": 0.011565344603087096,\n    \"tests/base/test_context.py::test_channels_empty\": 0.010144190313022043,\n    \"tests/base/test_context.py::test_check_allowlist\": 0.006810765876942388,\n    \"tests/base/test_context.py::test_check_allowlist_and_denylist\": 0.006803423722442263,\n    \"tests/base/test_context.py::test_check_denylist\": 0.006313420292789785,\n    \"tests/base/test_context.py::test_client_ssl_cert\": 0.02010221844473759,\n    \"tests/base/test_context.py::test_clobber_enum[clobber]\": 0.004333887092230296,\n    \"tests/base/test_context.py::test_clobber_enum[prevent]\": 0.004182682087540101,\n    \"tests/base/test_context.py::test_clobber_enum[warn]\": 0.0044394001519348514,\n    \"tests/base/test_context.py::test_conda_bld_path\": 0.007613819105122191,\n    \"tests/base/test_context.py::test_conda_build_root_dir\": 0.009854785461444391,\n    \"tests/base/test_context.py::test_conda_envs_path\": 0.016390391754060825,\n    \"tests/base/test_context.py::test_context_override_with_reset\": 0.004152064750524644,\n    \"tests/base/test_context.py::test_context_parameter_map\": 0.010023344349447363,\n    \"tests/base/test_context.py::test_context_parameters_have_descriptions\": 0.028006493167758776,\n    \"tests/base/test_context.py::test_context_stack_doubles_on_overflow[1]\": 0.0011125885911494316,\n    \"tests/base/test_context.py::test_context_stack_doubles_on_overflow[2]\": 0.001106402947302293,\n    \"tests/base/test_context.py::test_context_stack_doubles_on_overflow[3]\": 0.0010862911970171518,\n    \"tests/base/test_context.py::test_context_stack_doubles_on_overflow[4]\": 0.0010722117974705985,\n    \"tests/base/test_context.py::test_context_stack_push_pop_roundtrip\": 0.004530824087646658,\n    \"tests/base/test_context.py::test_context_stack_starts_with_single_slot\": 0.0010310315805524188,\n    \"tests/base/test_context.py::test_create_default_packages[context_packages0-expected_packages0]\": 0.0044338138887764405,\n    \"tests/base/test_context.py::test_create_default_packages[context_packages1-expected_packages1]\": 0.004349389483428491,\n    \"tests/base/test_context.py::test_create_default_packages[context_packages2-expected_packages2]\": 0.006929862876095088,\n    \"tests/base/test_context.py::test_create_default_packages_will_warn_for_explicit_packages\": 0.00550498219007516,\n    \"tests/base/test_context.py::test_custom_multichannels\": 0.011111208809081393,\n    \"tests/base/test_context.py::test_custom_multichannels_overrides_default_channels\": 0.014052244880268497,\n    \"tests/base/test_context.py::test_default_activation_prefix\": 0.012710878416026876,\n    \"tests/base/test_context.py::test_default_python_validation[-True]\": 0.0011244915013786554,\n    \"tests/base/test_context.py::test_default_python_validation[3.12-True]\": 0.0011442066888013417,\n    \"tests/base/test_context.py::test_default_python_validation[4.12-default_python value '4.12' not of the form '[23].[0-9][0-9]?' or '']\": 0.0011505048092684445,\n    \"tests/base/test_context.py::test_default_python_validation[not a number-default_python value 'not a number' not of the form '[23].[0-9][0-9]?' or '']\": 0.001119611662276767,\n    \"tests/base/test_context.py::test_default_target_is_root_prefix\": 0.009767436962534652,\n    \"tests/base/test_context.py::test_deprecations[error_upload_url-TypeError]\": 0.0013068403926366284,\n    \"tests/base/test_context.py::test_expandvars\": 0.0327817026454136,\n    \"tests/base/test_context.py::test_export_platforms\": 0.013423224279676219,\n    \"tests/base/test_context.py::test_local_build_root_custom_rc\": 0.017601178527376568,\n    \"tests/base/test_context.py::test_local_build_root_default_rc\": 0.004354357832939643,\n    \"tests/base/test_context.py::test_migrated_custom_channels\": 0.02154413861427549,\n    \"tests/base/test_context.py::test_native_subdir[darwin-arm64-osx-arm64]\": 0.0012317508077063703,\n    \"tests/base/test_context.py::test_native_subdir[darwin-x86_64-osx-64]\": 0.001269789156182852,\n    \"tests/base/test_context.py::test_native_subdir[linux-aarch64-linux-aarch64]\": 0.001268250965362663,\n    \"tests/base/test_context.py::test_native_subdir[linux-ppc64le-linux-ppc64le]\": 0.0012538201223767037,\n    \"tests/base/test_context.py::test_native_subdir[linux-riscv64-linux-riscv64]\": 0.001237737968771187,\n    \"tests/base/test_context.py::test_native_subdir[linux-s390x-linux-s390x]\": 0.0012866927915895674,\n    \"tests/base/test_context.py::test_native_subdir[linux-x86_64-linux-64]\": 0.0013763687153045049,\n    \"tests/base/test_context.py::test_native_subdir[win32-AMD64-win-64]\": 0.0012789798416503611,\n    \"tests/base/test_context.py::test_native_subdir[win32-ARM64-win-arm64]\": 0.0012104043644134087,\n    \"tests/base/test_context.py::test_old_channel_alias\": 0.015759947901977638,\n    \"tests/base/test_context.py::test_proxy_servers\": 0.010180696577860316,\n    \"tests/base/test_context.py::test_signing_metadata_url_base\": 0.013432573488557167,\n    \"tests/base/test_context.py::test_signing_metadata_url_base_empty_default_channels\": 0.01378021874946843,\n    \"tests/base/test_context.py::test_specify_channels_cli_condarc\": 0.011708642025205466,\n    \"tests/base/test_context.py::test_specify_channels_cli_not_adding_defaults_no_condarc\": 0.011015875316819941,\n    \"tests/base/test_context.py::test_specify_different_channels_cli_condarc\": 0.011505217880754872,\n    \"tests/base/test_context.py::test_specify_same_channels_cli_as_in_condarc\": 0.012016486868830497,\n    \"tests/base/test_context.py::test_subdirs\": 0.004213172797224308,\n    \"tests/base/test_context.py::test_target_prefix\": 0.024563562090197378,\n    \"tests/base/test_context.py::test_threads\": 0.016505546460199656,\n    \"tests/base/test_context.py::test_validate_channels[-expected_channels3]\": 0.0012187949923148339,\n    \"tests/base/test_context.py::test_validate_channels[channels0-expected_channels0]\": 0.0019737435539771706,\n    \"tests/base/test_context.py::test_validate_channels[channels1-expected_channels1]\": 0.002004817717837793,\n    \"tests/base/test_context.py::test_validate_channels[channels2-expected_channels2]\": 0.0016945560951852506,\n    \"tests/base/test_context.py::test_validate_channels[channels4-expected_channels4]\": 0.0012110594818994728,\n    \"tests/cli/test_actions.py::test_deprecations[NullCountAction._ensure_value-TypeError]\": 0.0018078386683749806,\n    \"tests/cli/test_actions.py::test_null_count_action\": 0.0023744280270632267,\n    \"tests/cli/test_all_commands.py::test_activate_help_commands_exit_0_rc[activate]\": 0.014660223249995243,\n    \"tests/cli/test_all_commands.py::test_activate_help_commands_exit_0_rc[deactivate]\": 0.015379754249993636,\n    \"tests/cli/test_all_commands.py::test_commands_with_plugin_backed_options[command0-error: argument --format: invalid choice: 'idontexist']\": 0.02294904389321528,\n    \"tests/cli/test_all_commands.py::test_commands_with_plugin_backed_options[command1-error: argument --solver: invalid choice: 'idontexist']\": 0.02061895284046092,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command0]\": 0.02522551535869665,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command1]\": 0.02434073970306966,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command2]\": 0.12188035051157975,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command3]\": 0.029085961204454697,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command4]\": 0.1281702926198137,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command0]\": 0.05343950098894601,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command1]\": 0.046858404163985574,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command2]\": 0.1667435817796424,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command3]\": 0.027340924203803543,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command4]\": 0.12939746902792976,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command0]\": 0.027940171537448363,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command1]\": 0.023946398514491103,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command2]\": 0.022873939708953867,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command3]\": 0.026731951982201903,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command4]\": 0.12339903848608066,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command0]\": 0.02384217111473112,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command1]\": 0.02370906087199074,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command2]\": 0.033485268674908295,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command3]\": 0.026148861695864414,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command4]\": 0.1323865718326767,\n    \"tests/cli/test_all_commands.py::test_env_spec_deprecation_active[--env-spec]\": 0.004014946666486163,\n    \"tests/cli/test_all_commands.py::test_env_spec_deprecation_active[--environment-specifier]\": 0.0027865261661642686,\n    \"tests/cli/test_all_commands.py::test_env_spec_deprecation_pending[--env-spec]\": 0.003466177516815481,\n    \"tests/cli/test_all_commands.py::test_env_spec_deprecation_pending[--environment-specifier]\": 0.003739085791049507,\n    \"tests/cli/test_all_commands.py::test_env_spec_deprecation_removal\": 0.0023143047412195776,\n    \"tests/cli/test_all_commands.py::test_env_spec_no_warning_when_not_used\": 0.0023712413628062916,\n    \"tests/cli/test_cli_install.py::test_emscripten_forge[classic]\": 10.77327755728952,\n    \"tests/cli/test_cli_install.py::test_emscripten_forge[libmamba]\": 3.8977212989079546,\n    \"tests/cli/test_cli_install.py::test_find_conflicts_called_once[classic]\": 59.52933680535066,\n    \"tests/cli/test_cli_install.py::test_find_conflicts_called_once[libmamba]\": 0.0078099135842465296,\n    \"tests/cli/test_cli_install.py::test_frozen_env_cep22[classic]\": 19.747482368562224,\n    \"tests/cli/test_cli_install.py::test_frozen_env_cep22[libmamba]\": 10.165522369467704,\n    \"tests/cli/test_cli_install.py::test_pre_link_message[classic]\": 1.7689705825941886,\n    \"tests/cli/test_cli_install.py::test_pre_link_message[libmamba]\": 1.5558865368568502,\n    \"tests/cli/test_cli_install.py::test_reinstall_packages_calls_install[classic]\": 0.01278914918009649,\n    \"tests/cli/test_cli_install.py::test_reinstall_packages_calls_install[libmamba]\": 0.006939571151545043,\n    \"tests/cli/test_common.py::test_check_non_admin_enabled_false\": 0.004539166290653608,\n    \"tests/cli/test_common.py::test_check_non_admin_enabled_true\": 0.004382884385421261,\n    \"tests/cli/test_common.py::test_get_name_prefix_from_env_file_both_none\": 0.0019491530180702538,\n    \"tests/cli/test_common.py::test_get_name_prefix_from_env_file_exception_in_environment_spec\": 0.002251670120368649,\n    \"tests/cli/test_common.py::test_get_name_prefix_from_env_file_exception_in_get_specifier\": 0.001845968887875701,\n    \"tests/cli/test_common.py::test_get_name_prefix_from_env_file_with_both\": 0.002191465227019397,\n    \"tests/cli/test_common.py::test_get_name_prefix_from_env_file_with_only_name\": 0.0026339924578059897,\n    \"tests/cli/test_common.py::test_get_name_prefix_from_env_file_with_only_prefix\": 0.0020310588138976516,\n    \"tests/cli/test_common.py::test_is_active_prefix[-False]\": 0.01297377781375857,\n    \"tests/cli/test_common.py::test_is_active_prefix[active_prefix-True]\": 0.0016206723484763162,\n    \"tests/cli/test_common.py::test_print_activate\": 0.0016655554393612785,\n    \"tests/cli/test_common.py::test_print_activate_no_output[CONDA_JSON]\": 0.0046915926690141605,\n    \"tests/cli/test_common.py::test_print_activate_no_output[CONDA_QUIET]\": 0.004644057792739492,\n    \"tests/cli/test_common.py::test_validate_file_exists[/home/runner/work/conda-libmamba-solver/conda-libmamba-solver/conda/tests/cli/test_common.py-True]\": 0.0010915461167242536,\n    \"tests/cli/test_common.py::test_validate_file_exists[/home/runner/work/conda/conda/tests/cli/test_common.py-True]\": 0.002114113214378876,\n    \"tests/cli/test_common.py::test_validate_file_exists[file:///home/runner/work/conda-libmamba-solver/conda-libmamba-solver/conda/tests/cli/test_common.py-True]\": 0.0009914079184507245,\n    \"tests/cli/test_common.py::test_validate_file_exists[file:///home/runner/work/conda/conda/tests/cli/test_common.py-True]\": 0.0017693773642039744,\n    \"tests/cli/test_common.py::test_validate_file_exists[file://idontexist.txt-False]\": 0.0014804633106632243,\n    \"tests/cli/test_common.py::test_validate_file_exists[http://imasession.txt-True]\": 0.0014150079263674112,\n    \"tests/cli/test_common.py::test_validate_file_exists[idontexist.txt-False]\": 0.0015833859316943088,\n    \"tests/cli/test_common.py::test_validate_subdir_config\": 0.002380379139694465,\n    \"tests/cli/test_common.py::test_validate_subdir_config_invalid_subdir\": 0.0025070790975159044,\n    \"tests/cli/test_compare.py::test_compare_fail\": 0.5470221528142001,\n    \"tests/cli/test_compare.py::test_compare_success\": 0.3962104684656505,\n    \"tests/cli/test_conda_argparse.py::test_cli_args_as_strings\": 0.04680924250500465,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.ArgumentParser-isclass]\": 0.0013990625566601017,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.BUILTIN_COMMANDS-<lambda>]\": 0.0013780635208227687,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.ExtendConstAction-isclass]\": 0.0013828298810721425,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.NullCountAction-isclass]\": 0.001349789538933461,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_output_and_prompt_options-isfunction]\": 0.001500007124165575,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_channels-isfunction]\": 0.0014751767708766283,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_create_install_update-isfunction]\": 0.001421456681749314,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_default_packages-isfunction]\": 0.0014380991788743502,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_help-isfunction]\": 0.0014157049293272177,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_json-isfunction]\": 0.0014055450247399738,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_known-isfunction]\": 0.0014073219852303144,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_networking-isfunction]\": 0.001408943435614605,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_package_install_options-isfunction]\": 0.0014180357752931851,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_prefix-isfunction]\": 0.0013904969718763448,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_prefix_to_group-isfunction]\": 0.001393147995558589,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_prune-isfunction]\": 0.0013822279095666286,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_pscheck-isfunction]\": 0.001373994489667377,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_show_channel_urls-isfunction]\": 0.0013792026566712336,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_solver-isfunction]\": 0.0013950048225033242,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_solver_mode-isfunction]\": 0.001393382911948438,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_update_modifiers-isfunction]\": 0.0013932790478557635,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_verbose-isfunction]\": 0.0013907143084756852,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_clean-isfunction]\": 0.0013746397104222022,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_compare-isfunction]\": 0.0013624487089067125,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_config-isfunction]\": 0.0013654508474993277,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_create-isfunction]\": 0.0013757529835151006,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_info-isfunction]\": 0.0014185000269627448,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_init-isfunction]\": 0.0013915507439497146,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_install-isfunction]\": 0.0013759736878381289,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_list-isfunction]\": 0.001387420446468036,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_notices-isfunction]\": 0.0013977775393254658,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_package-isfunction]\": 0.0013868180630514763,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_plugins-isfunction]\": 0.00136292045742804,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_remove-isfunction]\": 0.001360469145722367,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_rename-isfunction]\": 0.0013894906176541715,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_run-isfunction]\": 0.0013662169930599244,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_search-isfunction]\": 0.0013830870004496662,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_update-isfunction]\": 0.0013987715679566802,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.do_call-isfunction]\": 0.001409165610582675,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.escaped_sys_rc_path-<lambda>]\": 0.00141167296595584,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.escaped_user_rc_path-<lambda>]\": 0.001427422505257904,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.find_builtin_commands-isfunction]\": 0.0013965099524690257,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.generate_parser-isfunction]\": 0.0013778094335355645,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.generate_pre_parser-isfunction]\": 0.0013705896844315715,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.sys_rc_path-<lambda>]\": 0.001382725611782279,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.user_rc_path-<lambda>]\": 0.001480302918357056,\n    \"tests/cli/test_conda_argparse.py::test_parse_clobber\": 0.020787212944421207,\n    \"tests/cli/test_conda_argparse.py::test_parser_basics\": 0.01733518403590464,\n    \"tests/cli/test_conda_argparse.py::test_sorted_commands_in_error\": 0.0022535844151860074,\n    \"tests/cli/test_config.py::test_add_invalid_key\": 0.031703425014408454,\n    \"tests/cli/test_config.py::test_add_key\": 0.038099740451444195,\n    \"tests/cli/test_config.py::test_channels_add_duplicate\": 0.04140661892881793,\n    \"tests/cli/test_config.py::test_channels_add_empty\": 0.05817531705208329,\n    \"tests/cli/test_config.py::test_channels_add_empty_with_defaults\": 0.039157936804331876,\n    \"tests/cli/test_config.py::test_channels_append\": 0.05758425085261775,\n    \"tests/cli/test_config.py::test_channels_append_duplicate\": 0.039294209759297656,\n    \"tests/cli/test_config.py::test_channels_prepend\": 0.048516461762387435,\n    \"tests/cli/test_config.py::test_channels_prepend_duplicate\": 0.05893999745505817,\n    \"tests/cli/test_config.py::test_channels_remove\": 0.03598574855114801,\n    \"tests/cli/test_config.py::test_channels_remove_duplicate\": 0.05783737682491706,\n    \"tests/cli/test_config.py::test_conda_config_describe\": 0.35823358336515754,\n    \"tests/cli/test_config.py::test_conda_config_validate\": 0.1078020679897646,\n    \"tests/cli/test_config.py::test_conda_config_validate_sslverify_truststore\": 0.056262969292058006,\n    \"tests/cli/test_config.py::test_create_condarc_on_set\": 0.030357358179959146,\n    \"tests/cli/test_config.py::test_custom_multichannels_add\": 0.036898528467190245,\n    \"tests/cli/test_config.py::test_custom_multichannels_add_duplicate\": 0.03717597407583287,\n    \"tests/cli/test_config.py::test_custom_multichannels_append\": 0.03497043997611319,\n    \"tests/cli/test_config.py::test_custom_multichannels_append_duplicate\": 0.036854835848390166,\n    \"tests/cli/test_config.py::test_custom_multichannels_prepend\": 0.03580584627626287,\n    \"tests/cli/test_config.py::test_custom_multichannels_prepend_duplicate\": 0.03174999834150852,\n    \"tests/cli/test_config.py::test_get_all\": 0.046864517723136496,\n    \"tests/cli/test_config.py::test_get_all_inc_maps\": 0.04940703813354248,\n    \"tests/cli/test_config.py::test_get_boolean_value\": 0.033988769846991805,\n    \"tests/cli/test_config.py::test_get_channels_list\": 0.038716587715526496,\n    \"tests/cli/test_config.py::test_get_invalid_key\": 0.04159115039474923,\n    \"tests/cli/test_config.py::test_get_map_full\": 0.03492583688764177,\n    \"tests/cli/test_config.py::test_get_map_subkey[conda_build.cache_dir-/tmp/conda-bld]\": 0.04687232145955547,\n    \"tests/cli/test_config.py::test_get_map_subkey[proxy_servers.http-1.2.3.4:5678]\": 0.03627383567377869,\n    \"tests/cli/test_config.py::test_get_multiple_keys\": 0.04827043963605968,\n    \"tests/cli/test_config.py::test_get_multiple_keys_incl_map_full\": 0.04086730725672689,\n    \"tests/cli/test_config.py::test_get_multiple_keys_incl_map_subkey\": 0.047704310818939465,\n    \"tests/cli/test_config.py::test_get_string_value\": 0.03359282319739343,\n    \"tests/cli/test_config.py::test_get_unconfigured_key\": 0.04377833210499351,\n    \"tests/cli/test_config.py::test_invalid_yaml\": 0.051747757728049265,\n    \"tests/cli/test_config.py::test_remove_key\": 0.03167421428195741,\n    \"tests/cli/test_config.py::test_remove_key_duplicate\": 0.0566356304556434,\n    \"tests/cli/test_config.py::test_remove_unconfigured_key\": 0.03066379863157129,\n    \"tests/cli/test_config.py::test_set_and_get_bool\": 0.055760056070427604,\n    \"tests/cli/test_config.py::test_set_check_types[always_yes-false-False]\": 0.029515359863572184,\n    \"tests/cli/test_config.py::test_set_check_types[always_yes-no-False]\": 0.03774678800128103,\n    \"tests/cli/test_config.py::test_set_check_types[always_yes-true-True]\": 0.030481905838821436,\n    \"tests/cli/test_config.py::test_set_check_types[always_yes-yes-True]\": 0.0374263354104847,\n    \"tests/cli/test_config.py::test_set_check_types[channel_alias-https://repo.example.com-https://repo.example.com]\": 0.03253871198788293,\n    \"tests/cli/test_config.py::test_set_check_types[proxy_servers.http-1.2.3.4:5678-py_value5]\": 0.031992544596073605,\n    \"tests/cli/test_config.py::test_set_invalid_key\": 0.033972848134023154,\n    \"tests/cli/test_config.py::test_set_key\": 0.039279226983287285,\n    \"tests/cli/test_config.py::test_set_map_key[conda_build.cache_dir-/tmp/conda-bld-/var/tmp/build]\": 0.04171390437381087,\n    \"tests/cli/test_config.py::test_set_map_key[conda_build.error_overlinking-true-false]\": 0.0003581898763828016,\n    \"tests/cli/test_config.py::test_set_map_key[proxy_servers.http-1.2.3.4:5678-4.3.2.1:9876]\": 0.036021110669479835,\n    \"tests/cli/test_config.py::test_set_rc_without_user_rc\": 0.03223898864719802,\n    \"tests/cli/test_config.py::test_set_unconfigured_key\": 0.0373969567461184,\n    \"tests/cli/test_config.py::test_show_sorts_keys\": 0.06888233885279402,\n    \"tests/cli/test_config.py::test_ssl_verify_default\": 0.0024434813110852573,\n    \"tests/cli/test_config.py::test_ssl_verify_set_bool\": 0.028014718630012925,\n    \"tests/cli/test_config.py::test_ssl_verify_set_filename\": 0.0339030824739543,\n    \"tests/cli/test_env.py::test_conda_env_create_empty_file[classic]\": 0.04509897245240829,\n    \"tests/cli/test_env.py::test_conda_env_create_empty_file[libmamba]\": 0.026872241298299286,\n    \"tests/cli/test_env.py::test_conda_env_create_http[classic-http_test_server0]\": 1.0492101443451065,\n    \"tests/cli/test_env.py::test_conda_env_create_http[libmamba-http_test_server0]\": 1.0594016102186352,\n    \"tests/cli/test_env.py::test_conda_env_create_no_existent_file[classic]\": 0.03253215852880263,\n    \"tests/cli/test_env.py::test_conda_env_create_no_existent_file[libmamba]\": 0.028833257977780136,\n    \"tests/cli/test_env.py::test_conda_env_create_no_existent_file_with_name[classic]\": 0.06536006219150801,\n    \"tests/cli/test_env.py::test_conda_env_create_no_existent_file_with_name[libmamba]\": 0.03167862151633582,\n    \"tests/cli/test_env.py::test_conda_env_create_no_file[classic]\": 0.03156111458963271,\n    \"tests/cli/test_env.py::test_conda_env_create_no_file[libmamba]\": 0.028634880304527925,\n    \"tests/cli/test_env.py::test_create_dry_run_json[classic]\": 4.679717930706931,\n    \"tests/cli/test_env.py::test_create_dry_run_json[libmamba]\": 0.7475907833445723,\n    \"tests/cli/test_env.py::test_create_dry_run_yaml[classic]\": 5.228520651547751,\n    \"tests/cli/test_env.py::test_create_dry_run_yaml[libmamba]\": 0.9208983983185353,\n    \"tests/cli/test_env.py::test_create_unsolvable_env[classic]\": 0.25866202571078567,\n    \"tests/cli/test_env.py::test_create_unsolvable_env[libmamba]\": 0.9710175005176376,\n    \"tests/cli/test_env.py::test_create_valid_env[classic]\": 4.1288692195671075,\n    \"tests/cli/test_env.py::test_create_valid_env[libmamba]\": 1.6319111660439773,\n    \"tests/cli/test_env.py::test_create_valid_env_json_output[classic]\": 0.08706646126822314,\n    \"tests/cli/test_env.py::test_create_valid_env_json_output[libmamba]\": 0.7270401499285966,\n    \"tests/cli/test_env.py::test_create_valid_env_with_conda_and_pip_json_output[classic]\": 137.57388329238037,\n    \"tests/cli/test_env.py::test_create_valid_env_with_conda_and_pip_json_output[libmamba]\": 8.331481115876842,\n    \"tests/cli/test_env.py::test_create_valid_env_with_variables[classic]\": 0.5817753747946132,\n    \"tests/cli/test_env.py::test_create_valid_env_with_variables[libmamba]\": 1.4713510478106524,\n    \"tests/cli/test_env.py::test_env_export[classic]\": 81.68431650159577,\n    \"tests/cli/test_env.py::test_env_export[libmamba]\": 3.086066339974149,\n    \"tests/cli/test_env.py::test_env_export_json[classic]\": 9.56424349446278,\n    \"tests/cli/test_env.py::test_env_export_json[libmamba]\": 1.7546219382906443,\n    \"tests/cli/test_env.py::test_env_export_with_variables[classic]\": 78.78493919331754,\n    \"tests/cli/test_env.py::test_env_export_with_variables[libmamba]\": 2.632689304736499,\n    \"tests/cli/test_env.py::test_env_list_size[classic]\": 0.6182446737708488,\n    \"tests/cli/test_env.py::test_env_list_size[libmamba]\": 0.4913898889815707,\n    \"tests/cli/test_env.py::test_env_list_size_json[classic]\": 0.18465053821750466,\n    \"tests/cli/test_env.py::test_env_list_size_json[libmamba]\": 0.29543745688561196,\n    \"tests/cli/test_env.py::test_export_multi_channel[classic]\": 149.6543647259028,\n    \"tests/cli/test_env.py::test_export_multi_channel[libmamba]\": 14.880061625777778,\n    \"tests/cli/test_env.py::test_list[classic]\": 1.2832100827401651,\n    \"tests/cli/test_env.py::test_list[libmamba]\": 3.083470931274662,\n    \"tests/cli/test_env.py::test_list_info_envs[classic]\": 0.1273442725663899,\n    \"tests/cli/test_env.py::test_list_info_envs[libmamba]\": 0.11931017138977676,\n    \"tests/cli/test_env.py::test_name_override[classic]\": 0.6989584006420517,\n    \"tests/cli/test_env.py::test_name_override[libmamba]\": 1.307438319439482,\n    \"tests/cli/test_env.py::test_non_existent_file[classic]\": 0.02993996007688365,\n    \"tests/cli/test_env.py::test_non_existent_file[libmamba]\": 0.025195953545936355,\n    \"tests/cli/test_env.py::test_pip_error_is_propagated[classic]\": 95.30935310374204,\n    \"tests/cli/test_env.py::test_pip_error_is_propagated[libmamba]\": 6.982623012739862,\n    \"tests/cli/test_env.py::test_remove_dry_run[classic]\": 0.5867421094652988,\n    \"tests/cli/test_env.py::test_remove_dry_run[libmamba]\": 1.2404761393001054,\n    \"tests/cli/test_env.py::test_set_unset_env_vars[classic]\": 0.6605906444597119,\n    \"tests/cli/test_env.py::test_set_unset_env_vars[libmamba]\": 1.4602301262251132,\n    \"tests/cli/test_env.py::test_set_unset_env_vars_env_no_exist[classic]\": 0.04138128059926948,\n    \"tests/cli/test_env.py::test_set_unset_env_vars_env_no_exist[libmamba]\": 0.02477239843425207,\n    \"tests/cli/test_env.py::test_update[classic]\": 116.1392179708031,\n    \"tests/cli/test_env.py::test_update[libmamba]\": 2.663757672253938,\n    \"tests/cli/test_env.py::test_update_env_json_output[classic]\": 89.4387153234407,\n    \"tests/cli/test_env.py::test_update_env_json_output[libmamba]\": 1.5311843111587367,\n    \"tests/cli/test_env.py::test_update_env_no_action_json_output[classic]\": 181.69655854988812,\n    \"tests/cli/test_env.py::test_update_env_no_action_json_output[libmamba]\": 11.39661838406415,\n    \"tests/cli/test_env.py::test_update_env_only_pip_json_output[classic]\": 182.70429721468713,\n    \"tests/cli/test_env.py::test_update_env_only_pip_json_output[libmamba]\": 11.609533178189407,\n    \"tests/cli/test_find_commands.py::test_find_commands[subset0]\": 0.0003049400377409962,\n    \"tests/cli/test_find_commands.py::test_find_commands[subset1]\": 0.008535986429915333,\n    \"tests/cli/test_find_commands.py::test_find_executable[conda-bat-bat/conda-bat.bat]\": 0.00204783581474164,\n    \"tests/cli/test_find_commands.py::test_find_executable[conda-bin-bin/conda-bin]\": 0.005893993396482839,\n    \"tests/cli/test_find_commands.py::test_find_executable[conda-exe-exe/conda-exe.exe]\": 0.00029342214533177943,\n    \"tests/cli/test_helpers.py::test_argumentparser_error_handling[choices0-invalid]\": 0.002380386711795308,\n    \"tests/cli/test_helpers.py::test_argumentparser_error_handling[choices1-four]\": 0.0019592624614851468,\n    \"tests/cli/test_helpers.py::test_argumentparser_error_handling[choices2-maybe]\": 0.0018891474611782099,\n    \"tests/cli/test_helpers.py::test_argumentparser_help_integration[choices0-{red,green,blue}]\": 0.0024093473237103502,\n    \"tests/cli/test_helpers.py::test_argumentparser_help_integration[choices1-{spam,eggs,bacon,spam}]\": 0.001919786842340932,\n    \"tests/cli/test_helpers.py::test_argumentparser_help_integration[choices2-{classic,libmamba}]\": 0.001847788482731351,\n    \"tests/cli/test_helpers.py::test_argumentparser_valid_parsing[choices0-two]\": 0.0016474558097955361,\n    \"tests/cli/test_helpers.py::test_argumentparser_valid_parsing[choices1-gamma]\": 0.0017141818674340553,\n    \"tests/cli/test_helpers.py::test_argumentparser_valid_parsing[choices2-yes]\": 0.0016494977190639301,\n    \"tests/cli/test_helpers.py::test_choices_func_exception_propagation\": 0.001420251959192064,\n    \"tests/cli/test_helpers.py::test_choices_property_evaluation\": 0.0013644404915006591,\n    \"tests/cli/test_helpers.py::test_choices_setter_ignores_values\": 0.0012952367231293346,\n    \"tests/cli/test_helpers.py::test_conda_export_format_integration\": 0.0017910496549127489,\n    \"tests/cli/test_helpers.py::test_conda_integration[conda food---food-food_choices-bacon-{spam,eggs,bacon,spam}]\": 0.002152432862576502,\n    \"tests/cli/test_helpers.py::test_conda_integration[conda install---solver-solver_choices-libmamba-{classic,libmamba}]\": 0.005529344388663973,\n    \"tests/cli/test_helpers.py::test_empty_choices_behavior\": 0.001346355676498844,\n    \"tests/cli/test_helpers.py::test_invalid_choice_handling[orange]\": 0.0015503158066015065,\n    \"tests/cli/test_helpers.py::test_invalid_choice_handling[purple]\": 0.0031324357534051176,\n    \"tests/cli/test_helpers.py::test_invalid_choice_handling[yellow]\": 0.002817543489867106,\n    \"tests/cli/test_helpers.py::test_lazy_choices_action_initialization\": 0.0013799524023912495,\n    \"tests/cli/test_helpers.py::test_multiple_option_strings[option_strings0-food---food]\": 0.001519328761244242,\n    \"tests/cli/test_helpers.py::test_multiple_option_strings[option_strings1-food--f]\": 0.0015759946647263435,\n    \"tests/cli/test_helpers.py::test_multiple_option_strings[option_strings2-solver---solver]\": 0.0019470600253722356,\n    \"tests/cli/test_helpers.py::test_multiple_option_strings[option_strings3-solver--s]\": 0.0015050132527145766,\n    \"tests/cli/test_helpers.py::test_non_list_iterable_choices[iterable_choices0-set]\": 0.0014419493202896861,\n    \"tests/cli/test_helpers.py::test_non_list_iterable_choices[iterable_choices1-tuple]\": 0.0014354825762216208,\n    \"tests/cli/test_helpers.py::test_non_list_iterable_choices[iterable_choices2-iter]\": 0.001464310936814042,\n    \"tests/cli/test_helpers.py::test_valid_choice_handling[blue]\": 0.003464064145662483,\n    \"tests/cli/test_helpers.py::test_valid_choice_handling[green]\": 0.0014756554684518632,\n    \"tests/cli/test_helpers.py::test_valid_choice_handling[red]\": 0.001463755469711718,\n    \"tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[--debug]\": 0.021286955804480204,\n    \"tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[--json]\": 0.024922550794101758,\n    \"tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[--trace]\": 0.02981989634615047,\n    \"tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[-v]\": 0.022196607627104244,\n    \"tests/cli/test_main.py::test_main\": 0.023280490305334713,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[ash-expected_patterns3]\": 0.00025813470148616964,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[bash-expected_patterns1]\": 0.00026124706875501236,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[csh-expected_patterns5]\": 0.00025350051701365084,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[dash-expected_patterns4]\": 0.0002505585057913736,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[fish-expected_patterns7]\": 0.0002457781822545424,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[posix-expected_patterns2]\": 0.00025747056139689115,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[tcsh-expected_patterns6]\": 0.00025492249155168844,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[zsh-expected_patterns0]\": 0.00027796790762125864,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_no_fix_needed[cmd.exe-expected_patterns0]\": 0.0002597555739896481,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_no_fix_needed[powershell-expected_patterns1]\": 0.00024507227696842865,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_no_fix_needed[xonsh-expected_patterns2]\": 0.000261574559859939,\n    \"tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[bash-expected_patterns0]\": 0.013278112317505558,\n    \"tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[csh-expected_patterns3]\": 0.014067399470498664,\n    \"tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[fish-expected_patterns2]\": 0.004817915717430871,\n    \"tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[tcsh-expected_patterns4]\": 0.004808499525416186,\n    \"tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[xonsh-expected_patterns5]\": 0.004814736480949188,\n    \"tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[zsh-expected_patterns1]\": 0.007424170728179469,\n    \"tests/cli/test_main.py::test_main_subshell_help_exits_cleanly\": 0.02208499368692464,\n    \"tests/cli/test_main.py::test_main_subshell_no_plugins_flag\": 0.026495675366876734,\n    \"tests/cli/test_main.py::test_version_fast_path[--version]\": 0.0016703596137740678,\n    \"tests/cli/test_main.py::test_version_fast_path[-V]\": 0.0017705748531328185,\n    \"tests/cli/test_main.py::test_version_fast_path_skips_plugins[--version]\": 0.0015610048840924878,\n    \"tests/cli/test_main.py::test_version_fast_path_skips_plugins[-V]\": 0.0015735230046163195,\n    \"tests/cli/test_main_clean.py::test_clean_all[False]\": 0.30131831899567396,\n    \"tests/cli/test_main_clean.py::test_clean_all[True]\": 0.3379670599232837,\n    \"tests/cli/test_main_clean.py::test_clean_all_mock_lstat[False]\": 0.6465957779203984,\n    \"tests/cli/test_main_clean.py::test_clean_all_mock_lstat[True]\": 0.1448241087726455,\n    \"tests/cli/test_main_clean.py::test_clean_and_packages\": 0.2943381124233807,\n    \"tests/cli/test_main_clean.py::test_clean_force_pkgs_dirs\": 0.2627007599437816,\n    \"tests/cli/test_main_clean.py::test_clean_index_cache\": 0.18134094099932657,\n    \"tests/cli/test_main_clean.py::test_clean_logfiles\": 0.08306037116663964,\n    \"tests/cli/test_main_clean.py::test_clean_tarballs\": 0.2078903913004671,\n    \"tests/cli/test_main_clean.py::test_clean_tarballs_partial\": 0.027502538954247,\n    \"tests/cli/test_main_clean.py::test_clean_tempfiles\": 0.15653046323374292,\n    \"tests/cli/test_main_clean.py::test_get_size\": 0.0019512984645857945,\n    \"tests/cli/test_main_clean.py::test_get_size_None\": 0.001401259311801566,\n    \"tests/cli/test_main_clean.py::test_get_size_list\": 0.001334716774740655,\n    \"tests/cli/test_main_commands.py::test_commands\": 0.02488423833690196,\n    \"tests/cli/test_main_compare.py::test_compare\": 0.025715888607073613,\n    \"tests/cli/test_main_compare.py::test_get_packages\": 0.11037876279864595,\n    \"tests/cli/test_main_config.py::test_config_describe\": 0.05789288978722048,\n    \"tests/cli/test_main_config.py::test_config_describe_json\": 0.05796248554517608,\n    \"tests/cli/test_main_config.py::test_config_describe_plugins_yaml_format\": 0.024415077035629885,\n    \"tests/cli/test_main_config.py::test_config_env_does_not_exist\": 0.02188468789560994,\n    \"tests/cli/test_main_config.py::test_config_file_context_manager\": 0.0024388039586575143,\n    \"tests/cli/test_main_config.py::test_config_file_context_manager_exception\": 0.001794160778040677,\n    \"tests/cli/test_main_config.py::test_config_file_from_env_condarc\": 0.0030399994503438276,\n    \"tests/cli/test_main_config.py::test_config_file_from_system_condarc\": 0.00529344935147241,\n    \"tests/cli/test_main_config.py::test_config_file_from_user_condarc\": 0.008101596639518736,\n    \"tests/cli/test_main_config.py::test_config_get_key\": 0.0047658005226618675,\n    \"tests/cli/test_main_config.py::test_config_get_missing[get]\": 0.038262525957164596,\n    \"tests/cli/test_main_config.py::test_config_get_missing[key]\": 0.029098251466336374,\n    \"tests/cli/test_main_config.py::test_config_get_missing[unknown]\": 0.03548996832560876,\n    \"tests/cli/test_main_config.py::test_config_get_system[get]\": 0.03395126629486536,\n    \"tests/cli/test_main_config.py::test_config_get_system[key]\": 0.030866187651406893,\n    \"tests/cli/test_main_config.py::test_config_get_system[unknown]\": 0.02892019872717957,\n    \"tests/cli/test_main_config.py::test_config_get_user[get]\": 0.033350257638954287,\n    \"tests/cli/test_main_config.py::test_config_get_user[key]\": 0.03053120845864973,\n    \"tests/cli/test_main_config.py::test_config_get_user[unknown]\": 0.03460876996760587,\n    \"tests/cli/test_main_config.py::test_config_read_rc\": 0.0024651968289665527,\n    \"tests/cli/test_main_config.py::test_config_remove_item\": 0.0029393229362324287,\n    \"tests/cli/test_main_config.py::test_config_remove_key\": 0.0016599349582044828,\n    \"tests/cli/test_main_config.py::test_config_set_and_get_key_for_env\": 0.08473603636709837,\n    \"tests/cli/test_main_config.py::test_config_set_key\": 0.0031157194615354313,\n    \"tests/cli/test_main_config.py::test_config_set_keys\": 0.007381579875724744,\n    \"tests/cli/test_main_config.py::test_config_set_keys_aliases\": 0.11935083317797945,\n    \"tests/cli/test_main_config.py::test_config_show\": 0.041622203702224074,\n    \"tests/cli/test_main_config.py::test_config_show_errors\": 0.0412618595285597,\n    \"tests/cli/test_main_config.py::test_config_show_sources_json\": 0.025656929134618436,\n    \"tests/cli/test_main_config.py::test_config_write_rc\": 0.003007649075609768,\n    \"tests/cli/test_main_config.py::test_format_dict_mapping_items\": 0.004443118186109608,\n    \"tests/cli/test_main_config.py::test_key_exists[False]\": 0.0022733381233885092,\n    \"tests/cli/test_main_config.py::test_key_exists[True]\": 0.0023095484946462214,\n    \"tests/cli/test_main_env_imports.py::test_main_env_does_not_eagerly_import_main_export\": 0.17940874405563428,\n    \"tests/cli/test_main_export.py::test_execute_export_no_file_specified\": 0.030443175944471525,\n    \"tests/cli/test_main_export.py::test_export\": 0.0409942791174787,\n    \"tests/cli/test_main_export.py::test_export_add_channels\": 0.04128187460208976,\n    \"tests/cli/test_main_export.py::test_export_explicit_format_validation_errors\": 6.0206607352105435,\n    \"tests/cli/test_main_export.py::test_export_file_with_json_flag_behavior[environment.json-expected_result1]\": 0.0347119773340486,\n    \"tests/cli/test_main_export.py::test_export_file_with_json_flag_behavior[environment.yaml-expected_result0]\": 0.028586069281986422,\n    \"tests/cli/test_main_export.py::test_export_file_with_json_flag_behavior[explicit.txt-expected_result2]\": 0.02617494261221502,\n    \"tests/cli/test_main_export.py::test_export_format_comparison_no_builds_vs_regular\": 0.12260224752726949,\n    \"tests/cli/test_main_export.py::test_export_format_consistency\": 0.0017106798279898341,\n    \"tests/cli/test_main_export.py::test_export_format_precedence_over_json_flag[environment-yaml-expected_result0]\": 0.02753663765798278,\n    \"tests/cli/test_main_export.py::test_export_format_precedence_over_json_flag[explicit-expected_result2]\": 0.025220278283033918,\n    \"tests/cli/test_main_export.py::test_export_format_precedence_over_json_flag[yaml-expected_result1]\": 0.02808632213469835,\n    \"tests/cli/test_main_export.py::test_export_format_priority_over_extension\": 0.028466239160694354,\n    \"tests/cli/test_main_export.py::test_export_format_to_stdout[environment-json-loads]\": 0.030584772155422848,\n    \"tests/cli/test_main_export.py::test_export_format_to_stdout[environment-yaml-loads]\": 0.02974051239902069,\n    \"tests/cli/test_main_export.py::test_export_format_to_stdout[json-loads]\": 0.027523224659700335,\n    \"tests/cli/test_main_export.py::test_export_format_to_stdout[yaml-loads]\": 0.031025774946472746,\n    \"tests/cli/test_main_export.py::test_export_from_history_format\": 0.19442821432105475,\n    \"tests/cli/test_main_export.py::test_export_ignore_channels_flag[False]\": 0.476321842602096,\n    \"tests/cli/test_main_export.py::test_export_ignore_channels_flag[True]\": 0.26930431566952434,\n    \"tests/cli/test_main_export.py::test_export_invalid_platform_fails_fast\": 0.02336650778590105,\n    \"tests/cli/test_main_export.py::test_export_invalid_platform_from_condarc_fails_fast\": 0.02627645128135286,\n    \"tests/cli/test_main_export.py::test_export_invalid_subdir_fails_fast\": 0.021861296157074488,\n    \"tests/cli/test_main_export.py::test_export_json_flag_backwards_compatibility\": 0.028619331100794523,\n    \"tests/cli/test_main_export.py::test_export_json_flag_with_file_no_format_detection_error\": 0.025102696067567775,\n    \"tests/cli/test_main_export.py::test_export_multiple_platforms\": 2.175957796463912,\n    \"tests/cli/test_main_export.py::test_export_no_builds_format\": 0.06849110229425971,\n    \"tests/cli/test_main_export.py::test_export_non_pip_env_warnings\": 5.741842678933484,\n    \"tests/cli/test_main_export.py::test_export_override_channels\": 0.044362444657864375,\n    \"tests/cli/test_main_export.py::test_export_override_channels_and_ignore_channels_independence\": 1.1092778943367307,\n    \"tests/cli/test_main_export.py::test_export_override_channels_behavior\": 0.11665281392502513,\n    \"tests/cli/test_main_export.py::test_export_package_alphabetical_ordering\": 0.20954150971752894,\n    \"tests/cli/test_main_export.py::test_export_pip_dependencies_handling[environment-json-loads]\": 0.0346473793033794,\n    \"tests/cli/test_main_export.py::test_export_pip_dependencies_handling[environment-yaml-loads]\": 0.06480607329560852,\n    \"tests/cli/test_main_export.py::test_export_platform_argument\": 0.03643818173845518,\n    \"tests/cli/test_main_export.py::test_export_preserves_channels_from_installed_packages\": 0.9823653779601257,\n    \"tests/cli/test_main_export.py::test_export_regular_format_consistency\": 0.0603805812770029,\n    \"tests/cli/test_main_export.py::test_export_single_platform_different_platform\": 1.4258261657451983,\n    \"tests/cli/test_main_export.py::test_export_structured_file_extension_detection[environment.json-loads]\": 0.029502104872843573,\n    \"tests/cli/test_main_export.py::test_export_structured_file_extension_detection[environment.yaml-loads]\": 0.03457275157774369,\n    \"tests/cli/test_main_export.py::test_export_structured_file_extension_detection[environment.yml-loads]\": 0.02955102724212093,\n    \"tests/cli/test_main_export.py::test_export_text_file_extensions_fail_on_empty_environments[explicit.txt-Cannot export explicit format]\": 0.026108712139263978,\n    \"tests/cli/test_main_export.py::test_export_text_file_extensions_fail_on_empty_environments[requirements.txt-Cannot export requirements format]\": 0.02634956142035331,\n    \"tests/cli/test_main_export.py::test_export_text_file_extensions_fail_on_empty_environments[spec.txt-Cannot export requirements format]\": 0.032504491591513314,\n    \"tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[explicit-Cannot export explicit format]\": 0.025025475997659172,\n    \"tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[reqs-Cannot export requirements format]\": 0.028386695159849082,\n    \"tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[requirements-Cannot export requirements format]\": 0.024645851230534907,\n    \"tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[txt-Cannot export requirements format]\": 0.029160940939365877,\n    \"tests/cli/test_main_export.py::test_export_unknown_format_verbose\": 0.022553432622005192,\n    \"tests/cli/test_main_export.py::test_export_unrecognized_file_extension\": 0.055005567555968166,\n    \"tests/cli/test_main_export.py::test_export_unsupported_formats[toml-SystemExit]\": 0.02506338714540606,\n    \"tests/cli/test_main_export.py::test_export_unsupported_formats[unknown-SystemExit]\": 0.020924397904174438,\n    \"tests/cli/test_main_export.py::test_export_warnings[JSON format with `--format` flag]\": 5.723330870788317,\n    \"tests/cli/test_main_export.py::test_export_warnings[JSON format with `--json` flag]\": 6.234165820491725,\n    \"tests/cli/test_main_export.py::test_export_warnings[default behavior raises warning]\": 6.248769711816348,\n    \"tests/cli/test_main_export.py::test_export_warnings[suppress warning with `--json` and `--file`]\": 5.75401397337992,\n    \"tests/cli/test_main_export.py::test_export_warnings[suppress warning with `--quiet`]\": 5.7255077411923985,\n    \"tests/cli/test_main_export.py::test_export_warnings[warns with `--file` flag alone]\": 5.677288443359611,\n    \"tests/cli/test_main_export.py::test_export_with_pip_dependencies_integration[JSON---format=json-loads]\": 6.722279020407399,\n    \"tests/cli/test_main_export.py::test_export_with_pip_dependencies_integration[YAML--loads]\": 7.388841487092385,\n    \"tests/cli/test_main_info.py::test_compute_prefix_size\": 1.2346113681241906,\n    \"tests/cli/test_main_info.py::test_compute_prefix_size_empty_env\": 0.002578937865268624,\n    \"tests/cli/test_main_info.py::test_info_all\": 0.14101743941857287,\n    \"tests/cli/test_main_info.py::test_info_base\": 0.05863626231605159,\n    \"tests/cli/test_main_info.py::test_info_detail\": 0.07238617208290392,\n    \"tests/cli/test_main_info.py::test_info_envs\": 0.0512045326187908,\n    \"tests/cli/test_main_info.py::test_info_envs_frozen\": 0.031169126722350535,\n    \"tests/cli/test_main_info.py::test_info_envs_json\": 0.026437244374671147,\n    \"tests/cli/test_main_info.py::test_info_envs_size\": 0.790751621870354,\n    \"tests/cli/test_main_info.py::test_info_envs_size_json\": 0.34288065913484234,\n    \"tests/cli/test_main_info.py::test_info_json\": 0.03351563961031712,\n    \"tests/cli/test_main_info.py::test_info_size_without_envs\": 0.02339997737386987,\n    \"tests/cli/test_main_info.py::test_info_system\": 0.0769793584168995,\n    \"tests/cli/test_main_info.py::test_info_unsafe_channels\": 0.049614374072190916,\n    \"tests/cli/test_main_info.py::test_iter_info_components\": 0.0014258977482902895,\n    \"tests/cli/test_main_install.py::test_build_version_shows_as_changed\": 9.798533087500054,\n    \"tests/cli/test_main_install.py::test_conda_pip_interop_dependency_satisfied_by_pip\": 52.22621958266852,\n    \"tests/cli/test_main_install.py::test_install_freezes_env_by_default\": 1.215044799948502,\n    \"tests/cli/test_main_install.py::test_install_from_extracted_package\": 4.78551246698889,\n    \"tests/cli/test_main_install.py::test_install_revision_revert\": 2.2634690685624324,\n    \"tests/cli/test_main_install.py::test_too_many_arguments\": 0.022422503696631332,\n    \"tests/cli/test_main_list.py::test_exit_codes\": 1.8939390904732565,\n    \"tests/cli/test_main_list.py::test_explicit[--md5]\": 0.19293681045449299,\n    \"tests/cli/test_main_list.py::test_explicit[--sha256]\": 0.14513391854791535,\n    \"tests/cli/test_main_list.py::test_explicit[None]\": 0.21730576532649618,\n    \"tests/cli/test_main_list.py::test_export\": 0.20555735309480552,\n    \"tests/cli/test_main_list.py::test_fields_all\": 1.0281424458335038,\n    \"tests/cli/test_main_list.py::test_fields_dependent\": 0.45618635894552567,\n    \"tests/cli/test_main_list.py::test_fields_invalid\": 0.9455899731166598,\n    \"tests/cli/test_main_list.py::test_list\": 0.08536471920552689,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args0]\": 0.9588739571372225,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args10]\": 0.5011072303288217,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args11]\": 0.9327408457954363,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args12]\": 0.03349394392729515,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args13]\": 0.029306142603158652,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args14]\": 0.028750882167359715,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args15]\": 0.03315201270882143,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args1]\": 0.9257740210119315,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args2]\": 0.53162448089873,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args3]\": 0.9432395353225091,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args4]\": 0.03731202152977923,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args5]\": 0.028808225250929617,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args6]\": 0.036966394275316145,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args7]\": 0.032474908021460094,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args8]\": 0.977500380884719,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args9]\": 0.9584821977709018,\n    \"tests/cli/test_main_list.py::test_list_explicit\": 0.13981580087751283,\n    \"tests/cli/test_main_list.py::test_list_full_name\": 0.9461252110753718,\n    \"tests/cli/test_main_list.py::test_list_full_name_no_results\": 0.9577845647995346,\n    \"tests/cli/test_main_list.py::test_list_json\": 0.9667573795354418,\n    \"tests/cli/test_main_list.py::test_list_package\": 0.9345880253218344,\n    \"tests/cli/test_main_list.py::test_list_reverse\": 0.10437885094947377,\n    \"tests/cli/test_main_list.py::test_list_revisions\": 0.05351870460445887,\n    \"tests/cli/test_main_list.py::test_list_size\": 0.09490095121548917,\n    \"tests/cli/test_main_list.py::test_list_size_empty_paths_data\": 0.19293959419474144,\n    \"tests/cli/test_main_list.py::test_list_size_json\": 0.08796903803393358,\n    \"tests/cli/test_main_list.py::test_list_specific_version\": 0.11497211387827445,\n    \"tests/cli/test_main_list.py::test_list_with_bad_prefix_raises\": 0.025931108374018002,\n    \"tests/cli/test_main_notices.py::test_cache_names_appear_as_expected\": 0.1232964985296608,\n    \"tests/cli/test_main_notices.py::test_main_notices[200]\": 0.12952774455811975,\n    \"tests/cli/test_main_notices.py::test_main_notices[404]\": 0.12267686917765983,\n    \"tests/cli/test_main_notices.py::test_main_notices_handles_bad_expired_at_field\": 0.12261730976539867,\n    \"tests/cli/test_main_notices.py::test_main_notices_help\": 0.018372669458699708,\n    \"tests/cli/test_main_notices.py::test_main_notices_json\": 0.030837748149478792,\n    \"tests/cli/test_main_notices.py::test_main_notices_reads_from_cache\": 0.1241304676946902,\n    \"tests/cli/test_main_notices.py::test_main_notices_reads_from_expired_cache\": 0.12378240961103269,\n    \"tests/cli/test_main_notices.py::test_notices_appear_once_when_running_decorated_commands\": 0.7208561376453325,\n    \"tests/cli/test_main_notices.py::test_notices_cannot_read_cache_files\": 0.1306070184725078,\n    \"tests/cli/test_main_notices.py::test_notices_does_not_interrupt_command_on_failure\": 0.5433928999448978,\n    \"tests/cli/test_main_notices.py::test_notices_shown_after_previous_command_error\": 1.1913453445405098,\n    \"tests/cli/test_main_notices.py::test_notices_work_with_s3_channel\": 0.13489221048050043,\n    \"tests/cli/test_main_remove.py::test_remove_all\": 6.079954417066627,\n    \"tests/cli/test_main_remove.py::test_remove_all_default_activation_env\": 0.025418455399874605,\n    \"tests/cli/test_main_remove.py::test_remove_all_keep_env\": 5.523530166956355,\n    \"tests/cli/test_main_remove.py::test_remove_early_existence_check\": 0.030186960687147827,\n    \"tests/cli/test_main_remove.py::test_remove_globbed_package_names[classic]\": 25.619427586483187,\n    \"tests/cli/test_main_remove.py::test_remove_globbed_package_names[libmamba]\": 1.9637700997436929,\n    \"tests/cli/test_main_remove.py::test_remove_nonexistent_env\": 0.021636169295555837,\n    \"tests/cli/test_main_rename.py::test_cannot_rename_active_env_by_name\": 1.3048744178393308,\n    \"tests/cli/test_main_rename.py::test_cannot_rename_base_env_by_name\": 0.027407877935290134,\n    \"tests/cli/test_main_rename.py::test_cannot_rename_base_env_by_path\": 0.02321794422585726,\n    \"tests/cli/test_main_rename.py::test_cannot_rename_nonexistent_env\": 0.03104000995882546,\n    \"tests/cli/test_main_rename.py::test_protected_dirs_error_for_rename\": 1.280402701890012,\n    \"tests/cli/test_main_rename.py::test_rename_by_name_name_already_exists_error\": 1.3543621776206747,\n    \"tests/cli/test_main_rename.py::test_rename_by_name_success\": 1.6557903976943502,\n    \"tests/cli/test_main_rename.py::test_rename_by_path_path_already_exists_error\": 1.2971138627783136,\n    \"tests/cli/test_main_rename.py::test_rename_by_path_success\": 1.5995605122763408,\n    \"tests/cli/test_main_rename.py::test_rename_default_activation_env\": 0.02660800473672728,\n    \"tests/cli/test_main_rename.py::test_rename_with_dry_run\": 1.2872884293761224,\n    \"tests/cli/test_main_rename.py::test_rename_with_force\": 2.863917333477514,\n    \"tests/cli/test_main_rename.py::test_rename_with_force_and_dry_run\": 1.3040634029834461,\n    \"tests/cli/test_main_rename.py::test_rename_with_force_with_errors\": 2.627509072478873,\n    \"tests/cli/test_main_rename.py::test_rename_with_force_with_errors_prefix\": 0.07360145248726038,\n    \"tests/cli/test_main_rename.py::test_separator_chars_on_win\": 0.0002966515320919665,\n    \"tests/cli/test_main_run.py::test_conda_run_nonexistent_prefix\": 0.024720023309422672,\n    \"tests/cli/test_main_run.py::test_conda_run_prefix_not_a_conda_env\": 0.02442049314626486,\n    \"tests/cli/test_main_run.py::test_multiline_run_command\": 1.1335992541924909,\n    \"tests/cli/test_main_run.py::test_no_newline_in_output[stderr]\": 5.833814503381338,\n    \"tests/cli/test_main_run.py::test_no_newline_in_output[stdout]\": 5.720604528768629,\n    \"tests/cli/test_main_run.py::test_run_deactivates_environment_unix\": 0.0035452037369706067,\n    \"tests/cli/test_main_run.py::test_run_deactivates_environment_windows\": 0.00027796785374116555,\n    \"tests/cli/test_main_run.py::test_run_executes_deactivation_scripts[unix]\": 1.0412998306852725,\n    \"tests/cli/test_main_run.py::test_run_executes_deactivation_scripts[windows]\": 0.00026611058900739685,\n    \"tests/cli/test_main_run.py::test_run_preserves_exit_code_despite_deactivation_failure[unix]\": 1.0483718708852947,\n    \"tests/cli/test_main_run.py::test_run_preserves_exit_code_despite_deactivation_failure[windows]\": 0.00027812761206646004,\n    \"tests/cli/test_main_run.py::test_run_preserves_exit_code_with_deactivation[unix]\": 0.00025998515658891025,\n    \"tests/cli/test_main_run.py::test_run_preserves_exit_code_with_deactivation[windows]\": 1.0613227871256146,\n    \"tests/cli/test_main_run.py::test_run_readonly_env\": 1.0497993360146438,\n    \"tests/cli/test_main_run.py::test_run_returns_int\": 1.0376873528060893,\n    \"tests/cli/test_main_run.py::test_run_returns_nonzero_errorlevel\": 1.0348823616309357,\n    \"tests/cli/test_main_run.py::test_run_returns_zero_errorlevel\": 1.0505275972332901,\n    \"tests/cli/test_main_run.py::test_run_uncaptured[--no-capture-output]\": 1.0464206136001921,\n    \"tests/cli/test_main_run.py::test_run_uncaptured[-s]\": 1.046812836910578,\n    \"tests/cli/test_main_run.py::test_run_with_empty_command_will_raise\": 0.02444229027383936,\n    \"tests/cli/test_main_run.py::test_run_with_separator[combined option]\": 1.0966890947460797,\n    \"tests/cli/test_main_run.py::test_run_with_separator[double dash option]\": 1.1038235688196811,\n    \"tests/cli/test_main_run.py::test_run_with_separator[multiple args]\": 1.106991625796728,\n    \"tests/cli/test_main_run.py::test_run_with_separator[multiple separators]\": 1.0912663088811112,\n    \"tests/cli/test_main_run.py::test_run_with_separator[no known args]\": 1.107345112323326,\n    \"tests/cli/test_main_run.py::test_run_with_separator[no separator]\": 1.098114237012359,\n    \"tests/cli/test_main_run.py::test_run_with_separator[separator not first]\": 1.0984976404319762,\n    \"tests/cli/test_main_run.py::test_run_with_separator[vvv passthrough with --]\": 1.1066127884465236,\n    \"tests/cli/test_main_run.py::test_run_with_separator[vvv passthrough]\": 1.1067676611333988,\n    \"tests/cli/test_main_search.py::test_anaconda_token_with_private_package\": 9.075599963758043,\n    \"tests/cli/test_main_search.py::test_bad_anaconda_token\": 0.8021411003858766,\n    \"tests/cli/test_main_search.py::test_current_platform_package_missing\": 0.04912032956621057,\n    \"tests/cli/test_main_search.py::test_different_platform_package_found\": 0.038920068403506286,\n    \"tests/cli/test_main_search.py::test_mocked_platform_package_found\": 0.05521770280716678,\n    \"tests/cli/test_main_search.py::test_pretty_record\": 0.005294809960961728,\n    \"tests/cli/test_main_search.py::test_rpy_search[linux-32]\": 3.8559293861945343,\n    \"tests/cli/test_main_search.py::test_rpy_search[linux-64]\": 9.056217385345024,\n    \"tests/cli/test_main_search.py::test_rpy_search[osx-64]\": 6.515931528177713,\n    \"tests/cli/test_main_search.py::test_rpy_search[win-32]\": 3.2762175060187135,\n    \"tests/cli/test_main_search.py::test_rpy_search[win-64]\": 9.238610025722338,\n    \"tests/cli/test_main_search.py::test_search_0\": 3.1971127355617837,\n    \"tests/cli/test_main_search.py::test_search_1\": 0.2616452428284551,\n    \"tests/cli/test_main_search.py::test_search_2[exact]\": 0.7577833089242066,\n    \"tests/cli/test_main_search.py::test_search_2[wildcard]\": 3.160494598195495,\n    \"tests/cli/test_main_search.py::test_search_3\": 0.5570498857459616,\n    \"tests/cli/test_main_search.py::test_search_4\": 0.04133902334905705,\n    \"tests/cli/test_main_search.py::test_search_5\": 0.6950713675855688,\n    \"tests/cli/test_main_search.py::test_search_envs\": 0.18097662377520274,\n    \"tests/cli/test_main_search.py::test_search_envs_info\": 0.15903781359595595,\n    \"tests/cli/test_main_search.py::test_search_envs_json\": 0.0438905507063884,\n    \"tests/cli/test_main_search.py::test_search_envs_nonexistent\": 0.3663164662101128,\n    \"tests/cli/test_main_search.py::test_search_envs_nonexistent_info\": 0.30240769376367954,\n    \"tests/cli/test_main_search.py::test_search_envs_nonexistent_json\": 0.08173593800095393,\n    \"tests/cli/test_main_search.py::test_search_inflexible\": 0.5336191963866287,\n    \"tests/cli/test_main_search.py::test_unknown_platform_package_missing\": 0.05766467616992172,\n    \"tests/cli/test_main_update.py::test_dont_update_explicit_packages\": 0.0797284735555102,\n    \"tests/cli/test_main_update.py::test_dont_update_packages_with_version_constraints\": 0.028020813604477043,\n    \"tests/cli/test_main_update.py::test_update\": 11.111177925288306,\n    \"tests/cli/test_startup_benchmarks.py::test_context_init\": 0.003247680674011742,\n    \"tests/cli/test_startup_benchmarks.py::test_generate_parser\": 0.018439682534633704,\n    \"tests/cli/test_startup_benchmarks.py::test_import_cli_main\": 0.09550218106063485,\n    \"tests/cli/test_startup_benchmarks.py::test_import_conda_argparse\": 0.2111325769249489,\n    \"tests/cli/test_startup_benchmarks.py::test_import_context\": 0.1146677361924753,\n    \"tests/cli/test_startup_benchmarks.py::test_module_count_budget[full_startup]\": 0.19895484380493958,\n    \"tests/cli/test_startup_benchmarks.py::test_module_count_budget[generate_parser]\": 0.3946132853100143,\n    \"tests/cli/test_startup_benchmarks.py::test_module_count_budget[import_argparse]\": 0.3257085231229022,\n    \"tests/cli/test_startup_benchmarks.py::test_module_count_budget[import_context]\": 0.2120875854484185,\n    \"tests/cli/test_startup_benchmarks.py::test_module_count_budget[import_main]\": 0.18282523689480576,\n    \"tests/cli/test_startup_benchmarks.py::test_version_main\": 0.001253856637251245,\n    \"tests/cli/test_subcommands.py::test_clean[classic]\": 8.516386247115449,\n    \"tests/cli/test_subcommands.py::test_clean[libmamba]\": 4.914233228200058,\n    \"tests/cli/test_subcommands.py::test_compare[classic]\": 0.04429706460924121,\n    \"tests/cli/test_subcommands.py::test_compare[libmamba]\": 0.033399939667623134,\n    \"tests/cli/test_subcommands.py::test_config[classic]\": 0.036781984301016916,\n    \"tests/cli/test_subcommands.py::test_config[libmamba]\": 0.027717656872862213,\n    \"tests/cli/test_subcommands.py::test_create[classic]\": 0.6350854888613204,\n    \"tests/cli/test_subcommands.py::test_create[libmamba]\": 2.4980121145944203,\n    \"tests/cli/test_subcommands.py::test_doctor[classic]\": 1.7321000278278138,\n    \"tests/cli/test_subcommands.py::test_doctor[libmamba]\": 1.7299327156525972,\n    \"tests/cli/test_subcommands.py::test_env_config_vars[classic]\": 0.09917672568629202,\n    \"tests/cli/test_subcommands.py::test_env_config_vars[libmamba]\": 0.09032159400502557,\n    \"tests/cli/test_subcommands.py::test_env_create[libmamba]\": 1.6857877008954472,\n    \"tests/cli/test_subcommands.py::test_env_export[classic]\": 0.060069189134308865,\n    \"tests/cli/test_subcommands.py::test_env_export[libmamba]\": 0.04612151224536438,\n    \"tests/cli/test_subcommands.py::test_env_list[classic]\": 0.09372017478281526,\n    \"tests/cli/test_subcommands.py::test_env_list[libmamba]\": 0.12694904920255817,\n    \"tests/cli/test_subcommands.py::test_env_list_benchmark[libmamba]\": 0.039314913503511247,\n    \"tests/cli/test_subcommands.py::test_env_remove[classic]\": 0.08150357073298589,\n    \"tests/cli/test_subcommands.py::test_env_remove[libmamba]\": 0.0743540456628117,\n    \"tests/cli/test_subcommands.py::test_env_update[libmamba]\": 2.225769472910409,\n    \"tests/cli/test_subcommands.py::test_info[classic]\": 0.05794803328095419,\n    \"tests/cli/test_subcommands.py::test_info[libmamba]\": 0.03590035949743306,\n    \"tests/cli/test_subcommands.py::test_info_json[classic]\": 0.09122441383450972,\n    \"tests/cli/test_subcommands.py::test_info_json[libmamba]\": 0.06417344543932553,\n    \"tests/cli/test_subcommands.py::test_init[classic]\": 0.057597371140535675,\n    \"tests/cli/test_subcommands.py::test_init[libmamba]\": 0.0459734140642997,\n    \"tests/cli/test_subcommands.py::test_install[libmamba]\": 0.9653339288482745,\n    \"tests/cli/test_subcommands.py::test_list[libmamba]\": 1.38821701289212,\n    \"tests/cli/test_subcommands.py::test_notices[classic]\": 0.15291492168843987,\n    \"tests/cli/test_subcommands.py::test_notices[libmamba]\": 0.16839177828900379,\n    \"tests/cli/test_subcommands.py::test_package[classic]\": 0.03830247861013124,\n    \"tests/cli/test_subcommands.py::test_package[libmamba]\": 0.04833084518130471,\n    \"tests/cli/test_subcommands.py::test_remove[classic-remove]\": 0.08180690194073581,\n    \"tests/cli/test_subcommands.py::test_remove[classic-uninstall]\": 0.08335219542849559,\n    \"tests/cli/test_subcommands.py::test_remove[libmamba-remove]\": 0.08429164633476131,\n    \"tests/cli/test_subcommands.py::test_remove[libmamba-uninstall]\": 0.07390516080174997,\n    \"tests/cli/test_subcommands.py::test_remove_all_json[classic-remove]\": 4.223793883396462,\n    \"tests/cli/test_subcommands.py::test_remove_all_json[classic-uninstall]\": 0.3900874947639851,\n    \"tests/cli/test_subcommands.py::test_remove_all_json[libmamba-remove]\": 1.185660247816561,\n    \"tests/cli/test_subcommands.py::test_remove_all_json[libmamba-uninstall]\": 1.1775345592999864,\n    \"tests/cli/test_subcommands.py::test_rename[classic]\": 0.4118709291670224,\n    \"tests/cli/test_subcommands.py::test_rename[libmamba]\": 0.3772800138201831,\n    \"tests/cli/test_subcommands.py::test_run[libmamba]\": 1.6646085119716132,\n    \"tests/cli/test_subcommands.py::test_search[classic]\": 0.1395247088788198,\n    \"tests/cli/test_subcommands.py::test_search[libmamba]\": 4.2347980349935,\n    \"tests/cli/test_subcommands.py::test_update[libmamba-update]\": 1.61061664216605,\n    \"tests/cli/test_subcommands.py::test_update[libmamba-upgrade]\": 1.5941650922849275,\n    \"tests/common/_os/test_windows.py::test_is_admin_on_windows\": 0.0022793063305669645,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-None]\": 0.00024884887647068723,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC mount [trailing]]\": 0.00024265097060612614,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC mount]\": 0.0002467027533941657,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC path [extra]]\": 0.00025348397904112203,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC path]\": 0.00023915459437412226,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-bare UNC mount]\": 0.00026384634752976764,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-drive [trailing]]\": 0.0002864577611992765,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-drive]\": 0.00027266680088125874,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-empty string]\": 0.0002478775591949129,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-empty tuple]\": 0.00025138413517125034,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-list[path]]\": 0.0003629646264365705,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-normal path [extra]]\": 0.00024284291067101825,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-normal path [trailing]]\": 0.00024832505024630677,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-normal path]\": 0.00028715516866012155,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-path;...]\": 0.0006664620773926018,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-relative [extra]]\": 0.0002749851411967072,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-relative]\": 0.0002450738696231105,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root [leading, trailing]]\": 0.00024386828945948237,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root [leading]]\": 0.00023749498040251404,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [extra]]\": 0.00025314022286231097,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [leading, trailing]]\": 0.00023982039029572875,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [leading]]\": 0.0002571598560736837,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [trailing]]\": 0.0002491802213637075,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path0]\": 0.00024376991998075633,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path1]\": 0.0002505567741401385,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root]\": 0.0002482372798927184,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-tuple[path, ...]]\": 0.00024227171870805546,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-None]\": 0.00023901447175588754,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC mount [trailing]]\": 0.000241281775217931,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC mount]\": 0.00023666421858564664,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC path [extra]]\": 0.0002372309993223697,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC path]\": 0.00025129690092095576,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-bare UNC mount]\": 0.0002418599835446754,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-drive [trailing]]\": 0.00027770993199515993,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-drive]\": 0.00023936482826061563,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-empty string]\": 0.00024094861043703398,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-empty tuple]\": 0.0002501686428581329,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-list[path]]\": 0.00023736437561562698,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-normal path [extra]]\": 0.0003653736554284674,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-normal path [trailing]]\": 0.00023945036575949473,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-normal path]\": 0.00024412524566962411,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-path;...]\": 0.00024061661847598695,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-relative [extra]]\": 0.00023628714939969323,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-relative]\": 0.0002736082136599114,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root [leading, trailing]]\": 0.0002901439363076032,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root [leading]]\": 0.0003655812128596474,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [extra]]\": 0.0002453608675662109,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [leading, trailing]]\": 0.0002599398985902837,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [leading]]\": 0.00027818197591432603,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [trailing]]\": 0.00023892337432005294,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path0]\": 0.0002587674605752064,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path1]\": 0.00024520316762937733,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root]\": 0.0002478953035952793,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-tuple[path, ...]]\": 0.00024099692477838331,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-None]\": 0.0002731072230334455,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-empty string]\": 0.00026702577051357693,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-empty tuple]\": 0.00025783902355810354,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-list[path]]\": 0.0002492989285972597,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-path;...]\": 0.00024631401632407043,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-path]\": 0.00025184639826911627,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-tuple[path, ...]]\": 0.00024964757016326434,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[fallback-None]\": 0.000748234388264523,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[fallback-empty string]\": 0.00024420059439402665,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[fallback-empty tuple]\": 0.0002552744334900409,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[fallback-list[path]]\": 0.000253174424256914,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[fallback-path;...]\": 0.0002795573516788551,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[fallback-path]\": 0.0002470723088257892,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[fallback-tuple[path, ...]]\": 0.00032437600237666703,\n    \"tests/common/pkg_formats/test_python.py::test_basepydist_load_requires_provides_file\": 0.0013619275799607211,\n    \"tests/common/pkg_formats/test_python.py::test_basepydist_parse_entries_file_data\": 0.0018811545453128087,\n    \"tests/common/pkg_formats/test_python.py::test_basepydist_parse_requires_file_data\": 0.0016435103601802076,\n    \"tests/common/pkg_formats/test_python.py::test_dist_get_paths\": 0.001369426307171277,\n    \"tests/common/pkg_formats/test_python.py::test_dist_get_paths_no_paths\": 0.0011914153747126781,\n    \"tests/common/pkg_formats/test_python.py::test_evaluate_marker\": 0.0016633946295589142,\n    \"tests/common/pkg_formats/test_python.py::test_get_default_marker_context\": 0.0011212666916657103,\n    \"tests/common/pkg_formats/test_python.py::test_get_dist_file_from_egg_link\": 0.002445404001322574,\n    \"tests/common/pkg_formats/test_python.py::test_get_dist_requirements\": 0.0018698427632182885,\n    \"tests/common/pkg_formats/test_python.py::test_get_entry_points\": 0.0019396249698000493,\n    \"tests/common/pkg_formats/test_python.py::test_get_extra_provides\": 0.001506586871358521,\n    \"tests/common/pkg_formats/test_python.py::test_get_python_distribution_info\": 0.0002591171836619002,\n    \"tests/common/pkg_formats/test_python.py::test_get_site_packages_anchor_files\": 0.001662807282988134,\n    \"tests/common/pkg_formats/test_python.py::test_metadata[path0-False-False-False-False]\": 0.0016630786281895543,\n    \"tests/common/pkg_formats/test_python.py::test_metadata[path1-True-False-False-False]\": 0.0017036737967910953,\n    \"tests/common/pkg_formats/test_python.py::test_metadata[path2-True-True-True-False]\": 0.0017036909839398759,\n    \"tests/common/pkg_formats/test_python.py::test_metadata[path3-True-True-True-True]\": 0.0016385672631520174,\n    \"tests/common/pkg_formats/test_python.py::test_metadata_keys\": 0.0010197770473445642,\n    \"tests/common/pkg_formats/test_python.py::test_metadata_none\": 0.0010489241370516859,\n    \"tests/common/pkg_formats/test_python.py::test_metadata_process_path\": 0.0017240893054713542,\n    \"tests/common/pkg_formats/test_python.py::test_metadata_read_metadata\": 0.001592991876382735,\n    \"tests/common/pkg_formats/test_python.py::test_norm_package_name\": 0.0012316084568777955,\n    \"tests/common/pkg_formats/test_python.py::test_norm_package_version\": 0.004621832897525509,\n    \"tests/common/pkg_formats/test_python.py::test_parse_specification\": 0.0025364941514476294,\n    \"tests/common/pkg_formats/test_python.py::test_pydist_check_files\": 0.0016863028854404772,\n    \"tests/common/pkg_formats/test_python.py::test_pypi_name_to_conda_name\": 0.0062032626196853275,\n    \"tests/common/pkg_formats/test_python.py::test_python_dist_egg_fpath\": 0.0012688556733383473,\n    \"tests/common/pkg_formats/test_python.py::test_python_dist_egg_path\": 0.001309572684441601,\n    \"tests/common/pkg_formats/test_python.py::test_python_dist_info\": 0.001507575084896992,\n    \"tests/common/pkg_formats/test_python.py::test_python_dist_info_conda_dependencies\": 0.003188509744229208,\n    \"tests/common/pkg_formats/test_python.py::test_python_dist_info_conda_dependencies_2\": 0.0013130335934204535,\n    \"tests/common/pkg_formats/test_python.py::test_python_dist_info_conda_dependencies_3\": 0.0012993654147581979,\n    \"tests/common/pkg_formats/test_python.py::test_split_spec\": 0.0021445959366700818,\n    \"tests/common/test_configuration.py::test_commented_map_parameter\": 0.0017166693263064405,\n    \"tests/common/test_configuration.py::test_config_resets\": 0.001472244785344312,\n    \"tests/common/test_configuration.py::test_cross_parameter_validation\": 0.0010171646358005388,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/$$/suffix]\": 0.0010910415012015209,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/$/suffix]\": 0.00109833013523821,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/$1/suffix]\": 0.0011057574840462171,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/$MISSING/suffix]\": 0.0011237691131759868,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/$VARIABLE/suffix]\": 0.0012498527072272994,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/${1}/suffix]\": 0.0011059432645977444,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/${MISSING}/suffix]\": 0.0011370275371730737,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/${VARIABLE}/suffix]\": 0.0011566657312205126,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/${}/suffix]\": 0.0011080529238527812,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/%%/suffix]\": 0.0011049490554881846,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/%/suffix]\": 0.0010841905266949343,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/%1%/suffix]\": 0.001090013756680482,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/%1/suffix]\": 0.0010785357225252304,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/%MISSING%/suffix]\": 0.0011088619672899207,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/%VARIABLE%/suffix]\": 0.00025562426178492856,\n    \"tests/common/test_configuration.py::test_default_values\": 0.0011847283367343927,\n    \"tests/common/test_configuration.py::test_empty_map_parameter\": 0.002638123015077455,\n    \"tests/common/test_configuration.py::test_env_var_config\": 0.001306595148360121,\n    \"tests/common/test_configuration.py::test_env_var_config_alias\": 0.0012835816661965612,\n    \"tests/common/test_configuration.py::test_env_var_config_empty_sequence\": 0.001275074466318411,\n    \"tests/common/test_configuration.py::test_env_var_config_no_split_sequence\": 0.0012978442175978309,\n    \"tests/common/test_configuration.py::test_env_var_config_split_sequence\": 0.0013178944109921654,\n    \"tests/common/test_configuration.py::test_expand_search_path\": 0.0016434991047226425,\n    \"tests/common/test_configuration.py::test_expanded_variables\": 0.00314943750919061,\n    \"tests/common/test_configuration.py::test_important_primitive_map_merges\": 0.03631010682823531,\n    \"tests/common/test_configuration.py::test_invalid_map_parameter\": 0.0010966251771698213,\n    \"tests/common/test_configuration.py::test_invalid_seq_parameter\": 0.0011543855860327492,\n    \"tests/common/test_configuration.py::test_list_merges\": 0.02852191110350834,\n    \"tests/common/test_configuration.py::test_load_raw_configs\": 0.009987359064892471,\n    \"tests/common/test_configuration.py::test_map_parameter_must_be_map\": 0.003731009244780595,\n    \"tests/common/test_configuration.py::test_nested\": 0.013031804307442591,\n    \"tests/common/test_configuration.py::test_object\": 0.005644158452233251,\n    \"tests/common/test_configuration.py::test_object_defaults_completely_empty\": 0.001438130692912824,\n    \"tests/common/test_configuration.py::test_object_defaults_partially_empty\": 0.0025632441129575735,\n    \"tests/common/test_configuration.py::test_parameter\": 0.0010512613160343887,\n    \"tests/common/test_configuration.py::test_parameter_flag\": 0.0010202914181324833,\n    \"tests/common/test_configuration.py::test_pretty_list\": 0.0013987078811640592,\n    \"tests/common/test_configuration.py::test_raise_errors\": 0.0010296768811857155,\n    \"tests/common/test_configuration.py::test_set_search_path_empty_path\": 0.0009956799857000606,\n    \"tests/common/test_configuration.py::test_set_search_path_reflects_fs_changes[dir-child-added]\": 0.00250168899986275,\n    \"tests/common/test_configuration.py::test_set_search_path_reflects_fs_changes[file-created]\": 0.0024341529182730155,\n    \"tests/common/test_configuration.py::test_set_search_path_reflects_fs_changes[file-removed]\": 0.002486154954554591,\n    \"tests/common/test_configuration.py::test_set_search_path_refreshes_on_new_path[channels_a0-channels_b0]\": 0.0028419433372061376,\n    \"tests/common/test_configuration.py::test_set_search_path_refreshes_on_new_path[channels_a1-channels_b1]\": 0.0029513288041468615,\n    \"tests/common/test_configuration.py::test_set_search_path_reloads_raw_data\": 0.0025214427390041895,\n    \"tests/common/test_configuration.py::test_set_search_path_result_is_tuple\": 0.0022292717155429835,\n    \"tests/common/test_configuration.py::test_simple_merges_and_caching\": 0.009981507867446988,\n    \"tests/common/test_configuration.py::test_unique_sequence_map_error_with_duplicates\": 0.00211556890498352,\n    \"tests/common/test_configuration.py::test_unique_sequence_map_error_with_unique_key\": 0.0020897296751838483,\n    \"tests/common/test_configuration.py::test_validate_all\": 0.008447221723083388,\n    \"tests/common/test_configuration.py::test_validation\": 0.012880907915819953,\n    \"tests/common/test_io.py::test_attach_stderr_handler\": 0.010432216735820824,\n    \"tests/common/test_io.py::test_captured\": 0.00314002568990077,\n    \"tests/common/test_io.py::test_thread_limited_executor_handles_thread_limit[ThreadLimitedThreadPoolExecutor-False]\": 0.10310455902963621,\n    \"tests/common/test_io.py::test_thread_limited_executor_handles_thread_limit[ThreadPoolExecutor-True]\": 0.0021639301629385707,\n    \"tests/common/test_json.py::test_condajsonencoder_serialises_frozendicts\": 0.001162771594146611,\n    \"tests/common/test_json.py::test_condajsonencoder_with_dumps\": 0.0010665416539533258,\n    \"tests/common/test_logic.py::test_ALL\": 6.847606735689324,\n    \"tests/common/test_logic.py::test_AMONE\": 1.1185956828753512,\n    \"tests/common/test_logic.py::test_AND\": 0.009051235878384875,\n    \"tests/common/test_logic.py::test_ANY\": 6.650455441762583,\n    \"tests/common/test_logic.py::test_ITE\": 0.30769679266598343,\n    \"tests/common/test_logic.py::test_LinearBound\": 6.298315220947145,\n    \"tests/common/test_logic.py::test_NOT\": 0.0038722315836386746,\n    \"tests/common/test_logic.py::test_OR\": 0.011959053784241253,\n    \"tests/common/test_logic.py::test_XONE\": 1.1443882209071556,\n    \"tests/common/test_logic.py::test_XOR\": 0.010699666346376232,\n    \"tests/common/test_logic.py::test_minimal_unsatisfiable_subset\": 0.004594634715332892,\n    \"tests/common/test_logic.py::test_minimize\": 0.0031201726465387484,\n    \"tests/common/test_logic.py::test_sat\": 0.0014505146007180985,\n    \"tests/common/test_path.py::test_deprecations[KNOWN_EXTENSIONS-TypeError]\": 0.0012608937723298374,\n    \"tests/common/test_path.py::test_deprecations[is_package_file-TypeError]\": 0.0012794936411034499,\n    \"tests/common/test_path.py::test_get_major_minor_version_no_dot\": 0.0010822408977508044,\n    \"tests/common/test_path.py::test_missing_pyc_files_27\": 0.0019301712543605166,\n    \"tests/common/test_path.py::test_missing_pyc_files_34\": 0.0017524043208918614,\n    \"tests/common/test_path.py::test_missing_pyc_files_35\": 0.0010645324501293658,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH0]\": 0.0002467828450153306,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH10]\": 0.0002394971069686272,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH11]\": 0.00023646710264320624,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH1]\": 0.00024103710581840264,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH2]\": 0.0002486943658786954,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH3]\": 0.00023995140775829297,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH4]\": 0.0002494109924823536,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH5]\": 0.00023279846723082653,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH6]\": 0.00023885331864420266,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH7]\": 0.00024596392367451695,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH8]\": 0.00023461146966912403,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH9]\": 0.00023967954216827639,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC0]\": 0.0002395500780274169,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC1]\": 0.00023641502979814132,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC2]\": 0.00024191295216657526,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC3]\": 0.0002435632159148956,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC4]\": 0.0002433068407327665,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC5]\": 0.00024332059868303676,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC6]\": 0.0002447978766668415,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC7]\": 0.00023921110854765223,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-cwd0]\": 0.00025984251288315417,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-cwd1]\": 0.0002522408001968971,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-cwd2]\": 0.000250227257697211,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-cwd3]\": 0.0002740746055628959,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive0]\": 0.0002427879606702559,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive10]\": 0.0002394307568273516,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive11]\": 0.0002567446705459692,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive12]\": 0.00023828971686832177,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive13]\": 0.00023559288494496265,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive14]\": 0.00023849367656402377,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive15]\": 0.0002516446322953023,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive1]\": 0.0002509869256538445,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive2]\": 0.00024020997370120678,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive3]\": 0.0002378788639722781,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive4]\": 0.00023746413788219088,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive5]\": 0.0002540918765897803,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive6]\": 0.00023346961821789486,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive7]\": 0.0002343874614617371,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive8]\": 0.00024462874220207605,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive9]\": 0.00027403957822397083,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-relative0]\": 0.00023622587076214092,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-relative1]\": 0.0002394877804234468,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-relative2]\": 0.0002416203838393566,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root0]\": 0.00024702160829893937,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root10]\": 0.0038821826542102937,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root11]\": 0.00024719229297739807,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root12]\": 0.00023914921944554355,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root13]\": 0.000251806376043041,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root14]\": 0.00023970695593950977,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root1]\": 0.00024328476463584227,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root2]\": 0.0002446849076613119,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root3]\": 0.00024813116332176867,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root4]\": 0.00023997407346132484,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root5]\": 0.0002442384400107865,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root6]\": 0.0002437212157281349,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root7]\": 0.00025551501261683466,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root8]\": 0.00024740296334489325,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root9]\": 0.0002498225478642402,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH0]\": 0.005028961751227978,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH10]\": 0.005822691231199701,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH11]\": 0.008381471925802984,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH1]\": 0.005975995391436663,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH2]\": 0.005842301783045298,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH3]\": 0.004811543619271321,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH4]\": 0.00832819103131894,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH5]\": 0.005886841201537025,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH6]\": 0.00482657490729548,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH7]\": 0.005841938621526616,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH8]\": 0.008069080671974151,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH9]\": 0.004836915941694595,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC0]\": 0.008436207170236337,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC1]\": 0.008217764647773332,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC2]\": 0.008337940098694614,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC3]\": 0.004760199745917455,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC4]\": 0.005930308305339487,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC5]\": 0.00813254477034929,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC6]\": 0.004701557446289404,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC7]\": 0.00588367018534266,\n    \"tests/common/test_path.py::test_path_conversion[fallback-cwd0]\": 0.011093642253385503,\n    \"tests/common/test_path.py::test_path_conversion[fallback-cwd1]\": 0.002488469386519537,\n    \"tests/common/test_path.py::test_path_conversion[fallback-cwd2]\": 0.0025422842322065393,\n    \"tests/common/test_path.py::test_path_conversion[fallback-cwd3]\": 0.009733447641554562,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive0]\": 0.0059100487220031285,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive10]\": 0.010459758067732434,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive11]\": 0.0070867323361993965,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive12]\": 0.007118131617588151,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive13]\": 0.006988093140155602,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive14]\": 0.010382765213913004,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive15]\": 0.007012359206953517,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive1]\": 0.005845603924724629,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive2]\": 0.007192636119829384,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive3]\": 0.007126919557599856,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive4]\": 0.010771635774948786,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive5]\": 0.005786926355355946,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive6]\": 0.005864773883206502,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive7]\": 0.005830501452055883,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive8]\": 0.00703026783400341,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive9]\": 0.0072152028644003425,\n    \"tests/common/test_path.py::test_path_conversion[fallback-relative0]\": 0.008085761676737323,\n    \"tests/common/test_path.py::test_path_conversion[fallback-relative1]\": 0.008038126254979934,\n    \"tests/common/test_path.py::test_path_conversion[fallback-relative2]\": 0.008040731661244123,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root0]\": 0.011951891425637805,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root10]\": 0.004741914080117789,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root11]\": 0.0059635703491111875,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root12]\": 0.00819367177286632,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root13]\": 0.004721163880064471,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root14]\": 0.005907491468359114,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root1]\": 0.004843297804050482,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root2]\": 0.00471514468595782,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root3]\": 0.0062154914694549515,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root4]\": 0.00841540113687171,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root5]\": 0.00467891776044009,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root6]\": 0.0046589420407410695,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root7]\": 0.005865668190357153,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root8]\": 0.008224524543622712,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root9]\": 0.004884088795702275,\n    \"tests/common/test_path.py::test_path_conversion_falsy[None]\": 0.001175794124036467,\n    \"tests/common/test_path.py::test_path_conversion_falsy[empty dict]\": 0.0011514111689393163,\n    \"tests/common/test_path.py::test_path_conversion_falsy[empty list]\": 0.0011819203568145765,\n    \"tests/common/test_path.py::test_path_conversion_falsy[empty set]\": 0.001141648361211595,\n    \"tests/common/test_path.py::test_path_conversion_falsy[empty tuple]\": 0.001165484122178521,\n    \"tests/common/test_path.py::test_path_identity\": 0.001614874181924951,\n    \"tests/common/test_path.py::test_strip_pkg_extension[/path/numpy-1.26.4-py312h8753938_0-/path/numpy-1.26.4-py312h8753938_0-None]\": 0.0012709968126013338,\n    \"tests/common/test_path.py::test_strip_pkg_extension[/path/numpy-1.26.4-py312h8753938_0.tar.bz2-/path/numpy-1.26.4-py312h8753938_0-.tar.bz2]\": 0.0012984385170681553,\n    \"tests/common/test_path.py::test_strip_pkg_extension[/path/pandas-2.2.3-py312h526ad5a_1.conda-/path/pandas-2.2.3-py312h526ad5a_1-.conda]\": 0.001250586660300439,\n    \"tests/common/test_path.py::test_strip_pkg_extension[requests-2.32.3-py313h06a4308_0.tar.bz2-requests-2.32.3-py313h06a4308_0-.tar.bz2]\": 0.0013155427287529855,\n    \"tests/common/test_path.py::test_strip_pkg_extension[zlib-1.3.1-h5f15de7_0-zlib-1.3.1-h5f15de7_0-None]\": 0.0012527316917055708,\n    \"tests/common/test_path.py::test_strip_pkg_extension[zlib-1.3.1-h5f15de7_0.conda-zlib-1.3.1-h5f15de7_0-.conda]\": 0.0012861534676042736,\n    \"tests/common/test_path.py::test_url_to_path_unix\": 0.001107236191323422,\n    \"tests/common/test_path.py::test_url_to_path_windows_local\": 0.0013180262825208148,\n    \"tests/common/test_path.py::test_url_to_path_windows_unc\": 0.0011213253199752202,\n    \"tests/common/test_path.py::test_win_path_backout\": 0.0010443791373048515,\n    \"tests/common/test_serialize.py::test_comment_round_trip\": 0.004338914064490182,\n    \"tests/common/test_serialize.py::test_deprecations[_yaml_round_trip-None]\": 0.00139549700129963,\n    \"tests/common/test_serialize.py::test_deprecations[_yaml_safe-None]\": 0.0013538882399900117,\n    \"tests/common/test_serialize.py::test_deprecations[json_dump-TypeError]\": 0.001193339144947799,\n    \"tests/common/test_serialize.py::test_deprecations[yaml_round_trip_dump-TypeError]\": 0.0012158484843292389,\n    \"tests/common/test_serialize.py::test_deprecations[yaml_round_trip_load-TypeError]\": 0.0012065219177700888,\n    \"tests/common/test_serialize.py::test_deprecations[yaml_safe_dump-TypeError]\": 0.0012234153726784615,\n    \"tests/common/test_serialize.py::test_deprecations[yaml_safe_load-TypeError]\": 0.0011882815828806747,\n    \"tests/common/test_serialize.py::test_encode_enum[value0-  - disabled\\\\n-write]\": 0.0021530434908220066,\n    \"tests/common/test_serialize.py::test_encode_enum[value1-  - warn\\\\n-write]\": 0.00147538074782714,\n    \"tests/common/test_serialize.py::test_encode_enum[value2-  - enabled\\\\n-write]\": 0.00145630744571161,\n    \"tests/common/test_serialize.py::test_encode_enum[value3-[\\\\n  \\\"disabled\\\"\\\\n]-write]\": 0.0012242091399816855,\n    \"tests/common/test_serialize.py::test_encode_enum[value4-[\\\\n  \\\"warn\\\"\\\\n]-write]\": 0.0012187284437179058,\n    \"tests/common/test_serialize.py::test_encode_enum[value5-[\\\\n  \\\"enabled\\\"\\\\n]-write]\": 0.0012553546093906486,\n    \"tests/common/test_serialize.py::test_read_write[obj0-{\\\\n  \\\"a_map\\\": {\\\\n    \\\"a_key\\\": \\\"a_value\\\"\\\\n  },\\\\n  \\\"a_seq\\\": [\\\\n    1,\\\\n    2,\\\\n    3\\\\n  ]\\\\n}-read-write0]\": 0.0021310650189946866,\n    \"tests/common/test_serialize.py::test_read_write[obj1-{\\\\n  \\\"a_map\\\": {\\\\n    \\\"field1\\\": true,\\\\n    \\\"field2\\\": \\\"yes\\\"\\\\n  },\\\\n  \\\"a_seq_1\\\": [\\\\n    1,\\\\n    2,\\\\n    3\\\\n  ],\\\\n  \\\"a_seq_2\\\": [\\\\n    1,\\\\n    {\\\\n      \\\"two\\\": 2\\\\n    },\\\\n    3\\\\n  ],\\\\n  \\\"single_bool\\\": false,\\\\n  \\\"single_str\\\": \\\"no\\\"\\\\n}-read-write1]\": 0.002217984836105258,\n    \"tests/common/test_serialize.py::test_read_write[obj2-a_seq:\\\\n  - 1\\\\n  - 2\\\\n  - 3\\\\na_map:\\\\n  a_key: a_value\\\\n-read-write]\": 0.00652428345733032,\n    \"tests/common/test_serialize.py::test_read_write[obj3-single_bool: false\\\\nsingle_str: no\\\\na_seq_1:\\\\n  - 1\\\\n  - 2\\\\n  - 3\\\\na_seq_2:\\\\n  - 1\\\\n  - two: 2\\\\n  - 3\\\\na_map:\\\\n  field1: true\\\\n  field2: yes\\\\n-read-write]\": 0.011109305097388897,\n    \"tests/common/test_toposort.py::test_cycle\": 0.0020388428386587387,\n    \"tests/common/test_toposort.py::test_cycle_best_effort\": 0.001340114296144572,\n    \"tests/common/test_toposort.py::test_degenerate\": 0.0010393964096396247,\n    \"tests/common/test_toposort.py::test_pop_key\": 0.0015967238846259135,\n    \"tests/common/test_toposort.py::test_python_is_prioritized\": 0.0010576016974435962,\n    \"tests/common/test_toposort.py::test_simple\": 0.002076775081641707,\n    \"tests/common/test_url.py::test_add_username_and_pass_to_url\": 0.001086949141298883,\n    \"tests/common/test_url.py::test_is_ip_address\": 0.003467774750786846,\n    \"tests/common/test_url.py::test_is_ipv6_address\": 0.0011095169999555928,\n    \"tests/common/test_url.py::test_is_url\": 0.0023003210202181233,\n    \"tests/common/test_url.py::test_maybe_add_auth\": 0.0032758032868657116,\n    \"tests/common/test_url.py::test_split_scheme_auth_token\": 0.0010386530194065493,\n    \"tests/common/test_url.py::test_url_obj_unparse[test_url_obj0-http://conda.io/path/to/somewhere]\": 0.001160087878649354,\n    \"tests/common/test_url.py::test_url_obj_unparse[test_url_obj1-https://user:pass@conda.io/path/to/somewhere]\": 0.0011891710317514298,\n    \"tests/common/test_url.py::test_url_obj_unparse[test_url_obj2-file:///opt/happy/path]\": 0.001164811722904094,\n    \"tests/common/test_url.py::test_url_obj_unparse[test_url_obj3-file:///path/to/something.txt]\": 0.0011297069203602683,\n    \"tests/common/test_url.py::test_url_to_s3_info\": 0.0010995540681037245,\n    \"tests/common/test_url.py::test_urlparse[192.168.1.1:8080/path/to/resource-exp_url_obj0]\": 0.0011980537772875507,\n    \"tests/common/test_url.py::test_urlparse[file:///opt/happy/path-exp_url_obj2]\": 0.001185736469761705,\n    \"tests/common/test_url.py::test_urlparse[https://conda.io/happy/path-exp_url_obj1]\": 0.0012316716004211008,\n    \"tests/common/test_url.py::test_urlparse[https://u:p@conda.io/t/x1029384756/more/path-exp_url_obj3]\": 0.0011701589460872475,\n    \"tests/core/test_envs_manager.py::test_list_all_known_prefixes_with_none_values_error\": 0.005887358057833262,\n    \"tests/core/test_envs_manager.py::test_list_all_known_prefixes_with_permission_error\": 0.009866472452791725,\n    \"tests/core/test_envs_manager.py::test_prefix_cli_flag\": 0.001984366607644347,\n    \"tests/core/test_envs_manager.py::test_register_env_directory_creation_error\": 0.0028979123936251345,\n    \"tests/core/test_envs_manager.py::test_register_unregister_location_env\": 0.006984018778873299,\n    \"tests/core/test_envs_manager.py::test_rewrite_environments_txt_file\": 0.003728579736355777,\n    \"tests/core/test_index.py::TestIndex::test_cache_entries[False]\": 0.08427672972730678,\n    \"tests/core/test_index.py::TestIndex::test_cache_entries[True]\": 0.13593945185500683,\n    \"tests/core/test_index.py::TestIndex::test_contains_invalid[False]\": 0.07654288333292814,\n    \"tests/core/test_index.py::TestIndex::test_contains_invalid[True]\": 0.12480844409458727,\n    \"tests/core/test_index.py::TestIndex::test_contains_valid[False]\": 0.07764470854735617,\n    \"tests/core/test_index.py::TestIndex::test_contains_valid[True]\": 0.12237411857330933,\n    \"tests/core/test_index.py::TestIndex::test_copy[False]\": 0.16126036150960943,\n    \"tests/core/test_index.py::TestIndex::test_copy[True]\": 0.12364995701796602,\n    \"tests/core/test_index.py::TestIndex::test_getitem_cache[False]\": 0.07677623070886275,\n    \"tests/core/test_index.py::TestIndex::test_getitem_cache[True]\": 0.12226249576199641,\n    \"tests/core/test_index.py::TestIndex::test_getitem_channel[False]\": 0.08365111044478851,\n    \"tests/core/test_index.py::TestIndex::test_getitem_channel[True]\": 0.1324437232964267,\n    \"tests/core/test_index.py::TestIndex::test_getitem_channel_invalid[False]\": 0.09004984664722251,\n    \"tests/core/test_index.py::TestIndex::test_getitem_channel_invalid[True]\": 0.12152451724230505,\n    \"tests/core/test_index.py::TestIndex::test_getitem_feature[False]\": 0.07560014427703034,\n    \"tests/core/test_index.py::TestIndex::test_getitem_feature[True]\": 0.12631622532140963,\n    \"tests/core/test_index.py::TestIndex::test_getitem_feature_non_existent[False]\": 0.07904093006734868,\n    \"tests/core/test_index.py::TestIndex::test_getitem_feature_non_existent[True]\": 0.12289447464030538,\n    \"tests/core/test_index.py::TestIndex::test_getitem_prefix[False]\": 0.07811727760121367,\n    \"tests/core/test_index.py::TestIndex::test_getitem_prefix[True]\": 0.17984356901313048,\n    \"tests/core/test_index.py::TestIndex::test_getitem_system_package_invalid[False]\": 0.08408512707418599,\n    \"tests/core/test_index.py::TestIndex::test_getitem_system_package_invalid[True]\": 0.12395446134005829,\n    \"tests/core/test_index.py::TestIndex::test_getitem_system_package_valid[False]\": 0.08118172891015968,\n    \"tests/core/test_index.py::TestIndex::test_getitem_system_package_valid[True]\": 0.12429899965060794,\n    \"tests/core/test_index.py::TestIndex::test_init_conflicting_subdirs\": 0.022046557391898865,\n    \"tests/core/test_index.py::TestIndex::test_init_prefix_data\": 0.02385168407173896,\n    \"tests/core/test_index.py::TestIndex::test_init_prefix_path\": 0.021734155361632514,\n    \"tests/core/test_index.py::TestIndex::test_init_use_local\": 0.021176702588521185,\n    \"tests/core/test_index.py::TestIndex::test_reduced_index[False]\": 0.12523643067525736,\n    \"tests/core/test_index.py::TestIndex::test_reduced_index[True]\": 0.16771999184179315,\n    \"tests/core/test_index.py::test_calculate_channel_urls\": 0.0318424189756169,\n    \"tests/core/test_index.py::test_deprecations[calculate_channel_urls-None]\": 0.022141007303050787,\n    \"tests/core/test_index.py::test_dist_str_in_index\": 0.043466549735572436,\n    \"tests/core/test_index.py::test_get_index_lazy[conda-forge-sample_packages1]\": 6.347113202533505,\n    \"tests/core/test_index.py::test_get_index_lazy[defaults-sample_packages0]\": 0.03384052119938428,\n    \"tests/core/test_index.py::test_get_index_platform[linux-64]\": 0.0712968774440801,\n    \"tests/core/test_index.py::test_get_index_platform[osx-64]\": 0.055708989431277556,\n    \"tests/core/test_index.py::test_get_index_platform[win-64]\": 0.059890909337492575,\n    \"tests/core/test_index.py::test_supplement_index_with_system\": 0.06601288155510267,\n    \"tests/core/test_index.py::test_supplement_index_with_system_archspec\": 0.02858659151285032,\n    \"tests/core/test_index.py::test_supplement_index_with_system_cuda\": 0.0583249060544735,\n    \"tests/core/test_index.py::test_supplement_index_with_system_glibc\": 0.022389999402441692,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[1.2.3.4-1.2.3.4]\": 0.16640702656105263,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[4.2-4.2]\": 0.07094869752157715,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[4.2.0-42-generic-4.2.0]\": 0.13387037503458513,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[4.2.1-4.2.1]\": 0.02588887842221901,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[5.4.89+-5.4.89]\": 0.02307001034580932,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[5.5-rc1-5.5]\": 0.022349295662819593,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[9.1.a-9.1]\": 0.02402029636597118,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[9.1.a.2-9.1]\": 0.02246583227706219,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[9.a.1-0]\": 0.022569576999914985,\n    \"tests/core/test_index.py::test_supplement_index_with_system_osx\": 0.0002697956601060261,\n    \"tests/core/test_initialize.py::test__get_python_info\": 0.003777291994494121,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_handle_double_semicolons]\": 0.005653061429216117,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_handle_leading_trailing_semicolons]\": 0.00568129620379955,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_to_empty_path]\": 0.006515387794383853,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_to_existing_path_without_condabin]\": 0.006371392122555119,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_when_condabin_exists_case_insensitive]\": 0.006007910511560375,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_when_condabin_exists_case_sensitive]\": 0.010748859641547667,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_when_condabin_exists_later_in_path]\": 0.005403978687164071,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[dry_run_add]\": 0.0056644551494338885,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[dry_run_remove]\": 0.005838037447788106,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_handle_double_semicolons]\": 0.005598645969380118,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_handle_leading_trailing_semicolons]\": 0.0057455983429457414,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_does_not_exist]\": 0.00564257378603824,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_at_beginning]\": 0.005618932012526421,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_at_end]\": 0.005766025878412857,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_case_insensitive]\": 0.005672568441540328,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_in_middle]\": 0.006230771414230946,\n    \"tests/core/test_initialize.py::test_conda_init_dry_run\": 0.0299227158020043,\n    \"tests/core/test_initialize.py::test_get_python_info\": 0.005688945071636156,\n    \"tests/core/test_initialize.py::test_init_all\": 0.23378676218713382,\n    \"tests/core/test_initialize.py::test_init_cmd_exe_registry\": 0.0002828220818746247,\n    \"tests/core/test_initialize.py::test_init_condabin[init_fish_user]\": 0.003995283758302082,\n    \"tests/core/test_initialize.py::test_init_condabin[init_powershell_user]\": 0.0024762164664460483,\n    \"tests/core/test_initialize.py::test_init_condabin[init_sh_system]\": 0.0026838532894069584,\n    \"tests/core/test_initialize.py::test_init_condabin[init_sh_user]\": 0.0030472414498477875,\n    \"tests/core/test_initialize.py::test_init_condabin[init_xonsh_user]\": 0.002841547194581569,\n    \"tests/core/test_initialize.py::test_init_enable_long_path\": 0.0002726539671539158,\n    \"tests/core/test_initialize.py::test_init_sh_system\": 0.047324860678674585,\n    \"tests/core/test_initialize.py::test_init_sh_user_tcsh_unix\": 0.047302786808613634,\n    \"tests/core/test_initialize.py::test_init_sh_user_unix\": 0.04991506232554658,\n    \"tests/core/test_initialize.py::test_init_sh_user_windows\": 0.0002771201561491995,\n    \"tests/core/test_initialize.py::test_initialize_dev_bash\": 0.062290735184649386,\n    \"tests/core/test_initialize.py::test_initialize_dev_cmd_exe\": 0.058972437327281954,\n    \"tests/core/test_initialize.py::test_install_1\": 0.05150812026358905,\n    \"tests/core/test_initialize.py::test_install_conda_csh\": 0.047015378708083054,\n    \"tests/core/test_initialize.py::test_install_conda_fish\": 0.04716006465769168,\n    \"tests/core/test_initialize.py::test_install_conda_sh\": 0.04866767152586647,\n    \"tests/core/test_initialize.py::test_install_conda_xsh\": 0.047427171348563855,\n    \"tests/core/test_initialize.py::test_install_condabin_conda_bat\": 0.04658225281557674,\n    \"tests/core/test_initialize.py::test_make_entry_point\": 0.0496508538779064,\n    \"tests/core/test_initialize.py::test_make_entry_point_exe\": 0.0025060225183341227,\n    \"tests/core/test_initialize.py::test_make_initialize_plan_bash_zsh\": 0.0493989534360131,\n    \"tests/core/test_initialize.py::test_make_initialize_plan_cmd_exe\": 0.04780593243836438,\n    \"tests/core/test_initialize.py::test_make_install_plan\": 0.002367094428325719,\n    \"tests/core/test_initialize.py::test_print_plan_results_dry_run_with_changes\": 0.005174055024020417,\n    \"tests/core/test_initialize.py::test_print_plan_results_dry_run_with_no_changes\": 0.004980695229317781,\n    \"tests/core/test_initialize.py::test_print_plan_results_real_run_no_changes\": 0.004742315867081968,\n    \"tests/core/test_initialize.py::test_print_plan_results_real_run_with_changes\": 0.004833932212965817,\n    \"tests/core/test_link.py::test_calculate_change_report_downgrade\": 0.003993749484305657,\n    \"tests/core/test_link.py::test_calculate_change_report_revised_variant\": 0.005238625275394366,\n    \"tests/core/test_link.py::test_calculate_change_report_superseded\": 0.0018656769598249532,\n    \"tests/core/test_link.py::test_calculate_change_report_update\": 0.0019810638644914853,\n    \"tests/core/test_package_cache_data.py::test_ProgressiveFetchExtract_prefers_conda_v2_format\": 0.015732139330443668,\n    \"tests/core/test_package_cache_data.py::test_conda_pkg_in_pkg_cache_doesnt_overwrite_tar_bz2\": 0.08599327890183624,\n    \"tests/core/test_package_cache_data.py::test_cover_extract_bad_package\": 0.05078673245140128,\n    \"tests/core/test_package_cache_data.py::test_cover_fetch_not_exists\": 6.05322507702741,\n    \"tests/core/test_package_cache_data.py::test_cover_get_entry_to_link\": 0.004110668023223233,\n    \"tests/core/test_package_cache_data.py::test_cover_reverse\": 0.0012047611438490752,\n    \"tests/core/test_package_cache_data.py::test_download_filename_backward_compat_old_repodata\": 0.002661698575093458,\n    \"tests/core/test_package_cache_data.py::test_download_filename_backward_compat_tar_bz2\": 0.0017686827143172325,\n    \"tests/core/test_package_cache_data.py::test_download_filename_from_url_basename\": 0.003837696869273958,\n    \"tests/core/test_package_cache_data.py::test_instantiating_package_cache_when_both_tar_bz2_and_conda_exist\": 0.01955018760962429,\n    \"tests/core/test_package_cache_data.py::test_instantiating_package_cache_when_both_tar_bz2_and_conda_exist_read_only\": 0.05504002092282757,\n    \"tests/core/test_package_cache_data.py::test_instantiating_package_cache_when_unpacked_conda_exist\": 0.012294660789133932,\n    \"tests/core/test_package_cache_data.py::test_tar_bz2_in_cache_not_extracted\": 0.09654871243210073,\n    \"tests/core/test_package_cache_data.py::test_tar_bz2_in_pkg_cache_doesnt_overwrite_conda_pkg\": 0.09162792346021166,\n    \"tests/core/test_package_cache_data.py::test_tar_bz2_in_pkg_cache_used_instead_of_conda_pkg\": 0.027094332448026136,\n    \"tests/core/test_path_actions.py::test_CompileMultiPycAction_generic\": 0.0019365685776182387,\n    \"tests/core/test_path_actions.py::test_CompileMultiPycAction_noarch_python\": 1.0748035329793177,\n    \"tests/core/test_path_actions.py::test_CreatePythonEntryPointAction_generic\": 0.001873799315989843,\n    \"tests/core/test_path_actions.py::test_CreatePythonEntryPointAction_noarch_python\": 0.003801898808094305,\n    \"tests/core/test_path_actions.py::test_create_file_link_actions\": 0.0026386761609881937,\n    \"tests/core/test_path_actions.py::test_simple_LinkPathAction_copy\": 0.002656948734453513,\n    \"tests/core/test_path_actions.py::test_simple_LinkPathAction_directory\": 0.002000886163524567,\n    \"tests/core/test_path_actions.py::test_simple_LinkPathAction_hardlink\": 0.0027371410127039002,\n    \"tests/core/test_path_actions.py::test_simple_LinkPathAction_softlink\": 0.0033508621302734388,\n    \"tests/core/test_portability.py::test_escaped_prefix_replaced_only_shebang\": 0.0018370135939169594,\n    \"tests/core/test_portability.py::test_replace_long_shebang_spaces_in_prefix\": 0.0011021252506620996,\n    \"tests/core/test_portability.py::test_replace_long_shebang_with_truncation_escaped_space\": 0.0010680148720922584,\n    \"tests/core/test_portability.py::test_replace_long_shebang_with_truncation_python\": 0.0010810464826748578,\n    \"tests/core/test_portability.py::test_replace_normal_shebang_spaces_in_prefix_escaped_space\": 0.0010087391567825139,\n    \"tests/core/test_portability.py::test_replace_normal_shebang_spaces_in_prefix_python\": 0.001020105373955093,\n    \"tests/core/test_portability.py::test_replace_simple_shebang_no_replacement\": 0.0010555408614081397,\n    \"tests/core/test_portability.py::test_shebang_regex_matches\": 0.0010500471871304669,\n    \"tests/core/test_prefix_data.py::test_api_consistency[conda]\": 0.05319772024606215,\n    \"tests/core/test_prefix_data.py::test_api_consistency[python]\": 0.054687206376234934,\n    \"tests/core/test_prefix_data.py::test_conda_package_recognized_windows[False]\": 0.0002575006137425727,\n    \"tests/core/test_prefix_data.py::test_conda_package_recognized_windows[True]\": 0.0002791241821401367,\n    \"tests/core/test_prefix_data.py::test_corrupt_json_conda_meta_json\": 0.0027219054450912305,\n    \"tests/core/test_prefix_data.py::test_corrupt_unicode_conda_meta_json\": 0.001587979741354511,\n    \"tests/core/test_prefix_data.py::test_dot_underscore_conda_meta_json_ignored\": 0.0028778343913073035,\n    \"tests/core/test_prefix_data.py::test_empty_environment_package_methods\": 0.0024683668975633705,\n    \"tests/core/test_prefix_data.py::test_get_conda_anchor_files_and_records\": 0.001940251200082656,\n    \"tests/core/test_prefix_data.py::test_get_conda_packages_returns_sorted_list\": 0.08057304002131885,\n    \"tests/core/test_prefix_data.py::test_get_environment_env_vars\": 0.00245158141154825,\n    \"tests/core/test_prefix_data.py::test_get_packages_behavior_with_interoperability\": 6.2157266609406,\n    \"tests/core/test_prefix_data.py::test_get_python_packages_basic_functionality\": 0.06584177805590828,\n    \"tests/core/test_prefix_data.py::test_get_python_packages_with_pip_interoperability\": 0.06339442127537011,\n    \"tests/core/test_prefix_data.py::test_load_single_record_raises_on_corrupt_json[bad-json]\": 0.0020975958258053254,\n    \"tests/core/test_prefix_data.py::test_load_single_record_raises_on_corrupt_json[null-bytes-unicode-error]\": 0.002059903821086175,\n    \"tests/core/test_prefix_data.py::test_load_single_record_reads_bytes[record_data0]\": 0.0020275361815053922,\n    \"tests/core/test_prefix_data.py::test_method_consistency\": 0.055591595409072006,\n    \"tests/core/test_prefix_data.py::test_no_tokens_dumped[False]\": 0.0037655345122079302,\n    \"tests/core/test_prefix_data.py::test_no_tokens_dumped[True]\": 0.0039980426176955425,\n    \"tests/core/test_prefix_data.py::test_package_extraction_methods_types[get_conda_packages-expected_types0]\": 0.34334709219241966,\n    \"tests/core/test_prefix_data.py::test_package_extraction_methods_types[get_python_packages-expected_types1]\": 0.15699725409522303,\n    \"tests/core/test_prefix_data.py::test_package_extraction_package_counts[environment_packages0-0]\": 0.006231060944565551,\n    \"tests/core/test_prefix_data.py::test_package_extraction_package_counts[environment_packages1-1]\": 0.0797557341522702,\n    \"tests/core/test_prefix_data.py::test_package_extraction_package_counts[environment_packages2-2]\": 1.11353760792081,\n    \"tests/core/test_prefix_data.py::test_package_methods_with_mock_data\": 0.002341139785014413,\n    \"tests/core/test_prefix_data.py::test_package_methods_with_required_python_packages\": 0.0024069332922925283,\n    \"tests/core/test_prefix_data.py::test_pinned_specs_conda_meta_pinned\": 0.004250039449459969,\n    \"tests/core/test_prefix_data.py::test_pip_interop[envpy27osx]\": 0.31458332285025126,\n    \"tests/core/test_prefix_data.py::test_pip_interop[envpy27win_whl]\": 0.0002533621398144787,\n    \"tests/core/test_prefix_data.py::test_pip_interop[envpy313tosx_whl]\": 0.22380303889106437,\n    \"tests/core/test_prefix_data.py::test_pip_interop[envpy37osx_whl]\": 0.3323006259916676,\n    \"tests/core/test_prefix_data.py::test_pip_interop[envpy37win]\": 0.00026094243861458227,\n    \"tests/core/test_prefix_data.py::test_prefix_data_equality[missing-None-False]\": 0.0018771430608009333,\n    \"tests/core/test_prefix_data.py::test_prefix_data_equality[missing-missing-True]\": 0.0019421304864403466,\n    \"tests/core/test_prefix_data.py::test_prefix_data_equality[missing-{path}-False]\": 0.001913655938619566,\n    \"tests/core/test_prefix_data.py::test_prefix_data_equality[{path}-None-False]\": 0.0018383736226962812,\n    \"tests/core/test_prefix_data.py::test_prefix_data_equality[{path}-missing-False]\": 0.001911133168915345,\n    \"tests/core/test_prefix_data.py::test_prefix_data_equality[{path}-{path}-True]\": 0.0019001770785558553,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[ -True]\": 0.0025819053598343817,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[!-False]\": 0.002580244124215357,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[#-True]\": 0.002547661771226666,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[%-False]\": 0.002545953043709068,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[(-False]\": 0.0025483125965512134,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[)-False]\": 0.002513343979001191,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[--False]\": 0.002560638287866807,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[.-False]\": 0.0025739912035539292,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[0-False]\": 0.0025603236486254214,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[=-False]\": 0.0025303868990624993,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[A-False]\": 0.0026352558073911244,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[^-False]\": 0.0025319859386510107,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[_-False]\": 0.002584457958572013,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[a-False]\": 0.00270768622765554,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name_base[False-True]\": 0.0030576982421475856,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name_base[True-False]\": 0.00269632283837227,\n    \"tests/core/test_prefix_data.py::test_prefix_insertion_error\": 0.10586809892791366,\n    \"tests/core/test_prefix_data.py::test_set_unset_environment_env_vars\": 0.006824685797565244,\n    \"tests/core/test_prefix_data.py::test_set_unset_environment_env_vars_no_exist\": 0.0037650575820116065,\n    \"tests/core/test_prefix_data.py::test_timestamps\": 0.5836487221932606,\n    \"tests/core/test_prefix_data.py::test_unset_reserved_env_vars\": 0.0040542766288327965,\n    \"tests/core/test_prefix_data.py::test_warn_setting_reserved_env_vars\": 0.0031217950348499932,\n    \"tests/core/test_solve.py::test_aggressive_update_packages[classic]\": 5.463164036233992,\n    \"tests/core/test_solve.py::test_aggressive_update_packages[libmamba]\": 4.089878340603789,\n    \"tests/core/test_solve.py::test_archspec_call[classic]\": 1.604779301274601,\n    \"tests/core/test_solve.py::test_archspec_call[libmamba]\": 0.8974471082898733,\n    \"tests/core/test_solve.py::test_auto_update_conda[classic]\": 3.3591081999095507,\n    \"tests/core/test_solve.py::test_auto_update_conda[libmamba]\": 2.3613152020467085,\n    \"tests/core/test_solve.py::test_broken_install[classic]\": 4.015334328559323,\n    \"tests/core/test_solve.py::test_broken_install[libmamba]\": 0.005426304103858004,\n    \"tests/core/test_solve.py::test_channel_priority_churn_minimized[classic]\": 6.939331247590708,\n    \"tests/core/test_solve.py::test_channel_priority_churn_minimized[libmamba]\": 0.7563069573336354,\n    \"tests/core/test_solve.py::test_conda_downgrade[classic]\": 18.854351140890657,\n    \"tests/core/test_solve.py::test_conda_downgrade[libmamba]\": 2.4837167030836147,\n    \"tests/core/test_solve.py::test_cuda_1[classic]\": 0.7711176483631728,\n    \"tests/core/test_solve.py::test_cuda_1[libmamba]\": 0.630260192145664,\n    \"tests/core/test_solve.py::test_cuda_2[classic]\": 0.7916783424420836,\n    \"tests/core/test_solve.py::test_cuda_2[libmamba]\": 0.6526228048737104,\n    \"tests/core/test_solve.py::test_cuda_constrain_absent[classic]\": 0.7886511165273256,\n    \"tests/core/test_solve.py::test_cuda_constrain_absent[libmamba]\": 0.5847116565856708,\n    \"tests/core/test_solve.py::test_cuda_constrain_sat[classic]\": 0.00029987284116154387,\n    \"tests/core/test_solve.py::test_cuda_constrain_sat[libmamba]\": 0.00028312288514506414,\n    \"tests/core/test_solve.py::test_cuda_constrain_unsat[classic]\": 0.00030333177176315485,\n    \"tests/core/test_solve.py::test_cuda_constrain_unsat[libmamba]\": 0.0002732610081574025,\n    \"tests/core/test_solve.py::test_cuda_fail_1[classic]\": 0.8225207166130934,\n    \"tests/core/test_solve.py::test_cuda_fail_1[libmamba]\": 0.6044817801222215,\n    \"tests/core/test_solve.py::test_cuda_fail_2[classic]\": 0.7956436779031387,\n    \"tests/core/test_solve.py::test_cuda_fail_2[libmamba]\": 0.5852334565544951,\n    \"tests/core/test_solve.py::test_cuda_glibc_sat[classic]\": 0.7831253152497674,\n    \"tests/core/test_solve.py::test_cuda_glibc_sat[libmamba]\": 0.5740099632049732,\n    \"tests/core/test_solve.py::test_cuda_glibc_unsat_constrain[classic]\": 0.0002864067934572796,\n    \"tests/core/test_solve.py::test_cuda_glibc_unsat_constrain[libmamba]\": 0.00025214757085675844,\n    \"tests/core/test_solve.py::test_cuda_glibc_unsat_depend[classic]\": 0.00030416089499044627,\n    \"tests/core/test_solve.py::test_cuda_glibc_unsat_depend[libmamba]\": 0.00028477461085843383,\n    \"tests/core/test_solve.py::test_current_repodata_fallback[classic]\": 0.21453615263620224,\n    \"tests/core/test_solve.py::test_current_repodata_fallback[libmamba]\": 0.21291293833679864,\n    \"tests/core/test_solve.py::test_current_repodata_usage[classic]\": 0.21972373050562138,\n    \"tests/core/test_solve.py::test_current_repodata_usage[libmamba]\": 0.21642919224483903,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_conflicts[classic]\": 0.008510455245462088,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_conflicts[libmamba]\": 0.008105725836918539,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_conflicts_upperbound[classic]\": 0.008398764645732745,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_conflicts_upperbound[libmamba]\": 0.008086972615518205,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_multi_conflicts[classic]\": 0.008746178790305818,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_multi_conflicts[libmamba]\": 0.0080845263796607,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_free[classic]\": 0.008097219457431826,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_free[libmamba]\": 0.00787820157978529,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_no_upperbound[classic]\": 0.008400838431260866,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_no_upperbound[libmamba]\": 0.007953027977691717,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_upperbound_compound_depends[classic]\": 0.008315765609421454,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_upperbound_compound_depends[libmamba]\": 0.008054985701606007,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_version_star[classic]\": 0.008301891903926538,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_version_star[libmamba]\": 0.007870664809988574,\n    \"tests/core/test_solve.py::test_downgrade_python_prevented_with_sane_message[classic]\": 3.7735128460982295,\n    \"tests/core/test_solve.py::test_downgrade_python_prevented_with_sane_message[libmamba]\": 1.7788649399313883,\n    \"tests/core/test_solve.py::test_explicit_conda_downgrade[classic]\": 3.364720430965009,\n    \"tests/core/test_solve.py::test_explicit_conda_downgrade[libmamba]\": 2.3367208751826483,\n    \"tests/core/test_solve.py::test_fast_update_with_update_modifier_not_set[classic]\": 1.1479152586777204,\n    \"tests/core/test_solve.py::test_fast_update_with_update_modifier_not_set[libmamba]\": 0.7054068304530164,\n    \"tests/core/test_solve.py::test_features_solve_1[classic]\": 3.3163024726731316,\n    \"tests/core/test_solve.py::test_features_solve_1[libmamba]\": 0.2862460466879884,\n    \"tests/core/test_solve.py::test_force_reinstall_1[classic]\": 1.7668720202451222,\n    \"tests/core/test_solve.py::test_force_reinstall_1[libmamba]\": 1.590379514133121,\n    \"tests/core/test_solve.py::test_force_reinstall_2[classic]\": 0.7763146949963409,\n    \"tests/core/test_solve.py::test_force_reinstall_2[libmamba]\": 0.6019154436627064,\n    \"tests/core/test_solve.py::test_force_remove_1[classic]\": 3.8713371692519676,\n    \"tests/core/test_solve.py::test_force_remove_1[libmamba]\": 1.5806330015892402,\n    \"tests/core/test_solve.py::test_freeze_deps_1[classic]\": 21.20646073943225,\n    \"tests/core/test_solve.py::test_freeze_deps_1[libmamba]\": 2.8364110439295502,\n    \"tests/core/test_solve.py::test_globstr_matchspec_compatible[classic]\": 2.2517970592062424,\n    \"tests/core/test_solve.py::test_globstr_matchspec_compatible[libmamba]\": 1.2139638482030362,\n    \"tests/core/test_solve.py::test_globstr_matchspec_non_compatible[classic]\": 2.267189862192044,\n    \"tests/core/test_solve.py::test_globstr_matchspec_non_compatible[libmamba]\": 1.5493138262021857,\n    \"tests/core/test_solve.py::test_indirect_dep_optimized_by_version_over_package_count[classic]\": 4.175970970492058,\n    \"tests/core/test_solve.py::test_indirect_dep_optimized_by_version_over_package_count[libmamba]\": 1.2529729160526555,\n    \"tests/core/test_solve.py::test_no_channels_error[classic]\": 0.0076342495509803265,\n    \"tests/core/test_solve.py::test_no_channels_error[libmamba]\": 0.005811103336073372,\n    \"tests/core/test_solve.py::test_no_deps_1[classic]\": 3.424682703936342,\n    \"tests/core/test_solve.py::test_no_deps_1[libmamba]\": 1.727098802327369,\n    \"tests/core/test_solve.py::test_no_update_deps_1[classic]\": 3.3058815326421147,\n    \"tests/core/test_solve.py::test_no_update_deps_1[libmamba]\": 2.332363715985464,\n    \"tests/core/test_solve.py::test_only_deps_1[classic]\": 1.0690079233120566,\n    \"tests/core/test_solve.py::test_only_deps_1[libmamba]\": 0.5820044731103261,\n    \"tests/core/test_solve.py::test_only_deps_2[classic]\": 5.11845952102764,\n    \"tests/core/test_solve.py::test_only_deps_2[libmamba]\": 2.3338855697902328,\n    \"tests/core/test_solve.py::test_packages_in_solution_change_already_newest[classic]\": 0.008235313857493001,\n    \"tests/core/test_solve.py::test_packages_in_solution_change_already_newest[libmamba]\": 0.008261233962163737,\n    \"tests/core/test_solve.py::test_packages_in_solution_change_constrained[classic]\": 0.00786044777963537,\n    \"tests/core/test_solve.py::test_packages_in_solution_change_constrained[libmamba]\": 0.00794035731412624,\n    \"tests/core/test_solve.py::test_packages_in_solution_change_needs_update[classic]\": 0.008203931298026356,\n    \"tests/core/test_solve.py::test_packages_in_solution_change_needs_update[libmamba]\": 0.007707012298841572,\n    \"tests/core/test_solve.py::test_pinned_1[classic]\": 9.953524415543127,\n    \"tests/core/test_solve.py::test_pinned_1[libmamba]\": 5.7632474620547285,\n    \"tests/core/test_solve.py::test_pinned_specs_CONDA_PINNED_PACKAGES[classic]\": 0.011074638882106113,\n    \"tests/core/test_solve.py::test_pinned_specs_CONDA_PINNED_PACKAGES[libmamba]\": 0.007677597893080702,\n    \"tests/core/test_solve.py::test_pinned_specs_all[classic]\": 0.04836664619689635,\n    \"tests/core/test_solve.py::test_pinned_specs_all[libmamba]\": 0.03652936881528146,\n    \"tests/core/test_solve.py::test_pinned_specs_conda_meta_pinned[classic]\": 0.00843223730168137,\n    \"tests/core/test_solve.py::test_pinned_specs_conda_meta_pinned[libmamba]\": 0.008730221882298349,\n    \"tests/core/test_solve.py::test_pinned_specs_condarc[classic]\": 0.04746097797575776,\n    \"tests/core/test_solve.py::test_pinned_specs_condarc[libmamba]\": 0.03687819142680255,\n    \"tests/core/test_solve.py::test_priority_1[classic]\": 12.4620143209121,\n    \"tests/core/test_solve.py::test_priority_1[libmamba]\": 1.7122284643826162,\n    \"tests/core/test_solve.py::test_prune_1[classic]\": 2.0864565171694864,\n    \"tests/core/test_solve.py::test_prune_1[libmamba]\": 0.7806793787421206,\n    \"tests/core/test_solve.py::test_python2_update[classic]\": 3.016375784123932,\n    \"tests/core/test_solve.py::test_python2_update[libmamba]\": 0.828736678717794,\n    \"tests/core/test_solve.py::test_remove_with_constrained_dependencies[classic]\": 3.899461036715651,\n    \"tests/core/test_solve.py::test_remove_with_constrained_dependencies[libmamba]\": 0.4572390191414932,\n    \"tests/core/test_solve.py::test_solve_1[libmamba]\": 0.8379703755861404,\n    \"tests/core/test_solve.py::test_solve_2[classic]\": 12.115966523118757,\n    \"tests/core/test_solve.py::test_solve_2[libmamba]\": 0.005240657952375816,\n    \"tests/core/test_solve.py::test_solve_msgs_exclude_vp[classic]\": 0.778671750057053,\n    \"tests/core/test_solve.py::test_solve_msgs_exclude_vp[libmamba]\": 0.6343420423860602,\n    \"tests/core/test_solve.py::test_strict_custom_multichannel_allows_fallback_to_later_subchannel[classic]\": 0.007933428378236847,\n    \"tests/core/test_solve.py::test_strict_custom_multichannel_allows_fallback_to_later_subchannel[libmamba]\": 13.0348261068567,\n    \"tests/core/test_solve.py::test_timestamps_1[classic]\": 0.3001335064895276,\n    \"tests/core/test_solve.py::test_timestamps_1[libmamba]\": 0.2155627960055313,\n    \"tests/core/test_solve.py::test_unfreeze_when_required[classic]\": 0.6324188487986628,\n    \"tests/core/test_solve.py::test_unfreeze_when_required[libmamba]\": 0.7379986587902643,\n    \"tests/core/test_solve.py::test_update_all_1[classic]\": 3.4963629533652765,\n    \"tests/core/test_solve.py::test_update_all_1[libmamba]\": 1.7584168292459224,\n    \"tests/core/test_solve.py::test_update_deps_1[classic]\": 6.432218269755801,\n    \"tests/core/test_solve.py::test_update_deps_1[libmamba]\": 3.335858601375506,\n    \"tests/core/test_solve.py::test_update_deps_2[classic]\": 9.487464204567482,\n    \"tests/core/test_solve.py::test_update_deps_2[libmamba]\": 1.0831413203967273,\n    \"tests/core/test_solve.py::test_update_prune_1[classic]\": 2.0468445391802494,\n    \"tests/core/test_solve.py::test_update_prune_1[libmamba]\": 1.163613301126815,\n    \"tests/core/test_solve.py::test_update_prune_2[classic]\": 2.0118469692219416,\n    \"tests/core/test_solve.py::test_update_prune_2[libmamba]\": 0.5922585177706494,\n    \"tests/core/test_solve.py::test_update_prune_3[classic]\": 2.2012343845481412,\n    \"tests/core/test_solve.py::test_update_prune_3[libmamba]\": 0.5845424134954543,\n    \"tests/core/test_solve.py::test_update_prune_4[classic]\": 1.9728424780254634,\n    \"tests/core/test_solve.py::test_update_prune_4[libmamba]\": 1.1750672721514928,\n    \"tests/core/test_solve.py::test_update_prune_5[classic-False]\": 2.2476843365455785,\n    \"tests/core/test_solve.py::test_update_prune_5[classic-True]\": 1.892974246501924,\n    \"tests/core/test_solve.py::test_update_prune_5[libmamba-False]\": 1.1798250190235677,\n    \"tests/core/test_solve.py::test_update_prune_5[libmamba-True]\": 1.1490075072879211,\n    \"tests/core/test_solve.py::test_virtual_package_solver[classic]\": 0.7758248279890697,\n    \"tests/core/test_solve.py::test_virtual_package_solver[libmamba]\": 0.0052380743156958355,\n    \"tests/core/test_subdir_data.py::test_cache_fn_url_repo_anaconda_com\": 0.0010472456373333294,\n    \"tests/core/test_subdir_data.py::test_cache_fn_url_repo_continuum_io\": 0.0010992581384842999,\n    \"tests/core/test_subdir_data.py::test_get_index_no_platform_with_offline_cache\": 11.190339571457494,\n    \"tests/core/test_subdir_data.py::test_metadata_cache_clearing\": 0.008518490483622897,\n    \"tests/core/test_subdir_data.py::test_metadata_cache_works\": 3.0091003237873357,\n    \"tests/core/test_subdir_data.py::test_repodata_version_2_base_url[no-credentials]\": 0.04378858927189704,\n    \"tests/core/test_subdir_data.py::test_repodata_version_2_base_url[with-auth]\": 0.04643514567971389,\n    \"tests/core/test_subdir_data.py::test_repodata_version_2_base_url[with-token]\": 0.136602463114246,\n    \"tests/core/test_subdir_data.py::test_repodata_version_error\": 0.2812551639117334,\n    \"tests/core/test_subdir_data.py::test_search_by_packagerecord\": 0.008060681913656892,\n    \"tests/core/test_subdir_data.py::test_state_is_not_json\": 0.007575715536270585,\n    \"tests/core/test_subdir_data.py::test_subdir_data_coverage\": 0.015243548938368972,\n    \"tests/core/test_subdir_data.py::test_subdir_data_dict_state\": 0.0024643260415600486,\n    \"tests/core/test_subdir_data.py::test_subdir_data_prefers_conda_to_tar_bz2\": 0.008182183807814039,\n    \"tests/core/test_subdir_data.py::test_use_only_tar_bz2\": 0.014534707883606522,\n    \"tests/env/installers/test_conda_installer_explicit.py::test_explicit_with_user_specs\": 0.002855280906215675,\n    \"tests/env/installers/test_conda_installer_explicit.py::test_installer_installs_explicit\": 0.12542178296590706,\n    \"tests/env/installers/test_conda_installer_explicit.py::test_installer_type_checking_for_explicit\": 0.00456389657069817,\n    \"tests/env/specs/test_explicit.py::test_can_handle_explicit\": 0.0012734830902294103,\n    \"tests/env/specs/test_explicit.py::test_can_not_handle_requirements_txt\": 0.0011586865414013091,\n    \"tests/env/specs/test_explicit.py::test_environment\": 0.07846647575986768,\n    \"tests/env/specs/test_explicit.py::test_no_environment_file\": 0.0013192790594654593,\n    \"tests/env/specs/test_requirements.py::test_can_not_handle_explicit\": 0.0012570422051872468,\n    \"tests/env/specs/test_requirements.py::test_environment\": 0.0016749965656336382,\n    \"tests/env/specs/test_requirements.py::test_no_environment_file\": 0.0012130625363388672,\n    \"tests/env/specs/test_requirements.py::test_no_name\": 0.0012429248804000984,\n    \"tests/env/specs/test_requirements.py::test_req_file_and_name\": 0.0011420179462102655,\n    \"tests/env/specs/test_yaml_file.py::test_environment_file_exist[Cep24YamlFileSpec]\": 0.001956549782654835,\n    \"tests/env/specs/test_yaml_file.py::test_environment_file_exist[YamlFileSpec]\": 0.0022259152382552,\n    \"tests/env/specs/test_yaml_file.py::test_environment_file_not_yaml[Cep24YamlFileSpec-TypeError]\": 0.0014673960211891237,\n    \"tests/env/specs/test_yaml_file.py::test_environment_file_not_yaml[YamlFileSpec-PluginError]\": 0.0015121027796587672,\n    \"tests/env/specs/test_yaml_file.py::test_filename\": 0.001752209157919112,\n    \"tests/env/specs/test_yaml_file.py::test_get_environment[Cep24YamlFileSpec]\": 0.001986523770262982,\n    \"tests/env/specs/test_yaml_file.py::test_get_environment[YamlFileSpec]\": 0.0021057949165444985,\n    \"tests/env/specs/test_yaml_file.py::test_no_environment_file[Cep24YamlFileSpec]\": 0.0011258948138393905,\n    \"tests/env/specs/test_yaml_file.py::test_no_environment_file[YamlFileSpec]\": 0.0017358887969745687,\n    \"tests/env/test_create.py::test_create_advanced_pip\": 24.71964830860579,\n    \"tests/env/test_create.py::test_create_empty_env\": 2.7679694881800776,\n    \"tests/env/test_create.py::test_create_env_custom_platform\": 0.5483160607281969,\n    \"tests/env/test_create.py::test_create_env_default_packages\": 15.35827871405378,\n    \"tests/env/test_create.py::test_create_env_from_environment_yml_does_not_output_duplicate_warning\": 1.2098753560224536,\n    \"tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[cep-24-/home/runner/work/conda-libmamba-solver/conda-libmamba-solver/conda/tests/env/support/env_with_dependencies.yml]\": 6.806714372655322,\n    \"tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[cep-24-/home/runner/work/conda/conda/tests/env/support/env_with_dependencies.yml]\": 7.891193518413473,\n    \"tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[explicit-/home/runner/work/conda-libmamba-solver/conda-libmamba-solver/conda/tests/env/support/explicit.txt]\": 0.42526147106155376,\n    \"tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[explicit-/home/runner/work/conda/conda/tests/env/support/explicit.txt]\": 0.5124000686674924,\n    \"tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[requirements.txt-/home/runner/work/conda-libmamba-solver/conda-libmamba-solver/conda/tests/env/support/requirements.txt]\": 5.233998648546648,\n    \"tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[requirements.txt-/home/runner/work/conda/conda/tests/env/support/requirements.txt]\": 8.446025306834285,\n    \"tests/env/test_create.py::test_create_env_from_non_existent_plugin\": 0.034012931040143586,\n    \"tests/env/test_create.py::test_create_env_json[example/environment.yml]\": 8.53759315966844,\n    \"tests/env/test_create.py::test_create_env_json[example/environment_with_pip.yml]\": 8.659128098390426,\n    \"tests/env/test_create.py::test_create_env_no_default_packages\": 11.941304420644505,\n    \"tests/env/test_create.py::test_create_host_port\": 0.0003775466701350014,\n    \"tests/env/test_create.py::test_create_update\": 12.720530294860403,\n    \"tests/env/test_create.py::test_create_update_remote_env_file\": 9.175706621521648,\n    \"tests/env/test_create.py::test_export_and_recreate_environment[env.yml-env.yaml]\": 2.0699679646712155,\n    \"tests/env/test_create.py::test_export_and_recreate_environment[environment-yaml-env.yaml]\": 1.8486617677349768,\n    \"tests/env/test_create.py::test_export_and_recreate_environment[reqs-env.txt]\": 1.8196686930762083,\n    \"tests/env/test_create.py::test_export_and_recreate_environment[requirements-env.txt]\": 1.6627954192930594,\n    \"tests/env/test_create.py::test_fail_to_create_env_in_dir_with_colon\": 0.02337427856707321,\n    \"tests/env/test_create.py::test_protected_dirs_error_for_env_create\": 0.027887417247675787,\n    \"tests/env/test_env.py::test_add_channels\": 0.0010055958402105155,\n    \"tests/env/test_env.py::test_add_pip\": 0.002467163680671609,\n    \"tests/env/test_env.py::test_args_are_wildcarded\": 0.0010433469184142033,\n    \"tests/env/test_env.py::test_builds_spec_from_line_raw_dependency\": 0.0011442971860068682,\n    \"tests/env/test_env.py::test_can_add_dependencies_to_environment\": 0.002448911502786478,\n    \"tests/env/test_env.py::test_channels_are_provided_by_kwarg\": 0.0009973173615181255,\n    \"tests/env/test_env.py::test_channels_default_to_empty_list\": 0.001002784463698904,\n    \"tests/env/test_env.py::test_channels_validation[channels0-Invalid type for 'channels']\": 0.0013143207283274297,\n    \"tests/env/test_env.py::test_channels_validation[channels1-`channels` key must only contain strings.]\": 0.0013365792906199106,\n    \"tests/env/test_env.py::test_channels_validation[channels2-`channels` key must only contain strings.]\": 0.0012115660148396001,\n    \"tests/env/test_env.py::test_channels_validation[channels3-None]\": 0.0011431400496162427,\n    \"tests/env/test_env.py::test_create_and_update_env_with_just_vars\": 1.2227501961301361,\n    \"tests/env/test_env.py::test_creates_file_on_save\": 0.0023471166098150806,\n    \"tests/env/test_env.py::test_dependencies_are_empty_by_default\": 0.0009927289248358494,\n    \"tests/env/test_env.py::test_dependencies_update_after_adding\": 0.0018176127288234358,\n    \"tests/env/test_env.py::test_dependency_validation[dependencies0]\": 0.0011101804427005814,\n    \"tests/env/test_env.py::test_dependency_validation[dependencies1]\": 0.0010796138936282082,\n    \"tests/env/test_env.py::test_dependency_validation[dependencies2]\": 0.00109470030956803,\n    \"tests/env/test_env.py::test_dependency_validation[dependencies3]\": 0.003518799047646534,\n    \"tests/env/test_env.py::test_dependency_validation[dependencies4]\": 0.0010666251691231977,\n    \"tests/env/test_env.py::test_dependency_validation_errors[None-EnvironmentFileInvalid-Invalid type for 'dependencies', expected a list]\": 0.001484895055155662,\n    \"tests/env/test_env.py::test_dependency_validation_errors[dependencies1-CondaMultiError-Invalid spec 'nota~matchspec']\": 0.002272347312856946,\n    \"tests/env/test_env.py::test_dependency_validation_errors[dependencies2-CondaMultiError-Invalid spec 'also!!not']\": 0.0017071116805264734,\n    \"tests/env/test_env.py::test_dependency_validation_errors[dependencies3-CondaMultiError-is an invalid type]\": 0.0013617219207451964,\n    \"tests/env/test_env.py::test_dependency_validation_errors[dependencies4-EnvironmentFileInvalid-Invalid type for 'dependencies']\": 0.001388125098835194,\n    \"tests/env/test_env.py::test_empty_deps\": 0.001956157224386285,\n    \"tests/env/test_env.py::test_env_advanced_pip\": 7.197935803972998,\n    \"tests/env/test_env.py::test_environment_deprecated\": 0.0010082838240885249,\n    \"tests/env/test_env.py::test_envvars\": 0.00236590355156083,\n    \"tests/env/test_env.py::test_from_history\": 0.0024747052542163014,\n    \"tests/env/test_env.py::test_has_empty_filename_by_default\": 0.0010224533135825132,\n    \"tests/env/test_env.py::test_has_empty_name_by_default\": 0.0010094689305814389,\n    \"tests/env/test_env.py::test_has_filename_if_provided\": 0.001039690850741311,\n    \"tests/env/test_env.py::test_has_name_if_provided\": 0.0010006257786775417,\n    \"tests/env/test_env.py::test_http\": 0.08229468303697184,\n    \"tests/env/test_env.py::test_http_raises\": 0.0729565776326104,\n    \"tests/env/test_env.py::test_invalid_keys\": 0.0025460804450826925,\n    \"tests/env/test_env.py::test_name_validation[1-Invalid type for 'name']\": 0.001238095359134403,\n    \"tests/env/test_env.py::test_name_validation[name-None]\": 0.0011364434645515613,\n    \"tests/env/test_env.py::test_name_validation[name0-Invalid type for 'name']\": 0.0012738096357875176,\n    \"tests/env/test_env.py::test_other_tips_of_dependencies_are_supported\": 0.0010497494100377427,\n    \"tests/env/test_env.py::test_parses_dependencies_from_raw_file\": 0.00175608426610166,\n    \"tests/env/test_env.py::test_prefix_validation[1-Invalid type for 'prefix']\": 0.0011878043612059401,\n    \"tests/env/test_env.py::test_prefix_validation[path/to/prefix-None]\": 0.0011570731091369777,\n    \"tests/env/test_env.py::test_prefix_validation[prefix0-Invalid type for 'prefix']\": 0.0012804062931471485,\n    \"tests/env/test_env.py::test_remove_channels\": 0.001009816398287359,\n    \"tests/env/test_env.py::test_retains_full_filename\": 0.0018687335558067943,\n    \"tests/env/test_env.py::test_returns_Environment\": 0.001961981759305411,\n    \"tests/env/test_env.py::test_to_dict_returns_dictionary_of_data\": 0.0012950605135108027,\n    \"tests/env/test_env.py::test_to_dict_returns_just_name_if_only_thing_present\": 0.0010251517952097771,\n    \"tests/env/test_env.py::test_to_yaml_returns_proper_yaml\": 0.001619166510100647,\n    \"tests/env/test_env.py::test_to_yaml_returns_yaml_parseable_string\": 0.0025648112519230607,\n    \"tests/env/test_env.py::test_to_yaml_takes_stream\": 0.0015856593332358687,\n    \"tests/env/test_env.py::test_valid_keys\": 0.002566117203893796,\n    \"tests/env/test_env.py::test_variables_validation[variables0-Invalid type for 'variables']\": 0.001322096649436941,\n    \"tests/env/test_env.py::test_variables_validation[variables1-None]\": 0.0011946606036695256,\n    \"tests/env/test_env.py::test_variables_validation[variables2-None]\": 0.0011287795729781652,\n    \"tests/env/test_env.py::test_with_pip\": 0.0022873684047224493,\n    \"tests/env/test_pip_util.py::test_get_pip_installed_packages[Successfully installed foo bar-expected0]\": 0.001620943227577399,\n    \"tests/env/test_pip_util.py::test_get_pip_installed_packages[\\\\nCollecting attrs\\\\n  Using cached https://files.pythonhosted.org/packages/23/96/d828354fa2dbdf216eaa7b7de0db692f12c234f7ef888cc14980ef40d1d2/attrs-19.1.0-py2.py3-none-any.whl\\\\nInstalling collected packages: attrs\\\\nSuccessfully installed attrs-19.1.0\\\\n-expected1]\": 0.0012465717962182158,\n    \"tests/env/test_pip_util.py::test_get_pip_installed_packages[\\\\nCollecting flask\\\\n  Using cached https://files.pythonhosted.org/packages/9b/93/628509b8d5dc749656a9641f4caf13540e2cdec85276964ff8f43bbb1d3b/Flask-1.1.1-py2.py3-none-any.whl\\\\nCollecting itsdangerous>=0.24 (from flask)\\\\n  Using cached https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl\\\\nCollecting click>=5.1 (from flask)\\\\n  Using cached https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl\\\\nCollecting Werkzeug>=0.15 (from flask)\\\\n  Using cached https://files.pythonhosted.org/packages/b7/61/c0a1adf9ad80db012ed7191af98fa05faa95fa09eceb71bb6fa8b66e6a43/Werkzeug-0.15.6-py2.py3-none-any.whl\\\\nCollecting Jinja2>=2.10.1 (from flask)\\\\n  Using cached https://files.pythonhosted.org/packages/1d/e7/fd8b501e7a6dfe492a433deb7b9d833d39ca74916fa8bc63dd1a4947a671/Jinja2-2.10.1-py2.py3-none-any.whl\\\\nCollecting MarkupSafe>=0.23 (from Jinja2>=2.10.1->flask)\\\\n  Using cached https://files.pythonhosted.org/packages/ce/c6/f000f1af136ef74e4a95e33785921c73595c5390403f102e9b231b065b7a/MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl\\\\nInstalling collected packages: itsdangerous, click, Werkzeug, MarkupSafe, Jinja2, flask\\\\nSuccessfully installed Jinja2-2.10.1 MarkupSafe-1.1.1 Werkzeug-0.15.6 click-7.0 flask-1.1.1 itsdangerous-1.1.0\\\\n-expected2]\": 0.0011498356339722413,\n    \"tests/env/test_pip_util.py::test_get_pip_installed_packages[\\\\nCollecting flask\\\\n  Using cached https://files.pythonhosted.org/packages/9b/93/628509b8d5dc749656a9641f4caf13540e2cdec85276964ff8f43bbb1d3b/Flask-1.1.1-py2.py3-none-any.whl\\\\nRequirement already satisfied: Werkzeug>=0.15 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (0.15.6)\\\\nRequirement already satisfied: itsdangerous>=0.24 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (1.1.0)\\\\nRequirement already satisfied: Jinja2>=2.10.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (2.10.1)\\\\nRequirement already satisfied: click>=5.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (7.0)\\\\nRequirement already satisfied: MarkupSafe>=0.23 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from Jinja2>=2.10.1->flask) (1.1.1)\\\\nInstalling collected packages: flask\\\\nSuccessfully installed flask-1.1.1\\\\n-expected3]\": 0.001172644592940921,\n    \"tests/env/test_pip_util.py::test_get_pip_installed_packages_none[\\\\nRequirement already satisfied: flask in ./miniconda3/envs/fooo/lib/python3.7/site-packages (1.1.1)\\\\nRequirement already satisfied: itsdangerous>=0.24 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (1.1.0)\\\\nRequirement already satisfied: Jinja2>=2.10.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (2.10.1)\\\\nRequirement already satisfied: click>=5.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (7.0)\\\\nRequirement already satisfied: Werkzeug>=0.15 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (0.15.6)\\\\nRequirement already satisfied: MarkupSafe>=0.23 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from Jinja2>=2.10.1->flask) (1.1.1)\\\\n]\": 0.0010828544273056948,\n    \"tests/env/test_pip_util.py::test_get_pip_installed_packages_none[]\": 0.0010945648330170686,\n    \"tests/env/test_pip_util.py::test_get_pip_installed_packages_none[foo]\": 0.001085277428085332,\n    \"tests/gateways/disk/test_create.py::test_deprecations[ProgressFileWrapper-TypeError]\": 0.0013986394641156477,\n    \"tests/gateways/disk/test_create.py::test_deprecations[create_application_entry_point-TypeError]\": 0.0015927666253414794,\n    \"tests/gateways/disk/test_create.py::test_deprecations[create_fake_executable_softlink-TypeError]\": 0.0013225182046585067,\n    \"tests/gateways/disk/test_create.py::test_deprecations[extract_tarball-TypeError]\": 0.0012573172015592439,\n    \"tests/gateways/disk/test_delete.py::test_backoff_unlink\": 0.046055173196388674,\n    \"tests/gateways/disk/test_delete.py::test_backoff_unlink_doesnt_exist\": 0.0013457862488760776,\n    \"tests/gateways/disk/test_delete.py::test_remove_dir\": 0.046335725995053395,\n    \"tests/gateways/disk/test_delete.py::test_remove_file\": 0.0019889283676391054,\n    \"tests/gateways/disk/test_delete.py::test_remove_link_to_dir\": 0.04680384608275095,\n    \"tests/gateways/disk/test_delete.py::test_remove_link_to_file\": 0.0016907635481685202,\n    \"tests/gateways/disk/test_delete.py::test_rm_rf\": 0.046246087194122334,\n    \"tests/gateways/disk/test_delete.py::test_rm_rf_couldnt\": 0.0013986804997528197,\n    \"tests/gateways/disk/test_delete.py::test_rm_rf_does_not_follow_symlinks\": 0.09168626985492938,\n    \"tests/gateways/disk/test_delete.py::test_try_rmdir_all_empty_doesnt_exist\": 0.04607698195078128,\n    \"tests/gateways/disk/test_link.py::test_hard_link\": 0.0019330006314231096,\n    \"tests/gateways/disk/test_link.py::test_soft_link\": 0.002133645000468846,\n    \"tests/gateways/disk/test_lock.py::test_LockError_raised\": 0.0024773983114817905,\n    \"tests/gateways/disk/test_lock.py::test_double_locking_fails\": 1.1085114723501615,\n    \"tests/gateways/disk/test_lock.py::test_lock_acquired_success\": 0.0017549335276479741,\n    \"tests/gateways/disk/test_permissions.py::test_make_executable\": 0.0013360055253282248,\n    \"tests/gateways/disk/test_permissions.py::test_make_writable\": 0.003862476015336505,\n    \"tests/gateways/disk/test_permissions.py::test_make_writable_dir_EACCES\": 0.0014951982478031344,\n    \"tests/gateways/disk/test_permissions.py::test_make_writable_dir_EPERM\": 0.0017650148948434665,\n    \"tests/gateways/disk/test_permissions.py::test_make_writable_dir_EROFS\": 0.0014905567545451773,\n    \"tests/gateways/disk/test_permissions.py::test_make_writable_doesnt_exist\": 0.0011277443404247524,\n    \"tests/gateways/disk/test_permissions.py::test_recursive_make_writable\": 0.0071235430177841105,\n    \"tests/gateways/disk/test_read.py::test_cherrypy_py27_osx_no_binary\": 0.022980600080279426,\n    \"tests/gateways/disk/test_read.py::test_cherrypy_py36_osx_whl\": 0.029844834292281023,\n    \"tests/gateways/disk/test_read.py::test_pyjwt_py27_osx_no_binary\": 0.0060309734292816,\n    \"tests/gateways/disk/test_read.py::test_pyjwt_py36_osx_whl\": 0.005480943894737518,\n    \"tests/gateways/disk/test_read.py::test_scrapy_py27_osx_no_binary\": 0.038062387726139554,\n    \"tests/gateways/disk/test_read.py::test_scrapy_py36_osx_whl\": 0.04206478308459821,\n    \"tests/gateways/disk/test_read.py::test_six_py27_osx_no_binary_unmanageable\": 0.0024620937286891484,\n    \"tests/gateways/disk/test_read.py::test_twilio_py27_osx_no_binary\": 0.048502201274051325,\n    \"tests/gateways/disk/test_read.py::test_twilio_py36_osx_whl\": 0.06765131880599798,\n    \"tests/gateways/test_connection.py::test_accept_range_none\": 0.33580621071492406,\n    \"tests/gateways/test_connection.py::test_add_binstar_token\": 0.039858977143380776,\n    \"tests/gateways/test_connection.py::test_get_channel_name_from_url[http://localhost-channels3-http://localhost]\": 0.004918643134444383,\n    \"tests/gateways/test_connection.py::test_get_channel_name_from_url[http://localhost/noarch/test-package-0.1.0.conda-channels2-http://localhost]\": 0.005010947605607784,\n    \"tests/gateways/test_connection.py::test_get_channel_name_from_url[https://conda.anaconda.org/conda-forge/linux-64/test-package-0.1.0.tar.bz2-channels1-conda-forge]\": 0.0052448886116076045,\n    \"tests/gateways/test_connection.py::test_get_channel_name_from_url[https://repo.anaconda.com/pkgs/main/linux-64/test-package-0.1.0.conda-channels0-defaults]\": 0.005713435446887632,\n    \"tests/gateways/test_connection.py::test_get_session_returns_default\": 0.0023986121547226995,\n    \"tests/gateways/test_connection.py::test_get_session_with_channel_settings\": 0.009637213894844591,\n    \"tests/gateways/test_connection.py::test_get_session_with_channel_settings_multiple\": 0.0051324776833103995,\n    \"tests/gateways/test_connection.py::test_get_session_with_channel_settings_no_handler\": 0.0024412787938638005,\n    \"tests/gateways/test_connection.py::test_get_session_with_request_headers\": 0.0048865272667685325,\n    \"tests/gateways/test_connection.py::test_get_session_with_url_pattern[exact-url]\": 0.006938076821057614,\n    \"tests/gateways/test_connection.py::test_get_session_with_url_pattern[no-match]\": 0.002880637895523879,\n    \"tests/gateways/test_connection.py::test_get_session_with_url_pattern[url-prefix]\": 0.00523544773141708,\n    \"tests/gateways/test_connection.py::test_get_session_with_url_pattern[wildcard-match-same-schema]\": 0.003871642791757242,\n    \"tests/gateways/test_connection.py::test_get_session_with_url_pattern[wildcard-no-match-different-scheme]\": 0.002611912109460186,\n    \"tests/gateways/test_connection.py::test_get_session_with_url_pattern[wildcard-no-match-missing-scheme]\": 0.008984164036751395,\n    \"tests/gateways/test_connection.py::test_local_file_adapter_200\": 0.01322075887278569,\n    \"tests/gateways/test_connection.py::test_local_file_adapter_404\": 0.023411153493382048,\n    \"tests/gateways/test_connection.py::test_offline[False]\": 0.005911878938818698,\n    \"tests/gateways/test_connection.py::test_offline[True]\": 0.0044275044784096145,\n    \"tests/gateways/test_connection.py::test_prepare_request_allows_valid_plugin_headers\": 0.003544090840726049,\n    \"tests/gateways/test_connection.py::test_prepare_request_rejects_forbidden_plugin_headers\": 0.003093895714772416,\n    \"tests/gateways/test_connection.py::test_s3_download_uses_direct_path\": 0.10194329620246062,\n    \"tests/gateways/test_connection.py::test_s3_server\": 0.00030202191741867686,\n    \"tests/gateways/test_connection.py::test_s3_server_with_mock\": 0.000283497035282789,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_case_insensitive\": 0.0011203046156084736,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Accept-Charset]\": 0.0012509762644891888,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Accept-Encoding]\": 0.0011782071938910821,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Access-Control-Request-Headers]\": 0.0011956681222687927,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Access-Control-Request-Method]\": 0.001203566347313856,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Connection]\": 0.0011802412315945197,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Content-Length]\": 0.0012350338551870706,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Cookie]\": 0.0011820269911378403,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[DNT]\": 0.0011456055189061859,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Date]\": 0.001134147808517131,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Expect]\": 0.001195419911423012,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Host]\": 0.0011688372562324544,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Keep-Alive]\": 0.0011586334860938226,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Origin]\": 0.0011615042466817124,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Referer]\": 0.001158639648962438,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Set-Cookie]\": 0.001138571146481722,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[TE]\": 0.0011307044042954885,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Trailer]\": 0.0011629138569855394,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Transfer-Encoding]\": 0.0011745504240828967,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Upgrade]\": 0.0011205604678774126,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Via]\": 0.0011355259794283,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Proxy-Authorization]\": 0.0012482183777602993,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Proxy-Connection]\": 0.0011711181618697078,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Sec-Fetch-Dest]\": 0.001155104905819916,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Sec-Fetch-Mode]\": 0.0011437231858272248,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Sec-Fetch-Site]\": 0.0011558347801105605,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[sec-ch-ua]\": 0.0011489183812755733,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-CONNECT-True]\": 0.0012849442267038101,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-GET-False]\": 0.0012574831748841137,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-Override-PUT-False]\": 0.001257003550543072,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-Override-TRACE-True]\": 0.0012830052345357572,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-POST-False]\": 0.0013196500296469968,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-TRACE-True]\": 0.001365519124222811,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-TRACK-True]\": 0.0013262679262830627,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-Method-Override-CONNECT-True]\": 0.001296117559913249,\n    \"tests/gateways/test_logging.py::test_token_not_present_in_conda_create\": 2.068497941433168,\n    \"tests/gateways/test_logging.py::test_token_replace_big_string\": 0.001472110931896797,\n    \"tests/gateways/test_logging.py::test_token_replace_individual_strings\": 0.0011152050950641152,\n    \"tests/gateways/test_logging.py::test_token_url_filter_attached_to_loggers\": 0.0016485086695572442,\n    \"tests/gateways/test_logging.py::test_token_url_filter_formats[http-ip-port-with-token]\": 0.0012427439988850124,\n    \"tests/gateways/test_logging.py::test_token_url_filter_formats[https-url-with-token]\": 0.0013647496740854497,\n    \"tests/gateways/test_logging.py::test_token_url_filter_formats[multiple-tokens-in-message]\": 0.0013805146201215255,\n    \"tests/gateways/test_logging.py::test_token_url_filter_formats[path-only-with-token]\": 0.00123866914454442,\n    \"tests/gateways/test_repodata_gateway.py::test_coverage_conda_http_errors\": 0.022697833139805276,\n    \"tests/gateways/test_repodata_gateway.py::test_get_cache_control_max_age\": 0.0010854986534304853,\n    \"tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[false-False]\": 0.006025513737977695,\n    \"tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[false-True]\": 0.1980557764467702,\n    \"tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[true-False]\": 0.004247969140913675,\n    \"tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[true-True]\": 0.006186271988152769,\n    \"tests/gateways/test_repodata_gateway.py::test_repodata_fetch_formats\": 0.14425147190822815,\n    \"tests/gateways/test_repodata_gateway.py::test_repodata_fetch_jsondecodeerror\": 0.0027999217306377403,\n    \"tests/gateways/test_repodata_gateway.py::test_repodata_state_has_format\": 0.0023027758999024117,\n    \"tests/gateways/test_repodata_gateway.py::test_save\": 0.10366175724084209,\n    \"tests/gateways/test_repodata_gateway.py::test_ssl_unavailable_error_message\": 0.0013540105079150459,\n    \"tests/gateways/test_repodata_gateway.py::test_stale\": 0.0168321894202686,\n    \"tests/gateways/test_repodata_lock.py::test_lock_no_lock[False]\": 9.390141259127196,\n    \"tests/gateways/test_repodata_lock.py::test_lock_no_lock[True]\": 0.39139642601487973,\n    \"tests/gateways/test_repodata_lock.py::test_lock_rename\": 0.007053410957221837,\n    \"tests/gateways/test_repodata_shards.py::test_bytes_cache\": 0.0032455768758740803,\n    \"tests/gateways/test_streams.py::test_redact_token_urls_matches_token_url_filter\": 0.001167432532782116,\n    \"tests/gateways/test_streams.py::test_stderr_writes_redacted_text\": 0.001333133912602913,\n    \"tests/gateways/test_subprocess.py::test_subprocess_call_with_capture_output\": 0.3151487549381664,\n    \"tests/gateways/test_subprocess.py::test_subprocess_call_without_capture_output\": 0.3152690016833357,\n    \"tests/gateways/test_zstd.py::test_download_repodata\": 0.014044060475716784,\n    \"tests/gateways/test_zstd.py::test_repodata_info_jsondecodeerror\": 0.07154220145955474,\n    \"tests/gateways/test_zstd.py::test_repodata_state\": 0.024285666984720594,\n    \"tests/gateways/test_zstd.py::test_repodata_use_zst[False]\": 0.004449382256109897,\n    \"tests/gateways/test_zstd.py::test_repodata_use_zst[True]\": 0.004501502616605131,\n    \"tests/gateways/test_zstd.py::test_server_available\": 0.004507921418597217,\n    \"tests/gateways/test_zstd.py::test_zstd_fallback_on_invalid_zstd\": 0.008591236980708707,\n    \"tests/gateways/test_zstd.py::test_zstd_not_404\": 0.0036261068858904205,\n    \"tests/models/test_channel.py::test_bare_channel_file\": 0.0018856327021546735,\n    \"tests/models/test_channel.py::test_bare_channel_http\": 0.0017289735165227907,\n    \"tests/models/test_channel.py::test_basic_multichannel\": 0.0017790650246492306,\n    \"tests/models/test_channel.py::test_canonicalized_url_gets_correct_token\": 0.005593361910250022,\n    \"tests/models/test_channel.py::test_channel_alias\": 0.007436301445725345,\n    \"tests/models/test_channel.py::test_channel_alias_channels\": 0.0018265403441800967,\n    \"tests/models/test_channel.py::test_channel_alias_w_conda_path\": 0.0052194922305203615,\n    \"tests/models/test_channel.py::test_channel_alias_w_subhcnnale\": 0.005174725779039115,\n    \"tests/models/test_channel.py::test_channel_cache\": 0.001594603914003044,\n    \"tests/models/test_channel.py::test_channel_equality_respects_platform\": 0.0019696389413703806,\n    \"tests/models/test_channel.py::test_channel_host_port\": 0.0016676635548374939,\n    \"tests/models/test_channel.py::test_channel_mangles_urls\": 0.0018703053243213832,\n    \"tests/models/test_channel.py::test_channel_name_subdir_only\": 0.001692777843505158,\n    \"tests/models/test_channel.py::test_channels_with_dashes\": 0.006098213005333299,\n    \"tests/models/test_channel.py::test_custom_channels\": 0.008223592920102635,\n    \"tests/models/test_channel.py::test_custom_channels_port_token_auth\": 0.008024140081953608,\n    \"tests/models/test_channel.py::test_custom_token_in_channel\": 0.005033436051944423,\n    \"tests/models/test_channel.py::test_default_channel[None]\": 0.001819966750216909,\n    \"tests/models/test_channel.py::test_default_channel[win-32]\": 0.0017451776316719887,\n    \"tests/models/test_channel.py::test_default_channels\": 0.007414405354950298,\n    \"tests/models/test_channel.py::test_defaults_channel\": 0.007433027531478029,\n    \"tests/models/test_channel.py::test_env_var_file_urls\": 0.0025918216526672573,\n    \"tests/models/test_channel.py::test_expanded_variables\": 0.0038160870606070824,\n    \"tests/models/test_channel.py::test_file_channel\": 0.007829272645438043,\n    \"tests/models/test_channel.py::test_file_url_with_backslashes\": 0.0018024863594307988,\n    \"tests/models/test_channel.py::test_file_urls\": 0.0017392762775737182,\n    \"tests/models/test_channel.py::test_local_channel\": 0.05615719613973107,\n    \"tests/models/test_channel.py::test_migrated_custom_channels\": 0.008262259827252165,\n    \"tests/models/test_channel.py::test_multichannel_priority\": 0.0018541888396418496,\n    \"tests/models/test_channel.py::test_named_custom_channel\": 0.007228037455467556,\n    \"tests/models/test_channel.py::test_named_custom_channel_w_subchan\": 0.007054399610150405,\n    \"tests/models/test_channel.py::test_old_channel_alias\": 0.00813905999369421,\n    \"tests/models/test_channel.py::test_pkgs_main\": 0.008626565503786904,\n    \"tests/models/test_channel.py::test_pkgs_pro\": 0.00858678007205098,\n    \"tests/models/test_channel.py::test_ppc64le_vs_ppc64\": 0.002126691285891024,\n    \"tests/models/test_channel.py::test_prioritize_channels\": 0.0018997378742721233,\n    \"tests/models/test_channel.py::test_regression_against_unknown_none\": 0.0019317911710406183,\n    \"tests/models/test_channel.py::test_subdir_env_var\": 0.005913783393782711,\n    \"tests/models/test_channel.py::test_subdirs_env_var\": 0.006407718626503337,\n    \"tests/models/test_channel.py::test_subdirs_kwarg_takes_precedence_over_platform\": 0.0018324732033865286,\n    \"tests/models/test_channel.py::test_token_in_custom_channel\": 0.0020649578328430737,\n    \"tests/models/test_channel.py::test_unexpanded_variables\": 0.003707770195541935,\n    \"tests/models/test_channel.py::test_url_channel_w_platform\": 0.0017302202152830828,\n    \"tests/models/test_channel.py::test_url_custom_channel\": 0.006994971934120516,\n    \"tests/models/test_channel.py::test_url_custom_channel_w_subchan\": 0.007126012063663551,\n    \"tests/models/test_dist.py::test_channel[.conda]\": 0.0035216125685162704,\n    \"tests/models/test_dist.py::test_channel[.tar.bz2]\": 0.002170659649294046,\n    \"tests/models/test_dist.py::test_dist[.conda]\": 0.010771182899301821,\n    \"tests/models/test_dist.py::test_dist[.tar.bz2]\": 0.003753964597962999,\n    \"tests/models/test_dist.py::test_dist_with_channel_url[.conda]\": 0.05520733195698013,\n    \"tests/models/test_dist.py::test_dist_with_channel_url[.tar.bz2]\": 0.055731013061261256,\n    \"tests/models/test_dist.py::test_dist_with_non_channel_url[.conda]\": 0.002236644402681594,\n    \"tests/models/test_dist.py::test_dist_with_non_channel_url[.tar.bz2]\": 0.002087395897274431,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[-None]\": 0.001188350359427121,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[0-None]\": 0.0011794742769406909,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[0.0-None]\": 0.0011444630927702128,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[1-NoarchType.generic]\": 0.001223317209867271,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[1.0-NoarchType.generic]\": 0.001123388866021589,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[42-NoarchType.generic]\": 0.0011961585047944939,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[FALSE-None]\": 0.0012343231067384092,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[False-None0]\": 0.0012774877075373357,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[False-None1]\": 0.0011976918459846643,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[GENERIC-NoarchType.generic]\": 0.0013647903328050462,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[Generic-NoarchType.generic]\": 0.0012687049161482018,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[N-None]\": 0.0011355517258187643,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[NO-None]\": 0.0012154054227753567,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[NONE-None]\": 0.0012016601711228553,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[NULL-None]\": 0.0011986562666687621,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[No-None]\": 0.0012603974809257648,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[NoarchType.generic-NoarchType.generic]\": 0.0013201958134044986,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[NoarchType.python-NoarchType.python]\": 0.0012668999172613972,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[Non-None]\": 0.001143455263639176,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[None-None]\": 0.0011924912324101373,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[Null-None]\": 0.0011784938723686789,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[OFF-None]\": 0.0011215093119831413,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[ON-NoarchType.generic]\": 0.001260883896128997,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[Off-None]\": 0.001130446261838798,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[On-NoarchType.generic]\": 0.0011900782230926754,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[PYTHON-NoarchType.python]\": 0.0011783410621610294,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[Python-NoarchType.python]\": 0.001135869303688962,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[TRUE-NoarchType.generic]\": 0.0011523804512831128,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[True-NoarchType.generic0]\": 0.0013196185374538452,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[True-NoarchType.generic1]\": 0.001225064507984634,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[Y-NoarchType.generic]\": 0.0011979003606606227,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[YES-NoarchType.generic]\": 0.001207073936361071,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[Yes-NoarchType.generic]\": 0.0012358185982337872,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[\\\\x00-None]\": 0.001253496113803221,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[false-None]\": 0.0011378535440570564,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[foobar-CondaUpgradeError]\": 0.001664331324310089,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[generic-NoarchType.generic]\": 0.0012161230907867162,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[invalid-CondaUpgradeError]\": 0.001575056196896936,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[n-None]\": 0.001109695907036263,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[no-None]\": 0.0012630949231465167,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[non-None]\": 0.0013691099062572507,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[none-None]\": 0.0011785843752285866,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[null-None]\": 0.0012635963730431323,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[off-None]\": 0.0011964683307826556,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[on-NoarchType.generic]\": 0.001190679965529735,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[other-CondaUpgradeError]\": 0.001491126146338867,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[python-NoarchType.python]\": 0.001279130693539364,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[true-NoarchType.generic]\": 0.0012844898402146379,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[unknown-CondaUpgradeError]\": 0.001474465524566341,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[value2-NoarchType.python]\": 0.001232434760402527,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[value3-NoarchType.generic]\": 0.0012844666865375514,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[y-NoarchType.generic]\": 0.0011399778962919687,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[yes-NoarchType.generic]\": 0.0012680950223528382,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[~-None]\": 0.0012114565458188158,\n    \"tests/models/test_environment.py::test_config_from_cli_channels_behaviors\": 0.0017636846375870103,\n    \"tests/models/test_environment.py::test_config_from_cli_channels_empty\": 0.0010738129416743847,\n    \"tests/models/test_environment.py::test_create_environment_missing_required_fields\": 0.0010358149677488456,\n    \"tests/models/test_environment.py::test_create_invalid_platform\": 0.0011276433173445675,\n    \"tests/models/test_environment.py::test_create_missing_explicit_package\": 0.0018788665721940782,\n    \"tests/models/test_environment.py::test_ensure_no_duplicate_named_explicit_packages\": 0.0018119191713568507,\n    \"tests/models/test_environment.py::test_environment_config_channels_basic\": 0.0011626655202902467,\n    \"tests/models/test_environment.py::test_environment_config_from_context\": 0.011554079575169593,\n    \"tests/models/test_environment.py::test_environments_merge\": 0.0023404479516338783,\n    \"tests/models/test_environment.py::test_environments_merge_colliding_name\": 0.0010532422130719256,\n    \"tests/models/test_environment.py::test_environments_merge_colliding_platform\": 0.0011663039975264395,\n    \"tests/models/test_environment.py::test_environments_merge_colliding_prefix\": 0.0011457627466065726,\n    \"tests/models/test_environment.py::test_environments_merge_explicit_packages\": 0.0018304275927540888,\n    \"tests/models/test_environment.py::test_explicit_packages\": 0.2834034274119459,\n    \"tests/models/test_environment.py::test_extrapolate\": 5.051077739992068,\n    \"tests/models/test_environment.py::test_from_cli_accepts_multi_platform_file_covering_current\": 0.0035028430911843373,\n    \"tests/models/test_environment.py::test_from_cli_channel_order_base_file_cli\": 0.004747582070417815,\n    \"tests/models/test_environment.py::test_from_cli_empty\": 0.0020671352039062937,\n    \"tests/models/test_environment.py::test_from_cli_empty_with_default_packages\": 0.006796887335456601,\n    \"tests/models/test_environment.py::test_from_cli_environment_inject_default_packages_override_file\": 0.006525490367832846,\n    \"tests/models/test_environment.py::test_from_cli_inject_default_packages_override\": 0.010608529853683853,\n    \"tests/models/test_environment.py::test_from_cli_mix_explicit_and_specs\": 0.001987116715464457,\n    \"tests/models/test_environment.py::test_from_cli_override_channels_excludes_file_channels\": 0.003144519788404609,\n    \"tests/models/test_environment.py::test_from_cli_pre_flight_rejects_incompatible_files[1]\": 0.002236819130926515,\n    \"tests/models/test_environment.py::test_from_cli_pre_flight_rejects_incompatible_files[2]\": 0.0025545294997366018,\n    \"tests/models/test_environment.py::test_from_cli_with_explicit_specs\": 0.0029875239495090757,\n    \"tests/models/test_environment.py::test_from_cli_with_files\": 0.0031017482439928243,\n    \"tests/models/test_environment.py::test_from_cli_with_specs\": 0.002259460648914824,\n    \"tests/models/test_environment.py::test_from_prefix_behavior_with_pip_interoperability\": 6.969321062358857,\n    \"tests/models/test_environment.py::test_from_prefix_options_affect_correct_packages\": 0.8461094059820397,\n    \"tests/models/test_environment.py::test_from_prefix_package_population_semantics\": 0.9731861313045316,\n    \"tests/models/test_environment.py::test_merge_channel_settings\": 0.0012316860063347318,\n    \"tests/models/test_environment.py::test_merge_configs_channel_order_last_wins\": 0.0010739885226338686,\n    \"tests/models/test_environment.py::test_merge_configs_deduplicate_values\": 0.0011873381601969302,\n    \"tests/models/test_environment.py::test_merge_configs_primitive_none_values_order\": 0.0011022771328172154,\n    \"tests/models/test_environment.py::test_merge_configs_primitive_values_order_one\": 0.0010741497622002532,\n    \"tests/models/test_environment.py::test_merge_configs_primitive_values_order_two\": 0.0010780289908221006,\n    \"tests/models/test_match_spec.py::test_bracket_matches\": 0.007631039752649479,\n    \"tests/models/test_match_spec.py::test_build_glob_merge\": 0.009649425066823298,\n    \"tests/models/test_match_spec.py::test_build_glob_merge_channel\": 0.0049528573704435384,\n    \"tests/models/test_match_spec.py::test_build_merge\": 0.002066865964889208,\n    \"tests/models/test_match_spec.py::test_build_number_and_filename\": 0.005165534920954972,\n    \"tests/models/test_match_spec.py::test_build_number_merge\": 0.0026813541137506,\n    \"tests/models/test_match_spec.py::test_canonical_string_forms\": 0.0054946540685879616,\n    \"tests/models/test_match_spec.py::test_catch_invalid_regexes\": 0.00209835628249401,\n    \"tests/models/test_match_spec.py::test_channel_matching\": 0.0020959518196808813,\n    \"tests/models/test_match_spec.py::test_channel_merge\": 0.0023322341546776486,\n    \"tests/models/test_match_spec.py::test_comment\": 0.0016652084768115174,\n    \"tests/models/test_match_spec.py::test_conda_build_form[build_only]\": 0.0013695826971500884,\n    \"tests/models/test_match_spec.py::test_conda_build_form[build_version]\": 0.0013640410339391888,\n    \"tests/models/test_match_spec.py::test_conda_build_form[name_only]\": 0.0012715422532089805,\n    \"tests/models/test_match_spec.py::test_conda_build_form[version_only]\": 0.0012310230777524151,\n    \"tests/models/test_match_spec.py::test_conda_env_form[conda-forge::numpy==1.21.0=py39h1234567_0-numpy=1.21.0=py39h1234567_0]\": 0.0017962173234052697,\n    \"tests/models/test_match_spec.py::test_conda_env_form[numpy=1.21.0-numpy=1.21.0]\": 0.0013078328654891832,\n    \"tests/models/test_match_spec.py::test_conda_env_form[numpy==1.21.0=py39h1234567_0-numpy=1.21.0=py39h1234567_0]\": 0.00132684220574754,\n    \"tests/models/test_match_spec.py::test_conda_env_form[pkgs/main::pandas==1.3.0=py39h123_0-pandas=1.3.0=py39h123_0]\": 0.001742918146253377,\n    \"tests/models/test_match_spec.py::test_conda_env_form[python==3.9.7-python=3.9.7]\": 0.0012829140482552416,\n    \"tests/models/test_match_spec.py::test_conda_env_form[scipy==1.7.0=py39h456_0-scipy=1.7.0=py39h456_0]\": 0.0013455606956442154,\n    \"tests/models/test_match_spec.py::test_conda_env_form_comprehensive\": 0.001977769060601742,\n    \"tests/models/test_match_spec.py::test_conda_style\": 0.0022032324121858265,\n    \"tests/models/test_match_spec.py::test_dist\": 0.0021468592709332993,\n    \"tests/models/test_match_spec.py::test_dist_str\": 0.0031549726799826477,\n    \"tests/models/test_match_spec.py::test_exact_values\": 0.0014692618782695499,\n    \"tests/models/test_match_spec.py::test_hash\": 0.0013571427410755724,\n    \"tests/models/test_match_spec.py::test_hash_merge_with_name[md5]\": 0.002097845748239464,\n    \"tests/models/test_match_spec.py::test_hash_merge_with_name[sha256]\": 0.0021641118649748862,\n    \"tests/models/test_match_spec.py::test_hash_merge_wo_name[md5]\": 0.0013140806826807533,\n    \"tests/models/test_match_spec.py::test_hash_merge_wo_name[sha256]\": 0.0012933930439236463,\n    \"tests/models/test_match_spec.py::test_index_record\": 0.002624655340387412,\n    \"tests/models/test_match_spec.py::test_invalid\": 0.002437659922976938,\n    \"tests/models/test_match_spec.py::test_invalid_match_spec\": 0.0011407364632144796,\n    \"tests/models/test_match_spec.py::test_invalid_version_reports_spec[pkg 4.2.2<6.0.0]\": 0.001255403167929633,\n    \"tests/models/test_match_spec.py::test_invalid_version_reports_spec[pkg>=0.10.0,<1.0.0<py312|>=0.13.0,<1.0.0>=py312]\": 0.0033811036813599002,\n    \"tests/models/test_match_spec.py::test_key_value_features_canonical_string_forms\": 0.0002720796414246821,\n    \"tests/models/test_match_spec.py::test_legacy_features_canonical_string_forms\": 0.001135578070276389,\n    \"tests/models/test_match_spec.py::test_license_match\": 0.00404720661827428,\n    \"tests/models/test_match_spec.py::test_match_1\": 0.005097025556734639,\n    \"tests/models/test_match_spec.py::test_matchspec_errors\": 0.0019379480647320488,\n    \"tests/models/test_match_spec.py::test_merge_multiple_name\": 0.002263618331546121,\n    \"tests/models/test_match_spec.py::test_merge_single_name\": 0.003051019036235484,\n    \"tests/models/test_match_spec.py::test_no_name_match_spec\": 0.0011789564411251825,\n    \"tests/models/test_match_spec.py::test_no_triple_equals_roundtrip\": 0.0011880692086485393,\n    \"tests/models/test_match_spec.py::test_openssl_match\": 0.0020346176596650633,\n    \"tests/models/test_match_spec.py::test_parse_build_number_brackets\": 0.001234969506782882,\n    \"tests/models/test_match_spec.py::test_parse_channel_subdir\": 0.0017717158836248429,\n    \"tests/models/test_match_spec.py::test_parse_equal_equal\": 0.0011807527116991766,\n    \"tests/models/test_match_spec.py::test_parse_errors\": 0.001099822351131231,\n    \"tests/models/test_match_spec.py::test_parse_hard\": 0.001333503649040598,\n    \"tests/models/test_match_spec.py::test_parse_parens\": 0.0015517502201905348,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_no_brackets\": 0.001883184613658706,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_tarball_url\": 0.0022037434608916336,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_with_brackets\": 0.0020101931156122146,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[conda-forge::numpy>=1.20-numpy->=1.20]\": 0.0018231196168279672,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy 1.20 py39_0-numpy-1.20]\": 0.001348389662589374,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy-numpy-None]\": 0.001216690748837907,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy>=1.20-numpy->=1.20]\": 0.0013394040816266117,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy[version='>=1.20']-numpy->=1.20]\": 0.001329869682707751,\n    \"tests/models/test_match_spec.py::test_pip_style2\": 0.0015837765695525894,\n    \"tests/models/test_match_spec.py::test_pip_style[foo>=1.3-foo[version='>=1.3']]\": 0.0012639971739375909,\n    \"tests/models/test_match_spec.py::test_pip_style[numpy >=1.9-numpy[version='>=1.9']]\": 0.00124841555304496,\n    \"tests/models/test_match_spec.py::test_pip_style[zope.int>=1.3,<3.0-zope.int[version='>=1.3,<3.0']]\": 0.0013073985759341313,\n    \"tests/models/test_match_spec.py::test_simple[foo=1.3.0=3-foo==1.3.0=3]\": 0.0012403704216592453,\n    \"tests/models/test_match_spec.py::test_simple[ipython=0.13.0-ipython=0.13.0]\": 0.001292610549356668,\n    \"tests/models/test_match_spec.py::test_simple[ipython=0.13.2-ipython=0.13.2]\": 0.001294029216832568,\n    \"tests/models/test_match_spec.py::test_simple[ipython==0.13.0-ipython==0.13.0]\": 0.0012953861636288862,\n    \"tests/models/test_match_spec.py::test_simple[python-python]\": 0.0012660374424975755,\n    \"tests/models/test_match_spec.py::test_simple[python=2.6*-python=2.6]\": 0.0013174580265015916,\n    \"tests/models/test_match_spec.py::test_simple[python=2.6-python=2.6]\": 0.0012577868375028315,\n    \"tests/models/test_match_spec.py::test_star_name\": 0.0011006611732323653,\n    \"tests/models/test_match_spec.py::test_strictness\": 0.00195468565416734,\n    \"tests/models/test_match_spec.py::test_subdir_merge\": 0.002362609586821895,\n    \"tests/models/test_match_spec.py::test_tarball_match_specs\": 0.0038733070162251773,\n    \"tests/models/test_match_spec.py::test_to_filename\": 0.008844162888621629,\n    \"tests/models/test_match_spec.py::test_track_features_match\": 0.00322936336900154,\n    \"tests/models/test_match_spec.py::test_url_percent_encoding\": 0.0026997996678087477,\n    \"tests/models/test_match_spec.py::test_version_wildcard_serialization\": 0.0021138712201484657,\n    \"tests/models/test_package_info.py::test_package_info\": 0.001826638146688942,\n    \"tests/models/test_prefix_graph.py::test_deep_cyclical_dependency[classic]\": 0.9700671281573736,\n    \"tests/models/test_prefix_graph.py::test_deep_cyclical_dependency[libmamba]\": 0.3342801504507547,\n    \"tests/models/test_prefix_graph.py::test_general_graph_bfs_simple[classic]\": 0.011395973561961313,\n    \"tests/models/test_prefix_graph.py::test_general_graph_bfs_simple[libmamba]\": 0.007942681209047288,\n    \"tests/models/test_prefix_graph.py::test_general_graph_bfs_version[classic]\": 0.009308500009755328,\n    \"tests/models/test_prefix_graph.py::test_general_graph_bfs_version[libmamba]\": 0.0068375442541106545,\n    \"tests/models/test_prefix_graph.py::test_prefix_graph_1[classic]\": 3.3821482581273377,\n    \"tests/models/test_prefix_graph.py::test_prefix_graph_1[libmamba]\": 0.2576096388214039,\n    \"tests/models/test_prefix_graph.py::test_prefix_graph_2[classic]\": 3.433632883157648,\n    \"tests/models/test_prefix_graph.py::test_prefix_graph_2[libmamba]\": 0.24562438406583,\n    \"tests/models/test_prefix_graph.py::test_remove_youngest_descendant_nodes_with_specs[classic]\": 3.4625399575866886,\n    \"tests/models/test_prefix_graph.py::test_remove_youngest_descendant_nodes_with_specs[libmamba]\": 0.2386750516203252,\n    \"tests/models/test_prefix_graph.py::test_sort_without_prep[classic]\": 4.2508242150309465,\n    \"tests/models/test_prefix_graph.py::test_sort_without_prep[libmamba]\": 1.0853450488597578,\n    \"tests/models/test_prefix_graph.py::test_windows_sort_orders_1[classic]\": 4.51196200495672,\n    \"tests/models/test_prefix_graph.py::test_windows_sort_orders_1[libmamba]\": 1.2519456934207036,\n    \"tests/models/test_prefix_graph.py::test_windows_sort_orders_2[classic]\": 4.277840556432116,\n    \"tests/models/test_prefix_graph.py::test_windows_sort_orders_2[libmamba]\": 1.1499360552229463,\n    \"tests/models/test_records.py::test_package_record_feature\": 0.0018632895029709968,\n    \"tests/models/test_records.py::test_package_record_spec_strings[my-package-2.1.0-alpha-py38_custom.build-my-package=2.1.0-alpha=py38_custom.build-my-package=2.1.0-alpha]\": 0.001962366737302077,\n    \"tests/models/test_records.py::test_package_record_spec_strings[numpy-1.21.0-py39h_0-numpy=1.21.0=py39h_0-numpy=1.21.0]\": 0.0019774268356170343,\n    \"tests/models/test_records.py::test_package_record_spec_strings[scipy_special-1.7.0-py39_1-scipy_special=1.7.0=py39_1-scipy_special=1.7.0]\": 0.0019583524452810737,\n    \"tests/models/test_records.py::test_package_record_spec_strings[tensorflow-2.8.0-cuda112py39_0-tensorflow=2.8.0=cuda112py39_0-tensorflow=2.8.0]\": 0.001964633937234233,\n    \"tests/models/test_records.py::test_package_record_spec_strings_vs_str\": 0.0017044144536818902,\n    \"tests/models/test_records.py::test_package_record_timestamp\": 0.0038490166107046715,\n    \"tests/models/test_records.py::test_package_virtual_package[123-testbuild]\": 0.0019957756433332387,\n    \"tests/models/test_records.py::test_package_virtual_package[None-None]\": 0.0020167624050878856,\n    \"tests/models/test_records.py::test_package_virtual_package[None-testbuild]\": 0.002013467605720122,\n    \"tests/models/test_records.py::test_prefix_record_no_channel\": 0.004774914215046048,\n    \"tests/models/test_records.py::test_record_spec_strings_inheritance[PackageRecord-extra_kwargs0]\": 0.0017227289184839508,\n    \"tests/models/test_records.py::test_record_spec_strings_inheritance[PrefixRecord-extra_kwargs1]\": 0.00172890746083964,\n    \"tests/models/test_records.py::test_requested_spec\": 0.09002961571480086,\n    \"tests/models/test_version.py::test_compatible_release_versions\": 0.0012584565629434677,\n    \"tests/models/test_version.py::test_compound_versions\": 0.0012380896272872746,\n    \"tests/models/test_version.py::test_hexrd\": 0.0010385748517334752,\n    \"tests/models/test_version.py::test_invalid_version_specs\": 0.0013195293596711143,\n    \"tests/models/test_version.py::test_local_identifier\": 0.0011154151361951385,\n    \"tests/models/test_version.py::test_match\": 0.002481186715685292,\n    \"tests/models/test_version.py::test_not_eq_star\": 0.0011944125554996814,\n    \"tests/models/test_version.py::test_openssl_convention\": 0.0013832059138244375,\n    \"tests/models/test_version.py::test_pep440\": 0.0018316390108170286,\n    \"tests/models/test_version.py::test_pep_440_arbitrary_equality_operator\": 0.0010743376901686987,\n    \"tests/models/test_version.py::test_ver_eval\": 0.0014313007910117103,\n    \"tests/models/test_version.py::test_ver_eval_errors\": 0.0011195671944863247,\n    \"tests/models/test_version.py::test_version_order\": 0.002210327334270852,\n    \"tests/models/test_version.py::test_version_spec_1\": 0.0011639982071573417,\n    \"tests/models/test_version.py::test_version_spec_2\": 0.0012129030374997437,\n    \"tests/models/test_version.py::test_version_spec_3\": 0.0010431786955562945,\n    \"tests/models/test_version.py::test_version_spec_4\": 0.0011609742555367282,\n    \"tests/notices/test_cache.py::test_clear_cache_invalidates_notices_cache[empty]\": 0.003140796023810302,\n    \"tests/notices/test_cache.py::test_clear_cache_invalidates_notices_cache[with-viewed-ids]\": 0.004890813495110545,\n    \"tests/notices/test_cache.py::test_clear_cache_removes_channel_response_caches\": 0.0030013157776178166,\n    \"tests/notices/test_cache.py::test_clear_cache_survives_os_error[channel_response_cache]\": 0.002842242237761559,\n    \"tests/notices/test_cache.py::test_clear_cache_survives_os_error[notices_cache]\": 0.002659566944029237,\n    \"tests/notices/test_core.py::test__conda_user_story__disable_notices\": 0.007237358545139486,\n    \"tests/notices/test_core.py::test__conda_user_story__more_notices_message\": 0.11296187601534852,\n    \"tests/notices/test_core.py::test__conda_user_story__only_see_once\": 0.1110418648282137,\n    \"tests/notices/test_core.py::test_display_notices_happy_path[200]\": 0.2158778222507555,\n    \"tests/notices/test_core.py::test_display_notices_happy_path[404]\": 0.2104485847340403,\n    \"tests/notices/test_core.py::test_display_notices_happy_path[500]\": 0.21139688732371242,\n    \"tests/notices/test_core.py::test_notices_decorator\": 0.11089697854008608,\n    \"tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.models.channel]\": 0.21003291648376907,\n    \"tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.cache]\": 0.20909027677981595,\n    \"tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.fetch]\": 0.20725342961671742,\n    \"tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.types]\": 0.20858429350341004,\n    \"tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.views]\": 0.2069850379234252,\n    \"tests/notices/test_deferred_imports.py::test_notices_core_does_not_load_requests\": 0.20867685504930353,\n    \"tests/notices/test_fetch.py::test_get_channel_notice_response_malformed_json\": 0.1050747096511451,\n    \"tests/notices/test_fetch.py::test_get_channel_notice_response_timeout_error\": 0.10498633233554262,\n    \"tests/notices/test_fetch.py::test_notice_response_cache_expired\": 0.0018458645198368192,\n    \"tests/notices/test_types.py::test_channel_notice_response\": 0.0011864921426525856,\n    \"tests/notices/test_types.py::test_channel_notice_response_date_parse_error\": 0.0016782509197090026,\n    \"tests/notices/test_types.py::test_channel_notice_response_integer_id\": 0.0010432724323510168,\n    \"tests/notices/test_types.py::test_channel_notice_undefined_id\": 0.0011162445755155837,\n    \"tests/plugins/reporter_backends/test_console.py::test_console_reporter_renderer\": 0.0017796650641840382,\n    \"tests/plugins/reporter_backends/test_console.py::test_console_reporter_renderer_envs_list\": 0.0028551965252876974,\n    \"tests/plugins/reporter_backends/test_console.py::test_prompt\": 0.0016252179944359821,\n    \"tests/plugins/reporter_backends/test_console.py::test_prompt_bad_option\": 0.0016701477847717871,\n    \"tests/plugins/reporter_backends/test_console.py::test_prompt_error_reading_stdin\": 0.0024748742906752228,\n    \"tests/plugins/reporter_backends/test_console.py::test_quiet_spinner\": 0.0012693130701389077,\n    \"tests/plugins/reporter_backends/test_console.py::test_quiet_spinner_with_error\": 0.001243961377112522,\n    \"tests/plugins/reporter_backends/test_console.py::test_spinner\": 0.102102247473099,\n    \"tests/plugins/reporter_backends/test_console.py::test_spinner_with_error\": 0.10205817289541702,\n    \"tests/plugins/reporter_backends/test_console.py::test_spinner_with_os_error_errno_epipe\": 0.00773251814772371,\n    \"tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_os_error\": 0.003131643221081877,\n    \"tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_os_error_with_epipe_errno\": 0.007568242940185624,\n    \"tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_update_to_os_error\": 0.0023479985899808415,\n    \"tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_update_to_os_error_with_errno_epipe\": 0.0022279899125284596,\n    \"tests/plugins/reporter_backends/test_json.py::test_json_handler\": 0.001180370335157165,\n    \"tests/plugins/reporter_backends/test_json.py::test_json_progress_bar_enabled\": 0.0020899152784734257,\n    \"tests/plugins/reporter_backends/test_json.py::test_json_progress_bar_not_enabled\": 0.0017456398167361685,\n    \"tests/plugins/reporter_backends/test_json.py::test_json_spinner\": 0.0012440408520653086,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files[.pyc]\": 0.008657165350999776,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files[.pyo]\": 0.009535203323473431,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyc-False]\": 0.00329124028981593,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyc-True]\": 0.002989412466809571,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyo-False]\": 0.0034835805058713357,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyo-True]\": 0.0068658262953970265,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_cannot_be_loaded[.pyc]\": 0.002404846060003521,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_cannot_be_loaded[.pyo]\": 0.002390883091900536,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_keys_missing[.pyc]\": 0.002696293475756652,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_keys_missing[.pyo]\": 0.005175069120142177,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files[.pyc]\": 0.0024127461060171724,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files[.pyo]\": 0.003526401979717731,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyc-False]\": 0.002715992455724104,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyc-True]\": 0.0027614702361047766,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyo-False]\": 0.0026665530110683055,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyo-True]\": 0.0027120541254639845,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_wrong_path_version[.pyc]\": 0.002518502269037275,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_wrong_path_version[.pyo]\": 0.0032277136441688703,\n    \"tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_check_fails\": 0.10369569948895721,\n    \"tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_check_fails_verbose\": 0.30205653070714944,\n    \"tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_check_passes\": 0.6060071524827679,\n    \"tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_constrains_not_met\": 0.20432586090696925,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_env_txt_check_action[.pyc]\": 0.003999230504615518,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_env_txt_check_action[.pyo]\": 0.0030188409399960624,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_listed_on_envs_txt_file[.pyc]\": 0.003455769376845879,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_listed_on_envs_txt_file[.pyo]\": 0.003493574077095047,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_env_txt_check_action[.pyc]\": 0.0030534400942262814,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_env_txt_check_action[.pyo]\": 0.0032164976672391953,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_listed_on_envs_txt_file[.pyc]\": 0.002977075260048618,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_listed_on_envs_txt_file[.pyo]\": 0.00316204194772559,\n    \"tests/plugins/subcommands/doctor/health_checks/test_file_locking.py::test_file_locking_not_supported\": 1.5834779630765463,\n    \"tests/plugins/subcommands/doctor/health_checks/test_file_locking.py::test_file_locking_supported[False]\": 1.8839667481772173,\n    \"tests/plugins/subcommands/doctor/health_checks/test_file_locking.py::test_file_locking_supported[True]\": 1.7906944134812508,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files[.pyc]\": 0.002485425979830969,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files[.pyo]\": 0.0026256022773942906,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyc-False]\": 0.0028063491479998746,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyc-True]\": 0.002732391388065334,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyo-False]\": 0.0027981753619838175,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyo-True]\": 0.002776869362710711,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files[.pyc]\": 0.0025855736623510554,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files[.pyo]\": 0.0025824403132809035,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyc-False]\": 0.002673883339139183,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyc-True]\": 0.002627767127002577,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyo-False]\": 0.0026905438914511955,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyo-True]\": 0.002670397049400674,\n    \"tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[\\\"conda\\\"-\\\\u274c]\": 0.029009019421978678,\n    \"tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[-\\\\u2705]\": 0.03400912484595205,\n    \"tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[conda 1.11, otherpackages==1-\\\\u274c]\": 0.028414016202444034,\n    \"tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[conda 1.11-\\\\u2705]\": 0.028718231849728187,\n    \"tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[imnotinstalledyet-\\\\u274c]\": 0.029400772331914134,\n    \"tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_fails[.pyc]\": 6.08718435587324,\n    \"tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_fails[.pyo]\": 6.080610206520864,\n    \"tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_non_existent_path[.pyc]\": 0.0030513809349132265,\n    \"tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_non_existent_path[.pyo]\": 0.003055997891788264,\n    \"tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_passes[.pyc]\": 0.003800630607112685,\n    \"tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_passes[.pyo]\": 0.0038822840957120153,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_fix_dry_run\": 0.03403644917143552,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_fix_yes\": 0.03172615619961557,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_happy_path\": 1.5633273283077638,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_happy_path_show_help\": 0.020589761175228285,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_happy_path_verbose\": 1.569635404950127,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_list\": 0.02555695708653377,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_specific_check\": 0.025697788871249846,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_with_non_existent_environment\": 0.035590945104814246,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_with_test_environment\": 0.027588303934239188,\n    \"tests/plugins/test_auth_handlers.py::test_duplicated\": 0.003958440011922613,\n    \"tests/plugins/test_auth_handlers.py::test_get_auth_handler\": 0.0035395353783516667,\n    \"tests/plugins/test_auth_handlers.py::test_get_auth_handler_multiple\": 0.004830092936640934,\n    \"tests/plugins/test_config.py::test_plugin_config_data_env_var_source\": 0.0010884816020480372,\n    \"tests/plugins/test_config.py::test_plugin_config_data_file_source\": 0.0029164880356924335,\n    \"tests/plugins/test_config.py::test_plugin_config_data_skip_bad_values\": 0.0010841272117510317,\n    \"tests/plugins/test_config.py::test_plugin_config_from_file\": 0.0038196879286863136,\n    \"tests/plugins/test_config.py::test_plugin_describe_parameters\": 0.0018777387309314047,\n    \"tests/plugins/test_config.py::test_plugins_config_from_environment\": 0.0020441270889845365,\n    \"tests/plugins/test_env_specs.py::test_alias_and_name_collision_detect\": 0.002807879675082664,\n    \"tests/plugins/test_env_specs.py::test_alias_normalization\": 0.0012365894306605783,\n    \"tests/plugins/test_env_specs.py::test_available_platforms[default-single-platform]\": 0.001142300137945055,\n    \"tests/plugins/test_env_specs.py::test_available_platforms[override-multi-platform]\": 0.0011252822399544376,\n    \"tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[cep-24-CEP-24 compliant YAML environment specification-environment]\": 0.002548484570623421,\n    \"tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[environment.yml-Standard YAML environment specification with dependencies-environment]\": 0.0025654582378851205,\n    \"tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[explicit-Explicit package URLs for fully reproducible environments-lockfile]\": 0.002916148735165392,\n    \"tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[requirements.txt-Simple text file with package specifications-environment]\": 0.002532312558263442,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[environment.yaml-cep-24]\": 0.004008450048033137,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[environment.yml-cep-24]\": 0.00422019490515826,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[explicit.txt-explicit]\": 0.003572096227254564,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[requirements.txt-requirements.txt]\": 0.0036735052805150193,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[spec.txt-requirements.txt]\": 0.0036319349901541417,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_no_match_raises_error\": 0.004140297463677919,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_pattern_matching_with_wildcard\": 0.00506857196120218,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_phase2_fallback\": 0.0036586177277967,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_with_invalid_contents\": 0.005128553647310562,\n    \"tests/plugins/test_env_specs.py::test_detect_spec_with_aliases\": 0.004665990260126761,\n    \"tests/plugins/test_env_specs.py::test_dummy_random_spec_is_registered\": 0.002475282937189776,\n    \"tests/plugins/test_env_specs.py::test_env_for_returns_requested_platform[default-single-platform]\": 0.0011854625241260323,\n    \"tests/plugins/test_env_specs.py::test_env_for_returns_requested_platform[override-multi-platform]\": 0.0011538724697177127,\n    \"tests/plugins/test_env_specs.py::test_env_for_unknown_platform_raises[default-single-platform]\": 0.001246185874671146,\n    \"tests/plugins/test_env_specs.py::test_env_for_unknown_platform_raises[override-multi-platform]\": 0.0012434651611783903,\n    \"tests/plugins/test_env_specs.py::test_env_spec_iteration_pattern[default-single-platform]\": 0.0011351324114890833,\n    \"tests/plugins/test_env_specs.py::test_env_spec_iteration_pattern[override-multi-platform]\": 0.0011450908273881715,\n    \"tests/plugins/test_env_specs.py::test_explicitly_select_a_non_autodetect_plugin\": 0.002394680503881988,\n    \"tests/plugins/test_env_specs.py::test_get_spec_by_aliases\": 0.002506990563662402,\n    \"tests/plugins/test_env_specs.py::test_naught_plugin_does_not_cause_unhandled_errors_during_detection\": 0.0026697749883478807,\n    \"tests/plugins/test_env_specs.py::test_naughty_plugin_does_not_cause_unhandled_errors\": 0.0027472794996696932,\n    \"tests/plugins/test_env_specs.py::test_raise_error_for_multiple_registered_installers\": 0.0028560634486724727,\n    \"tests/plugins/test_env_specs.py::test_raise_error_for_overlapping_default_filename\": 0.004011444259338756,\n    \"tests/plugins/test_env_specs.py::test_raises_an_error_if_file_is_unhandleable\": 0.006783942253477301,\n    \"tests/plugins/test_env_specs.py::test_raises_an_error_if_named_plugin_can_not_be_handled\": 0.0025628666892703123,\n    \"tests/plugins/test_env_specs.py::test_raises_an_error_if_no_plugins_found\": 0.002344776600940683,\n    \"tests/plugins/test_env_specs.py::test_raises_an_error_if_plugin_name_does_not_exist\": 0.002368201317589712,\n    \"tests/plugins/test_environment_export.py::test_alias_normalization_and_collision_detection\": 0.001137195057386121,\n    \"tests/plugins/test_environment_export.py::test_builtin_explicit_exporter_with_urls\": 0.007702124130126209,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[environment-json-expected_aliases1]\": 0.007073762814142505,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[environment-yaml-expected_aliases0]\": 0.007233274840786645,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[explicit-expected_aliases2]\": 0.006939301857703403,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[requirements-expected_aliases3]\": 0.00709932848999239,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[environment-json-JSON format with channels and dependencies-environment]\": 0.007165048719285125,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[environment-yaml-YAML format with channels and dependencies-environment]\": 0.007345312487532369,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[explicit-Explicit URLs for exact package reproduction (lockfile)-lockfile]\": 0.008255164162565474,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[requirements-Simple text format with package specifications-environment]\": 0.007137328017199476,\n    \"tests/plugins/test_environment_export.py::test_builtin_requirements_exporter\": 0.007145751654147254,\n    \"tests/plugins/test_environment_export.py::test_builtin_structured_exporters[environment-json-loads]\": 0.007374304548130625,\n    \"tests/plugins/test_environment_export.py::test_builtin_structured_exporters[environment-yaml-safe_load]\": 0.008985113753476048,\n    \"tests/plugins/test_environment_export.py::test_compare_export_commands[args0-explicit]\": 0.2952677794926692,\n    \"tests/plugins/test_environment_export.py::test_compare_export_commands[args1-environment-yaml]\": 0.34812802864279,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[env.unknown-None]\": 0.007330674701836435,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[environment.json-environment-json]\": 0.00720165735263874,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[environment.yaml-environment-yaml]\": 0.007048724710085001,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[environment.yml-environment-yaml]\": 0.007003445498711079,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[explicit.txt-explicit]\": 0.00689125237091269,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[my-env.yaml-None]\": 0.0072331648202266195,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[requirements.txt-requirements]\": 0.00704304957479446,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[spec.txt-requirements]\": 0.0070208163982552856,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter_with_fnmatch_pattern\": 0.007680056498828682,\n    \"tests/plugins/test_environment_export.py::test_explicit_exporter_cep23_compliance_error\": 0.007855610157522626,\n    \"tests/plugins/test_environment_export.py::test_exporter_error_conditions[explicit-test_env-Cannot export explicit format]\": 0.007169175505589483,\n    \"tests/plugins/test_environment_export.py::test_exporter_error_conditions[requirements-test_env_with_explicit_packages-Cannot export requirements format]\": 0.007843462298440478,\n    \"tests/plugins/test_environment_export.py::test_exporter_pattern_backward_compatibility\": 0.007221001427813763,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[environment-json-True]\": 0.007033773391748141,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[environment-yaml-True]\": 0.007061152285404759,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[explicit-True]\": 0.006925040359045739,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[json-True]\": 0.006958747535891723,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[reqs-True]\": 0.007019096620561143,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[requirements-True]\": 0.0072312329283756496,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[txt-True]\": 0.007984607569834538,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[unknown-False]\": 0.007218060241993214,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[yaml-True]\": 0.0069860185479953575,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[yml-True]\": 0.0069258761325215615,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporters\": 0.007074213662117938,\n    \"tests/plugins/test_environment_export.py::test_multi_platform_export\": 0.009470886913899697,\n    \"tests/plugins/test_environment_export.py::test_only_one_export[both]\": 0.0014438220576413188,\n    \"tests/plugins/test_environment_export.py::test_only_one_export[export]\": 0.0012961390884347588,\n    \"tests/plugins/test_environment_export.py::test_only_one_export[multiplatform_export]\": 0.001269917906620938,\n    \"tests/plugins/test_environment_export.py::test_only_one_export[none]\": 0.001539914769866601,\n    \"tests/plugins/test_environment_export.py::test_single_platform_export\": 0.008414334384876798,\n    \"tests/plugins/test_environment_export.py::test_yaml_exporter_explicit_packages_format\": 0.014872226984112879,\n    \"tests/plugins/test_environment_export.py::test_yaml_exporter_handles_missing_name\": 0.00783972543323287,\n    \"tests/plugins/test_environment_export.py::test_yaml_exporter_with_empty_env\": 0.008132858101480678,\n    \"tests/plugins/test_health_checks.py::test_fix_user_cancels_no_warning\": 0.024089170876621883,\n    \"tests/plugins/test_health_checks.py::test_health_check_not_ran\": 0.031085204751653203,\n    \"tests/plugins/test_health_checks.py::test_health_check_ran\": 0.024948907153475655,\n    \"tests/plugins/test_hookspec.py::test_deprecations[spec_name]\": 0.001248463239831092,\n    \"tests/plugins/test_manager.py::test_custom_plugin_name_validation\": 0.0033152718439218454,\n    \"tests/plugins/test_manager.py::test_disable_external_plugins[VerboseSolverPlugin]\": 0.003059067386415095,\n    \"tests/plugins/test_manager.py::test_disable_external_plugins[tests.plugins.test_manager]\": 0.0023359902803887886,\n    \"tests/plugins/test_manager.py::test_get_canonical_name_class\": 0.0019486435594184134,\n    \"tests/plugins/test_manager.py::test_get_canonical_name_instance\": 0.005196697434954729,\n    \"tests/plugins/test_manager.py::test_get_canonical_name_module\": 0.0027550128956217806,\n    \"tests/plugins/test_manager.py::test_get_canonical_name_object\": 0.0023748077132736824,\n    \"tests/plugins/test_manager.py::test_get_hook_results\": 0.003015771010526702,\n    \"tests/plugins/test_manager.py::test_get_request_headers\": 0.0022268811317900524,\n    \"tests/plugins/test_manager.py::test_get_session_headers\": 0.002038151608910729,\n    \"tests/plugins/test_manager.py::test_get_solvers\": 0.0021083556266642553,\n    \"tests/plugins/test_manager.py::test_get_virtual_package_records\": 0.0031434409123704014,\n    \"tests/plugins/test_manager.py::test_known_solver\": 0.002109662714618995,\n    \"tests/plugins/test_manager.py::test_load_entrypoints_blocked\": 0.006863841008557089,\n    \"tests/plugins/test_manager.py::test_load_entrypoints_importerror\": 0.00833052864416706,\n    \"tests/plugins/test_manager.py::test_load_entrypoints_register_valueerror\": 0.009917473537223706,\n    \"tests/plugins/test_manager.py::test_load_entrypoints_success\": 0.008641454316930062,\n    \"tests/plugins/test_manager.py::test_load_plugins_error\": 0.0023175647741179813,\n    \"tests/plugins/test_manager.py::test_load_two_plugins_one_impls\": 0.0022292107889819515,\n    \"tests/plugins/test_manager.py::test_load_without_plugins\": 0.0020415803554087726,\n    \"tests/plugins/test_manager.py::test_plugin_bad_names[42]\": 0.0034127478525186675,\n    \"tests/plugins/test_manager.py::test_plugin_bad_names[False]\": 0.001148867007035155,\n    \"tests/plugins/test_manager.py::test_plugin_bad_names[None]\": 0.006170085738694474,\n    \"tests/plugins/test_manager.py::test_plugin_bad_names[True]\": 0.0012135779047493809,\n    \"tests/plugins/test_manager.py::test_plugin_bad_names[name4]\": 0.0011153240422426493,\n    \"tests/plugins/test_manager.py::test_plugin_bad_names[name5]\": 0.0011108055061223045,\n    \"tests/plugins/test_manager.py::test_plugin_name\": 0.0010508518258242933,\n    \"tests/plugins/test_manager.py::test_unknown_solver\": 0.0020810363539942897,\n    \"tests/plugins/test_package_extractors.py::test_extract_package\": 0.005541769725609265,\n    \"tests/plugins/test_package_extractors.py::test_get_package_extractor[.conda-None]\": 0.0012250787063778374,\n    \"tests/plugins/test_package_extractors.py::test_get_package_extractor[.not_supported-PluginError]\": 0.0012411320324378242,\n    \"tests/plugins/test_package_extractors.py::test_get_package_extractor[.tar.bz2-None]\": 0.00123821853301981,\n    \"tests/plugins/test_package_extractors.py::test_get_package_extractors\": 0.0027374832041621873,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[-None]\": 0.0028376806629606967,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[/path/to/package.random-.random]\": 0.008039652400118615,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[package-None]\": 0.0029931738701622773,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[package.RANDOM-.random]\": 0.0027596656358788297,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[package.UPPER-.upper]\": 0.0029258320792655986,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[package.other-None]\": 0.0027573898498289007,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[package.random-.random]\": 0.0028928308552200947,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[package.upper-.upper]\": 0.0031275876249067507,\n    \"tests/plugins/test_package_extractors.py::test_plugin_fetches_correct_extractor\": 0.0036253138571618834,\n    \"tests/plugins/test_post_commands.py::test_post_command_action_raises_exception\": 0.0261281986198382,\n    \"tests/plugins/test_post_commands.py::test_post_command_invoked\": 0.02917311909433356,\n    \"tests/plugins/test_post_commands.py::test_post_command_not_invoked\": 0.027783524447364625,\n    \"tests/plugins/test_post_solves.py::test_post_solve_action_raises_exception\": 4.813503484367214,\n    \"tests/plugins/test_post_solves.py::test_post_solve_invoked\": 6.501516248409027,\n    \"tests/plugins/test_post_solves.py::test_post_solve_not_invoked\": 0.03481313893802338,\n    \"tests/plugins/test_pre_commands.py::test_pre_command_action_raises_exception\": 0.023157563208427386,\n    \"tests/plugins/test_pre_commands.py::test_pre_command_invoked\": 0.03409303570354869,\n    \"tests/plugins/test_pre_commands.py::test_pre_command_not_invoked\": 0.028443418560671632,\n    \"tests/plugins/test_pre_solves.py::test_pre_solve_action_raises_exception\": 0.026555750380309304,\n    \"tests/plugins/test_pre_solves.py::test_pre_solve_invoked\": 2.140591070266868,\n    \"tests/plugins/test_pre_solves.py::test_pre_solve_not_invoked\": 0.036218044107685456,\n    \"tests/plugins/test_reporter_backends.py::test_console_reporter_backend[detail_view-classic-argument2-\\\\n test : something\\\\n\\\\n]\": 0.002608380977922479,\n    \"tests/plugins/test_reporter_backends.py::test_console_reporter_backend[detail_view-json-argument3-{\\\\n  \\\"test\\\": \\\"something\\\"\\\\n}]\": 0.002635872646253533,\n    \"tests/plugins/test_reporter_backends.py::test_console_reporter_backend[render-classic-test-test\\\\n]\": 0.0033070115136033785,\n    \"tests/plugins/test_reporter_backends.py::test_console_reporter_backend[render-json-test-\\\"test\\\"]\": 0.0024891659416664026,\n    \"tests/plugins/test_reporter_backends.py::test_default_reporter_backends_are_registered\": 0.002760552666995777,\n    \"tests/plugins/test_reporter_backends.py::test_dummy_reporter_backend_is_registered\": 0.004062902716276539,\n    \"tests/plugins/test_request_headers.py::test_get_request_headers[example.com/endpoint.json]\": 0.002341090371731184,\n    \"tests/plugins/test_request_headers.py::test_get_request_headers[example.com/path/somewhere.txt]\": 0.0024193562921693084,\n    \"tests/plugins/test_request_headers.py::test_get_request_headers[example.com]\": 0.0023024275329028183,\n    \"tests/plugins/test_request_headers.py::test_get_request_headers[random.com/endpoint.json]\": 0.002812841844347929,\n    \"tests/plugins/test_request_headers.py::test_get_request_headers[random.com]\": 0.0023168042387762943,\n    \"tests/plugins/test_request_headers.py::test_get_session_headers[example.com/endpoint.json]\": 0.00237568770246913,\n    \"tests/plugins/test_request_headers.py::test_get_session_headers[example.com/path/somewhere.txt]\": 0.002435435771244816,\n    \"tests/plugins/test_request_headers.py::test_get_session_headers[example.com]\": 0.002483146624452604,\n    \"tests/plugins/test_request_headers.py::test_get_session_headers[random.com/endpoint.json]\": 0.0026630815254310067,\n    \"tests/plugins/test_request_headers.py::test_get_session_headers[random.com]\": 0.0023484983218261934,\n    \"tests/plugins/test_settings.py::test_conda_config_describe_includes_plugin_settings\": 0.06280620111759669,\n    \"tests/plugins/test_settings.py::test_conda_config_describe_not_included_without_plugins\": 0.06150207685389442,\n    \"tests/plugins/test_settings.py::test_conda_config_describe_unknown_plugin_setting\": 0.025686365735369754,\n    \"tests/plugins/test_settings.py::test_conda_config_retrieves_correct_description_single_setting[map_parameter-Test map type setting]\": 0.03336052165365844,\n    \"tests/plugins/test_settings.py::test_conda_config_retrieves_correct_description_single_setting[seq_parameter-Test sequence type setting]\": 0.032180724383257274,\n    \"tests/plugins/test_settings.py::test_conda_config_retrieves_correct_description_single_setting[string_parameter-Test string type setting]\": 0.03084897454377199,\n    \"tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[map_parameter-plugins:\\\\n  map_parameter: {}\\\\n]\": 0.050714658117211264,\n    \"tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[non_existent_parameter-expected_output3]\": 0.060060256313357624,\n    \"tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[seq_parameter-plugins:\\\\n  seq_parameter: []\\\\n]\": 0.05529893393584578,\n    \"tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[string_parameter-plugins:\\\\n  string_parameter: value_one\\\\n]\": 0.061058587872314864,\n    \"tests/plugins/test_settings.py::test_conda_config_show_includes_plugin_settings\": 0.10591635695869958,\n    \"tests/plugins/test_settings.py::test_conda_config_with_invalid_setting\": 0.024066861436837263,\n    \"tests/plugins/test_settings.py::test_conda_config_with_map_settings\": 0.08401385478322333,\n    \"tests/plugins/test_settings.py::test_conda_config_with_sequence_settings\": 0.07894639002214182,\n    \"tests/plugins/test_settings.py::test_conda_config_with_string_settings\": 0.07007965609249633,\n    \"tests/plugins/test_settings.py::test_get_settings\": 0.002285742243511066,\n    \"tests/plugins/test_settings.py::test_load_configuration_parameters\": 0.002570390449441786,\n    \"tests/plugins/test_settings.py::test_load_plugin_config_with_env_var\": 0.005572524150508117,\n    \"tests/plugins/test_settings.py::test_load_plugin_settings_with_condarc\": 0.006329172338350969,\n    \"tests/plugins/test_solvers.py::test_duplicated\": 0.0025405875447330204,\n    \"tests/plugins/test_solvers.py::test_get_cached_solver_backend\": 0.004473316646839541,\n    \"tests/plugins/test_solvers.py::test_get_conflicting_solvers\": 0.0025506340833145974,\n    \"tests/plugins/test_solvers.py::test_get_no_solver\": 0.0020285879393753094,\n    \"tests/plugins/test_solvers.py::test_get_one_solver\": 0.002166555514487892,\n    \"tests/plugins/test_solvers.py::test_get_solver_backend\": 0.005605648721941495,\n    \"tests/plugins/test_solvers.py::test_get_solver_backend_multiple\": 0.005902774925234382,\n    \"tests/plugins/test_solvers.py::test_get_two_solvers\": 0.0022912429451301844,\n    \"tests/plugins/test_solvers.py::test_solver_user_agent\": 0.005535777211275141,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[activate]\": 0.04090860562093447,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[clean]\": 0.029239857030719685,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[commands]\": 0.021219656367344984,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[compare]\": 0.02146773666402869,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[config]\": 0.02264419689764268,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[create]\": 0.02485319633020946,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[deactivate]\": 0.022310556697069345,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[env]\": 0.021218287533595892,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[export]\": 0.021525559798109196,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[info]\": 0.021674298291066582,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[init]\": 0.023564641365331387,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[install]\": 0.02685619244883999,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[list]\": 0.023358364379417948,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[notices]\": 0.03007034224790643,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[package]\": 0.02204998172395464,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[remove]\": 0.028534670080703015,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[rename]\": 0.026295076767960692,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[run]\": 0.02103226333620565,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[search]\": 0.022663573778118278,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[uninstall]\": 0.028418654573657453,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[update]\": 0.03662696164296597,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[upgrade]\": 0.029659630445542692,\n    \"tests/plugins/test_subcommands.py::test_custom_plugin_extend_parser\": 0.024534630247124607,\n    \"tests/plugins/test_subcommands.py::test_custom_plugin_not_extend_parser\": 0.023394260799787955,\n    \"tests/plugins/test_subcommands.py::test_duplicated\": 0.002430373592859174,\n    \"tests/plugins/test_subcommands.py::test_help\": 0.03603987856955913,\n    \"tests/plugins/test_subcommands.py::test_invoked\": 0.02772845107365046,\n    \"tests/plugins/test_subcommands.py::test_parser_no_plugins\": 0.031735806154415194,\n    \"tests/plugins/test_transaction_hooks.py::test_post_transaction_raises_exception\": 0.3582841457529259,\n    \"tests/plugins/test_transaction_hooks.py::test_pre_transaction_raises_exception\": 0.3186288046498971,\n    \"tests/plugins/test_transaction_hooks.py::test_transaction_hooks_invoked\": 0.3136877111971196,\n    \"tests/plugins/test_types.py::TestCondaEnvironmentExporter::test_backward_compatibility_without_new_fields\": 0.0010763206002121933,\n    \"tests/plugins/test_types.py::TestCondaEnvironmentExporter::test_description_defaults_to_name\": 0.0010373985466732986,\n    \"tests/plugins/test_types.py::TestCondaEnvironmentExporter::test_explicit_description_preserved\": 0.001040049005830144,\n    \"tests/plugins/test_types.py::TestCondaEnvironmentSpecifier::test_backward_compatibility_without_new_fields\": 0.0011260399216404245,\n    \"tests/plugins/test_types.py::TestCondaEnvironmentSpecifier::test_description_defaults_to_name\": 0.0011626107967821421,\n    \"tests/plugins/test_types.py::TestCondaEnvironmentSpecifier::test_explicit_description_preserved\": 0.0010806877617636032,\n    \"tests/plugins/test_virtual_packages.py::test_archspec_override[None-False]\": 0.30853914204056454,\n    \"tests/plugins/test_virtual_packages.py::test_archspec_override[bla-True]\": 0.19699790159362893,\n    \"tests/plugins/test_virtual_packages.py::test_conda_virtual_package\": 0.002785902361122927,\n    \"tests/plugins/test_virtual_packages.py::test_context_override[Both `CONDA_OVERRIDE_FOO` gets precedence and `context.override_virtual_packages` are set]\": 0.0041169997457802905,\n    \"tests/plugins/test_virtual_packages.py::test_context_override[`CONDA_OVERRIDE_FOO` not set, but `context.override_virtual_packages` is set]\": 0.0025591935939598526,\n    \"tests/plugins/test_virtual_packages.py::test_cuda_detection\": 0.3032272908410466,\n    \"tests/plugins/test_virtual_packages.py::test_cuda_override[override-empty]\": 0.004762836460576934,\n    \"tests/plugins/test_virtual_packages.py::test_cuda_override[override-set]\": 0.005601453355753958,\n    \"tests/plugins/test_virtual_packages.py::test_duplicated\": 4.839832046939496,\n    \"tests/plugins/test_virtual_packages.py::test_glibc_override[1.0-True]\": 0.0066675930606491995,\n    \"tests/plugins/test_virtual_packages.py::test_glibc_override[None-False]\": 0.006539210956964426,\n    \"tests/plugins/test_virtual_packages.py::test_invoked\": 5.9452894973323005,\n    \"tests/plugins/test_virtual_packages.py::test_linux_override[1.0-True]\": 0.006899805019821287,\n    \"tests/plugins/test_virtual_packages.py::test_linux_override[None-True]\": 0.1193853779737216,\n    \"tests/plugins/test_virtual_packages.py::test_linux_value\": 0.0065598474596888735,\n    \"tests/plugins/test_virtual_packages.py::test_no_gpu_cuda\": 0.6063622050082899,\n    \"tests/plugins/test_virtual_packages.py::test_no_gpu_cuda_patched\": 0.0011821964347124253,\n    \"tests/plugins/test_virtual_packages.py::test_osx_override[1.0-True]\": 0.007003104492070285,\n    \"tests/plugins/test_virtual_packages.py::test_osx_override[None-False]\": 0.006151386429709699,\n    \"tests/plugins/test_virtual_packages.py::test_osx_value\": 0.006143281335484862,\n    \"tests/plugins/test_virtual_packages.py::test_override_mock_calls[base case, no override]\": 0.002327003566119434,\n    \"tests/plugins/test_virtual_packages.py::test_override_mock_calls[build overriden]\": 0.0023701068928524186,\n    \"tests/plugins/test_virtual_packages.py::test_override_mock_calls[version overriden]\": 0.004142371984564389,\n    \"tests/plugins/test_virtual_packages.py::test_override_package_values[build override with `empty_override=None`]\": 0.00307509161610191,\n    \"tests/plugins/test_virtual_packages.py::test_override_package_values[build override]\": 0.002373248363613671,\n    \"tests/plugins/test_virtual_packages.py::test_override_package_values[no override]\": 0.002791916193666639,\n    \"tests/plugins/test_virtual_packages.py::test_override_package_values[version override with `empty_override=None`]\": 0.0023226687852042484,\n    \"tests/plugins/test_virtual_packages.py::test_override_package_values[version override]\": 0.002405317751067874,\n    \"tests/plugins/test_virtual_packages.py::test_package_is_NULL[`build=NULL` returns NULL package]\": 0.0016767975296044474,\n    \"tests/plugins/test_virtual_packages.py::test_package_is_NULL[`empty_override=NULL` returns NULL package]\": 0.001700063374864316,\n    \"tests/plugins/test_virtual_packages.py::test_package_is_NULL[`empty_override=None` returns valid package]\": 0.002355188420014896,\n    \"tests/plugins/test_virtual_packages.py::test_package_is_NULL[`version=NULL` returns NULL package ]\": 0.0017770220904296575,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[emscripten-wasm32]\": 0.006334335584197665,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[freebsd-64]\": 0.006398686527003692,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-32]\": 0.0062925977417356066,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-64]\": 0.006291737597333288,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-aarch64]\": 0.0061584190247832475,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-armv6l]\": 0.006178857331186172,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-armv7l]\": 0.006232094885345593,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-ppc64]\": 0.006425255412689165,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-ppc64le]\": 0.006154646136678037,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-riscv64]\": 0.006130153114370423,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-s390x]\": 0.006212856676634051,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[osx-64]\": 0.00646282830653868,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[osx-aarch64]\": 0.007269957525050506,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[osx-arm64]\": 0.006160455773267385,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[wasi-wasm32]\": 0.0058837849499934645,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[win-32]\": 0.006552387319234924,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[win-64_0]\": 0.006421763449775233,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[win-64_1]\": 0.006408226686590777,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[win-arm64]\": 0.006292570758195753,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[zos-z]\": 0.005910035487778591,\n    \"tests/plugins/test_virtual_packages.py::test_version_validation[no version validation, no override]\": 0.0022638765499623896,\n    \"tests/plugins/test_virtual_packages.py::test_version_validation[version validation, no override]\": 0.002267747711924836,\n    \"tests/plugins/test_virtual_packages.py::test_version_validation[version validation, override]\": 0.0021945885122941957,\n    \"tests/plugins/test_virtual_packages.py::test_win_override[1.0-True]\": 0.006255189395149984,\n    \"tests/plugins/test_virtual_packages.py::test_win_override[None-False]\": 0.006177566314961039,\n    \"tests/plugins/test_virtual_packages.py::test_win_value\": 0.006140888888268016,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_activate_error[cmd.exe]\": 0.0002757190412895318,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_activate_invalid_temp[cmd.exe]\": 0.00025838875186655813,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_activate_script_failure[cmd.exe]\": 0.0002832489308187234,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_basic_integration[cmd.exe]\": 0.0002705915251375697,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_deactivate_help[cmd.exe]\": 0.0002100938148262062,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_existing_env_with_special_chars[python=3.12-cmd.exe]\": 0.0002476156592806238,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_existing_env_with_special_chars[test!important!env-cmd.exe]\": 0.00024767330531057756,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[!-cmd.exe]\": 0.00025088142546866995,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[%-cmd.exe]\": 0.0002528342474169891,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[(-cmd.exe]\": 0.00025104378611371585,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[)-cmd.exe]\": 0.0002450238883538847,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[=-cmd.exe]\": 0.00024753792932958994,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[^-cmd.exe]\": 0.00024695537275057426,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[!-cmd.exe]\": 0.00024811070809053863,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[%-cmd.exe]\": 0.00024230523124972803,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[(-cmd.exe]\": 0.0002433672548136881,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[)-cmd.exe]\": 0.00026109494242533495,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[=-cmd.exe]\": 0.00024363986609416313,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[^-cmd.exe]\": 0.00024142377764380045,\n    \"tests/shell/test_cmd_exe.py::test_legacy_activate_deactivate_cmd_exe[cmd.exe]\": 0.0002492265876684566,\n    \"tests/shell/test_cmd_exe.py::test_shell_available[cmd.exe]\": 0.00034765167343097806,\n    \"tests/shell/test_csh.py::test_basic_integration[csh]\": 0.00026606820987754525,\n    \"tests/shell/test_csh.py::test_basic_integration[tcsh]\": 4.699908986279592,\n    \"tests/shell/test_csh.py::test_shell_available[csh]\": 0.00025060446887427895,\n    \"tests/shell/test_csh.py::test_shell_available[tcsh]\": 0.001651443656605567,\n    \"tests/shell/test_fish.py::test_fish_basic_integration[fish]\": 3.935855452088874,\n    \"tests/shell/test_fish.py::test_fish_disable_prompt\": 0.007372131926298451,\n    \"tests/shell/test_fish.py::test_fish_prompt_functions_in_hook\": 0.010246625259295447,\n    \"tests/shell/test_fish.py::test_shell_available[fish]\": 0.0014935453450713103,\n    \"tests/shell/test_posix.py::test_bash_activate_error[ash]\": 2.9750617333485665,\n    \"tests/shell/test_posix.py::test_bash_activate_error[bash]\": 2.9861894456572036,\n    \"tests/shell/test_posix.py::test_bash_activate_error[dash]\": 2.996701037908551,\n    \"tests/shell/test_posix.py::test_bash_activate_error[zsh]\": 2.987968679812541,\n    \"tests/shell/test_posix.py::test_basic_integration[ash]\": 11.658359650516354,\n    \"tests/shell/test_posix.py::test_basic_integration[bash]\": 11.801596251834567,\n    \"tests/shell/test_posix.py::test_basic_integration[dash]\": 11.736583497798055,\n    \"tests/shell/test_posix.py::test_basic_integration[zsh]\": 11.730960503499771,\n    \"tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[ash]\": 0.0003074748927198717,\n    \"tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[bash]\": 4.184030042596123,\n    \"tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[dash]\": 0.00028503156073865775,\n    \"tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[zsh]\": 4.182428865787616,\n    \"tests/shell/test_posix.py::test_shell_available[ash]\": 0.0013666134315093539,\n    \"tests/shell/test_posix.py::test_shell_available[bash]\": 0.0013848119969013901,\n    \"tests/shell/test_posix.py::test_shell_available[dash]\": 0.0014527073033926705,\n    \"tests/shell/test_posix.py::test_shell_available[zsh]\": 0.0014686696766583699,\n    \"tests/shell/test_powershell.py::test_powershell_PATH_management[powershell]\": 6.718555618370897,\n    \"tests/shell/test_powershell.py::test_powershell_basic_integration[powershell]\": 10.738129188602004,\n    \"tests/shell/test_powershell.py::test_shell_available[powershell]\": 0.0016986388569618374,\n    \"tests/shell/test_shell.py::test_activate_deactivate_modify_path[ash]\": 3.115387239814177,\n    \"tests/shell/test_shell.py::test_activate_deactivate_modify_path[bash]\": 2.8898112117362484,\n    \"tests/shell/test_shell.py::test_activate_deactivate_modify_path[cmd.exe]\": 0.0003132335716917123,\n    \"tests/shell/test_shell.py::test_activate_deactivate_modify_path[dash]\": 2.908230849850572,\n    \"tests/shell/test_shell.py::test_activate_deactivate_modify_path[zsh]\": 3.240766943324675,\n    \"tests/shell/test_shell.py::test_stacking[0-None-base-base,sys]\": 4.9600775339760235,\n    \"tests/shell/test_shell.py::test_stacking[0-None-has-has,sys]\": 4.93731091753176,\n    \"tests/shell/test_shell.py::test_stacking[0-None-not-sys]\": 4.164443413529032,\n    \"tests/shell/test_shell.py::test_stacking[0-base-base-base,sys]\": 4.080903008686615,\n    \"tests/shell/test_shell.py::test_stacking[0-base-has-has,sys]\": 4.3601758982140835,\n    \"tests/shell/test_shell.py::test_stacking[0-base-not-sys]\": 4.194962187123114,\n    \"tests/shell/test_shell.py::test_stacking[0-has-base-base,sys]\": 4.0339091281648765,\n    \"tests/shell/test_shell.py::test_stacking[0-has-has-has,sys]\": 4.025143777449183,\n    \"tests/shell/test_shell.py::test_stacking[0-has-not-sys]\": 4.026235856045398,\n    \"tests/shell/test_shell.py::test_stacking[0-not-base-base,sys]\": 4.026024007172485,\n    \"tests/shell/test_shell.py::test_stacking[0-not-has-has,sys]\": 4.0312394049302736,\n    \"tests/shell/test_shell.py::test_stacking[0-not-not-sys]\": 4.021571663660164,\n    \"tests/shell/test_shell.py::test_stacking[5-base,has-base-base,has,base,sys]\": 4.407488425479541,\n    \"tests/shell/test_shell.py::test_stacking[5-base,has-has-has,base,sys]\": 4.4149899020132874,\n    \"tests/shell/test_shell.py::test_stacking[5-base,has-not-has,base,sys]\": 4.43313697703368,\n    \"tests/shell/test_shell.py::test_stacking[5-base,not-base-base,base,sys]\": 4.45043732585711,\n    \"tests/shell/test_shell.py::test_stacking[5-base,not-has-has,base,sys]\": 4.424022261452375,\n    \"tests/shell/test_shell.py::test_stacking[5-base,not-not-base,sys]\": 4.41510036626028,\n    \"tests/shell/test_shell.py::test_stacking[5-base-base-base,sys]\": 4.00402932244562,\n    \"tests/shell/test_shell.py::test_stacking[5-base-has-has,base,sys]\": 4.028904493164292,\n    \"tests/shell/test_shell.py::test_stacking[5-base-not-base,sys]\": 4.037864627066369,\n    \"tests/shell/test_shell.py::test_stacking[5-has-base-base,has,sys]\": 4.021456022334337,\n    \"tests/shell/test_shell.py::test_stacking[5-has-has-has,sys]\": 4.048229010648598,\n    \"tests/shell/test_shell.py::test_stacking[5-has-not-has,sys]\": 4.006034742105938,\n    \"tests/shell/test_shell.py::test_stacking[5-not-base-base,sys]\": 3.999007177292978,\n    \"tests/shell/test_shell.py::test_stacking[5-not-has-has,sys]\": 4.024649452762144,\n    \"tests/shell/test_shell.py::test_stacking[5-not-not-sys]\": 4.027052465729626,\n    \"tests/shell/test_xonsh.py::test_basic_integration[xonsh]\": 6.768625867986829,\n    \"tests/shell/test_xonsh.py::test_shell_available[xonsh]\": 0.0014010592556677878,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-clang64 legacy]\": 0.00037560305398327,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-clang64 mingw64]\": 0.00029509809083560985,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-legacy]\": 0.0002517524953495725,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-mingw64 legacy]\": 0.00026915956592870455,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-nothing]\": 0.0002669085214057023,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-ucrt64 clang64]\": 0.0027662931274000037,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-ucrt64 legacy]\": 0.00024617956347299967,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-ucrt64]\": 0.0002512659174695968,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-clang64 legacy]\": 0.00028147543153198435,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-clang64 mingw64]\": 0.0002567493429967707,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-legacy]\": 0.0002527314147512803,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-mingw64 legacy]\": 0.0003626737309965369,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-nothing]\": 0.00025865057569770264,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-ucrt64 clang64]\": 0.00026511763348026476,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-ucrt64 legacy]\": 0.00024775526780844957,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-ucrt64]\": 0.0002538737180401641,\n    \"tests/test_activate.py::test_PS1\": 0.01257637144100282,\n    \"tests/test_activate.py::test_PS1_no_changeps1\": 0.00986341999616107,\n    \"tests/test_activate.py::test_activate_and_deactivate_for_uninitialized_env\": 0.06580752272534651,\n    \"tests/test_activate.py::test_activate_default_env[CmdExeActivator]\": 1.2217187317888216,\n    \"tests/test_activate.py::test_activate_default_env[CshActivator]\": 1.209510349036802,\n    \"tests/test_activate.py::test_activate_default_env[FishActivator]\": 1.2091160206730813,\n    \"tests/test_activate.py::test_activate_default_env[PosixActivator]\": 1.217969950150427,\n    \"tests/test_activate.py::test_activate_default_env[PowerShellActivator]\": 1.2063337446156217,\n    \"tests/test_activate.py::test_activate_default_env[XonshActivator]\": 1.2116621335721431,\n    \"tests/test_activate.py::test_activate_environment_not_found\": 0.005603471233807239,\n    \"tests/test_activate.py::test_activate_same_environment\": 0.0068309284502825855,\n    \"tests/test_activate.py::test_activator_invalid_command_arguments[command_args0-'activate', 'deactivate', 'hook', 'commands', or 'reactivate' command must be given.]\": 0.004931348635818913,\n    \"tests/test_activate.py::test_activator_invalid_command_arguments[command_args1-cannot specify both --stack and --no-stack to activate]\": 0.00490800366124057,\n    \"tests/test_activate.py::test_activator_invalid_command_arguments[command_args2-activate does not accept more than one argument:\\\\n\\\\\\\\['env-one', 'env-two'\\\\\\\\]\\\\n]\": 0.004892130398672467,\n    \"tests/test_activate.py::test_activator_invalid_command_arguments[command_args3-deactivate does not accept arguments\\\\nremainder_args: \\\\\\\\['env-one']\\\\n]\": 0.004841350732439253,\n    \"tests/test_activate.py::test_add_prefix_to_path_cmdexe\": 0.000275128564505309,\n    \"tests/test_activate.py::test_add_prefix_to_path_posix\": 0.0044025462068980215,\n    \"tests/test_activate.py::test_build_activate_dont_activate_unset_var\": 0.006947657436790896,\n    \"tests/test_activate.py::test_build_activate_dont_use_PATH\": 0.006617192105197718,\n    \"tests/test_activate.py::test_build_activate_restore_unset_env_vars\": 0.007720130086511404,\n    \"tests/test_activate.py::test_build_activate_shlvl_0\": 0.006682712353841829,\n    \"tests/test_activate.py::test_build_activate_shlvl_1\": 0.00852596766826539,\n    \"tests/test_activate.py::test_build_activate_shlvl_warn_clobber_vars\": 0.007081175283984594,\n    \"tests/test_activate.py::test_build_deactivate_dont_use_PATH\": 0.0073770535363994905,\n    \"tests/test_activate.py::test_build_deactivate_shlvl_1\": 0.006547875390013069,\n    \"tests/test_activate.py::test_build_deactivate_shlvl_2_from_activate\": 0.0073018133379556234,\n    \"tests/test_activate.py::test_build_deactivate_shlvl_2_from_stack\": 0.0073430594517387045,\n    \"tests/test_activate.py::test_build_stack_shlvl_1\": 0.008413003405107788,\n    \"tests/test_activate.py::test_cmd_exe_basic[False]\": 0.00026051166801541105,\n    \"tests/test_activate.py::test_cmd_exe_basic[True]\": 0.00027432360648541705,\n    \"tests/test_activate.py::test_csh_basic[False]\": 0.014299691431751107,\n    \"tests/test_activate.py::test_csh_basic[True]\": 0.015241886273125184,\n    \"tests/test_activate.py::test_default_env\": 0.005257179891366992,\n    \"tests/test_activate.py::test_fish_basic[False]\": 0.013929954346395565,\n    \"tests/test_activate.py::test_fish_basic[True]\": 0.013989380172300215,\n    \"tests/test_activate.py::test_force_uppercase[False]\": 0.007737206699364419,\n    \"tests/test_activate.py::test_force_uppercase[True]\": 0.008033648832415126,\n    \"tests/test_activate.py::test_get_env_vars_big_whitespace\": 0.0057596095654869435,\n    \"tests/test_activate.py::test_get_env_vars_empty_file\": 0.005647867085822008,\n    \"tests/test_activate.py::test_get_export_unset_vars[False]\": 0.009792097798477662,\n    \"tests/test_activate.py::test_get_export_unset_vars[True]\": 0.015757541480591733,\n    \"tests/test_activate.py::test_json_basic[False]\": 0.014619591666521495,\n    \"tests/test_activate.py::test_json_basic[True]\": 0.014724928308399516,\n    \"tests/test_activate.py::test_metavars_force_uppercase[False]\": 0.008004573512074406,\n    \"tests/test_activate.py::test_metavars_force_uppercase[True]\": 0.00794952795226384,\n    \"tests/test_activate.py::test_msys2_shell_line_endings[ash]\": 0.00023695118508538455,\n    \"tests/test_activate.py::test_msys2_shell_line_endings[bash]\": 0.00024100851791814494,\n    \"tests/test_activate.py::test_msys2_shell_line_endings[dash]\": 0.0002397086264109911,\n    \"tests/test_activate.py::test_msys2_shell_line_endings[posix]\": 0.000255466893673744,\n    \"tests/test_activate.py::test_msys2_shell_line_endings[zsh]\": 0.0002469206276776454,\n    \"tests/test_activate.py::test_msys2_shell_stdout_reconfiguration\": 0.0003662958634356398,\n    \"tests/test_activate.py::test_posix_basic[False]\": 0.014374061463549293,\n    \"tests/test_activate.py::test_posix_basic[True]\": 0.015021176727394654,\n    \"tests/test_activate.py::test_powershell_basic[False]\": 0.013986991810592767,\n    \"tests/test_activate.py::test_powershell_basic[True]\": 0.014125797381503678,\n    \"tests/test_activate.py::test_pre_post_command_invoked[activate]\": 0.007429519855396486,\n    \"tests/test_activate.py::test_pre_post_command_invoked[deactivate]\": 0.007017591091701769,\n    \"tests/test_activate.py::test_pre_post_command_invoked[hook]\": 0.006822139797026211,\n    \"tests/test_activate.py::test_pre_post_command_invoked[reactivate]\": 0.00689673331051069,\n    \"tests/test_activate.py::test_pre_post_command_raises[activate]\": 0.007041152957090806,\n    \"tests/test_activate.py::test_pre_post_command_raises[deactivate]\": 0.006752211780069286,\n    \"tests/test_activate.py::test_pre_post_command_raises[hook]\": 0.007089156723747949,\n    \"tests/test_activate.py::test_pre_post_command_raises[reactivate]\": 0.00894642081017698,\n    \"tests/test_activate.py::test_remove_prefix_from_path_1\": 0.004398256587737678,\n    \"tests/test_activate.py::test_remove_prefix_from_path_2\": 0.004449895845175167,\n    \"tests/test_activate.py::test_replace_prefix_in_path_1\": 0.004467268719880712,\n    \"tests/test_activate.py::test_replace_prefix_in_path_2\": 0.000271204478085099,\n    \"tests/test_activate.py::test_xonsh_basic[False]\": 0.013859434120802644,\n    \"tests/test_activate.py::test_xonsh_basic[True]\": 0.013999406343415935,\n    \"tests/test_api.py::test_DepsModifier_contract\": 0.001165945921243211,\n    \"tests/test_api.py::test_PackageCacheData_contract\": 0.0013387573573271094,\n    \"tests/test_api.py::test_PackageCacheData_return_value_contract\": 0.009109349485400526,\n    \"tests/test_api.py::test_PrefixData_contract\": 0.0012634629625047074,\n    \"tests/test_api.py::test_PrefixData_return_value_contract\": 0.07129769978705276,\n    \"tests/test_api.py::test_Solver_inputs_contract\": 0.0015129402627274044,\n    \"tests/test_api.py::test_Solver_return_value_contract\": 6.098430470238697,\n    \"tests/test_api.py::test_SubdirData_contract\": 0.0012906627085571306,\n    \"tests/test_api.py::test_SubdirData_return_value_contract\": 3.5914924481837542,\n    \"tests/test_api.py::test_UpdateModifier_contract\": 0.0010845977040302916,\n    \"tests/test_codesigned.py::test_stub_exe_signatures[shell/cli-32.exe]\": 0.0002746500370168306,\n    \"tests/test_codesigned.py::test_stub_exe_signatures[shell/cli-64.exe0]\": 0.000250469234977922,\n    \"tests/test_codesigned.py::test_stub_exe_signatures[shell/cli-64.exe1]\": 0.0002632414451179064,\n    \"tests/test_create.py::test_allow_softlinks[classic]\": 0.6362527874714633,\n    \"tests/test_create.py::test_allow_softlinks[libmamba]\": 0.6070236385859891,\n    \"tests/test_create.py::test_channel_usage_replacing_python[classic]\": 132.9994430013175,\n    \"tests/test_create.py::test_channel_usage_replacing_python[libmamba]\": 99.01489563284825,\n    \"tests/test_create.py::test_clone_env_with_conda[classic]\": 121.88180088810869,\n    \"tests/test_create.py::test_clone_env_with_conda[libmamba]\": 19.654123979310498,\n    \"tests/test_create.py::test_clone_offline_simple[classic]\": 0.9093205019895563,\n    \"tests/test_create.py::test_clone_offline_simple[libmamba]\": 0.3703806231035762,\n    \"tests/test_create.py::test_clone_offline_with_untracked[classic]\": 1.0601484052061323,\n    \"tests/test_create.py::test_clone_offline_with_untracked[libmamba]\": 0.9065446717636978,\n    \"tests/test_create.py::test_compile_pyc[classic-False]\": 13.402671090285844,\n    \"tests/test_create.py::test_compile_pyc[classic-True]\": 1.2171723669253574,\n    \"tests/test_create.py::test_compile_pyc[libmamba-False]\": 6.190363895184335,\n    \"tests/test_create.py::test_compile_pyc[libmamba-True]\": 1.180388474264244,\n    \"tests/test_create.py::test_conda_pip_interop_compatible_release_operator[classic]\": 23.451853133197517,\n    \"tests/test_create.py::test_conda_pip_interop_compatible_release_operator[libmamba]\": 6.965816801888319,\n    \"tests/test_create.py::test_conda_pip_interop_conda_editable_package[classic]\": 22.839180540827105,\n    \"tests/test_create.py::test_conda_pip_interop_conda_editable_package[libmamba]\": 15.683014856773257,\n    \"tests/test_create.py::test_conda_pip_interop_pip_clobbers_conda[classic]\": 24.711771624253366,\n    \"tests/test_create.py::test_conda_pip_interop_pip_clobbers_conda[libmamba]\": 10.230250710535937,\n    \"tests/test_create.py::test_conda_update_package_is_not_name_only_spec[classic]\": 0.03916039323419066,\n    \"tests/test_create.py::test_conda_update_package_is_not_name_only_spec[libmamba]\": 0.04245599441364435,\n    \"tests/test_create.py::test_conda_update_package_not_installed[classic]\": 0.05033758441054148,\n    \"tests/test_create.py::test_conda_update_package_not_installed[libmamba]\": 0.10780151352580454,\n    \"tests/test_create.py::test_create_default_packages[classic]\": 0.73172375464921,\n    \"tests/test_create.py::test_create_default_packages[libmamba]\": 0.7323067952907562,\n    \"tests/test_create.py::test_create_default_packages_no_default_packages[classic]\": 0.7513976870385545,\n    \"tests/test_create.py::test_create_default_packages_no_default_packages[libmamba]\": 0.4921666771602693,\n    \"tests/test_create.py::test_create_download_only_without_prefix[classic]\": 0.2600972660206114,\n    \"tests/test_create.py::test_create_download_only_without_prefix[libmamba]\": 0.2563801717872074,\n    \"tests/test_create.py::test_create_dry_run[classic]\": 9.967774089711227,\n    \"tests/test_create.py::test_create_dry_run[libmamba]\": 2.510865624306749,\n    \"tests/test_create.py::test_create_dry_run_json[classic]\": 9.684707116299672,\n    \"tests/test_create.py::test_create_dry_run_json[libmamba]\": 1.3609356321721193,\n    \"tests/test_create.py::test_create_dry_run_without_prefix[classic]\": 0.2515811364728348,\n    \"tests/test_create.py::test_create_dry_run_without_prefix[libmamba]\": 0.1823583348701695,\n    \"tests/test_create.py::test_create_dry_run_yes_safety[classic]\": 0.030683450026713823,\n    \"tests/test_create.py::test_create_dry_run_yes_safety[libmamba]\": 0.02457753551151973,\n    \"tests/test_create.py::test_create_empty_env[classic]\": 0.22516078872615386,\n    \"tests/test_create.py::test_create_empty_env[libmamba]\": 0.9780833190153897,\n    \"tests/test_create.py::test_create_env_different_platform[classic-cli]\": 0.8395169977673624,\n    \"tests/test_create.py::test_create_env_different_platform[classic-env]\": 0.804140444870648,\n    \"tests/test_create.py::test_create_env_different_platform[libmamba-cli]\": 0.5345572422694747,\n    \"tests/test_create.py::test_create_env_different_platform[libmamba-env]\": 0.7121381269620648,\n    \"tests/test_create.py::test_create_files_without_name_or_prefix_raises[classic]\": 0.04054401986812093,\n    \"tests/test_create.py::test_create_files_without_name_or_prefix_raises[libmamba]\": 0.028706579109290992,\n    \"tests/test_create.py::test_create_install_update_remove_smoketest[classic]\": 296.8856950580569,\n    \"tests/test_create.py::test_create_install_update_remove_smoketest[libmamba]\": 37.1486312782521,\n    \"tests/test_create.py::test_create_multiple_files_requires_name_or_prefix[classic]\": 0.04565333112684195,\n    \"tests/test_create.py::test_create_multiple_files_requires_name_or_prefix[libmamba]\": 0.027158544501761153,\n    \"tests/test_create.py::test_create_multiple_files_with_cli_prefix[classic]\": 0.7687519964915255,\n    \"tests/test_create.py::test_create_multiple_files_with_cli_prefix[libmamba]\": 0.6714977812599114,\n    \"tests/test_create.py::test_create_name_overrides_file[classic]\": 0.7500367977858964,\n    \"tests/test_create.py::test_create_name_overrides_file[libmamba]\": 0.6803922164812448,\n    \"tests/test_create.py::test_create_no_deps_flag[classic]\": 0.36019438488769245,\n    \"tests/test_create.py::test_create_no_deps_flag[libmamba]\": 0.21826476902798667,\n    \"tests/test_create.py::test_create_only_deps_flag[classic]\": 1.5996671126913575,\n    \"tests/test_create.py::test_create_only_deps_flag[libmamba]\": 1.698710185213726,\n    \"tests/test_create.py::test_create_override_channels_enabled[classic]\": 0.8731051065264152,\n    \"tests/test_create.py::test_create_override_channels_enabled[libmamba]\": 1.5440090081512219,\n    \"tests/test_create.py::test_create_with_clone_and_file_raises_argument_error[classic]\": 0.043131870573961964,\n    \"tests/test_create.py::test_create_with_clone_and_file_raises_argument_error[libmamba]\": 0.033172431375867194,\n    \"tests/test_create.py::test_create_with_clone_and_packages_raises_argument_error[classic]\": 0.06039938848048421,\n    \"tests/test_create.py::test_create_with_clone_and_packages_raises_argument_error[libmamba]\": 0.027046853423474067,\n    \"tests/test_create.py::test_create_with_env_variables_are_set_correctly[classic]\": 0.7333193004052442,\n    \"tests/test_create.py::test_create_with_env_variables_are_set_correctly[libmamba]\": 0.6745285042041927,\n    \"tests/test_create.py::test_create_without_prefix_raises_argument_error[classic]\": 0.0369622113494182,\n    \"tests/test_create.py::test_create_without_prefix_raises_argument_error[libmamba]\": 0.027215994362467785,\n    \"tests/test_create.py::test_cross_channel_incompatibility[classic]\": 100.40833434683691,\n    \"tests/test_create.py::test_cross_channel_incompatibility[libmamba]\": 4.33149511169624,\n    \"tests/test_create.py::test_directory_not_a_conda_environment[classic]\": 0.03464717964814406,\n    \"tests/test_create.py::test_directory_not_a_conda_environment[libmamba]\": 0.02703930772106069,\n    \"tests/test_create.py::test_disallowed_packages[classic]\": 17.541150721490826,\n    \"tests/test_create.py::test_disallowed_packages[libmamba]\": 1.7333829029572199,\n    \"tests/test_create.py::test_dont_allow_mixed_file_arguments[classic-create]\": 0.0368733649345548,\n    \"tests/test_create.py::test_dont_allow_mixed_file_arguments[classic-install]\": 0.03663041440503563,\n    \"tests/test_create.py::test_dont_allow_mixed_file_arguments[classic-update]\": 0.035880332288755756,\n    \"tests/test_create.py::test_dont_allow_mixed_file_arguments[libmamba-create]\": 0.030225995159575875,\n    \"tests/test_create.py::test_dont_allow_mixed_file_arguments[libmamba-install]\": 0.029886811924251307,\n    \"tests/test_create.py::test_dont_allow_mixed_file_arguments[libmamba-update]\": 0.02921932403593447,\n    \"tests/test_create.py::test_dont_remove_conda_1[classic]\": 210.86017730000833,\n    \"tests/test_create.py::test_dont_remove_conda_1[libmamba]\": 20.402659282645768,\n    \"tests/test_create.py::test_dont_remove_conda_2[classic]\": 209.7348954034826,\n    \"tests/test_create.py::test_dont_remove_conda_2[libmamba]\": 13.94685412038798,\n    \"tests/test_create.py::test_dont_remove_conda_3[classic]\": 160.8997120479734,\n    \"tests/test_create.py::test_dont_remove_conda_3[libmamba]\": 28.484435295508526,\n    \"tests/test_create.py::test_download_only_flag[classic]\": 8.28113184464552,\n    \"tests/test_create.py::test_download_only_flag[libmamba]\": 2.3867672227988463,\n    \"tests/test_create.py::test_force_remove[classic]\": 53.89722672965113,\n    \"tests/test_create.py::test_force_remove[libmamba]\": 3.0559650067180337,\n    \"tests/test_create.py::test_install_bound_virtual_package[classic]\": 0.5446476999825896,\n    \"tests/test_create.py::test_install_bound_virtual_package[libmamba]\": 1.2442438494393775,\n    \"tests/test_create.py::test_install_broken_post_install_keeps_existing_folders[classic]\": 1.997780107185512,\n    \"tests/test_create.py::test_install_broken_post_install_keeps_existing_folders[libmamba]\": 2.1728853280257927,\n    \"tests/test_create.py::test_install_force_reinstall_flag[classic]\": 0.31709206220336417,\n    \"tests/test_create.py::test_install_force_reinstall_flag[libmamba]\": 0.2812009577388183,\n    \"tests/test_create.py::test_install_multiple_files_with_cli_prefix[classic]\": 1.307602774955734,\n    \"tests/test_create.py::test_install_multiple_files_with_cli_prefix[libmamba]\": 1.2370681511393509,\n    \"tests/test_create.py::test_install_only_deps_flag[classic]\": 0.7169924441198129,\n    \"tests/test_create.py::test_install_only_deps_flag[libmamba]\": 0.6596789025276522,\n    \"tests/test_create.py::test_install_prune_flag[classic]\": 81.50841869615132,\n    \"tests/test_create.py::test_install_prune_flag[libmamba]\": 9.626034455647746,\n    \"tests/test_create.py::test_install_python_and_search[classic]\": 78.43490727618291,\n    \"tests/test_create.py::test_install_python_and_search[libmamba]\": 17.086344897399016,\n    \"tests/test_create.py::test_install_tarball_from_file_based_channel[classic]\": 0.5843234596504333,\n    \"tests/test_create.py::test_install_tarball_from_file_based_channel[libmamba]\": 1.49095331466977,\n    \"tests/test_create.py::test_install_update_deps_flag[classic]\": 1.2809596313297202,\n    \"tests/test_create.py::test_install_update_deps_flag[libmamba]\": 1.0177977101794111,\n    \"tests/test_create.py::test_install_update_deps_only_deps_flags[classic]\": 1.4115278929655928,\n    \"tests/test_create.py::test_install_update_deps_only_deps_flags[libmamba]\": 1.3937301303665557,\n    \"tests/test_create.py::test_install_virtual_packages[classic-__glibc-True]\": 0.24456715084884545,\n    \"tests/test_create.py::test_install_virtual_packages[classic-__linux-True]\": 0.24347737013425674,\n    \"tests/test_create.py::test_install_virtual_packages[classic-__osx-False]\": 1.5922913889101393,\n    \"tests/test_create.py::test_install_virtual_packages[classic-__unix-True]\": 0.44504438901758275,\n    \"tests/test_create.py::test_install_virtual_packages[classic-__win-False]\": 0.7828461885198973,\n    \"tests/test_create.py::test_install_virtual_packages[libmamba-__glibc-True]\": 0.9880426482283977,\n    \"tests/test_create.py::test_install_virtual_packages[libmamba-__linux-True]\": 0.9567938929291093,\n    \"tests/test_create.py::test_install_virtual_packages[libmamba-__osx-False]\": 0.9264361308735889,\n    \"tests/test_create.py::test_install_virtual_packages[libmamba-__unix-True]\": 0.9649324114499144,\n    \"tests/test_create.py::test_install_virtual_packages[libmamba-__win-False]\": 0.9760822860310012,\n    \"tests/test_create.py::test_json_create_install_update_remove[classic]\": 102.89431382583017,\n    \"tests/test_create.py::test_json_create_install_update_remove[libmamba]\": 9.366707822095833,\n    \"tests/test_create.py::test_list_with_pip_no_binary[classic]\": 13.63465441709785,\n    \"tests/test_create.py::test_list_with_pip_no_binary[libmamba]\": 6.7847447500155855,\n    \"tests/test_create.py::test_list_with_pip_wheel[classic]\": 24.750846646212352,\n    \"tests/test_create.py::test_list_with_pip_wheel[libmamba]\": 13.141381511707594,\n    \"tests/test_create.py::test_menuinst_v2[classic]\": 2.61299045489916,\n    \"tests/test_create.py::test_menuinst_v2[libmamba]\": 2.5543993300472794,\n    \"tests/test_create.py::test_mix_explicit_and_packages[classic-create]\": 0.08635883349569608,\n    \"tests/test_create.py::test_mix_explicit_and_packages[classic-install]\": 0.03973940942143419,\n    \"tests/test_create.py::test_mix_explicit_and_packages[libmamba-create]\": 0.0763036931832976,\n    \"tests/test_create.py::test_mix_explicit_and_packages[libmamba-install]\": 0.0316982620666756,\n    \"tests/test_create.py::test_mix_explicit_file_and_packages[classic-create]\": 0.32464640490079044,\n    \"tests/test_create.py::test_mix_explicit_file_and_packages[classic-install]\": 0.24975715603577514,\n    \"tests/test_create.py::test_mix_explicit_file_and_packages[libmamba-create]\": 0.31754420400317923,\n    \"tests/test_create.py::test_mix_explicit_file_and_packages[libmamba-install]\": 0.2632110433724596,\n    \"tests/test_create.py::test_must_provide_args_to_install[classic]\": 0.041418917807928855,\n    \"tests/test_create.py::test_must_provide_args_to_install[libmamba]\": 0.024411007973580947,\n    \"tests/test_create.py::test_neutering_of_historic_specs[classic]\": 124.43172329737241,\n    \"tests/test_create.py::test_neutering_of_historic_specs[libmamba]\": 12.7485280136003,\n    \"tests/test_create.py::test_no_channels[classic]\": 0.039469680366812476,\n    \"tests/test_create.py::test_no_channels[libmamba]\": 0.03238131307740386,\n    \"tests/test_create.py::test_noarch_generic_package[classic]\": 0.35180956406065395,\n    \"tests/test_create.py::test_noarch_generic_package[libmamba]\": 0.24567798603006946,\n    \"tests/test_create.py::test_noarch_python_package_reinstall_on_pyver_change[classic]\": 24.388155506733415,\n    \"tests/test_create.py::test_noarch_python_package_reinstall_on_pyver_change[libmamba]\": 10.9322982036311,\n    \"tests/test_create.py::test_noarch_python_package_with_entry_points[classic]\": 67.86975205611739,\n    \"tests/test_create.py::test_noarch_python_package_with_entry_points[libmamba]\": 8.424052819119554,\n    \"tests/test_create.py::test_noarch_python_package_without_entry_points[classic]\": 64.01923474767578,\n    \"tests/test_create.py::test_noarch_python_package_without_entry_points[libmamba]\": 7.407020314261999,\n    \"tests/test_create.py::test_nonadmin_file_untouched[classic]\": 1.2929956761971035,\n    \"tests/test_create.py::test_nonadmin_file_untouched[libmamba]\": 1.2738949469683483,\n    \"tests/test_create.py::test_not_writable_env_raises_EnvironmentNotWritableError[classic]\": 0.04049421088791392,\n    \"tests/test_create.py::test_not_writable_env_raises_EnvironmentNotWritableError[libmamba]\": 0.03253048719863208,\n    \"tests/test_create.py::test_offline_with_empty_index_cache[classic]\": 8.776932744556227,\n    \"tests/test_create.py::test_offline_with_empty_index_cache[libmamba]\": 4.874281120790956,\n    \"tests/test_create.py::test_override_channels_disabled[classic]\": 0.09742053323417003,\n    \"tests/test_create.py::test_override_channels_disabled[libmamba]\": 0.08744609334074838,\n    \"tests/test_create.py::test_package_cache_regression[classic]\": 0.5597425565108113,\n    \"tests/test_create.py::test_package_cache_regression[libmamba]\": 0.3634330723959988,\n    \"tests/test_create.py::test_package_optional_pinning[classic]\": 1.2834309364959995,\n    \"tests/test_create.py::test_package_optional_pinning[libmamba]\": 1.1982888863273502,\n    \"tests/test_create.py::test_package_pinning[classic]\": 1.498916586329335,\n    \"tests/test_create.py::test_package_pinning[libmamba]\": 1.7132631215199305,\n    \"tests/test_create.py::test_packages_not_found[classic]\": 0.43974999975083134,\n    \"tests/test_create.py::test_packages_not_found[libmamba]\": 1.827228623543867,\n    \"tests/test_create.py::test_pinned_override_with_explicit_spec[classic]\": 1.3351376235995343,\n    \"tests/test_create.py::test_pinned_override_with_explicit_spec[libmamba]\": 0.5555809172131673,\n    \"tests/test_create.py::test_post_link_run_in_env[classic]\": 1.5891120701973407,\n    \"tests/test_create.py::test_post_link_run_in_env[libmamba]\": 1.63174321289306,\n    \"tests/test_create.py::test_python_site_packages_path[classic]\": 1.8913823412648478,\n    \"tests/test_create.py::test_python_site_packages_path[libmamba]\": 1.7598507900692542,\n    \"tests/test_create.py::test_remove_empty_env[classic]\": 0.6211746056225124,\n    \"tests/test_create.py::test_remove_empty_env[libmamba]\": 1.26537102143661,\n    \"tests/test_create.py::test_remove_force_remove_flag[classic]\": 14.282933545901104,\n    \"tests/test_create.py::test_remove_force_remove_flag[libmamba]\": 6.419412667575489,\n    \"tests/test_create.py::test_remove_ignore_nonenv[classic]\": 0.04810432889069138,\n    \"tests/test_create.py::test_remove_ignore_nonenv[libmamba]\": 0.033685267139389054,\n    \"tests/test_create.py::test_remove_spellcheck[classic]\": 0.7666477789790757,\n    \"tests/test_create.py::test_remove_spellcheck[libmamba]\": 0.6911626503595206,\n    \"tests/test_create.py::test_repodata_v2_base_url[classic]\": 0.8529722797993181,\n    \"tests/test_create.py::test_repodata_v2_base_url[libmamba]\": 0.785309774088213,\n    \"tests/test_create.py::test_rm_rf[classic]\": 11.970094328326411,\n    \"tests/test_create.py::test_rm_rf[libmamba]\": 5.839943331961613,\n    \"tests/test_create.py::test_run_preserves_arguments[classic]\": 16.048945192182988,\n    \"tests/test_create.py::test_run_preserves_arguments[libmamba]\": 6.729138616679156,\n    \"tests/test_create.py::test_run_script_called[classic]\": 7.008054362125925,\n    \"tests/test_create.py::test_run_script_called[libmamba]\": 1.8286937233535647,\n    \"tests/test_create.py::test_safety_checks_disabled[classic]\": 11.878295766370817,\n    \"tests/test_create.py::test_safety_checks_disabled[libmamba]\": 5.892576524397501,\n    \"tests/test_create.py::test_safety_checks_enabled[classic]\": 13.408637843292805,\n    \"tests/test_create.py::test_safety_checks_enabled[libmamba]\": 4.297221334386333,\n    \"tests/test_create.py::test_safety_checks_warn[classic]\": 14.470353189621965,\n    \"tests/test_create.py::test_safety_checks_warn[libmamba]\": 7.690238217132217,\n    \"tests/test_create.py::test_search_override_channels_enabled[classic]\": 0.22019135382359956,\n    \"tests/test_create.py::test_search_override_channels_enabled[libmamba]\": 1.389706531386132,\n    \"tests/test_create.py::test_shortcut_absent_does_not_barf_on_uninstall[classic]\": 11.782742806830777,\n    \"tests/test_create.py::test_shortcut_absent_does_not_barf_on_uninstall[libmamba]\": 6.106753581687685,\n    \"tests/test_create.py::test_shortcut_absent_when_condarc_set[classic]\": 11.859174454806725,\n    \"tests/test_create.py::test_shortcut_absent_when_condarc_set[libmamba]\": 6.6626524574923245,\n    \"tests/test_create.py::test_shortcut_creation_installs_shortcut[classic]\": 6.468277337879668,\n    \"tests/test_create.py::test_shortcut_creation_installs_shortcut[libmamba]\": 4.561394507548745,\n    \"tests/test_create.py::test_strict_channel_priority[classic]\": 0.0002986111014582571,\n    \"tests/test_create.py::test_strict_channel_priority[libmamba]\": 0.0002793379734296068,\n    \"tests/test_create.py::test_strict_resolve_get_reduced_index[classic]\": 81.1065168095887,\n    \"tests/test_create.py::test_strict_resolve_get_reduced_index[libmamba]\": 86.16046670069221,\n    \"tests/test_create.py::test_tarball_install[classic]\": 0.7971455770525714,\n    \"tests/test_create.py::test_tarball_install[libmamba]\": 0.828829392713241,\n    \"tests/test_create.py::test_tarball_install_and_bad_metadata[classic]\": 1.7290193186808431,\n    \"tests/test_create.py::test_tarball_install_and_bad_metadata[libmamba]\": 1.6490688555222628,\n    \"tests/test_create.py::test_transactional_rollback_simple[classic]\": 0.8373156817562833,\n    \"tests/test_create.py::test_transactional_rollback_simple[libmamba]\": 0.7862462076812379,\n    \"tests/test_create.py::test_transactional_rollback_upgrade_downgrade[classic]\": 1.387069031515136,\n    \"tests/test_create.py::test_transactional_rollback_upgrade_downgrade[libmamba]\": 1.3026857400616474,\n    \"tests/test_create.py::test_update_all_updates_pip_pkg[classic]\": 23.804767199966484,\n    \"tests/test_create.py::test_update_all_updates_pip_pkg[libmamba]\": 10.045726994192933,\n    \"tests/test_create.py::test_update_deps_flag_absent[classic]\": 0.9324543441949442,\n    \"tests/test_create.py::test_update_deps_flag_absent[libmamba]\": 0.818102411171926,\n    \"tests/test_create.py::test_update_deps_flag_present[classic]\": 1.358425709046792,\n    \"tests/test_create.py::test_update_deps_flag_present[libmamba]\": 1.1111067345005006,\n    \"tests/test_create.py::test_update_with_pinned_packages[classic]\": 1.3215395803815073,\n    \"tests/test_create.py::test_update_with_pinned_packages[libmamba]\": 0.754255521066721,\n    \"tests/test_create.py::test_use_index_cache[classic]\": 12.00366169214669,\n    \"tests/test_create.py::test_use_index_cache[libmamba]\": 9.75929402297513,\n    \"tests/test_deferred_deprecations.py::test_auxlib_logz_does_not_pull_in_serialize_json\": 0.18385264800898793,\n    \"tests/test_deferred_deprecations.py::test_common_serialize_does_not_pull_in_json\": 0.18276703473572956,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.auxlib.logz-DumpEncoder]\": 0.0013594267177738008,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.auxlib.logz-_DUMPS]\": 0.0013687286426143062,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.auxlib.logz-jsondumps]\": 0.0012310663283474448,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.common.serialize-EntityEncoder]\": 0.001193663523207003,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.common.serialize-json_load]\": 0.0012017280615997212,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.auxlib.logz-DumpEncoder]\": 0.001228097515949055,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.auxlib.logz-_DUMPS]\": 0.0012316536456956047,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.auxlib.logz-jsondumps]\": 0.0011807334138213505,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.common.serialize-EntityEncoder]\": 0.0011869366017488274,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.common.serialize-json_load]\": 0.0012086379494095799,\n    \"tests/test_deprecations.py::test_action[future]\": 0.001951680351877933,\n    \"tests/test_deprecations.py::test_action[pending]\": 0.00186819438494026,\n    \"tests/test_deprecations.py::test_action[remove]\": 0.001508952903872643,\n    \"tests/test_deprecations.py::test_arguments[deprecated]\": 0.0013414415141226551,\n    \"tests/test_deprecations.py::test_arguments[pending]\": 0.001364644135903357,\n    \"tests/test_deprecations.py::test_arguments[remove]\": 0.0012452954849139614,\n    \"tests/test_deprecations.py::test_class[deprecated]\": 0.0013725908783650104,\n    \"tests/test_deprecations.py::test_class[pending]\": 0.0013629770142683285,\n    \"tests/test_deprecations.py::test_class[remove]\": 0.0012474614552823741,\n    \"tests/test_deprecations.py::test_constant[deprecated]\": 0.003824201816891203,\n    \"tests/test_deprecations.py::test_constant[pending]\": 0.0019520072705944342,\n    \"tests/test_deprecations.py::test_constant[remove]\": 0.002748004943235504,\n    \"tests/test_deprecations.py::test_constant_factory\": 0.001669677051723554,\n    \"tests/test_deprecations.py::test_constant_factory_rejects_non_callable\": 0.0011527545293274564,\n    \"tests/test_deprecations.py::test_constant_multiple_same_module\": 0.0017269996746247917,\n    \"tests/test_deprecations.py::test_constant_rejects_value_and_factory_together\": 0.0011265590784347212,\n    \"tests/test_deprecations.py::test_constant_requires_value_or_factory\": 0.001139429825316688,\n    \"tests/test_deprecations.py::test_function[deprecated]\": 0.0014116915409727391,\n    \"tests/test_deprecations.py::test_function[pending]\": 0.0013540560883107268,\n    \"tests/test_deprecations.py::test_function[remove]\": 0.0013330738860553388,\n    \"tests/test_deprecations.py::test_get_module\": 0.002172845194315878,\n    \"tests/test_deprecations.py::test_method[deprecated]\": 0.0013426937746068514,\n    \"tests/test_deprecations.py::test_method[pending]\": 0.0014123335564439662,\n    \"tests/test_deprecations.py::test_method[remove]\": 0.0012442760049616143,\n    \"tests/test_deprecations.py::test_module[deprecated]\": 0.0019829801448504815,\n    \"tests/test_deprecations.py::test_module[pending]\": 0.002747057982712382,\n    \"tests/test_deprecations.py::test_module[remove]\": 0.0019920613907067008,\n    \"tests/test_deprecations.py::test_topic[deprecated]\": 0.0012858053021901918,\n    \"tests/test_deprecations.py::test_topic[pending]\": 0.0013302015897744168,\n    \"tests/test_deprecations.py::test_topic[remove]\": 0.0012522467494950544,\n    \"tests/test_deprecations.py::test_version_fallback\": 0.001129827833353508,\n    \"tests/test_exceptions.py::test_BasicClobberError\": 0.00500050634934583,\n    \"tests/test_exceptions.py::test_BinaryPrefixReplacementError\": 0.008716825564811884,\n    \"tests/test_exceptions.py::test_CommandNotFoundError_conda_build\": 0.008265238739824989,\n    \"tests/test_exceptions.py::test_CommandNotFoundError_simple\": 0.029820469861969547,\n    \"tests/test_exceptions.py::test_CondaFileNotFoundError\": 0.008796014316923877,\n    \"tests/test_exceptions.py::test_CondaHTTPError\": 0.008383344430526383,\n    \"tests/test_exceptions.py::test_CondaKeyError\": 0.007978475628303953,\n    \"tests/test_exceptions.py::test_DirectoryNotFoundError\": 0.008616493764969594,\n    \"tests/test_exceptions.py::test_ExceptionHandler_deprecations[error_upload_url-TypeError]\": 0.0013163561845453019,\n    \"tests/test_exceptions.py::test_KnownPackageClobberError\": 0.007386238227241242,\n    \"tests/test_exceptions.py::test_MD5MismatchError\": 0.009743789943429186,\n    \"tests/test_exceptions.py::test_PackageNotFoundError\": 0.008265259510522286,\n    \"tests/test_exceptions.py::test_PackagesNotFoundError_use_only_tar_bz2[False]\": 0.0044752446810955,\n    \"tests/test_exceptions.py::test_PackagesNotFoundError_use_only_tar_bz2[True]\": 0.004598777359863722,\n    \"tests/test_exceptions.py::test_SharedLinkPathClobberError\": 0.007436421158284298,\n    \"tests/test_exceptions.py::test_TooManyArgumentsError\": 0.011039170454447038,\n    \"tests/test_exceptions.py::test_UnknownPackageClobberError\": 0.004833708490605936,\n    \"tests/test_exceptions.py::test_http_error_custom_reason_code\": 0.011126628881913233,\n    \"tests/test_exceptions.py::test_http_error_rfc_9457\": 0.008324140302510427,\n    \"tests/test_exceptions.py::test_platform_mismatch_error_is_conda_value_error\": 0.0010403047766844344,\n    \"tests/test_exceptions.py::test_platform_mismatch_error_message[multiple-sources]\": 0.0012208365481425718,\n    \"tests/test_exceptions.py::test_platform_mismatch_error_message[single-source]\": 0.0012556340340347937,\n    \"tests/test_exceptions.py::test_print_unexpected_error_message_opt_out_1\": 0.013826900905473049,\n    \"tests/test_exceptions.py::test_print_unexpected_error_message_opt_out_2\": 0.010497507915213209,\n    \"tests/test_exceptions.py::test_print_unexpected_error_message_upload_1\": 0.019888872585710593,\n    \"tests/test_exceptions.py::test_print_unexpected_error_message_upload_2\": 0.01166331711206555,\n    \"tests/test_exceptions.py::test_print_unexpected_error_message_upload_3\": 0.01692765774834819,\n    \"tests/test_exceptions.py::test_proxy_error_custom_message\": 0.0011450756615380517,\n    \"tests/test_exceptions.py::test_proxy_error_default_message\": 0.001101482262709252,\n    \"tests/test_exports.py::test_deprecations[CondaError-TypeError]\": 0.0012367991911902594,\n    \"tests/test_exports.py::test_deprecations[CondaFileNotFoundError-TypeError]\": 0.0012341943033027404,\n    \"tests/test_exports.py::test_deprecations[CondaHTTPError-TypeError]\": 0.0011854615767351703,\n    \"tests/test_exports.py::test_deprecations[CondaOSError-TypeError]\": 0.001241534462896001,\n    \"tests/test_exports.py::test_deprecations[DEFAULT_CHANNELS-TypeError]\": 0.0012552512883025643,\n    \"tests/test_exports.py::test_deprecations[DEFAULT_CHANNELS_UNIX-TypeError]\": 0.0012657015238916108,\n    \"tests/test_exports.py::test_deprecations[DEFAULT_CHANNELS_WIN-TypeError]\": 0.0012126293628452792,\n    \"tests/test_exports.py::test_deprecations[EntityEncoder-None]\": 0.0012557248683909461,\n    \"tests/test_exports.py::test_deprecations[LinkError-TypeError]\": 0.0012367200602508334,\n    \"tests/test_exports.py::test_deprecations[LockError-TypeError]\": 0.0012109688058237731,\n    \"tests/test_exports.py::test_deprecations[PREFIX_PLACEHOLDER-TypeError]\": 0.0012004456996151372,\n    \"tests/test_exports.py::test_deprecations[PY3-TypeError]\": 0.001248418186329263,\n    \"tests/test_exports.py::test_deprecations[PaddingError-TypeError]\": 0.001278227590095189,\n    \"tests/test_exports.py::test_deprecations[PathNotFoundError-TypeError]\": 0.0012215128453140892,\n    \"tests/test_exports.py::test_deprecations[StringIO-None]\": 0.001218989291923924,\n    \"tests/test_exports.py::test_deprecations[UnsatisfiableError-TypeError]\": 0.0012531747047438944,\n    \"tests/test_exports.py::test_deprecations[_PREFIX_PLACEHOLDER-TypeError]\": 0.0012853580490238424,\n    \"tests/test_exports.py::test_deprecations[input-OSError]\": 0.0012246762206145128,\n    \"tests/test_exports.py::test_deprecations[prefix_placeholder-TypeError]\": 0.0012485754893622157,\n    \"tests/test_exports.py::test_deprecations[string_types-None]\": 0.0011702921284098662,\n    \"tests/test_exports.py::test_deprecations[text_type-None]\": 0.0012118471538620354,\n    \"tests/test_features.py::test_install_track_features_downgrade\": 1.4913815926364995,\n    \"tests/test_features.py::test_install_track_features_upgrade\": 1.6475245790547959,\n    \"tests/test_features.py::test_remove_features_downgrade\": 0.48611922765592974,\n    \"tests/test_features.py::test_remove_features_upgrade\": 1.049132136866968,\n    \"tests/test_fetch.py::test_checksum_checks_bytes[bad-type]\": 0.007135722738789537,\n    \"tests/test_fetch.py::test_checksum_checks_bytes[gibberish]\": 0.00698897043373475,\n    \"tests/test_fetch.py::test_checksum_checks_bytes[original]\": 0.007984665908060613,\n    \"tests/test_fetch.py::test_checksum_checks_bytes[upper]\": 0.006813544549053761,\n    \"tests/test_fetch.py::test_download_connectionerror\": 2.0173590373027146,\n    \"tests/test_fetch.py::test_download_http_errors\": 0.0059724906244315555,\n    \"tests/test_fetch.py::test_download_httperror\": 0.0066472893491211615,\n    \"tests/test_fetch.py::test_download_size_none\": 0.00430314818494254,\n    \"tests/test_fetch.py::test_download_text\": 0.004206727101046705,\n    \"tests/test_fetch.py::test_download_when_ranges_not_supported\": 0.01641639658146603,\n    \"tests/test_fetch.py::test_fetchrepodate_connectionerror\": 2.015572089134926,\n    \"tests/test_fetch.py::test_resume_bad_partial\": 0.007553551129135906,\n    \"tests/test_fetch.py::test_resume_download\": 0.02318644687798858,\n    \"tests/test_fetch.py::test_resume_partial\": 0.023068209795741982,\n    \"tests/test_fetch.py::test_tmpDownload\": 0.14577164342972465,\n    \"tests/test_history.py::test_calls_update_on_exit\": 0.0033917777972768044,\n    \"tests/test_history.py::test_comment_parsing[conda 4.5.1]\": 0.0012339879922121373,\n    \"tests/test_history.py::test_comment_parsing[conda 4.5.1dev0]\": 0.001189162079776198,\n    \"tests/test_history.py::test_comment_parsing[conda 4.5.1rc1]\": 0.001199857100073388,\n    \"tests/test_history.py::test_comment_parsing[post 4.4, install spec]\": 0.001234167247285096,\n    \"tests/test_history.py::test_comment_parsing[post 4.4, update spec]\": 0.0012138250249246016,\n    \"tests/test_history.py::test_comment_parsing[pre 4.4, install many specs]\": 0.00200665311012055,\n    \"tests/test_history.py::test_comment_parsing[pre 4.4, install one spec]\": 0.004608811951119226,\n    \"tests/test_history.py::test_comment_parsing[pre 4.4, install two specs]\": 0.0027280023918389495,\n    \"tests/test_history.py::test_comment_parsing[pre 4.4, update one spec]\": 0.0012299876071993488,\n    \"tests/test_history.py::test_comment_parsing[pre 4.4, update two specs]\": 0.0012448064049767596,\n    \"tests/test_history.py::test_empty_history_check_on_empty_env\": 0.003247031282938138,\n    \"tests/test_history.py::test_history_malformed\": 0.0025576918082707866,\n    \"tests/test_history.py::test_parse_on_empty_env\": 0.003269002326459423,\n    \"tests/test_history.py::test_returns_history_object_as_context_object\": 0.0023867249632967043,\n    \"tests/test_history.py::test_user_requests[0]\": 0.0015168414993902406,\n    \"tests/test_history.py::test_user_requests[1]\": 0.001502056466493687,\n    \"tests/test_history.py::test_user_requests[2]\": 0.0016390858868868755,\n    \"tests/test_history.py::test_user_requests[3]\": 0.0021582507953025014,\n    \"tests/test_history.py::test_user_requests[4]\": 0.02364351840255347,\n    \"tests/test_history.py::test_user_requests[5]\": 0.0014478958407040691,\n    \"tests/test_history.py::test_works_as_context_manager\": 0.0019399139791264307,\n    \"tests/test_install.py::test_binary[linux-64]\": 0.0034328175221953476,\n    \"tests/test_install.py::test_binary[noarch]\": 0.0030184549447651106,\n    \"tests/test_install.py::test_binary[win-64]\": 0.002465400389328127,\n    \"tests/test_install.py::test_default_text\": 0.0023449816028029338,\n    \"tests/test_install.py::test_ends_with_newl[linux-64]\": 0.0013160734429759307,\n    \"tests/test_install.py::test_ends_with_newl[noarch]\": 0.0013985631752256543,\n    \"tests/test_install.py::test_ends_with_newl[win-64]\": 0.0014463272746499329,\n    \"tests/test_install.py::test_long_default_text\": 0.0022604454652154896,\n    \"tests/test_install.py::test_multiple[linux-64]\": 0.0011609939841286526,\n    \"tests/test_install.py::test_multiple[noarch]\": 0.0011630203508010317,\n    \"tests/test_install.py::test_multiple[win-64]\": 0.0013906653990285063,\n    \"tests/test_install.py::test_no_extra[linux-64]\": 0.0011646696328209672,\n    \"tests/test_install.py::test_no_extra[noarch]\": 0.0011612702367098451,\n    \"tests/test_install.py::test_no_extra[win-64]\": 0.0014140409990956223,\n    \"tests/test_install.py::test_read_no_link\": 0.002269889407039675,\n    \"tests/test_install.py::test_shorter[linux-64]\": 0.001238526542477109,\n    \"tests/test_install.py::test_shorter[noarch]\": 0.0011885054434565025,\n    \"tests/test_install.py::test_shorter[win-64]\": 0.001505173223910184,\n    \"tests/test_install.py::test_simple[linux-64]\": 0.0020087868997298096,\n    \"tests/test_install.py::test_simple[noarch]\": 0.001451908873801657,\n    \"tests/test_install.py::test_simple[win-64]\": 0.0015341697659304056,\n    \"tests/test_install.py::test_spaces[linux-64]\": 0.0012733759871040985,\n    \"tests/test_install.py::test_spaces[noarch]\": 0.0012608983108205179,\n    \"tests/test_install.py::test_spaces[win-64]\": 0.0014042932630534907,\n    \"tests/test_install.py::test_too_long[linux-64]\": 0.001184691588698825,\n    \"tests/test_install.py::test_too_long[noarch]\": 0.0011844494651007031,\n    \"tests/test_install.py::test_too_long[win-64]\": 0.0012679188154451322,\n    \"tests/test_install.py::test_trash_outside_prefix\": 0.09093295357564295,\n    \"tests/test_install.py::test_two[linux-64]\": 0.001150568424708745,\n    \"tests/test_install.py::test_two[noarch]\": 0.0011368111956346775,\n    \"tests/test_install.py::test_two[win-64]\": 0.0014186462628597877,\n    \"tests/test_install.py::test_windows_entry_point\": 0.0002908392797472934,\n    \"tests/test_install.py::test_yield_lines\": 0.002311601178644088,\n    \"tests/test_instructions.py::test_check_files_in_tarball_files_exist\": 0.001796143327687281,\n    \"tests/test_instructions.py::test_check_files_in_tarball_files_not_exist\": 0.001492193551958071,\n    \"tests/test_instructions.py::test_expected_operation_order\": 0.0010521802276993997,\n    \"tests/test_link_order.py::test_link_order_post_link_actions\": 1.7533998790774978,\n    \"tests/test_link_order.py::test_link_order_post_link_depend\": 1.7714337248722107,\n    \"tests/test_misc.py::test_Utf8NamedTemporaryFile\": 0.0012323123937263416,\n    \"tests/test_misc.py::test_cache_fn_url\": 0.0010511403569360377,\n    \"tests/test_misc.py::test_deprecations[url_pat-TypeError]\": 0.0012770085495955531,\n    \"tests/test_misc.py::test_explicit_missing_cache_entries\": 0.9575383186100838,\n    \"tests/test_misc.py::test_explicit_no_cache\": 0.005566445586773974,\n    \"tests/test_misc.py::test_explicit_parser[../doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03-ParseError]\": 0.0014407355375339178,\n    \"tests/test_misc.py::test_explicit_parser[../doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03c4034246de428582e-None]\": 0.002184603583311534,\n    \"tests/test_misc.py::test_explicit_parser[doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03c4034246de428582e-None]\": 0.0021349693555357875,\n    \"tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-2707f68aada792d1cf3a44c51d55b38b0cd65b0c192d2a5f9ef0550dc149a7d3-None]\": 0.002172589350576418,\n    \"tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-md5:5e9e17751f19d03c4034246de428582e-ParseError]\": 0.001387152914403897,\n    \"tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-sha123:2707f68aada792d1cf3a44c51d55b38b0cd65b0c192d2a5f9ef0550dc149a7d3-ParseError]\": 0.0014671705477254666,\n    \"tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-sha256:2707f68aada792d1cf3a44c51d55b38b0cd65b0c192d2a5f9ef0550dc149a7d3-None]\": 0.0022855253749042865,\n    \"tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03c4034246de428582e-None]\": 0.0021798445471877454,\n    \"tests/test_misc.py::test_url_pat_1\": 0.0011192089111479928,\n    \"tests/test_misc.py::test_url_pat_2\": 0.0010886092157913016,\n    \"tests/test_misc.py::test_url_pat_3\": 0.0011212895907069817,\n    \"tests/test_misc.py::test_walk_prefix\": 0.0028167460467326227,\n    \"tests/test_priority.py::test_reorder_channel_priority[classic-with pinned_package]\": 1.7965950479204758,\n    \"tests/test_priority.py::test_reorder_channel_priority[classic-without pinned_package]\": 1.4679640001290906,\n    \"tests/test_priority.py::test_reorder_channel_priority[libmamba-with pinned_package]\": 1.637502081752641,\n    \"tests/test_priority.py::test_reorder_channel_priority[libmamba-without pinned_package]\": 1.7762734395038327,\n    \"tests/test_reporters.py::test_confirm_yn_always_yes\": 0.004246246486094675,\n    \"tests/test_reporters.py::test_confirm_yn_dry_run_exit\": 0.0043296539304581464,\n    \"tests/test_reporters.py::test_confirm_yn_no\": 0.004548582839136222,\n    \"tests/test_reporters.py::test_confirm_yn_yes\": 0.004783571090566317,\n    \"tests/test_reporters.py::test_get_progress_bar\": 0.0016503043175684887,\n    \"tests/test_reporters.py::test_get_progress_bar_context_managers\": 0.0011559215151534202,\n    \"tests/test_reporters.py::test_render\": 0.00212085055726072,\n    \"tests/test_resolve.py::test_Resolve_make_channel_priorities\": 0.0016941953716712343,\n    \"tests/test_resolve.py::test_specs_by_name_copy_is_independent\": 0.0011951358083656482,\n    \"tests/test_solvers.py::TestClassicSolver::test_accelerate\": 1.4854248329640571,\n    \"tests/test_solvers.py::TestClassicSolver::test_anaconda_nomkl\": 0.9052922531928532,\n    \"tests/test_solvers.py::TestClassicSolver::test_arch_preferred_over_noarch_when_otherwise_equal\": 0.2063157350897281,\n    \"tests/test_solvers.py::TestClassicSolver::test_channel_priority_1\": 0.007103266400260317,\n    \"tests/test_solvers.py::TestClassicSolver::test_circular_dependencies\": 0.6891548318233547,\n    \"tests/test_solvers.py::TestClassicSolver::test_empty\": 0.613960835507398,\n    \"tests/test_solvers.py::TestClassicSolver::test_get_dists\": 0.9436893838614594,\n    \"tests/test_solvers.py::TestClassicSolver::test_get_reduced_index_broadening_preferred_solution\": 0.20711189227906296,\n    \"tests/test_solvers.py::TestClassicSolver::test_get_reduced_index_broadening_with_unsatisfiable_early_dep\": 0.2067180512724322,\n    \"tests/test_solvers.py::TestClassicSolver::test_install_package_with_feature\": 0.2947467405751498,\n    \"tests/test_solvers.py::TestClassicSolver::test_iopro_mkl\": 0.8741149842475059,\n    \"tests/test_solvers.py::TestClassicSolver::test_iopro_nomkl\": 0.4504873656298597,\n    \"tests/test_solvers.py::TestClassicSolver::test_irrational_version\": 0.23188914923259654,\n    \"tests/test_solvers.py::TestClassicSolver::test_mkl\": 1.1741652261051918,\n    \"tests/test_solvers.py::TestClassicSolver::test_no_features\": 1.572051455598629,\n    \"tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_build_greater\": 0.2059964742232421,\n    \"tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_build_greater_dep\": 0.21653538027567595,\n    \"tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_version_greater\": 0.22630372074366567,\n    \"tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_version_greater_dep\": 0.21191053730803164,\n    \"tests/test_solvers.py::TestClassicSolver::test_nonexistent\": 0.408832244243095,\n    \"tests/test_solvers.py::TestClassicSolver::test_nonexistent_deps\": 2.8410391091829053,\n    \"tests/test_solvers.py::TestClassicSolver::test_pseudo_boolean\": 0.8790745433708443,\n    \"tests/test_solvers.py::TestClassicSolver::test_remove\": 1.6449689621101615,\n    \"tests/test_solvers.py::TestClassicSolver::test_scipy_mkl\": 0.44542497446547274,\n    \"tests/test_solvers.py::TestClassicSolver::test_surplus_features_1\": 0.20661195958309705,\n    \"tests/test_solvers.py::TestClassicSolver::test_surplus_features_2\": 0.20631219457123115,\n    \"tests/test_solvers.py::TestClassicSolver::test_timestamps_and_deps\": 1.584052116682157,\n    \"tests/test_solvers.py::TestClassicSolver::test_unintentional_feature_downgrade\": 0.6564175777884432,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_any_two_not_three\": 0.8249980823767314,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_chain\": 0.20670202393139753,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_channel_priority\": 0.4168423299839758,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_expand_single\": 0.2067352426217935,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_from_r1\": 1.6844574189889026,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_missing_dep\": 0.20626101159636048,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_1\": 0.20855857157753993,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_2\": 0.21836936329166917,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_3\": 0.2072960506582411,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_4\": 0.2065172914362773,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_simple\": 0.2112250164943341,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_accelerate\": 0.001005557108371779,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_anaconda_nomkl\": 0.2856203907262676,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_arch_preferred_over_noarch_when_otherwise_equal\": 0.20982248930486141,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_channel_priority_1\": 0.00680256747622624,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_circular_dependencies\": 0.6861220496468662,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_empty\": 0.2308663316278762,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_get_dists\": 0.23269229723212057,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_get_reduced_index_broadening_preferred_solution\": 0.2106534887611145,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_get_reduced_index_broadening_with_unsatisfiable_early_dep\": 0.20944689981325695,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_install_package_with_feature\": 0.23231684853707946,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_iopro_mkl\": 0.001171357546899694,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_iopro_nomkl\": 0.0010657041577128749,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_irrational_version\": 0.231294947554887,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_mkl\": 0.0011486641116055015,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_no_features\": 0.0011587812456853425,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_build_greater\": 0.2096161772216255,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_build_greater_dep\": 0.20951576884610468,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_version_greater\": 0.20956674744864753,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_version_greater_dep\": 0.21001353890511532,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_nonexistent\": 0.4140599639108838,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_nonexistent_deps\": 2.6091750068223227,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_pseudo_boolean\": 0.0011571380163542834,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_remove\": 0.001169021315212918,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_scipy_mkl\": 0.0010037651749208677,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_surplus_features_1\": 0.0010342676608281485,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_surplus_features_2\": 0.0010260418753083608,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_timestamps_and_deps\": 1.5993362200702201,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unintentional_feature_downgrade\": 0.0011859698671873318,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_any_two_not_three\": 0.831760263545154,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_chain\": 0.20980517189784048,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_channel_priority\": 0.4173299959567365,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_expand_single\": 0.20960552956380285,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_from_r1\": 0.6988121203435781,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_missing_dep\": 0.20955587336721596,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_1\": 0.20983423923544803,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_2\": 0.20968584377577368,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_3\": 0.20988854470314938,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_4\": 0.20937438305306136,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_simple\": 0.20992670320073603,\n    \"tests/test_utils.py::test_ensure_dir\": 0.0034334725251515545,\n    \"tests/test_utils.py::test_ensure_dir_errors\": 0.005050051508941156,\n    \"tests/test_utils.py::test_quote_for_shell[!-'!']\": 0.0012020316617267982,\n    \"tests/test_utils.py::test_quote_for_shell[\\\"-'\\\"']\": 0.0013698219933603862,\n    \"tests/test_utils.py::test_quote_for_shell[#-'#']\": 0.0011465114726927805,\n    \"tests/test_utils.py::test_quote_for_shell[$-'$']\": 0.0011399032411687736,\n    \"tests/test_utils.py::test_quote_for_shell[%-%]\": 0.0011525376269018,\n    \"tests/test_utils.py::test_quote_for_shell[&-'&']\": 0.0011156487677420114,\n    \"tests/test_utils.py::test_quote_for_shell['-''\\\"'\\\"'']\": 0.0011462006891165832,\n    \"tests/test_utils.py::test_quote_for_shell[(-'(']\": 0.0011270732128446674,\n    \"tests/test_utils.py::test_quote_for_shell[)-')']\": 0.0011495622405237995,\n    \"tests/test_utils.py::test_quote_for_shell[*-'*']\": 0.0011721344625445845,\n    \"tests/test_utils.py::test_quote_for_shell[+-+]\": 0.0011323184965110263,\n    \"tests/test_utils.py::test_quote_for_shell[,-,]\": 0.0011709576924836666,\n    \"tests/test_utils.py::test_quote_for_shell[---]\": 0.0011676487875822298,\n    \"tests/test_utils.py::test_quote_for_shell[.-.]\": 0.0011107755537210471,\n    \"tests/test_utils.py::test_quote_for_shell[/-/]\": 0.001144018657383892,\n    \"tests/test_utils.py::test_quote_for_shell[1>/dev/null-'1>/dev/null']\": 0.0011546259756296635,\n    \"tests/test_utils.py::test_quote_for_shell[1>NUL-'1>NUL']\": 0.0011590866757292537,\n    \"tests/test_utils.py::test_quote_for_shell[2>&1-'2>&1']\": 0.0011569317445003348,\n    \"tests/test_utils.py::test_quote_for_shell[2>/dev/null-'2>/dev/null']\": 0.001126457160314575,\n    \"tests/test_utils.py::test_quote_for_shell[2>NUL-'2>NUL']\": 0.0011818860272380036,\n    \"tests/test_utils.py::test_quote_for_shell[:-:]\": 0.0011414995617600758,\n    \"tests/test_utils.py::test_quote_for_shell[;-';']\": 0.001139692788193643,\n    \"tests/test_utils.py::test_quote_for_shell[<-'<']\": 0.0011380843310746002,\n    \"tests/test_utils.py::test_quote_for_shell[=-=]\": 0.0011639442672291324,\n    \"tests/test_utils.py::test_quote_for_shell[>-'>']\": 0.0011421837458089204,\n    \"tests/test_utils.py::test_quote_for_shell[>/dev/null-'>/dev/null']\": 0.0011960934933837415,\n    \"tests/test_utils.py::test_quote_for_shell[>NUL-'>NUL']\": 0.0011283314648877342,\n    \"tests/test_utils.py::test_quote_for_shell[?-'?']\": 0.0011252385492464486,\n    \"tests/test_utils.py::test_quote_for_shell[@-@]\": 0.0011621297961564522,\n    \"tests/test_utils.py::test_quote_for_shell[C:\\\\\\\\temp\\\\\\\\some ^%file^% > nul-\\\"C:\\\\\\\\temp\\\\\\\\some ^%%file^%% > nul\\\"]\": 0.00024152824793190165,\n    \"tests/test_utils.py::test_quote_for_shell[None-'']\": 0.001157073831452727,\n    \"tests/test_utils.py::test_quote_for_shell[[-'[']\": 0.0011192632882533798,\n    \"tests/test_utils.py::test_quote_for_shell[\\\\\\\\-'\\\\\\\\']\": 0.0011470140212733306,\n    \"tests/test_utils.py::test_quote_for_shell[]-']']\": 0.0012469723939917778,\n    \"tests/test_utils.py::test_quote_for_shell[^-'^']\": 0.0011638393086814748,\n    \"tests/test_utils.py::test_quote_for_shell[arg1 and 2-'arg1 and 2']\": 0.0011888539351900779,\n    \"tests/test_utils.py::test_quote_for_shell[arg1-arg1]\": 0.0013017222334274492,\n    \"tests/test_utils.py::test_quote_for_shell[arg1\\\\nand\\\\n2-'arg1\\\\nand\\\\n2']\": 0.0011435319917836608,\n    \"tests/test_utils.py::test_quote_for_shell[malicious argument\\\\\\\\\\\"&whoami-\\\"malicious argument\\\\\\\\\\\"\\\"&whoami\\\"]\": 0.00025415904695953544,\n    \"tests/test_utils.py::test_quote_for_shell[numpy<1.22-'numpy<1.22']\": 0.001321554446609676,\n    \"tests/test_utils.py::test_quote_for_shell[numpy>=1.0-'numpy>=1.0']\": 0.001143064055275357,\n    \"tests/test_utils.py::test_quote_for_shell[one|two-'one|two']\": 0.0011734210584034702,\n    \"tests/test_utils.py::test_quote_for_shell[{-'{']\": 0.0011941505766447473,\n    \"tests/test_utils.py::test_quote_for_shell[|-'|']\": 0.0011648817027047713,\n    \"tests/test_utils.py::test_quote_for_shell[}-'}']\": 0.0011502786797055943,\n    \"tests/test_utils.py::test_quote_for_shell[~-'~']\": 0.0011328139733516685,\n    \"tests/testing/test_fixtures.py::test_conda_cli\": 0.03835852429236285,\n    \"tests/testing/test_fixtures.py::test_empty_env\": 0.002462008847296486,\n    \"tests/testing/test_fixtures.py::test_env\": 0.0712106795468332,\n    \"tests/testing/test_fixtures.py::test_monkeypatch\": 0.004378880124256906,\n    \"tests/testing/test_fixtures.py::test_path_factory\": 0.0020294544814371835,\n    \"tests/testing/test_fixtures.py::test_path_factory_mutual_exclusivity\": 0.0020620454469301485,\n    \"tests/testing/test_fixtures.py::test_path_factory_name_mode\": 0.0019677067910993614,\n    \"tests/testing/test_fixtures.py::test_path_factory_parts_mode[all parts]\": 0.002083960590567722,\n    \"tests/testing/test_fixtures.py::test_path_factory_parts_mode[infix only]\": 0.0021441183501081517,\n    \"tests/testing/test_fixtures.py::test_path_factory_parts_mode[no parts]\": 0.0021341731355786603,\n    \"tests/testing/test_fixtures.py::test_path_factory_parts_mode[prefix only]\": 0.0021507140286857935,\n    \"tests/testing/test_fixtures.py::test_path_factory_parts_mode[suffix only]\": 0.0021109501906637898,\n    \"tests/testing/test_fixtures.py::test_path_factory_uniqueness\": 0.0019892316439961044,\n    \"tests/testing/test_fixtures.py::test_session_conda_cli\": 0.03891682337084565,\n    \"tests/testing/test_fixtures.py::test_session_tmp_env\": 0.001971980501019808,\n    \"tests/testing/test_fixtures.py::test_tmp_channel\": 0.9340203478105968,\n    \"tests/testing/test_fixtures.py::test_tmp_env\": 0.0024742439975287234,\n    \"tests/testing/test_fixtures.py::test_tmp_env_mutual_exclusivity\": 0.002263617490247121,\n    \"tests/testing/test_fixtures.py::test_tmp_env_path_parts[all parts]\": 0.0026828501820427564,\n    \"tests/testing/test_fixtures.py::test_tmp_env_path_parts[infix only]\": 0.0026916263798589316,\n    \"tests/testing/test_fixtures.py::test_tmp_env_path_parts[name only]\": 0.0026999851220088703,\n    \"tests/testing/test_fixtures.py::test_tmp_env_path_parts[no parts]\": 0.002730265326535604,\n    \"tests/testing/test_fixtures.py::test_tmp_env_path_parts[prefix only]\": 0.0026881185889609614,\n    \"tests/testing/test_fixtures.py::test_tmp_env_path_parts[suffix only]\": 0.0026866333184784146,\n    \"tests/testing/test_fixtures.py::test_tmp_envs_dir\": 0.0037242918963740533,\n    \"tests/testing/test_fixtures.py::test_tmp_pkgs_dir\": 0.002581669025758968,\n    \"tests/testing/test_http_test_server.py::test_dynamic_content_pattern\": 0.534497439825416,\n    \"tests/testing/test_http_test_server.py::test_http_server_404_missing_file[tests/env/support]\": 0.5052138441159715,\n    \"tests/testing/test_http_test_server.py::test_http_server_directory_attribute\": 0.5070718545562675,\n    \"tests/testing/test_http_test_server.py::test_http_server_fixture_attributes[tests/env/support]\": 0.5033846521588384,\n    \"tests/testing/test_http_test_server.py::test_http_server_get_url_method[tests/env/support]\": 0.503748880218358,\n    \"tests/testing/test_http_test_server.py::test_http_server_multiple_directories[tests/data]\": 0.5457292900197918,\n    \"tests/testing/test_http_test_server.py::test_http_server_multiple_directories[tests/env/support]\": 0.5741356832372151,\n    \"tests/testing/test_http_test_server.py::test_http_server_serves_files[tests/env/support]\": 0.5088771539721336,\n    \"tests/testing/test_http_test_server.py::test_http_server_subdirectories[tests/env/support]\": 0.5051418575680585,\n    \"tests/testing/test_http_test_server.py::test_http_server_without_marker\": 0.505374640367536,\n    \"tests/testing/test_http_test_server.py::test_marker_validation_directory_type\": 0.17729983640670266\n}\n"
  },
  {
    "path": "durations/Windows.json",
    "content": "{\n    \"tests/base/test_constants.py::test_ChannelPriority\": 0.02008503432274582,\n    \"tests/base/test_constants.py::test_deprecations[CONDA_PACKAGE_EXTENSIONS-TypeError]\": 0.002172532398686549,\n    \"tests/base/test_constants.py::test_deprecations[CONDA_PACKAGE_PARTS-TypeError]\": 0.002016759240971079,\n    \"tests/base/test_constants.py::test_deprecations[ERROR_UPLOAD_URL-TypeError]\": 0.0048811924750486934,\n    \"tests/base/test_constants.py::test_null_is_falsey\": 0.016220867431980094,\n    \"tests/base/test_context.py::test_aggressive_update_packages\": 0.03994107138961314,\n    \"tests/base/test_context.py::test_category_map_covers_all_parameters\": 0.013192631887506157,\n    \"tests/base/test_context.py::test_category_map_is_class_constant\": 0.0013668959934016924,\n    \"tests/base/test_context.py::test_channel_alias_validation[bad_value-channel_alias value 'bad_value' must have scheme/protocol.]\": 0.0015773795653144245,\n    \"tests/base/test_context.py::test_channel_alias_validation[https://example.com/-True]\": 0.0016266502315228906,\n    \"tests/base/test_context.py::test_channel_priority\": 0.0156799149246327,\n    \"tests/base/test_context.py::test_channel_settings\": 0.013513541642199435,\n    \"tests/base/test_context.py::test_channels_defaults_condarc\": 0.01536795777298963,\n    \"tests/base/test_context.py::test_channels_empty\": 0.013500110922059935,\n    \"tests/base/test_context.py::test_check_allowlist\": 0.009579307959887495,\n    \"tests/base/test_context.py::test_check_allowlist_and_denylist\": 0.00871330278456115,\n    \"tests/base/test_context.py::test_check_denylist\": 0.008758742357801557,\n    \"tests/base/test_context.py::test_client_ssl_cert\": 0.025778987535790998,\n    \"tests/base/test_context.py::test_clobber_enum[clobber]\": 0.005764685501574919,\n    \"tests/base/test_context.py::test_clobber_enum[prevent]\": 0.006018747139224657,\n    \"tests/base/test_context.py::test_clobber_enum[warn]\": 0.005902630714730332,\n    \"tests/base/test_context.py::test_conda_bld_path\": 0.023009061131751597,\n    \"tests/base/test_context.py::test_conda_build_root_dir\": 0.013166968649496815,\n    \"tests/base/test_context.py::test_conda_envs_path\": 0.02402605831262046,\n    \"tests/base/test_context.py::test_context_override_with_reset\": 0.005644317500789171,\n    \"tests/base/test_context.py::test_context_parameter_map\": 0.01367483987290339,\n    \"tests/base/test_context.py::test_context_parameters_have_descriptions\": 0.04737147036398847,\n    \"tests/base/test_context.py::test_context_stack_doubles_on_overflow[1]\": 0.0015625355037143726,\n    \"tests/base/test_context.py::test_context_stack_doubles_on_overflow[2]\": 0.001550879471625371,\n    \"tests/base/test_context.py::test_context_stack_doubles_on_overflow[3]\": 0.0015267195550257764,\n    \"tests/base/test_context.py::test_context_stack_doubles_on_overflow[4]\": 0.0015090926348983167,\n    \"tests/base/test_context.py::test_context_stack_push_pop_roundtrip\": 0.006773572784108932,\n    \"tests/base/test_context.py::test_context_stack_starts_with_single_slot\": 0.00145452187723352,\n    \"tests/base/test_context.py::test_create_default_packages[context_packages0-expected_packages0]\": 0.00616782525736815,\n    \"tests/base/test_context.py::test_create_default_packages[context_packages1-expected_packages1]\": 0.00620713299100899,\n    \"tests/base/test_context.py::test_create_default_packages[context_packages2-expected_packages2]\": 0.012335984022441095,\n    \"tests/base/test_context.py::test_create_default_packages_will_warn_for_explicit_packages\": 0.008146736479393133,\n    \"tests/base/test_context.py::test_custom_multichannels\": 0.015341399434602016,\n    \"tests/base/test_context.py::test_custom_multichannels_overrides_default_channels\": 0.019173808067718005,\n    \"tests/base/test_context.py::test_default_activation_prefix\": 0.027483356198299388,\n    \"tests/base/test_context.py::test_default_python_validation[-True]\": 0.0015745805188979156,\n    \"tests/base/test_context.py::test_default_python_validation[3.12-True]\": 0.001571514976397707,\n    \"tests/base/test_context.py::test_default_python_validation[4.12-default_python value '4.12' not of the form '[23].[0-9][0-9]?' or '']\": 0.0016004415550622659,\n    \"tests/base/test_context.py::test_default_python_validation[not a number-default_python value 'not a number' not of the form '[23].[0-9][0-9]?' or '']\": 0.0015613779112623664,\n    \"tests/base/test_context.py::test_default_target_is_root_prefix\": 0.013127956208348661,\n    \"tests/base/test_context.py::test_deprecations[error_upload_url-TypeError]\": 0.001754488871786548,\n    \"tests/base/test_context.py::test_expandvars\": 0.06932168691975865,\n    \"tests/base/test_context.py::test_export_platforms\": 0.018624631380323442,\n    \"tests/base/test_context.py::test_local_build_root_custom_rc\": 0.02855335888284219,\n    \"tests/base/test_context.py::test_local_build_root_default_rc\": 0.006582163386569403,\n    \"tests/base/test_context.py::test_migrated_custom_channels\": 0.03158089294515278,\n    \"tests/base/test_context.py::test_native_subdir[darwin-arm64-osx-arm64]\": 0.001693992277083133,\n    \"tests/base/test_context.py::test_native_subdir[darwin-x86_64-osx-64]\": 0.0017658350698155072,\n    \"tests/base/test_context.py::test_native_subdir[linux-aarch64-linux-aarch64]\": 0.0018324964574573958,\n    \"tests/base/test_context.py::test_native_subdir[linux-ppc64le-linux-ppc64le]\": 0.0017506872195979573,\n    \"tests/base/test_context.py::test_native_subdir[linux-riscv64-linux-riscv64]\": 0.0016848211958628446,\n    \"tests/base/test_context.py::test_native_subdir[linux-s390x-linux-s390x]\": 0.0017224973161267464,\n    \"tests/base/test_context.py::test_native_subdir[linux-x86_64-linux-64]\": 0.0018394609971669209,\n    \"tests/base/test_context.py::test_native_subdir[win32-AMD64-win-64]\": 0.0017370578727618875,\n    \"tests/base/test_context.py::test_native_subdir[win32-ARM64-win-arm64]\": 0.0017045340519678343,\n    \"tests/base/test_context.py::test_old_channel_alias\": 0.017709241350959023,\n    \"tests/base/test_context.py::test_proxy_servers\": 0.014128154886769242,\n    \"tests/base/test_context.py::test_signing_metadata_url_base\": 0.017655502423107393,\n    \"tests/base/test_context.py::test_signing_metadata_url_base_empty_default_channels\": 0.018321972175477895,\n    \"tests/base/test_context.py::test_specify_channels_cli_condarc\": 0.015468781693237232,\n    \"tests/base/test_context.py::test_specify_channels_cli_not_adding_defaults_no_condarc\": 0.014993397248606882,\n    \"tests/base/test_context.py::test_specify_different_channels_cli_condarc\": 0.015110230052536559,\n    \"tests/base/test_context.py::test_specify_same_channels_cli_as_in_condarc\": 0.015380307373503791,\n    \"tests/base/test_context.py::test_subdirs\": 0.005781325422316666,\n    \"tests/base/test_context.py::test_target_prefix\": 0.05511267904542218,\n    \"tests/base/test_context.py::test_threads\": 0.023593717970861478,\n    \"tests/base/test_context.py::test_validate_channels[-expected_channels3]\": 0.0016873080377221795,\n    \"tests/base/test_context.py::test_validate_channels[channels0-expected_channels0]\": 0.00267907695037227,\n    \"tests/base/test_context.py::test_validate_channels[channels1-expected_channels1]\": 0.002749001245733327,\n    \"tests/base/test_context.py::test_validate_channels[channels2-expected_channels2]\": 0.0023092533750965053,\n    \"tests/base/test_context.py::test_validate_channels[channels4-expected_channels4]\": 0.0016630256124443238,\n    \"tests/cli/test_actions.py::test_deprecations[NullCountAction._ensure_value-TypeError]\": 0.0022226044113875004,\n    \"tests/cli/test_actions.py::test_null_count_action\": 0.003851688788895637,\n    \"tests/cli/test_all_commands.py::test_activate_help_commands_exit_0_rc[activate]\": 0.023372958333363652,\n    \"tests/cli/test_all_commands.py::test_activate_help_commands_exit_0_rc[deactivate]\": 0.022774191666651216,\n    \"tests/cli/test_all_commands.py::test_commands_with_plugin_backed_options[command0-error: argument --format: invalid choice: 'idontexist']\": 0.030606701151500455,\n    \"tests/cli/test_all_commands.py::test_commands_with_plugin_backed_options[command1-error: argument --solver: invalid choice: 'idontexist']\": 0.027179822331406554,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command0]\": 0.03146945751293211,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command1]\": 0.032818950401078024,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command2]\": 0.07210441706862077,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command3]\": 0.04216569725554107,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command4]\": 0.1433005441322856,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command0]\": 0.10877661719156585,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command1]\": 0.08366679059698208,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command2]\": 0.23833473665849902,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command3]\": 0.04623151709941916,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command4]\": 0.1462384079013125,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command0]\": 0.03667784834697835,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command1]\": 0.04521488257622254,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command2]\": 0.03409770808428267,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command3]\": 0.038045109655558296,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command4]\": 0.1304083524911909,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command0]\": 0.029431477103538804,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command1]\": 0.030048892513790722,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command2]\": 0.1638829062854216,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command3]\": 0.036429295287490435,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command4]\": 0.13993619754881453,\n    \"tests/cli/test_all_commands.py::test_env_spec_deprecation_active[--env-spec]\": 0.0032428105457649437,\n    \"tests/cli/test_all_commands.py::test_env_spec_deprecation_active[--environment-specifier]\": 0.0033297278342693504,\n    \"tests/cli/test_all_commands.py::test_env_spec_deprecation_pending[--env-spec]\": 0.008203668582006893,\n    \"tests/cli/test_all_commands.py::test_env_spec_deprecation_pending[--environment-specifier]\": 0.009526337312594783,\n    \"tests/cli/test_all_commands.py::test_env_spec_deprecation_removal\": 0.0028269648976392155,\n    \"tests/cli/test_all_commands.py::test_env_spec_no_warning_when_not_used\": 0.0030772565216805508,\n    \"tests/cli/test_cli_install.py::test_emscripten_forge[classic]\": 12.05788081541932,\n    \"tests/cli/test_cli_install.py::test_emscripten_forge[libmamba]\": 6.78121039315721,\n    \"tests/cli/test_cli_install.py::test_find_conflicts_called_once[classic]\": 265.184700165698,\n    \"tests/cli/test_cli_install.py::test_find_conflicts_called_once[libmamba]\": 0.02821387115826457,\n    \"tests/cli/test_cli_install.py::test_frozen_env_cep22[classic]\": 17.37632381973308,\n    \"tests/cli/test_cli_install.py::test_frozen_env_cep22[libmamba]\": 20.161018380690745,\n    \"tests/cli/test_cli_install.py::test_pre_link_message[classic]\": 1.4895810274428407,\n    \"tests/cli/test_cli_install.py::test_pre_link_message[libmamba]\": 2.254621349951882,\n    \"tests/cli/test_cli_install.py::test_reinstall_packages_calls_install[classic]\": 0.009298713422044197,\n    \"tests/cli/test_cli_install.py::test_reinstall_packages_calls_install[libmamba]\": 0.008613972003385742,\n    \"tests/cli/test_common.py::test_check_non_admin_enabled_false\": 0.006605416046468127,\n    \"tests/cli/test_common.py::test_check_non_admin_enabled_true\": 0.006000115185456527,\n    \"tests/cli/test_common.py::test_get_name_prefix_from_env_file_both_none\": 0.0026920917852008472,\n    \"tests/cli/test_common.py::test_get_name_prefix_from_env_file_exception_in_environment_spec\": 0.002522832174220611,\n    \"tests/cli/test_common.py::test_get_name_prefix_from_env_file_exception_in_get_specifier\": 0.002422324592511147,\n    \"tests/cli/test_common.py::test_get_name_prefix_from_env_file_with_both\": 0.003232535558232778,\n    \"tests/cli/test_common.py::test_get_name_prefix_from_env_file_with_only_name\": 0.0029456414299723435,\n    \"tests/cli/test_common.py::test_get_name_prefix_from_env_file_with_only_prefix\": 0.0029483090783804142,\n    \"tests/cli/test_common.py::test_is_active_prefix[-False]\": 0.007561539929711804,\n    \"tests/cli/test_common.py::test_is_active_prefix[active_prefix-True]\": 0.0022654580770366814,\n    \"tests/cli/test_common.py::test_print_activate\": 0.0021543901570411097,\n    \"tests/cli/test_common.py::test_print_activate_no_output[CONDA_JSON]\": 0.006307516270922264,\n    \"tests/cli/test_common.py::test_print_activate_no_output[CONDA_QUIET]\": 0.006407741336401112,\n    \"tests/cli/test_common.py::test_validate_file_exists[D:\\\\\\\\a\\\\\\\\conda-libmamba-solver\\\\\\\\conda-libmamba-solver\\\\\\\\conda\\\\\\\\tests\\\\\\\\cli\\\\\\\\test_common.py-True]\": 0.0017860203720907507,\n    \"tests/cli/test_common.py::test_validate_file_exists[D:\\\\\\\\a\\\\\\\\conda\\\\\\\\conda\\\\\\\\tests\\\\\\\\cli\\\\\\\\test_common.py-True]\": 0.003079978557991429,\n    \"tests/cli/test_common.py::test_validate_file_exists[file://D:\\\\\\\\a\\\\\\\\conda-libmamba-solver\\\\\\\\conda-libmamba-solver\\\\\\\\conda\\\\\\\\tests\\\\\\\\cli\\\\\\\\test_common.py-True]\": 0.0017342701667739638,\n    \"tests/cli/test_common.py::test_validate_file_exists[file://D:\\\\\\\\a\\\\\\\\conda\\\\\\\\conda\\\\\\\\tests\\\\\\\\cli\\\\\\\\test_common.py-True]\": 0.0023296644826645762,\n    \"tests/cli/test_common.py::test_validate_file_exists[file://idontexist.txt-False]\": 0.0020926313026091723,\n    \"tests/cli/test_common.py::test_validate_file_exists[http://imasession.txt-True]\": 0.0018791747115748914,\n    \"tests/cli/test_common.py::test_validate_file_exists[idontexist.txt-False]\": 0.0023495014819405135,\n    \"tests/cli/test_common.py::test_validate_subdir_config\": 0.003346845981503496,\n    \"tests/cli/test_common.py::test_validate_subdir_config_invalid_subdir\": 0.004251599598723583,\n    \"tests/cli/test_compare.py::test_compare_fail\": 0.646915720409091,\n    \"tests/cli/test_compare.py::test_compare_success\": 0.4564431742336265,\n    \"tests/cli/test_conda_argparse.py::test_cli_args_as_strings\": 0.0964263415350338,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.ArgumentParser-isclass]\": 0.0019373464890162144,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.BUILTIN_COMMANDS-<lambda>]\": 0.0019239098747018814,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.ExtendConstAction-isclass]\": 0.0019143028602484167,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.NullCountAction-isclass]\": 0.0019073974390949662,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_output_and_prompt_options-isfunction]\": 0.0020569019219611366,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_channels-isfunction]\": 0.002033155098440173,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_create_install_update-isfunction]\": 0.002011587536366154,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_default_packages-isfunction]\": 0.0019672711298076473,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_help-isfunction]\": 0.0019468315147603177,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_json-isfunction]\": 0.0019211455986108221,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_known-isfunction]\": 0.0019225580473388325,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_networking-isfunction]\": 0.0019394959264403152,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_package_install_options-isfunction]\": 0.0019099211122260093,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_prefix-isfunction]\": 0.001957381365162698,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_prefix_to_group-isfunction]\": 0.0019264614079455645,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_prune-isfunction]\": 0.0018866367009292766,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_pscheck-isfunction]\": 0.0018768045788199366,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_show_channel_urls-isfunction]\": 0.001964794704197213,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_solver-isfunction]\": 0.001914398492750503,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_solver_mode-isfunction]\": 0.0019082331259114055,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_update_modifiers-isfunction]\": 0.001912943723489368,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_verbose-isfunction]\": 0.0020169573450588563,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_clean-isfunction]\": 0.0019713341342152348,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_compare-isfunction]\": 0.001855793053087349,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_config-isfunction]\": 0.0019173866292728145,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_create-isfunction]\": 0.0018741808699832673,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_info-isfunction]\": 0.0018879557696470804,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_init-isfunction]\": 0.001858660893942156,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_install-isfunction]\": 0.0018974287694203033,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_list-isfunction]\": 0.0019000311501397422,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_notices-isfunction]\": 0.0018719274696878201,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_package-isfunction]\": 0.0018746979573247074,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_plugins-isfunction]\": 0.0018856397082245805,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_remove-isfunction]\": 0.00188459026117913,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_rename-isfunction]\": 0.0018897862612079505,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_run-isfunction]\": 0.001896421307406921,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_search-isfunction]\": 0.0018763641805466023,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_update-isfunction]\": 0.001974448873617626,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.do_call-isfunction]\": 0.0018837836764831588,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.escaped_sys_rc_path-<lambda>]\": 0.0019031429455822475,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.escaped_user_rc_path-<lambda>]\": 0.0019495793568767151,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.find_builtin_commands-isfunction]\": 0.0019150881695349279,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.generate_parser-isfunction]\": 0.001897182946168945,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.generate_pre_parser-isfunction]\": 0.0018884371199682668,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.sys_rc_path-<lambda>]\": 0.0018622474612565317,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.user_rc_path-<lambda>]\": 0.0018651939638267229,\n    \"tests/cli/test_conda_argparse.py::test_parse_clobber\": 0.032085599667938794,\n    \"tests/cli/test_conda_argparse.py::test_parser_basics\": 0.02268586960962208,\n    \"tests/cli/test_conda_argparse.py::test_sorted_commands_in_error\": 0.002751919397850856,\n    \"tests/cli/test_config.py::test_add_invalid_key\": 0.03763187325958694,\n    \"tests/cli/test_config.py::test_add_key\": 0.050226743772683956,\n    \"tests/cli/test_config.py::test_channels_add_duplicate\": 0.04715242175408796,\n    \"tests/cli/test_config.py::test_channels_add_empty\": 0.04807413414754547,\n    \"tests/cli/test_config.py::test_channels_add_empty_with_defaults\": 0.04870177916473515,\n    \"tests/cli/test_config.py::test_channels_append\": 0.05827270392471409,\n    \"tests/cli/test_config.py::test_channels_append_duplicate\": 0.043173820612578774,\n    \"tests/cli/test_config.py::test_channels_prepend\": 0.09494259222829081,\n    \"tests/cli/test_config.py::test_channels_prepend_duplicate\": 0.04510624911653562,\n    \"tests/cli/test_config.py::test_channels_remove\": 0.04154496326819218,\n    \"tests/cli/test_config.py::test_channels_remove_duplicate\": 0.06487911634371507,\n    \"tests/cli/test_config.py::test_conda_config_describe\": 0.47030319341030935,\n    \"tests/cli/test_config.py::test_conda_config_validate\": 0.13870445413681157,\n    \"tests/cli/test_config.py::test_conda_config_validate_sslverify_truststore\": 0.07499812408409084,\n    \"tests/cli/test_config.py::test_create_condarc_on_set\": 0.03947952335591725,\n    \"tests/cli/test_config.py::test_custom_multichannels_add\": 0.0475143707827911,\n    \"tests/cli/test_config.py::test_custom_multichannels_add_duplicate\": 0.039341415527606394,\n    \"tests/cli/test_config.py::test_custom_multichannels_append\": 0.043717324486571306,\n    \"tests/cli/test_config.py::test_custom_multichannels_append_duplicate\": 0.04059255385415236,\n    \"tests/cli/test_config.py::test_custom_multichannels_prepend\": 0.039701602218456165,\n    \"tests/cli/test_config.py::test_custom_multichannels_prepend_duplicate\": 0.04311741276837651,\n    \"tests/cli/test_config.py::test_get_all\": 0.045378440504328,\n    \"tests/cli/test_config.py::test_get_all_inc_maps\": 0.05986518069202752,\n    \"tests/cli/test_config.py::test_get_boolean_value\": 0.04086752071847566,\n    \"tests/cli/test_config.py::test_get_channels_list\": 0.04164297726410584,\n    \"tests/cli/test_config.py::test_get_invalid_key\": 0.03993682552334972,\n    \"tests/cli/test_config.py::test_get_map_full\": 0.04158176161421835,\n    \"tests/cli/test_config.py::test_get_map_subkey[conda_build.cache_dir-/tmp/conda-bld]\": 0.04585499530370937,\n    \"tests/cli/test_config.py::test_get_map_subkey[proxy_servers.http-1.2.3.4:5678]\": 0.04280450929894071,\n    \"tests/cli/test_config.py::test_get_multiple_keys\": 0.05943138313213537,\n    \"tests/cli/test_config.py::test_get_multiple_keys_incl_map_full\": 0.04416606597150471,\n    \"tests/cli/test_config.py::test_get_multiple_keys_incl_map_subkey\": 0.051390367787264225,\n    \"tests/cli/test_config.py::test_get_string_value\": 0.049625411110790156,\n    \"tests/cli/test_config.py::test_get_unconfigured_key\": 0.04157815410809636,\n    \"tests/cli/test_config.py::test_invalid_yaml\": 0.046331430416751945,\n    \"tests/cli/test_config.py::test_remove_key\": 0.04613276902933956,\n    \"tests/cli/test_config.py::test_remove_key_duplicate\": 0.06524304861947958,\n    \"tests/cli/test_config.py::test_remove_unconfigured_key\": 0.043471754705796124,\n    \"tests/cli/test_config.py::test_set_and_get_bool\": 0.06679373094808848,\n    \"tests/cli/test_config.py::test_set_check_types[always_yes-false-False]\": 0.0470134823941893,\n    \"tests/cli/test_config.py::test_set_check_types[always_yes-no-False]\": 0.035024455243029974,\n    \"tests/cli/test_config.py::test_set_check_types[always_yes-true-True]\": 0.03533278573523237,\n    \"tests/cli/test_config.py::test_set_check_types[always_yes-yes-True]\": 0.041155751452874596,\n    \"tests/cli/test_config.py::test_set_check_types[channel_alias-https://repo.example.com-https://repo.example.com]\": 0.04284426211306903,\n    \"tests/cli/test_config.py::test_set_check_types[proxy_servers.http-1.2.3.4:5678-py_value5]\": 0.03632776490091404,\n    \"tests/cli/test_config.py::test_set_invalid_key\": 0.033389863367748206,\n    \"tests/cli/test_config.py::test_set_key\": 0.04351305328950049,\n    \"tests/cli/test_config.py::test_set_map_key[conda_build.cache_dir-/tmp/conda-bld-/var/tmp/build]\": 0.03994794122696967,\n    \"tests/cli/test_config.py::test_set_map_key[conda_build.error_overlinking-true-false]\": 0.0006919782841106402,\n    \"tests/cli/test_config.py::test_set_map_key[proxy_servers.http-1.2.3.4:5678-4.3.2.1:9876]\": 0.0395199840708629,\n    \"tests/cli/test_config.py::test_set_rc_without_user_rc\": 0.03994325145595869,\n    \"tests/cli/test_config.py::test_set_unconfigured_key\": 0.04115131842541718,\n    \"tests/cli/test_config.py::test_show_sorts_keys\": 0.093212871055917,\n    \"tests/cli/test_config.py::test_ssl_verify_default\": 0.003673694796149975,\n    \"tests/cli/test_config.py::test_ssl_verify_set_bool\": 0.03639202331788563,\n    \"tests/cli/test_config.py::test_ssl_verify_set_filename\": 0.03679179894219541,\n    \"tests/cli/test_env.py::test_conda_env_create_empty_file[classic]\": 0.0793475320689119,\n    \"tests/cli/test_env.py::test_conda_env_create_empty_file[libmamba]\": 0.04135427470347783,\n    \"tests/cli/test_env.py::test_conda_env_create_http[classic-http_test_server0]\": 1.1649081568557391,\n    \"tests/cli/test_env.py::test_conda_env_create_http[libmamba-http_test_server0]\": 1.1416174705327717,\n    \"tests/cli/test_env.py::test_conda_env_create_no_existent_file[classic]\": 0.03584153576382204,\n    \"tests/cli/test_env.py::test_conda_env_create_no_existent_file[libmamba]\": 0.03460585346817756,\n    \"tests/cli/test_env.py::test_conda_env_create_no_existent_file_with_name[classic]\": 0.03849298112993652,\n    \"tests/cli/test_env.py::test_conda_env_create_no_existent_file_with_name[libmamba]\": 0.06375279523874214,\n    \"tests/cli/test_env.py::test_conda_env_create_no_file[classic]\": 0.04497348896237803,\n    \"tests/cli/test_env.py::test_conda_env_create_no_file[libmamba]\": 0.03416792306231333,\n    \"tests/cli/test_env.py::test_create_dry_run_json[classic]\": 0.09785181383818178,\n    \"tests/cli/test_env.py::test_create_dry_run_json[libmamba]\": 1.7866801414984697,\n    \"tests/cli/test_env.py::test_create_dry_run_yaml[classic]\": 0.26585862942277316,\n    \"tests/cli/test_env.py::test_create_dry_run_yaml[libmamba]\": 1.989522307748828,\n    \"tests/cli/test_env.py::test_create_unsolvable_env[classic]\": 2.8797077322821596,\n    \"tests/cli/test_env.py::test_create_unsolvable_env[libmamba]\": 2.508705554688837,\n    \"tests/cli/test_env.py::test_create_valid_env[classic]\": 5.211913638963513,\n    \"tests/cli/test_env.py::test_create_valid_env[libmamba]\": 2.5267600513324227,\n    \"tests/cli/test_env.py::test_create_valid_env_json_output[classic]\": 0.11585650348654769,\n    \"tests/cli/test_env.py::test_create_valid_env_json_output[libmamba]\": 1.9040358647752196,\n    \"tests/cli/test_env.py::test_create_valid_env_with_conda_and_pip_json_output[classic]\": 50.44502375496486,\n    \"tests/cli/test_env.py::test_create_valid_env_with_conda_and_pip_json_output[libmamba]\": 15.690282145814427,\n    \"tests/cli/test_env.py::test_create_valid_env_with_variables[classic]\": 3.829708281430574,\n    \"tests/cli/test_env.py::test_create_valid_env_with_variables[libmamba]\": 2.1842938826306346,\n    \"tests/cli/test_env.py::test_env_export[classic]\": 17.51256192350097,\n    \"tests/cli/test_env.py::test_env_export[libmamba]\": 5.299332570118136,\n    \"tests/cli/test_env.py::test_env_export_json[classic]\": 0.8352262527827975,\n    \"tests/cli/test_env.py::test_env_export_json[libmamba]\": 2.0258115617570347,\n    \"tests/cli/test_env.py::test_env_export_with_variables[classic]\": 12.533091116830363,\n    \"tests/cli/test_env.py::test_env_export_with_variables[libmamba]\": 4.738137276871894,\n    \"tests/cli/test_env.py::test_env_list_size[classic]\": 0.3599444988954539,\n    \"tests/cli/test_env.py::test_env_list_size[libmamba]\": 1.241127713701296,\n    \"tests/cli/test_env.py::test_env_list_size_json[classic]\": 0.16125866748291195,\n    \"tests/cli/test_env.py::test_env_list_size_json[libmamba]\": 0.5097747905303056,\n    \"tests/cli/test_env.py::test_export_multi_channel[classic]\": 45.446572721831984,\n    \"tests/cli/test_env.py::test_export_multi_channel[libmamba]\": 26.09088021339509,\n    \"tests/cli/test_env.py::test_list[classic]\": 1.3117298045903618,\n    \"tests/cli/test_env.py::test_list[libmamba]\": 5.0987601200736705,\n    \"tests/cli/test_env.py::test_list_info_envs[classic]\": 0.21569782897943668,\n    \"tests/cli/test_env.py::test_list_info_envs[libmamba]\": 0.17424474984693628,\n    \"tests/cli/test_env.py::test_name_override[classic]\": 1.7302735290276945,\n    \"tests/cli/test_env.py::test_name_override[libmamba]\": 2.351711416020419,\n    \"tests/cli/test_env.py::test_non_existent_file[classic]\": 0.038207260390068463,\n    \"tests/cli/test_env.py::test_non_existent_file[libmamba]\": 0.031210696732545746,\n    \"tests/cli/test_env.py::test_pip_error_is_propagated[classic]\": 35.9717546209846,\n    \"tests/cli/test_env.py::test_pip_error_is_propagated[libmamba]\": 13.983223544549624,\n    \"tests/cli/test_env.py::test_remove_dry_run[classic]\": 0.626626573053452,\n    \"tests/cli/test_env.py::test_remove_dry_run[libmamba]\": 2.2476210969609265,\n    \"tests/cli/test_env.py::test_set_unset_env_vars[classic]\": 0.7488399927601989,\n    \"tests/cli/test_env.py::test_set_unset_env_vars[libmamba]\": 2.324623968328157,\n    \"tests/cli/test_env.py::test_set_unset_env_vars_env_no_exist[classic]\": 0.04462239115317644,\n    \"tests/cli/test_env.py::test_set_unset_env_vars_env_no_exist[libmamba]\": 0.04834910990580913,\n    \"tests/cli/test_env.py::test_update[classic]\": 30.383099830308137,\n    \"tests/cli/test_env.py::test_update[libmamba]\": 4.726437055244338,\n    \"tests/cli/test_env.py::test_update_env_json_output[classic]\": 29.944346388267846,\n    \"tests/cli/test_env.py::test_update_env_json_output[libmamba]\": 3.6861295171740247,\n    \"tests/cli/test_env.py::test_update_env_no_action_json_output[classic]\": 66.5414619212645,\n    \"tests/cli/test_env.py::test_update_env_no_action_json_output[libmamba]\": 20.399003720053322,\n    \"tests/cli/test_env.py::test_update_env_only_pip_json_output[classic]\": 65.1834737995854,\n    \"tests/cli/test_env.py::test_update_env_only_pip_json_output[libmamba]\": 19.164404642519635,\n    \"tests/cli/test_find_commands.py::test_find_commands[subset0]\": 0.030013835984507353,\n    \"tests/cli/test_find_commands.py::test_find_commands[subset1]\": 0.000494774852080235,\n    \"tests/cli/test_find_commands.py::test_find_executable[conda-bat-bat/conda-bat.bat]\": 0.016509361776139982,\n    \"tests/cli/test_find_commands.py::test_find_executable[conda-bin-bin/conda-bin]\": 0.015518035554233835,\n    \"tests/cli/test_find_commands.py::test_find_executable[conda-exe-exe/conda-exe.exe]\": 0.007895074184705603,\n    \"tests/cli/test_helpers.py::test_argumentparser_error_handling[choices0-invalid]\": 0.002628912313475717,\n    \"tests/cli/test_helpers.py::test_argumentparser_error_handling[choices1-four]\": 0.002720893880612938,\n    \"tests/cli/test_helpers.py::test_argumentparser_error_handling[choices2-maybe]\": 0.0026510250487233205,\n    \"tests/cli/test_helpers.py::test_argumentparser_help_integration[choices0-{red,green,blue}]\": 0.0024549276699192017,\n    \"tests/cli/test_helpers.py::test_argumentparser_help_integration[choices1-{spam,eggs,bacon,spam}]\": 0.00241951735797544,\n    \"tests/cli/test_helpers.py::test_argumentparser_help_integration[choices2-{classic,libmamba}]\": 0.0023176188244213645,\n    \"tests/cli/test_helpers.py::test_argumentparser_valid_parsing[choices0-two]\": 0.002182418294841626,\n    \"tests/cli/test_helpers.py::test_argumentparser_valid_parsing[choices1-gamma]\": 0.0021209908130978504,\n    \"tests/cli/test_helpers.py::test_argumentparser_valid_parsing[choices2-yes]\": 0.002150827357124129,\n    \"tests/cli/test_helpers.py::test_choices_func_exception_propagation\": 0.0018879397699340101,\n    \"tests/cli/test_helpers.py::test_choices_property_evaluation\": 0.0018839243548982735,\n    \"tests/cli/test_helpers.py::test_choices_setter_ignores_values\": 0.001804942058271521,\n    \"tests/cli/test_helpers.py::test_conda_export_format_integration\": 0.0023251253291318333,\n    \"tests/cli/test_helpers.py::test_conda_integration[conda food---food-food_choices-bacon-{spam,eggs,bacon,spam}]\": 0.0026446352875026105,\n    \"tests/cli/test_helpers.py::test_conda_integration[conda install---solver-solver_choices-libmamba-{classic,libmamba}]\": 0.002673329352077976,\n    \"tests/cli/test_helpers.py::test_empty_choices_behavior\": 0.005297240211597726,\n    \"tests/cli/test_helpers.py::test_invalid_choice_handling[orange]\": 0.0030421882586579223,\n    \"tests/cli/test_helpers.py::test_invalid_choice_handling[purple]\": 0.008319693992790242,\n    \"tests/cli/test_helpers.py::test_invalid_choice_handling[yellow]\": 0.003175145724170709,\n    \"tests/cli/test_helpers.py::test_lazy_choices_action_initialization\": 0.0019432236635056905,\n    \"tests/cli/test_helpers.py::test_multiple_option_strings[option_strings0-food---food]\": 0.0020792774673186304,\n    \"tests/cli/test_helpers.py::test_multiple_option_strings[option_strings1-food--f]\": 0.0020597537395483484,\n    \"tests/cli/test_helpers.py::test_multiple_option_strings[option_strings2-solver---solver]\": 0.0020748517261977256,\n    \"tests/cli/test_helpers.py::test_multiple_option_strings[option_strings3-solver--s]\": 0.0020529848672171096,\n    \"tests/cli/test_helpers.py::test_non_list_iterable_choices[iterable_choices0-set]\": 0.002036237734230545,\n    \"tests/cli/test_helpers.py::test_non_list_iterable_choices[iterable_choices1-tuple]\": 0.002086389325480489,\n    \"tests/cli/test_helpers.py::test_non_list_iterable_choices[iterable_choices2-iter]\": 0.0020384632707300928,\n    \"tests/cli/test_helpers.py::test_valid_choice_handling[blue]\": 0.0019072600269362547,\n    \"tests/cli/test_helpers.py::test_valid_choice_handling[green]\": 0.0019985117225625472,\n    \"tests/cli/test_helpers.py::test_valid_choice_handling[red]\": 0.0028187364347358776,\n    \"tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[--debug]\": 0.025559474621758258,\n    \"tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[--json]\": 0.02869262914943383,\n    \"tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[--trace]\": 0.025102861621566233,\n    \"tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[-v]\": 0.02634273582396251,\n    \"tests/cli/test_main.py::test_main\": 0.0621281732104826,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[ash-expected_patterns3]\": 0.006599551114492763,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[bash-expected_patterns1]\": 0.020491042242785966,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[csh-expected_patterns5]\": 0.006439739374284045,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[dash-expected_patterns4]\": 0.006666819674293975,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[fish-expected_patterns7]\": 0.00667170099871109,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[posix-expected_patterns2]\": 0.052027559797503266,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[tcsh-expected_patterns6]\": 0.0065253427335755605,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[zsh-expected_patterns0]\": 0.025837049996691713,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_no_fix_needed[cmd.exe-expected_patterns0]\": 0.0062805785044490565,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_no_fix_needed[powershell-expected_patterns1]\": 0.006747150828795793,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_no_fix_needed[xonsh-expected_patterns2]\": 0.007051185478518428,\n    \"tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[bash-expected_patterns0]\": 0.0005574184666758122,\n    \"tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[csh-expected_patterns3]\": 0.00038030346788519215,\n    \"tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[fish-expected_patterns2]\": 0.000388014416610909,\n    \"tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[tcsh-expected_patterns4]\": 0.00037029057648027525,\n    \"tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[xonsh-expected_patterns5]\": 0.0003707624968573403,\n    \"tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[zsh-expected_patterns1]\": 0.0003979793687371136,\n    \"tests/cli/test_main.py::test_main_subshell_help_exits_cleanly\": 0.025943134269658143,\n    \"tests/cli/test_main.py::test_main_subshell_no_plugins_flag\": 0.026137748506182473,\n    \"tests/cli/test_main.py::test_version_fast_path[--version]\": 0.0023125159371476162,\n    \"tests/cli/test_main.py::test_version_fast_path[-V]\": 0.0028497847030985817,\n    \"tests/cli/test_main.py::test_version_fast_path_skips_plugins[--version]\": 0.0022465110107693234,\n    \"tests/cli/test_main.py::test_version_fast_path_skips_plugins[-V]\": 0.002369568138971435,\n    \"tests/cli/test_main_clean.py::test_clean_all[False]\": 0.5810928633699849,\n    \"tests/cli/test_main_clean.py::test_clean_all[True]\": 0.7955419682949687,\n    \"tests/cli/test_main_clean.py::test_clean_all_mock_lstat[False]\": 0.6949240736544319,\n    \"tests/cli/test_main_clean.py::test_clean_all_mock_lstat[True]\": 0.23148759539187677,\n    \"tests/cli/test_main_clean.py::test_clean_and_packages\": 0.44610685934446864,\n    \"tests/cli/test_main_clean.py::test_clean_force_pkgs_dirs\": 0.25339369273414925,\n    \"tests/cli/test_main_clean.py::test_clean_index_cache\": 0.15753295006792958,\n    \"tests/cli/test_main_clean.py::test_clean_logfiles\": 0.151340904675909,\n    \"tests/cli/test_main_clean.py::test_clean_tarballs\": 0.14387178459677216,\n    \"tests/cli/test_main_clean.py::test_clean_tarballs_partial\": 0.05171572686760658,\n    \"tests/cli/test_main_clean.py::test_clean_tempfiles\": 0.14383301309860702,\n    \"tests/cli/test_main_clean.py::test_get_size\": 0.0036322741312046275,\n    \"tests/cli/test_main_clean.py::test_get_size_None\": 0.0019289509001957383,\n    \"tests/cli/test_main_clean.py::test_get_size_list\": 0.0019268045336288486,\n    \"tests/cli/test_main_commands.py::test_commands\": 0.03314198008804817,\n    \"tests/cli/test_main_compare.py::test_compare\": 0.04891454666517175,\n    \"tests/cli/test_main_compare.py::test_get_packages\": 0.12592868539560675,\n    \"tests/cli/test_main_config.py::test_config_describe\": 0.07307154163388903,\n    \"tests/cli/test_main_config.py::test_config_describe_json\": 0.09019689516695224,\n    \"tests/cli/test_main_config.py::test_config_describe_plugins_yaml_format\": 0.02958949184053286,\n    \"tests/cli/test_main_config.py::test_config_env_does_not_exist\": 0.03580509249128878,\n    \"tests/cli/test_main_config.py::test_config_file_context_manager\": 0.00440945516867122,\n    \"tests/cli/test_main_config.py::test_config_file_context_manager_exception\": 0.00580436232868434,\n    \"tests/cli/test_main_config.py::test_config_file_from_env_condarc\": 0.005405483308635969,\n    \"tests/cli/test_main_config.py::test_config_file_from_system_condarc\": 0.01565689963116928,\n    \"tests/cli/test_main_config.py::test_config_file_from_user_condarc\": 0.010559992006885772,\n    \"tests/cli/test_main_config.py::test_config_get_key\": 0.006665757744387369,\n    \"tests/cli/test_main_config.py::test_config_get_missing[get]\": 0.03898623089909637,\n    \"tests/cli/test_main_config.py::test_config_get_missing[key]\": 0.04286106378772123,\n    \"tests/cli/test_main_config.py::test_config_get_missing[unknown]\": 0.04043483665309243,\n    \"tests/cli/test_main_config.py::test_config_get_system[get]\": 0.03668296799737685,\n    \"tests/cli/test_main_config.py::test_config_get_system[key]\": 0.03756769717003646,\n    \"tests/cli/test_main_config.py::test_config_get_system[unknown]\": 0.03587516129738777,\n    \"tests/cli/test_main_config.py::test_config_get_user[get]\": 0.04097168482898109,\n    \"tests/cli/test_main_config.py::test_config_get_user[key]\": 0.03902239828898885,\n    \"tests/cli/test_main_config.py::test_config_get_user[unknown]\": 0.04028087086336948,\n    \"tests/cli/test_main_config.py::test_config_read_rc\": 0.004460314327495347,\n    \"tests/cli/test_main_config.py::test_config_remove_item\": 0.011490682407936999,\n    \"tests/cli/test_main_config.py::test_config_remove_key\": 0.002161728013049357,\n    \"tests/cli/test_main_config.py::test_config_set_and_get_key_for_env\": 0.11726586783725798,\n    \"tests/cli/test_main_config.py::test_config_set_key\": 0.003922206036517678,\n    \"tests/cli/test_main_config.py::test_config_set_keys\": 0.014832010782912972,\n    \"tests/cli/test_main_config.py::test_config_set_keys_aliases\": 0.15948241919381076,\n    \"tests/cli/test_main_config.py::test_config_show\": 0.06541660903840524,\n    \"tests/cli/test_main_config.py::test_config_show_errors\": 0.055338574819246394,\n    \"tests/cli/test_main_config.py::test_config_show_sources_json\": 0.03389010102678965,\n    \"tests/cli/test_main_config.py::test_config_write_rc\": 0.007352148578139808,\n    \"tests/cli/test_main_config.py::test_format_dict_mapping_items\": 0.011003892336655871,\n    \"tests/cli/test_main_config.py::test_key_exists[False]\": 0.0031884438461568416,\n    \"tests/cli/test_main_config.py::test_key_exists[True]\": 0.0031860574218884503,\n    \"tests/cli/test_main_env_imports.py::test_main_env_does_not_eagerly_import_main_export\": 0.4319409529735544,\n    \"tests/cli/test_main_export.py::test_execute_export_no_file_specified\": 0.05026089983990225,\n    \"tests/cli/test_main_export.py::test_export\": 0.07040627147527675,\n    \"tests/cli/test_main_export.py::test_export_add_channels\": 0.05724100356750937,\n    \"tests/cli/test_main_export.py::test_export_explicit_format_validation_errors\": 11.949529104704887,\n    \"tests/cli/test_main_export.py::test_export_file_with_json_flag_behavior[environment.json-expected_result1]\": 0.04648917784639039,\n    \"tests/cli/test_main_export.py::test_export_file_with_json_flag_behavior[environment.yaml-expected_result0]\": 0.05628573428397149,\n    \"tests/cli/test_main_export.py::test_export_file_with_json_flag_behavior[explicit.txt-expected_result2]\": 0.03740156179350389,\n    \"tests/cli/test_main_export.py::test_export_format_comparison_no_builds_vs_regular\": 0.1352211397398661,\n    \"tests/cli/test_main_export.py::test_export_format_consistency\": 0.0024009535194150335,\n    \"tests/cli/test_main_export.py::test_export_format_precedence_over_json_flag[environment-yaml-expected_result0]\": 0.04341880103198647,\n    \"tests/cli/test_main_export.py::test_export_format_precedence_over_json_flag[explicit-expected_result2]\": 0.050234702088114085,\n    \"tests/cli/test_main_export.py::test_export_format_precedence_over_json_flag[yaml-expected_result1]\": 0.040961691478441954,\n    \"tests/cli/test_main_export.py::test_export_format_priority_over_extension\": 0.04043581955618763,\n    \"tests/cli/test_main_export.py::test_export_format_to_stdout[environment-json-loads]\": 0.04455526090819791,\n    \"tests/cli/test_main_export.py::test_export_format_to_stdout[environment-yaml-loads]\": 0.04029354787109658,\n    \"tests/cli/test_main_export.py::test_export_format_to_stdout[json-loads]\": 0.039979668000531335,\n    \"tests/cli/test_main_export.py::test_export_format_to_stdout[yaml-loads]\": 0.04310511294913458,\n    \"tests/cli/test_main_export.py::test_export_from_history_format\": 0.17129780715879653,\n    \"tests/cli/test_main_export.py::test_export_ignore_channels_flag[False]\": 0.3598108198211083,\n    \"tests/cli/test_main_export.py::test_export_ignore_channels_flag[True]\": 0.17460092164119942,\n    \"tests/cli/test_main_export.py::test_export_invalid_platform_fails_fast\": 0.031212148954931525,\n    \"tests/cli/test_main_export.py::test_export_invalid_platform_from_condarc_fails_fast\": 0.032593343898547296,\n    \"tests/cli/test_main_export.py::test_export_invalid_subdir_fails_fast\": 0.0280893007827886,\n    \"tests/cli/test_main_export.py::test_export_json_flag_backwards_compatibility\": 0.05039904788989798,\n    \"tests/cli/test_main_export.py::test_export_json_flag_with_file_no_format_detection_error\": 0.052905506045606024,\n    \"tests/cli/test_main_export.py::test_export_multiple_platforms\": 6.302409045145668,\n    \"tests/cli/test_main_export.py::test_export_no_builds_format\": 0.6053025397613098,\n    \"tests/cli/test_main_export.py::test_export_non_pip_env_warnings\": 11.155919630952381,\n    \"tests/cli/test_main_export.py::test_export_override_channels\": 0.0946836443210192,\n    \"tests/cli/test_main_export.py::test_export_override_channels_and_ignore_channels_independence\": 1.2587326749126673,\n    \"tests/cli/test_main_export.py::test_export_override_channels_behavior\": 0.13447551393682874,\n    \"tests/cli/test_main_export.py::test_export_package_alphabetical_ordering\": 0.23299703758549595,\n    \"tests/cli/test_main_export.py::test_export_pip_dependencies_handling[environment-json-loads]\": 0.04426086476617793,\n    \"tests/cli/test_main_export.py::test_export_pip_dependencies_handling[environment-yaml-loads]\": 0.07222959117787825,\n    \"tests/cli/test_main_export.py::test_export_platform_argument\": 0.05816368661139101,\n    \"tests/cli/test_main_export.py::test_export_preserves_channels_from_installed_packages\": 1.2048698164706142,\n    \"tests/cli/test_main_export.py::test_export_regular_format_consistency\": 0.07559659526331278,\n    \"tests/cli/test_main_export.py::test_export_single_platform_different_platform\": 2.4182016999941904,\n    \"tests/cli/test_main_export.py::test_export_structured_file_extension_detection[environment.json-loads]\": 0.04493146690054887,\n    \"tests/cli/test_main_export.py::test_export_structured_file_extension_detection[environment.yaml-loads]\": 0.04552719414901927,\n    \"tests/cli/test_main_export.py::test_export_structured_file_extension_detection[environment.yml-loads]\": 0.04262343391532437,\n    \"tests/cli/test_main_export.py::test_export_text_file_extensions_fail_on_empty_environments[explicit.txt-Cannot export explicit format]\": 0.04771576668822327,\n    \"tests/cli/test_main_export.py::test_export_text_file_extensions_fail_on_empty_environments[requirements.txt-Cannot export requirements format]\": 0.03549454186125994,\n    \"tests/cli/test_main_export.py::test_export_text_file_extensions_fail_on_empty_environments[spec.txt-Cannot export requirements format]\": 0.03714276647807055,\n    \"tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[explicit-Cannot export explicit format]\": 0.03580777193745307,\n    \"tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[reqs-Cannot export requirements format]\": 0.035605555468377285,\n    \"tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[requirements-Cannot export requirements format]\": 0.037372665503412346,\n    \"tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[txt-Cannot export requirements format]\": 0.035228589538637466,\n    \"tests/cli/test_main_export.py::test_export_unknown_format_verbose\": 0.02584570151823846,\n    \"tests/cli/test_main_export.py::test_export_unrecognized_file_extension\": 0.10270341680177694,\n    \"tests/cli/test_main_export.py::test_export_unsupported_formats[toml-SystemExit]\": 0.02823987795079705,\n    \"tests/cli/test_main_export.py::test_export_unsupported_formats[unknown-SystemExit]\": 0.02896634788146908,\n    \"tests/cli/test_main_export.py::test_export_warnings[JSON format with `--format` flag]\": 13.983080142857188,\n    \"tests/cli/test_main_export.py::test_export_warnings[JSON format with `--json` flag]\": 12.941020869642864,\n    \"tests/cli/test_main_export.py::test_export_warnings[default behavior raises warning]\": 14.338687571428538,\n    \"tests/cli/test_main_export.py::test_export_warnings[suppress warning with `--json` and `--file`]\": 11.497560495833358,\n    \"tests/cli/test_main_export.py::test_export_warnings[suppress warning with `--quiet`]\": 11.710451597619072,\n    \"tests/cli/test_main_export.py::test_export_warnings[warns with `--file` flag alone]\": 12.199653759523807,\n    \"tests/cli/test_main_export.py::test_export_with_pip_dependencies_integration[JSON---format=json-loads]\": 14.122413640636816,\n    \"tests/cli/test_main_export.py::test_export_with_pip_dependencies_integration[YAML--loads]\": 16.15655264973953,\n    \"tests/cli/test_main_info.py::test_compute_prefix_size\": 1.9548707623924886,\n    \"tests/cli/test_main_info.py::test_compute_prefix_size_empty_env\": 0.005076848868779968,\n    \"tests/cli/test_main_info.py::test_info_all\": 0.20937789245990274,\n    \"tests/cli/test_main_info.py::test_info_base\": 0.07200658656912297,\n    \"tests/cli/test_main_info.py::test_info_detail\": 0.08200670814619954,\n    \"tests/cli/test_main_info.py::test_info_envs\": 0.06671899355111707,\n    \"tests/cli/test_main_info.py::test_info_envs_frozen\": 0.04491065567161266,\n    \"tests/cli/test_main_info.py::test_info_envs_json\": 0.03392485341050157,\n    \"tests/cli/test_main_info.py::test_info_envs_size\": 0.7814424340985323,\n    \"tests/cli/test_main_info.py::test_info_envs_size_json\": 0.12798568109460987,\n    \"tests/cli/test_main_info.py::test_info_json\": 0.05893954171662267,\n    \"tests/cli/test_main_info.py::test_info_size_without_envs\": 0.029767085244384123,\n    \"tests/cli/test_main_info.py::test_info_system\": 0.11565061475852464,\n    \"tests/cli/test_main_info.py::test_info_unsafe_channels\": 0.06718347714533651,\n    \"tests/cli/test_main_info.py::test_iter_info_components\": 0.0019074793941733594,\n    \"tests/cli/test_main_install.py::test_build_version_shows_as_changed\": 24.738934227202275,\n    \"tests/cli/test_main_install.py::test_conda_pip_interop_dependency_satisfied_by_pip\": 70.6933758954071,\n    \"tests/cli/test_main_install.py::test_install_freezes_env_by_default\": 1.2983010695109438,\n    \"tests/cli/test_main_install.py::test_install_from_extracted_package\": 8.141238705009817,\n    \"tests/cli/test_main_install.py::test_install_revision_revert\": 2.4734263527484757,\n    \"tests/cli/test_main_install.py::test_too_many_arguments\": 0.02871777126210872,\n    \"tests/cli/test_main_list.py::test_exit_codes\": 2.183495421020423,\n    \"tests/cli/test_main_list.py::test_explicit[--md5]\": 0.3007708001246806,\n    \"tests/cli/test_main_list.py::test_explicit[--sha256]\": 0.2686146831818438,\n    \"tests/cli/test_main_list.py::test_explicit[None]\": 0.2804877780490606,\n    \"tests/cli/test_main_list.py::test_export\": 0.2469284983947776,\n    \"tests/cli/test_main_list.py::test_fields_all\": 1.1790961537845326,\n    \"tests/cli/test_main_list.py::test_fields_dependent\": 0.2702138928076613,\n    \"tests/cli/test_main_list.py::test_fields_invalid\": 1.0477902411539846,\n    \"tests/cli/test_main_list.py::test_list\": 0.1468448353907264,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args0]\": 1.043220062809822,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args10]\": 0.645606492315819,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args11]\": 1.0880992178033406,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args12]\": 0.04376379405268496,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args13]\": 0.03598671640285277,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args14]\": 0.07211349738379659,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args15]\": 0.03606986925186966,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args1]\": 1.072541304409034,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args2]\": 0.8520120688286047,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args3]\": 1.0512861259232595,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args4]\": 0.05517095706938936,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args5]\": 0.05141327989834144,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args6]\": 0.04406865749104926,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args7]\": 0.03578419390239062,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args8]\": 1.1204182405023113,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args9]\": 1.059383880868218,\n    \"tests/cli/test_main_list.py::test_list_explicit\": 0.2586440470155035,\n    \"tests/cli/test_main_list.py::test_list_full_name\": 1.096370703374097,\n    \"tests/cli/test_main_list.py::test_list_full_name_no_results\": 1.0412726634432332,\n    \"tests/cli/test_main_list.py::test_list_json\": 1.18484474582103,\n    \"tests/cli/test_main_list.py::test_list_package\": 1.0480736941094375,\n    \"tests/cli/test_main_list.py::test_list_reverse\": 0.19372498733255025,\n    \"tests/cli/test_main_list.py::test_list_revisions\": 0.06773375406486393,\n    \"tests/cli/test_main_list.py::test_list_size\": 0.1699194192449363,\n    \"tests/cli/test_main_list.py::test_list_size_empty_paths_data\": 0.25595254722506294,\n    \"tests/cli/test_main_list.py::test_list_size_json\": 0.172485165009209,\n    \"tests/cli/test_main_list.py::test_list_specific_version\": 0.16501024227355,\n    \"tests/cli/test_main_list.py::test_list_with_bad_prefix_raises\": 0.035840855115794615,\n    \"tests/cli/test_main_notices.py::test_cache_names_appear_as_expected\": 0.13053129194627724,\n    \"tests/cli/test_main_notices.py::test_main_notices[200]\": 0.14626563671079373,\n    \"tests/cli/test_main_notices.py::test_main_notices[404]\": 0.1423976222806757,\n    \"tests/cli/test_main_notices.py::test_main_notices_handles_bad_expired_at_field\": 0.1664096463051091,\n    \"tests/cli/test_main_notices.py::test_main_notices_help\": 0.0292288271574261,\n    \"tests/cli/test_main_notices.py::test_main_notices_json\": 0.03451654334677318,\n    \"tests/cli/test_main_notices.py::test_main_notices_reads_from_cache\": 0.16222468037387666,\n    \"tests/cli/test_main_notices.py::test_main_notices_reads_from_expired_cache\": 0.14488749134049103,\n    \"tests/cli/test_main_notices.py::test_notices_appear_once_when_running_decorated_commands\": 0.7450284042974004,\n    \"tests/cli/test_main_notices.py::test_notices_cannot_read_cache_files\": 0.14116996681003727,\n    \"tests/cli/test_main_notices.py::test_notices_does_not_interrupt_command_on_failure\": 0.591865241338977,\n    \"tests/cli/test_main_notices.py::test_notices_shown_after_previous_command_error\": 1.2206516371122391,\n    \"tests/cli/test_main_notices.py::test_notices_work_with_s3_channel\": 0.14515349130842578,\n    \"tests/cli/test_main_remove.py::test_remove_all\": 13.43562935299967,\n    \"tests/cli/test_main_remove.py::test_remove_all_default_activation_env\": 0.06339311346061462,\n    \"tests/cli/test_main_remove.py::test_remove_all_keep_env\": 15.932475643255156,\n    \"tests/cli/test_main_remove.py::test_remove_early_existence_check\": 0.03585351871412371,\n    \"tests/cli/test_main_remove.py::test_remove_globbed_package_names[classic]\": 30.771809522683178,\n    \"tests/cli/test_main_remove.py::test_remove_globbed_package_names[libmamba]\": 3.1438214381742187,\n    \"tests/cli/test_main_remove.py::test_remove_nonexistent_env\": 0.027677172639425308,\n    \"tests/cli/test_main_rename.py::test_cannot_rename_active_env_by_name\": 2.3045273993660853,\n    \"tests/cli/test_main_rename.py::test_cannot_rename_base_env_by_name\": 0.041656649507043765,\n    \"tests/cli/test_main_rename.py::test_cannot_rename_base_env_by_path\": 0.03155922764833262,\n    \"tests/cli/test_main_rename.py::test_cannot_rename_nonexistent_env\": 0.03186398844525943,\n    \"tests/cli/test_main_rename.py::test_protected_dirs_error_for_rename\": 2.3187874436688203,\n    \"tests/cli/test_main_rename.py::test_rename_by_name_name_already_exists_error\": 2.261753817988095,\n    \"tests/cli/test_main_rename.py::test_rename_by_name_success\": 2.7155233884416248,\n    \"tests/cli/test_main_rename.py::test_rename_by_path_path_already_exists_error\": 2.3019897704054193,\n    \"tests/cli/test_main_rename.py::test_rename_by_path_success\": 2.593887118926201,\n    \"tests/cli/test_main_rename.py::test_rename_default_activation_env\": 0.10410871979094657,\n    \"tests/cli/test_main_rename.py::test_rename_with_dry_run\": 2.309437700515927,\n    \"tests/cli/test_main_rename.py::test_rename_with_force\": 4.813578872988506,\n    \"tests/cli/test_main_rename.py::test_rename_with_force_and_dry_run\": 2.3007716768557454,\n    \"tests/cli/test_main_rename.py::test_rename_with_force_with_errors\": 4.554774216277073,\n    \"tests/cli/test_main_rename.py::test_rename_with_force_with_errors_prefix\": 0.048110930329406845,\n    \"tests/cli/test_main_rename.py::test_separator_chars_on_win\": 2.294319493791486,\n    \"tests/cli/test_main_run.py::test_conda_run_nonexistent_prefix\": 0.03281237463860582,\n    \"tests/cli/test_main_run.py::test_conda_run_prefix_not_a_conda_env\": 0.03189724747196883,\n    \"tests/cli/test_main_run.py::test_multiline_run_command\": 1.1442018634334452,\n    \"tests/cli/test_main_run.py::test_no_newline_in_output[stderr]\": 11.376765911763806,\n    \"tests/cli/test_main_run.py::test_no_newline_in_output[stdout]\": 10.373106764937098,\n    \"tests/cli/test_main_run.py::test_run_deactivates_environment_unix\": 0.0004314569183606774,\n    \"tests/cli/test_main_run.py::test_run_deactivates_environment_windows\": 0.008289099479925493,\n    \"tests/cli/test_main_run.py::test_run_executes_deactivation_scripts[unix]\": 0.00042859506931541353,\n    \"tests/cli/test_main_run.py::test_run_executes_deactivation_scripts[windows]\": 1.0259302970450754,\n    \"tests/cli/test_main_run.py::test_run_preserves_exit_code_despite_deactivation_failure[unix]\": 0.00041206875680794154,\n    \"tests/cli/test_main_run.py::test_run_preserves_exit_code_despite_deactivation_failure[windows]\": 1.1486234651631844,\n    \"tests/cli/test_main_run.py::test_run_preserves_exit_code_with_deactivation[unix]\": 1.047880214049078,\n    \"tests/cli/test_main_run.py::test_run_preserves_exit_code_with_deactivation[windows]\": 0.0004356353375077881,\n    \"tests/cli/test_main_run.py::test_run_readonly_env\": 1.036476675330843,\n    \"tests/cli/test_main_run.py::test_run_returns_int\": 1.7105773989889903,\n    \"tests/cli/test_main_run.py::test_run_returns_nonzero_errorlevel\": 1.3653839566725043,\n    \"tests/cli/test_main_run.py::test_run_returns_zero_errorlevel\": 1.1324314079267337,\n    \"tests/cli/test_main_run.py::test_run_uncaptured[--no-capture-output]\": 1.0374450211527853,\n    \"tests/cli/test_main_run.py::test_run_uncaptured[-s]\": 1.0246050542983962,\n    \"tests/cli/test_main_run.py::test_run_with_empty_command_will_raise\": 0.032164998249165626,\n    \"tests/cli/test_main_run.py::test_run_with_separator[combined option]\": 1.0938863095863771,\n    \"tests/cli/test_main_run.py::test_run_with_separator[double dash option]\": 1.059594809411288,\n    \"tests/cli/test_main_run.py::test_run_with_separator[multiple args]\": 1.098236271868779,\n    \"tests/cli/test_main_run.py::test_run_with_separator[multiple separators]\": 1.1078209932986143,\n    \"tests/cli/test_main_run.py::test_run_with_separator[no known args]\": 1.195221515071654,\n    \"tests/cli/test_main_run.py::test_run_with_separator[no separator]\": 1.2684687236029162,\n    \"tests/cli/test_main_run.py::test_run_with_separator[separator not first]\": 1.1608275900087117,\n    \"tests/cli/test_main_run.py::test_run_with_separator[vvv passthrough with --]\": 1.0762658308109636,\n    \"tests/cli/test_main_run.py::test_run_with_separator[vvv passthrough]\": 1.2280074297027685,\n    \"tests/cli/test_main_search.py::test_anaconda_token_with_private_package\": 14.488441562785306,\n    \"tests/cli/test_main_search.py::test_bad_anaconda_token\": 0.8255422877460843,\n    \"tests/cli/test_main_search.py::test_current_platform_package_missing\": 0.05305907551448997,\n    \"tests/cli/test_main_search.py::test_different_platform_package_found\": 0.053637894864498,\n    \"tests/cli/test_main_search.py::test_mocked_platform_package_found\": 0.061637458550970615,\n    \"tests/cli/test_main_search.py::test_pretty_record\": 0.012935106388217453,\n    \"tests/cli/test_main_search.py::test_rpy_search[linux-32]\": 6.991785435136736,\n    \"tests/cli/test_main_search.py::test_rpy_search[linux-64]\": 9.109086926429335,\n    \"tests/cli/test_main_search.py::test_rpy_search[osx-64]\": 11.135407914149088,\n    \"tests/cli/test_main_search.py::test_rpy_search[win-32]\": 3.732935330361652,\n    \"tests/cli/test_main_search.py::test_rpy_search[win-64]\": 9.178945278599745,\n    \"tests/cli/test_main_search.py::test_search_0\": 6.198899973274575,\n    \"tests/cli/test_main_search.py::test_search_1\": 0.7743256286243038,\n    \"tests/cli/test_main_search.py::test_search_2[exact]\": 0.8555794940014138,\n    \"tests/cli/test_main_search.py::test_search_2[wildcard]\": 3.2311530147506256,\n    \"tests/cli/test_main_search.py::test_search_3\": 2.175715264062453,\n    \"tests/cli/test_main_search.py::test_search_4\": 0.07752495543205046,\n    \"tests/cli/test_main_search.py::test_search_5\": 0.791564732945201,\n    \"tests/cli/test_main_search.py::test_search_envs\": 0.16340797888532763,\n    \"tests/cli/test_main_search.py::test_search_envs_info\": 0.14300636864013608,\n    \"tests/cli/test_main_search.py::test_search_envs_json\": 0.049882581028627825,\n    \"tests/cli/test_main_search.py::test_search_envs_nonexistent\": 0.6616369212494987,\n    \"tests/cli/test_main_search.py::test_search_envs_nonexistent_info\": 0.14401343544129103,\n    \"tests/cli/test_main_search.py::test_search_envs_nonexistent_json\": 0.5101832492222989,\n    \"tests/cli/test_main_search.py::test_search_inflexible\": 2.0895590674352893,\n    \"tests/cli/test_main_search.py::test_unknown_platform_package_missing\": 0.07956717022579937,\n    \"tests/cli/test_main_update.py::test_dont_update_explicit_packages\": 0.10760012982191773,\n    \"tests/cli/test_main_update.py::test_dont_update_packages_with_version_constraints\": 0.033550171527604915,\n    \"tests/cli/test_main_update.py::test_update\": 23.09400127637558,\n    \"tests/cli/test_startup_benchmarks.py::test_context_init\": 0.00554798569940629,\n    \"tests/cli/test_startup_benchmarks.py::test_generate_parser\": 0.036017943437547606,\n    \"tests/cli/test_startup_benchmarks.py::test_import_cli_main\": 0.2922650704762061,\n    \"tests/cli/test_startup_benchmarks.py::test_import_conda_argparse\": 0.47063561316964275,\n    \"tests/cli/test_startup_benchmarks.py::test_import_context\": 0.2988706953124783,\n    \"tests/cli/test_startup_benchmarks.py::test_module_count_budget[full_startup]\": 0.4646291854238553,\n    \"tests/cli/test_startup_benchmarks.py::test_module_count_budget[generate_parser]\": 0.8673114740786515,\n    \"tests/cli/test_startup_benchmarks.py::test_module_count_budget[import_argparse]\": 0.7134603681151573,\n    \"tests/cli/test_startup_benchmarks.py::test_module_count_budget[import_context]\": 0.5684990398403719,\n    \"tests/cli/test_startup_benchmarks.py::test_module_count_budget[import_main]\": 0.45837917382085785,\n    \"tests/cli/test_startup_benchmarks.py::test_version_main\": 0.002059388794650848,\n    \"tests/cli/test_subcommands.py::test_clean[classic]\": 11.900434457586353,\n    \"tests/cli/test_subcommands.py::test_clean[libmamba]\": 8.45426372781164,\n    \"tests/cli/test_subcommands.py::test_compare[classic]\": 0.05722558509104522,\n    \"tests/cli/test_subcommands.py::test_compare[libmamba]\": 0.051304332101470576,\n    \"tests/cli/test_subcommands.py::test_config[classic]\": 0.039488109256375185,\n    \"tests/cli/test_subcommands.py::test_config[libmamba]\": 0.0374990580692868,\n    \"tests/cli/test_subcommands.py::test_create[classic]\": 0.568061004071611,\n    \"tests/cli/test_subcommands.py::test_create[libmamba]\": 2.9745349750171632,\n    \"tests/cli/test_subcommands.py::test_doctor[classic]\": 6.183094467419308,\n    \"tests/cli/test_subcommands.py::test_doctor[libmamba]\": 5.052146979699961,\n    \"tests/cli/test_subcommands.py::test_env_config_vars[classic]\": 0.11309888315534382,\n    \"tests/cli/test_subcommands.py::test_env_config_vars[libmamba]\": 0.11236784907585234,\n    \"tests/cli/test_subcommands.py::test_env_create[libmamba]\": 2.943734434774811,\n    \"tests/cli/test_subcommands.py::test_env_export[classic]\": 0.07015482628977761,\n    \"tests/cli/test_subcommands.py::test_env_export[libmamba]\": 0.057493380626371236,\n    \"tests/cli/test_subcommands.py::test_env_list[classic]\": 0.08842706141066446,\n    \"tests/cli/test_subcommands.py::test_env_list[libmamba]\": 0.07735375761107753,\n    \"tests/cli/test_subcommands.py::test_env_list_benchmark[libmamba]\": 0.031026040112545436,\n    \"tests/cli/test_subcommands.py::test_env_remove[classic]\": 0.061249502019394046,\n    \"tests/cli/test_subcommands.py::test_env_remove[libmamba]\": 0.05539045258649485,\n    \"tests/cli/test_subcommands.py::test_env_update[libmamba]\": 3.2729517059958884,\n    \"tests/cli/test_subcommands.py::test_info[classic]\": 0.09261106879504064,\n    \"tests/cli/test_subcommands.py::test_info[libmamba]\": 0.055714173709681,\n    \"tests/cli/test_subcommands.py::test_info_json[classic]\": 0.1458183172677246,\n    \"tests/cli/test_subcommands.py::test_info_json[libmamba]\": 0.0874439796399456,\n    \"tests/cli/test_subcommands.py::test_init[classic]\": 0.590945349357933,\n    \"tests/cli/test_subcommands.py::test_init[libmamba]\": 0.6454897282281243,\n    \"tests/cli/test_subcommands.py::test_install[libmamba]\": 2.483893431173535,\n    \"tests/cli/test_subcommands.py::test_list[libmamba]\": 1.1998611948439022,\n    \"tests/cli/test_subcommands.py::test_notices[classic]\": 0.426125928303606,\n    \"tests/cli/test_subcommands.py::test_notices[libmamba]\": 0.22776807905899402,\n    \"tests/cli/test_subcommands.py::test_package[classic]\": 0.05278154123589017,\n    \"tests/cli/test_subcommands.py::test_package[libmamba]\": 0.05541442716366858,\n    \"tests/cli/test_subcommands.py::test_remove[classic-remove]\": 0.05923575431698758,\n    \"tests/cli/test_subcommands.py::test_remove[classic-uninstall]\": 0.05963813207956206,\n    \"tests/cli/test_subcommands.py::test_remove[libmamba-remove]\": 0.08211797221551026,\n    \"tests/cli/test_subcommands.py::test_remove[libmamba-uninstall]\": 0.05286699551604659,\n    \"tests/cli/test_subcommands.py::test_remove_all_json[classic-remove]\": 1.4214809454516597,\n    \"tests/cli/test_subcommands.py::test_remove_all_json[classic-uninstall]\": 1.4199856794815537,\n    \"tests/cli/test_subcommands.py::test_remove_all_json[libmamba-remove]\": 2.1348880318421037,\n    \"tests/cli/test_subcommands.py::test_remove_all_json[libmamba-uninstall]\": 1.7799441223293142,\n    \"tests/cli/test_subcommands.py::test_rename[classic]\": 0.3650016311063988,\n    \"tests/cli/test_subcommands.py::test_rename[libmamba]\": 0.3685821167429257,\n    \"tests/cli/test_subcommands.py::test_run[libmamba]\": 2.64906842824942,\n    \"tests/cli/test_subcommands.py::test_search[classic]\": 2.5736149283636056,\n    \"tests/cli/test_subcommands.py::test_search[libmamba]\": 3.518990228300445,\n    \"tests/cli/test_subcommands.py::test_update[libmamba-update]\": 2.732436282411962,\n    \"tests/cli/test_subcommands.py::test_update[libmamba-upgrade]\": 2.9433258676010365,\n    \"tests/common/_os/test_windows.py::test_is_admin_on_windows\": 0.002025271524066165,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-None]\": 0.00481117304144203,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC mount [trailing]]\": 2.77821698775147,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC mount]\": 2.799436096014501,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC path [extra]]\": 4.102407231833347,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC path]\": 5.460751602492717,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-bare UNC mount]\": 0.023815464531399613,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-drive [trailing]]\": 0.024153346896911093,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-drive]\": 0.024331981275834403,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-empty string]\": 0.004792913174453751,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-empty tuple]\": 0.004670620430401157,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-list[path]]\": 0.023148458552562205,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-normal path [extra]]\": 0.02234287693409256,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-normal path [trailing]]\": 0.023719186274239055,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-normal path]\": 0.023015794445733137,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-path;...]\": 5.541263183592465,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-relative [extra]]\": 0.022388159428596722,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-relative]\": 0.023523910065366048,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root [leading, trailing]]\": 0.037345373775007164,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root [leading]]\": 0.024131000190918028,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [extra]]\": 0.02297270939906749,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [leading, trailing]]\": 0.02255894583548972,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [leading]]\": 0.023942817279004998,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [trailing]]\": 0.023299869063919166,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path0]\": 0.024492470767851146,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path1]\": 0.024063929171993497,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root]\": 0.02360427576068029,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-tuple[path, ...]]\": 4.148837260456061,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-None]\": 0.004668268716518769,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC mount [trailing]]\": 0.013731870292029333,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC mount]\": 0.00782656259194305,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC path [extra]]\": 0.00702377550158604,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC path]\": 0.012674254280817573,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-bare UNC mount]\": 0.008093208248293486,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-drive [trailing]]\": 0.007754247604931273,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-drive]\": 0.008199259417671302,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-empty string]\": 0.005125450990839132,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-empty tuple]\": 0.005029011024774424,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-list[path]]\": 0.007466331287312506,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-normal path [extra]]\": 0.008478862717689776,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-normal path [trailing]]\": 0.007793694076894739,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-normal path]\": 0.007300269293526478,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-path;...]\": 0.00812006257985629,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-relative [extra]]\": 0.007183013922524475,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-relative]\": 0.0071171424263871165,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root [leading, trailing]]\": 0.00802049304159037,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root [leading]]\": 0.007144357959631333,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [extra]]\": 0.0070512874966778775,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [leading, trailing]]\": 0.007211395213922519,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [leading]]\": 0.00787049266549069,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [trailing]]\": 0.008154024116872691,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path0]\": 0.007424624227325627,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path1]\": 0.007168612954315248,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root]\": 0.009885398150454233,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-tuple[path, ...]]\": 0.007089327936585328,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-None]\": 0.0023778286716951568,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-empty string]\": 0.001980067385209012,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-empty tuple]\": 0.002177020117732575,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-list[path]]\": 0.02106056859510103,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-path;...]\": 0.021394396011514466,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-path]\": 0.02179035772742395,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-tuple[path, ...]]\": 0.02108475218351191,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[fallback-None]\": 0.0025094828834529904,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[fallback-empty string]\": 0.0023774394547198983,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[fallback-empty tuple]\": 0.0025465283748032537,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[fallback-list[path]]\": 0.006561952280607159,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[fallback-path;...]\": 0.005565311407702466,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[fallback-path]\": 0.01180574835457754,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[fallback-tuple[path, ...]]\": 0.01179753108276758,\n    \"tests/common/pkg_formats/test_python.py::test_basepydist_load_requires_provides_file\": 0.0035253791414646763,\n    \"tests/common/pkg_formats/test_python.py::test_basepydist_parse_entries_file_data\": 0.006235541722376284,\n    \"tests/common/pkg_formats/test_python.py::test_basepydist_parse_requires_file_data\": 0.003239174679661504,\n    \"tests/common/pkg_formats/test_python.py::test_dist_get_paths\": 0.0027153465566342244,\n    \"tests/common/pkg_formats/test_python.py::test_dist_get_paths_no_paths\": 0.001922945487192194,\n    \"tests/common/pkg_formats/test_python.py::test_evaluate_marker\": 0.005311362858413549,\n    \"tests/common/pkg_formats/test_python.py::test_get_default_marker_context\": 0.0018798598177435723,\n    \"tests/common/pkg_formats/test_python.py::test_get_dist_file_from_egg_link\": 0.014628705951534768,\n    \"tests/common/pkg_formats/test_python.py::test_get_dist_requirements\": 0.003514743969371717,\n    \"tests/common/pkg_formats/test_python.py::test_get_entry_points\": 0.007348326775246727,\n    \"tests/common/pkg_formats/test_python.py::test_get_extra_provides\": 0.0033417538347052236,\n    \"tests/common/pkg_formats/test_python.py::test_get_python_distribution_info\": 0.00044042310778073373,\n    \"tests/common/pkg_formats/test_python.py::test_get_site_packages_anchor_files\": 0.042885235961183335,\n    \"tests/common/pkg_formats/test_python.py::test_metadata[path0-False-False-False-False]\": 0.004432548911648392,\n    \"tests/common/pkg_formats/test_python.py::test_metadata[path1-True-False-False-False]\": 0.00238278303843218,\n    \"tests/common/pkg_formats/test_python.py::test_metadata[path2-True-True-True-False]\": 0.002657096808896422,\n    \"tests/common/pkg_formats/test_python.py::test_metadata[path3-True-True-True-True]\": 0.0023841465165786585,\n    \"tests/common/pkg_formats/test_python.py::test_metadata_keys\": 0.0014939713274331752,\n    \"tests/common/pkg_formats/test_python.py::test_metadata_none\": 0.0015046575201252592,\n    \"tests/common/pkg_formats/test_python.py::test_metadata_process_path\": 0.0029252324217559538,\n    \"tests/common/pkg_formats/test_python.py::test_metadata_read_metadata\": 0.003516880872026975,\n    \"tests/common/pkg_formats/test_python.py::test_norm_package_name\": 0.001917188361613624,\n    \"tests/common/pkg_formats/test_python.py::test_norm_package_version\": 0.014141071589215721,\n    \"tests/common/pkg_formats/test_python.py::test_parse_specification\": 0.007801368198918283,\n    \"tests/common/pkg_formats/test_python.py::test_pydist_check_files\": 0.003816268798244886,\n    \"tests/common/pkg_formats/test_python.py::test_pypi_name_to_conda_name\": 0.014520304049017928,\n    \"tests/common/pkg_formats/test_python.py::test_python_dist_egg_fpath\": 0.002375653551101969,\n    \"tests/common/pkg_formats/test_python.py::test_python_dist_egg_path\": 0.002609223286358543,\n    \"tests/common/pkg_formats/test_python.py::test_python_dist_info\": 0.003520747169052816,\n    \"tests/common/pkg_formats/test_python.py::test_python_dist_info_conda_dependencies\": 0.010285967941403797,\n    \"tests/common/pkg_formats/test_python.py::test_python_dist_info_conda_dependencies_2\": 0.002510638174198326,\n    \"tests/common/pkg_formats/test_python.py::test_python_dist_info_conda_dependencies_3\": 0.0025116305565507317,\n    \"tests/common/pkg_formats/test_python.py::test_split_spec\": 0.002216549517539846,\n    \"tests/common/test_configuration.py::test_commented_map_parameter\": 0.0022734411418949695,\n    \"tests/common/test_configuration.py::test_config_resets\": 0.0019724170016077397,\n    \"tests/common/test_configuration.py::test_cross_parameter_validation\": 0.0014228256300273959,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/$$/suffix]\": 0.00039287361556552625,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/$/suffix]\": 0.001579075520039178,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/$1/suffix]\": 0.0015332679200797757,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/$MISSING/suffix]\": 0.0015917802470371393,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/$VARIABLE/suffix]\": 0.001661989970691418,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/${1}/suffix]\": 0.0017944810427932216,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/${MISSING}/suffix]\": 0.0015698125470150629,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/${VARIABLE}/suffix]\": 0.0016740382530829286,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/${}/suffix]\": 0.0016067572105589248,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/%%/suffix]\": 0.00038483060553441814,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/%/suffix]\": 0.0015697507924747822,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/%1%/suffix]\": 0.0016096623303073817,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/%1/suffix]\": 0.0015441155212632099,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/%MISSING%/suffix]\": 0.0016005772949540052,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/%VARIABLE%/suffix]\": 0.0016361329094571114,\n    \"tests/common/test_configuration.py::test_default_values\": 0.001618699745380018,\n    \"tests/common/test_configuration.py::test_empty_map_parameter\": 0.005874108404496204,\n    \"tests/common/test_configuration.py::test_env_var_config\": 0.0018391315972617283,\n    \"tests/common/test_configuration.py::test_env_var_config_alias\": 0.0018195133902597625,\n    \"tests/common/test_configuration.py::test_env_var_config_empty_sequence\": 0.001690034650536032,\n    \"tests/common/test_configuration.py::test_env_var_config_no_split_sequence\": 0.0018334815099694507,\n    \"tests/common/test_configuration.py::test_env_var_config_split_sequence\": 0.0017892619929708218,\n    \"tests/common/test_configuration.py::test_expand_search_path\": 0.0003825868022627954,\n    \"tests/common/test_configuration.py::test_expanded_variables\": 0.004195898644910995,\n    \"tests/common/test_configuration.py::test_important_primitive_map_merges\": 0.04245011012668418,\n    \"tests/common/test_configuration.py::test_invalid_map_parameter\": 0.0016492939153189652,\n    \"tests/common/test_configuration.py::test_invalid_seq_parameter\": 0.001781763752749909,\n    \"tests/common/test_configuration.py::test_list_merges\": 0.036833349639108975,\n    \"tests/common/test_configuration.py::test_load_raw_configs\": 0.020101892903169744,\n    \"tests/common/test_configuration.py::test_map_parameter_must_be_map\": 0.002716891375236345,\n    \"tests/common/test_configuration.py::test_nested\": 0.008151761823132191,\n    \"tests/common/test_configuration.py::test_object\": 0.00922974539570842,\n    \"tests/common/test_configuration.py::test_object_defaults_completely_empty\": 0.002079755466228667,\n    \"tests/common/test_configuration.py::test_object_defaults_partially_empty\": 0.0046364693578908435,\n    \"tests/common/test_configuration.py::test_parameter\": 0.0015191147671088563,\n    \"tests/common/test_configuration.py::test_parameter_flag\": 0.0014395130222156828,\n    \"tests/common/test_configuration.py::test_pretty_list\": 0.0018577572603688916,\n    \"tests/common/test_configuration.py::test_raise_errors\": 0.0014828662735534692,\n    \"tests/common/test_configuration.py::test_set_search_path_empty_path\": 0.0014206744048049728,\n    \"tests/common/test_configuration.py::test_set_search_path_reflects_fs_changes[dir-child-added]\": 0.004853878571453374,\n    \"tests/common/test_configuration.py::test_set_search_path_reflects_fs_changes[file-created]\": 0.007697730357119239,\n    \"tests/common/test_configuration.py::test_set_search_path_reflects_fs_changes[file-removed]\": 0.005180653571454199,\n    \"tests/common/test_configuration.py::test_set_search_path_refreshes_on_new_path[channels_a0-channels_b0]\": 0.0063240214285657645,\n    \"tests/common/test_configuration.py::test_set_search_path_refreshes_on_new_path[channels_a1-channels_b1]\": 0.006497604761904763,\n    \"tests/common/test_configuration.py::test_set_search_path_reloads_raw_data\": 0.015783927380983272,\n    \"tests/common/test_configuration.py::test_set_search_path_result_is_tuple\": 0.004580311904836284,\n    \"tests/common/test_configuration.py::test_simple_merges_and_caching\": 0.011883982098339527,\n    \"tests/common/test_configuration.py::test_unique_sequence_map_error_with_duplicates\": 0.003287324643939744,\n    \"tests/common/test_configuration.py::test_unique_sequence_map_error_with_unique_key\": 0.003021629373022278,\n    \"tests/common/test_configuration.py::test_validate_all\": 0.02416435424631761,\n    \"tests/common/test_configuration.py::test_validation\": 0.040968085600276705,\n    \"tests/common/test_io.py::test_attach_stderr_handler\": 0.004993254211144522,\n    \"tests/common/test_io.py::test_captured\": 0.005614826570425419,\n    \"tests/common/test_io.py::test_thread_limited_executor_handles_thread_limit[ThreadLimitedThreadPoolExecutor-False]\": 0.10780769750286966,\n    \"tests/common/test_io.py::test_thread_limited_executor_handles_thread_limit[ThreadPoolExecutor-True]\": 0.0027476598809254597,\n    \"tests/common/test_json.py::test_condajsonencoder_serialises_frozendicts\": 0.0014911554444852102,\n    \"tests/common/test_json.py::test_condajsonencoder_with_dumps\": 0.0015346247217125012,\n    \"tests/common/test_logic.py::test_ALL\": 7.273458358530974,\n    \"tests/common/test_logic.py::test_AMONE\": 1.2673295434850353,\n    \"tests/common/test_logic.py::test_AND\": 0.012746162109701153,\n    \"tests/common/test_logic.py::test_ANY\": 7.041791856184803,\n    \"tests/common/test_logic.py::test_ITE\": 0.3881401406068086,\n    \"tests/common/test_logic.py::test_LinearBound\": 6.604732597932649,\n    \"tests/common/test_logic.py::test_NOT\": 0.005959777732569133,\n    \"tests/common/test_logic.py::test_OR\": 0.009685104490821843,\n    \"tests/common/test_logic.py::test_XONE\": 1.247045900728231,\n    \"tests/common/test_logic.py::test_XOR\": 0.014016158811119601,\n    \"tests/common/test_logic.py::test_minimal_unsatisfiable_subset\": 0.010033599862351982,\n    \"tests/common/test_logic.py::test_minimize\": 0.0074247181414860775,\n    \"tests/common/test_logic.py::test_sat\": 0.0019154875409592988,\n    \"tests/common/test_path.py::test_deprecations[KNOWN_EXTENSIONS-TypeError]\": 0.0017942947969711864,\n    \"tests/common/test_path.py::test_deprecations[is_package_file-TypeError]\": 0.0017686271350262571,\n    \"tests/common/test_path.py::test_get_major_minor_version_no_dot\": 0.0015432268496243396,\n    \"tests/common/test_path.py::test_missing_pyc_files_27\": 0.0037735727548505868,\n    \"tests/common/test_path.py::test_missing_pyc_files_34\": 0.003056770081827792,\n    \"tests/common/test_path.py::test_missing_pyc_files_35\": 0.0020692060608911806,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH0]\": 0.061370394020379145,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH10]\": 0.059016752153465156,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH11]\": 0.0939766160149069,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH1]\": 0.0566952240495416,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH2]\": 0.05853037369556517,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH3]\": 0.040141452143115895,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH4]\": 0.09471567602919227,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH5]\": 0.057983743855863475,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH6]\": 0.04065684627705218,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH7]\": 0.05765295910194,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH8]\": 0.09444430166733883,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH9]\": 0.04113785931963068,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC0]\": 0.0942773840229679,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC1]\": 5.615680097976043,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC2]\": 5.5585425168043345,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC3]\": 5.512123594030973,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC4]\": 0.05965732952169969,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC5]\": 5.590491519473199,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC6]\": 5.530495788651429,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC7]\": 0.05856525773768405,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-cwd0]\": 0.09356096510122165,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-cwd1]\": 0.0038921397462683104,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-cwd2]\": 0.0036402623977691367,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-cwd3]\": 0.09446828343882757,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive0]\": 0.0402009213992465,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive10]\": 0.11182407326458597,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive11]\": 0.05890652397363005,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive12]\": 0.06072147765785332,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive13]\": 0.058725232083753603,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive14]\": 0.09441392195993395,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive15]\": 0.058031864146957206,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive1]\": 0.04196088275876506,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive2]\": 0.05780519854057337,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive3]\": 0.058185204813161036,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive4]\": 0.09469750967081018,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive5]\": 0.040739939798299506,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive6]\": 0.04081529492852114,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive7]\": 0.04090500433642125,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive8]\": 0.05932878343444171,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive9]\": 0.05795762904707799,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-relative0]\": 0.09284617539380507,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-relative1]\": 0.09455000555332221,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-relative2]\": 0.09327291151558477,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root0]\": 0.09494716937009416,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root10]\": 0.040289792727232925,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root11]\": 0.057711085502824416,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root12]\": 0.09439775156632159,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root13]\": 0.039414358933162315,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root14]\": 0.05927556234486717,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root1]\": 0.039180949716485454,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root2]\": 0.040815690232765385,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root3]\": 0.057477942094034846,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root4]\": 0.09326311927804913,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root5]\": 0.04030724938502975,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root6]\": 0.0407662126466926,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root7]\": 0.05824751168053019,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root8]\": 0.091853780113783,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root9]\": 0.03959122569343383,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH0]\": 0.009435734743068904,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH10]\": 0.012368376828772787,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH11]\": 0.03382787068230028,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH1]\": 0.012015735433098116,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH2]\": 0.01182978996412602,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH3]\": 0.012804620973668879,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH4]\": 0.026847837075263743,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH5]\": 0.012781787995470298,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH6]\": 0.010138256887277274,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH7]\": 0.012167302404991379,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH8]\": 0.01776262720328973,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH9]\": 0.009390646132968326,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC0]\": 0.01704782128381423,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC1]\": 0.02256328406668057,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC2]\": 0.017440278298802715,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC3]\": 0.010003152825125816,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC4]\": 0.014765111643182505,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC5]\": 0.017134800788545526,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC6]\": 0.009708169107038657,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC7]\": 0.012625758628973678,\n    \"tests/common/test_path.py::test_path_conversion[fallback-cwd0]\": 0.01747876998223013,\n    \"tests/common/test_path.py::test_path_conversion[fallback-cwd1]\": 0.004370502424352387,\n    \"tests/common/test_path.py::test_path_conversion[fallback-cwd2]\": 0.004439433284986222,\n    \"tests/common/test_path.py::test_path_conversion[fallback-cwd3]\": 0.016908993148712866,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive0]\": 0.012095931148264046,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive10]\": 0.022860377157880786,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive11]\": 0.015252958636048692,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive12]\": 0.014377543331602866,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive13]\": 0.014684821069068283,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive14]\": 0.02240901334795413,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive15]\": 0.014680283724326185,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive1]\": 0.012245619285605564,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive2]\": 0.0150298457342301,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive3]\": 0.014365465359065379,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive4]\": 0.022287713959424506,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive5]\": 0.012086739550780212,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive6]\": 0.01217725922809143,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive7]\": 0.012314368054950689,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive8]\": 0.014895452250372122,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive9]\": 0.01486199432211928,\n    \"tests/common/test_path.py::test_path_conversion[fallback-relative0]\": 0.01705349793410775,\n    \"tests/common/test_path.py::test_path_conversion[fallback-relative1]\": 0.017705688650698916,\n    \"tests/common/test_path.py::test_path_conversion[fallback-relative2]\": 0.017036382209861506,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root0]\": 0.017365605617299138,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root10]\": 0.009852912303680862,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root11]\": 0.012310165681761588,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root12]\": 0.01762713263249368,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root13]\": 0.009445797874357805,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root14]\": 0.012540828990756443,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root1]\": 0.010335087743263487,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root2]\": 0.009541366278855833,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root3]\": 0.01361363123042273,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root4]\": 0.016697786786357964,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root5]\": 0.009709299857845312,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root6]\": 0.014137349038450433,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root7]\": 0.012490379930643555,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root8]\": 0.017353210969621596,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root9]\": 0.009775898620307201,\n    \"tests/common/test_path.py::test_path_conversion_falsy[None]\": 0.0016135013537124326,\n    \"tests/common/test_path.py::test_path_conversion_falsy[empty dict]\": 0.001598707561189717,\n    \"tests/common/test_path.py::test_path_conversion_falsy[empty list]\": 0.0016008266799292612,\n    \"tests/common/test_path.py::test_path_conversion_falsy[empty set]\": 0.0017052946090431649,\n    \"tests/common/test_path.py::test_path_conversion_falsy[empty tuple]\": 0.0016257251563507778,\n    \"tests/common/test_path.py::test_path_identity\": 0.0032441563357008987,\n    \"tests/common/test_path.py::test_strip_pkg_extension[/path/numpy-1.26.4-py312h8753938_0-/path/numpy-1.26.4-py312h8753938_0-None]\": 0.0017175724637704848,\n    \"tests/common/test_path.py::test_strip_pkg_extension[/path/numpy-1.26.4-py312h8753938_0.tar.bz2-/path/numpy-1.26.4-py312h8753938_0-.tar.bz2]\": 0.0018749656423186897,\n    \"tests/common/test_path.py::test_strip_pkg_extension[/path/pandas-2.2.3-py312h526ad5a_1.conda-/path/pandas-2.2.3-py312h526ad5a_1-.conda]\": 0.0017970364686353537,\n    \"tests/common/test_path.py::test_strip_pkg_extension[requests-2.32.3-py313h06a4308_0.tar.bz2-requests-2.32.3-py313h06a4308_0-.tar.bz2]\": 0.0017351154652543892,\n    \"tests/common/test_path.py::test_strip_pkg_extension[zlib-1.3.1-h5f15de7_0-zlib-1.3.1-h5f15de7_0-None]\": 0.001760252738619182,\n    \"tests/common/test_path.py::test_strip_pkg_extension[zlib-1.3.1-h5f15de7_0.conda-zlib-1.3.1-h5f15de7_0-.conda]\": 0.0018638481925330446,\n    \"tests/common/test_path.py::test_url_to_path_unix\": 0.0016560165199112622,\n    \"tests/common/test_path.py::test_url_to_path_windows_local\": 0.0017567702234362447,\n    \"tests/common/test_path.py::test_url_to_path_windows_unc\": 0.0015263002749042699,\n    \"tests/common/test_path.py::test_win_path_backout\": 0.00145050345839239,\n    \"tests/common/test_serialize.py::test_comment_round_trip\": 0.00601494515521574,\n    \"tests/common/test_serialize.py::test_deprecations[_yaml_round_trip-None]\": 0.0023609242511134585,\n    \"tests/common/test_serialize.py::test_deprecations[_yaml_safe-None]\": 0.00193545375110656,\n    \"tests/common/test_serialize.py::test_deprecations[json_dump-TypeError]\": 0.0017064950351334221,\n    \"tests/common/test_serialize.py::test_deprecations[yaml_round_trip_dump-TypeError]\": 0.0017904120506606292,\n    \"tests/common/test_serialize.py::test_deprecations[yaml_round_trip_load-TypeError]\": 0.0016924492427309553,\n    \"tests/common/test_serialize.py::test_deprecations[yaml_safe_dump-TypeError]\": 0.001752962123134422,\n    \"tests/common/test_serialize.py::test_deprecations[yaml_safe_load-TypeError]\": 0.0017270738613186787,\n    \"tests/common/test_serialize.py::test_encode_enum[value0-  - disabled\\\\n-write]\": 0.003672703372492772,\n    \"tests/common/test_serialize.py::test_encode_enum[value1-  - warn\\\\n-write]\": 0.001996353789418425,\n    \"tests/common/test_serialize.py::test_encode_enum[value2-  - enabled\\\\n-write]\": 0.0019949231597280776,\n    \"tests/common/test_serialize.py::test_encode_enum[value3-[\\\\n  \\\"disabled\\\"\\\\n]-write]\": 0.001739334737103684,\n    \"tests/common/test_serialize.py::test_encode_enum[value4-[\\\\n  \\\"warn\\\"\\\\n]-write]\": 0.0017465592988491594,\n    \"tests/common/test_serialize.py::test_encode_enum[value5-[\\\\n  \\\"enabled\\\"\\\\n]-write]\": 0.0018091525676542002,\n    \"tests/common/test_serialize.py::test_read_write[obj0-{\\\\n  \\\"a_map\\\": {\\\\n    \\\"a_key\\\": \\\"a_value\\\"\\\\n  },\\\\n  \\\"a_seq\\\": [\\\\n    1,\\\\n    2,\\\\n    3\\\\n  ]\\\\n}-read-write0]\": 0.004242415305152597,\n    \"tests/common/test_serialize.py::test_read_write[obj1-{\\\\n  \\\"a_map\\\": {\\\\n    \\\"field1\\\": true,\\\\n    \\\"field2\\\": \\\"yes\\\"\\\\n  },\\\\n  \\\"a_seq_1\\\": [\\\\n    1,\\\\n    2,\\\\n    3\\\\n  ],\\\\n  \\\"a_seq_2\\\": [\\\\n    1,\\\\n    {\\\\n      \\\"two\\\": 2\\\\n    },\\\\n    3\\\\n  ],\\\\n  \\\"single_bool\\\": false,\\\\n  \\\"single_str\\\": \\\"no\\\"\\\\n}-read-write1]\": 0.004559308941617265,\n    \"tests/common/test_serialize.py::test_read_write[obj2-a_seq:\\\\n  - 1\\\\n  - 2\\\\n  - 3\\\\na_map:\\\\n  a_key: a_value\\\\n-read-write]\": 0.018615561280636333,\n    \"tests/common/test_serialize.py::test_read_write[obj3-single_bool: false\\\\nsingle_str: no\\\\na_seq_1:\\\\n  - 1\\\\n  - 2\\\\n  - 3\\\\na_seq_2:\\\\n  - 1\\\\n  - two: 2\\\\n  - 3\\\\na_map:\\\\n  field1: true\\\\n  field2: yes\\\\n-read-write]\": 0.016396343474042546,\n    \"tests/common/test_toposort.py::test_cycle\": 0.0035707316482800288,\n    \"tests/common/test_toposort.py::test_cycle_best_effort\": 0.002674389321014283,\n    \"tests/common/test_toposort.py::test_degenerate\": 0.0014710265212759125,\n    \"tests/common/test_toposort.py::test_pop_key\": 0.002865969032431496,\n    \"tests/common/test_toposort.py::test_python_is_prioritized\": 0.0015253976047122839,\n    \"tests/common/test_toposort.py::test_simple\": 0.004590731241203843,\n    \"tests/common/test_url.py::test_add_username_and_pass_to_url\": 0.001600714695103655,\n    \"tests/common/test_url.py::test_is_ip_address\": 0.00284239901287118,\n    \"tests/common/test_url.py::test_is_ipv6_address\": 0.005632682269021635,\n    \"tests/common/test_url.py::test_is_url\": 0.0017367417807529835,\n    \"tests/common/test_url.py::test_maybe_add_auth\": 0.007073737657027203,\n    \"tests/common/test_url.py::test_split_scheme_auth_token\": 0.001547246820444725,\n    \"tests/common/test_url.py::test_url_obj_unparse[test_url_obj0-http://conda.io/path/to/somewhere]\": 0.0015874024303381249,\n    \"tests/common/test_url.py::test_url_obj_unparse[test_url_obj1-https://user:pass@conda.io/path/to/somewhere]\": 0.001704290697716086,\n    \"tests/common/test_url.py::test_url_obj_unparse[test_url_obj2-file:///opt/happy/path]\": 0.002115349616737303,\n    \"tests/common/test_url.py::test_url_obj_unparse[test_url_obj3-file:///path/to/something.txt]\": 0.001650179930361139,\n    \"tests/common/test_url.py::test_url_to_s3_info\": 0.0016536524211574867,\n    \"tests/common/test_url.py::test_urlparse[192.168.1.1:8080/path/to/resource-exp_url_obj0]\": 0.0017264558778408577,\n    \"tests/common/test_url.py::test_urlparse[file:///opt/happy/path-exp_url_obj2]\": 0.0017043368574437417,\n    \"tests/common/test_url.py::test_urlparse[https://conda.io/happy/path-exp_url_obj1]\": 0.001703347095149378,\n    \"tests/common/test_url.py::test_urlparse[https://u:p@conda.io/t/x1029384756/more/path-exp_url_obj3]\": 0.0016736464184325343,\n    \"tests/core/test_envs_manager.py::test_list_all_known_prefixes_with_none_values_error\": 0.00042366398491177487,\n    \"tests/core/test_envs_manager.py::test_list_all_known_prefixes_with_permission_error\": 0.023825627655742906,\n    \"tests/core/test_envs_manager.py::test_prefix_cli_flag\": 0.003809529819374631,\n    \"tests/core/test_envs_manager.py::test_register_env_directory_creation_error\": 0.004367284122726498,\n    \"tests/core/test_envs_manager.py::test_register_unregister_location_env\": 0.022178849350096317,\n    \"tests/core/test_envs_manager.py::test_rewrite_environments_txt_file\": 0.010890442964462956,\n    \"tests/core/test_index.py::TestIndex::test_cache_entries[False]\": 0.5228593480284665,\n    \"tests/core/test_index.py::TestIndex::test_cache_entries[True]\": 0.5706264503283008,\n    \"tests/core/test_index.py::TestIndex::test_contains_invalid[False]\": 0.12165325014118875,\n    \"tests/core/test_index.py::TestIndex::test_contains_invalid[True]\": 0.2885233037532366,\n    \"tests/core/test_index.py::TestIndex::test_contains_valid[False]\": 0.18855175079424236,\n    \"tests/core/test_index.py::TestIndex::test_contains_valid[True]\": 0.1978647684221942,\n    \"tests/core/test_index.py::TestIndex::test_copy[False]\": 0.2738598748984932,\n    \"tests/core/test_index.py::TestIndex::test_copy[True]\": 0.21308741849792692,\n    \"tests/core/test_index.py::TestIndex::test_getitem_cache[False]\": 0.11477865315678279,\n    \"tests/core/test_index.py::TestIndex::test_getitem_cache[True]\": 0.17078375648240665,\n    \"tests/core/test_index.py::TestIndex::test_getitem_channel[False]\": 0.14915373633642914,\n    \"tests/core/test_index.py::TestIndex::test_getitem_channel[True]\": 0.17243342813027768,\n    \"tests/core/test_index.py::TestIndex::test_getitem_channel_invalid[False]\": 0.13279492225700945,\n    \"tests/core/test_index.py::TestIndex::test_getitem_channel_invalid[True]\": 0.1718398335564235,\n    \"tests/core/test_index.py::TestIndex::test_getitem_feature[False]\": 0.14092762075050377,\n    \"tests/core/test_index.py::TestIndex::test_getitem_feature[True]\": 0.1721005636211838,\n    \"tests/core/test_index.py::TestIndex::test_getitem_feature_non_existent[False]\": 0.1621954410552972,\n    \"tests/core/test_index.py::TestIndex::test_getitem_feature_non_existent[True]\": 0.21311568763459837,\n    \"tests/core/test_index.py::TestIndex::test_getitem_prefix[False]\": 0.16510442336594058,\n    \"tests/core/test_index.py::TestIndex::test_getitem_prefix[True]\": 0.16841754245628376,\n    \"tests/core/test_index.py::TestIndex::test_getitem_system_package_invalid[False]\": 0.15670733104770732,\n    \"tests/core/test_index.py::TestIndex::test_getitem_system_package_invalid[True]\": 0.19371005668444077,\n    \"tests/core/test_index.py::TestIndex::test_getitem_system_package_valid[False]\": 0.1097931523422471,\n    \"tests/core/test_index.py::TestIndex::test_getitem_system_package_valid[True]\": 0.18257859507154775,\n    \"tests/core/test_index.py::TestIndex::test_init_conflicting_subdirs\": 0.03351908796359579,\n    \"tests/core/test_index.py::TestIndex::test_init_prefix_data\": 0.028721482216027983,\n    \"tests/core/test_index.py::TestIndex::test_init_prefix_path\": 0.028592194434193478,\n    \"tests/core/test_index.py::TestIndex::test_init_use_local\": 0.026009289145616833,\n    \"tests/core/test_index.py::TestIndex::test_reduced_index[False]\": 0.1692954098309695,\n    \"tests/core/test_index.py::TestIndex::test_reduced_index[True]\": 0.23125576161848538,\n    \"tests/core/test_index.py::test_calculate_channel_urls\": 0.02938851697683273,\n    \"tests/core/test_index.py::test_deprecations[calculate_channel_urls-None]\": 0.04089183040951994,\n    \"tests/core/test_index.py::test_dist_str_in_index\": 0.06559025326135906,\n    \"tests/core/test_index.py::test_get_index_lazy[conda-forge-sample_packages1]\": 9.145245903376816,\n    \"tests/core/test_index.py::test_get_index_lazy[defaults-sample_packages0]\": 0.17414520928686167,\n    \"tests/core/test_index.py::test_get_index_platform[linux-64]\": 0.21474301128594162,\n    \"tests/core/test_index.py::test_get_index_platform[osx-64]\": 0.21220625880592053,\n    \"tests/core/test_index.py::test_get_index_platform[win-64]\": 0.026667910765975668,\n    \"tests/core/test_index.py::test_supplement_index_with_system\": 0.20533098714502146,\n    \"tests/core/test_index.py::test_supplement_index_with_system_archspec\": 0.1789162585037473,\n    \"tests/core/test_index.py::test_supplement_index_with_system_cuda\": 0.050473055652040924,\n    \"tests/core/test_index.py::test_supplement_index_with_system_glibc\": 0.0003717800861527121,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[1.2.3.4-1.2.3.4]\": 0.0003839569328445948,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[4.2-4.2]\": 0.0003834648976224929,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[4.2.0-42-generic-4.2.0]\": 0.0003857777905309825,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[4.2.1-4.2.1]\": 0.0003720276139863638,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[5.4.89+-5.4.89]\": 0.0003896985902830577,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[5.5-rc1-5.5]\": 0.0003802926306527818,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[9.1.a-9.1]\": 0.0003950383539694143,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[9.1.a.2-9.1]\": 0.00038759982442090993,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[9.a.1-0]\": 0.00039894549179064,\n    \"tests/core/test_index.py::test_supplement_index_with_system_osx\": 0.00040450275905133784,\n    \"tests/core/test_initialize.py::test__get_python_info\": 0.011510535573145611,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_handle_double_semicolons]\": 0.00830365801372877,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_handle_leading_trailing_semicolons]\": 0.012261479289157275,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_to_empty_path]\": 0.009594269926786626,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_to_existing_path_without_condabin]\": 0.009229605366934731,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_when_condabin_exists_case_insensitive]\": 0.007619816471086761,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_when_condabin_exists_case_sensitive]\": 0.007515393688019186,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_when_condabin_exists_later_in_path]\": 0.007749359828058734,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[dry_run_add]\": 0.007806904171266775,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[dry_run_remove]\": 0.008009201946045595,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_handle_double_semicolons]\": 0.0076797048242687625,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_handle_leading_trailing_semicolons]\": 0.0078061597262188325,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_does_not_exist]\": 0.007956980374145583,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_at_beginning]\": 0.007975811816310976,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_at_end]\": 0.007943762660501367,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_case_insensitive]\": 0.008018647448420242,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_in_middle]\": 0.007893533062949215,\n    \"tests/core/test_initialize.py::test_conda_init_dry_run\": 0.07747719178050637,\n    \"tests/core/test_initialize.py::test_get_python_info\": 0.012918076020586582,\n    \"tests/core/test_initialize.py::test_init_all\": 0.60679252202347,\n    \"tests/core/test_initialize.py::test_init_cmd_exe_registry\": 0.011823210170496486,\n    \"tests/core/test_initialize.py::test_init_condabin[init_fish_user]\": 0.04266753462385162,\n    \"tests/core/test_initialize.py::test_init_condabin[init_powershell_user]\": 0.004665491178007828,\n    \"tests/core/test_initialize.py::test_init_condabin[init_sh_system]\": 0.04168562184278108,\n    \"tests/core/test_initialize.py::test_init_condabin[init_sh_user]\": 0.07799164069199185,\n    \"tests/core/test_initialize.py::test_init_condabin[init_xonsh_user]\": 0.042855014098310565,\n    \"tests/core/test_initialize.py::test_init_enable_long_path\": 0.0029937643214550374,\n    \"tests/core/test_initialize.py::test_init_sh_system\": 0.037647150860338145,\n    \"tests/core/test_initialize.py::test_init_sh_user_tcsh_unix\": 0.000396743298465099,\n    \"tests/core/test_initialize.py::test_init_sh_user_unix\": 0.00039997586121930014,\n    \"tests/core/test_initialize.py::test_init_sh_user_windows\": 0.056398085365136436,\n    \"tests/core/test_initialize.py::test_initialize_dev_bash\": 0.06706271107002583,\n    \"tests/core/test_initialize.py::test_initialize_dev_cmd_exe\": 0.053921821389168505,\n    \"tests/core/test_initialize.py::test_install_1\": 0.024511498976668353,\n    \"tests/core/test_initialize.py::test_install_conda_csh\": 0.017216462022059408,\n    \"tests/core/test_initialize.py::test_install_conda_fish\": 0.018412015561674336,\n    \"tests/core/test_initialize.py::test_install_conda_sh\": 0.019987540983712058,\n    \"tests/core/test_initialize.py::test_install_conda_xsh\": 0.017503751730492588,\n    \"tests/core/test_initialize.py::test_install_condabin_conda_bat\": 0.017107832924180336,\n    \"tests/core/test_initialize.py::test_make_entry_point\": 0.019059750120502636,\n    \"tests/core/test_initialize.py::test_make_entry_point_exe\": 0.007022623560368308,\n    \"tests/core/test_initialize.py::test_make_initialize_plan_bash_zsh\": 0.02123527461831529,\n    \"tests/core/test_initialize.py::test_make_initialize_plan_cmd_exe\": 0.022467287848815003,\n    \"tests/core/test_initialize.py::test_make_install_plan\": 0.0033009223699666007,\n    \"tests/core/test_initialize.py::test_print_plan_results_dry_run_with_changes\": 0.006873535347141135,\n    \"tests/core/test_initialize.py::test_print_plan_results_dry_run_with_no_changes\": 0.006836349675594759,\n    \"tests/core/test_initialize.py::test_print_plan_results_real_run_no_changes\": 0.006609204922047753,\n    \"tests/core/test_initialize.py::test_print_plan_results_real_run_with_changes\": 0.0066539066518798914,\n    \"tests/core/test_link.py::test_calculate_change_report_downgrade\": 0.005356068856066863,\n    \"tests/core/test_link.py::test_calculate_change_report_revised_variant\": 0.005753356581737454,\n    \"tests/core/test_link.py::test_calculate_change_report_superseded\": 0.0025035512647481203,\n    \"tests/core/test_link.py::test_calculate_change_report_update\": 0.0027953108728475994,\n    \"tests/core/test_package_cache_data.py::test_ProgressiveFetchExtract_prefers_conda_v2_format\": 0.018943531594601805,\n    \"tests/core/test_package_cache_data.py::test_conda_pkg_in_pkg_cache_doesnt_overwrite_tar_bz2\": 0.18051370506967188,\n    \"tests/core/test_package_cache_data.py::test_cover_extract_bad_package\": 0.019740228960782997,\n    \"tests/core/test_package_cache_data.py::test_cover_fetch_not_exists\": 22.29017822120814,\n    \"tests/core/test_package_cache_data.py::test_cover_get_entry_to_link\": 0.009412217878760624,\n    \"tests/core/test_package_cache_data.py::test_cover_reverse\": 0.0019069867826535685,\n    \"tests/core/test_package_cache_data.py::test_download_filename_backward_compat_old_repodata\": 0.006472037262746848,\n    \"tests/core/test_package_cache_data.py::test_download_filename_backward_compat_tar_bz2\": 0.004224164400082847,\n    \"tests/core/test_package_cache_data.py::test_download_filename_from_url_basename\": 0.004842990946022767,\n    \"tests/core/test_package_cache_data.py::test_instantiating_package_cache_when_both_tar_bz2_and_conda_exist\": 0.11520582590622895,\n    \"tests/core/test_package_cache_data.py::test_instantiating_package_cache_when_both_tar_bz2_and_conda_exist_read_only\": 0.08853310876626813,\n    \"tests/core/test_package_cache_data.py::test_instantiating_package_cache_when_unpacked_conda_exist\": 0.046762846263192055,\n    \"tests/core/test_package_cache_data.py::test_tar_bz2_in_cache_not_extracted\": 0.22382925234027212,\n    \"tests/core/test_package_cache_data.py::test_tar_bz2_in_pkg_cache_doesnt_overwrite_conda_pkg\": 0.18941211568497712,\n    \"tests/core/test_package_cache_data.py::test_tar_bz2_in_pkg_cache_used_instead_of_conda_pkg\": 0.09203810869139319,\n    \"tests/core/test_path_actions.py::test_CompileMultiPycAction_generic\": 0.003829980963677451,\n    \"tests/core/test_path_actions.py::test_CompileMultiPycAction_noarch_python\": 2.396305032761291,\n    \"tests/core/test_path_actions.py::test_CreatePythonEntryPointAction_generic\": 0.003742019518668386,\n    \"tests/core/test_path_actions.py::test_CreatePythonEntryPointAction_noarch_python\": 0.01695762285980521,\n    \"tests/core/test_path_actions.py::test_create_file_link_actions\": 0.012100846808345703,\n    \"tests/core/test_path_actions.py::test_simple_LinkPathAction_copy\": 0.007557867620226038,\n    \"tests/core/test_path_actions.py::test_simple_LinkPathAction_directory\": 0.004337695528485622,\n    \"tests/core/test_path_actions.py::test_simple_LinkPathAction_hardlink\": 0.015425282050066087,\n    \"tests/core/test_path_actions.py::test_simple_LinkPathAction_softlink\": 0.007939939083291013,\n    \"tests/core/test_portability.py::test_escaped_prefix_replaced_only_shebang\": 0.0005062815932588835,\n    \"tests/core/test_portability.py::test_replace_long_shebang_spaces_in_prefix\": 0.001537800516214247,\n    \"tests/core/test_portability.py::test_replace_long_shebang_with_truncation_escaped_space\": 0.0023162864325891376,\n    \"tests/core/test_portability.py::test_replace_long_shebang_with_truncation_python\": 0.0042275548483513906,\n    \"tests/core/test_portability.py::test_replace_normal_shebang_spaces_in_prefix_escaped_space\": 0.0016261773893059312,\n    \"tests/core/test_portability.py::test_replace_normal_shebang_spaces_in_prefix_python\": 0.0015828594998086596,\n    \"tests/core/test_portability.py::test_replace_simple_shebang_no_replacement\": 0.005418110596879519,\n    \"tests/core/test_portability.py::test_shebang_regex_matches\": 0.001828410455246461,\n    \"tests/core/test_prefix_data.py::test_api_consistency[conda]\": 0.07516087692527333,\n    \"tests/core/test_prefix_data.py::test_api_consistency[python]\": 0.0759613421536228,\n    \"tests/core/test_prefix_data.py::test_conda_package_recognized_windows[False]\": 0.014209776635159236,\n    \"tests/core/test_prefix_data.py::test_conda_package_recognized_windows[True]\": 0.014158354100576455,\n    \"tests/core/test_prefix_data.py::test_corrupt_json_conda_meta_json\": 0.0024357361724939813,\n    \"tests/core/test_prefix_data.py::test_corrupt_unicode_conda_meta_json\": 0.002078154273472368,\n    \"tests/core/test_prefix_data.py::test_dot_underscore_conda_meta_json_ignored\": 0.00996373271107411,\n    \"tests/core/test_prefix_data.py::test_empty_environment_package_methods\": 0.005190850989334738,\n    \"tests/core/test_prefix_data.py::test_get_conda_anchor_files_and_records\": 0.002450357457411981,\n    \"tests/core/test_prefix_data.py::test_get_conda_packages_returns_sorted_list\": 0.10458797369494434,\n    \"tests/core/test_prefix_data.py::test_get_environment_env_vars\": 0.005451318343518338,\n    \"tests/core/test_prefix_data.py::test_get_packages_behavior_with_interoperability\": 16.9500938164913,\n    \"tests/core/test_prefix_data.py::test_get_python_packages_basic_functionality\": 0.12316351094248788,\n    \"tests/core/test_prefix_data.py::test_get_python_packages_with_pip_interoperability\": 0.1316607904787867,\n    \"tests/core/test_prefix_data.py::test_load_single_record_raises_on_corrupt_json[bad-json]\": 0.004235336425141577,\n    \"tests/core/test_prefix_data.py::test_load_single_record_raises_on_corrupt_json[null-bytes-unicode-error]\": 0.004311646072819182,\n    \"tests/core/test_prefix_data.py::test_load_single_record_reads_bytes[record_data0]\": 0.004444461599645982,\n    \"tests/core/test_prefix_data.py::test_method_consistency\": 0.0767443058795458,\n    \"tests/core/test_prefix_data.py::test_no_tokens_dumped[False]\": 0.007633115876762675,\n    \"tests/core/test_prefix_data.py::test_no_tokens_dumped[True]\": 0.009595888518350254,\n    \"tests/core/test_prefix_data.py::test_package_extraction_methods_types[get_conda_packages-expected_types0]\": 0.1167749930343917,\n    \"tests/core/test_prefix_data.py::test_package_extraction_methods_types[get_python_packages-expected_types1]\": 0.12474951496008561,\n    \"tests/core/test_prefix_data.py::test_package_extraction_package_counts[environment_packages0-0]\": 0.01005148734787483,\n    \"tests/core/test_prefix_data.py::test_package_extraction_package_counts[environment_packages1-1]\": 0.11540320482716596,\n    \"tests/core/test_prefix_data.py::test_package_extraction_package_counts[environment_packages2-2]\": 2.244414687005669,\n    \"tests/core/test_prefix_data.py::test_package_methods_with_mock_data\": 0.003106146413343934,\n    \"tests/core/test_prefix_data.py::test_package_methods_with_required_python_packages\": 0.0031589959013179005,\n    \"tests/core/test_prefix_data.py::test_pinned_specs_conda_meta_pinned\": 0.008838939489844311,\n    \"tests/core/test_prefix_data.py::test_pip_interop[envpy27osx]\": 0.00040259036903057154,\n    \"tests/core/test_prefix_data.py::test_pip_interop[envpy27win_whl]\": 0.3316528667038255,\n    \"tests/core/test_prefix_data.py::test_pip_interop[envpy313tosx_whl]\": 0.0004037015320592607,\n    \"tests/core/test_prefix_data.py::test_pip_interop[envpy37osx_whl]\": 0.0004132357865048956,\n    \"tests/core/test_prefix_data.py::test_pip_interop[envpy37win]\": 0.24480092332880155,\n    \"tests/core/test_prefix_data.py::test_prefix_data_equality[missing-None-False]\": 0.003636126449015548,\n    \"tests/core/test_prefix_data.py::test_prefix_data_equality[missing-missing-True]\": 0.004138624165511963,\n    \"tests/core/test_prefix_data.py::test_prefix_data_equality[missing-{path}-False]\": 0.0037562064872100997,\n    \"tests/core/test_prefix_data.py::test_prefix_data_equality[{path}-None-False]\": 0.005301876774969224,\n    \"tests/core/test_prefix_data.py::test_prefix_data_equality[{path}-missing-False]\": 0.003607054058665129,\n    \"tests/core/test_prefix_data.py::test_prefix_data_equality[{path}-{path}-True]\": 0.005367146818628399,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[ -True]\": 0.005790309083927572,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[!-False]\": 0.005616348835612057,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[#-True]\": 0.005604083476885631,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[%-False]\": 0.005508487324978462,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[(-False]\": 0.005724809536623055,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[)-False]\": 0.008094782057128503,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[--False]\": 0.005782783559358418,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[.-False]\": 0.005702993319510156,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[0-False]\": 0.005810155698375031,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[=-False]\": 0.005530197956725947,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[A-False]\": 0.005683287155145565,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[^-False]\": 0.005649540518400783,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[_-False]\": 0.00586601156982377,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[a-False]\": 0.005839774748381183,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name_base[False-True]\": 0.006040515946559131,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name_base[True-False]\": 0.005419918496279868,\n    \"tests/core/test_prefix_data.py::test_prefix_insertion_error\": 0.1291386561466167,\n    \"tests/core/test_prefix_data.py::test_set_unset_environment_env_vars\": 0.012362475656807098,\n    \"tests/core/test_prefix_data.py::test_set_unset_environment_env_vars_no_exist\": 0.005510199495877885,\n    \"tests/core/test_prefix_data.py::test_timestamps\": 0.6192886784961226,\n    \"tests/core/test_prefix_data.py::test_unset_reserved_env_vars\": 0.006720733256095049,\n    \"tests/core/test_prefix_data.py::test_warn_setting_reserved_env_vars\": 0.02193496721717141,\n    \"tests/core/test_solve.py::test_aggressive_update_packages[classic]\": 5.785165411909119,\n    \"tests/core/test_solve.py::test_aggressive_update_packages[libmamba]\": 5.025217860685358,\n    \"tests/core/test_solve.py::test_archspec_call[classic]\": 1.9519020726465752,\n    \"tests/core/test_solve.py::test_archspec_call[libmamba]\": 1.4214354189058889,\n    \"tests/core/test_solve.py::test_auto_update_conda[classic]\": 3.630504045321438,\n    \"tests/core/test_solve.py::test_auto_update_conda[libmamba]\": 2.834495927164877,\n    \"tests/core/test_solve.py::test_broken_install[classic]\": 4.035652920207734,\n    \"tests/core/test_solve.py::test_broken_install[libmamba]\": 0.008785413034405406,\n    \"tests/core/test_solve.py::test_channel_priority_churn_minimized[classic]\": 7.3432064089097935,\n    \"tests/core/test_solve.py::test_channel_priority_churn_minimized[libmamba]\": 1.00287902370312,\n    \"tests/core/test_solve.py::test_conda_downgrade[classic]\": 26.247754897909882,\n    \"tests/core/test_solve.py::test_conda_downgrade[libmamba]\": 7.133735577033545,\n    \"tests/core/test_solve.py::test_cuda_1[classic]\": 0.7976895303602242,\n    \"tests/core/test_solve.py::test_cuda_1[libmamba]\": 0.7397433891749879,\n    \"tests/core/test_solve.py::test_cuda_2[classic]\": 0.8200148218223476,\n    \"tests/core/test_solve.py::test_cuda_2[libmamba]\": 0.7424505671902746,\n    \"tests/core/test_solve.py::test_cuda_constrain_absent[classic]\": 0.8381584728833755,\n    \"tests/core/test_solve.py::test_cuda_constrain_absent[libmamba]\": 0.7749689552161663,\n    \"tests/core/test_solve.py::test_cuda_constrain_sat[classic]\": 0.00041592179204149227,\n    \"tests/core/test_solve.py::test_cuda_constrain_sat[libmamba]\": 0.00042670993062486265,\n    \"tests/core/test_solve.py::test_cuda_constrain_unsat[classic]\": 0.0003913612741371404,\n    \"tests/core/test_solve.py::test_cuda_constrain_unsat[libmamba]\": 0.00040561017890837107,\n    \"tests/core/test_solve.py::test_cuda_fail_1[classic]\": 0.8186401545528605,\n    \"tests/core/test_solve.py::test_cuda_fail_1[libmamba]\": 0.683169748827291,\n    \"tests/core/test_solve.py::test_cuda_fail_2[classic]\": 0.8176687681073253,\n    \"tests/core/test_solve.py::test_cuda_fail_2[libmamba]\": 0.6862268228720487,\n    \"tests/core/test_solve.py::test_cuda_glibc_sat[classic]\": 0.00038623989540611115,\n    \"tests/core/test_solve.py::test_cuda_glibc_sat[libmamba]\": 0.00040805741941631605,\n    \"tests/core/test_solve.py::test_cuda_glibc_unsat_constrain[classic]\": 0.00039396842892124126,\n    \"tests/core/test_solve.py::test_cuda_glibc_unsat_constrain[libmamba]\": 0.00037436211727815907,\n    \"tests/core/test_solve.py::test_cuda_glibc_unsat_depend[classic]\": 0.0003870113849715068,\n    \"tests/core/test_solve.py::test_cuda_glibc_unsat_depend[libmamba]\": 0.00037867053671423903,\n    \"tests/core/test_solve.py::test_current_repodata_fallback[classic]\": 0.21688864426049287,\n    \"tests/core/test_solve.py::test_current_repodata_fallback[libmamba]\": 0.22288044531705972,\n    \"tests/core/test_solve.py::test_current_repodata_usage[classic]\": 0.22324701552980056,\n    \"tests/core/test_solve.py::test_current_repodata_usage[libmamba]\": 0.22702968473924418,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_conflicts[classic]\": 0.010781610743662302,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_conflicts[libmamba]\": 0.012781466836857682,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_conflicts_upperbound[classic]\": 0.011111270197162224,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_conflicts_upperbound[libmamba]\": 0.012312127369412666,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_multi_conflicts[classic]\": 0.011479250600837706,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_multi_conflicts[libmamba]\": 0.01468016726060475,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_free[classic]\": 0.010314002861241147,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_free[libmamba]\": 0.012097356652563205,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_no_upperbound[classic]\": 0.01102206498916803,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_no_upperbound[libmamba]\": 0.012539666422852236,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_upperbound_compound_depends[classic]\": 0.011041838112937435,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_upperbound_compound_depends[libmamba]\": 0.012427972730113033,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_version_star[classic]\": 0.010606875372871895,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_version_star[libmamba]\": 0.012166882098104133,\n    \"tests/core/test_solve.py::test_downgrade_python_prevented_with_sane_message[classic]\": 3.8640551390247335,\n    \"tests/core/test_solve.py::test_downgrade_python_prevented_with_sane_message[libmamba]\": 2.106893779127608,\n    \"tests/core/test_solve.py::test_explicit_conda_downgrade[classic]\": 3.535379095642423,\n    \"tests/core/test_solve.py::test_explicit_conda_downgrade[libmamba]\": 3.1111252194413668,\n    \"tests/core/test_solve.py::test_fast_update_with_update_modifier_not_set[classic]\": 1.252692944233295,\n    \"tests/core/test_solve.py::test_fast_update_with_update_modifier_not_set[libmamba]\": 0.7204361120529894,\n    \"tests/core/test_solve.py::test_features_solve_1[classic]\": 3.8619086433031917,\n    \"tests/core/test_solve.py::test_features_solve_1[libmamba]\": 0.33493720211258354,\n    \"tests/core/test_solve.py::test_force_reinstall_1[classic]\": 1.8811588002992163,\n    \"tests/core/test_solve.py::test_force_reinstall_1[libmamba]\": 1.8447218967724897,\n    \"tests/core/test_solve.py::test_force_reinstall_2[classic]\": 0.8789213317979261,\n    \"tests/core/test_solve.py::test_force_reinstall_2[libmamba]\": 0.6993538734200467,\n    \"tests/core/test_solve.py::test_force_remove_1[classic]\": 4.2342917265531534,\n    \"tests/core/test_solve.py::test_force_remove_1[libmamba]\": 1.9207757291075536,\n    \"tests/core/test_solve.py::test_freeze_deps_1[classic]\": 20.949997518807052,\n    \"tests/core/test_solve.py::test_freeze_deps_1[libmamba]\": 3.248128153201874,\n    \"tests/core/test_solve.py::test_globstr_matchspec_compatible[classic]\": 2.343105124353692,\n    \"tests/core/test_solve.py::test_globstr_matchspec_compatible[libmamba]\": 1.3758498201942846,\n    \"tests/core/test_solve.py::test_globstr_matchspec_non_compatible[classic]\": 2.2833997208855887,\n    \"tests/core/test_solve.py::test_globstr_matchspec_non_compatible[libmamba]\": 1.9739260885412784,\n    \"tests/core/test_solve.py::test_indirect_dep_optimized_by_version_over_package_count[classic]\": 4.404674060643235,\n    \"tests/core/test_solve.py::test_indirect_dep_optimized_by_version_over_package_count[libmamba]\": 1.5385376076703883,\n    \"tests/core/test_solve.py::test_no_channels_error[classic]\": 0.034648800764917706,\n    \"tests/core/test_solve.py::test_no_channels_error[libmamba]\": 0.00912085697258189,\n    \"tests/core/test_solve.py::test_no_deps_1[classic]\": 3.566583515972037,\n    \"tests/core/test_solve.py::test_no_deps_1[libmamba]\": 2.3178051437356277,\n    \"tests/core/test_solve.py::test_no_update_deps_1[classic]\": 3.3845486660373294,\n    \"tests/core/test_solve.py::test_no_update_deps_1[libmamba]\": 2.8226326835531967,\n    \"tests/core/test_solve.py::test_only_deps_1[classic]\": 1.163411248948184,\n    \"tests/core/test_solve.py::test_only_deps_1[libmamba]\": 0.795489579660307,\n    \"tests/core/test_solve.py::test_only_deps_2[classic]\": 5.373064155814227,\n    \"tests/core/test_solve.py::test_only_deps_2[libmamba]\": 2.9238854458755053,\n    \"tests/core/test_solve.py::test_packages_in_solution_change_already_newest[classic]\": 0.010459642546355797,\n    \"tests/core/test_solve.py::test_packages_in_solution_change_already_newest[libmamba]\": 0.01256599172886656,\n    \"tests/core/test_solve.py::test_packages_in_solution_change_constrained[classic]\": 0.010249920231797783,\n    \"tests/core/test_solve.py::test_packages_in_solution_change_constrained[libmamba]\": 0.013714692355778418,\n    \"tests/core/test_solve.py::test_packages_in_solution_change_needs_update[classic]\": 0.010272627861853734,\n    \"tests/core/test_solve.py::test_packages_in_solution_change_needs_update[libmamba]\": 0.012362064842210552,\n    \"tests/core/test_solve.py::test_pinned_1[classic]\": 10.219708165151449,\n    \"tests/core/test_solve.py::test_pinned_1[libmamba]\": 6.91059692009724,\n    \"tests/core/test_solve.py::test_pinned_specs_CONDA_PINNED_PACKAGES[classic]\": 0.013152598131927668,\n    \"tests/core/test_solve.py::test_pinned_specs_CONDA_PINNED_PACKAGES[libmamba]\": 0.010797028340824997,\n    \"tests/core/test_solve.py::test_pinned_specs_all[classic]\": 0.05603562006928066,\n    \"tests/core/test_solve.py::test_pinned_specs_all[libmamba]\": 0.04865693361643889,\n    \"tests/core/test_solve.py::test_pinned_specs_conda_meta_pinned[classic]\": 0.010685232623808489,\n    \"tests/core/test_solve.py::test_pinned_specs_conda_meta_pinned[libmamba]\": 0.016975010348781603,\n    \"tests/core/test_solve.py::test_pinned_specs_condarc[classic]\": 0.05842574069958707,\n    \"tests/core/test_solve.py::test_pinned_specs_condarc[libmamba]\": 0.051489030380280736,\n    \"tests/core/test_solve.py::test_priority_1[classic]\": 12.071298765502151,\n    \"tests/core/test_solve.py::test_priority_1[libmamba]\": 5.6450108593024,\n    \"tests/core/test_solve.py::test_prune_1[classic]\": 2.2406026475236005,\n    \"tests/core/test_solve.py::test_prune_1[libmamba]\": 1.1042408355436297,\n    \"tests/core/test_solve.py::test_python2_update[classic]\": 3.1512764363540224,\n    \"tests/core/test_solve.py::test_python2_update[libmamba]\": 1.5066484846382342,\n    \"tests/core/test_solve.py::test_remove_with_constrained_dependencies[classic]\": 4.261798654494604,\n    \"tests/core/test_solve.py::test_remove_with_constrained_dependencies[libmamba]\": 0.5010301506407874,\n    \"tests/core/test_solve.py::test_solve_1[libmamba]\": 1.4547503050571624,\n    \"tests/core/test_solve.py::test_solve_2[classic]\": 13.135038063975909,\n    \"tests/core/test_solve.py::test_solve_2[libmamba]\": 0.008241374677935618,\n    \"tests/core/test_solve.py::test_solve_msgs_exclude_vp[classic]\": 0.9567184777591462,\n    \"tests/core/test_solve.py::test_solve_msgs_exclude_vp[libmamba]\": 0.8234166746360487,\n    \"tests/core/test_solve.py::test_strict_custom_multichannel_allows_fallback_to_later_subchannel[classic]\": 0.01013999993643604,\n    \"tests/core/test_solve.py::test_strict_custom_multichannel_allows_fallback_to_later_subchannel[libmamba]\": 27.64982476066358,\n    \"tests/core/test_solve.py::test_timestamps_1[classic]\": 0.29889622720034675,\n    \"tests/core/test_solve.py::test_timestamps_1[libmamba]\": 0.22817499163504884,\n    \"tests/core/test_solve.py::test_unfreeze_when_required[classic]\": 0.6408372686157178,\n    \"tests/core/test_solve.py::test_unfreeze_when_required[libmamba]\": 0.8652390674572075,\n    \"tests/core/test_solve.py::test_update_all_1[classic]\": 3.6147169276530304,\n    \"tests/core/test_solve.py::test_update_all_1[libmamba]\": 2.2615236383143693,\n    \"tests/core/test_solve.py::test_update_deps_1[classic]\": 7.111402601340048,\n    \"tests/core/test_solve.py::test_update_deps_1[libmamba]\": 4.150028290026261,\n    \"tests/core/test_solve.py::test_update_deps_2[classic]\": 5.821072409390356,\n    \"tests/core/test_solve.py::test_update_deps_2[libmamba]\": 3.189061932726807,\n    \"tests/core/test_solve.py::test_update_prune_1[classic]\": 2.042872703880443,\n    \"tests/core/test_solve.py::test_update_prune_1[libmamba]\": 1.4358326451587513,\n    \"tests/core/test_solve.py::test_update_prune_2[classic]\": 2.08841053690561,\n    \"tests/core/test_solve.py::test_update_prune_2[libmamba]\": 0.8142708133447855,\n    \"tests/core/test_solve.py::test_update_prune_3[classic]\": 2.6869216438359156,\n    \"tests/core/test_solve.py::test_update_prune_3[libmamba]\": 0.6979652647019657,\n    \"tests/core/test_solve.py::test_update_prune_4[classic]\": 2.0762596566727307,\n    \"tests/core/test_solve.py::test_update_prune_4[libmamba]\": 1.43066431049708,\n    \"tests/core/test_solve.py::test_update_prune_5[classic-False]\": 2.4801490224538094,\n    \"tests/core/test_solve.py::test_update_prune_5[classic-True]\": 2.0036398428394535,\n    \"tests/core/test_solve.py::test_update_prune_5[libmamba-False]\": 1.4912532535292569,\n    \"tests/core/test_solve.py::test_update_prune_5[libmamba-True]\": 1.4128228959407918,\n    \"tests/core/test_solve.py::test_virtual_package_solver[classic]\": 0.833116954154052,\n    \"tests/core/test_solve.py::test_virtual_package_solver[libmamba]\": 0.010519014327461773,\n    \"tests/core/test_subdir_data.py::test_cache_fn_url_repo_anaconda_com\": 0.001506218443936329,\n    \"tests/core/test_subdir_data.py::test_cache_fn_url_repo_continuum_io\": 0.001525380234094944,\n    \"tests/core/test_subdir_data.py::test_get_index_no_platform_with_offline_cache\": 13.361288147991454,\n    \"tests/core/test_subdir_data.py::test_metadata_cache_clearing\": 0.013932453282370614,\n    \"tests/core/test_subdir_data.py::test_metadata_cache_works\": 3.014485435732623,\n    \"tests/core/test_subdir_data.py::test_repodata_version_2_base_url[no-credentials]\": 0.10552470531732967,\n    \"tests/core/test_subdir_data.py::test_repodata_version_2_base_url[with-auth]\": 0.3127369107458474,\n    \"tests/core/test_subdir_data.py::test_repodata_version_2_base_url[with-token]\": 0.021554151898897835,\n    \"tests/core/test_subdir_data.py::test_repodata_version_error\": 0.3947948860968585,\n    \"tests/core/test_subdir_data.py::test_search_by_packagerecord\": 0.011218353237319574,\n    \"tests/core/test_subdir_data.py::test_state_is_not_json\": 0.018217688118847164,\n    \"tests/core/test_subdir_data.py::test_subdir_data_coverage\": 0.01757456159763399,\n    \"tests/core/test_subdir_data.py::test_subdir_data_dict_state\": 0.003910381054637135,\n    \"tests/core/test_subdir_data.py::test_subdir_data_prefers_conda_to_tar_bz2\": 0.014139051586644436,\n    \"tests/core/test_subdir_data.py::test_use_only_tar_bz2\": 0.04437749805226519,\n    \"tests/env/installers/test_conda_installer_explicit.py::test_explicit_with_user_specs\": 0.007068035811982151,\n    \"tests/env/installers/test_conda_installer_explicit.py::test_installer_installs_explicit\": 0.2365331925320047,\n    \"tests/env/installers/test_conda_installer_explicit.py::test_installer_type_checking_for_explicit\": 0.009406547553248873,\n    \"tests/env/specs/test_explicit.py::test_can_handle_explicit\": 0.0018682867279601288,\n    \"tests/env/specs/test_explicit.py::test_can_not_handle_requirements_txt\": 0.001817239724507096,\n    \"tests/env/specs/test_explicit.py::test_environment\": 0.12647520171985285,\n    \"tests/env/specs/test_explicit.py::test_no_environment_file\": 0.0020282035560218216,\n    \"tests/env/specs/test_requirements.py::test_can_not_handle_explicit\": 0.0020123187515378913,\n    \"tests/env/specs/test_requirements.py::test_environment\": 0.003503621849917764,\n    \"tests/env/specs/test_requirements.py::test_no_environment_file\": 0.0016659074502603818,\n    \"tests/env/specs/test_requirements.py::test_no_name\": 0.0018021410618728024,\n    \"tests/env/specs/test_requirements.py::test_req_file_and_name\": 0.0027196702930741257,\n    \"tests/env/specs/test_yaml_file.py::test_environment_file_exist[Cep24YamlFileSpec]\": 0.004020391929915287,\n    \"tests/env/specs/test_yaml_file.py::test_environment_file_exist[YamlFileSpec]\": 0.0034253257627911544,\n    \"tests/env/specs/test_yaml_file.py::test_environment_file_not_yaml[Cep24YamlFileSpec-TypeError]\": 0.002113788255925403,\n    \"tests/env/specs/test_yaml_file.py::test_environment_file_not_yaml[YamlFileSpec-PluginError]\": 0.002623372598141207,\n    \"tests/env/specs/test_yaml_file.py::test_filename\": 0.0030065029667203486,\n    \"tests/env/specs/test_yaml_file.py::test_get_environment[Cep24YamlFileSpec]\": 0.005243986434409689,\n    \"tests/env/specs/test_yaml_file.py::test_get_environment[YamlFileSpec]\": 0.0033361091459079427,\n    \"tests/env/specs/test_yaml_file.py::test_no_environment_file[Cep24YamlFileSpec]\": 0.002259298956095825,\n    \"tests/env/specs/test_yaml_file.py::test_no_environment_file[YamlFileSpec]\": 0.005975888262087703,\n    \"tests/env/test_create.py::test_create_advanced_pip\": 40.07276341698381,\n    \"tests/env/test_create.py::test_create_empty_env\": 4.529116470773554,\n    \"tests/env/test_create.py::test_create_env_custom_platform\": 0.5756672011161093,\n    \"tests/env/test_create.py::test_create_env_default_packages\": 28.507430537825176,\n    \"tests/env/test_create.py::test_create_env_from_environment_yml_does_not_output_duplicate_warning\": 2.251034066473239,\n    \"tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[cep-24-D:\\\\\\\\a\\\\\\\\conda-libmamba-solver\\\\\\\\conda-libmamba-solver\\\\\\\\conda\\\\\\\\tests\\\\\\\\env\\\\\\\\support\\\\\\\\env_with_dependencies.yml]\": 10.704709249476013,\n    \"tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[cep-24-D:\\\\\\\\a\\\\\\\\conda\\\\\\\\conda\\\\\\\\tests\\\\\\\\env\\\\\\\\support\\\\\\\\env_with_dependencies.yml]\": 16.808002250572965,\n    \"tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[explicit-D:\\\\\\\\a\\\\\\\\conda-libmamba-solver\\\\\\\\conda-libmamba-solver\\\\\\\\conda\\\\\\\\tests\\\\\\\\env\\\\\\\\support\\\\\\\\explicit.txt]\": 0.509147039584191,\n    \"tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[explicit-D:\\\\\\\\a\\\\\\\\conda\\\\\\\\conda\\\\\\\\tests\\\\\\\\env\\\\\\\\support\\\\\\\\explicit.txt]\": 0.6480857148048423,\n    \"tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[requirements.txt-D:\\\\\\\\a\\\\\\\\conda-libmamba-solver\\\\\\\\conda-libmamba-solver\\\\\\\\conda\\\\\\\\tests\\\\\\\\env\\\\\\\\support\\\\\\\\requirements.txt]\": 17.229480995546638,\n    \"tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[requirements.txt-D:\\\\\\\\a\\\\\\\\conda\\\\\\\\conda\\\\\\\\tests\\\\\\\\env\\\\\\\\support\\\\\\\\requirements.txt]\": 11.517996756465303,\n    \"tests/env/test_create.py::test_create_env_from_non_existent_plugin\": 0.060094123031199674,\n    \"tests/env/test_create.py::test_create_env_json[example/environment.yml]\": 19.138239261621848,\n    \"tests/env/test_create.py::test_create_env_json[example/environment_with_pip.yml]\": 16.40221263683371,\n    \"tests/env/test_create.py::test_create_env_no_default_packages\": 15.549729934676176,\n    \"tests/env/test_create.py::test_create_host_port\": 0.0006920309061561156,\n    \"tests/env/test_create.py::test_create_update\": 17.536505665576524,\n    \"tests/env/test_create.py::test_create_update_remote_env_file\": 18.05753825973067,\n    \"tests/env/test_create.py::test_export_and_recreate_environment[env.yml-env.yaml]\": 4.046272312469788,\n    \"tests/env/test_create.py::test_export_and_recreate_environment[environment-yaml-env.yaml]\": 3.841393087838179,\n    \"tests/env/test_create.py::test_export_and_recreate_environment[reqs-env.txt]\": 3.5974536599836986,\n    \"tests/env/test_create.py::test_export_and_recreate_environment[requirements-env.txt]\": 3.9603712770938717,\n    \"tests/env/test_create.py::test_fail_to_create_env_in_dir_with_colon\": 0.00040787266616253506,\n    \"tests/env/test_create.py::test_protected_dirs_error_for_env_create\": 0.04104244254851573,\n    \"tests/env/test_env.py::test_add_channels\": 0.001422860683473671,\n    \"tests/env/test_env.py::test_add_pip\": 0.0034986947076906527,\n    \"tests/env/test_env.py::test_args_are_wildcarded\": 0.0014834651212027928,\n    \"tests/env/test_env.py::test_builds_spec_from_line_raw_dependency\": 0.0015392362964248994,\n    \"tests/env/test_env.py::test_can_add_dependencies_to_environment\": 0.003227034977997289,\n    \"tests/env/test_env.py::test_channels_are_provided_by_kwarg\": 0.0016292044479074004,\n    \"tests/env/test_env.py::test_channels_default_to_empty_list\": 0.0014246833667857929,\n    \"tests/env/test_env.py::test_channels_validation[channels0-Invalid type for 'channels']\": 0.0017742742276279293,\n    \"tests/env/test_env.py::test_channels_validation[channels1-`channels` key must only contain strings.]\": 0.0018156147079076443,\n    \"tests/env/test_env.py::test_channels_validation[channels2-`channels` key must only contain strings.]\": 0.0016791237416113507,\n    \"tests/env/test_env.py::test_channels_validation[channels3-None]\": 0.0015875292761350949,\n    \"tests/env/test_env.py::test_create_and_update_env_with_just_vars\": 2.324318362599131,\n    \"tests/env/test_env.py::test_creates_file_on_save\": 0.004952912045735025,\n    \"tests/env/test_env.py::test_dependencies_are_empty_by_default\": 0.001409075191002596,\n    \"tests/env/test_env.py::test_dependencies_update_after_adding\": 0.0024786738181603813,\n    \"tests/env/test_env.py::test_dependency_validation[dependencies0]\": 0.0016527188113520373,\n    \"tests/env/test_env.py::test_dependency_validation[dependencies1]\": 0.0015772768327902828,\n    \"tests/env/test_env.py::test_dependency_validation[dependencies2]\": 0.0015477719247984497,\n    \"tests/env/test_env.py::test_dependency_validation[dependencies3]\": 0.0015840298805270966,\n    \"tests/env/test_env.py::test_dependency_validation[dependencies4]\": 0.0015294444810769576,\n    \"tests/env/test_env.py::test_dependency_validation_errors[None-EnvironmentFileInvalid-Invalid type for 'dependencies', expected a list]\": 0.0019632299830933454,\n    \"tests/env/test_env.py::test_dependency_validation_errors[dependencies1-CondaMultiError-Invalid spec 'nota~matchspec']\": 0.003948942500989108,\n    \"tests/env/test_env.py::test_dependency_validation_errors[dependencies2-CondaMultiError-Invalid spec 'also!!not']\": 0.002216345125916087,\n    \"tests/env/test_env.py::test_dependency_validation_errors[dependencies3-CondaMultiError-is an invalid type]\": 0.0023369595604529375,\n    \"tests/env/test_env.py::test_dependency_validation_errors[dependencies4-EnvironmentFileInvalid-Invalid type for 'dependencies']\": 0.0018609593821202598,\n    \"tests/env/test_env.py::test_empty_deps\": 0.002843476198010756,\n    \"tests/env/test_env.py::test_env_advanced_pip\": 14.2704160051243,\n    \"tests/env/test_env.py::test_environment_deprecated\": 0.0014798256489448234,\n    \"tests/env/test_env.py::test_envvars\": 0.003422019445825432,\n    \"tests/env/test_env.py::test_from_history\": 0.004020136973858134,\n    \"tests/env/test_env.py::test_has_empty_filename_by_default\": 0.0014447722743635544,\n    \"tests/env/test_env.py::test_has_empty_name_by_default\": 0.0014964251846789462,\n    \"tests/env/test_env.py::test_has_filename_if_provided\": 0.0014261873928239916,\n    \"tests/env/test_env.py::test_has_name_if_provided\": 0.001457130742973821,\n    \"tests/env/test_env.py::test_http\": 0.0864776405308535,\n    \"tests/env/test_env.py::test_http_raises\": 0.09726276113706007,\n    \"tests/env/test_env.py::test_invalid_keys\": 0.0037459515393399416,\n    \"tests/env/test_env.py::test_name_validation[1-Invalid type for 'name']\": 0.0016328303747419847,\n    \"tests/env/test_env.py::test_name_validation[name-None]\": 0.0016422807017784711,\n    \"tests/env/test_env.py::test_name_validation[name0-Invalid type for 'name']\": 0.0017622090352645548,\n    \"tests/env/test_env.py::test_other_tips_of_dependencies_are_supported\": 0.001475063721242931,\n    \"tests/env/test_env.py::test_parses_dependencies_from_raw_file\": 0.002424668727211255,\n    \"tests/env/test_env.py::test_prefix_validation[1-Invalid type for 'prefix']\": 0.001703619015837453,\n    \"tests/env/test_env.py::test_prefix_validation[path/to/prefix-None]\": 0.0016567744575818233,\n    \"tests/env/test_env.py::test_prefix_validation[prefix0-Invalid type for 'prefix']\": 0.0017524144929566107,\n    \"tests/env/test_env.py::test_remove_channels\": 0.0014773275788882547,\n    \"tests/env/test_env.py::test_retains_full_filename\": 0.0025632161647342836,\n    \"tests/env/test_env.py::test_returns_Environment\": 0.0027004451143658958,\n    \"tests/env/test_env.py::test_to_dict_returns_dictionary_of_data\": 0.0021695205974008357,\n    \"tests/env/test_env.py::test_to_dict_returns_just_name_if_only_thing_present\": 0.0017457677058028518,\n    \"tests/env/test_env.py::test_to_yaml_returns_proper_yaml\": 0.0022838491479487103,\n    \"tests/env/test_env.py::test_to_yaml_returns_yaml_parseable_string\": 0.003563136819856,\n    \"tests/env/test_env.py::test_to_yaml_takes_stream\": 0.0022317029896379904,\n    \"tests/env/test_env.py::test_valid_keys\": 0.0034964154676946487,\n    \"tests/env/test_env.py::test_variables_validation[variables0-Invalid type for 'variables']\": 0.0017329849240897944,\n    \"tests/env/test_env.py::test_variables_validation[variables1-None]\": 0.0016072324593712096,\n    \"tests/env/test_env.py::test_variables_validation[variables2-None]\": 0.0015950739086322166,\n    \"tests/env/test_env.py::test_with_pip\": 0.00325715958877218,\n    \"tests/env/test_pip_util.py::test_get_pip_installed_packages[Successfully installed foo bar-expected0]\": 0.002271252582355519,\n    \"tests/env/test_pip_util.py::test_get_pip_installed_packages[\\\\nCollecting attrs\\\\n  Using cached https://files.pythonhosted.org/packages/23/96/d828354fa2dbdf216eaa7b7de0db692f12c234f7ef888cc14980ef40d1d2/attrs-19.1.0-py2.py3-none-any.whl\\\\nInstalling collected packages: attrs\\\\nSuccessfully installed attrs-19.1.0\\\\n-expected1]\": 0.0019592193456927716,\n    \"tests/env/test_pip_util.py::test_get_pip_installed_packages[\\\\nCollecting flask\\\\n  Using cached https://files.pythonhosted.org/packages/9b/93/628509b8d5dc749656a9641f4caf13540e2cdec85276964ff8f43bbb1d3b/Flask-1.1.1-py2.py3-none-any.whl\\\\nCollecting itsdangerous>=0.24 (from flask)\\\\n  Using cached https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl\\\\nCollecting click>=5.1 (from flask)\\\\n  Using cached https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl\\\\nCollecting Werkzeug>=0.15 (from flask)\\\\n  Using cached https://files.pythonhosted.org/packages/b7/61/c0a1adf9ad80db012ed7191af98fa05faa95fa09eceb71bb6fa8b66e6a43/Werkzeug-0.15.6-py2.py3-none-any.whl\\\\nCollecting Jinja2>=2.10.1 (from flask)\\\\n  Using cached https://files.pythonhosted.org/packages/1d/e7/fd8b501e7a6dfe492a433deb7b9d833d39ca74916fa8bc63dd1a4947a671/Jinja2-2.10.1-py2.py3-none-any.whl\\\\nCollecting MarkupSafe>=0.23 (from Jinja2>=2.10.1->flask)\\\\n  Using cached https://files.pythonhosted.org/packages/ce/c6/f000f1af136ef74e4a95e33785921c73595c5390403f102e9b231b065b7a/MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl\\\\nInstalling collected packages: itsdangerous, click, Werkzeug, MarkupSafe, Jinja2, flask\\\\nSuccessfully installed Jinja2-2.10.1 MarkupSafe-1.1.1 Werkzeug-0.15.6 click-7.0 flask-1.1.1 itsdangerous-1.1.0\\\\n-expected2]\": 0.0019231037864152001,\n    \"tests/env/test_pip_util.py::test_get_pip_installed_packages[\\\\nCollecting flask\\\\n  Using cached https://files.pythonhosted.org/packages/9b/93/628509b8d5dc749656a9641f4caf13540e2cdec85276964ff8f43bbb1d3b/Flask-1.1.1-py2.py3-none-any.whl\\\\nRequirement already satisfied: Werkzeug>=0.15 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (0.15.6)\\\\nRequirement already satisfied: itsdangerous>=0.24 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (1.1.0)\\\\nRequirement already satisfied: Jinja2>=2.10.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (2.10.1)\\\\nRequirement already satisfied: click>=5.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (7.0)\\\\nRequirement already satisfied: MarkupSafe>=0.23 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from Jinja2>=2.10.1->flask) (1.1.1)\\\\nInstalling collected packages: flask\\\\nSuccessfully installed flask-1.1.1\\\\n-expected3]\": 0.0017138754345176978,\n    \"tests/env/test_pip_util.py::test_get_pip_installed_packages_none[\\\\nRequirement already satisfied: flask in ./miniconda3/envs/fooo/lib/python3.7/site-packages (1.1.1)\\\\nRequirement already satisfied: itsdangerous>=0.24 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (1.1.0)\\\\nRequirement already satisfied: Jinja2>=2.10.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (2.10.1)\\\\nRequirement already satisfied: click>=5.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (7.0)\\\\nRequirement already satisfied: Werkzeug>=0.15 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (0.15.6)\\\\nRequirement already satisfied: MarkupSafe>=0.23 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from Jinja2>=2.10.1->flask) (1.1.1)\\\\n]\": 0.0016634652414983476,\n    \"tests/env/test_pip_util.py::test_get_pip_installed_packages_none[]\": 0.0015953297142807647,\n    \"tests/env/test_pip_util.py::test_get_pip_installed_packages_none[foo]\": 0.0015664420425527945,\n    \"tests/gateways/disk/test_create.py::test_deprecations[ProgressFileWrapper-TypeError]\": 0.002060667272716542,\n    \"tests/gateways/disk/test_create.py::test_deprecations[create_application_entry_point-TypeError]\": 0.0024246374995865504,\n    \"tests/gateways/disk/test_create.py::test_deprecations[create_fake_executable_softlink-TypeError]\": 0.0017992425487566492,\n    \"tests/gateways/disk/test_create.py::test_deprecations[extract_tarball-TypeError]\": 0.0019667070516179897,\n    \"tests/gateways/disk/test_delete.py::test_backoff_unlink\": 0.015379472204917559,\n    \"tests/gateways/disk/test_delete.py::test_backoff_unlink_doesnt_exist\": 0.002504888414464747,\n    \"tests/gateways/disk/test_delete.py::test_remove_dir\": 0.01652666943651486,\n    \"tests/gateways/disk/test_delete.py::test_remove_file\": 0.004368709638380541,\n    \"tests/gateways/disk/test_delete.py::test_remove_link_to_dir\": 0.01750818082154915,\n    \"tests/gateways/disk/test_delete.py::test_remove_link_to_file\": 0.0129104096056557,\n    \"tests/gateways/disk/test_delete.py::test_rm_rf\": 0.015464448159941234,\n    \"tests/gateways/disk/test_delete.py::test_rm_rf_couldnt\": 0.0027526003064684695,\n    \"tests/gateways/disk/test_delete.py::test_rm_rf_does_not_follow_symlinks\": 0.029124777774140083,\n    \"tests/gateways/disk/test_delete.py::test_try_rmdir_all_empty_doesnt_exist\": 0.020363744512942622,\n    \"tests/gateways/disk/test_link.py::test_hard_link\": 0.0043904248734572575,\n    \"tests/gateways/disk/test_link.py::test_soft_link\": 0.005145160496895293,\n    \"tests/gateways/disk/test_lock.py::test_LockError_raised\": 0.006233836944728784,\n    \"tests/gateways/disk/test_lock.py::test_double_locking_fails\": 12.839456904084292,\n    \"tests/gateways/disk/test_lock.py::test_lock_acquired_success\": 0.003785876718377488,\n    \"tests/gateways/disk/test_permissions.py::test_make_executable\": 0.003269212359712965,\n    \"tests/gateways/disk/test_permissions.py::test_make_writable\": 0.003749129953301872,\n    \"tests/gateways/disk/test_permissions.py::test_make_writable_dir_EACCES\": 0.002258070223843057,\n    \"tests/gateways/disk/test_permissions.py::test_make_writable_dir_EPERM\": 0.0028326029330467007,\n    \"tests/gateways/disk/test_permissions.py::test_make_writable_dir_EROFS\": 0.0025827532481499287,\n    \"tests/gateways/disk/test_permissions.py::test_make_writable_doesnt_exist\": 0.001624875505012505,\n    \"tests/gateways/disk/test_permissions.py::test_recursive_make_writable\": 0.0045269193290295405,\n    \"tests/gateways/disk/test_read.py::test_cherrypy_py27_osx_no_binary\": 0.02193855212530333,\n    \"tests/gateways/disk/test_read.py::test_cherrypy_py36_osx_whl\": 0.03353962133935971,\n    \"tests/gateways/disk/test_read.py::test_pyjwt_py27_osx_no_binary\": 0.006784311300208272,\n    \"tests/gateways/disk/test_read.py::test_pyjwt_py36_osx_whl\": 0.007660454886815904,\n    \"tests/gateways/disk/test_read.py::test_scrapy_py27_osx_no_binary\": 0.05404238851752166,\n    \"tests/gateways/disk/test_read.py::test_scrapy_py36_osx_whl\": 0.07356501832715824,\n    \"tests/gateways/disk/test_read.py::test_six_py27_osx_no_binary_unmanageable\": 0.0036919674770125852,\n    \"tests/gateways/disk/test_read.py::test_twilio_py27_osx_no_binary\": 0.07037965675876783,\n    \"tests/gateways/disk/test_read.py::test_twilio_py36_osx_whl\": 0.0708998966008614,\n    \"tests/gateways/test_connection.py::test_accept_range_none\": 0.8546771672468261,\n    \"tests/gateways/test_connection.py::test_add_binstar_token\": 0.04961104105187576,\n    \"tests/gateways/test_connection.py::test_get_channel_name_from_url[http://localhost-channels3-http://localhost]\": 0.006969980597036922,\n    \"tests/gateways/test_connection.py::test_get_channel_name_from_url[http://localhost/noarch/test-package-0.1.0.conda-channels2-http://localhost]\": 0.007011563154972855,\n    \"tests/gateways/test_connection.py::test_get_channel_name_from_url[https://conda.anaconda.org/conda-forge/linux-64/test-package-0.1.0.tar.bz2-channels1-conda-forge]\": 0.007342479374351276,\n    \"tests/gateways/test_connection.py::test_get_channel_name_from_url[https://repo.anaconda.com/pkgs/main/linux-64/test-package-0.1.0.conda-channels0-defaults]\": 0.007230386746400256,\n    \"tests/gateways/test_connection.py::test_get_session_returns_default\": 0.0030651073738441835,\n    \"tests/gateways/test_connection.py::test_get_session_with_channel_settings\": 0.006903723886402241,\n    \"tests/gateways/test_connection.py::test_get_session_with_channel_settings_multiple\": 0.0033683870950795996,\n    \"tests/gateways/test_connection.py::test_get_session_with_channel_settings_no_handler\": 0.0033762313846806683,\n    \"tests/gateways/test_connection.py::test_get_session_with_request_headers\": 0.004761713626384914,\n    \"tests/gateways/test_connection.py::test_get_session_with_url_pattern[exact-url]\": 0.004577729096124677,\n    \"tests/gateways/test_connection.py::test_get_session_with_url_pattern[no-match]\": 0.0035966932795392747,\n    \"tests/gateways/test_connection.py::test_get_session_with_url_pattern[url-prefix]\": 0.005137205384127162,\n    \"tests/gateways/test_connection.py::test_get_session_with_url_pattern[wildcard-match-same-schema]\": 0.005015336901500958,\n    \"tests/gateways/test_connection.py::test_get_session_with_url_pattern[wildcard-no-match-different-scheme]\": 0.00354790081243874,\n    \"tests/gateways/test_connection.py::test_get_session_with_url_pattern[wildcard-no-match-missing-scheme]\": 0.0035415990193495774,\n    \"tests/gateways/test_connection.py::test_local_file_adapter_200\": 0.032473458805526205,\n    \"tests/gateways/test_connection.py::test_local_file_adapter_404\": 0.05515630598609483,\n    \"tests/gateways/test_connection.py::test_offline[False]\": 0.01037429329924976,\n    \"tests/gateways/test_connection.py::test_offline[True]\": 0.00935953343561712,\n    \"tests/gateways/test_connection.py::test_prepare_request_allows_valid_plugin_headers\": 0.0049813526861995664,\n    \"tests/gateways/test_connection.py::test_prepare_request_rejects_forbidden_plugin_headers\": 0.004157118164655621,\n    \"tests/gateways/test_connection.py::test_s3_download_uses_direct_path\": 0.16877642769539494,\n    \"tests/gateways/test_connection.py::test_s3_server\": 0.0005197792844437502,\n    \"tests/gateways/test_connection.py::test_s3_server_with_mock\": 0.00040050264697454095,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_case_insensitive\": 0.0015412146806528812,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Accept-Charset]\": 0.001620362300763896,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Accept-Encoding]\": 0.0016698726856723297,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Access-Control-Request-Headers]\": 0.0016305606720355015,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Access-Control-Request-Method]\": 0.001695713800091543,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Connection]\": 0.0016729420541589425,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Content-Length]\": 0.0016233459242851562,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Cookie]\": 0.0016276613089747452,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[DNT]\": 0.0016510959504294864,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Date]\": 0.0015661880221643824,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Expect]\": 0.0016857295358366088,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Host]\": 0.0016254762774914134,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Keep-Alive]\": 0.0015548536208031564,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Origin]\": 0.0016083438368758713,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Referer]\": 0.0015770604077533841,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Set-Cookie]\": 0.001611622171820571,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[TE]\": 0.0015802063469201313,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Trailer]\": 0.0016615722182431302,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Transfer-Encoding]\": 0.0015963514109611598,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Upgrade]\": 0.0016459435672183823,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Via]\": 0.0015892316176035718,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Proxy-Authorization]\": 0.001579700319794963,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Proxy-Connection]\": 0.001648590140617363,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Sec-Fetch-Dest]\": 0.0015764342704105995,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Sec-Fetch-Mode]\": 0.001589620228944621,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Sec-Fetch-Site]\": 0.0017799464549817573,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[sec-ch-ua]\": 0.0016363855740805595,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-CONNECT-True]\": 0.0017490077701111052,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-GET-False]\": 0.0017722437135133473,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-Override-PUT-False]\": 0.0018201538187390658,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-Override-TRACE-True]\": 0.0017626802660766286,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-POST-False]\": 0.001699899159422026,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-TRACE-True]\": 0.001740781803244602,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-TRACK-True]\": 0.0018373497371275693,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-Method-Override-CONNECT-True]\": 0.001926580811927607,\n    \"tests/gateways/test_logging.py::test_token_not_present_in_conda_create\": 3.7255620935715617,\n    \"tests/gateways/test_logging.py::test_token_replace_big_string\": 0.0020946459584524034,\n    \"tests/gateways/test_logging.py::test_token_replace_individual_strings\": 0.001519419740903176,\n    \"tests/gateways/test_logging.py::test_token_url_filter_attached_to_loggers\": 0.0020635155008092957,\n    \"tests/gateways/test_logging.py::test_token_url_filter_formats[http-ip-port-with-token]\": 0.0018733072342525098,\n    \"tests/gateways/test_logging.py::test_token_url_filter_formats[https-url-with-token]\": 0.0019758480078635606,\n    \"tests/gateways/test_logging.py::test_token_url_filter_formats[multiple-tokens-in-message]\": 0.0017821926757525127,\n    \"tests/gateways/test_logging.py::test_token_url_filter_formats[path-only-with-token]\": 0.0019559028519362336,\n    \"tests/gateways/test_repodata_gateway.py::test_coverage_conda_http_errors\": 0.0318015818448593,\n    \"tests/gateways/test_repodata_gateway.py::test_get_cache_control_max_age\": 0.0016340596828054606,\n    \"tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[false-False]\": 0.01478340034451995,\n    \"tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[false-True]\": 0.29520211248534645,\n    \"tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[true-False]\": 0.009208311153521654,\n    \"tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[true-True]\": 0.12722372099994292,\n    \"tests/gateways/test_repodata_gateway.py::test_repodata_fetch_formats\": 0.49238360031298006,\n    \"tests/gateways/test_repodata_gateway.py::test_repodata_fetch_jsondecodeerror\": 0.004835373014027421,\n    \"tests/gateways/test_repodata_gateway.py::test_repodata_state_has_format\": 0.004485077426778568,\n    \"tests/gateways/test_repodata_gateway.py::test_save\": 0.10891863274818114,\n    \"tests/gateways/test_repodata_gateway.py::test_ssl_unavailable_error_message\": 0.0017852393876590675,\n    \"tests/gateways/test_repodata_gateway.py::test_stale\": 0.01605619803527753,\n    \"tests/gateways/test_repodata_lock.py::test_lock_no_lock[False]\": 9.88803526895255,\n    \"tests/gateways/test_repodata_lock.py::test_lock_no_lock[True]\": 0.8501024604396681,\n    \"tests/gateways/test_repodata_lock.py::test_lock_rename\": 0.00044653218761946865,\n    \"tests/gateways/test_repodata_shards.py::test_bytes_cache\": 0.010720186070033862,\n    \"tests/gateways/test_streams.py::test_redact_token_urls_matches_token_url_filter\": 0.0015883990223276685,\n    \"tests/gateways/test_streams.py::test_stderr_writes_redacted_text\": 0.0018384436046066383,\n    \"tests/gateways/test_subprocess.py::test_subprocess_call_with_capture_output\": 0.33769771679251426,\n    \"tests/gateways/test_subprocess.py::test_subprocess_call_without_capture_output\": 0.34145684553432015,\n    \"tests/gateways/test_zstd.py::test_download_repodata\": 0.09095936883870154,\n    \"tests/gateways/test_zstd.py::test_repodata_info_jsondecodeerror\": 0.0705323503266045,\n    \"tests/gateways/test_zstd.py::test_repodata_state\": 0.037851536028758626,\n    \"tests/gateways/test_zstd.py::test_repodata_use_zst[False]\": 0.00653388185021853,\n    \"tests/gateways/test_zstd.py::test_repodata_use_zst[True]\": 0.006594446389377719,\n    \"tests/gateways/test_zstd.py::test_server_available\": 0.005999537314403852,\n    \"tests/gateways/test_zstd.py::test_zstd_fallback_on_invalid_zstd\": 0.04280469180629315,\n    \"tests/gateways/test_zstd.py::test_zstd_not_404\": 0.005328687954716939,\n    \"tests/models/test_channel.py::test_bare_channel_file\": 0.0025350649246318907,\n    \"tests/models/test_channel.py::test_bare_channel_http\": 0.002426750467087641,\n    \"tests/models/test_channel.py::test_basic_multichannel\": 0.002486029546932133,\n    \"tests/models/test_channel.py::test_canonicalized_url_gets_correct_token\": 0.007675927171795456,\n    \"tests/models/test_channel.py::test_channel_alias\": 0.009980425327581073,\n    \"tests/models/test_channel.py::test_channel_alias_channels\": 0.0026386700565507928,\n    \"tests/models/test_channel.py::test_channel_alias_w_conda_path\": 0.007273002524411882,\n    \"tests/models/test_channel.py::test_channel_alias_w_subhcnnale\": 0.007146711782770537,\n    \"tests/models/test_channel.py::test_channel_cache\": 0.0023617792731296045,\n    \"tests/models/test_channel.py::test_channel_equality_respects_platform\": 0.0025955877210081927,\n    \"tests/models/test_channel.py::test_channel_host_port\": 0.0025869571432148852,\n    \"tests/models/test_channel.py::test_channel_mangles_urls\": 0.002513093750571165,\n    \"tests/models/test_channel.py::test_channel_name_subdir_only\": 0.0022362865386907965,\n    \"tests/models/test_channel.py::test_channels_with_dashes\": 0.008079653680561818,\n    \"tests/models/test_channel.py::test_custom_channels\": 0.011706133611850833,\n    \"tests/models/test_channel.py::test_custom_channels_port_token_auth\": 0.010740949420457956,\n    \"tests/models/test_channel.py::test_custom_token_in_channel\": 0.007113220164672199,\n    \"tests/models/test_channel.py::test_default_channel[None]\": 0.002406180258056207,\n    \"tests/models/test_channel.py::test_default_channel[win-32]\": 0.00255700670537331,\n    \"tests/models/test_channel.py::test_default_channels\": 0.010076207715079308,\n    \"tests/models/test_channel.py::test_defaults_channel\": 0.01067638228371336,\n    \"tests/models/test_channel.py::test_env_var_file_urls\": 0.003399868783475035,\n    \"tests/models/test_channel.py::test_expanded_variables\": 0.004959194717216496,\n    \"tests/models/test_channel.py::test_file_channel\": 0.010739888757380179,\n    \"tests/models/test_channel.py::test_file_url_with_backslashes\": 0.0024518252150881013,\n    \"tests/models/test_channel.py::test_file_urls\": 0.0024439332778126216,\n    \"tests/models/test_channel.py::test_local_channel\": 0.029495751043331596,\n    \"tests/models/test_channel.py::test_migrated_custom_channels\": 0.011088011104938029,\n    \"tests/models/test_channel.py::test_multichannel_priority\": 0.0026455664853802497,\n    \"tests/models/test_channel.py::test_named_custom_channel\": 0.009828098287142682,\n    \"tests/models/test_channel.py::test_named_custom_channel_w_subchan\": 0.009594138150420943,\n    \"tests/models/test_channel.py::test_old_channel_alias\": 0.011157368461593273,\n    \"tests/models/test_channel.py::test_pkgs_main\": 0.011788348829134827,\n    \"tests/models/test_channel.py::test_pkgs_pro\": 0.011884627693312813,\n    \"tests/models/test_channel.py::test_ppc64le_vs_ppc64\": 0.00299002279430017,\n    \"tests/models/test_channel.py::test_prioritize_channels\": 0.0025061929961636854,\n    \"tests/models/test_channel.py::test_regression_against_unknown_none\": 0.002838164616249625,\n    \"tests/models/test_channel.py::test_subdir_env_var\": 0.007745805991502514,\n    \"tests/models/test_channel.py::test_subdirs_env_var\": 0.008274239310337352,\n    \"tests/models/test_channel.py::test_subdirs_kwarg_takes_precedence_over_platform\": 0.0025474538818716997,\n    \"tests/models/test_channel.py::test_token_in_custom_channel\": 0.0027115466301707025,\n    \"tests/models/test_channel.py::test_unexpanded_variables\": 0.004654571371833802,\n    \"tests/models/test_channel.py::test_url_channel_w_platform\": 0.002360985418018755,\n    \"tests/models/test_channel.py::test_url_custom_channel\": 0.009697245869908748,\n    \"tests/models/test_channel.py::test_url_custom_channel_w_subchan\": 0.009586756959321888,\n    \"tests/models/test_dist.py::test_channel[.conda]\": 0.0090684796628616,\n    \"tests/models/test_dist.py::test_channel[.tar.bz2]\": 0.005099324911162339,\n    \"tests/models/test_dist.py::test_dist[.conda]\": 0.011830193998743455,\n    \"tests/models/test_dist.py::test_dist[.tar.bz2]\": 0.003892498122235486,\n    \"tests/models/test_dist.py::test_dist_with_channel_url[.conda]\": 0.029791821329502075,\n    \"tests/models/test_dist.py::test_dist_with_channel_url[.tar.bz2]\": 0.028566963359211,\n    \"tests/models/test_dist.py::test_dist_with_non_channel_url[.conda]\": 0.003434637011595627,\n    \"tests/models/test_dist.py::test_dist_with_non_channel_url[.tar.bz2]\": 0.0035728198198965657,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[-None]\": 0.001791430220834064,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[0-None]\": 0.001816538172250626,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[0.0-None]\": 0.0016801975448637984,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[1-NoarchType.generic]\": 0.0017498911084437008,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[1.0-NoarchType.generic]\": 0.0017144803382397205,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[42-NoarchType.generic]\": 0.001710889982762014,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[FALSE-None]\": 0.001682973188102352,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[False-None0]\": 0.0017331707475813792,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[False-None1]\": 0.0016610453452983631,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[GENERIC-NoarchType.generic]\": 0.0017757468594917828,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[Generic-NoarchType.generic]\": 0.0017360441588562697,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[N-None]\": 0.0017005876596929324,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[NO-None]\": 0.001653063203665132,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[NONE-None]\": 0.0017397605878390382,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[NULL-None]\": 0.0016612185431677572,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[No-None]\": 0.0018299385640600599,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[NoarchType.generic-NoarchType.generic]\": 0.0017281387283657524,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[NoarchType.python-NoarchType.python]\": 0.0017567538735217773,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[Non-None]\": 0.0017728835540381186,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[None-None]\": 0.0017424490385419124,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[Null-None]\": 0.0032189202858095055,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[OFF-None]\": 0.0017468553502444225,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[ON-NoarchType.generic]\": 0.0016675001265093218,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[Off-None]\": 0.0017801094882995854,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[On-NoarchType.generic]\": 0.0016825237329483325,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[PYTHON-NoarchType.python]\": 0.0017445746875510944,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[Python-NoarchType.python]\": 0.001984347141123574,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[TRUE-NoarchType.generic]\": 0.0016694159927942368,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[True-NoarchType.generic0]\": 0.0017643366503802787,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[True-NoarchType.generic1]\": 0.001664170528958248,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[Y-NoarchType.generic]\": 0.0017115763736641235,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[YES-NoarchType.generic]\": 0.001695241109022238,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[Yes-NoarchType.generic]\": 0.0017203147397433448,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[\\\\x00-None]\": 0.0017370322105503312,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[false-None]\": 0.001688956769265555,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[foobar-CondaUpgradeError]\": 0.001976835272321325,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[generic-NoarchType.generic]\": 0.0017071987657006399,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[invalid-CondaUpgradeError]\": 0.002044797628669657,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[n-None]\": 0.0016656259291550088,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[no-None]\": 0.0016592360871741508,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[non-None]\": 0.0017937118767890636,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[none-None]\": 0.0017329403698734043,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[null-None]\": 0.0017038151963247835,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[off-None]\": 0.0017626539870095202,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[on-NoarchType.generic]\": 0.001626130060852076,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[other-CondaUpgradeError]\": 0.002034251220361497,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[python-NoarchType.python]\": 0.001760511643173431,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[true-NoarchType.generic]\": 0.0016627549043100568,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[unknown-CondaUpgradeError]\": 0.0019856349005423443,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[value2-NoarchType.python]\": 0.00184785186895297,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[value3-NoarchType.generic]\": 0.0016527608874844742,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[y-NoarchType.generic]\": 0.0016982832588708563,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[yes-NoarchType.generic]\": 0.001764453933287027,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[~-None]\": 0.00168082694666291,\n    \"tests/models/test_environment.py::test_config_from_cli_channels_behaviors\": 0.0025389156575826755,\n    \"tests/models/test_environment.py::test_config_from_cli_channels_empty\": 0.0015771119644727072,\n    \"tests/models/test_environment.py::test_create_environment_missing_required_fields\": 0.001562623694719977,\n    \"tests/models/test_environment.py::test_create_invalid_platform\": 0.0016652729561836422,\n    \"tests/models/test_environment.py::test_create_missing_explicit_package\": 0.002568791083488558,\n    \"tests/models/test_environment.py::test_ensure_no_duplicate_named_explicit_packages\": 0.0025178770529980196,\n    \"tests/models/test_environment.py::test_environment_config_channels_basic\": 0.0016009246654248165,\n    \"tests/models/test_environment.py::test_environment_config_from_context\": 0.016243980273127987,\n    \"tests/models/test_environment.py::test_environments_merge\": 0.003328167916951466,\n    \"tests/models/test_environment.py::test_environments_merge_colliding_name\": 0.0018664986078308775,\n    \"tests/models/test_environment.py::test_environments_merge_colliding_platform\": 0.0018520851421048815,\n    \"tests/models/test_environment.py::test_environments_merge_colliding_prefix\": 0.0016266914963595175,\n    \"tests/models/test_environment.py::test_environments_merge_explicit_packages\": 0.002535431408086428,\n    \"tests/models/test_environment.py::test_explicit_packages\": 1.3916176836835898,\n    \"tests/models/test_environment.py::test_extrapolate\": 9.184451045588823,\n    \"tests/models/test_environment.py::test_from_cli_accepts_multi_platform_file_covering_current\": 0.003897010119043135,\n    \"tests/models/test_environment.py::test_from_cli_channel_order_base_file_cli\": 0.004116544003335586,\n    \"tests/models/test_environment.py::test_from_cli_empty\": 0.00292671375388239,\n    \"tests/models/test_environment.py::test_from_cli_empty_with_default_packages\": 0.019145204405875207,\n    \"tests/models/test_environment.py::test_from_cli_environment_inject_default_packages_override_file\": 0.008968591404075597,\n    \"tests/models/test_environment.py::test_from_cli_inject_default_packages_override\": 0.00885580039488771,\n    \"tests/models/test_environment.py::test_from_cli_mix_explicit_and_specs\": 0.0027443747339239238,\n    \"tests/models/test_environment.py::test_from_cli_override_channels_excludes_file_channels\": 0.004305995816935288,\n    \"tests/models/test_environment.py::test_from_cli_pre_flight_rejects_incompatible_files[1]\": 0.003477502380954705,\n    \"tests/models/test_environment.py::test_from_cli_pre_flight_rejects_incompatible_files[2]\": 0.01736355714286035,\n    \"tests/models/test_environment.py::test_from_cli_with_explicit_specs\": 0.003996012644941347,\n    \"tests/models/test_environment.py::test_from_cli_with_files\": 0.004374985985047865,\n    \"tests/models/test_environment.py::test_from_cli_with_specs\": 0.003202587181497308,\n    \"tests/models/test_environment.py::test_from_prefix_behavior_with_pip_interoperability\": 16.030303869838644,\n    \"tests/models/test_environment.py::test_from_prefix_options_affect_correct_packages\": 2.14254289928781,\n    \"tests/models/test_environment.py::test_from_prefix_package_population_semantics\": 1.9083890517251931,\n    \"tests/models/test_environment.py::test_merge_channel_settings\": 0.0016017354075325188,\n    \"tests/models/test_environment.py::test_merge_configs_channel_order_last_wins\": 0.0015811817654533234,\n    \"tests/models/test_environment.py::test_merge_configs_deduplicate_values\": 0.0016891403683630872,\n    \"tests/models/test_environment.py::test_merge_configs_primitive_none_values_order\": 0.0019296684978707965,\n    \"tests/models/test_environment.py::test_merge_configs_primitive_values_order_one\": 0.0016059532833478936,\n    \"tests/models/test_environment.py::test_merge_configs_primitive_values_order_two\": 0.0015609700070860547,\n    \"tests/models/test_match_spec.py::test_bracket_matches\": 0.02593514722318591,\n    \"tests/models/test_match_spec.py::test_build_glob_merge\": 0.011695241494364716,\n    \"tests/models/test_match_spec.py::test_build_glob_merge_channel\": 0.007835522397738883,\n    \"tests/models/test_match_spec.py::test_build_merge\": 0.002757604691176144,\n    \"tests/models/test_match_spec.py::test_build_number_and_filename\": 0.011242676383345212,\n    \"tests/models/test_match_spec.py::test_build_number_merge\": 0.006234628490587098,\n    \"tests/models/test_match_spec.py::test_canonical_string_forms\": 0.007603341510815269,\n    \"tests/models/test_match_spec.py::test_catch_invalid_regexes\": 0.0029071367878951673,\n    \"tests/models/test_match_spec.py::test_channel_matching\": 0.002926755054099488,\n    \"tests/models/test_match_spec.py::test_channel_merge\": 0.003606221249678742,\n    \"tests/models/test_match_spec.py::test_comment\": 0.005564918634495115,\n    \"tests/models/test_match_spec.py::test_conda_build_form[build_only]\": 0.0020336890742961027,\n    \"tests/models/test_match_spec.py::test_conda_build_form[build_version]\": 0.0018153282160597909,\n    \"tests/models/test_match_spec.py::test_conda_build_form[name_only]\": 0.001736072138022832,\n    \"tests/models/test_match_spec.py::test_conda_build_form[version_only]\": 0.0017656394646172811,\n    \"tests/models/test_match_spec.py::test_conda_env_form[conda-forge::numpy==1.21.0=py39h1234567_0-numpy=1.21.0=py39h1234567_0]\": 0.0024954036591017976,\n    \"tests/models/test_match_spec.py::test_conda_env_form[numpy=1.21.0-numpy=1.21.0]\": 0.0017708057603170425,\n    \"tests/models/test_match_spec.py::test_conda_env_form[numpy==1.21.0=py39h1234567_0-numpy=1.21.0=py39h1234567_0]\": 0.002022903916088365,\n    \"tests/models/test_match_spec.py::test_conda_env_form[pkgs/main::pandas==1.3.0=py39h123_0-pandas=1.3.0=py39h123_0]\": 0.0024532438186316615,\n    \"tests/models/test_match_spec.py::test_conda_env_form[python==3.9.7-python=3.9.7]\": 0.0018722977738467846,\n    \"tests/models/test_match_spec.py::test_conda_env_form[scipy==1.7.0=py39h456_0-scipy=1.7.0=py39h456_0]\": 0.0018333181371250377,\n    \"tests/models/test_match_spec.py::test_conda_env_form_comprehensive\": 0.00276113275859875,\n    \"tests/models/test_match_spec.py::test_conda_style\": 0.0017517297043950337,\n    \"tests/models/test_match_spec.py::test_dist\": 0.002939789222285779,\n    \"tests/models/test_match_spec.py::test_dist_str\": 0.0040300081635170895,\n    \"tests/models/test_match_spec.py::test_exact_values\": 0.0021645283497325595,\n    \"tests/models/test_match_spec.py::test_hash\": 0.002086232832600688,\n    \"tests/models/test_match_spec.py::test_hash_merge_with_name[md5]\": 0.0030008056892880785,\n    \"tests/models/test_match_spec.py::test_hash_merge_with_name[sha256]\": 0.002867820334885979,\n    \"tests/models/test_match_spec.py::test_hash_merge_wo_name[md5]\": 0.0018382690510445063,\n    \"tests/models/test_match_spec.py::test_hash_merge_wo_name[sha256]\": 0.0017982247602044263,\n    \"tests/models/test_match_spec.py::test_index_record\": 0.003225665612800965,\n    \"tests/models/test_match_spec.py::test_invalid\": 0.0060359974500862066,\n    \"tests/models/test_match_spec.py::test_invalid_match_spec\": 0.0017354821081047526,\n    \"tests/models/test_match_spec.py::test_invalid_version_reports_spec[pkg 4.2.2<6.0.0]\": 0.0016922143724583227,\n    \"tests/models/test_match_spec.py::test_invalid_version_reports_spec[pkg>=0.10.0,<1.0.0<py312|>=0.13.0,<1.0.0>=py312]\": 0.0019110502006340262,\n    \"tests/models/test_match_spec.py::test_key_value_features_canonical_string_forms\": 0.00040452641727319353,\n    \"tests/models/test_match_spec.py::test_legacy_features_canonical_string_forms\": 0.0016765342942316366,\n    \"tests/models/test_match_spec.py::test_license_match\": 0.004553406096698973,\n    \"tests/models/test_match_spec.py::test_match_1\": 0.008612498764201422,\n    \"tests/models/test_match_spec.py::test_matchspec_errors\": 0.0017670104943217952,\n    \"tests/models/test_match_spec.py::test_merge_multiple_name\": 0.008189566418592344,\n    \"tests/models/test_match_spec.py::test_merge_single_name\": 0.003578570673199604,\n    \"tests/models/test_match_spec.py::test_no_name_match_spec\": 0.0017382308084099012,\n    \"tests/models/test_match_spec.py::test_no_triple_equals_roundtrip\": 0.001783777423188288,\n    \"tests/models/test_match_spec.py::test_openssl_match\": 0.0028833424352289814,\n    \"tests/models/test_match_spec.py::test_parse_build_number_brackets\": 0.0018116168242405914,\n    \"tests/models/test_match_spec.py::test_parse_channel_subdir\": 0.002450589335763367,\n    \"tests/models/test_match_spec.py::test_parse_equal_equal\": 0.0016665069082691093,\n    \"tests/models/test_match_spec.py::test_parse_errors\": 0.0017218925837160866,\n    \"tests/models/test_match_spec.py::test_parse_hard\": 0.0018979967929825248,\n    \"tests/models/test_match_spec.py::test_parse_parens\": 0.00224538429525585,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_no_brackets\": 0.002730197737278684,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_tarball_url\": 0.0028844290913368964,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_with_brackets\": 0.002638858745697852,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[conda-forge::numpy>=1.20-numpy->=1.20]\": 0.0026006798130464312,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy 1.20 py39_0-numpy-1.20]\": 0.0019487054904921341,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy-numpy-None]\": 0.0018928141406332854,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy>=1.20-numpy->=1.20]\": 0.001919685119923717,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy[version='>=1.20']-numpy->=1.20]\": 0.001812851912337072,\n    \"tests/models/test_match_spec.py::test_pip_style2\": 0.0022193257369146156,\n    \"tests/models/test_match_spec.py::test_pip_style[foo>=1.3-foo[version='>=1.3']]\": 0.001905563766124681,\n    \"tests/models/test_match_spec.py::test_pip_style[numpy >=1.9-numpy[version='>=1.9']]\": 0.0018505318422528047,\n    \"tests/models/test_match_spec.py::test_pip_style[zope.int>=1.3,<3.0-zope.int[version='>=1.3,<3.0']]\": 0.0018405114085408378,\n    \"tests/models/test_match_spec.py::test_simple[foo=1.3.0=3-foo==1.3.0=3]\": 0.001956925174859635,\n    \"tests/models/test_match_spec.py::test_simple[ipython=0.13.0-ipython=0.13.0]\": 0.0017863822165359341,\n    \"tests/models/test_match_spec.py::test_simple[ipython=0.13.2-ipython=0.13.2]\": 0.001889017015423043,\n    \"tests/models/test_match_spec.py::test_simple[ipython==0.13.0-ipython==0.13.0]\": 0.0018731436373902112,\n    \"tests/models/test_match_spec.py::test_simple[python-python]\": 0.0017352642819309402,\n    \"tests/models/test_match_spec.py::test_simple[python=2.6*-python=2.6]\": 0.0018051328828159682,\n    \"tests/models/test_match_spec.py::test_simple[python=2.6-python=2.6]\": 0.0017894415507095512,\n    \"tests/models/test_match_spec.py::test_star_name\": 0.001590866260200763,\n    \"tests/models/test_match_spec.py::test_strictness\": 0.0027719717551609574,\n    \"tests/models/test_match_spec.py::test_subdir_merge\": 0.004044834524331674,\n    \"tests/models/test_match_spec.py::test_tarball_match_specs\": 0.0052258255683697045,\n    \"tests/models/test_match_spec.py::test_to_filename\": 0.01821572048000352,\n    \"tests/models/test_match_spec.py::test_track_features_match\": 0.00422757750273401,\n    \"tests/models/test_match_spec.py::test_url_percent_encoding\": 0.00378906785968334,\n    \"tests/models/test_match_spec.py::test_version_wildcard_serialization\": 0.0028190634658248944,\n    \"tests/models/test_package_info.py::test_package_info\": 0.0025472924691248003,\n    \"tests/models/test_prefix_graph.py::test_deep_cyclical_dependency[classic]\": 1.0617710653302688,\n    \"tests/models/test_prefix_graph.py::test_deep_cyclical_dependency[libmamba]\": 0.38201558347046405,\n    \"tests/models/test_prefix_graph.py::test_general_graph_bfs_simple[classic]\": 0.014619752116567547,\n    \"tests/models/test_prefix_graph.py::test_general_graph_bfs_simple[libmamba]\": 0.012364123413829186,\n    \"tests/models/test_prefix_graph.py::test_general_graph_bfs_version[classic]\": 0.011033894417834877,\n    \"tests/models/test_prefix_graph.py::test_general_graph_bfs_version[libmamba]\": 0.00931390460673235,\n    \"tests/models/test_prefix_graph.py::test_prefix_graph_1[classic]\": 3.555703102870647,\n    \"tests/models/test_prefix_graph.py::test_prefix_graph_1[libmamba]\": 0.2746985348952149,\n    \"tests/models/test_prefix_graph.py::test_prefix_graph_2[classic]\": 3.838338774694641,\n    \"tests/models/test_prefix_graph.py::test_prefix_graph_2[libmamba]\": 0.3424214878694504,\n    \"tests/models/test_prefix_graph.py::test_remove_youngest_descendant_nodes_with_specs[classic]\": 3.5574259703874764,\n    \"tests/models/test_prefix_graph.py::test_remove_youngest_descendant_nodes_with_specs[libmamba]\": 0.3076693042678925,\n    \"tests/models/test_prefix_graph.py::test_sort_without_prep[classic]\": 4.711198394183092,\n    \"tests/models/test_prefix_graph.py::test_sort_without_prep[libmamba]\": 1.3130912225813496,\n    \"tests/models/test_prefix_graph.py::test_windows_sort_orders_1[classic]\": 4.805078911605646,\n    \"tests/models/test_prefix_graph.py::test_windows_sort_orders_1[libmamba]\": 1.4300074147048594,\n    \"tests/models/test_prefix_graph.py::test_windows_sort_orders_2[classic]\": 4.218134741504841,\n    \"tests/models/test_prefix_graph.py::test_windows_sort_orders_2[libmamba]\": 1.3604621095446892,\n    \"tests/models/test_records.py::test_package_record_feature\": 0.0027343433131764546,\n    \"tests/models/test_records.py::test_package_record_spec_strings[my-package-2.1.0-alpha-py38_custom.build-my-package=2.1.0-alpha=py38_custom.build-my-package=2.1.0-alpha]\": 0.0027570750015989813,\n    \"tests/models/test_records.py::test_package_record_spec_strings[numpy-1.21.0-py39h_0-numpy=1.21.0=py39h_0-numpy=1.21.0]\": 0.0026881817189138646,\n    \"tests/models/test_records.py::test_package_record_spec_strings[scipy_special-1.7.0-py39_1-scipy_special=1.7.0=py39_1-scipy_special=1.7.0]\": 0.002684276583104418,\n    \"tests/models/test_records.py::test_package_record_spec_strings[tensorflow-2.8.0-cuda112py39_0-tensorflow=2.8.0=cuda112py39_0-tensorflow=2.8.0]\": 0.0026604791090240427,\n    \"tests/models/test_records.py::test_package_record_spec_strings_vs_str\": 0.002401902362486211,\n    \"tests/models/test_records.py::test_package_record_timestamp\": 0.0076257192138138846,\n    \"tests/models/test_records.py::test_package_virtual_package[123-testbuild]\": 0.00272266318065281,\n    \"tests/models/test_records.py::test_package_virtual_package[None-None]\": 0.0028172475625569747,\n    \"tests/models/test_records.py::test_package_virtual_package[None-testbuild]\": 0.0028991934974466524,\n    \"tests/models/test_records.py::test_prefix_record_no_channel\": 0.01071935111301427,\n    \"tests/models/test_records.py::test_record_spec_strings_inheritance[PackageRecord-extra_kwargs0]\": 0.0023747048110266777,\n    \"tests/models/test_records.py::test_record_spec_strings_inheritance[PrefixRecord-extra_kwargs1]\": 0.0023404360445316965,\n    \"tests/models/test_records.py::test_requested_spec\": 0.31814843881734683,\n    \"tests/models/test_version.py::test_compatible_release_versions\": 0.002016513239988272,\n    \"tests/models/test_version.py::test_compound_versions\": 0.0018402509619610881,\n    \"tests/models/test_version.py::test_hexrd\": 0.0016970052708608489,\n    \"tests/models/test_version.py::test_invalid_version_specs\": 0.0018263989143939084,\n    \"tests/models/test_version.py::test_local_identifier\": 0.0017213684114094324,\n    \"tests/models/test_version.py::test_match\": 0.0036734907561584667,\n    \"tests/models/test_version.py::test_not_eq_star\": 0.0019087544773018134,\n    \"tests/models/test_version.py::test_openssl_convention\": 0.002020975323207031,\n    \"tests/models/test_version.py::test_pep440\": 0.002409716394458325,\n    \"tests/models/test_version.py::test_pep_440_arbitrary_equality_operator\": 0.0015534565875445347,\n    \"tests/models/test_version.py::test_ver_eval\": 0.0019570125726775306,\n    \"tests/models/test_version.py::test_ver_eval_errors\": 0.0015382877683250463,\n    \"tests/models/test_version.py::test_version_order\": 0.011925159650323142,\n    \"tests/models/test_version.py::test_version_spec_1\": 0.0019219600834292638,\n    \"tests/models/test_version.py::test_version_spec_2\": 0.0018184129387880956,\n    \"tests/models/test_version.py::test_version_spec_3\": 0.00163976086232977,\n    \"tests/models/test_version.py::test_version_spec_4\": 0.0017050559281220619,\n    \"tests/notices/test_cache.py::test_clear_cache_invalidates_notices_cache[empty]\": 0.007691625925960782,\n    \"tests/notices/test_cache.py::test_clear_cache_invalidates_notices_cache[with-viewed-ids]\": 0.00990248518522734,\n    \"tests/notices/test_cache.py::test_clear_cache_removes_channel_response_caches\": 0.006372700000000535,\n    \"tests/notices/test_cache.py::test_clear_cache_survives_os_error[channel_response_cache]\": 0.006502100000008997,\n    \"tests/notices/test_cache.py::test_clear_cache_survives_os_error[notices_cache]\": 0.005821725925877082,\n    \"tests/notices/test_core.py::test__conda_user_story__disable_notices\": 0.013077998951162843,\n    \"tests/notices/test_core.py::test__conda_user_story__more_notices_message\": 0.1175781435878672,\n    \"tests/notices/test_core.py::test__conda_user_story__only_see_once\": 0.117222598319177,\n    \"tests/notices/test_core.py::test_display_notices_happy_path[200]\": 0.2217502535436943,\n    \"tests/notices/test_core.py::test_display_notices_happy_path[404]\": 0.22134026390687658,\n    \"tests/notices/test_core.py::test_display_notices_happy_path[500]\": 0.2207675908940307,\n    \"tests/notices/test_core.py::test_notices_decorator\": 0.12302821958418125,\n    \"tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.models.channel]\": 0.48944144909509346,\n    \"tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.cache]\": 0.48361550036641465,\n    \"tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.fetch]\": 0.4905865090388954,\n    \"tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.types]\": 0.4871772819536814,\n    \"tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.views]\": 0.49653200969809186,\n    \"tests/notices/test_deferred_imports.py::test_notices_core_does_not_load_requests\": 0.49675383165010706,\n    \"tests/notices/test_fetch.py::test_get_channel_notice_response_malformed_json\": 0.1229010745491987,\n    \"tests/notices/test_fetch.py::test_get_channel_notice_response_timeout_error\": 0.11033848568486025,\n    \"tests/notices/test_fetch.py::test_notice_response_cache_expired\": 0.0017760716920942935,\n    \"tests/notices/test_types.py::test_channel_notice_response\": 0.0017971776771094417,\n    \"tests/notices/test_types.py::test_channel_notice_response_date_parse_error\": 0.0033245569445879636,\n    \"tests/notices/test_types.py::test_channel_notice_response_integer_id\": 0.00161356716350871,\n    \"tests/notices/test_types.py::test_channel_notice_undefined_id\": 0.0016651798689264583,\n    \"tests/plugins/reporter_backends/test_console.py::test_console_reporter_renderer\": 0.0029296173390822434,\n    \"tests/plugins/reporter_backends/test_console.py::test_console_reporter_renderer_envs_list\": 0.004207094602001102,\n    \"tests/plugins/reporter_backends/test_console.py::test_prompt\": 0.003484984027780064,\n    \"tests/plugins/reporter_backends/test_console.py::test_prompt_bad_option\": 0.0020787722488788676,\n    \"tests/plugins/reporter_backends/test_console.py::test_prompt_error_reading_stdin\": 0.0040871737543027595,\n    \"tests/plugins/reporter_backends/test_console.py::test_quiet_spinner\": 0.0018767464776577605,\n    \"tests/plugins/reporter_backends/test_console.py::test_quiet_spinner_with_error\": 0.0018419495570669705,\n    \"tests/plugins/reporter_backends/test_console.py::test_spinner\": 0.10439800069477358,\n    \"tests/plugins/reporter_backends/test_console.py::test_spinner_with_error\": 0.1053420686467194,\n    \"tests/plugins/reporter_backends/test_console.py::test_spinner_with_os_error_errno_epipe\": 0.015166293421769962,\n    \"tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_os_error\": 0.006966626006961274,\n    \"tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_os_error_with_epipe_errno\": 0.0054123598112107,\n    \"tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_update_to_os_error\": 0.003533649363837437,\n    \"tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_update_to_os_error_with_errno_epipe\": 0.0032512391229809023,\n    \"tests/plugins/reporter_backends/test_json.py::test_json_handler\": 0.001736844646030402,\n    \"tests/plugins/reporter_backends/test_json.py::test_json_progress_bar_enabled\": 0.003059912564094877,\n    \"tests/plugins/reporter_backends/test_json.py::test_json_progress_bar_not_enabled\": 0.002632627840805423,\n    \"tests/plugins/reporter_backends/test_json.py::test_json_spinner\": 0.0017474000032110626,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files[.pyc]\": 0.008812318155587865,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files[.pyo]\": 0.007482039601949715,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyc-False]\": 0.009903302087345037,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyc-True]\": 0.007123561541330044,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyo-False]\": 0.007648865041251405,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyo-True]\": 0.0076098634831171,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_cannot_be_loaded[.pyc]\": 0.006355868905865491,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_cannot_be_loaded[.pyo]\": 0.00874548813368184,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_keys_missing[.pyc]\": 0.006389079226603636,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_keys_missing[.pyo]\": 0.006988812900815768,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files[.pyc]\": 0.006287263343915423,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files[.pyo]\": 0.007522933117158928,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyc-False]\": 0.006958947428622191,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyc-True]\": 0.006941740318054575,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyo-False]\": 0.007072975741300079,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyo-True]\": 0.006731417612940347,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_wrong_path_version[.pyc]\": 0.0063716670453058824,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_wrong_path_version[.pyo]\": 0.006518630527226797,\n    \"tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_check_fails\": 0.4156685196512498,\n    \"tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_check_fails_verbose\": 0.4003426542079373,\n    \"tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_check_passes\": 0.4465436192876844,\n    \"tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_constrains_not_met\": 0.32957477175081684,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_env_txt_check_action[.pyc]\": 0.016792823649207127,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_env_txt_check_action[.pyo]\": 0.0345419181602946,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_listed_on_envs_txt_file[.pyc]\": 0.00918451830505358,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_listed_on_envs_txt_file[.pyo]\": 0.012057252728038634,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_env_txt_check_action[.pyc]\": 0.01464347227911115,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_env_txt_check_action[.pyo]\": 0.013649418915769582,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_listed_on_envs_txt_file[.pyc]\": 0.01164650340366938,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_listed_on_envs_txt_file[.pyo]\": 0.01044387929111061,\n    \"tests/plugins/subcommands/doctor/health_checks/test_file_locking.py::test_file_locking_not_supported\": 4.793585501413312,\n    \"tests/plugins/subcommands/doctor/health_checks/test_file_locking.py::test_file_locking_supported[False]\": 5.346301996553403,\n    \"tests/plugins/subcommands/doctor/health_checks/test_file_locking.py::test_file_locking_supported[True]\": 6.490008351761527,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files[.pyc]\": 0.006622848646948574,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files[.pyo]\": 0.006350629423751464,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyc-False]\": 0.00728627548744719,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyc-True]\": 0.006963986738055644,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyo-False]\": 0.006714973551920889,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyo-True]\": 0.006714177253628094,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files[.pyc]\": 0.03927532226496783,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files[.pyo]\": 0.006395430860737809,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyc-False]\": 0.006594372323174355,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyc-True]\": 0.006896695055946447,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyo-False]\": 0.006217325334582783,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyo-True]\": 0.006504524970385479,\n    \"tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[\\\"conda\\\"-\\\\u274c]\": 0.04373920659996287,\n    \"tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[-\\\\u2705]\": 0.038670014759683326,\n    \"tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[conda 1.11, otherpackages==1-\\\\u274c]\": 0.03895734657019815,\n    \"tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[conda 1.11-\\\\u2705]\": 0.040846913937318194,\n    \"tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[imnotinstalledyet-\\\\u274c]\": 0.03917785407017805,\n    \"tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_fails[.pyc]\": 6.100895627330155,\n    \"tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_fails[.pyo]\": 6.309583320029072,\n    \"tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_non_existent_path[.pyc]\": 0.006926476975516011,\n    \"tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_non_existent_path[.pyo]\": 0.00676921470983111,\n    \"tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_passes[.pyc]\": 0.008009170214298703,\n    \"tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_passes[.pyo]\": 0.007913260600530003,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_fix_dry_run\": 0.08327568934840433,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_fix_yes\": 0.043878294061173426,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_happy_path\": 5.2478515582310346,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_happy_path_show_help\": 0.026904995826018723,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_happy_path_verbose\": 4.842906811100141,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_list\": 0.03243304869026585,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_specific_check\": 0.03542144983251846,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_with_non_existent_environment\": 0.03246286963762107,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_with_test_environment\": 0.041085075263973946,\n    \"tests/plugins/test_auth_handlers.py::test_duplicated\": 0.0037883658824108806,\n    \"tests/plugins/test_auth_handlers.py::test_get_auth_handler\": 0.014698122477368953,\n    \"tests/plugins/test_auth_handlers.py::test_get_auth_handler_multiple\": 0.00969416186877458,\n    \"tests/plugins/test_config.py::test_plugin_config_data_env_var_source\": 0.0014855573620058467,\n    \"tests/plugins/test_config.py::test_plugin_config_data_file_source\": 0.0052776220789188845,\n    \"tests/plugins/test_config.py::test_plugin_config_data_skip_bad_values\": 0.0015628275928934118,\n    \"tests/plugins/test_config.py::test_plugin_config_from_file\": 0.006128821630001494,\n    \"tests/plugins/test_config.py::test_plugin_describe_parameters\": 0.0024184831650618695,\n    \"tests/plugins/test_config.py::test_plugins_config_from_environment\": 0.002561880594117662,\n    \"tests/plugins/test_env_specs.py::test_alias_and_name_collision_detect\": 0.003677467594937779,\n    \"tests/plugins/test_env_specs.py::test_alias_normalization\": 0.001720358214347838,\n    \"tests/plugins/test_env_specs.py::test_available_platforms[default-single-platform]\": 0.0016597386904953465,\n    \"tests/plugins/test_env_specs.py::test_available_platforms[override-multi-platform]\": 0.001612124999980546,\n    \"tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[cep-24-CEP-24 compliant YAML environment specification-environment]\": 0.0033241367234975597,\n    \"tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[environment.yml-Standard YAML environment specification with dependencies-environment]\": 0.0033577189653668698,\n    \"tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[explicit-Explicit package URLs for fully reproducible environments-lockfile]\": 0.0034713460256654864,\n    \"tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[requirements.txt-Simple text file with package specifications-environment]\": 0.003414368180843244,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[environment.yaml-cep-24]\": 0.007496660738869881,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[environment.yml-cep-24]\": 0.007067844051546322,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[explicit.txt-explicit]\": 0.005922740388664569,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[requirements.txt-requirements.txt]\": 0.006515375518674733,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[spec.txt-requirements.txt]\": 0.006343459859281151,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_no_match_raises_error\": 0.0074585176039805795,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_pattern_matching_with_wildcard\": 0.010350354483136972,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_phase2_fallback\": 0.006690904649057159,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_with_invalid_contents\": 0.008886545299872485,\n    \"tests/plugins/test_env_specs.py::test_detect_spec_with_aliases\": 0.0030155259715254354,\n    \"tests/plugins/test_env_specs.py::test_dummy_random_spec_is_registered\": 0.0034417268242996376,\n    \"tests/plugins/test_env_specs.py::test_env_for_returns_requested_platform[default-single-platform]\": 0.0016476601190347428,\n    \"tests/plugins/test_env_specs.py::test_env_for_returns_requested_platform[override-multi-platform]\": 0.001556485119031609,\n    \"tests/plugins/test_env_specs.py::test_env_for_unknown_platform_raises[default-single-platform]\": 0.0017657309523767275,\n    \"tests/plugins/test_env_specs.py::test_env_for_unknown_platform_raises[override-multi-platform]\": 0.001721185714294344,\n    \"tests/plugins/test_env_specs.py::test_env_spec_iteration_pattern[default-single-platform]\": 0.0016445232142760211,\n    \"tests/plugins/test_env_specs.py::test_env_spec_iteration_pattern[override-multi-platform]\": 0.0016143196428341103,\n    \"tests/plugins/test_env_specs.py::test_explicitly_select_a_non_autodetect_plugin\": 0.0030513130959375404,\n    \"tests/plugins/test_env_specs.py::test_get_spec_by_aliases\": 0.0037954884163635878,\n    \"tests/plugins/test_env_specs.py::test_naught_plugin_does_not_cause_unhandled_errors_during_detection\": 0.0033762036227353055,\n    \"tests/plugins/test_env_specs.py::test_naughty_plugin_does_not_cause_unhandled_errors\": 0.0036633452238605422,\n    \"tests/plugins/test_env_specs.py::test_raise_error_for_multiple_registered_installers\": 0.003531530153223535,\n    \"tests/plugins/test_env_specs.py::test_raise_error_for_overlapping_default_filename\": 0.00649247628434414,\n    \"tests/plugins/test_env_specs.py::test_raises_an_error_if_file_is_unhandleable\": 0.014577635006775265,\n    \"tests/plugins/test_env_specs.py::test_raises_an_error_if_named_plugin_can_not_be_handled\": 0.0031633465461063676,\n    \"tests/plugins/test_env_specs.py::test_raises_an_error_if_no_plugins_found\": 0.0032328537775709277,\n    \"tests/plugins/test_env_specs.py::test_raises_an_error_if_plugin_name_does_not_exist\": 0.0030363325566518527,\n    \"tests/plugins/test_environment_export.py::test_alias_normalization_and_collision_detection\": 0.0016521319184724696,\n    \"tests/plugins/test_environment_export.py::test_builtin_explicit_exporter_with_urls\": 0.01350287720096183,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[environment-json-expected_aliases1]\": 0.01287544638922679,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[environment-yaml-expected_aliases0]\": 0.012838246127163454,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[explicit-expected_aliases2]\": 0.012802509835319305,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[requirements-expected_aliases3]\": 0.013363031188140471,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[environment-json-JSON format with channels and dependencies-environment]\": 0.013457154143491478,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[environment-yaml-YAML format with channels and dependencies-environment]\": 0.013355648903566594,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[explicit-Explicit URLs for exact package reproduction (lockfile)-lockfile]\": 0.012782385393965884,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[requirements-Simple text format with package specifications-environment]\": 0.016090109579914646,\n    \"tests/plugins/test_environment_export.py::test_builtin_requirements_exporter\": 0.012936580399059849,\n    \"tests/plugins/test_environment_export.py::test_builtin_structured_exporters[environment-json-loads]\": 0.014089512472290837,\n    \"tests/plugins/test_environment_export.py::test_builtin_structured_exporters[environment-yaml-safe_load]\": 0.015503409031225776,\n    \"tests/plugins/test_environment_export.py::test_compare_export_commands[args0-explicit]\": 0.6165183833068587,\n    \"tests/plugins/test_environment_export.py::test_compare_export_commands[args1-environment-yaml]\": 0.640227684106655,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[env.unknown-None]\": 0.012515186980722194,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[environment.json-environment-json]\": 0.012694526157167046,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[environment.yaml-environment-yaml]\": 0.012951575701532455,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[environment.yml-environment-yaml]\": 0.01273419849168518,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[explicit.txt-explicit]\": 0.012470085200406975,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[my-env.yaml-None]\": 0.012964286529911644,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[requirements.txt-requirements]\": 0.012289924914575943,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[spec.txt-requirements]\": 0.013191099075302117,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter_with_fnmatch_pattern\": 0.013260228331342015,\n    \"tests/plugins/test_environment_export.py::test_explicit_exporter_cep23_compliance_error\": 0.013548316450243611,\n    \"tests/plugins/test_environment_export.py::test_exporter_error_conditions[explicit-test_env-Cannot export explicit format]\": 0.013161322957308529,\n    \"tests/plugins/test_environment_export.py::test_exporter_error_conditions[requirements-test_env_with_explicit_packages-Cannot export requirements format]\": 0.014227069152760393,\n    \"tests/plugins/test_environment_export.py::test_exporter_pattern_backward_compatibility\": 0.013299471895754245,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[environment-json-True]\": 0.012429836945767901,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[environment-yaml-True]\": 0.01278579626619527,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[explicit-True]\": 0.012914576556053865,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[json-True]\": 0.012594040953514482,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[reqs-True]\": 0.01335012211044258,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[requirements-True]\": 0.012914381120927802,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[txt-True]\": 0.01273818012809341,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[unknown-False]\": 0.012718064263327899,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[yaml-True]\": 0.012501700103210923,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[yml-True]\": 0.012558851511716634,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporters\": 0.012897605651972567,\n    \"tests/plugins/test_environment_export.py::test_multi_platform_export\": 0.015033638444192352,\n    \"tests/plugins/test_environment_export.py::test_only_one_export[both]\": 0.0019089482973846886,\n    \"tests/plugins/test_environment_export.py::test_only_one_export[export]\": 0.0017784028550431197,\n    \"tests/plugins/test_environment_export.py::test_only_one_export[multiplatform_export]\": 0.0017689409028939346,\n    \"tests/plugins/test_environment_export.py::test_only_one_export[none]\": 0.002119029899450749,\n    \"tests/plugins/test_environment_export.py::test_single_platform_export\": 0.014802815174333907,\n    \"tests/plugins/test_environment_export.py::test_yaml_exporter_explicit_packages_format\": 0.015421631026456542,\n    \"tests/plugins/test_environment_export.py::test_yaml_exporter_handles_missing_name\": 0.014227959016658827,\n    \"tests/plugins/test_environment_export.py::test_yaml_exporter_with_empty_env\": 0.013754236764215598,\n    \"tests/plugins/test_health_checks.py::test_fix_user_cancels_no_warning\": 0.03444931981863561,\n    \"tests/plugins/test_health_checks.py::test_health_check_not_ran\": 0.04345732077554914,\n    \"tests/plugins/test_health_checks.py::test_health_check_ran\": 0.03190050305621044,\n    \"tests/plugins/test_hookspec.py::test_deprecations[spec_name]\": 0.0017268502617506078,\n    \"tests/plugins/test_manager.py::test_custom_plugin_name_validation\": 0.004325811195476516,\n    \"tests/plugins/test_manager.py::test_disable_external_plugins[VerboseSolverPlugin]\": 0.002958691027275495,\n    \"tests/plugins/test_manager.py::test_disable_external_plugins[tests.plugins.test_manager]\": 0.0031204760658386063,\n    \"tests/plugins/test_manager.py::test_get_canonical_name_class\": 0.0026570649912386756,\n    \"tests/plugins/test_manager.py::test_get_canonical_name_instance\": 0.0028619601491013083,\n    \"tests/plugins/test_manager.py::test_get_canonical_name_module\": 0.002761901691278633,\n    \"tests/plugins/test_manager.py::test_get_canonical_name_object\": 0.002957746918929013,\n    \"tests/plugins/test_manager.py::test_get_hook_results\": 0.003591573339359543,\n    \"tests/plugins/test_manager.py::test_get_request_headers\": 0.002628556325714606,\n    \"tests/plugins/test_manager.py::test_get_session_headers\": 0.00270043204922582,\n    \"tests/plugins/test_manager.py::test_get_solvers\": 0.002816043262042294,\n    \"tests/plugins/test_manager.py::test_get_virtual_package_records\": 0.0040813030933541695,\n    \"tests/plugins/test_manager.py::test_known_solver\": 0.002995625871099221,\n    \"tests/plugins/test_manager.py::test_load_entrypoints_blocked\": 0.01386014211340817,\n    \"tests/plugins/test_manager.py::test_load_entrypoints_importerror\": 0.016300488142138265,\n    \"tests/plugins/test_manager.py::test_load_entrypoints_register_valueerror\": 0.029665172414509278,\n    \"tests/plugins/test_manager.py::test_load_entrypoints_success\": 0.01584548129359044,\n    \"tests/plugins/test_manager.py::test_load_plugins_error\": 0.0028170853524782644,\n    \"tests/plugins/test_manager.py::test_load_two_plugins_one_impls\": 0.002958222277851255,\n    \"tests/plugins/test_manager.py::test_load_without_plugins\": 0.0027149753444148795,\n    \"tests/plugins/test_manager.py::test_plugin_bad_names[42]\": 0.0046574015976859956,\n    \"tests/plugins/test_manager.py::test_plugin_bad_names[False]\": 0.00198088626161078,\n    \"tests/plugins/test_manager.py::test_plugin_bad_names[None]\": 0.007554182866447132,\n    \"tests/plugins/test_manager.py::test_plugin_bad_names[True]\": 0.0027378502863988985,\n    \"tests/plugins/test_manager.py::test_plugin_bad_names[name4]\": 0.0024456993226274477,\n    \"tests/plugins/test_manager.py::test_plugin_bad_names[name5]\": 0.0015640863252345677,\n    \"tests/plugins/test_manager.py::test_plugin_name\": 0.0014407128295747243,\n    \"tests/plugins/test_manager.py::test_unknown_solver\": 0.0027654414463555077,\n    \"tests/plugins/test_package_extractors.py::test_extract_package\": 0.03917582155735953,\n    \"tests/plugins/test_package_extractors.py::test_get_package_extractor[.conda-None]\": 0.0017027918912930885,\n    \"tests/plugins/test_package_extractors.py::test_get_package_extractor[.not_supported-PluginError]\": 0.0017166243088197952,\n    \"tests/plugins/test_package_extractors.py::test_get_package_extractor[.tar.bz2-None]\": 0.0016977752019041573,\n    \"tests/plugins/test_package_extractors.py::test_get_package_extractors\": 0.0035503793598516526,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[-None]\": 0.003565604387756142,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[/path/to/package.random-.random]\": 0.00400683036368338,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[package-None]\": 0.003530495350634352,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[package.RANDOM-.random]\": 0.0037332876504130325,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[package.UPPER-.upper]\": 0.003765054528046739,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[package.other-None]\": 0.00371910439502746,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[package.random-.random]\": 0.003813035594256256,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[package.upper-.upper]\": 0.003685783638642792,\n    \"tests/plugins/test_package_extractors.py::test_plugin_fetches_correct_extractor\": 0.006043871731290795,\n    \"tests/plugins/test_post_commands.py::test_post_command_action_raises_exception\": 0.03496294283673902,\n    \"tests/plugins/test_post_commands.py::test_post_command_invoked\": 0.05216466650034339,\n    \"tests/plugins/test_post_commands.py::test_post_command_not_invoked\": 0.04337989720787689,\n    \"tests/plugins/test_post_solves.py::test_post_solve_action_raises_exception\": 3.2661881620717934,\n    \"tests/plugins/test_post_solves.py::test_post_solve_invoked\": 6.776982300617965,\n    \"tests/plugins/test_post_solves.py::test_post_solve_not_invoked\": 0.03514671432120989,\n    \"tests/plugins/test_pre_commands.py::test_pre_command_action_raises_exception\": 0.026660768970085673,\n    \"tests/plugins/test_pre_commands.py::test_pre_command_invoked\": 0.0454718086516335,\n    \"tests/plugins/test_pre_commands.py::test_pre_command_not_invoked\": 0.03998696221221715,\n    \"tests/plugins/test_pre_solves.py::test_pre_solve_action_raises_exception\": 0.04517463830280635,\n    \"tests/plugins/test_pre_solves.py::test_pre_solve_invoked\": 0.539766902166377,\n    \"tests/plugins/test_pre_solves.py::test_pre_solve_not_invoked\": 0.043818554443727134,\n    \"tests/plugins/test_reporter_backends.py::test_console_reporter_backend[detail_view-classic-argument2-\\\\n test : something\\\\n\\\\n]\": 0.003430015684379808,\n    \"tests/plugins/test_reporter_backends.py::test_console_reporter_backend[detail_view-json-argument3-{\\\\n  \\\"test\\\": \\\"something\\\"\\\\n}]\": 0.003391134846462989,\n    \"tests/plugins/test_reporter_backends.py::test_console_reporter_backend[render-classic-test-test\\\\n]\": 0.0034001582845284936,\n    \"tests/plugins/test_reporter_backends.py::test_console_reporter_backend[render-json-test-\\\"test\\\"]\": 0.004147759783948465,\n    \"tests/plugins/test_reporter_backends.py::test_default_reporter_backends_are_registered\": 0.003251165512819649,\n    \"tests/plugins/test_reporter_backends.py::test_dummy_reporter_backend_is_registered\": 0.003198647122392593,\n    \"tests/plugins/test_request_headers.py::test_get_request_headers[example.com/endpoint.json]\": 0.007109803503117148,\n    \"tests/plugins/test_request_headers.py::test_get_request_headers[example.com/path/somewhere.txt]\": 0.0031062994312972074,\n    \"tests/plugins/test_request_headers.py::test_get_request_headers[example.com]\": 0.0029685685604381048,\n    \"tests/plugins/test_request_headers.py::test_get_request_headers[random.com/endpoint.json]\": 0.0030219457746788188,\n    \"tests/plugins/test_request_headers.py::test_get_request_headers[random.com]\": 0.0030624660348899492,\n    \"tests/plugins/test_request_headers.py::test_get_session_headers[example.com/endpoint.json]\": 0.0030739887822471704,\n    \"tests/plugins/test_request_headers.py::test_get_session_headers[example.com/path/somewhere.txt]\": 0.003030044016356477,\n    \"tests/plugins/test_request_headers.py::test_get_session_headers[example.com]\": 0.003333989039959302,\n    \"tests/plugins/test_request_headers.py::test_get_session_headers[random.com/endpoint.json]\": 0.003113749291553316,\n    \"tests/plugins/test_request_headers.py::test_get_session_headers[random.com]\": 0.003082689845575234,\n    \"tests/plugins/test_settings.py::test_conda_config_describe_includes_plugin_settings\": 0.10621412017529247,\n    \"tests/plugins/test_settings.py::test_conda_config_describe_not_included_without_plugins\": 0.10756544401973787,\n    \"tests/plugins/test_settings.py::test_conda_config_describe_unknown_plugin_setting\": 0.028184040385777757,\n    \"tests/plugins/test_settings.py::test_conda_config_retrieves_correct_description_single_setting[map_parameter-Test map type setting]\": 0.03406813371467259,\n    \"tests/plugins/test_settings.py::test_conda_config_retrieves_correct_description_single_setting[seq_parameter-Test sequence type setting]\": 0.11354535779436338,\n    \"tests/plugins/test_settings.py::test_conda_config_retrieves_correct_description_single_setting[string_parameter-Test string type setting]\": 0.03264395498101968,\n    \"tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[map_parameter-plugins:\\\\n  map_parameter: {}\\\\n]\": 0.06741568176769462,\n    \"tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[non_existent_parameter-expected_output3]\": 0.0644860363155807,\n    \"tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[seq_parameter-plugins:\\\\n  seq_parameter: []\\\\n]\": 0.07805156624668862,\n    \"tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[string_parameter-plugins:\\\\n  string_parameter: value_one\\\\n]\": 0.06470808379309066,\n    \"tests/plugins/test_settings.py::test_conda_config_show_includes_plugin_settings\": 0.13782786468528155,\n    \"tests/plugins/test_settings.py::test_conda_config_with_invalid_setting\": 0.03561855907537948,\n    \"tests/plugins/test_settings.py::test_conda_config_with_map_settings\": 0.1096454638154665,\n    \"tests/plugins/test_settings.py::test_conda_config_with_sequence_settings\": 0.09529189982859818,\n    \"tests/plugins/test_settings.py::test_conda_config_with_string_settings\": 0.09734538833440977,\n    \"tests/plugins/test_settings.py::test_get_settings\": 0.007724801274198517,\n    \"tests/plugins/test_settings.py::test_load_configuration_parameters\": 0.003172631202997699,\n    \"tests/plugins/test_settings.py::test_load_plugin_config_with_env_var\": 0.007399489684083052,\n    \"tests/plugins/test_settings.py::test_load_plugin_settings_with_condarc\": 0.00825994009822456,\n    \"tests/plugins/test_solvers.py::test_duplicated\": 0.0033061269906079346,\n    \"tests/plugins/test_solvers.py::test_get_cached_solver_backend\": 0.0039848766776023285,\n    \"tests/plugins/test_solvers.py::test_get_conflicting_solvers\": 0.002939033319579493,\n    \"tests/plugins/test_solvers.py::test_get_no_solver\": 0.002673423988097313,\n    \"tests/plugins/test_solvers.py::test_get_one_solver\": 0.01284926356933841,\n    \"tests/plugins/test_solvers.py::test_get_solver_backend\": 0.007457828209478276,\n    \"tests/plugins/test_solvers.py::test_get_solver_backend_multiple\": 0.0075929770540558985,\n    \"tests/plugins/test_solvers.py::test_get_two_solvers\": 0.003221424593106338,\n    \"tests/plugins/test_solvers.py::test_solver_user_agent\": 0.007488405719350691,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[activate]\": 0.02519663514329089,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[clean]\": 0.026867118325606936,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[commands]\": 0.02657317057781628,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[compare]\": 0.027806801208699872,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[config]\": 0.025930695026616758,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[create]\": 0.028082481890618353,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[deactivate]\": 0.026828212861763172,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[env]\": 0.024703540221795453,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[export]\": 0.0255638647484492,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[info]\": 0.026691467913099367,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[init]\": 0.0387094591829041,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[install]\": 0.03282346730505797,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[list]\": 0.03141390457376573,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[notices]\": 0.027647817600596262,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[package]\": 0.026228394657442713,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[remove]\": 0.02651137209288632,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[rename]\": 0.025245355596846365,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[run]\": 0.026775484535749457,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[search]\": 0.031869648737226454,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[uninstall]\": 0.028269922133458296,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[update]\": 0.04007401963316091,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[upgrade]\": 0.05350728508818532,\n    \"tests/plugins/test_subcommands.py::test_custom_plugin_extend_parser\": 0.02513643061697973,\n    \"tests/plugins/test_subcommands.py::test_custom_plugin_not_extend_parser\": 0.029974403177372436,\n    \"tests/plugins/test_subcommands.py::test_duplicated\": 0.003365725010481879,\n    \"tests/plugins/test_subcommands.py::test_help\": 0.03752059044173137,\n    \"tests/plugins/test_subcommands.py::test_invoked\": 0.039287136918238444,\n    \"tests/plugins/test_subcommands.py::test_parser_no_plugins\": 0.03457466296668552,\n    \"tests/plugins/test_transaction_hooks.py::test_post_transaction_raises_exception\": 0.43793174826924236,\n    \"tests/plugins/test_transaction_hooks.py::test_pre_transaction_raises_exception\": 0.46012842088225914,\n    \"tests/plugins/test_transaction_hooks.py::test_transaction_hooks_invoked\": 0.5604339156121383,\n    \"tests/plugins/test_types.py::TestCondaEnvironmentExporter::test_backward_compatibility_without_new_fields\": 0.0014924339643119968,\n    \"tests/plugins/test_types.py::TestCondaEnvironmentExporter::test_description_defaults_to_name\": 0.0015525817717471058,\n    \"tests/plugins/test_types.py::TestCondaEnvironmentExporter::test_explicit_description_preserved\": 0.0015195704072709063,\n    \"tests/plugins/test_types.py::TestCondaEnvironmentSpecifier::test_backward_compatibility_without_new_fields\": 0.0016158358243819723,\n    \"tests/plugins/test_types.py::TestCondaEnvironmentSpecifier::test_description_defaults_to_name\": 0.0016832768083554263,\n    \"tests/plugins/test_types.py::TestCondaEnvironmentSpecifier::test_explicit_description_preserved\": 0.0016181041976573995,\n    \"tests/plugins/test_virtual_packages.py::test_archspec_override[None-False]\": 0.7111682162498694,\n    \"tests/plugins/test_virtual_packages.py::test_archspec_override[bla-True]\": 0.10026928299664538,\n    \"tests/plugins/test_virtual_packages.py::test_conda_virtual_package\": 0.0035460577067092957,\n    \"tests/plugins/test_virtual_packages.py::test_context_override[Both `CONDA_OVERRIDE_FOO` gets precedence and `context.override_virtual_packages` are set]\": 0.003301318527371993,\n    \"tests/plugins/test_virtual_packages.py::test_context_override[`CONDA_OVERRIDE_FOO` not set, but `context.override_virtual_packages` is set]\": 0.0032998826964814663,\n    \"tests/plugins/test_virtual_packages.py::test_cuda_detection\": 0.7178861498570493,\n    \"tests/plugins/test_virtual_packages.py::test_cuda_override[override-empty]\": 0.0063981758618698445,\n    \"tests/plugins/test_virtual_packages.py::test_cuda_override[override-set]\": 0.007920153233173629,\n    \"tests/plugins/test_virtual_packages.py::test_duplicated\": 2.4128975326936386,\n    \"tests/plugins/test_virtual_packages.py::test_glibc_override[1.0-True]\": 0.008549678822444735,\n    \"tests/plugins/test_virtual_packages.py::test_glibc_override[None-False]\": 0.008768871608350971,\n    \"tests/plugins/test_virtual_packages.py::test_invoked\": 4.6732644254382425,\n    \"tests/plugins/test_virtual_packages.py::test_linux_override[1.0-True]\": 0.00901493418729911,\n    \"tests/plugins/test_virtual_packages.py::test_linux_override[None-True]\": 0.35050740483861803,\n    \"tests/plugins/test_virtual_packages.py::test_linux_value\": 0.27586191881420563,\n    \"tests/plugins/test_virtual_packages.py::test_no_gpu_cuda\": 1.0981519897831498,\n    \"tests/plugins/test_virtual_packages.py::test_no_gpu_cuda_patched\": 0.001725655076560301,\n    \"tests/plugins/test_virtual_packages.py::test_osx_override[1.0-True]\": 0.008314225316946809,\n    \"tests/plugins/test_virtual_packages.py::test_osx_override[None-False]\": 0.008284522777974621,\n    \"tests/plugins/test_virtual_packages.py::test_osx_value\": 0.008200759223521507,\n    \"tests/plugins/test_virtual_packages.py::test_override_mock_calls[base case, no override]\": 0.0031934193377857706,\n    \"tests/plugins/test_virtual_packages.py::test_override_mock_calls[build overriden]\": 0.0031100373841138444,\n    \"tests/plugins/test_virtual_packages.py::test_override_mock_calls[version overriden]\": 0.003219405323447127,\n    \"tests/plugins/test_virtual_packages.py::test_override_package_values[build override with `empty_override=None`]\": 0.0032333775839880484,\n    \"tests/plugins/test_virtual_packages.py::test_override_package_values[build override]\": 0.0031945069945717905,\n    \"tests/plugins/test_virtual_packages.py::test_override_package_values[no override]\": 0.003077653976198641,\n    \"tests/plugins/test_virtual_packages.py::test_override_package_values[version override with `empty_override=None`]\": 0.003240946847616511,\n    \"tests/plugins/test_virtual_packages.py::test_override_package_values[version override]\": 0.0032468662387401645,\n    \"tests/plugins/test_virtual_packages.py::test_package_is_NULL[`build=NULL` returns NULL package]\": 0.0023077879162475686,\n    \"tests/plugins/test_virtual_packages.py::test_package_is_NULL[`empty_override=NULL` returns NULL package]\": 0.0024091158773591405,\n    \"tests/plugins/test_virtual_packages.py::test_package_is_NULL[`empty_override=None` returns valid package]\": 0.003199137901454819,\n    \"tests/plugins/test_virtual_packages.py::test_package_is_NULL[`version=NULL` returns NULL package ]\": 0.0023893478783182285,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[emscripten-wasm32]\": 0.009046143290779837,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[freebsd-64]\": 0.008494423777666947,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-32]\": 0.00904712550235126,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-64]\": 0.008959037181451187,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-aarch64]\": 0.008491536767256908,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-armv6l]\": 0.009294244794124528,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-armv7l]\": 0.008574920008198003,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-ppc64]\": 0.008601717950054913,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-ppc64le]\": 0.008794882215021812,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-riscv64]\": 0.008799772167706261,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-s390x]\": 0.00901088058955212,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[osx-64]\": 0.009372796482074204,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[osx-aarch64]\": 0.009317971357324652,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[osx-arm64]\": 0.008595543098794043,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[wasi-wasm32]\": 0.00830814452640728,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[win-32]\": 0.00829100896178465,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[win-64_0]\": 0.00815785571473459,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[win-64_1]\": 0.008448014526214812,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[win-arm64]\": 0.008782728781037861,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[zos-z]\": 0.008189844463676493,\n    \"tests/plugins/test_virtual_packages.py::test_version_validation[no version validation, no override]\": 0.003096863648313755,\n    \"tests/plugins/test_virtual_packages.py::test_version_validation[version validation, no override]\": 0.002996317451624038,\n    \"tests/plugins/test_virtual_packages.py::test_version_validation[version validation, override]\": 0.0030065313410353517,\n    \"tests/plugins/test_virtual_packages.py::test_win_override[1.0-True]\": 0.009083265871140585,\n    \"tests/plugins/test_virtual_packages.py::test_win_override[None-False]\": 0.009124170853244134,\n    \"tests/plugins/test_virtual_packages.py::test_win_value\": 0.008842665585911383,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_activate_error[cmd.exe]\": 7.560802055670548,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_activate_invalid_temp[cmd.exe]\": 6.187577603680803,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_activate_script_failure[cmd.exe]\": 6.879798411875653,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_basic_integration[cmd.exe]\": 17.48541201660887,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_deactivate_help[cmd.exe]\": 6.081257449999986,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_existing_env_with_special_chars[python=3.12-cmd.exe]\": 8.066458951494157,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_existing_env_with_special_chars[test!important!env-cmd.exe]\": 8.233614910318456,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[!-cmd.exe]\": 7.9326013812622564,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[%-cmd.exe]\": 7.740779972829482,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[(-cmd.exe]\": 7.911984048638141,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[)-cmd.exe]\": 8.320493518408494,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[=-cmd.exe]\": 7.639456625196004,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[^-cmd.exe]\": 6.9548637323193585,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[!-cmd.exe]\": 8.227079398733839,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[%-cmd.exe]\": 7.970799732049596,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[(-cmd.exe]\": 7.80600588973747,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[)-cmd.exe]\": 7.72399854159136,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[=-cmd.exe]\": 8.526858686275917,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[^-cmd.exe]\": 6.7950661461432444,\n    \"tests/shell/test_cmd_exe.py::test_legacy_activate_deactivate_cmd_exe[cmd.exe]\": 11.04873183375639,\n    \"tests/shell/test_cmd_exe.py::test_shell_available[cmd.exe]\": 0.005948314779666815,\n    \"tests/shell/test_csh.py::test_basic_integration[csh]\": 0.00044434363357462786,\n    \"tests/shell/test_csh.py::test_basic_integration[tcsh]\": 0.00043429458777534055,\n    \"tests/shell/test_csh.py::test_shell_available[csh]\": 0.0006460417192977102,\n    \"tests/shell/test_csh.py::test_shell_available[tcsh]\": 0.0004395892719763176,\n    \"tests/shell/test_fish.py::test_fish_basic_integration[fish]\": 0.0005365747894636568,\n    \"tests/shell/test_fish.py::test_fish_disable_prompt\": 0.0004053175594455378,\n    \"tests/shell/test_fish.py::test_fish_prompt_functions_in_hook\": 0.00041997820901732455,\n    \"tests/shell/test_fish.py::test_shell_available[fish]\": 0.0004181138319577709,\n    \"tests/shell/test_posix.py::test_bash_activate_error[ash]\": 0.0004145570026979592,\n    \"tests/shell/test_posix.py::test_bash_activate_error[bash]\": 0.0004591068481304716,\n    \"tests/shell/test_posix.py::test_bash_activate_error[dash]\": 0.00043349177782842237,\n    \"tests/shell/test_posix.py::test_bash_activate_error[zsh]\": 0.0004868660773265013,\n    \"tests/shell/test_posix.py::test_basic_integration[ash]\": 0.00042210902494886746,\n    \"tests/shell/test_posix.py::test_basic_integration[bash]\": 37.12917488093205,\n    \"tests/shell/test_posix.py::test_basic_integration[dash]\": 0.0004536196804328326,\n    \"tests/shell/test_posix.py::test_basic_integration[zsh]\": 0.0003926987074814408,\n    \"tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[ash]\": 0.00039147859668993423,\n    \"tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[bash]\": 14.827016758325415,\n    \"tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[dash]\": 0.00047351165448569164,\n    \"tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[zsh]\": 0.0005928371851260136,\n    \"tests/shell/test_posix.py::test_shell_available[ash]\": 0.0004035280107929279,\n    \"tests/shell/test_posix.py::test_shell_available[bash]\": 0.0028677317715680275,\n    \"tests/shell/test_posix.py::test_shell_available[dash]\": 0.0004188722292533579,\n    \"tests/shell/test_posix.py::test_shell_available[zsh]\": 0.00045821717979146917,\n    \"tests/shell/test_powershell.py::test_powershell_PATH_management[C:\\\\\\\\Users\\\\\\\\runneradmin\\\\\\\\AppData\\\\\\\\Local\\\\\\\\Microsoft\\\\\\\\powershell-preview]\": 0.0004678501243340314,\n    \"tests/shell/test_powershell.py::test_powershell_PATH_management[C:\\\\\\\\Users\\\\\\\\runneradmin\\\\\\\\AppData\\\\\\\\Local\\\\\\\\Microsoft\\\\\\\\powershell]\": 0.0005427391883326519,\n    \"tests/shell/test_powershell.py::test_powershell_PATH_management[powershell]\": 0.0005881588159233751,\n    \"tests/shell/test_powershell.py::test_powershell_basic_integration[C:\\\\\\\\Users\\\\\\\\runneradmin\\\\\\\\AppData\\\\\\\\Local\\\\\\\\Microsoft\\\\\\\\powershell-preview]\": 21.460657597786156,\n    \"tests/shell/test_powershell.py::test_powershell_basic_integration[C:\\\\\\\\Users\\\\\\\\runneradmin\\\\\\\\AppData\\\\\\\\Local\\\\\\\\Microsoft\\\\\\\\powershell]\": 20.659546478159886,\n    \"tests/shell/test_powershell.py::test_powershell_basic_integration[powershell]\": 20.78495329101098,\n    \"tests/shell/test_powershell.py::test_shell_available[C:\\\\\\\\Users\\\\\\\\runneradmin\\\\\\\\AppData\\\\\\\\Local\\\\\\\\Microsoft\\\\\\\\powershell-preview]\": 0.004762059277767813,\n    \"tests/shell/test_powershell.py::test_shell_available[C:\\\\\\\\Users\\\\\\\\runneradmin\\\\\\\\AppData\\\\\\\\Local\\\\\\\\Microsoft\\\\\\\\powershell]\": 0.0032804244003504968,\n    \"tests/shell/test_powershell.py::test_shell_available[powershell]\": 0.009506303525950511,\n    \"tests/shell/test_shell.py::test_activate_deactivate_modify_path[ash]\": 0.0005086219680689233,\n    \"tests/shell/test_shell.py::test_activate_deactivate_modify_path[bash]\": 10.221761551556387,\n    \"tests/shell/test_shell.py::test_activate_deactivate_modify_path[cmd.exe]\": 7.116605716661049,\n    \"tests/shell/test_shell.py::test_activate_deactivate_modify_path[dash]\": 0.0005196076812698515,\n    \"tests/shell/test_shell.py::test_activate_deactivate_modify_path[zsh]\": 0.0005163227479633792,\n    \"tests/shell/test_shell.py::test_stacking[0-None-base-base,sys]\": 10.745732984291529,\n    \"tests/shell/test_shell.py::test_stacking[0-None-has-has,sys]\": 8.797877161595904,\n    \"tests/shell/test_shell.py::test_stacking[0-None-not-sys]\": 9.19429499414957,\n    \"tests/shell/test_shell.py::test_stacking[0-base-base-base,sys]\": 8.963635994421308,\n    \"tests/shell/test_shell.py::test_stacking[0-base-has-has,sys]\": 11.393867348294629,\n    \"tests/shell/test_shell.py::test_stacking[0-base-not-sys]\": 9.800890135518324,\n    \"tests/shell/test_shell.py::test_stacking[0-has-base-base,sys]\": 9.0456392692343,\n    \"tests/shell/test_shell.py::test_stacking[0-has-has-has,sys]\": 9.31640024493456,\n    \"tests/shell/test_shell.py::test_stacking[0-has-not-sys]\": 9.328355033403763,\n    \"tests/shell/test_shell.py::test_stacking[0-not-base-base,sys]\": 8.777506304402676,\n    \"tests/shell/test_shell.py::test_stacking[0-not-has-has,sys]\": 8.991734786925313,\n    \"tests/shell/test_shell.py::test_stacking[0-not-not-sys]\": 9.39929204670285,\n    \"tests/shell/test_shell.py::test_stacking[5-base,has-base-base,has,sys]\": 10.767073081916601,\n    \"tests/shell/test_shell.py::test_stacking[5-base,has-has-has,base,sys]\": 9.931820863528019,\n    \"tests/shell/test_shell.py::test_stacking[5-base,has-not-has,base,sys]\": 10.216059928606626,\n    \"tests/shell/test_shell.py::test_stacking[5-base,not-base-base,sys]\": 10.144441280879343,\n    \"tests/shell/test_shell.py::test_stacking[5-base,not-has-has,base,sys]\": 10.606052282011593,\n    \"tests/shell/test_shell.py::test_stacking[5-base,not-not-base,sys]\": 10.318809455881764,\n    \"tests/shell/test_shell.py::test_stacking[5-base-base-base,sys]\": 9.06040901877074,\n    \"tests/shell/test_shell.py::test_stacking[5-base-has-has,base,sys]\": 9.586710646990962,\n    \"tests/shell/test_shell.py::test_stacking[5-base-not-base,sys]\": 9.021476147011958,\n    \"tests/shell/test_shell.py::test_stacking[5-has-base-base,has,sys]\": 8.71984256168399,\n    \"tests/shell/test_shell.py::test_stacking[5-has-has-has,sys]\": 9.071511108681754,\n    \"tests/shell/test_shell.py::test_stacking[5-has-not-has,sys]\": 9.17679232063548,\n    \"tests/shell/test_shell.py::test_stacking[5-not-base-base,sys]\": 8.751545200233426,\n    \"tests/shell/test_shell.py::test_stacking[5-not-has-has,sys]\": 9.056653088531315,\n    \"tests/shell/test_shell.py::test_stacking[5-not-not-sys]\": 9.168424262559125,\n    \"tests/shell/test_xonsh.py::test_basic_integration[xonsh]\": 0.0004460120910298493,\n    \"tests/shell/test_xonsh.py::test_shell_available[xonsh]\": 0.00046762439069503235,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-clang64 legacy]\": 0.012589706416387259,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-clang64 mingw64]\": 0.012462616967563697,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-legacy]\": 0.0300223643813309,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-mingw64 legacy]\": 0.01657138212048213,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-nothing]\": 0.01166812761548008,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-ucrt64 clang64]\": 0.012543990645661198,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-ucrt64 legacy]\": 0.012401266600223115,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-ucrt64]\": 0.042321520479329286,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-clang64 legacy]\": 0.012291315675976537,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-clang64 mingw64]\": 0.01678225370515242,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-legacy]\": 0.01190918885813576,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-mingw64 legacy]\": 0.012390559481431598,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-nothing]\": 0.011534683548665752,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-ucrt64 clang64]\": 0.013513356618623481,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-ucrt64 legacy]\": 0.012745395433810239,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-ucrt64]\": 0.030612555700756525,\n    \"tests/test_activate.py::test_PS1\": 0.24256454133626107,\n    \"tests/test_activate.py::test_PS1_no_changeps1\": 0.2382900730266985,\n    \"tests/test_activate.py::test_activate_and_deactivate_for_uninitialized_env\": 0.09424464501612964,\n    \"tests/test_activate.py::test_activate_default_env[CmdExeActivator]\": 2.060606629965927,\n    \"tests/test_activate.py::test_activate_default_env[CshActivator]\": 2.4383867396946166,\n    \"tests/test_activate.py::test_activate_default_env[FishActivator]\": 2.4424701572779086,\n    \"tests/test_activate.py::test_activate_default_env[PosixActivator]\": 2.491633210146418,\n    \"tests/test_activate.py::test_activate_default_env[PowerShellActivator]\": 2.0379919224562046,\n    \"tests/test_activate.py::test_activate_default_env[XonshActivator]\": 2.047152652461863,\n    \"tests/test_activate.py::test_activate_environment_not_found\": 0.010045518037006162,\n    \"tests/test_activate.py::test_activate_same_environment\": 0.6401182232187702,\n    \"tests/test_activate.py::test_activator_invalid_command_arguments[command_args0-'activate', 'deactivate', 'hook', 'commands', or 'reactivate' command must be given.]\": 0.006904224823153388,\n    \"tests/test_activate.py::test_activator_invalid_command_arguments[command_args1-cannot specify both --stack and --no-stack to activate]\": 0.006826330970486477,\n    \"tests/test_activate.py::test_activator_invalid_command_arguments[command_args2-activate does not accept more than one argument:\\\\n\\\\\\\\['env-one', 'env-two'\\\\\\\\]\\\\n]\": 0.006773158209263256,\n    \"tests/test_activate.py::test_activator_invalid_command_arguments[command_args3-deactivate does not accept arguments\\\\nremainder_args: \\\\\\\\['env-one']\\\\n]\": 0.006733571355759254,\n    \"tests/test_activate.py::test_add_prefix_to_path_cmdexe\": 0.01440755772114531,\n    \"tests/test_activate.py::test_add_prefix_to_path_posix\": 0.0004215906814483425,\n    \"tests/test_activate.py::test_build_activate_dont_activate_unset_var\": 0.4638008503758503,\n    \"tests/test_activate.py::test_build_activate_dont_use_PATH\": 0.4645511824166836,\n    \"tests/test_activate.py::test_build_activate_restore_unset_env_vars\": 0.0004140650866328838,\n    \"tests/test_activate.py::test_build_activate_shlvl_0\": 0.4620689589798652,\n    \"tests/test_activate.py::test_build_activate_shlvl_1\": 0.00043883954068959895,\n    \"tests/test_activate.py::test_build_activate_shlvl_warn_clobber_vars\": 0.46736645543301475,\n    \"tests/test_activate.py::test_build_deactivate_dont_use_PATH\": 0.20515989869111367,\n    \"tests/test_activate.py::test_build_deactivate_shlvl_1\": 0.3364486723816781,\n    \"tests/test_activate.py::test_build_deactivate_shlvl_2_from_activate\": 0.00040786613710436036,\n    \"tests/test_activate.py::test_build_deactivate_shlvl_2_from_stack\": 0.0004158311843816146,\n    \"tests/test_activate.py::test_build_stack_shlvl_1\": 0.00042708121156024475,\n    \"tests/test_activate.py::test_cmd_exe_basic[False]\": 0.029610790212439026,\n    \"tests/test_activate.py::test_cmd_exe_basic[True]\": 0.03203188282519514,\n    \"tests/test_activate.py::test_csh_basic[False]\": 2.527058280213214,\n    \"tests/test_activate.py::test_csh_basic[True]\": 2.557672596974521,\n    \"tests/test_activate.py::test_default_env\": 0.009892663234453793,\n    \"tests/test_activate.py::test_fish_basic[False]\": 2.5559926452483714,\n    \"tests/test_activate.py::test_fish_basic[True]\": 2.5183382028156145,\n    \"tests/test_activate.py::test_force_uppercase[False]\": 0.08441772129295948,\n    \"tests/test_activate.py::test_force_uppercase[True]\": 0.08327721662514966,\n    \"tests/test_activate.py::test_get_env_vars_big_whitespace\": 0.011028967963277557,\n    \"tests/test_activate.py::test_get_env_vars_empty_file\": 0.010439258640956723,\n    \"tests/test_activate.py::test_get_export_unset_vars[False]\": 0.01865592279616131,\n    \"tests/test_activate.py::test_get_export_unset_vars[True]\": 0.028197589168642994,\n    \"tests/test_activate.py::test_json_basic[False]\": 2.560848716194045,\n    \"tests/test_activate.py::test_json_basic[True]\": 2.529775367262321,\n    \"tests/test_activate.py::test_metavars_force_uppercase[False]\": 0.04770749626986053,\n    \"tests/test_activate.py::test_metavars_force_uppercase[True]\": 0.047171079145087086,\n    \"tests/test_activate.py::test_msys2_shell_line_endings[ash]\": 0.00870422823341417,\n    \"tests/test_activate.py::test_msys2_shell_line_endings[bash]\": 0.008469701404788229,\n    \"tests/test_activate.py::test_msys2_shell_line_endings[dash]\": 0.008521444482677403,\n    \"tests/test_activate.py::test_msys2_shell_line_endings[posix]\": 0.008812352618029339,\n    \"tests/test_activate.py::test_msys2_shell_line_endings[zsh]\": 0.008717546903017995,\n    \"tests/test_activate.py::test_msys2_shell_stdout_reconfiguration\": 0.008547900414639665,\n    \"tests/test_activate.py::test_posix_basic[False]\": 2.5359865109115227,\n    \"tests/test_activate.py::test_posix_basic[True]\": 2.549352071777374,\n    \"tests/test_activate.py::test_powershell_basic[False]\": 0.02679083481848196,\n    \"tests/test_activate.py::test_powershell_basic[True]\": 0.08236773991504759,\n    \"tests/test_activate.py::test_pre_post_command_invoked[activate]\": 0.23431338164151963,\n    \"tests/test_activate.py::test_pre_post_command_invoked[deactivate]\": 0.03320729616405711,\n    \"tests/test_activate.py::test_pre_post_command_invoked[hook]\": 0.01026876978642585,\n    \"tests/test_activate.py::test_pre_post_command_invoked[reactivate]\": 0.028772311776695838,\n    \"tests/test_activate.py::test_pre_post_command_raises[activate]\": 0.23175624820612284,\n    \"tests/test_activate.py::test_pre_post_command_raises[deactivate]\": 0.010048844434006223,\n    \"tests/test_activate.py::test_pre_post_command_raises[hook]\": 0.010243519210402507,\n    \"tests/test_activate.py::test_pre_post_command_raises[reactivate]\": 0.009276235635649006,\n    \"tests/test_activate.py::test_remove_prefix_from_path_1\": 0.19948093635651323,\n    \"tests/test_activate.py::test_remove_prefix_from_path_2\": 0.1757933308054485,\n    \"tests/test_activate.py::test_replace_prefix_in_path_1\": 0.3079221084902503,\n    \"tests/test_activate.py::test_replace_prefix_in_path_2\": 0.28062836785590023,\n    \"tests/test_activate.py::test_xonsh_basic[False]\": 0.024572148770807288,\n    \"tests/test_activate.py::test_xonsh_basic[True]\": 0.024683793595110796,\n    \"tests/test_api.py::test_DepsModifier_contract\": 0.0016694982673441856,\n    \"tests/test_api.py::test_PackageCacheData_contract\": 0.00211626571075281,\n    \"tests/test_api.py::test_PackageCacheData_return_value_contract\": 0.013274101898177484,\n    \"tests/test_api.py::test_PrefixData_contract\": 0.0019136504328709817,\n    \"tests/test_api.py::test_PrefixData_return_value_contract\": 0.09110935639230497,\n    \"tests/test_api.py::test_Solver_inputs_contract\": 0.002419751757366869,\n    \"tests/test_api.py::test_Solver_return_value_contract\": 7.846356383425533,\n    \"tests/test_api.py::test_SubdirData_contract\": 0.001954123156733473,\n    \"tests/test_api.py::test_SubdirData_return_value_contract\": 12.594104501648387,\n    \"tests/test_api.py::test_UpdateModifier_contract\": 0.0015177155568255444,\n    \"tests/test_codesigned.py::test_stub_exe_signatures[shell/cli-32.exe]\": 0.29781072768496736,\n    \"tests/test_codesigned.py::test_stub_exe_signatures[shell/cli-64.exe0]\": 0.2543255216594498,\n    \"tests/test_codesigned.py::test_stub_exe_signatures[shell/cli-64.exe1]\": 0.14700869707915806,\n    \"tests/test_create.py::test_allow_softlinks[classic]\": 0.3482435081565946,\n    \"tests/test_create.py::test_allow_softlinks[libmamba]\": 0.6501621472465435,\n    \"tests/test_create.py::test_channel_usage_replacing_python[classic]\": 179.57146069039788,\n    \"tests/test_create.py::test_channel_usage_replacing_python[libmamba]\": 121.39844495526312,\n    \"tests/test_create.py::test_clone_env_with_conda[classic]\": 109.4312123793256,\n    \"tests/test_create.py::test_clone_env_with_conda[libmamba]\": 39.041994044690625,\n    \"tests/test_create.py::test_clone_offline_simple[classic]\": 0.9486614359603828,\n    \"tests/test_create.py::test_clone_offline_simple[libmamba]\": 0.5889733982283576,\n    \"tests/test_create.py::test_clone_offline_with_untracked[classic]\": 1.1331199522627087,\n    \"tests/test_create.py::test_clone_offline_with_untracked[libmamba]\": 1.0740246816363839,\n    \"tests/test_create.py::test_compile_pyc[classic-False]\": 10.33656895774911,\n    \"tests/test_create.py::test_compile_pyc[classic-True]\": 1.8834150473938047,\n    \"tests/test_create.py::test_compile_pyc[libmamba-False]\": 12.518616630536075,\n    \"tests/test_create.py::test_compile_pyc[libmamba-True]\": 1.143281248695128,\n    \"tests/test_create.py::test_conda_pip_interop_compatible_release_operator[classic]\": 67.8051673446773,\n    \"tests/test_create.py::test_conda_pip_interop_compatible_release_operator[libmamba]\": 15.051001121734792,\n    \"tests/test_create.py::test_conda_pip_interop_conda_editable_package[classic]\": 27.576990853346867,\n    \"tests/test_create.py::test_conda_pip_interop_conda_editable_package[libmamba]\": 38.11300739767375,\n    \"tests/test_create.py::test_conda_pip_interop_pip_clobbers_conda[classic]\": 66.60955546062625,\n    \"tests/test_create.py::test_conda_pip_interop_pip_clobbers_conda[libmamba]\": 22.629840106952,\n    \"tests/test_create.py::test_conda_update_package_is_not_name_only_spec[classic]\": 0.04815446608786938,\n    \"tests/test_create.py::test_conda_update_package_is_not_name_only_spec[libmamba]\": 0.05621246695075089,\n    \"tests/test_create.py::test_conda_update_package_not_installed[classic]\": 0.0631022514151181,\n    \"tests/test_create.py::test_conda_update_package_not_installed[libmamba]\": 0.04319448920229916,\n    \"tests/test_create.py::test_create_default_packages[classic]\": 0.82731991002336,\n    \"tests/test_create.py::test_create_default_packages[libmamba]\": 0.7398881404737246,\n    \"tests/test_create.py::test_create_default_packages_no_default_packages[classic]\": 0.7275458984094579,\n    \"tests/test_create.py::test_create_default_packages_no_default_packages[libmamba]\": 0.6499122746923233,\n    \"tests/test_create.py::test_create_download_only_without_prefix[classic]\": 0.28778184977407034,\n    \"tests/test_create.py::test_create_download_only_without_prefix[libmamba]\": 0.3065275788292338,\n    \"tests/test_create.py::test_create_dry_run[classic]\": 3.172120365223734,\n    \"tests/test_create.py::test_create_dry_run[libmamba]\": 5.174325322797482,\n    \"tests/test_create.py::test_create_dry_run_json[classic]\": 2.699572188794724,\n    \"tests/test_create.py::test_create_dry_run_json[libmamba]\": 2.815345947689684,\n    \"tests/test_create.py::test_create_dry_run_without_prefix[classic]\": 0.32212953318181753,\n    \"tests/test_create.py::test_create_dry_run_without_prefix[libmamba]\": 0.2500589449692126,\n    \"tests/test_create.py::test_create_dry_run_yes_safety[classic]\": 0.037011167456362036,\n    \"tests/test_create.py::test_create_dry_run_yes_safety[libmamba]\": 0.03458926386183206,\n    \"tests/test_create.py::test_create_empty_env[classic]\": 0.49214270701198576,\n    \"tests/test_create.py::test_create_empty_env[libmamba]\": 2.1274457733610452,\n    \"tests/test_create.py::test_create_env_different_platform[classic-cli]\": 0.7355480022779015,\n    \"tests/test_create.py::test_create_env_different_platform[classic-env]\": 0.9188916359894657,\n    \"tests/test_create.py::test_create_env_different_platform[libmamba-cli]\": 0.7644635849128643,\n    \"tests/test_create.py::test_create_env_different_platform[libmamba-env]\": 0.8318765057543712,\n    \"tests/test_create.py::test_create_files_without_name_or_prefix_raises[classic]\": 0.04721314309182516,\n    \"tests/test_create.py::test_create_files_without_name_or_prefix_raises[libmamba]\": 0.04853462086699505,\n    \"tests/test_create.py::test_create_install_update_remove_smoketest[classic]\": 145.94711751899513,\n    \"tests/test_create.py::test_create_install_update_remove_smoketest[libmamba]\": 46.50460586834532,\n    \"tests/test_create.py::test_create_multiple_files_requires_name_or_prefix[classic]\": 0.05868100335161555,\n    \"tests/test_create.py::test_create_multiple_files_requires_name_or_prefix[libmamba]\": 0.03491395119241122,\n    \"tests/test_create.py::test_create_multiple_files_with_cli_prefix[classic]\": 0.8981284496457722,\n    \"tests/test_create.py::test_create_multiple_files_with_cli_prefix[libmamba]\": 0.7480721299638682,\n    \"tests/test_create.py::test_create_name_overrides_file[classic]\": 0.847089038394451,\n    \"tests/test_create.py::test_create_name_overrides_file[libmamba]\": 0.7715593084689664,\n    \"tests/test_create.py::test_create_no_deps_flag[classic]\": 0.3164765746914965,\n    \"tests/test_create.py::test_create_no_deps_flag[libmamba]\": 0.4359934436451578,\n    \"tests/test_create.py::test_create_only_deps_flag[classic]\": 2.0909997334893085,\n    \"tests/test_create.py::test_create_only_deps_flag[libmamba]\": 1.9747494372526244,\n    \"tests/test_create.py::test_create_override_channels_enabled[classic]\": 1.8812293326164695,\n    \"tests/test_create.py::test_create_override_channels_enabled[libmamba]\": 2.5845716397376264,\n    \"tests/test_create.py::test_create_with_clone_and_file_raises_argument_error[classic]\": 0.039262288290602194,\n    \"tests/test_create.py::test_create_with_clone_and_file_raises_argument_error[libmamba]\": 0.03375667731928195,\n    \"tests/test_create.py::test_create_with_clone_and_packages_raises_argument_error[classic]\": 0.03978343123992371,\n    \"tests/test_create.py::test_create_with_clone_and_packages_raises_argument_error[libmamba]\": 0.03741556588158902,\n    \"tests/test_create.py::test_create_with_env_variables_are_set_correctly[classic]\": 0.844546663471393,\n    \"tests/test_create.py::test_create_with_env_variables_are_set_correctly[libmamba]\": 0.7534277187701316,\n    \"tests/test_create.py::test_create_without_prefix_raises_argument_error[classic]\": 0.05904720924170214,\n    \"tests/test_create.py::test_create_without_prefix_raises_argument_error[libmamba]\": 0.034888904079916204,\n    \"tests/test_create.py::test_cross_channel_incompatibility[classic]\": 54.70564177439035,\n    \"tests/test_create.py::test_cross_channel_incompatibility[libmamba]\": 7.579280106867627,\n    \"tests/test_create.py::test_directory_not_a_conda_environment[classic]\": 0.0402667265355648,\n    \"tests/test_create.py::test_directory_not_a_conda_environment[libmamba]\": 0.04030019709661187,\n    \"tests/test_create.py::test_disallowed_packages[classic]\": 0.0004944717496632627,\n    \"tests/test_create.py::test_disallowed_packages[libmamba]\": 0.0004512472946587101,\n    \"tests/test_create.py::test_dont_allow_mixed_file_arguments[classic-create]\": 0.0439120372399096,\n    \"tests/test_create.py::test_dont_allow_mixed_file_arguments[classic-install]\": 0.04503239903474945,\n    \"tests/test_create.py::test_dont_allow_mixed_file_arguments[classic-update]\": 0.046725106041961374,\n    \"tests/test_create.py::test_dont_allow_mixed_file_arguments[libmamba-create]\": 0.040457094296053195,\n    \"tests/test_create.py::test_dont_allow_mixed_file_arguments[libmamba-install]\": 0.040065583520335984,\n    \"tests/test_create.py::test_dont_allow_mixed_file_arguments[libmamba-update]\": 0.037801860128070235,\n    \"tests/test_create.py::test_dont_remove_conda_1[classic]\": 122.78548768883242,\n    \"tests/test_create.py::test_dont_remove_conda_1[libmamba]\": 36.08382032288684,\n    \"tests/test_create.py::test_dont_remove_conda_2[classic]\": 77.14742258103666,\n    \"tests/test_create.py::test_dont_remove_conda_2[libmamba]\": 26.228202030633735,\n    \"tests/test_create.py::test_dont_remove_conda_3[classic]\": 196.00777122001855,\n    \"tests/test_create.py::test_dont_remove_conda_3[libmamba]\": 55.5611368075056,\n    \"tests/test_create.py::test_download_only_flag[classic]\": 9.63382367025662,\n    \"tests/test_create.py::test_download_only_flag[libmamba]\": 4.5589572620431555,\n    \"tests/test_create.py::test_force_remove[classic]\": 15.012577998891176,\n    \"tests/test_create.py::test_force_remove[libmamba]\": 6.107842773096314,\n    \"tests/test_create.py::test_install_bound_virtual_package[classic]\": 0.0004318184450620998,\n    \"tests/test_create.py::test_install_bound_virtual_package[libmamba]\": 0.00041340755976677045,\n    \"tests/test_create.py::test_install_broken_post_install_keeps_existing_folders[classic]\": 2.145081858721348,\n    \"tests/test_create.py::test_install_broken_post_install_keeps_existing_folders[libmamba]\": 2.3437908114206367,\n    \"tests/test_create.py::test_install_force_reinstall_flag[classic]\": 0.530500466142707,\n    \"tests/test_create.py::test_install_force_reinstall_flag[libmamba]\": 0.5525930252715795,\n    \"tests/test_create.py::test_install_multiple_files_with_cli_prefix[classic]\": 1.55585208124021,\n    \"tests/test_create.py::test_install_multiple_files_with_cli_prefix[libmamba]\": 1.3241506451565712,\n    \"tests/test_create.py::test_install_only_deps_flag[classic]\": 0.7886154759195677,\n    \"tests/test_create.py::test_install_only_deps_flag[libmamba]\": 0.7261019330609407,\n    \"tests/test_create.py::test_install_prune_flag[classic]\": 32.58582372876228,\n    \"tests/test_create.py::test_install_prune_flag[libmamba]\": 17.601254469006566,\n    \"tests/test_create.py::test_install_python_and_search[classic]\": 59.129927462081625,\n    \"tests/test_create.py::test_install_python_and_search[libmamba]\": 40.50085452789654,\n    \"tests/test_create.py::test_install_tarball_from_file_based_channel[classic]\": 0.9916498608307438,\n    \"tests/test_create.py::test_install_tarball_from_file_based_channel[libmamba]\": 3.13187512740835,\n    \"tests/test_create.py::test_install_update_deps_flag[classic]\": 1.0140699111817906,\n    \"tests/test_create.py::test_install_update_deps_flag[libmamba]\": 1.1172620598798024,\n    \"tests/test_create.py::test_install_update_deps_only_deps_flags[classic]\": 1.5611395068642275,\n    \"tests/test_create.py::test_install_update_deps_only_deps_flags[libmamba]\": 1.2940800350638004,\n    \"tests/test_create.py::test_install_virtual_packages[classic-__glibc-False]\": 0.5590912264463146,\n    \"tests/test_create.py::test_install_virtual_packages[classic-__linux-False]\": 3.694825498963425,\n    \"tests/test_create.py::test_install_virtual_packages[classic-__osx-False]\": 0.462665520594369,\n    \"tests/test_create.py::test_install_virtual_packages[classic-__unix-False]\": 0.4775308075639355,\n    \"tests/test_create.py::test_install_virtual_packages[classic-__win-True]\": 0.2544775543916597,\n    \"tests/test_create.py::test_install_virtual_packages[libmamba-__glibc-False]\": 1.865072833611762,\n    \"tests/test_create.py::test_install_virtual_packages[libmamba-__linux-False]\": 1.9184011376235162,\n    \"tests/test_create.py::test_install_virtual_packages[libmamba-__osx-False]\": 1.8680740131840614,\n    \"tests/test_create.py::test_install_virtual_packages[libmamba-__unix-False]\": 1.8851869679204254,\n    \"tests/test_create.py::test_install_virtual_packages[libmamba-__win-True]\": 1.822918415100517,\n    \"tests/test_create.py::test_json_create_install_update_remove[classic]\": 17.441867974381907,\n    \"tests/test_create.py::test_json_create_install_update_remove[libmamba]\": 21.83392420233923,\n    \"tests/test_create.py::test_list_with_pip_no_binary[classic]\": 12.009694992031752,\n    \"tests/test_create.py::test_list_with_pip_no_binary[libmamba]\": 16.80137790511876,\n    \"tests/test_create.py::test_list_with_pip_wheel[classic]\": 21.171018410003562,\n    \"tests/test_create.py::test_list_with_pip_wheel[libmamba]\": 29.6519633712499,\n    \"tests/test_create.py::test_menuinst_v2[classic]\": 6.639294339512495,\n    \"tests/test_create.py::test_menuinst_v2[libmamba]\": 7.246372488679223,\n    \"tests/test_create.py::test_mix_explicit_and_packages[classic-create]\": 0.0628521644825444,\n    \"tests/test_create.py::test_mix_explicit_and_packages[classic-install]\": 0.04781712321689465,\n    \"tests/test_create.py::test_mix_explicit_and_packages[libmamba-create]\": 0.058303433023132685,\n    \"tests/test_create.py::test_mix_explicit_and_packages[libmamba-install]\": 0.06208339542780851,\n    \"tests/test_create.py::test_mix_explicit_file_and_packages[classic-create]\": 0.32177405417458343,\n    \"tests/test_create.py::test_mix_explicit_file_and_packages[classic-install]\": 0.34147006935524704,\n    \"tests/test_create.py::test_mix_explicit_file_and_packages[libmamba-create]\": 0.3441505071918168,\n    \"tests/test_create.py::test_mix_explicit_file_and_packages[libmamba-install]\": 0.37449518788987984,\n    \"tests/test_create.py::test_must_provide_args_to_install[classic]\": 0.035348915039283106,\n    \"tests/test_create.py::test_must_provide_args_to_install[libmamba]\": 0.03268449097442414,\n    \"tests/test_create.py::test_neutering_of_historic_specs[classic]\": 0.0004521923774263668,\n    \"tests/test_create.py::test_neutering_of_historic_specs[libmamba]\": 0.0004641044274177605,\n    \"tests/test_create.py::test_no_channels[classic]\": 0.05061263887759357,\n    \"tests/test_create.py::test_no_channels[libmamba]\": 0.04355524515172697,\n    \"tests/test_create.py::test_noarch_generic_package[classic]\": 0.33218544769470626,\n    \"tests/test_create.py::test_noarch_generic_package[libmamba]\": 0.46490833464055537,\n    \"tests/test_create.py::test_noarch_python_package_reinstall_on_pyver_change[classic]\": 21.772748005417583,\n    \"tests/test_create.py::test_noarch_python_package_reinstall_on_pyver_change[libmamba]\": 28.09447087461066,\n    \"tests/test_create.py::test_noarch_python_package_with_entry_points[classic]\": 45.18293746790641,\n    \"tests/test_create.py::test_noarch_python_package_with_entry_points[libmamba]\": 21.44634655409941,\n    \"tests/test_create.py::test_noarch_python_package_without_entry_points[classic]\": 25.65229224021162,\n    \"tests/test_create.py::test_noarch_python_package_without_entry_points[libmamba]\": 17.39065621144729,\n    \"tests/test_create.py::test_nonadmin_file_untouched[classic]\": 1.3941293304345717,\n    \"tests/test_create.py::test_nonadmin_file_untouched[libmamba]\": 1.2975813038718063,\n    \"tests/test_create.py::test_not_writable_env_raises_EnvironmentNotWritableError[classic]\": 0.04993165699181347,\n    \"tests/test_create.py::test_not_writable_env_raises_EnvironmentNotWritableError[libmamba]\": 0.07134921554671345,\n    \"tests/test_create.py::test_offline_with_empty_index_cache[classic]\": 9.560101467000097,\n    \"tests/test_create.py::test_offline_with_empty_index_cache[libmamba]\": 5.699181651413868,\n    \"tests/test_create.py::test_override_channels_disabled[classic]\": 0.11271936809026954,\n    \"tests/test_create.py::test_override_channels_disabled[libmamba]\": 0.10448089434054571,\n    \"tests/test_create.py::test_package_cache_regression[classic]\": 0.4683256024373591,\n    \"tests/test_create.py::test_package_cache_regression[libmamba]\": 0.6154850012901759,\n    \"tests/test_create.py::test_package_optional_pinning[classic]\": 1.3856095368776287,\n    \"tests/test_create.py::test_package_optional_pinning[libmamba]\": 1.283042227672213,\n    \"tests/test_create.py::test_package_pinning[classic]\": 1.7827392258921266,\n    \"tests/test_create.py::test_package_pinning[libmamba]\": 1.9148355543970295,\n    \"tests/test_create.py::test_packages_not_found[classic]\": 0.4580198575143772,\n    \"tests/test_create.py::test_packages_not_found[libmamba]\": 3.7464036921655532,\n    \"tests/test_create.py::test_pinned_override_with_explicit_spec[classic]\": 1.108197013020609,\n    \"tests/test_create.py::test_pinned_override_with_explicit_spec[libmamba]\": 0.47522535038216746,\n    \"tests/test_create.py::test_post_link_run_in_env[classic]\": 0.8480261915502005,\n    \"tests/test_create.py::test_post_link_run_in_env[libmamba]\": 0.818235582195762,\n    \"tests/test_create.py::test_python_site_packages_path[classic]\": 0.0004042856384340721,\n    \"tests/test_create.py::test_python_site_packages_path[libmamba]\": 0.00043268539096137464,\n    \"tests/test_create.py::test_remove_empty_env[classic]\": 0.6320599121198471,\n    \"tests/test_create.py::test_remove_empty_env[libmamba]\": 2.285568473845315,\n    \"tests/test_create.py::test_remove_force_remove_flag[classic]\": 0.0004030550018373978,\n    \"tests/test_create.py::test_remove_force_remove_flag[libmamba]\": 0.00044936920478056065,\n    \"tests/test_create.py::test_remove_ignore_nonenv[classic]\": 0.03524958781192881,\n    \"tests/test_create.py::test_remove_ignore_nonenv[libmamba]\": 0.03298427604050272,\n    \"tests/test_create.py::test_remove_spellcheck[classic]\": 0.7097346993379199,\n    \"tests/test_create.py::test_remove_spellcheck[libmamba]\": 0.7745324891557333,\n    \"tests/test_create.py::test_repodata_v2_base_url[classic]\": 0.9510281244771237,\n    \"tests/test_create.py::test_repodata_v2_base_url[libmamba]\": 0.9087530512696274,\n    \"tests/test_create.py::test_rm_rf[classic]\": 8.185878420541881,\n    \"tests/test_create.py::test_rm_rf[libmamba]\": 10.649979067839423,\n    \"tests/test_create.py::test_run_preserves_arguments[classic]\": 14.591420365675937,\n    \"tests/test_create.py::test_run_preserves_arguments[libmamba]\": 13.75232408529893,\n    \"tests/test_create.py::test_run_script_called[classic]\": 0.0004664356586980326,\n    \"tests/test_create.py::test_run_script_called[libmamba]\": 0.00043751242931764126,\n    \"tests/test_create.py::test_safety_checks_disabled[classic]\": 7.067813000949207,\n    \"tests/test_create.py::test_safety_checks_disabled[libmamba]\": 8.292400963569177,\n    \"tests/test_create.py::test_safety_checks_enabled[classic]\": 4.562461148377677,\n    \"tests/test_create.py::test_safety_checks_enabled[libmamba]\": 5.839723359044737,\n    \"tests/test_create.py::test_safety_checks_warn[classic]\": 10.241402806620885,\n    \"tests/test_create.py::test_safety_checks_warn[libmamba]\": 12.631822938569309,\n    \"tests/test_create.py::test_search_override_channels_enabled[classic]\": 0.9095986356048922,\n    \"tests/test_create.py::test_search_override_channels_enabled[libmamba]\": 2.934383672232539,\n    \"tests/test_create.py::test_shortcut_absent_does_not_barf_on_uninstall[classic]\": 37.71866848491676,\n    \"tests/test_create.py::test_shortcut_absent_does_not_barf_on_uninstall[libmamba]\": 18.971389194927546,\n    \"tests/test_create.py::test_shortcut_absent_when_condarc_set[classic]\": 36.58758218144408,\n    \"tests/test_create.py::test_shortcut_absent_when_condarc_set[libmamba]\": 17.132140386033548,\n    \"tests/test_create.py::test_shortcut_creation_installs_shortcut[classic]\": 36.942263161812946,\n    \"tests/test_create.py::test_shortcut_creation_installs_shortcut[libmamba]\": 19.338419422283906,\n    \"tests/test_create.py::test_strict_channel_priority[classic]\": 0.00043155782698684576,\n    \"tests/test_create.py::test_strict_channel_priority[libmamba]\": 0.0004222115295862874,\n    \"tests/test_create.py::test_strict_resolve_get_reduced_index[classic]\": 74.52360950954736,\n    \"tests/test_create.py::test_strict_resolve_get_reduced_index[libmamba]\": 77.60189333521245,\n    \"tests/test_create.py::test_tarball_install[classic]\": 1.1007145868415424,\n    \"tests/test_create.py::test_tarball_install[libmamba]\": 0.9351641743078398,\n    \"tests/test_create.py::test_tarball_install_and_bad_metadata[classic]\": 1.7197568433060724,\n    \"tests/test_create.py::test_tarball_install_and_bad_metadata[libmamba]\": 2.0612441635799392,\n    \"tests/test_create.py::test_transactional_rollback_simple[classic]\": 1.0277220777363851,\n    \"tests/test_create.py::test_transactional_rollback_simple[libmamba]\": 1.0888334421950592,\n    \"tests/test_create.py::test_transactional_rollback_upgrade_downgrade[classic]\": 1.4064771719841018,\n    \"tests/test_create.py::test_transactional_rollback_upgrade_downgrade[libmamba]\": 1.2858947810673957,\n    \"tests/test_create.py::test_update_all_updates_pip_pkg[classic]\": 17.61629515934802,\n    \"tests/test_create.py::test_update_all_updates_pip_pkg[libmamba]\": 20.544086526161582,\n    \"tests/test_create.py::test_update_deps_flag_absent[classic]\": 1.3837014913232208,\n    \"tests/test_create.py::test_update_deps_flag_absent[libmamba]\": 1.3046441011279808,\n    \"tests/test_create.py::test_update_deps_flag_present[classic]\": 1.438624114275546,\n    \"tests/test_create.py::test_update_deps_flag_present[libmamba]\": 1.3191130233855763,\n    \"tests/test_create.py::test_update_with_pinned_packages[classic]\": 1.0088285677832185,\n    \"tests/test_create.py::test_update_with_pinned_packages[libmamba]\": 0.8486822342972508,\n    \"tests/test_create.py::test_use_index_cache[classic]\": 13.534158315364714,\n    \"tests/test_create.py::test_use_index_cache[libmamba]\": 12.370254022698465,\n    \"tests/test_deferred_deprecations.py::test_auxlib_logz_does_not_pull_in_serialize_json\": 0.4444844142857148,\n    \"tests/test_deferred_deprecations.py::test_common_serialize_does_not_pull_in_json\": 0.43310088214289655,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.auxlib.logz-DumpEncoder]\": 0.001985713095232692,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.auxlib.logz-_DUMPS]\": 0.0019877499999768674,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.auxlib.logz-jsondumps]\": 0.0018190273809371624,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.common.serialize-EntityEncoder]\": 0.0017722261904869658,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.common.serialize-json_load]\": 0.001846604761947815,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.auxlib.logz-DumpEncoder]\": 0.0017090309523999686,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.auxlib.logz-_DUMPS]\": 0.0017714761904915662,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.auxlib.logz-jsondumps]\": 0.0017352702380706087,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.common.serialize-EntityEncoder]\": 0.0017147000000174253,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.common.serialize-json_load]\": 0.0016363059523598622,\n    \"tests/test_deprecations.py::test_action[future]\": 0.0023304058215168097,\n    \"tests/test_deprecations.py::test_action[pending]\": 0.0033877672916964195,\n    \"tests/test_deprecations.py::test_action[remove]\": 0.0021169793907016405,\n    \"tests/test_deprecations.py::test_arguments[deprecated]\": 0.0018266676576712913,\n    \"tests/test_deprecations.py::test_arguments[pending]\": 0.0019340036558706441,\n    \"tests/test_deprecations.py::test_arguments[remove]\": 0.032547218968653154,\n    \"tests/test_deprecations.py::test_class[deprecated]\": 0.0018359850697741652,\n    \"tests/test_deprecations.py::test_class[pending]\": 0.00184541070638584,\n    \"tests/test_deprecations.py::test_class[remove]\": 0.0018515769291346893,\n    \"tests/test_deprecations.py::test_constant[deprecated]\": 0.0025130040862252163,\n    \"tests/test_deprecations.py::test_constant[pending]\": 0.0025054495652948616,\n    \"tests/test_deprecations.py::test_constant[remove]\": 0.002638903542008488,\n    \"tests/test_deprecations.py::test_constant_factory\": 0.002626641071467177,\n    \"tests/test_deprecations.py::test_constant_factory_rejects_non_callable\": 0.0016481005952714764,\n    \"tests/test_deprecations.py::test_constant_multiple_same_module\": 0.0022761711125824824,\n    \"tests/test_deprecations.py::test_constant_rejects_value_and_factory_together\": 0.0016721190476132396,\n    \"tests/test_deprecations.py::test_constant_requires_value_or_factory\": 0.0015516636904872407,\n    \"tests/test_deprecations.py::test_function[deprecated]\": 0.0019195097089018467,\n    \"tests/test_deprecations.py::test_function[pending]\": 0.002011917887453829,\n    \"tests/test_deprecations.py::test_function[remove]\": 0.001801966734137251,\n    \"tests/test_deprecations.py::test_get_module\": 0.00293513845846241,\n    \"tests/test_deprecations.py::test_method[deprecated]\": 0.0018396058052921728,\n    \"tests/test_deprecations.py::test_method[pending]\": 0.0018442797708527893,\n    \"tests/test_deprecations.py::test_method[remove]\": 0.0017852949601486873,\n    \"tests/test_deprecations.py::test_module[deprecated]\": 0.0025365577107019444,\n    \"tests/test_deprecations.py::test_module[pending]\": 0.00274562462354956,\n    \"tests/test_deprecations.py::test_module[remove]\": 0.002621241802803483,\n    \"tests/test_deprecations.py::test_topic[deprecated]\": 0.0017755774448109953,\n    \"tests/test_deprecations.py::test_topic[pending]\": 0.0017716723302007675,\n    \"tests/test_deprecations.py::test_topic[remove]\": 0.0017705743517937651,\n    \"tests/test_deprecations.py::test_version_fallback\": 0.001712985019992022,\n    \"tests/test_exceptions.py::test_BasicClobberError\": 0.007771206504130644,\n    \"tests/test_exceptions.py::test_BinaryPrefixReplacementError\": 0.011906317278030648,\n    \"tests/test_exceptions.py::test_CommandNotFoundError_conda_build\": 0.013627364029748908,\n    \"tests/test_exceptions.py::test_CommandNotFoundError_simple\": 0.031295320951515194,\n    \"tests/test_exceptions.py::test_CondaFileNotFoundError\": 0.011547468173794949,\n    \"tests/test_exceptions.py::test_CondaHTTPError\": 0.013549040136917849,\n    \"tests/test_exceptions.py::test_CondaKeyError\": 0.01113798470313503,\n    \"tests/test_exceptions.py::test_DirectoryNotFoundError\": 0.022273039886360646,\n    \"tests/test_exceptions.py::test_ExceptionHandler_deprecations[error_upload_url-TypeError]\": 0.001839279442171636,\n    \"tests/test_exceptions.py::test_KnownPackageClobberError\": 0.007557038983601802,\n    \"tests/test_exceptions.py::test_MD5MismatchError\": 0.01186341689354213,\n    \"tests/test_exceptions.py::test_PackageNotFoundError\": 0.01127458890276987,\n    \"tests/test_exceptions.py::test_PackagesNotFoundError_use_only_tar_bz2[False]\": 0.006370706626813839,\n    \"tests/test_exceptions.py::test_PackagesNotFoundError_use_only_tar_bz2[True]\": 0.006573232787068662,\n    \"tests/test_exceptions.py::test_SharedLinkPathClobberError\": 0.007017282148023407,\n    \"tests/test_exceptions.py::test_TooManyArgumentsError\": 0.06567324935704902,\n    \"tests/test_exceptions.py::test_UnknownPackageClobberError\": 0.008162878527694586,\n    \"tests/test_exceptions.py::test_http_error_custom_reason_code\": 0.01143328324185338,\n    \"tests/test_exceptions.py::test_http_error_rfc_9457\": 0.011606733414663112,\n    \"tests/test_exceptions.py::test_platform_mismatch_error_is_conda_value_error\": 0.0015177791666379412,\n    \"tests/test_exceptions.py::test_platform_mismatch_error_message[multiple-sources]\": 0.001746872023853522,\n    \"tests/test_exceptions.py::test_platform_mismatch_error_message[single-source]\": 0.0017674750000130266,\n    \"tests/test_exceptions.py::test_print_unexpected_error_message_opt_out_1\": 0.020420303386802504,\n    \"tests/test_exceptions.py::test_print_unexpected_error_message_opt_out_2\": 0.026299110717687504,\n    \"tests/test_exceptions.py::test_print_unexpected_error_message_upload_1\": 0.03164384108314728,\n    \"tests/test_exceptions.py::test_print_unexpected_error_message_upload_2\": 0.01615479704241503,\n    \"tests/test_exceptions.py::test_print_unexpected_error_message_upload_3\": 0.022753492598003407,\n    \"tests/test_exceptions.py::test_proxy_error_custom_message\": 0.0015644345254558858,\n    \"tests/test_exceptions.py::test_proxy_error_default_message\": 0.0016333678606859855,\n    \"tests/test_exports.py::test_deprecations[CondaError-TypeError]\": 0.0017577543415805848,\n    \"tests/test_exports.py::test_deprecations[CondaFileNotFoundError-TypeError]\": 0.0017655188785901741,\n    \"tests/test_exports.py::test_deprecations[CondaHTTPError-TypeError]\": 0.0016819140794181876,\n    \"tests/test_exports.py::test_deprecations[CondaOSError-TypeError]\": 0.0016793089238038024,\n    \"tests/test_exports.py::test_deprecations[DEFAULT_CHANNELS-TypeError]\": 0.0017901044294625671,\n    \"tests/test_exports.py::test_deprecations[DEFAULT_CHANNELS_UNIX-TypeError]\": 0.0018051249848441376,\n    \"tests/test_exports.py::test_deprecations[DEFAULT_CHANNELS_WIN-TypeError]\": 0.0017264997986333893,\n    \"tests/test_exports.py::test_deprecations[EntityEncoder-None]\": 0.001730840560689674,\n    \"tests/test_exports.py::test_deprecations[LinkError-TypeError]\": 0.0017235859524870848,\n    \"tests/test_exports.py::test_deprecations[LockError-TypeError]\": 0.0017934920973491592,\n    \"tests/test_exports.py::test_deprecations[PREFIX_PLACEHOLDER-TypeError]\": 0.0017745401295872461,\n    \"tests/test_exports.py::test_deprecations[PY3-TypeError]\": 0.0017206963062541187,\n    \"tests/test_exports.py::test_deprecations[PaddingError-TypeError]\": 0.0018244866651319566,\n    \"tests/test_exports.py::test_deprecations[PathNotFoundError-TypeError]\": 0.0017643373923063453,\n    \"tests/test_exports.py::test_deprecations[StringIO-None]\": 0.0017542460393965233,\n    \"tests/test_exports.py::test_deprecations[UnsatisfiableError-TypeError]\": 0.001706803113921365,\n    \"tests/test_exports.py::test_deprecations[_PREFIX_PLACEHOLDER-TypeError]\": 0.001696068519097268,\n    \"tests/test_exports.py::test_deprecations[input-OSError]\": 0.001723913834816268,\n    \"tests/test_exports.py::test_deprecations[prefix_placeholder-TypeError]\": 0.0034223631219548107,\n    \"tests/test_exports.py::test_deprecations[string_types-None]\": 0.00165818991136936,\n    \"tests/test_exports.py::test_deprecations[text_type-None]\": 0.0017904580468893513,\n    \"tests/test_features.py::test_install_track_features_downgrade\": 1.8955566957584058,\n    \"tests/test_features.py::test_install_track_features_upgrade\": 2.083636269752632,\n    \"tests/test_features.py::test_remove_features_downgrade\": 0.661836523212637,\n    \"tests/test_features.py::test_remove_features_upgrade\": 0.9851079496290821,\n    \"tests/test_fetch.py::test_checksum_checks_bytes[bad-type]\": 0.02493406601795752,\n    \"tests/test_fetch.py::test_checksum_checks_bytes[gibberish]\": 0.026601665510825052,\n    \"tests/test_fetch.py::test_checksum_checks_bytes[original]\": 0.02955354736875819,\n    \"tests/test_fetch.py::test_checksum_checks_bytes[upper]\": 0.024588441127869093,\n    \"tests/test_fetch.py::test_download_connectionerror\": 0.20535382767522414,\n    \"tests/test_fetch.py::test_download_http_errors\": 0.007136791858035103,\n    \"tests/test_fetch.py::test_download_httperror\": 0.013453581404124861,\n    \"tests/test_fetch.py::test_download_size_none\": 0.007694098914806232,\n    \"tests/test_fetch.py::test_download_text\": 0.006411037921122335,\n    \"tests/test_fetch.py::test_download_when_ranges_not_supported\": 0.02948449413463227,\n    \"tests/test_fetch.py::test_fetchrepodate_connectionerror\": 0.0599995084391649,\n    \"tests/test_fetch.py::test_resume_bad_partial\": 0.013530729842073463,\n    \"tests/test_fetch.py::test_resume_download\": 0.03827693040869739,\n    \"tests/test_fetch.py::test_resume_partial\": 0.10665467582302858,\n    \"tests/test_fetch.py::test_tmpDownload\": 0.1298412575931124,\n    \"tests/test_history.py::test_calls_update_on_exit\": 0.006312623428485913,\n    \"tests/test_history.py::test_comment_parsing[conda 4.5.1]\": 0.001645464648537249,\n    \"tests/test_history.py::test_comment_parsing[conda 4.5.1dev0]\": 0.0016401782162014991,\n    \"tests/test_history.py::test_comment_parsing[conda 4.5.1rc1]\": 0.0016195962376578707,\n    \"tests/test_history.py::test_comment_parsing[post 4.4, install spec]\": 0.0017608056379454678,\n    \"tests/test_history.py::test_comment_parsing[post 4.4, update spec]\": 0.0016779222146642524,\n    \"tests/test_history.py::test_comment_parsing[pre 4.4, install many specs]\": 0.0031332201721242523,\n    \"tests/test_history.py::test_comment_parsing[pre 4.4, install one spec]\": 0.007858195192422743,\n    \"tests/test_history.py::test_comment_parsing[pre 4.4, install two specs]\": 0.006850579395010684,\n    \"tests/test_history.py::test_comment_parsing[pre 4.4, update one spec]\": 0.0016882451429260086,\n    \"tests/test_history.py::test_comment_parsing[pre 4.4, update two specs]\": 0.0016734906097026648,\n    \"tests/test_history.py::test_empty_history_check_on_empty_env\": 0.006197913927397257,\n    \"tests/test_history.py::test_history_malformed\": 0.005237479284105042,\n    \"tests/test_history.py::test_parse_on_empty_env\": 0.0062703461771221975,\n    \"tests/test_history.py::test_returns_history_object_as_context_object\": 0.0050165184121936926,\n    \"tests/test_history.py::test_user_requests[0]\": 0.002243956416680701,\n    \"tests/test_history.py::test_user_requests[1]\": 0.0022577845107304463,\n    \"tests/test_history.py::test_user_requests[2]\": 0.0022248483538071496,\n    \"tests/test_history.py::test_user_requests[3]\": 0.0022061546748112382,\n    \"tests/test_history.py::test_user_requests[4]\": 0.0020908377087306574,\n    \"tests/test_history.py::test_user_requests[5]\": 0.0021695262752585587,\n    \"tests/test_history.py::test_works_as_context_manager\": 0.004091084237169554,\n    \"tests/test_install.py::test_binary[linux-64]\": 0.006407781312851252,\n    \"tests/test_install.py::test_binary[noarch]\": 0.005029009745952638,\n    \"tests/test_install.py::test_binary[win-64]\": 0.004932464817833623,\n    \"tests/test_install.py::test_default_text\": 0.005033832750510543,\n    \"tests/test_install.py::test_ends_with_newl[linux-64]\": 0.0018815863667560025,\n    \"tests/test_install.py::test_ends_with_newl[noarch]\": 0.0019025070898813375,\n    \"tests/test_install.py::test_ends_with_newl[win-64]\": 0.0020109602599539264,\n    \"tests/test_install.py::test_long_default_text\": 0.00038796923129782215,\n    \"tests/test_install.py::test_multiple[linux-64]\": 0.0017720518875849287,\n    \"tests/test_install.py::test_multiple[noarch]\": 0.0019344612151042883,\n    \"tests/test_install.py::test_multiple[win-64]\": 0.002076728723952221,\n    \"tests/test_install.py::test_no_extra[linux-64]\": 0.004147513667902195,\n    \"tests/test_install.py::test_no_extra[noarch]\": 0.001956564522018347,\n    \"tests/test_install.py::test_no_extra[win-64]\": 0.0019390981669044503,\n    \"tests/test_install.py::test_read_no_link\": 0.004850535607891854,\n    \"tests/test_install.py::test_shorter[linux-64]\": 0.0022541627772643784,\n    \"tests/test_install.py::test_shorter[noarch]\": 0.0022537518638227083,\n    \"tests/test_install.py::test_shorter[win-64]\": 0.0019134588781929956,\n    \"tests/test_install.py::test_simple[linux-64]\": 0.005355091283467981,\n    \"tests/test_install.py::test_simple[noarch]\": 0.0019833430603747914,\n    \"tests/test_install.py::test_simple[win-64]\": 0.0020040339738698993,\n    \"tests/test_install.py::test_spaces[linux-64]\": 0.0018341641798061132,\n    \"tests/test_install.py::test_spaces[noarch]\": 0.0018648627205578047,\n    \"tests/test_install.py::test_spaces[win-64]\": 0.0019912441224810627,\n    \"tests/test_install.py::test_too_long[linux-64]\": 0.0021690534208927727,\n    \"tests/test_install.py::test_too_long[noarch]\": 0.0017592069172095177,\n    \"tests/test_install.py::test_too_long[win-64]\": 0.0017197420929820058,\n    \"tests/test_install.py::test_trash_outside_prefix\": 0.028890898759682475,\n    \"tests/test_install.py::test_two[linux-64]\": 0.0015951530865546085,\n    \"tests/test_install.py::test_two[noarch]\": 0.001948402096039426,\n    \"tests/test_install.py::test_two[win-64]\": 0.0018694653015179474,\n    \"tests/test_install.py::test_windows_entry_point\": 1.4549905836173775,\n    \"tests/test_install.py::test_yield_lines\": 0.004287322803330327,\n    \"tests/test_instructions.py::test_check_files_in_tarball_files_exist\": 0.00437986085094021,\n    \"tests/test_instructions.py::test_check_files_in_tarball_files_not_exist\": 0.0025461757006154766,\n    \"tests/test_instructions.py::test_expected_operation_order\": 0.0015501993778246292,\n    \"tests/test_link_order.py::test_link_order_post_link_actions\": 0.8574631598815384,\n    \"tests/test_link_order.py::test_link_order_post_link_depend\": 0.7174985659409109,\n    \"tests/test_misc.py::test_Utf8NamedTemporaryFile\": 0.002112328314753306,\n    \"tests/test_misc.py::test_cache_fn_url\": 0.0015518192389540337,\n    \"tests/test_misc.py::test_deprecations[url_pat-TypeError]\": 0.0020406596764286095,\n    \"tests/test_misc.py::test_explicit_missing_cache_entries\": 1.2109323574109927,\n    \"tests/test_misc.py::test_explicit_no_cache\": 0.0054009588320436406,\n    \"tests/test_misc.py::test_explicit_parser[../doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03-ParseError]\": 0.0019822515215959795,\n    \"tests/test_misc.py::test_explicit_parser[../doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03c4034246de428582e-None]\": 0.0028856108805669052,\n    \"tests/test_misc.py::test_explicit_parser[doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03c4034246de428582e-None]\": 0.0028822234375576773,\n    \"tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-2707f68aada792d1cf3a44c51d55b38b0cd65b0c192d2a5f9ef0550dc149a7d3-None]\": 0.0029433320730622345,\n    \"tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-md5:5e9e17751f19d03c4034246de428582e-ParseError]\": 0.001871542469462788,\n    \"tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-sha123:2707f68aada792d1cf3a44c51d55b38b0cd65b0c192d2a5f9ef0550dc149a7d3-ParseError]\": 0.0019193741655610368,\n    \"tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-sha256:2707f68aada792d1cf3a44c51d55b38b0cd65b0c192d2a5f9ef0550dc149a7d3-None]\": 0.0029002367252363983,\n    \"tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03c4034246de428582e-None]\": 0.0029656516591344915,\n    \"tests/test_misc.py::test_url_pat_1\": 0.0015225383718263698,\n    \"tests/test_misc.py::test_url_pat_2\": 0.0015027605633319567,\n    \"tests/test_misc.py::test_url_pat_3\": 0.0015314576194833526,\n    \"tests/test_misc.py::test_walk_prefix\": 0.021960459197964428,\n    \"tests/test_priority.py::test_reorder_channel_priority[classic-with pinned_package]\": 1.6485213324831793,\n    \"tests/test_priority.py::test_reorder_channel_priority[classic-without pinned_package]\": 1.5673976261632367,\n    \"tests/test_priority.py::test_reorder_channel_priority[libmamba-with pinned_package]\": 2.150668724390094,\n    \"tests/test_priority.py::test_reorder_channel_priority[libmamba-without pinned_package]\": 2.8220419821131246,\n    \"tests/test_reporters.py::test_confirm_yn_always_yes\": 0.006054250118761058,\n    \"tests/test_reporters.py::test_confirm_yn_dry_run_exit\": 0.00617057462130478,\n    \"tests/test_reporters.py::test_confirm_yn_no\": 0.006549525987677111,\n    \"tests/test_reporters.py::test_confirm_yn_yes\": 0.009831845186721056,\n    \"tests/test_reporters.py::test_get_progress_bar\": 0.0022553006411520264,\n    \"tests/test_reporters.py::test_get_progress_bar_context_managers\": 0.001614746753560146,\n    \"tests/test_reporters.py::test_render\": 0.003327152910701223,\n    \"tests/test_resolve.py::test_Resolve_make_channel_priorities\": 0.0023778020939496133,\n    \"tests/test_resolve.py::test_specs_by_name_copy_is_independent\": 0.0016856827973524622,\n    \"tests/test_solvers.py::TestClassicSolver::test_accelerate\": 1.903554094523897,\n    \"tests/test_solvers.py::TestClassicSolver::test_anaconda_nomkl\": 1.0470012301374614,\n    \"tests/test_solvers.py::TestClassicSolver::test_arch_preferred_over_noarch_when_otherwise_equal\": 0.2296004357210037,\n    \"tests/test_solvers.py::TestClassicSolver::test_channel_priority_1\": 0.009689783428993407,\n    \"tests/test_solvers.py::TestClassicSolver::test_circular_dependencies\": 0.7615609278377204,\n    \"tests/test_solvers.py::TestClassicSolver::test_empty\": 0.7460954200395556,\n    \"tests/test_solvers.py::TestClassicSolver::test_get_dists\": 1.1526858280486172,\n    \"tests/test_solvers.py::TestClassicSolver::test_get_reduced_index_broadening_preferred_solution\": 0.2150101310443196,\n    \"tests/test_solvers.py::TestClassicSolver::test_get_reduced_index_broadening_with_unsatisfiable_early_dep\": 0.22132208180420532,\n    \"tests/test_solvers.py::TestClassicSolver::test_install_package_with_feature\": 0.32737150715861674,\n    \"tests/test_solvers.py::TestClassicSolver::test_iopro_mkl\": 1.189881061680327,\n    \"tests/test_solvers.py::TestClassicSolver::test_iopro_nomkl\": 0.7412254573872928,\n    \"tests/test_solvers.py::TestClassicSolver::test_irrational_version\": 0.267712454621957,\n    \"tests/test_solvers.py::TestClassicSolver::test_mkl\": 1.3508746843040758,\n    \"tests/test_solvers.py::TestClassicSolver::test_no_features\": 1.9919547763467969,\n    \"tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_build_greater\": 0.2126511562817464,\n    \"tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_build_greater_dep\": 0.21412918413479418,\n    \"tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_version_greater\": 0.21336948924803917,\n    \"tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_version_greater_dep\": 0.216712909509828,\n    \"tests/test_solvers.py::TestClassicSolver::test_nonexistent\": 0.44066075958294354,\n    \"tests/test_solvers.py::TestClassicSolver::test_nonexistent_deps\": 2.8925607667548077,\n    \"tests/test_solvers.py::TestClassicSolver::test_pseudo_boolean\": 1.2656131369422547,\n    \"tests/test_solvers.py::TestClassicSolver::test_remove\": 0.9896828112735098,\n    \"tests/test_solvers.py::TestClassicSolver::test_scipy_mkl\": 0.6087072218355158,\n    \"tests/test_solvers.py::TestClassicSolver::test_surplus_features_1\": 0.2138481380552849,\n    \"tests/test_solvers.py::TestClassicSolver::test_surplus_features_2\": 0.2239357836935148,\n    \"tests/test_solvers.py::TestClassicSolver::test_timestamps_and_deps\": 1.7246722568874318,\n    \"tests/test_solvers.py::TestClassicSolver::test_unintentional_feature_downgrade\": 0.7780731007242828,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_any_two_not_three\": 0.8592498976858852,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_chain\": 0.21991810264088887,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_channel_priority\": 0.46514851310767363,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_expand_single\": 0.22267651446382516,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_from_r1\": 2.1321218858104896,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_missing_dep\": 0.21374114331017555,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_1\": 0.21510866785864097,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_2\": 0.22029786684416713,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_3\": 0.21510694884779175,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_4\": 0.21633766853625394,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_simple\": 0.21455069443001668,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_accelerate\": 0.0013916750829820544,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_anaconda_nomkl\": 0.2946747192551424,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_arch_preferred_over_noarch_when_otherwise_equal\": 0.2577826328466928,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_channel_priority_1\": 0.008909430322175248,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_circular_dependencies\": 0.7371200133681524,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_empty\": 0.24891395470114727,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_get_dists\": 0.24986124170940077,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_get_reduced_index_broadening_preferred_solution\": 0.22237791632798046,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_get_reduced_index_broadening_with_unsatisfiable_early_dep\": 0.21690525570805702,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_install_package_with_feature\": 0.24877745593667913,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_iopro_mkl\": 0.0016221667199066117,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_iopro_nomkl\": 0.0015269614306144016,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_irrational_version\": 0.24672878602997558,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_mkl\": 0.0015007615141971443,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_no_features\": 0.0016025790849684765,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_build_greater\": 0.21762601173560062,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_build_greater_dep\": 0.21650489120575217,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_version_greater\": 0.21626565958703595,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_version_greater_dep\": 0.2200266429323679,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_nonexistent\": 0.4347562488413042,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_nonexistent_deps\": 2.756748555745074,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_pseudo_boolean\": 0.0014888776273797456,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_remove\": 0.0016844524073378194,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_scipy_mkl\": 0.0014251162327625106,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_surplus_features_1\": 0.0016032454395477666,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_surplus_features_2\": 0.0014683435495814975,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_timestamps_and_deps\": 1.7100154492668826,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unintentional_feature_downgrade\": 0.0015964906640972283,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_any_two_not_three\": 0.8523178418764462,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_chain\": 0.2179668493631822,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_channel_priority\": 0.44908621547109584,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_expand_single\": 0.22514430850502468,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_from_r1\": 0.7354675122071309,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_missing_dep\": 0.21868349085795818,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_1\": 0.22386795657870184,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_2\": 0.21777050069284348,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_3\": 0.23064400697420123,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_4\": 0.22451023670811168,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_simple\": 0.21809358267632445,\n    \"tests/test_utils.py::test_ensure_dir\": 0.010115338662044502,\n    \"tests/test_utils.py::test_ensure_dir_errors\": 0.005695686016115806,\n    \"tests/test_utils.py::test_quote_for_shell[!-!]\": 0.001656666752377032,\n    \"tests/test_utils.py::test_quote_for_shell[\\\"-\\\"\\\"\\\"\\\"]\": 0.0016060271458248024,\n    \"tests/test_utils.py::test_quote_for_shell[#-#]\": 0.0015956752779945648,\n    \"tests/test_utils.py::test_quote_for_shell[$-$]\": 0.0015680417925681266,\n    \"tests/test_utils.py::test_quote_for_shell[%-\\\"%%\\\"]\": 0.0016610094033320862,\n    \"tests/test_utils.py::test_quote_for_shell[&-\\\"&\\\"]\": 0.0016079799939259626,\n    \"tests/test_utils.py::test_quote_for_shell['-']\": 0.0015872842348861257,\n    \"tests/test_utils.py::test_quote_for_shell[(-(]\": 0.0016312292727956588,\n    \"tests/test_utils.py::test_quote_for_shell[)-)]\": 0.0016334702193680608,\n    \"tests/test_utils.py::test_quote_for_shell[*-*]\": 0.0015840761377555394,\n    \"tests/test_utils.py::test_quote_for_shell[+-+]\": 0.0016346022987265834,\n    \"tests/test_utils.py::test_quote_for_shell[,-,]\": 0.0015730535097279238,\n    \"tests/test_utils.py::test_quote_for_shell[---]\": 0.0016062781913980856,\n    \"tests/test_utils.py::test_quote_for_shell[.-.]\": 0.0016218125857262182,\n    \"tests/test_utils.py::test_quote_for_shell[/-/]\": 0.0016397037563203058,\n    \"tests/test_utils.py::test_quote_for_shell[1>/dev/null-\\\"1>/dev/null\\\"]\": 0.0016127781542716938,\n    \"tests/test_utils.py::test_quote_for_shell[1>NUL-\\\"1>NUL\\\"]\": 0.0016891044411407948,\n    \"tests/test_utils.py::test_quote_for_shell[2>&1-\\\"2>&1\\\"]\": 0.0016034836076031862,\n    \"tests/test_utils.py::test_quote_for_shell[2>/dev/null-\\\"2>/dev/null\\\"]\": 0.0016246253488996206,\n    \"tests/test_utils.py::test_quote_for_shell[2>NUL-\\\"2>NUL\\\"]\": 0.0016199922221955452,\n    \"tests/test_utils.py::test_quote_for_shell[:-:]\": 0.00155531842624978,\n    \"tests/test_utils.py::test_quote_for_shell[;-;]\": 0.0015881716680169508,\n    \"tests/test_utils.py::test_quote_for_shell[<-\\\"<\\\"]\": 0.0016465967447198793,\n    \"tests/test_utils.py::test_quote_for_shell[=-=]\": 0.0016405796588425004,\n    \"tests/test_utils.py::test_quote_for_shell[>-\\\">\\\"]\": 0.0016009066070187437,\n    \"tests/test_utils.py::test_quote_for_shell[>/dev/null-\\\">/dev/null\\\"]\": 0.0017037653977853924,\n    \"tests/test_utils.py::test_quote_for_shell[>NUL-\\\">NUL\\\"]\": 0.001624519567576616,\n    \"tests/test_utils.py::test_quote_for_shell[?-?]\": 0.0016138654602200124,\n    \"tests/test_utils.py::test_quote_for_shell[@-@]\": 0.0016339006723396694,\n    \"tests/test_utils.py::test_quote_for_shell[C:\\\\\\\\temp\\\\\\\\some ^%file^% > nul-\\\"C:\\\\\\\\temp\\\\\\\\some ^%%file^%% > nul\\\"]\": 0.0016353484524878304,\n    \"tests/test_utils.py::test_quote_for_shell[None-\\\"\\\"]\": 0.0016146133531703731,\n    \"tests/test_utils.py::test_quote_for_shell[[-[]\": 0.0016353314126086873,\n    \"tests/test_utils.py::test_quote_for_shell[\\\\\\\\-\\\\\\\\]\": 0.0016541113415053112,\n    \"tests/test_utils.py::test_quote_for_shell[]-]]\": 0.0016509822069039652,\n    \"tests/test_utils.py::test_quote_for_shell[^-\\\"^\\\"]\": 0.0016232436025561841,\n    \"tests/test_utils.py::test_quote_for_shell[arg1 and 2-\\\"arg1 and 2\\\"]\": 0.0017400721194435619,\n    \"tests/test_utils.py::test_quote_for_shell[arg1-arg1]\": 0.0018087881139659645,\n    \"tests/test_utils.py::test_quote_for_shell[arg1\\\\nand\\\\n2-\\\"arg1\\\\nand\\\\n2\\\"]\": 0.0016679734021393345,\n    \"tests/test_utils.py::test_quote_for_shell[malicious argument\\\\\\\\\\\"&whoami-\\\"malicious argument\\\\\\\\\\\"\\\"&whoami\\\"]\": 0.0016239503149412305,\n    \"tests/test_utils.py::test_quote_for_shell[numpy<1.22-\\\"numpy<1.22\\\"]\": 0.0016563192911647746,\n    \"tests/test_utils.py::test_quote_for_shell[numpy>=1.0-\\\"numpy>=1.0\\\"]\": 0.0017303157950781516,\n    \"tests/test_utils.py::test_quote_for_shell[one|two-\\\"one|two\\\"]\": 0.0016172824726147443,\n    \"tests/test_utils.py::test_quote_for_shell[{-{]\": 0.0016645509497609952,\n    \"tests/test_utils.py::test_quote_for_shell[|-\\\"|\\\"]\": 0.0016120300194441507,\n    \"tests/test_utils.py::test_quote_for_shell[}-}]\": 0.0015968457592204363,\n    \"tests/test_utils.py::test_quote_for_shell[~-~]\": 0.0015991678505405183,\n    \"tests/testing/test_fixtures.py::test_conda_cli\": 0.04461107989556348,\n    \"tests/testing/test_fixtures.py::test_empty_env\": 0.005128171101890364,\n    \"tests/testing/test_fixtures.py::test_env\": 0.15721565378515062,\n    \"tests/testing/test_fixtures.py::test_monkeypatch\": 0.006146889855716153,\n    \"tests/testing/test_fixtures.py::test_path_factory\": 0.004012850718941502,\n    \"tests/testing/test_fixtures.py::test_path_factory_mutual_exclusivity\": 0.003919741468844826,\n    \"tests/testing/test_fixtures.py::test_path_factory_name_mode\": 0.004048635554629645,\n    \"tests/testing/test_fixtures.py::test_path_factory_parts_mode[all parts]\": 0.00422903694841771,\n    \"tests/testing/test_fixtures.py::test_path_factory_parts_mode[infix only]\": 0.004027076592477306,\n    \"tests/testing/test_fixtures.py::test_path_factory_parts_mode[no parts]\": 0.0043763441134775545,\n    \"tests/testing/test_fixtures.py::test_path_factory_parts_mode[prefix only]\": 0.004083459326188267,\n    \"tests/testing/test_fixtures.py::test_path_factory_parts_mode[suffix only]\": 0.004023430131014948,\n    \"tests/testing/test_fixtures.py::test_path_factory_uniqueness\": 0.00390514780776511,\n    \"tests/testing/test_fixtures.py::test_session_conda_cli\": 0.06242434386986165,\n    \"tests/testing/test_fixtures.py::test_session_tmp_env\": 0.035879040681181036,\n    \"tests/testing/test_fixtures.py::test_tmp_channel\": 2.007042151235991,\n    \"tests/testing/test_fixtures.py::test_tmp_env\": 0.05822465509364867,\n    \"tests/testing/test_fixtures.py::test_tmp_env_mutual_exclusivity\": 0.004486183554472577,\n    \"tests/testing/test_fixtures.py::test_tmp_env_path_parts[all parts]\": 0.005529278726971777,\n    \"tests/testing/test_fixtures.py::test_tmp_env_path_parts[infix only]\": 0.0053271391458203895,\n    \"tests/testing/test_fixtures.py::test_tmp_env_path_parts[name only]\": 0.005376273251041051,\n    \"tests/testing/test_fixtures.py::test_tmp_env_path_parts[no parts]\": 0.005478114409675972,\n    \"tests/testing/test_fixtures.py::test_tmp_env_path_parts[prefix only]\": 0.005577080914597722,\n    \"tests/testing/test_fixtures.py::test_tmp_env_path_parts[suffix only]\": 0.007289177730351245,\n    \"tests/testing/test_fixtures.py::test_tmp_envs_dir\": 0.008581952814863021,\n    \"tests/testing/test_fixtures.py::test_tmp_pkgs_dir\": 0.005195960047959714,\n    \"tests/testing/test_http_test_server.py::test_dynamic_content_pattern\": 0.5119969560258663,\n    \"tests/testing/test_http_test_server.py::test_http_server_404_missing_file[tests/env/support]\": 0.5120789083095345,\n    \"tests/testing/test_http_test_server.py::test_http_server_directory_attribute\": 0.5147891346391638,\n    \"tests/testing/test_http_test_server.py::test_http_server_fixture_attributes[tests/env/support]\": 0.5151769293077755,\n    \"tests/testing/test_http_test_server.py::test_http_server_get_url_method[tests/env/support]\": 0.509109939950053,\n    \"tests/testing/test_http_test_server.py::test_http_server_multiple_directories[tests/data]\": 0.7875329771543123,\n    \"tests/testing/test_http_test_server.py::test_http_server_multiple_directories[tests/env/support]\": 0.5082235961623637,\n    \"tests/testing/test_http_test_server.py::test_http_server_serves_files[tests/env/support]\": 0.5166075058701791,\n    \"tests/testing/test_http_test_server.py::test_http_server_subdirectories[tests/env/support]\": 0.5119531342502202,\n    \"tests/testing/test_http_test_server.py::test_http_server_without_marker\": 0.512768349672609,\n    \"tests/testing/test_http_test_server.py::test_marker_validation_directory_type\": 0.17464007338148466\n}\n"
  },
  {
    "path": "durations/macOS.json",
    "content": "{\n    \"tests/base/test_constants.py::test_ChannelPriority\": 0.004216883589334565,\n    \"tests/base/test_constants.py::test_deprecations[CONDA_PACKAGE_EXTENSIONS-TypeError]\": 0.004723558334219607,\n    \"tests/base/test_constants.py::test_deprecations[CONDA_PACKAGE_PARTS-TypeError]\": 0.0031918199086949208,\n    \"tests/base/test_constants.py::test_deprecations[ERROR_UPLOAD_URL-TypeError]\": 0.004060530984756273,\n    \"tests/base/test_constants.py::test_null_is_falsey\": 0.0038878073375711564,\n    \"tests/base/test_context.py::test_aggressive_update_packages\": 0.01930340924086498,\n    \"tests/base/test_context.py::test_category_map_covers_all_parameters\": 0.027227301481424868,\n    \"tests/base/test_context.py::test_category_map_is_class_constant\": 0.002273740177760273,\n    \"tests/base/test_context.py::test_channel_alias_validation[bad_value-channel_alias value 'bad_value' must have scheme/protocol.]\": 0.003594115197972685,\n    \"tests/base/test_context.py::test_channel_alias_validation[https://example.com/-True]\": 0.0037815655297883982,\n    \"tests/base/test_context.py::test_channel_priority\": 0.03140256830213121,\n    \"tests/base/test_context.py::test_channel_settings\": 0.03304383168140191,\n    \"tests/base/test_context.py::test_channels_defaults_condarc\": 0.03620498585317316,\n    \"tests/base/test_context.py::test_channels_empty\": 0.037080393636827774,\n    \"tests/base/test_context.py::test_check_allowlist\": 0.02214968462956203,\n    \"tests/base/test_context.py::test_check_allowlist_and_denylist\": 0.020872265702408604,\n    \"tests/base/test_context.py::test_check_denylist\": 0.021467475286737196,\n    \"tests/base/test_context.py::test_client_ssl_cert\": 0.05952056465678931,\n    \"tests/base/test_context.py::test_clobber_enum[clobber]\": 0.015015964452917953,\n    \"tests/base/test_context.py::test_clobber_enum[prevent]\": 0.017469474889238334,\n    \"tests/base/test_context.py::test_clobber_enum[warn]\": 0.012765900643005729,\n    \"tests/base/test_context.py::test_conda_bld_path\": 0.022032278730435954,\n    \"tests/base/test_context.py::test_conda_build_root_dir\": 0.03376980996360278,\n    \"tests/base/test_context.py::test_conda_envs_path\": 0.06212473106595774,\n    \"tests/base/test_context.py::test_context_override_with_reset\": 0.012669620996943595,\n    \"tests/base/test_context.py::test_context_parameter_map\": 0.03282161425911004,\n    \"tests/base/test_context.py::test_context_parameters_have_descriptions\": 0.09047837598730729,\n    \"tests/base/test_context.py::test_context_stack_doubles_on_overflow[1]\": 0.003066208772467681,\n    \"tests/base/test_context.py::test_context_stack_doubles_on_overflow[2]\": 0.0028401357563723195,\n    \"tests/base/test_context.py::test_context_stack_doubles_on_overflow[3]\": 0.0025039054755396357,\n    \"tests/base/test_context.py::test_context_stack_doubles_on_overflow[4]\": 0.0026965953318963585,\n    \"tests/base/test_context.py::test_context_stack_push_pop_roundtrip\": 0.012293000774894373,\n    \"tests/base/test_context.py::test_context_stack_starts_with_single_slot\": 0.002562482942257197,\n    \"tests/base/test_context.py::test_create_default_packages[context_packages0-expected_packages0]\": 0.013649267797008724,\n    \"tests/base/test_context.py::test_create_default_packages[context_packages1-expected_packages1]\": 0.014522281333119502,\n    \"tests/base/test_context.py::test_create_default_packages[context_packages2-expected_packages2]\": 0.014286541804744205,\n    \"tests/base/test_context.py::test_create_default_packages_will_warn_for_explicit_packages\": 0.019240347679401932,\n    \"tests/base/test_context.py::test_custom_multichannels\": 0.03654063576416327,\n    \"tests/base/test_context.py::test_custom_multichannels_overrides_default_channels\": 0.05880720508579446,\n    \"tests/base/test_context.py::test_default_activation_prefix\": 0.037441175338434635,\n    \"tests/base/test_context.py::test_default_python_validation[-True]\": 0.003482500702629616,\n    \"tests/base/test_context.py::test_default_python_validation[3.12-True]\": 0.003990832081896736,\n    \"tests/base/test_context.py::test_default_python_validation[4.12-default_python value '4.12' not of the form '[23].[0-9][0-9]?' or '']\": 0.002815436876073722,\n    \"tests/base/test_context.py::test_default_python_validation[not a number-default_python value 'not a number' not of the form '[23].[0-9][0-9]?' or '']\": 0.003548168213357671,\n    \"tests/base/test_context.py::test_default_target_is_root_prefix\": 0.034189925388076275,\n    \"tests/base/test_context.py::test_deprecations[error_upload_url-TypeError]\": 0.003020293427921399,\n    \"tests/base/test_context.py::test_expandvars\": 0.12366242249402754,\n    \"tests/base/test_context.py::test_export_platforms\": 0.048637186813950156,\n    \"tests/base/test_context.py::test_local_build_root_custom_rc\": 0.07027815284893531,\n    \"tests/base/test_context.py::test_local_build_root_default_rc\": 0.014156849458435943,\n    \"tests/base/test_context.py::test_migrated_custom_channels\": 0.03903699931724073,\n    \"tests/base/test_context.py::test_native_subdir[darwin-arm64-osx-arm64]\": 0.0036177525859652105,\n    \"tests/base/test_context.py::test_native_subdir[darwin-x86_64-osx-64]\": 0.003589902573614288,\n    \"tests/base/test_context.py::test_native_subdir[linux-aarch64-linux-aarch64]\": 0.003429730154267836,\n    \"tests/base/test_context.py::test_native_subdir[linux-ppc64le-linux-ppc64le]\": 0.003359729949012515,\n    \"tests/base/test_context.py::test_native_subdir[linux-riscv64-linux-riscv64]\": 0.003435599885430065,\n    \"tests/base/test_context.py::test_native_subdir[linux-s390x-linux-s390x]\": 0.003246449500513311,\n    \"tests/base/test_context.py::test_native_subdir[linux-x86_64-linux-64]\": 0.004236265584893431,\n    \"tests/base/test_context.py::test_native_subdir[win32-AMD64-win-64]\": 0.0037083955926628057,\n    \"tests/base/test_context.py::test_native_subdir[win32-ARM64-win-arm64]\": 0.0037248480344342252,\n    \"tests/base/test_context.py::test_old_channel_alias\": 0.04486644604076936,\n    \"tests/base/test_context.py::test_proxy_servers\": 0.03899749569798917,\n    \"tests/base/test_context.py::test_signing_metadata_url_base\": 0.0477710927926795,\n    \"tests/base/test_context.py::test_signing_metadata_url_base_empty_default_channels\": 0.046870779521812594,\n    \"tests/base/test_context.py::test_specify_channels_cli_condarc\": 0.038395435047443346,\n    \"tests/base/test_context.py::test_specify_channels_cli_not_adding_defaults_no_condarc\": 0.040348499264436545,\n    \"tests/base/test_context.py::test_specify_different_channels_cli_condarc\": 0.03719060115591803,\n    \"tests/base/test_context.py::test_specify_same_channels_cli_as_in_condarc\": 0.03543667540853389,\n    \"tests/base/test_context.py::test_subdirs\": 0.013218124359324158,\n    \"tests/base/test_context.py::test_target_prefix\": 0.061463485057484384,\n    \"tests/base/test_context.py::test_threads\": 0.05514320986389983,\n    \"tests/base/test_context.py::test_validate_channels[-expected_channels3]\": 0.0038806468347042083,\n    \"tests/base/test_context.py::test_validate_channels[channels0-expected_channels0]\": 0.006038510864799617,\n    \"tests/base/test_context.py::test_validate_channels[channels1-expected_channels1]\": 0.005516461247062072,\n    \"tests/base/test_context.py::test_validate_channels[channels2-expected_channels2]\": 0.006106952059571302,\n    \"tests/base/test_context.py::test_validate_channels[channels4-expected_channels4]\": 0.003603593453237281,\n    \"tests/cli/test_actions.py::test_deprecations[NullCountAction._ensure_value-TypeError]\": 0.004235784900316259,\n    \"tests/cli/test_actions.py::test_null_count_action\": 0.005194912855033793,\n    \"tests/cli/test_all_commands.py::test_activate_help_commands_exit_0_rc[activate]\": 0.04135311400003161,\n    \"tests/cli/test_all_commands.py::test_activate_help_commands_exit_0_rc[deactivate]\": 0.0887445353333381,\n    \"tests/cli/test_all_commands.py::test_commands_with_plugin_backed_options[command0-error: argument --format: invalid choice: 'idontexist']\": 0.0647759583131879,\n    \"tests/cli/test_all_commands.py::test_commands_with_plugin_backed_options[command1-error: argument --solver: invalid choice: 'idontexist']\": 0.057947997697476245,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command0]\": 0.08386111105244996,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command1]\": 0.06525398210760477,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command2]\": 0.2054211273995247,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command3]\": 0.08311664656572304,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-False-command4]\": 0.21384510915498983,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command0]\": 0.07812220844265308,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command1]\": 0.06568941922076364,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command2]\": 0.2733978760119036,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command3]\": 0.07842789187682735,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[denylist_channel_name-True-command4]\": 0.2267305332448143,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command0]\": 0.08944849586883818,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command1]\": 0.06907673039192114,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command2]\": 0.08766692199449581,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command3]\": 0.09112964342422064,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-False-command4]\": 0.2429003619730979,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command0]\": 0.08475521601462617,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command1]\": 0.0719471233756735,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command2]\": 0.18673353804493237,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command3]\": 0.09789896559589048,\n    \"tests/cli/test_all_commands.py::test_denylist_channels[https://conda.anaconda.org/denylist_channel_name-True-command4]\": 0.2496464891176632,\n    \"tests/cli/test_all_commands.py::test_env_spec_deprecation_active[--env-spec]\": 0.0076943821601584755,\n    \"tests/cli/test_all_commands.py::test_env_spec_deprecation_active[--environment-specifier]\": 0.012464048134661237,\n    \"tests/cli/test_all_commands.py::test_env_spec_deprecation_pending[--env-spec]\": 0.020571850435631533,\n    \"tests/cli/test_all_commands.py::test_env_spec_deprecation_pending[--environment-specifier]\": 0.006615971176349361,\n    \"tests/cli/test_all_commands.py::test_env_spec_deprecation_removal\": 0.006083772427483084,\n    \"tests/cli/test_all_commands.py::test_env_spec_no_warning_when_not_used\": 0.005962185030416224,\n    \"tests/cli/test_cli_install.py::test_emscripten_forge[classic]\": 7.480853345485133,\n    \"tests/cli/test_cli_install.py::test_emscripten_forge[libmamba]\": 4.160096186792316,\n    \"tests/cli/test_cli_install.py::test_find_conflicts_called_once[classic]\": 21.25222915143643,\n    \"tests/cli/test_cli_install.py::test_find_conflicts_called_once[libmamba]\": 0.009329529434015863,\n    \"tests/cli/test_cli_install.py::test_frozen_env_cep22[classic]\": 67.57979419566804,\n    \"tests/cli/test_cli_install.py::test_frozen_env_cep22[libmamba]\": 37.11069807663952,\n    \"tests/cli/test_cli_install.py::test_pre_link_message[classic]\": 1.6707249249157095,\n    \"tests/cli/test_cli_install.py::test_pre_link_message[libmamba]\": 2.0400892487227402,\n    \"tests/cli/test_cli_install.py::test_reinstall_packages_calls_install[classic]\": 0.023809915485808002,\n    \"tests/cli/test_cli_install.py::test_reinstall_packages_calls_install[libmamba]\": 0.031808671239245065,\n    \"tests/cli/test_common.py::test_check_non_admin_enabled_false\": 0.014287688188374312,\n    \"tests/cli/test_common.py::test_check_non_admin_enabled_true\": 0.013059248920864559,\n    \"tests/cli/test_common.py::test_get_name_prefix_from_env_file_both_none\": 0.0060110394473284375,\n    \"tests/cli/test_common.py::test_get_name_prefix_from_env_file_exception_in_environment_spec\": 0.005989230342089599,\n    \"tests/cli/test_common.py::test_get_name_prefix_from_env_file_exception_in_get_specifier\": 0.0056285698130236666,\n    \"tests/cli/test_common.py::test_get_name_prefix_from_env_file_with_both\": 0.0062690975149602484,\n    \"tests/cli/test_common.py::test_get_name_prefix_from_env_file_with_only_name\": 0.006960094628188991,\n    \"tests/cli/test_common.py::test_get_name_prefix_from_env_file_with_only_prefix\": 0.005925176582128524,\n    \"tests/cli/test_common.py::test_is_active_prefix[-False]\": 0.004053933409855258,\n    \"tests/cli/test_common.py::test_is_active_prefix[active_prefix-True]\": 0.0036026535799577796,\n    \"tests/cli/test_common.py::test_print_activate\": 0.004965008228129584,\n    \"tests/cli/test_common.py::test_print_activate_no_output[CONDA_JSON]\": 0.015438975418808648,\n    \"tests/cli/test_common.py::test_print_activate_no_output[CONDA_QUIET]\": 0.014508068078545239,\n    \"tests/cli/test_common.py::test_validate_file_exists[/Users/runner/work/conda-libmamba-solver/conda-libmamba-solver/conda/tests/cli/test_common.py-True]\": 0.0026555980036341454,\n    \"tests/cli/test_common.py::test_validate_file_exists[/Users/runner/work/conda/conda/tests/cli/test_common.py-True]\": 0.004742478379501809,\n    \"tests/cli/test_common.py::test_validate_file_exists[file:///Users/runner/work/conda-libmamba-solver/conda-libmamba-solver/conda/tests/cli/test_common.py-True]\": 0.0034766317329442326,\n    \"tests/cli/test_common.py::test_validate_file_exists[file:///Users/runner/work/conda/conda/tests/cli/test_common.py-True]\": 0.005385275471445733,\n    \"tests/cli/test_common.py::test_validate_file_exists[file://idontexist.txt-False]\": 0.00410975788659898,\n    \"tests/cli/test_common.py::test_validate_file_exists[http://imasession.txt-True]\": 0.003747550576006917,\n    \"tests/cli/test_common.py::test_validate_file_exists[idontexist.txt-False]\": 0.00399428470754883,\n    \"tests/cli/test_common.py::test_validate_subdir_config\": 0.006126040617488074,\n    \"tests/cli/test_common.py::test_validate_subdir_config_invalid_subdir\": 0.006557161183122832,\n    \"tests/cli/test_compare.py::test_compare_fail\": 1.6726883320663744,\n    \"tests/cli/test_compare.py::test_compare_success\": 1.272659723133132,\n    \"tests/cli/test_conda_argparse.py::test_cli_args_as_strings\": 0.09825581969048251,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.ArgumentParser-isclass]\": 0.0060492343753245255,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.BUILTIN_COMMANDS-<lambda>]\": 0.004055312412510113,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.ExtendConstAction-isclass]\": 0.007780680421883457,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.NullCountAction-isclass]\": 0.005021625355001991,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_output_and_prompt_options-isfunction]\": 0.0043391700488606385,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_channels-isfunction]\": 0.004331464320859218,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_create_install_update-isfunction]\": 0.004379118507514045,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_default_packages-isfunction]\": 0.020283895515326035,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_help-isfunction]\": 0.00561471966562845,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_json-isfunction]\": 0.014084014484150031,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_known-isfunction]\": 0.004054089285958279,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_networking-isfunction]\": 0.004348576755868434,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_package_install_options-isfunction]\": 0.0040902909800902935,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_prefix-isfunction]\": 0.004493833305046914,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_prefix_to_group-isfunction]\": 0.004139263588679391,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_prune-isfunction]\": 0.012698916809484637,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_pscheck-isfunction]\": 0.004067947600094233,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_show_channel_urls-isfunction]\": 0.003687451216570164,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_solver-isfunction]\": 0.004002429775417028,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_solver_mode-isfunction]\": 0.0037502300423931764,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_update_modifiers-isfunction]\": 0.004019723807996511,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.add_parser_verbose-isfunction]\": 0.004009301001827388,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_clean-isfunction]\": 0.004066500289432626,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_compare-isfunction]\": 0.0038930447625835033,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_config-isfunction]\": 0.003914481094615946,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_create-isfunction]\": 0.0036460259766652675,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_info-isfunction]\": 0.0034857767026638628,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_init-isfunction]\": 0.004346794029608563,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_install-isfunction]\": 0.004058680903529706,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_list-isfunction]\": 0.004083459385055381,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_notices-isfunction]\": 0.004256608048339528,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_package-isfunction]\": 0.004085107568441029,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_plugins-isfunction]\": 0.004692633192412332,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_remove-isfunction]\": 0.0044523143666565105,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_rename-isfunction]\": 0.0040443214011068014,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_run-isfunction]\": 0.004671380200404303,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_search-isfunction]\": 0.004834789306397318,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.configure_parser_update-isfunction]\": 0.004456499444931781,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.do_call-isfunction]\": 0.004480822843956616,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.escaped_sys_rc_path-<lambda>]\": 0.004463886586233026,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.escaped_user_rc_path-<lambda>]\": 0.004528884410133324,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.find_builtin_commands-isfunction]\": 0.004563722693859969,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.generate_parser-isfunction]\": 0.004294172805704509,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.generate_pre_parser-isfunction]\": 0.004430678926971039,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.sys_rc_path-<lambda>]\": 0.004558504348299476,\n    \"tests/cli/test_conda_argparse.py::test_imports[conda.cli.conda_argparse.user_rc_path-<lambda>]\": 0.004987354918818975,\n    \"tests/cli/test_conda_argparse.py::test_parse_clobber\": 0.0678345580439776,\n    \"tests/cli/test_conda_argparse.py::test_parser_basics\": 0.07765048273060866,\n    \"tests/cli/test_conda_argparse.py::test_sorted_commands_in_error\": 0.006866359170337944,\n    \"tests/cli/test_config.py::test_add_invalid_key\": 0.0881662688398049,\n    \"tests/cli/test_config.py::test_add_key\": 0.1128598495080704,\n    \"tests/cli/test_config.py::test_channels_add_duplicate\": 0.08756605842977994,\n    \"tests/cli/test_config.py::test_channels_add_empty\": 0.1143466944044159,\n    \"tests/cli/test_config.py::test_channels_add_empty_with_defaults\": 0.11124210329179562,\n    \"tests/cli/test_config.py::test_channels_append\": 0.10244028575885665,\n    \"tests/cli/test_config.py::test_channels_append_duplicate\": 0.13068234479943536,\n    \"tests/cli/test_config.py::test_channels_prepend\": 0.10042145449423014,\n    \"tests/cli/test_config.py::test_channels_prepend_duplicate\": 0.10483291190522376,\n    \"tests/cli/test_config.py::test_channels_remove\": 0.11467462381714211,\n    \"tests/cli/test_config.py::test_channels_remove_duplicate\": 0.19014362874533003,\n    \"tests/cli/test_config.py::test_conda_config_describe\": 1.2213739663098422,\n    \"tests/cli/test_config.py::test_conda_config_validate\": 0.3224462935635032,\n    \"tests/cli/test_config.py::test_conda_config_validate_sslverify_truststore\": 0.16790669170857242,\n    \"tests/cli/test_config.py::test_create_condarc_on_set\": 0.09779198741298302,\n    \"tests/cli/test_config.py::test_custom_multichannels_add\": 0.09552169498111235,\n    \"tests/cli/test_config.py::test_custom_multichannels_add_duplicate\": 0.10375482779553064,\n    \"tests/cli/test_config.py::test_custom_multichannels_append\": 0.0893947928188464,\n    \"tests/cli/test_config.py::test_custom_multichannels_append_duplicate\": 0.08852036033694395,\n    \"tests/cli/test_config.py::test_custom_multichannels_prepend\": 0.08422445616760957,\n    \"tests/cli/test_config.py::test_custom_multichannels_prepend_duplicate\": 0.090694175790913,\n    \"tests/cli/test_config.py::test_get_all\": 0.11808253965606623,\n    \"tests/cli/test_config.py::test_get_all_inc_maps\": 0.10158202958384323,\n    \"tests/cli/test_config.py::test_get_boolean_value\": 0.10317755566103588,\n    \"tests/cli/test_config.py::test_get_channels_list\": 0.1021486734731305,\n    \"tests/cli/test_config.py::test_get_invalid_key\": 0.09483595300518417,\n    \"tests/cli/test_config.py::test_get_map_full\": 0.1081727357868393,\n    \"tests/cli/test_config.py::test_get_map_subkey[conda_build.cache_dir-/tmp/conda-bld]\": 0.12796284999518226,\n    \"tests/cli/test_config.py::test_get_map_subkey[proxy_servers.http-1.2.3.4:5678]\": 0.09777210917195271,\n    \"tests/cli/test_config.py::test_get_multiple_keys\": 0.09870216503244574,\n    \"tests/cli/test_config.py::test_get_multiple_keys_incl_map_full\": 0.10886658251964253,\n    \"tests/cli/test_config.py::test_get_multiple_keys_incl_map_subkey\": 0.12888241824045005,\n    \"tests/cli/test_config.py::test_get_string_value\": 0.09416948352517913,\n    \"tests/cli/test_config.py::test_get_unconfigured_key\": 0.1103055512714119,\n    \"tests/cli/test_config.py::test_invalid_yaml\": 0.09185876169102641,\n    \"tests/cli/test_config.py::test_remove_key\": 0.08626311222495414,\n    \"tests/cli/test_config.py::test_remove_key_duplicate\": 0.13686263621169695,\n    \"tests/cli/test_config.py::test_remove_unconfigured_key\": 0.08027645374974685,\n    \"tests/cli/test_config.py::test_set_and_get_bool\": 0.169627201543951,\n    \"tests/cli/test_config.py::test_set_check_types[always_yes-false-False]\": 0.08606949771638943,\n    \"tests/cli/test_config.py::test_set_check_types[always_yes-no-False]\": 0.08878308374440108,\n    \"tests/cli/test_config.py::test_set_check_types[always_yes-true-True]\": 0.08566686828881509,\n    \"tests/cli/test_config.py::test_set_check_types[always_yes-yes-True]\": 0.08624213850675166,\n    \"tests/cli/test_config.py::test_set_check_types[channel_alias-https://repo.example.com-https://repo.example.com]\": 0.08003079772506745,\n    \"tests/cli/test_config.py::test_set_check_types[proxy_servers.http-1.2.3.4:5678-py_value5]\": 0.08596973661201304,\n    \"tests/cli/test_config.py::test_set_invalid_key\": 0.07383852304956055,\n    \"tests/cli/test_config.py::test_set_key\": 0.10384791678756178,\n    \"tests/cli/test_config.py::test_set_map_key[conda_build.cache_dir-/tmp/conda-bld-/var/tmp/build]\": 0.09508030414218076,\n    \"tests/cli/test_config.py::test_set_map_key[conda_build.error_overlinking-true-false]\": 0.0008571926615353055,\n    \"tests/cli/test_config.py::test_set_map_key[proxy_servers.http-1.2.3.4:5678-4.3.2.1:9876]\": 0.0933782528925965,\n    \"tests/cli/test_config.py::test_set_rc_without_user_rc\": 0.09834675199109405,\n    \"tests/cli/test_config.py::test_set_unconfigured_key\": 0.0999756115614536,\n    \"tests/cli/test_config.py::test_show_sorts_keys\": 0.23888580692370606,\n    \"tests/cli/test_config.py::test_ssl_verify_default\": 0.0065441414461990775,\n    \"tests/cli/test_config.py::test_ssl_verify_set_bool\": 0.0757976230859016,\n    \"tests/cli/test_config.py::test_ssl_verify_set_filename\": 0.08827973955400154,\n    \"tests/cli/test_env.py::test_conda_env_create_empty_file[classic]\": 0.05505775562871469,\n    \"tests/cli/test_env.py::test_conda_env_create_empty_file[libmamba]\": 0.030370183974781237,\n    \"tests/cli/test_env.py::test_conda_env_create_http[classic-http_test_server0]\": 1.2441171922846466,\n    \"tests/cli/test_env.py::test_conda_env_create_http[libmamba-http_test_server0]\": 1.4911250961063174,\n    \"tests/cli/test_env.py::test_conda_env_create_no_existent_file[classic]\": 0.03563459351198939,\n    \"tests/cli/test_env.py::test_conda_env_create_no_existent_file[libmamba]\": 0.018122805486255653,\n    \"tests/cli/test_env.py::test_conda_env_create_no_existent_file_with_name[classic]\": 0.03245778793687105,\n    \"tests/cli/test_env.py::test_conda_env_create_no_existent_file_with_name[libmamba]\": 0.03598257398941148,\n    \"tests/cli/test_env.py::test_conda_env_create_no_file[classic]\": 0.01659037640468958,\n    \"tests/cli/test_env.py::test_conda_env_create_no_file[libmamba]\": 0.03606590660912431,\n    \"tests/cli/test_env.py::test_create_dry_run_json[classic]\": 0.26204305426897473,\n    \"tests/cli/test_env.py::test_create_dry_run_json[libmamba]\": 0.49488479904040245,\n    \"tests/cli/test_env.py::test_create_dry_run_yaml[classic]\": 0.4088668363730023,\n    \"tests/cli/test_env.py::test_create_dry_run_yaml[libmamba]\": 1.0020819006242665,\n    \"tests/cli/test_env.py::test_create_unsolvable_env[classic]\": 0.735545060670648,\n    \"tests/cli/test_env.py::test_create_unsolvable_env[libmamba]\": 0.924573155218304,\n    \"tests/cli/test_env.py::test_create_valid_env[classic]\": 2.312457360803382,\n    \"tests/cli/test_env.py::test_create_valid_env[libmamba]\": 1.5261040030114261,\n    \"tests/cli/test_env.py::test_create_valid_env_json_output[classic]\": 0.07916513686452198,\n    \"tests/cli/test_env.py::test_create_valid_env_json_output[libmamba]\": 0.5052295876761401,\n    \"tests/cli/test_env.py::test_create_valid_env_with_conda_and_pip_json_output[classic]\": 12.382148847469997,\n    \"tests/cli/test_env.py::test_create_valid_env_with_conda_and_pip_json_output[libmamba]\": 10.47433856534404,\n    \"tests/cli/test_env.py::test_create_valid_env_with_variables[classic]\": 1.3296485466071746,\n    \"tests/cli/test_env.py::test_create_valid_env_with_variables[libmamba]\": 1.3066283193009385,\n    \"tests/cli/test_env.py::test_env_export[classic]\": 2.1952579002513875,\n    \"tests/cli/test_env.py::test_env_export[libmamba]\": 3.075971975747862,\n    \"tests/cli/test_env.py::test_env_export_json[classic]\": 0.6292987153827415,\n    \"tests/cli/test_env.py::test_env_export_json[libmamba]\": 0.6590647454497357,\n    \"tests/cli/test_env.py::test_env_export_with_variables[classic]\": 1.7400692042574577,\n    \"tests/cli/test_env.py::test_env_export_with_variables[libmamba]\": 2.392380626527689,\n    \"tests/cli/test_env.py::test_env_list_size[classic]\": 1.1366013979298637,\n    \"tests/cli/test_env.py::test_env_list_size[libmamba]\": 0.9756152526375992,\n    \"tests/cli/test_env.py::test_env_list_size_json[classic]\": 0.5538304139539122,\n    \"tests/cli/test_env.py::test_env_list_size_json[libmamba]\": 0.3649952969094625,\n    \"tests/cli/test_env.py::test_export_multi_channel[classic]\": 25.445511622115358,\n    \"tests/cli/test_env.py::test_export_multi_channel[libmamba]\": 24.28950444986007,\n    \"tests/cli/test_env.py::test_list[classic]\": 1.9577647243614933,\n    \"tests/cli/test_env.py::test_list[libmamba]\": 2.634406698771688,\n    \"tests/cli/test_env.py::test_list_info_envs[classic]\": 0.9952254303383784,\n    \"tests/cli/test_env.py::test_list_info_envs[libmamba]\": 0.319615834035123,\n    \"tests/cli/test_env.py::test_name_override[classic]\": 1.0335505529145304,\n    \"tests/cli/test_env.py::test_name_override[libmamba]\": 1.3146952698170429,\n    \"tests/cli/test_env.py::test_non_existent_file[classic]\": 0.020570517587106093,\n    \"tests/cli/test_env.py::test_non_existent_file[libmamba]\": 0.014873555073282241,\n    \"tests/cli/test_env.py::test_pip_error_is_propagated[classic]\": 11.144689660016079,\n    \"tests/cli/test_env.py::test_pip_error_is_propagated[libmamba]\": 11.621286874938093,\n    \"tests/cli/test_env.py::test_remove_dry_run[classic]\": 0.8655810908271245,\n    \"tests/cli/test_env.py::test_remove_dry_run[libmamba]\": 1.5167196252240074,\n    \"tests/cli/test_env.py::test_set_unset_env_vars[classic]\": 0.9964881781500212,\n    \"tests/cli/test_env.py::test_set_unset_env_vars[libmamba]\": 1.3292080616892694,\n    \"tests/cli/test_env.py::test_set_unset_env_vars_env_no_exist[classic]\": 0.017254408503938883,\n    \"tests/cli/test_env.py::test_set_unset_env_vars_env_no_exist[libmamba]\": 0.02750112455408228,\n    \"tests/cli/test_env.py::test_update[classic]\": 1.784724657616176,\n    \"tests/cli/test_env.py::test_update[libmamba]\": 2.59339245839897,\n    \"tests/cli/test_env.py::test_update_env_json_output[classic]\": 0.33379284093653505,\n    \"tests/cli/test_env.py::test_update_env_json_output[libmamba]\": 0.9681776651100645,\n    \"tests/cli/test_env.py::test_update_env_no_action_json_output[classic]\": 15.269981707212796,\n    \"tests/cli/test_env.py::test_update_env_no_action_json_output[libmamba]\": 13.29377193111022,\n    \"tests/cli/test_env.py::test_update_env_only_pip_json_output[classic]\": 15.89302986097874,\n    \"tests/cli/test_env.py::test_update_env_only_pip_json_output[libmamba]\": 13.227630381661324,\n    \"tests/cli/test_find_commands.py::test_find_commands[subset0]\": 0.0006224097560600733,\n    \"tests/cli/test_find_commands.py::test_find_commands[subset1]\": 0.016970226638298218,\n    \"tests/cli/test_find_commands.py::test_find_executable[conda-bat-bat/conda-bat.bat]\": 0.0009140900139078096,\n    \"tests/cli/test_find_commands.py::test_find_executable[conda-bin-bin/conda-bin]\": 0.009747500563386916,\n    \"tests/cli/test_find_commands.py::test_find_executable[conda-exe-exe/conda-exe.exe]\": 0.0006240382388041978,\n    \"tests/cli/test_helpers.py::test_argumentparser_error_handling[choices0-invalid]\": 0.005393432379147106,\n    \"tests/cli/test_helpers.py::test_argumentparser_error_handling[choices1-four]\": 0.005171087625398872,\n    \"tests/cli/test_helpers.py::test_argumentparser_error_handling[choices2-maybe]\": 0.004502278881201581,\n    \"tests/cli/test_helpers.py::test_argumentparser_help_integration[choices0-{red,green,blue}]\": 0.006367944893434679,\n    \"tests/cli/test_helpers.py::test_argumentparser_help_integration[choices1-{spam,eggs,bacon,spam}]\": 0.005350718695911137,\n    \"tests/cli/test_helpers.py::test_argumentparser_help_integration[choices2-{classic,libmamba}]\": 0.004768732890218016,\n    \"tests/cli/test_helpers.py::test_argumentparser_valid_parsing[choices0-two]\": 0.0051687940787764185,\n    \"tests/cli/test_helpers.py::test_argumentparser_valid_parsing[choices1-gamma]\": 0.00510213458977081,\n    \"tests/cli/test_helpers.py::test_argumentparser_valid_parsing[choices2-yes]\": 0.004432094450630918,\n    \"tests/cli/test_helpers.py::test_choices_func_exception_propagation\": 0.003242629887354951,\n    \"tests/cli/test_helpers.py::test_choices_property_evaluation\": 0.004411931825748949,\n    \"tests/cli/test_helpers.py::test_choices_setter_ignores_values\": 0.0036148069267918966,\n    \"tests/cli/test_helpers.py::test_conda_export_format_integration\": 0.005344778456832886,\n    \"tests/cli/test_helpers.py::test_conda_integration[conda food---food-food_choices-bacon-{spam,eggs,bacon,spam}]\": 0.006325971630595284,\n    \"tests/cli/test_helpers.py::test_conda_integration[conda install---solver-solver_choices-libmamba-{classic,libmamba}]\": 0.006528121978552367,\n    \"tests/cli/test_helpers.py::test_empty_choices_behavior\": 0.002999877999103077,\n    \"tests/cli/test_helpers.py::test_invalid_choice_handling[orange]\": 0.003538945478320301,\n    \"tests/cli/test_helpers.py::test_invalid_choice_handling[purple]\": 0.0035189909349035747,\n    \"tests/cli/test_helpers.py::test_invalid_choice_handling[yellow]\": 0.005497175991435536,\n    \"tests/cli/test_helpers.py::test_lazy_choices_action_initialization\": 0.0058505627795689685,\n    \"tests/cli/test_helpers.py::test_multiple_option_strings[option_strings0-food---food]\": 0.004270778111635529,\n    \"tests/cli/test_helpers.py::test_multiple_option_strings[option_strings1-food--f]\": 0.004982637205432234,\n    \"tests/cli/test_helpers.py::test_multiple_option_strings[option_strings2-solver---solver]\": 0.004296066361563172,\n    \"tests/cli/test_helpers.py::test_multiple_option_strings[option_strings3-solver--s]\": 0.004407159195323465,\n    \"tests/cli/test_helpers.py::test_non_list_iterable_choices[iterable_choices0-set]\": 0.0037788355039633514,\n    \"tests/cli/test_helpers.py::test_non_list_iterable_choices[iterable_choices1-tuple]\": 0.003967064731095287,\n    \"tests/cli/test_helpers.py::test_non_list_iterable_choices[iterable_choices2-iter]\": 0.0038650926583483885,\n    \"tests/cli/test_helpers.py::test_valid_choice_handling[blue]\": 0.003442752080676508,\n    \"tests/cli/test_helpers.py::test_valid_choice_handling[green]\": 0.003483023527978036,\n    \"tests/cli/test_helpers.py::test_valid_choice_handling[red]\": 0.003947206118868136,\n    \"tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[--debug]\": 0.05684552981621189,\n    \"tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[--json]\": 0.05710770121212911,\n    \"tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[--trace]\": 0.057080432699741834,\n    \"tests/cli/test_main.py::test_ensure_no_command_provided_returns_help[-v]\": 0.06688929066837189,\n    \"tests/cli/test_main.py::test_main\": 0.06582363818766539,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[ash-expected_patterns3]\": 0.0005226828048491048,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[bash-expected_patterns1]\": 0.0004896932281519194,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[csh-expected_patterns5]\": 0.0008661933715064588,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[dash-expected_patterns4]\": 0.0005949625189190099,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[fish-expected_patterns7]\": 0.0006391020231259678,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[posix-expected_patterns2]\": 0.000567169752503556,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[tcsh-expected_patterns6]\": 0.0006130389765988087,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_fix_needed[zsh-expected_patterns0]\": 0.0005043548570780534,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_no_fix_needed[cmd.exe-expected_patterns0]\": 0.000598442020189519,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_no_fix_needed[powershell-expected_patterns1]\": 0.0006013837555635859,\n    \"tests/cli/test_main.py::test_main_sourced_shell_line_endings_no_fix_needed[xonsh-expected_patterns2]\": 0.000599696675593059,\n    \"tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[bash-expected_patterns0]\": 0.014539749001384621,\n    \"tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[csh-expected_patterns3]\": 0.014608788295919257,\n    \"tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[fish-expected_patterns2]\": 0.014285836314099262,\n    \"tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[tcsh-expected_patterns4]\": 0.016801969763387173,\n    \"tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[xonsh-expected_patterns5]\": 0.015359429176069155,\n    \"tests/cli/test_main.py::test_main_sourced_unix_shells_no_line_ending_fix[zsh-expected_patterns1]\": 0.01697084427426797,\n    \"tests/cli/test_main.py::test_main_subshell_help_exits_cleanly\": 0.05435508877405768,\n    \"tests/cli/test_main.py::test_main_subshell_no_plugins_flag\": 0.07373641260252566,\n    \"tests/cli/test_main.py::test_version_fast_path[--version]\": 0.004430751619736734,\n    \"tests/cli/test_main.py::test_version_fast_path[-V]\": 0.0037526817987900726,\n    \"tests/cli/test_main.py::test_version_fast_path_skips_plugins[--version]\": 0.004555486133277235,\n    \"tests/cli/test_main.py::test_version_fast_path_skips_plugins[-V]\": 0.0037110433025305404,\n    \"tests/cli/test_main_clean.py::test_clean_all[False]\": 1.2061855515733475,\n    \"tests/cli/test_main_clean.py::test_clean_all[True]\": 2.4432230296848463,\n    \"tests/cli/test_main_clean.py::test_clean_all_mock_lstat[False]\": 1.3892099433027092,\n    \"tests/cli/test_main_clean.py::test_clean_all_mock_lstat[True]\": 0.7237207917952272,\n    \"tests/cli/test_main_clean.py::test_clean_and_packages\": 1.1746536786039004,\n    \"tests/cli/test_main_clean.py::test_clean_force_pkgs_dirs\": 0.5775497230365876,\n    \"tests/cli/test_main_clean.py::test_clean_index_cache\": 0.4214395692780606,\n    \"tests/cli/test_main_clean.py::test_clean_logfiles\": 0.37977697745409444,\n    \"tests/cli/test_main_clean.py::test_clean_tarballs\": 0.5410704310029012,\n    \"tests/cli/test_main_clean.py::test_clean_tarballs_partial\": 0.08951586538918638,\n    \"tests/cli/test_main_clean.py::test_clean_tempfiles\": 0.39801686570651446,\n    \"tests/cli/test_main_clean.py::test_get_size\": 0.006782541016631626,\n    \"tests/cli/test_main_clean.py::test_get_size_None\": 0.004381785062935701,\n    \"tests/cli/test_main_clean.py::test_get_size_list\": 0.004049362961187191,\n    \"tests/cli/test_main_commands.py::test_commands\": 0.08270204802094794,\n    \"tests/cli/test_main_compare.py::test_compare\": 0.08377218778688053,\n    \"tests/cli/test_main_compare.py::test_get_packages\": 0.36823890590988123,\n    \"tests/cli/test_main_config.py::test_config_describe\": 0.20644033393598982,\n    \"tests/cli/test_main_config.py::test_config_describe_json\": 0.2140468645314033,\n    \"tests/cli/test_main_config.py::test_config_describe_plugins_yaml_format\": 0.053560982608732516,\n    \"tests/cli/test_main_config.py::test_config_env_does_not_exist\": 0.06560409947890938,\n    \"tests/cli/test_main_config.py::test_config_file_context_manager\": 0.008398567771523095,\n    \"tests/cli/test_main_config.py::test_config_file_context_manager_exception\": 0.0056345857376428835,\n    \"tests/cli/test_main_config.py::test_config_file_from_env_condarc\": 0.013112220034573428,\n    \"tests/cli/test_main_config.py::test_config_file_from_system_condarc\": 0.017605751462545404,\n    \"tests/cli/test_main_config.py::test_config_file_from_user_condarc\": 0.017724698699907025,\n    \"tests/cli/test_main_config.py::test_config_get_key\": 0.013594434726864507,\n    \"tests/cli/test_main_config.py::test_config_get_missing[get]\": 0.09317277008415437,\n    \"tests/cli/test_main_config.py::test_config_get_missing[key]\": 0.08648540622208875,\n    \"tests/cli/test_main_config.py::test_config_get_missing[unknown]\": 0.10517694062663764,\n    \"tests/cli/test_main_config.py::test_config_get_system[get]\": 0.08491408534005905,\n    \"tests/cli/test_main_config.py::test_config_get_system[key]\": 0.0898364772437708,\n    \"tests/cli/test_main_config.py::test_config_get_system[unknown]\": 0.08133650504177083,\n    \"tests/cli/test_main_config.py::test_config_get_user[get]\": 0.09928938252013311,\n    \"tests/cli/test_main_config.py::test_config_get_user[key]\": 0.12345922351737953,\n    \"tests/cli/test_main_config.py::test_config_get_user[unknown]\": 0.09684768775190702,\n    \"tests/cli/test_main_config.py::test_config_read_rc\": 0.007383687517321146,\n    \"tests/cli/test_main_config.py::test_config_remove_item\": 0.008309955673950105,\n    \"tests/cli/test_main_config.py::test_config_remove_key\": 0.004144025609808541,\n    \"tests/cli/test_main_config.py::test_config_set_and_get_key_for_env\": 0.3411165604845912,\n    \"tests/cli/test_main_config.py::test_config_set_key\": 0.008146537741213104,\n    \"tests/cli/test_main_config.py::test_config_set_keys\": 0.013873148823004328,\n    \"tests/cli/test_main_config.py::test_config_set_keys_aliases\": 0.34309290237693374,\n    \"tests/cli/test_main_config.py::test_config_show\": 0.1252986325998459,\n    \"tests/cli/test_main_config.py::test_config_show_errors\": 0.13238512768802033,\n    \"tests/cli/test_main_config.py::test_config_show_sources_json\": 0.10757612347984348,\n    \"tests/cli/test_main_config.py::test_config_write_rc\": 0.007784496528525652,\n    \"tests/cli/test_main_config.py::test_format_dict_mapping_items\": 0.004268943212893452,\n    \"tests/cli/test_main_config.py::test_key_exists[False]\": 0.006346284047929255,\n    \"tests/cli/test_main_config.py::test_key_exists[True]\": 0.005675860707855989,\n    \"tests/cli/test_main_env_imports.py::test_main_env_does_not_eagerly_import_main_export\": 0.5924817497259629,\n    \"tests/cli/test_main_export.py::test_execute_export_no_file_specified\": 0.09259583552364457,\n    \"tests/cli/test_main_export.py::test_export\": 0.0801274181308353,\n    \"tests/cli/test_main_export.py::test_export_add_channels\": 0.08858722197186354,\n    \"tests/cli/test_main_export.py::test_export_explicit_format_validation_errors\": 22.504799061410893,\n    \"tests/cli/test_main_export.py::test_export_file_with_json_flag_behavior[environment.json-expected_result1]\": 0.0976322298070495,\n    \"tests/cli/test_main_export.py::test_export_file_with_json_flag_behavior[environment.yaml-expected_result0]\": 0.08923541019843544,\n    \"tests/cli/test_main_export.py::test_export_file_with_json_flag_behavior[explicit.txt-expected_result2]\": 0.08319302770605982,\n    \"tests/cli/test_main_export.py::test_export_format_comparison_no_builds_vs_regular\": 0.33880358822032874,\n    \"tests/cli/test_main_export.py::test_export_format_consistency\": 0.004581471527519896,\n    \"tests/cli/test_main_export.py::test_export_format_precedence_over_json_flag[environment-yaml-expected_result0]\": 0.07896331015812262,\n    \"tests/cli/test_main_export.py::test_export_format_precedence_over_json_flag[explicit-expected_result2]\": 0.08156681217608207,\n    \"tests/cli/test_main_export.py::test_export_format_precedence_over_json_flag[yaml-expected_result1]\": 0.08889894503253815,\n    \"tests/cli/test_main_export.py::test_export_format_priority_over_extension\": 0.08374946828556848,\n    \"tests/cli/test_main_export.py::test_export_format_to_stdout[environment-json-loads]\": 0.09134591603068576,\n    \"tests/cli/test_main_export.py::test_export_format_to_stdout[environment-yaml-loads]\": 0.09883442902504386,\n    \"tests/cli/test_main_export.py::test_export_format_to_stdout[json-loads]\": 0.09966888645364322,\n    \"tests/cli/test_main_export.py::test_export_format_to_stdout[yaml-loads]\": 0.10505108803899252,\n    \"tests/cli/test_main_export.py::test_export_from_history_format\": 0.21174034611790227,\n    \"tests/cli/test_main_export.py::test_export_ignore_channels_flag[False]\": 1.5200611469127703,\n    \"tests/cli/test_main_export.py::test_export_ignore_channels_flag[True]\": 0.323273142928019,\n    \"tests/cli/test_main_export.py::test_export_invalid_platform_fails_fast\": 0.07269582080270791,\n    \"tests/cli/test_main_export.py::test_export_invalid_platform_from_condarc_fails_fast\": 0.07998903508164663,\n    \"tests/cli/test_main_export.py::test_export_invalid_subdir_fails_fast\": 0.074943123835702,\n    \"tests/cli/test_main_export.py::test_export_json_flag_backwards_compatibility\": 0.09704463325762402,\n    \"tests/cli/test_main_export.py::test_export_json_flag_with_file_no_format_detection_error\": 0.08000170401915052,\n    \"tests/cli/test_main_export.py::test_export_multiple_platforms\": 7.051940810679821,\n    \"tests/cli/test_main_export.py::test_export_no_builds_format\": 0.21043164074945941,\n    \"tests/cli/test_main_export.py::test_export_non_pip_env_warnings\": 13.19364107074998,\n    \"tests/cli/test_main_export.py::test_export_override_channels\": 0.12117249549787466,\n    \"tests/cli/test_main_export.py::test_export_override_channels_and_ignore_channels_independence\": 3.050223989891278,\n    \"tests/cli/test_main_export.py::test_export_override_channels_behavior\": 0.3950089016287179,\n    \"tests/cli/test_main_export.py::test_export_package_alphabetical_ordering\": 0.6246299294790612,\n    \"tests/cli/test_main_export.py::test_export_pip_dependencies_handling[environment-json-loads]\": 0.11106583629251525,\n    \"tests/cli/test_main_export.py::test_export_pip_dependencies_handling[environment-yaml-loads]\": 0.1863210707958544,\n    \"tests/cli/test_main_export.py::test_export_platform_argument\": 0.1718032358044899,\n    \"tests/cli/test_main_export.py::test_export_preserves_channels_from_installed_packages\": 2.6072165640933886,\n    \"tests/cli/test_main_export.py::test_export_regular_format_consistency\": 0.7291553839724204,\n    \"tests/cli/test_main_export.py::test_export_single_platform_different_platform\": 3.831011097729378,\n    \"tests/cli/test_main_export.py::test_export_structured_file_extension_detection[environment.json-loads]\": 0.09631271401253336,\n    \"tests/cli/test_main_export.py::test_export_structured_file_extension_detection[environment.yaml-loads]\": 0.09433158812778591,\n    \"tests/cli/test_main_export.py::test_export_structured_file_extension_detection[environment.yml-loads]\": 0.10297012447500689,\n    \"tests/cli/test_main_export.py::test_export_text_file_extensions_fail_on_empty_environments[explicit.txt-Cannot export explicit format]\": 0.06814171088909332,\n    \"tests/cli/test_main_export.py::test_export_text_file_extensions_fail_on_empty_environments[requirements.txt-Cannot export requirements format]\": 0.07437677213450578,\n    \"tests/cli/test_main_export.py::test_export_text_file_extensions_fail_on_empty_environments[spec.txt-Cannot export requirements format]\": 0.08069693394509626,\n    \"tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[explicit-Cannot export explicit format]\": 0.06962681306346832,\n    \"tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[reqs-Cannot export requirements format]\": 0.08978556980644924,\n    \"tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[requirements-Cannot export requirements format]\": 0.07261333950443309,\n    \"tests/cli/test_main_export.py::test_export_text_formats_fail_on_empty_environments[txt-Cannot export requirements format]\": 0.07769624861514308,\n    \"tests/cli/test_main_export.py::test_export_unknown_format_verbose\": 0.06295115402485361,\n    \"tests/cli/test_main_export.py::test_export_unrecognized_file_extension\": 0.1763084369919984,\n    \"tests/cli/test_main_export.py::test_export_unsupported_formats[toml-SystemExit]\": 0.05432462733911558,\n    \"tests/cli/test_main_export.py::test_export_unsupported_formats[unknown-SystemExit]\": 0.07203814576656078,\n    \"tests/cli/test_main_export.py::test_export_warnings[JSON format with `--format` flag]\": 16.67258843828124,\n    \"tests/cli/test_main_export.py::test_export_warnings[JSON format with `--json` flag]\": 17.358322417171873,\n    \"tests/cli/test_main_export.py::test_export_warnings[default behavior raises warning]\": 17.232404248031273,\n    \"tests/cli/test_main_export.py::test_export_warnings[suppress warning with `--json` and `--file`]\": 17.79796804682818,\n    \"tests/cli/test_main_export.py::test_export_warnings[suppress warning with `--quiet`]\": 16.972833392593795,\n    \"tests/cli/test_main_export.py::test_export_warnings[warns with `--file` flag alone]\": 16.411417349656254,\n    \"tests/cli/test_main_export.py::test_export_with_pip_dependencies_integration[JSON---format=json-loads]\": 22.727787534915258,\n    \"tests/cli/test_main_export.py::test_export_with_pip_dependencies_integration[YAML--loads]\": 23.49677125277254,\n    \"tests/cli/test_main_info.py::test_compute_prefix_size\": 3.3706049625656416,\n    \"tests/cli/test_main_info.py::test_compute_prefix_size_empty_env\": 0.00740153373649229,\n    \"tests/cli/test_main_info.py::test_info_all\": 0.9866227803765705,\n    \"tests/cli/test_main_info.py::test_info_base\": 0.17577828638171356,\n    \"tests/cli/test_main_info.py::test_info_detail\": 0.4356229398319181,\n    \"tests/cli/test_main_info.py::test_info_envs\": 0.18551676914004622,\n    \"tests/cli/test_main_info.py::test_info_envs_frozen\": 0.09814610147433862,\n    \"tests/cli/test_main_info.py::test_info_envs_json\": 0.09978812280419419,\n    \"tests/cli/test_main_info.py::test_info_envs_size\": 2.034025917538794,\n    \"tests/cli/test_main_info.py::test_info_envs_size_json\": 0.7147913843704942,\n    \"tests/cli/test_main_info.py::test_info_json\": 0.22444243518220075,\n    \"tests/cli/test_main_info.py::test_info_size_without_envs\": 0.08132794516456858,\n    \"tests/cli/test_main_info.py::test_info_system\": 0.4491483575661175,\n    \"tests/cli/test_main_info.py::test_info_unsafe_channels\": 0.18162824420137413,\n    \"tests/cli/test_main_info.py::test_iter_info_components\": 0.00420809899520042,\n    \"tests/cli/test_main_install.py::test_build_version_shows_as_changed\": 29.165132270661687,\n    \"tests/cli/test_main_install.py::test_conda_pip_interop_dependency_satisfied_by_pip\": 406.4671225793905,\n    \"tests/cli/test_main_install.py::test_install_freezes_env_by_default\": 3.0521639517368664,\n    \"tests/cli/test_main_install.py::test_install_from_extracted_package\": 14.848603682274264,\n    \"tests/cli/test_main_install.py::test_install_revision_revert\": 4.5150224009564575,\n    \"tests/cli/test_main_install.py::test_too_many_arguments\": 0.08458335549890922,\n    \"tests/cli/test_main_list.py::test_exit_codes\": 5.338972117566506,\n    \"tests/cli/test_main_list.py::test_explicit[--md5]\": 0.1544567911443396,\n    \"tests/cli/test_main_list.py::test_explicit[--sha256]\": 0.1319936328019356,\n    \"tests/cli/test_main_list.py::test_explicit[None]\": 0.18196987907039294,\n    \"tests/cli/test_main_list.py::test_export\": 0.17666105822681985,\n    \"tests/cli/test_main_list.py::test_fields_all\": 3.0170206554667454,\n    \"tests/cli/test_main_list.py::test_fields_dependent\": 0.9966377035583611,\n    \"tests/cli/test_main_list.py::test_fields_invalid\": 2.5428962591389888,\n    \"tests/cli/test_main_list.py::test_list\": 0.580051076313993,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args0]\": 2.5945570817431127,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args10]\": 0.9360380965689534,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args11]\": 2.2848375028465115,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args12]\": 0.09636492169110178,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args13]\": 0.09744677533588969,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args14]\": 0.09624014542389044,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args15]\": 0.07793359192328113,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args1]\": 2.464095444067054,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args2]\": 1.4756454651277398,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args3]\": 2.5699485122850962,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args4]\": 0.08120832365914941,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args5]\": 0.10072447509100461,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args6]\": 0.4389346329113359,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args7]\": 0.12495803518718714,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args8]\": 2.4260113690397573,\n    \"tests/cli/test_main_list.py::test_list_argument_variations[args9]\": 2.541874729898696,\n    \"tests/cli/test_main_list.py::test_list_explicit\": 0.8468960165488868,\n    \"tests/cli/test_main_list.py::test_list_full_name\": 2.4920049726924365,\n    \"tests/cli/test_main_list.py::test_list_full_name_no_results\": 2.9741167285869707,\n    \"tests/cli/test_main_list.py::test_list_json\": 2.6005037273192677,\n    \"tests/cli/test_main_list.py::test_list_package\": 2.3780594458279816,\n    \"tests/cli/test_main_list.py::test_list_reverse\": 0.6877587738073054,\n    \"tests/cli/test_main_list.py::test_list_revisions\": 0.15489507274538133,\n    \"tests/cli/test_main_list.py::test_list_size\": 1.5231649818729094,\n    \"tests/cli/test_main_list.py::test_list_size_empty_paths_data\": 0.772989186215713,\n    \"tests/cli/test_main_list.py::test_list_size_json\": 0.5062203870879654,\n    \"tests/cli/test_main_list.py::test_list_specific_version\": 0.5784298236677621,\n    \"tests/cli/test_main_list.py::test_list_with_bad_prefix_raises\": 0.0724078801800962,\n    \"tests/cli/test_main_notices.py::test_cache_names_appear_as_expected\": 0.23496862666041135,\n    \"tests/cli/test_main_notices.py::test_main_notices[200]\": 0.20011299730156912,\n    \"tests/cli/test_main_notices.py::test_main_notices[404]\": 0.20554094469602577,\n    \"tests/cli/test_main_notices.py::test_main_notices_handles_bad_expired_at_field\": 0.26984249611916467,\n    \"tests/cli/test_main_notices.py::test_main_notices_help\": 0.18117027526898116,\n    \"tests/cli/test_main_notices.py::test_main_notices_json\": 0.10569518349855615,\n    \"tests/cli/test_main_notices.py::test_main_notices_reads_from_cache\": 0.25227577686876945,\n    \"tests/cli/test_main_notices.py::test_main_notices_reads_from_expired_cache\": 0.2640875211446023,\n    \"tests/cli/test_main_notices.py::test_notices_appear_once_when_running_decorated_commands\": 1.4475212539024696,\n    \"tests/cli/test_main_notices.py::test_notices_cannot_read_cache_files\": 0.2555907852300255,\n    \"tests/cli/test_main_notices.py::test_notices_does_not_interrupt_command_on_failure\": 1.247984018356054,\n    \"tests/cli/test_main_notices.py::test_notices_shown_after_previous_command_error\": 3.139912178888329,\n    \"tests/cli/test_main_notices.py::test_notices_work_with_s3_channel\": 0.2567585383253836,\n    \"tests/cli/test_main_remove.py::test_remove_all\": 25.04493016728059,\n    \"tests/cli/test_main_remove.py::test_remove_all_default_activation_env\": 0.08367281650506546,\n    \"tests/cli/test_main_remove.py::test_remove_all_keep_env\": 21.721268227078777,\n    \"tests/cli/test_main_remove.py::test_remove_early_existence_check\": 0.08595332853370358,\n    \"tests/cli/test_main_remove.py::test_remove_globbed_package_names[classic]\": 5.0671977872103255,\n    \"tests/cli/test_main_remove.py::test_remove_globbed_package_names[libmamba]\": 1.1941753872446823,\n    \"tests/cli/test_main_remove.py::test_remove_nonexistent_env\": 0.07410845223198331,\n    \"tests/cli/test_main_rename.py::test_cannot_rename_active_env_by_name\": 4.755571348322737,\n    \"tests/cli/test_main_rename.py::test_cannot_rename_base_env_by_name\": 0.08880330585545049,\n    \"tests/cli/test_main_rename.py::test_cannot_rename_base_env_by_path\": 0.08016511283318485,\n    \"tests/cli/test_main_rename.py::test_cannot_rename_nonexistent_env\": 0.08201038834977548,\n    \"tests/cli/test_main_rename.py::test_protected_dirs_error_for_rename\": 4.975029081405726,\n    \"tests/cli/test_main_rename.py::test_rename_by_name_name_already_exists_error\": 4.5388671617922585,\n    \"tests/cli/test_main_rename.py::test_rename_by_name_success\": 5.517134496098558,\n    \"tests/cli/test_main_rename.py::test_rename_by_path_path_already_exists_error\": 4.4565016324527775,\n    \"tests/cli/test_main_rename.py::test_rename_by_path_success\": 7.187953354374219,\n    \"tests/cli/test_main_rename.py::test_rename_default_activation_env\": 0.07840126892408755,\n    \"tests/cli/test_main_rename.py::test_rename_with_dry_run\": 4.238773641769901,\n    \"tests/cli/test_main_rename.py::test_rename_with_force\": 9.19758227040933,\n    \"tests/cli/test_main_rename.py::test_rename_with_force_and_dry_run\": 4.407008602857294,\n    \"tests/cli/test_main_rename.py::test_rename_with_force_with_errors\": 9.049334007844552,\n    \"tests/cli/test_main_rename.py::test_rename_with_force_with_errors_prefix\": 0.14516561053049173,\n    \"tests/cli/test_main_rename.py::test_separator_chars_on_win\": 0.0009812297711259033,\n    \"tests/cli/test_main_run.py::test_conda_run_nonexistent_prefix\": 0.07256560031657561,\n    \"tests/cli/test_main_run.py::test_conda_run_prefix_not_a_conda_env\": 0.08787366255092711,\n    \"tests/cli/test_main_run.py::test_multiline_run_command\": 3.1240500698371263,\n    \"tests/cli/test_main_run.py::test_no_newline_in_output[stderr]\": 19.870509632736056,\n    \"tests/cli/test_main_run.py::test_no_newline_in_output[stdout]\": 17.866578161550905,\n    \"tests/cli/test_main_run.py::test_run_deactivates_environment_unix\": 0.015054291187811613,\n    \"tests/cli/test_main_run.py::test_run_deactivates_environment_windows\": 0.0007301774274294292,\n    \"tests/cli/test_main_run.py::test_run_executes_deactivation_scripts[unix]\": 2.359859090110457,\n    \"tests/cli/test_main_run.py::test_run_executes_deactivation_scripts[windows]\": 0.0008052874375650065,\n    \"tests/cli/test_main_run.py::test_run_preserves_exit_code_despite_deactivation_failure[unix]\": 2.6687077334452187,\n    \"tests/cli/test_main_run.py::test_run_preserves_exit_code_despite_deactivation_failure[windows]\": 0.0007785286217055026,\n    \"tests/cli/test_main_run.py::test_run_preserves_exit_code_with_deactivation[unix]\": 0.0020144384911308087,\n    \"tests/cli/test_main_run.py::test_run_preserves_exit_code_with_deactivation[windows]\": 2.7471973733819426,\n    \"tests/cli/test_main_run.py::test_run_readonly_env\": 2.505449054307734,\n    \"tests/cli/test_main_run.py::test_run_returns_int\": 2.6123799561005097,\n    \"tests/cli/test_main_run.py::test_run_returns_nonzero_errorlevel\": 3.043266583797985,\n    \"tests/cli/test_main_run.py::test_run_returns_zero_errorlevel\": 2.7310180534613826,\n    \"tests/cli/test_main_run.py::test_run_uncaptured[--no-capture-output]\": 2.378103882153354,\n    \"tests/cli/test_main_run.py::test_run_uncaptured[-s]\": 2.2561014990755064,\n    \"tests/cli/test_main_run.py::test_run_with_empty_command_will_raise\": 0.07575482472931586,\n    \"tests/cli/test_main_run.py::test_run_with_separator[combined option]\": 3.2885033131637926,\n    \"tests/cli/test_main_run.py::test_run_with_separator[double dash option]\": 2.9851089470957906,\n    \"tests/cli/test_main_run.py::test_run_with_separator[multiple args]\": 2.8453750396925597,\n    \"tests/cli/test_main_run.py::test_run_with_separator[multiple separators]\": 3.0490329965845144,\n    \"tests/cli/test_main_run.py::test_run_with_separator[no known args]\": 2.970450073282078,\n    \"tests/cli/test_main_run.py::test_run_with_separator[no separator]\": 4.259214920011618,\n    \"tests/cli/test_main_run.py::test_run_with_separator[separator not first]\": 3.0792047507295486,\n    \"tests/cli/test_main_run.py::test_run_with_separator[vvv passthrough with --]\": 3.0620220303128862,\n    \"tests/cli/test_main_run.py::test_run_with_separator[vvv passthrough]\": 2.7908490191562456,\n    \"tests/cli/test_main_search.py::test_anaconda_token_with_private_package\": 2.5280198233634907,\n    \"tests/cli/test_main_search.py::test_bad_anaconda_token\": 0.6209110884622168,\n    \"tests/cli/test_main_search.py::test_current_platform_package_missing\": 0.048581188884173315,\n    \"tests/cli/test_main_search.py::test_different_platform_package_found\": 0.030072073656007677,\n    \"tests/cli/test_main_search.py::test_mocked_platform_package_found\": 0.053475622330031836,\n    \"tests/cli/test_main_search.py::test_pretty_record\": 0.016929721818557324,\n    \"tests/cli/test_main_search.py::test_rpy_search[linux-32]\": 1.794621364455229,\n    \"tests/cli/test_main_search.py::test_rpy_search[linux-64]\": 4.040763383796076,\n    \"tests/cli/test_main_search.py::test_rpy_search[osx-64]\": 4.52340060685915,\n    \"tests/cli/test_main_search.py::test_rpy_search[win-32]\": 2.082108124341218,\n    \"tests/cli/test_main_search.py::test_rpy_search[win-64]\": 4.310204195776278,\n    \"tests/cli/test_main_search.py::test_search_0\": 1.4476049350436395,\n    \"tests/cli/test_main_search.py::test_search_1\": 0.023971735510696045,\n    \"tests/cli/test_main_search.py::test_search_2[exact]\": 0.4565700038212836,\n    \"tests/cli/test_main_search.py::test_search_2[wildcard]\": 0.47010381323675776,\n    \"tests/cli/test_main_search.py::test_search_3\": 1.4352936939923675,\n    \"tests/cli/test_main_search.py::test_search_4\": 0.03795935701720322,\n    \"tests/cli/test_main_search.py::test_search_5\": 0.4664231513850444,\n    \"tests/cli/test_main_search.py::test_search_envs\": 0.19802714370982696,\n    \"tests/cli/test_main_search.py::test_search_envs_info\": 0.1997273758959648,\n    \"tests/cli/test_main_search.py::test_search_envs_json\": 0.08081167338672168,\n    \"tests/cli/test_main_search.py::test_search_envs_nonexistent\": 0.27704952498058594,\n    \"tests/cli/test_main_search.py::test_search_envs_nonexistent_info\": 0.31497865727824587,\n    \"tests/cli/test_main_search.py::test_search_envs_nonexistent_json\": 0.1489419677363914,\n    \"tests/cli/test_main_search.py::test_search_inflexible\": 1.1894620289835383,\n    \"tests/cli/test_main_search.py::test_unknown_platform_package_missing\": 0.024154134772498812,\n    \"tests/cli/test_main_update.py::test_dont_update_explicit_packages\": 0.21087469101792364,\n    \"tests/cli/test_main_update.py::test_dont_update_packages_with_version_constraints\": 0.0971525119834319,\n    \"tests/cli/test_main_update.py::test_update\": 29.497740200014473,\n    \"tests/cli/test_startup_benchmarks.py::test_context_init\": 0.01167137803334981,\n    \"tests/cli/test_startup_benchmarks.py::test_generate_parser\": 0.04951388954993566,\n    \"tests/cli/test_startup_benchmarks.py::test_import_cli_main\": 0.3441420336250436,\n    \"tests/cli/test_startup_benchmarks.py::test_import_conda_argparse\": 0.8724711998500292,\n    \"tests/cli/test_startup_benchmarks.py::test_import_context\": 0.3440000401499844,\n    \"tests/cli/test_startup_benchmarks.py::test_module_count_budget[full_startup]\": 0.7528596494566643,\n    \"tests/cli/test_startup_benchmarks.py::test_module_count_budget[generate_parser]\": 1.0697239363153128,\n    \"tests/cli/test_startup_benchmarks.py::test_module_count_budget[import_argparse]\": 1.1485381374609887,\n    \"tests/cli/test_startup_benchmarks.py::test_module_count_budget[import_context]\": 0.61890850540717,\n    \"tests/cli/test_startup_benchmarks.py::test_module_count_budget[import_main]\": 0.6318345422454468,\n    \"tests/cli/test_startup_benchmarks.py::test_version_main\": 0.004775082258373686,\n    \"tests/cli/test_subcommands.py::test_clean[classic]\": 7.35113498169319,\n    \"tests/cli/test_subcommands.py::test_clean[libmamba]\": 5.416063534311589,\n    \"tests/cli/test_subcommands.py::test_compare[classic]\": 0.19410497375683028,\n    \"tests/cli/test_subcommands.py::test_compare[libmamba]\": 0.1108415862194627,\n    \"tests/cli/test_subcommands.py::test_config[classic]\": 0.16118142415701375,\n    \"tests/cli/test_subcommands.py::test_config[libmamba]\": 0.08371641546920729,\n    \"tests/cli/test_subcommands.py::test_create[classic]\": 1.285036368628234,\n    \"tests/cli/test_subcommands.py::test_create[libmamba]\": 8.777802681822273,\n    \"tests/cli/test_subcommands.py::test_doctor[classic]\": 9.193177879599338,\n    \"tests/cli/test_subcommands.py::test_doctor[libmamba]\": 8.810159892728587,\n    \"tests/cli/test_subcommands.py::test_env_config_vars[classic]\": 0.3058466136004222,\n    \"tests/cli/test_subcommands.py::test_env_config_vars[libmamba]\": 0.596893947940655,\n    \"tests/cli/test_subcommands.py::test_env_create[libmamba]\": 5.310538420153476,\n    \"tests/cli/test_subcommands.py::test_env_export[classic]\": 0.25212962689248536,\n    \"tests/cli/test_subcommands.py::test_env_export[libmamba]\": 0.17078258852125985,\n    \"tests/cli/test_subcommands.py::test_env_list[classic]\": 0.40046363401039164,\n    \"tests/cli/test_subcommands.py::test_env_list[libmamba]\": 0.16289831714219158,\n    \"tests/cli/test_subcommands.py::test_env_list_benchmark[libmamba]\": 0.06788393400771249,\n    \"tests/cli/test_subcommands.py::test_env_remove[classic]\": 0.2856071090489689,\n    \"tests/cli/test_subcommands.py::test_env_remove[libmamba]\": 0.24636009128641526,\n    \"tests/cli/test_subcommands.py::test_env_update[libmamba]\": 5.111513057050136,\n    \"tests/cli/test_subcommands.py::test_info[classic]\": 0.4872864620084771,\n    \"tests/cli/test_subcommands.py::test_info[libmamba]\": 0.3150121318265804,\n    \"tests/cli/test_subcommands.py::test_info_json[classic]\": 0.781316674270815,\n    \"tests/cli/test_subcommands.py::test_info_json[libmamba]\": 0.9291754274422696,\n    \"tests/cli/test_subcommands.py::test_init[classic]\": 0.20145124818207286,\n    \"tests/cli/test_subcommands.py::test_init[libmamba]\": 0.14624446517338466,\n    \"tests/cli/test_subcommands.py::test_install[libmamba]\": 1.435862443689011,\n    \"tests/cli/test_subcommands.py::test_list[libmamba]\": 0.3844882141357735,\n    \"tests/cli/test_subcommands.py::test_notices[classic]\": 0.27181648536757935,\n    \"tests/cli/test_subcommands.py::test_notices[libmamba]\": 0.29987167755813876,\n    \"tests/cli/test_subcommands.py::test_package[classic]\": 0.11801663600939975,\n    \"tests/cli/test_subcommands.py::test_package[libmamba]\": 0.09448965828668553,\n    \"tests/cli/test_subcommands.py::test_remove[classic-remove]\": 0.25201466557594926,\n    \"tests/cli/test_subcommands.py::test_remove[classic-uninstall]\": 0.22394853662434033,\n    \"tests/cli/test_subcommands.py::test_remove[libmamba-remove]\": 0.1626885994096639,\n    \"tests/cli/test_subcommands.py::test_remove[libmamba-uninstall]\": 0.17024170552876852,\n    \"tests/cli/test_subcommands.py::test_remove_all_json[classic-remove]\": 7.696399678869317,\n    \"tests/cli/test_subcommands.py::test_remove_all_json[classic-uninstall]\": 8.199403589237368,\n    \"tests/cli/test_subcommands.py::test_remove_all_json[libmamba-remove]\": 3.4492793763739176,\n    \"tests/cli/test_subcommands.py::test_remove_all_json[libmamba-uninstall]\": 9.53567113048829,\n    \"tests/cli/test_subcommands.py::test_rename[classic]\": 0.8098697165687279,\n    \"tests/cli/test_subcommands.py::test_rename[libmamba]\": 0.7141398389268505,\n    \"tests/cli/test_subcommands.py::test_run[libmamba]\": 2.8089896712179967,\n    \"tests/cli/test_subcommands.py::test_search[classic]\": 6.916997840218317,\n    \"tests/cli/test_subcommands.py::test_search[libmamba]\": 18.941263262687485,\n    \"tests/cli/test_subcommands.py::test_update[libmamba-update]\": 2.127915921484813,\n    \"tests/cli/test_subcommands.py::test_update[libmamba-upgrade]\": 1.9754582263852534,\n    \"tests/common/_os/test_windows.py::test_is_admin_on_windows\": 0.0038679353039230225,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-None]\": 0.000745847862747786,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC mount [trailing]]\": 0.0006457007573290254,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC mount]\": 0.0006696961616382776,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC path [extra]]\": 0.0007780606106846077,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-UNC path]\": 0.0006336607985640941,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-bare UNC mount]\": 0.000672415559483729,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-drive [trailing]]\": 0.0006216172607814087,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-drive]\": 0.0007176111767842358,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-empty string]\": 0.0007092738527158865,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-empty tuple]\": 0.0006767110410371138,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-list[path]]\": 0.0006407484920226092,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-normal path [extra]]\": 0.0006850466695615832,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-normal path [trailing]]\": 0.0006040700299171489,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-normal path]\": 0.0009103183160486027,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-path;...]\": 0.0006410475243801781,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-relative [extra]]\": 0.0008129763495322108,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-relative]\": 0.0006868759097373807,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root [leading, trailing]]\": 0.0007873424460855086,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root [leading]]\": 0.0006051532668125671,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [extra]]\": 0.000718092357430318,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [leading, trailing]]\": 0.0005867871244438576,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [leading]]\": 0.0006391741586832968,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path [trailing]]\": 0.0012864639129483131,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path0]\": 0.0007375230952724553,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root path1]\": 0.0006009742686043577,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-root]\": 0.0006055560010948059,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[cygpath-tuple[path, ...]]\": 0.0009616153224438033,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-None]\": 0.000583399724108783,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC mount [trailing]]\": 0.0006825837444746914,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC mount]\": 0.0006588296388148699,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC path [extra]]\": 0.0006964163738053035,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-UNC path]\": 0.0006295421701803198,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-bare UNC mount]\": 0.0006976643186210208,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-drive [trailing]]\": 0.0007266043861334062,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-drive]\": 0.0006880372097976622,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-empty string]\": 0.000691993812970392,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-empty tuple]\": 0.0006839924966444128,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-list[path]]\": 0.0006202682703310224,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-normal path [extra]]\": 0.0006580235376453377,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-normal path [trailing]]\": 0.000935783092110122,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-normal path]\": 0.0008771051575449814,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-path;...]\": 0.0007039496325251371,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-relative [extra]]\": 0.0005891864339719983,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-relative]\": 0.000637108171044809,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root [leading, trailing]]\": 0.0005848667185799803,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root [leading]]\": 0.0007676550072485541,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [extra]]\": 0.0008967278909142941,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [leading, trailing]]\": 0.0006520894203079871,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [leading]]\": 0.0007204091765220965,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path [trailing]]\": 0.0010685797792365657,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path0]\": 0.0006824780219712794,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root path1]\": 0.0020239421604605046,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-root]\": 0.0007120733889815089,\n    \"tests/common/path/test_windows.py::test_unix_path_to_win[fallback-tuple[path, ...]]\": 0.0007837358480275475,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-None]\": 0.0011972140882540666,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-empty string]\": 0.0011576889863508686,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-empty tuple]\": 0.000750807128730337,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-list[path]]\": 0.0012310246489356572,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-path;...]\": 0.000600292999397356,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-path]\": 0.0012267076529786935,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[cygpath-tuple[path, ...]]\": 0.0006103735772063464,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[fallback-None]\": 0.0006601936293816036,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[fallback-empty string]\": 0.0020737905389305953,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[fallback-empty tuple]\": 0.0007871527523475369,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[fallback-list[path]]\": 0.0005719682192100964,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[fallback-path;...]\": 0.0006789062949440461,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[fallback-path]\": 0.0006445781227168047,\n    \"tests/common/path/test_windows.py::test_win_path_to_unix[fallback-tuple[path, ...]]\": 0.002097326801864817,\n    \"tests/common/pkg_formats/test_python.py::test_basepydist_load_requires_provides_file\": 0.005227775036523911,\n    \"tests/common/pkg_formats/test_python.py::test_basepydist_parse_entries_file_data\": 0.005134911817207406,\n    \"tests/common/pkg_formats/test_python.py::test_basepydist_parse_requires_file_data\": 0.005870912219476517,\n    \"tests/common/pkg_formats/test_python.py::test_dist_get_paths\": 0.009237111883252538,\n    \"tests/common/pkg_formats/test_python.py::test_dist_get_paths_no_paths\": 0.003240645340717558,\n    \"tests/common/pkg_formats/test_python.py::test_evaluate_marker\": 0.004924061786780196,\n    \"tests/common/pkg_formats/test_python.py::test_get_default_marker_context\": 0.002984451610242093,\n    \"tests/common/pkg_formats/test_python.py::test_get_dist_file_from_egg_link\": 0.012343905739832647,\n    \"tests/common/pkg_formats/test_python.py::test_get_dist_requirements\": 0.005025597898778231,\n    \"tests/common/pkg_formats/test_python.py::test_get_entry_points\": 0.005496658292959356,\n    \"tests/common/pkg_formats/test_python.py::test_get_extra_provides\": 0.005224841489127819,\n    \"tests/common/pkg_formats/test_python.py::test_get_python_distribution_info\": 0.0006656361420401405,\n    \"tests/common/pkg_formats/test_python.py::test_get_site_packages_anchor_files\": 0.0066652873466270905,\n    \"tests/common/pkg_formats/test_python.py::test_metadata[path0-False-False-False-False]\": 0.007154048193420876,\n    \"tests/common/pkg_formats/test_python.py::test_metadata[path1-True-False-False-False]\": 0.004585094997313455,\n    \"tests/common/pkg_formats/test_python.py::test_metadata[path2-True-True-True-False]\": 0.005988491895772561,\n    \"tests/common/pkg_formats/test_python.py::test_metadata[path3-True-True-True-True]\": 0.004691746006945139,\n    \"tests/common/pkg_formats/test_python.py::test_metadata_keys\": 0.0030577413502148308,\n    \"tests/common/pkg_formats/test_python.py::test_metadata_none\": 0.004759355378544362,\n    \"tests/common/pkg_formats/test_python.py::test_metadata_process_path\": 0.003870250809144012,\n    \"tests/common/pkg_formats/test_python.py::test_metadata_read_metadata\": 0.011036319696959306,\n    \"tests/common/pkg_formats/test_python.py::test_norm_package_name\": 0.0035794390713264584,\n    \"tests/common/pkg_formats/test_python.py::test_norm_package_version\": 0.014520294983315338,\n    \"tests/common/pkg_formats/test_python.py::test_parse_specification\": 0.007727442206697122,\n    \"tests/common/pkg_formats/test_python.py::test_pydist_check_files\": 0.008222286928074814,\n    \"tests/common/pkg_formats/test_python.py::test_pypi_name_to_conda_name\": 0.003401164250312268,\n    \"tests/common/pkg_formats/test_python.py::test_python_dist_egg_fpath\": 0.0037890729413496502,\n    \"tests/common/pkg_formats/test_python.py::test_python_dist_egg_path\": 0.004613451142665216,\n    \"tests/common/pkg_formats/test_python.py::test_python_dist_info\": 0.0058709553586240495,\n    \"tests/common/pkg_formats/test_python.py::test_python_dist_info_conda_dependencies\": 0.007868911627227183,\n    \"tests/common/pkg_formats/test_python.py::test_python_dist_info_conda_dependencies_2\": 0.0041893806837673304,\n    \"tests/common/pkg_formats/test_python.py::test_python_dist_info_conda_dependencies_3\": 0.0038228565449401402,\n    \"tests/common/pkg_formats/test_python.py::test_split_spec\": 0.004495004127082688,\n    \"tests/common/test_configuration.py::test_commented_map_parameter\": 0.0051739354155486235,\n    \"tests/common/test_configuration.py::test_config_resets\": 0.004114425395768272,\n    \"tests/common/test_configuration.py::test_cross_parameter_validation\": 0.0034403296553198776,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/$$/suffix]\": 0.0027326348550631378,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/$/suffix]\": 0.004726015543918719,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/$1/suffix]\": 0.03316815436208151,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/$MISSING/suffix]\": 0.0026237832777487044,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/$VARIABLE/suffix]\": 0.0042689169437887635,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/${1}/suffix]\": 0.0042183517158644775,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/${MISSING}/suffix]\": 0.002846775310372992,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/${VARIABLE}/suffix]\": 0.003177793792810921,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/${}/suffix]\": 0.004969198119471815,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/%%/suffix]\": 0.0030005974632113072,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/%/suffix]\": 0.0029405791898407412,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/%1%/suffix]\": 0.005655849744261785,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/%1/suffix]\": 0.003313865708939363,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/%MISSING%/suffix]\": 0.0026444744116279222,\n    \"tests/common/test_configuration.py::test_custom_expandvars[prefix/%VARIABLE%/suffix]\": 0.002292194104893909,\n    \"tests/common/test_configuration.py::test_default_values\": 0.003635335645460834,\n    \"tests/common/test_configuration.py::test_empty_map_parameter\": 0.008608042380590285,\n    \"tests/common/test_configuration.py::test_env_var_config\": 0.00355963916508043,\n    \"tests/common/test_configuration.py::test_env_var_config_alias\": 0.004412534905829284,\n    \"tests/common/test_configuration.py::test_env_var_config_empty_sequence\": 0.003272938587753559,\n    \"tests/common/test_configuration.py::test_env_var_config_no_split_sequence\": 0.004015724917374263,\n    \"tests/common/test_configuration.py::test_env_var_config_split_sequence\": 0.003808693525968047,\n    \"tests/common/test_configuration.py::test_expand_search_path\": 0.005319746266180404,\n    \"tests/common/test_configuration.py::test_expanded_variables\": 0.009516669125849132,\n    \"tests/common/test_configuration.py::test_important_primitive_map_merges\": 0.12263226124933446,\n    \"tests/common/test_configuration.py::test_invalid_map_parameter\": 0.003312476088939994,\n    \"tests/common/test_configuration.py::test_invalid_seq_parameter\": 0.0034735181411411995,\n    \"tests/common/test_configuration.py::test_list_merges\": 0.10965989274390452,\n    \"tests/common/test_configuration.py::test_load_raw_configs\": 0.02276391159969462,\n    \"tests/common/test_configuration.py::test_map_parameter_must_be_map\": 0.006666952178667356,\n    \"tests/common/test_configuration.py::test_nested\": 0.021939370293320562,\n    \"tests/common/test_configuration.py::test_object\": 0.013784099086462767,\n    \"tests/common/test_configuration.py::test_object_defaults_completely_empty\": 0.003825835010187201,\n    \"tests/common/test_configuration.py::test_object_defaults_partially_empty\": 0.006999122522916413,\n    \"tests/common/test_configuration.py::test_parameter\": 0.0030529405927571785,\n    \"tests/common/test_configuration.py::test_parameter_flag\": 0.0027898581799104243,\n    \"tests/common/test_configuration.py::test_pretty_list\": 0.0033184966324401235,\n    \"tests/common/test_configuration.py::test_raise_errors\": 0.002743071093634317,\n    \"tests/common/test_configuration.py::test_set_search_path_empty_path\": 0.002814155453014777,\n    \"tests/common/test_configuration.py::test_set_search_path_reflects_fs_changes[dir-child-added]\": 0.013585315796836639,\n    \"tests/common/test_configuration.py::test_set_search_path_reflects_fs_changes[file-created]\": 0.007695463374963296,\n    \"tests/common/test_configuration.py::test_set_search_path_reflects_fs_changes[file-removed]\": 0.023534776437596605,\n    \"tests/common/test_configuration.py::test_set_search_path_refreshes_on_new_path[channels_a0-channels_b0]\": 0.013216622453109395,\n    \"tests/common/test_configuration.py::test_set_search_path_refreshes_on_new_path[channels_a1-channels_b1]\": 0.011957342874955756,\n    \"tests/common/test_configuration.py::test_set_search_path_reloads_raw_data\": 0.014996308046853812,\n    \"tests/common/test_configuration.py::test_set_search_path_result_is_tuple\": 0.007394888500018126,\n    \"tests/common/test_configuration.py::test_simple_merges_and_caching\": 0.023332687095134405,\n    \"tests/common/test_configuration.py::test_unique_sequence_map_error_with_duplicates\": 0.005650394043768655,\n    \"tests/common/test_configuration.py::test_unique_sequence_map_error_with_unique_key\": 0.004955582528325604,\n    \"tests/common/test_configuration.py::test_validate_all\": 0.017733264919725527,\n    \"tests/common/test_configuration.py::test_validation\": 0.04568553188130778,\n    \"tests/common/test_io.py::test_attach_stderr_handler\": 0.00458968319662292,\n    \"tests/common/test_io.py::test_captured\": 0.004133917155135087,\n    \"tests/common/test_io.py::test_thread_limited_executor_handles_thread_limit[ThreadLimitedThreadPoolExecutor-False]\": 0.19391892730796367,\n    \"tests/common/test_io.py::test_thread_limited_executor_handles_thread_limit[ThreadPoolExecutor-True]\": 0.006819105401183367,\n    \"tests/common/test_json.py::test_condajsonencoder_serialises_frozendicts\": 0.00354492466998237,\n    \"tests/common/test_json.py::test_condajsonencoder_with_dumps\": 0.003418280780638652,\n    \"tests/common/test_logic.py::test_ALL\": 2.756717892724152,\n    \"tests/common/test_logic.py::test_AMONE\": 3.347243580173973,\n    \"tests/common/test_logic.py::test_AND\": 0.03077960049895598,\n    \"tests/common/test_logic.py::test_ANY\": 2.508851914611521,\n    \"tests/common/test_logic.py::test_ITE\": 0.9608413175544794,\n    \"tests/common/test_logic.py::test_LinearBound\": 4.366124800004874,\n    \"tests/common/test_logic.py::test_NOT\": 0.007489886875498232,\n    \"tests/common/test_logic.py::test_OR\": 0.026421369982818917,\n    \"tests/common/test_logic.py::test_XONE\": 0.4672541242990909,\n    \"tests/common/test_logic.py::test_XOR\": 0.03740363807181712,\n    \"tests/common/test_logic.py::test_minimal_unsatisfiable_subset\": 0.007222076235232602,\n    \"tests/common/test_logic.py::test_minimize\": 0.007664233495885581,\n    \"tests/common/test_logic.py::test_sat\": 0.004293599944179671,\n    \"tests/common/test_path.py::test_deprecations[KNOWN_EXTENSIONS-TypeError]\": 0.004909157877155806,\n    \"tests/common/test_path.py::test_deprecations[is_package_file-TypeError]\": 0.0037562023649282215,\n    \"tests/common/test_path.py::test_get_major_minor_version_no_dot\": 0.00407456093386897,\n    \"tests/common/test_path.py::test_missing_pyc_files_27\": 0.0031226663387389844,\n    \"tests/common/test_path.py::test_missing_pyc_files_34\": 0.0034437840670360855,\n    \"tests/common/test_path.py::test_missing_pyc_files_35\": 0.0031349250946891586,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH0]\": 0.0006875780547535323,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH10]\": 0.0005978371701879533,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH11]\": 0.0009457928351333119,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH1]\": 0.0006691491429616735,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH2]\": 0.0007398573871869653,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH3]\": 0.0005926236912956128,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH4]\": 0.0007173280016867956,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH5]\": 0.0006781852369540785,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH6]\": 0.0009092870183971558,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH7]\": 0.0006409511510460491,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH8]\": 0.0007743392250344329,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-PATH9]\": 0.0005695669173892395,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC0]\": 0.014645853699819914,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC1]\": 0.0006895199615804795,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC2]\": 0.0006073269522035286,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC3]\": 0.0005556559433619238,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC4]\": 0.0005356858952734024,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC5]\": 0.0005456012669103987,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC6]\": 0.0006003295241211664,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-UNC7]\": 0.0006192516588410506,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-cwd0]\": 0.0006339980577659686,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-cwd1]\": 0.0005680082927998644,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-cwd2]\": 0.0006029854030948156,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-cwd3]\": 0.000589072014763883,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive0]\": 0.0005647556741638074,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive10]\": 0.0006896710583298257,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive11]\": 0.000645147407214615,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive12]\": 0.0006215436964679803,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive13]\": 0.0006222824937530875,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive14]\": 0.0007360633799517931,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive15]\": 0.0006504512897213235,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive1]\": 0.0005658302172681367,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive2]\": 0.0005661015254686781,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive3]\": 0.0013674254393792773,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive4]\": 0.0009276206789984968,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive5]\": 0.0005508833184659592,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive6]\": 0.0005765302691062832,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive7]\": 0.0006725334223450086,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive8]\": 0.0005506570475138254,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-drive9]\": 0.0006117658438119769,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-relative0]\": 0.000736046832577913,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-relative1]\": 0.0007442219346851153,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-relative2]\": 0.0005913936877942882,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root0]\": 0.0005885300640303139,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root10]\": 0.0007654191129811603,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root11]\": 0.000662137866554387,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root12]\": 0.0006260197031504781,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root13]\": 0.0006894778587666903,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root14]\": 0.0005684538032528952,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root1]\": 0.0007192991536351444,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root2]\": 0.0007503717966135758,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root3]\": 0.0006905142813454208,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root4]\": 0.0006394588115435617,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root5]\": 0.0007807786162236136,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root6]\": 0.000561786288066849,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root7]\": 0.0008010079767085247,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root8]\": 0.0005881558209148763,\n    \"tests/common/test_path.py::test_path_conversion[cygpath-root9]\": 0.0006083838490591724,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH0]\": 0.012143254323001186,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH10]\": 0.014439384663435065,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH11]\": 0.01754741474319557,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH1]\": 0.015457551751542778,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH2]\": 0.01792410866508783,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH3]\": 0.012644000943189803,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH4]\": 0.018894928222047375,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH5]\": 0.01358987073894361,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH6]\": 0.012274243478998399,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH7]\": 0.013849931401283686,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH8]\": 0.02489308633882055,\n    \"tests/common/test_path.py::test_path_conversion[fallback-PATH9]\": 0.011311560589592547,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC0]\": 0.01811487353062487,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC1]\": 0.018919055950738856,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC2]\": 0.01785246637464084,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC3]\": 0.012350900764667848,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC4]\": 0.012315094990866693,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC5]\": 0.02160250086250047,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC6]\": 0.01137341589141038,\n    \"tests/common/test_path.py::test_path_conversion[fallback-UNC7]\": 0.014299157041084575,\n    \"tests/common/test_path.py::test_path_conversion[fallback-cwd0]\": 0.025126988407717845,\n    \"tests/common/test_path.py::test_path_conversion[fallback-cwd1]\": 0.007519554325568393,\n    \"tests/common/test_path.py::test_path_conversion[fallback-cwd2]\": 0.0121594010776337,\n    \"tests/common/test_path.py::test_path_conversion[fallback-cwd3]\": 0.022142061452648448,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive0]\": 0.0132082522604287,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive10]\": 0.02683783777919012,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive11]\": 0.016269014459964273,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive12]\": 0.016181483258296128,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive13]\": 0.01727412983893589,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive14]\": 0.02212376097194027,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive15]\": 0.01609262433993368,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive1]\": 0.01451577751745586,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive2]\": 0.0175666277728228,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive3]\": 0.01659095530716004,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive4]\": 0.023880558869248843,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive5]\": 0.013097877768191078,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive6]\": 0.013155749565254803,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive7]\": 0.013970152513894258,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive8]\": 0.01723593493822127,\n    \"tests/common/test_path.py::test_path_conversion[fallback-drive9]\": 0.019346367806917966,\n    \"tests/common/test_path.py::test_path_conversion[fallback-relative0]\": 0.01680511352810292,\n    \"tests/common/test_path.py::test_path_conversion[fallback-relative1]\": 0.019248715504626715,\n    \"tests/common/test_path.py::test_path_conversion[fallback-relative2]\": 0.016298850029785976,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root0]\": 0.045396263842502366,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root10]\": 0.011267186069714039,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root11]\": 0.013447001825100566,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root12]\": 0.01858397894245273,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root13]\": 0.01991375220090876,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root14]\": 0.013943253420175014,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root1]\": 0.013831772653662392,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root2]\": 0.012439113126567227,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root3]\": 0.014074125302581925,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root4]\": 0.019873640600642516,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root5]\": 0.010740019861525611,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root6]\": 0.012955940727346344,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root7]\": 0.01877266108076609,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root8]\": 0.02079473782404345,\n    \"tests/common/test_path.py::test_path_conversion[fallback-root9]\": 0.013119852336611726,\n    \"tests/common/test_path.py::test_path_conversion_falsy[None]\": 0.0034709663121428014,\n    \"tests/common/test_path.py::test_path_conversion_falsy[empty dict]\": 0.0036958020441130593,\n    \"tests/common/test_path.py::test_path_conversion_falsy[empty list]\": 0.003538778969450382,\n    \"tests/common/test_path.py::test_path_conversion_falsy[empty set]\": 0.0032033138804167974,\n    \"tests/common/test_path.py::test_path_conversion_falsy[empty tuple]\": 0.0031143895242301167,\n    \"tests/common/test_path.py::test_path_identity\": 0.004953138321427424,\n    \"tests/common/test_path.py::test_strip_pkg_extension[/path/numpy-1.26.4-py312h8753938_0-/path/numpy-1.26.4-py312h8753938_0-None]\": 0.004910118351645267,\n    \"tests/common/test_path.py::test_strip_pkg_extension[/path/numpy-1.26.4-py312h8753938_0.tar.bz2-/path/numpy-1.26.4-py312h8753938_0-.tar.bz2]\": 0.005421335042689447,\n    \"tests/common/test_path.py::test_strip_pkg_extension[/path/pandas-2.2.3-py312h526ad5a_1.conda-/path/pandas-2.2.3-py312h526ad5a_1-.conda]\": 0.003661148858300275,\n    \"tests/common/test_path.py::test_strip_pkg_extension[requests-2.32.3-py313h06a4308_0.tar.bz2-requests-2.32.3-py313h06a4308_0-.tar.bz2]\": 0.004084425568241236,\n    \"tests/common/test_path.py::test_strip_pkg_extension[zlib-1.3.1-h5f15de7_0-zlib-1.3.1-h5f15de7_0-None]\": 0.0051500590811039415,\n    \"tests/common/test_path.py::test_strip_pkg_extension[zlib-1.3.1-h5f15de7_0.conda-zlib-1.3.1-h5f15de7_0-.conda]\": 0.003996153859158005,\n    \"tests/common/test_path.py::test_url_to_path_unix\": 0.0036685959907119953,\n    \"tests/common/test_path.py::test_url_to_path_windows_local\": 0.003996446980099536,\n    \"tests/common/test_path.py::test_url_to_path_windows_unc\": 0.003352684482743122,\n    \"tests/common/test_path.py::test_win_path_backout\": 0.002834767324831614,\n    \"tests/common/test_serialize.py::test_comment_round_trip\": 0.013835456142104836,\n    \"tests/common/test_serialize.py::test_deprecations[_yaml_round_trip-None]\": 0.003895951251079281,\n    \"tests/common/test_serialize.py::test_deprecations[_yaml_safe-None]\": 0.003724430805011125,\n    \"tests/common/test_serialize.py::test_deprecations[json_dump-TypeError]\": 0.0035926880583380077,\n    \"tests/common/test_serialize.py::test_deprecations[yaml_round_trip_dump-TypeError]\": 0.0033047921408034275,\n    \"tests/common/test_serialize.py::test_deprecations[yaml_round_trip_load-TypeError]\": 0.0031965748721062156,\n    \"tests/common/test_serialize.py::test_deprecations[yaml_safe_dump-TypeError]\": 0.004038597254584728,\n    \"tests/common/test_serialize.py::test_deprecations[yaml_safe_load-TypeError]\": 0.0035347253771635828,\n    \"tests/common/test_serialize.py::test_encode_enum[value0-  - disabled\\\\n-write]\": 0.004599904815586969,\n    \"tests/common/test_serialize.py::test_encode_enum[value1-  - warn\\\\n-write]\": 0.004032598009081814,\n    \"tests/common/test_serialize.py::test_encode_enum[value2-  - enabled\\\\n-write]\": 0.004094070613889649,\n    \"tests/common/test_serialize.py::test_encode_enum[value3-[\\\\n  \\\"disabled\\\"\\\\n]-write]\": 0.0038115137958931494,\n    \"tests/common/test_serialize.py::test_encode_enum[value4-[\\\\n  \\\"warn\\\"\\\\n]-write]\": 0.0035213329052632067,\n    \"tests/common/test_serialize.py::test_encode_enum[value5-[\\\\n  \\\"enabled\\\"\\\\n]-write]\": 0.003989260651054296,\n    \"tests/common/test_serialize.py::test_read_write[obj0-{\\\\n  \\\"a_map\\\": {\\\\n    \\\"a_key\\\": \\\"a_value\\\"\\\\n  },\\\\n  \\\"a_seq\\\": [\\\\n    1,\\\\n    2,\\\\n    3\\\\n  ]\\\\n}-read-write0]\": 0.012125641054191484,\n    \"tests/common/test_serialize.py::test_read_write[obj1-{\\\\n  \\\"a_map\\\": {\\\\n    \\\"field1\\\": true,\\\\n    \\\"field2\\\": \\\"yes\\\"\\\\n  },\\\\n  \\\"a_seq_1\\\": [\\\\n    1,\\\\n    2,\\\\n    3\\\\n  ],\\\\n  \\\"a_seq_2\\\": [\\\\n    1,\\\\n    {\\\\n      \\\"two\\\": 2\\\\n    },\\\\n    3\\\\n  ],\\\\n  \\\"single_bool\\\": false,\\\\n  \\\"single_str\\\": \\\"no\\\"\\\\n}-read-write1]\": 0.009266785134944295,\n    \"tests/common/test_serialize.py::test_read_write[obj2-a_seq:\\\\n  - 1\\\\n  - 2\\\\n  - 3\\\\na_map:\\\\n  a_key: a_value\\\\n-read-write]\": 0.023837262102113885,\n    \"tests/common/test_serialize.py::test_read_write[obj3-single_bool: false\\\\nsingle_str: no\\\\na_seq_1:\\\\n  - 1\\\\n  - 2\\\\n  - 3\\\\na_seq_2:\\\\n  - 1\\\\n  - two: 2\\\\n  - 3\\\\na_map:\\\\n  field1: true\\\\n  field2: yes\\\\n-read-write]\": 0.035519722967826746,\n    \"tests/common/test_toposort.py::test_cycle\": 0.002950674984673941,\n    \"tests/common/test_toposort.py::test_cycle_best_effort\": 0.003559884338232368,\n    \"tests/common/test_toposort.py::test_degenerate\": 0.002734412663037646,\n    \"tests/common/test_toposort.py::test_pop_key\": 0.00425110562245914,\n    \"tests/common/test_toposort.py::test_python_is_prioritized\": 0.003128746372682474,\n    \"tests/common/test_toposort.py::test_simple\": 0.0029473628550642414,\n    \"tests/common/test_url.py::test_add_username_and_pass_to_url\": 0.0032557115677339706,\n    \"tests/common/test_url.py::test_is_ip_address\": 0.002878467687169964,\n    \"tests/common/test_url.py::test_is_ipv6_address\": 0.0030545264761379313,\n    \"tests/common/test_url.py::test_is_url\": 0.0033091827082634114,\n    \"tests/common/test_url.py::test_maybe_add_auth\": 0.0029210059390698904,\n    \"tests/common/test_url.py::test_split_scheme_auth_token\": 0.003230238316065342,\n    \"tests/common/test_url.py::test_url_obj_unparse[test_url_obj0-http://conda.io/path/to/somewhere]\": 0.0031128436101296795,\n    \"tests/common/test_url.py::test_url_obj_unparse[test_url_obj1-https://user:pass@conda.io/path/to/somewhere]\": 0.003253303672939624,\n    \"tests/common/test_url.py::test_url_obj_unparse[test_url_obj2-file:///opt/happy/path]\": 0.003484469608890532,\n    \"tests/common/test_url.py::test_url_obj_unparse[test_url_obj3-file:///path/to/something.txt]\": 0.004757516156196878,\n    \"tests/common/test_url.py::test_url_to_s3_info\": 0.002993639015935145,\n    \"tests/common/test_url.py::test_urlparse[192.168.1.1:8080/path/to/resource-exp_url_obj0]\": 0.005251884765595636,\n    \"tests/common/test_url.py::test_urlparse[file:///opt/happy/path-exp_url_obj2]\": 0.005463833736991429,\n    \"tests/common/test_url.py::test_urlparse[https://conda.io/happy/path-exp_url_obj1]\": 0.0033445591617967427,\n    \"tests/common/test_url.py::test_urlparse[https://u:p@conda.io/t/x1029384756/more/path-exp_url_obj3]\": 0.003182813373162183,\n    \"tests/core/test_envs_manager.py::test_list_all_known_prefixes_with_none_values_error\": 0.3099159523944974,\n    \"tests/core/test_envs_manager.py::test_list_all_known_prefixes_with_permission_error\": 0.38781568977856873,\n    \"tests/core/test_envs_manager.py::test_prefix_cli_flag\": 0.006274108524666918,\n    \"tests/core/test_envs_manager.py::test_register_env_directory_creation_error\": 0.010234471474925375,\n    \"tests/core/test_envs_manager.py::test_register_unregister_location_env\": 0.02627460447732026,\n    \"tests/core/test_envs_manager.py::test_rewrite_environments_txt_file\": 0.010910020008361328,\n    \"tests/core/test_index.py::TestIndex::test_cache_entries[False]\": 0.9656795576861524,\n    \"tests/core/test_index.py::TestIndex::test_cache_entries[True]\": 1.5175450114028783,\n    \"tests/core/test_index.py::TestIndex::test_contains_invalid[False]\": 0.5629270091181878,\n    \"tests/core/test_index.py::TestIndex::test_contains_invalid[True]\": 1.1430146777453976,\n    \"tests/core/test_index.py::TestIndex::test_contains_valid[False]\": 0.5505920671978967,\n    \"tests/core/test_index.py::TestIndex::test_contains_valid[True]\": 1.0066724928308626,\n    \"tests/core/test_index.py::TestIndex::test_copy[False]\": 1.4041396454709074,\n    \"tests/core/test_index.py::TestIndex::test_copy[True]\": 1.069720036561334,\n    \"tests/core/test_index.py::TestIndex::test_getitem_cache[False]\": 0.49489408118954387,\n    \"tests/core/test_index.py::TestIndex::test_getitem_cache[True]\": 1.0000899938999954,\n    \"tests/core/test_index.py::TestIndex::test_getitem_channel[False]\": 0.49212625792811654,\n    \"tests/core/test_index.py::TestIndex::test_getitem_channel[True]\": 1.1219207306349435,\n    \"tests/core/test_index.py::TestIndex::test_getitem_channel_invalid[False]\": 0.7744071683531154,\n    \"tests/core/test_index.py::TestIndex::test_getitem_channel_invalid[True]\": 1.1606420817769654,\n    \"tests/core/test_index.py::TestIndex::test_getitem_feature[False]\": 0.5895745644188031,\n    \"tests/core/test_index.py::TestIndex::test_getitem_feature[True]\": 1.1496216123272218,\n    \"tests/core/test_index.py::TestIndex::test_getitem_feature_non_existent[False]\": 0.5752471572720255,\n    \"tests/core/test_index.py::TestIndex::test_getitem_feature_non_existent[True]\": 1.023410928792974,\n    \"tests/core/test_index.py::TestIndex::test_getitem_prefix[False]\": 0.6326690465685891,\n    \"tests/core/test_index.py::TestIndex::test_getitem_prefix[True]\": 0.9884861369929685,\n    \"tests/core/test_index.py::TestIndex::test_getitem_system_package_invalid[False]\": 0.9999787665163739,\n    \"tests/core/test_index.py::TestIndex::test_getitem_system_package_invalid[True]\": 1.0301007573018182,\n    \"tests/core/test_index.py::TestIndex::test_getitem_system_package_valid[False]\": 1.0566522043470803,\n    \"tests/core/test_index.py::TestIndex::test_getitem_system_package_valid[True]\": 0.9211343367822048,\n    \"tests/core/test_index.py::TestIndex::test_init_conflicting_subdirs\": 0.04983721012394079,\n    \"tests/core/test_index.py::TestIndex::test_init_prefix_data\": 0.051808106334195025,\n    \"tests/core/test_index.py::TestIndex::test_init_prefix_path\": 0.05487555765385172,\n    \"tests/core/test_index.py::TestIndex::test_init_use_local\": 0.05055917745378944,\n    \"tests/core/test_index.py::TestIndex::test_reduced_index[False]\": 1.450606385846588,\n    \"tests/core/test_index.py::TestIndex::test_reduced_index[True]\": 2.0056012516223216,\n    \"tests/core/test_index.py::test_calculate_channel_urls\": 0.11276382118280869,\n    \"tests/core/test_index.py::test_deprecations[calculate_channel_urls-None]\": 0.05548695525099707,\n    \"tests/core/test_index.py::test_dist_str_in_index\": 0.13542169431388265,\n    \"tests/core/test_index.py::test_get_index_lazy[conda-forge-sample_packages1]\": 3.1912817146241523,\n    \"tests/core/test_index.py::test_get_index_lazy[defaults-sample_packages0]\": 0.022178221994087668,\n    \"tests/core/test_index.py::test_get_index_platform[linux-64]\": 0.09761549423469519,\n    \"tests/core/test_index.py::test_get_index_platform[osx-64]\": 0.038813317919363266,\n    \"tests/core/test_index.py::test_get_index_platform[win-64]\": 0.05795228934121504,\n    \"tests/core/test_index.py::test_supplement_index_with_system\": 0.6325967623214792,\n    \"tests/core/test_index.py::test_supplement_index_with_system_archspec\": 0.44240074336698265,\n    \"tests/core/test_index.py::test_supplement_index_with_system_cuda\": 0.513732635979904,\n    \"tests/core/test_index.py::test_supplement_index_with_system_glibc\": 0.0006165669330864846,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[1.2.3.4-1.2.3.4]\": 0.0007075613146060663,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[4.2-4.2]\": 0.0006510977128934718,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[4.2.0-42-generic-4.2.0]\": 0.0007149996708646786,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[4.2.1-4.2.1]\": 0.0006970747866614386,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[5.4.89+-5.4.89]\": 0.0006969887341219085,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[5.5-rc1-5.5]\": 0.0005485094410185856,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[9.1.a-9.1]\": 0.000570576423442472,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[9.1.a.2-9.1]\": 0.0006568850438280636,\n    \"tests/core/test_index.py::test_supplement_index_with_system_linux[9.a.1-0]\": 0.0008981458117493892,\n    \"tests/core/test_index.py::test_supplement_index_with_system_osx\": 0.826607114255116,\n    \"tests/core/test_initialize.py::test__get_python_info\": 0.05891490390175168,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_handle_double_semicolons]\": 0.018116550939613413,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_handle_leading_trailing_semicolons]\": 0.016439123777434166,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_to_empty_path]\": 0.1205699145074311,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_to_existing_path_without_condabin]\": 0.020427422430009643,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_when_condabin_exists_case_insensitive]\": 0.016695471069045238,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_when_condabin_exists_case_sensitive]\": 0.01740013856429237,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[add_when_condabin_exists_later_in_path]\": 0.018613442559966727,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[dry_run_add]\": 0.016818474036988787,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[dry_run_remove]\": 0.01717236302888625,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_handle_double_semicolons]\": 0.021726569933061133,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_handle_leading_trailing_semicolons]\": 0.01637569265369859,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_does_not_exist]\": 0.020257688883038163,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_at_beginning]\": 0.01736875109823934,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_at_end]\": 0.022993564153718882,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_case_insensitive]\": 0.01730905944533178,\n    \"tests/core/test_initialize.py::test_add_condabin_to_path_registry[remove_when_condabin_exists_in_middle]\": 0.018222864125959783,\n    \"tests/core/test_initialize.py::test_conda_init_dry_run\": 0.14910865015037233,\n    \"tests/core/test_initialize.py::test_get_python_info\": 0.07871987160278733,\n    \"tests/core/test_initialize.py::test_init_all\": 2.0238352989694013,\n    \"tests/core/test_initialize.py::test_init_cmd_exe_registry\": 0.0005966586131206122,\n    \"tests/core/test_initialize.py::test_init_condabin[init_fish_user]\": 0.007747144738820211,\n    \"tests/core/test_initialize.py::test_init_condabin[init_powershell_user]\": 0.009019458792071375,\n    \"tests/core/test_initialize.py::test_init_condabin[init_sh_system]\": 0.007134259322674937,\n    \"tests/core/test_initialize.py::test_init_condabin[init_sh_user]\": 0.008842351200822156,\n    \"tests/core/test_initialize.py::test_init_condabin[init_xonsh_user]\": 0.006556474002081276,\n    \"tests/core/test_initialize.py::test_init_enable_long_path\": 0.0006557304775809802,\n    \"tests/core/test_initialize.py::test_init_sh_system\": 0.08961192829845717,\n    \"tests/core/test_initialize.py::test_init_sh_user_tcsh_unix\": 0.0932886564295176,\n    \"tests/core/test_initialize.py::test_init_sh_user_unix\": 0.09434601043090944,\n    \"tests/core/test_initialize.py::test_init_sh_user_windows\": 0.0007965294089348674,\n    \"tests/core/test_initialize.py::test_initialize_dev_bash\": 0.2878900732966253,\n    \"tests/core/test_initialize.py::test_initialize_dev_cmd_exe\": 0.25448875089783735,\n    \"tests/core/test_initialize.py::test_install_1\": 0.19366922342252255,\n    \"tests/core/test_initialize.py::test_install_conda_csh\": 0.10182793648767785,\n    \"tests/core/test_initialize.py::test_install_conda_fish\": 0.11141216922424621,\n    \"tests/core/test_initialize.py::test_install_conda_sh\": 0.0969485782984388,\n    \"tests/core/test_initialize.py::test_install_conda_xsh\": 0.0916917260056276,\n    \"tests/core/test_initialize.py::test_install_condabin_conda_bat\": 0.1096576299247437,\n    \"tests/core/test_initialize.py::test_make_entry_point\": 0.10507954685840468,\n    \"tests/core/test_initialize.py::test_make_entry_point_exe\": 0.007406999753535747,\n    \"tests/core/test_initialize.py::test_make_initialize_plan_bash_zsh\": 0.18717807187734492,\n    \"tests/core/test_initialize.py::test_make_initialize_plan_cmd_exe\": 0.1563647339615858,\n    \"tests/core/test_initialize.py::test_make_install_plan\": 0.007085649887314763,\n    \"tests/core/test_initialize.py::test_print_plan_results_dry_run_with_changes\": 0.032353376685428016,\n    \"tests/core/test_initialize.py::test_print_plan_results_dry_run_with_no_changes\": 0.016351515447575238,\n    \"tests/core/test_initialize.py::test_print_plan_results_real_run_no_changes\": 0.016048943317492726,\n    \"tests/core/test_initialize.py::test_print_plan_results_real_run_with_changes\": 0.016074717757144082,\n    \"tests/core/test_link.py::test_calculate_change_report_downgrade\": 0.007059380367733946,\n    \"tests/core/test_link.py::test_calculate_change_report_revised_variant\": 0.0066939743309328645,\n    \"tests/core/test_link.py::test_calculate_change_report_superseded\": 0.006212800320457585,\n    \"tests/core/test_link.py::test_calculate_change_report_update\": 0.005409209894300441,\n    \"tests/core/test_package_cache_data.py::test_ProgressiveFetchExtract_prefers_conda_v2_format\": 0.03947574181540134,\n    \"tests/core/test_package_cache_data.py::test_conda_pkg_in_pkg_cache_doesnt_overwrite_tar_bz2\": 0.07643511851662026,\n    \"tests/core/test_package_cache_data.py::test_cover_extract_bad_package\": 0.1299287236298144,\n    \"tests/core/test_package_cache_data.py::test_cover_fetch_not_exists\": 6.20799824105978,\n    \"tests/core/test_package_cache_data.py::test_cover_get_entry_to_link\": 0.01147963365808676,\n    \"tests/core/test_package_cache_data.py::test_cover_reverse\": 0.0033832071024860605,\n    \"tests/core/test_package_cache_data.py::test_download_filename_backward_compat_old_repodata\": 0.0054494525979037825,\n    \"tests/core/test_package_cache_data.py::test_download_filename_backward_compat_tar_bz2\": 0.005018506706265024,\n    \"tests/core/test_package_cache_data.py::test_download_filename_from_url_basename\": 0.00601524059473918,\n    \"tests/core/test_package_cache_data.py::test_instantiating_package_cache_when_both_tar_bz2_and_conda_exist\": 0.05207128076451573,\n    \"tests/core/test_package_cache_data.py::test_instantiating_package_cache_when_both_tar_bz2_and_conda_exist_read_only\": 0.13221555761135553,\n    \"tests/core/test_package_cache_data.py::test_instantiating_package_cache_when_unpacked_conda_exist\": 0.044149203406710615,\n    \"tests/core/test_package_cache_data.py::test_tar_bz2_in_cache_not_extracted\": 0.2338268289994743,\n    \"tests/core/test_package_cache_data.py::test_tar_bz2_in_pkg_cache_doesnt_overwrite_conda_pkg\": 0.10196042524689643,\n    \"tests/core/test_package_cache_data.py::test_tar_bz2_in_pkg_cache_used_instead_of_conda_pkg\": 0.08009272839826032,\n    \"tests/core/test_path_actions.py::test_CompileMultiPycAction_generic\": 0.004980171354877896,\n    \"tests/core/test_path_actions.py::test_CompileMultiPycAction_noarch_python\": 2.7068786166740866,\n    \"tests/core/test_path_actions.py::test_CreatePythonEntryPointAction_generic\": 0.005839000981527613,\n    \"tests/core/test_path_actions.py::test_CreatePythonEntryPointAction_noarch_python\": 0.008382781560152194,\n    \"tests/core/test_path_actions.py::test_create_file_link_actions\": 0.009176309333392755,\n    \"tests/core/test_path_actions.py::test_simple_LinkPathAction_copy\": 0.009604019810274346,\n    \"tests/core/test_path_actions.py::test_simple_LinkPathAction_directory\": 0.006184793450418865,\n    \"tests/core/test_path_actions.py::test_simple_LinkPathAction_hardlink\": 0.009514639388841388,\n    \"tests/core/test_path_actions.py::test_simple_LinkPathAction_softlink\": 0.008972357254880624,\n    \"tests/core/test_portability.py::test_escaped_prefix_replaced_only_shebang\": 0.005840809260387517,\n    \"tests/core/test_portability.py::test_replace_long_shebang_spaces_in_prefix\": 0.0036669362568943643,\n    \"tests/core/test_portability.py::test_replace_long_shebang_with_truncation_escaped_space\": 0.0030649119233229273,\n    \"tests/core/test_portability.py::test_replace_long_shebang_with_truncation_python\": 0.0035669592038981898,\n    \"tests/core/test_portability.py::test_replace_normal_shebang_spaces_in_prefix_escaped_space\": 0.0027799845888157523,\n    \"tests/core/test_portability.py::test_replace_normal_shebang_spaces_in_prefix_python\": 0.002868980507596821,\n    \"tests/core/test_portability.py::test_replace_simple_shebang_no_replacement\": 0.0031611180519486234,\n    \"tests/core/test_portability.py::test_shebang_regex_matches\": 0.0031816984582664115,\n    \"tests/core/test_prefix_data.py::test_api_consistency[conda]\": 0.5179736398386532,\n    \"tests/core/test_prefix_data.py::test_api_consistency[python]\": 0.5931565074966907,\n    \"tests/core/test_prefix_data.py::test_conda_package_recognized_windows[False]\": 0.0008546995708182835,\n    \"tests/core/test_prefix_data.py::test_conda_package_recognized_windows[True]\": 0.0008621708878449653,\n    \"tests/core/test_prefix_data.py::test_corrupt_json_conda_meta_json\": 0.0037357429553732577,\n    \"tests/core/test_prefix_data.py::test_corrupt_unicode_conda_meta_json\": 0.004460834925966369,\n    \"tests/core/test_prefix_data.py::test_dot_underscore_conda_meta_json_ignored\": 0.009350450452854497,\n    \"tests/core/test_prefix_data.py::test_empty_environment_package_methods\": 0.007581721396824864,\n    \"tests/core/test_prefix_data.py::test_get_conda_anchor_files_and_records\": 0.0049302325944687465,\n    \"tests/core/test_prefix_data.py::test_get_conda_packages_returns_sorted_list\": 0.6093062392750762,\n    \"tests/core/test_prefix_data.py::test_get_environment_env_vars\": 0.008129099812065648,\n    \"tests/core/test_prefix_data.py::test_get_packages_behavior_with_interoperability\": 23.51640536198004,\n    \"tests/core/test_prefix_data.py::test_get_python_packages_basic_functionality\": 0.6091804911071964,\n    \"tests/core/test_prefix_data.py::test_get_python_packages_with_pip_interoperability\": 0.5062350575878259,\n    \"tests/core/test_prefix_data.py::test_load_single_record_raises_on_corrupt_json[bad-json]\": 0.0060890711839105575,\n    \"tests/core/test_prefix_data.py::test_load_single_record_raises_on_corrupt_json[null-bytes-unicode-error]\": 0.006407431030806161,\n    \"tests/core/test_prefix_data.py::test_load_single_record_reads_bytes[record_data0]\": 0.0065816953628845916,\n    \"tests/core/test_prefix_data.py::test_method_consistency\": 0.5390110123811943,\n    \"tests/core/test_prefix_data.py::test_no_tokens_dumped[False]\": 0.011980674266037527,\n    \"tests/core/test_prefix_data.py::test_no_tokens_dumped[True]\": 0.012485102680904199,\n    \"tests/core/test_prefix_data.py::test_package_extraction_methods_types[get_conda_packages-expected_types0]\": 1.0054683540505176,\n    \"tests/core/test_prefix_data.py::test_package_extraction_methods_types[get_python_packages-expected_types1]\": 1.5555380654476567,\n    \"tests/core/test_prefix_data.py::test_package_extraction_package_counts[environment_packages0-0]\": 0.019186018662529048,\n    \"tests/core/test_prefix_data.py::test_package_extraction_package_counts[environment_packages1-1]\": 0.4521094275903264,\n    \"tests/core/test_prefix_data.py::test_package_extraction_package_counts[environment_packages2-2]\": 2.9429152897477158,\n    \"tests/core/test_prefix_data.py::test_package_methods_with_mock_data\": 0.007992291999811899,\n    \"tests/core/test_prefix_data.py::test_package_methods_with_required_python_packages\": 0.007480204359827178,\n    \"tests/core/test_prefix_data.py::test_pinned_specs_conda_meta_pinned\": 0.011800275452025423,\n    \"tests/core/test_prefix_data.py::test_pip_interop[envpy27osx]\": 1.0247627834418525,\n    \"tests/core/test_prefix_data.py::test_pip_interop[envpy27win_whl]\": 0.00058374640933928,\n    \"tests/core/test_prefix_data.py::test_pip_interop[envpy313tosx_whl]\": 0.9686105822475974,\n    \"tests/core/test_prefix_data.py::test_pip_interop[envpy37osx_whl]\": 1.0265557251180606,\n    \"tests/core/test_prefix_data.py::test_pip_interop[envpy37win]\": 0.0006189462440582555,\n    \"tests/core/test_prefix_data.py::test_prefix_data_equality[missing-None-False]\": 0.005961873191033136,\n    \"tests/core/test_prefix_data.py::test_prefix_data_equality[missing-missing-True]\": 0.0065287837675508265,\n    \"tests/core/test_prefix_data.py::test_prefix_data_equality[missing-{path}-False]\": 0.005060772106939999,\n    \"tests/core/test_prefix_data.py::test_prefix_data_equality[{path}-None-False]\": 0.006512833156458049,\n    \"tests/core/test_prefix_data.py::test_prefix_data_equality[{path}-missing-False]\": 0.005042829125092187,\n    \"tests/core/test_prefix_data.py::test_prefix_data_equality[{path}-{path}-True]\": 0.005275905394154476,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[ -True]\": 0.00757447679430215,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[!-False]\": 0.007654268557795169,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[#-True]\": 0.00784353950447723,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[%-False]\": 0.0076256400350628905,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[(-False]\": 0.007606719400634252,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[)-False]\": 0.008418877339186793,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[--False]\": 0.010826907121872446,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[.-False]\": 0.008106100704741302,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[0-False]\": 0.00762630120466623,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[=-False]\": 0.007241817436803426,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[A-False]\": 0.009964267830004977,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[^-False]\": 0.007729263129182488,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[_-False]\": 0.009211788554611761,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name[a-False]\": 0.009375960827924143,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name_base[False-True]\": 0.009969197939899425,\n    \"tests/core/test_prefix_data.py::test_prefix_data_validate_name_base[True-False]\": 0.009656770994558785,\n    \"tests/core/test_prefix_data.py::test_prefix_insertion_error\": 0.6322064783054031,\n    \"tests/core/test_prefix_data.py::test_set_unset_environment_env_vars\": 0.0101930216137936,\n    \"tests/core/test_prefix_data.py::test_set_unset_environment_env_vars_no_exist\": 0.007598417680087114,\n    \"tests/core/test_prefix_data.py::test_timestamps\": 1.8480606459025968,\n    \"tests/core/test_prefix_data.py::test_unset_reserved_env_vars\": 0.010108394832289433,\n    \"tests/core/test_prefix_data.py::test_warn_setting_reserved_env_vars\": 0.008360732709163179,\n    \"tests/core/test_solve.py::test_aggressive_update_packages[classic]\": 19.22151502797869,\n    \"tests/core/test_solve.py::test_aggressive_update_packages[libmamba]\": 13.81781370668515,\n    \"tests/core/test_solve.py::test_archspec_call[classic]\": 4.657810223577849,\n    \"tests/core/test_solve.py::test_archspec_call[libmamba]\": 2.7166934264794356,\n    \"tests/core/test_solve.py::test_auto_update_conda[classic]\": 11.774973342876153,\n    \"tests/core/test_solve.py::test_auto_update_conda[libmamba]\": 7.643028112669224,\n    \"tests/core/test_solve.py::test_broken_install[classic]\": 13.839733918430616,\n    \"tests/core/test_solve.py::test_broken_install[libmamba]\": 0.017058523353599128,\n    \"tests/core/test_solve.py::test_channel_priority_churn_minimized[classic]\": 22.607387487626877,\n    \"tests/core/test_solve.py::test_channel_priority_churn_minimized[libmamba]\": 1.7207832292123877,\n    \"tests/core/test_solve.py::test_conda_downgrade[classic]\": 63.80198235238613,\n    \"tests/core/test_solve.py::test_conda_downgrade[libmamba]\": 14.514362270877418,\n    \"tests/core/test_solve.py::test_cuda_1[classic]\": 3.1975558073134756,\n    \"tests/core/test_solve.py::test_cuda_1[libmamba]\": 1.8940040156762754,\n    \"tests/core/test_solve.py::test_cuda_2[classic]\": 2.8754149482493507,\n    \"tests/core/test_solve.py::test_cuda_2[libmamba]\": 1.9685188882180233,\n    \"tests/core/test_solve.py::test_cuda_constrain_absent[classic]\": 2.7362997690762967,\n    \"tests/core/test_solve.py::test_cuda_constrain_absent[libmamba]\": 2.5127615077235235,\n    \"tests/core/test_solve.py::test_cuda_constrain_sat[classic]\": 0.0006456608691912531,\n    \"tests/core/test_solve.py::test_cuda_constrain_sat[libmamba]\": 0.0007067062209542789,\n    \"tests/core/test_solve.py::test_cuda_constrain_unsat[classic]\": 0.0007596077851713936,\n    \"tests/core/test_solve.py::test_cuda_constrain_unsat[libmamba]\": 0.0005652628782099066,\n    \"tests/core/test_solve.py::test_cuda_fail_1[classic]\": 2.9830353101623137,\n    \"tests/core/test_solve.py::test_cuda_fail_1[libmamba]\": 1.7154198349937522,\n    \"tests/core/test_solve.py::test_cuda_fail_2[classic]\": 2.7395494632970463,\n    \"tests/core/test_solve.py::test_cuda_fail_2[libmamba]\": 1.9940002095814728,\n    \"tests/core/test_solve.py::test_cuda_glibc_sat[classic]\": 0.0007320121159533627,\n    \"tests/core/test_solve.py::test_cuda_glibc_sat[libmamba]\": 0.0005470550533513465,\n    \"tests/core/test_solve.py::test_cuda_glibc_unsat_constrain[classic]\": 0.0005690749463904464,\n    \"tests/core/test_solve.py::test_cuda_glibc_unsat_constrain[libmamba]\": 0.0006904458025745182,\n    \"tests/core/test_solve.py::test_cuda_glibc_unsat_depend[classic]\": 0.0006441435773985534,\n    \"tests/core/test_solve.py::test_cuda_glibc_unsat_depend[libmamba]\": 0.0006195138875328614,\n    \"tests/core/test_solve.py::test_current_repodata_fallback[classic]\": 1.106576538839763,\n    \"tests/core/test_solve.py::test_current_repodata_fallback[libmamba]\": 0.6587631449678208,\n    \"tests/core/test_solve.py::test_current_repodata_usage[classic]\": 1.084306207246031,\n    \"tests/core/test_solve.py::test_current_repodata_usage[libmamba]\": 0.6487267604628394,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_conflicts[classic]\": 0.02472798889427607,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_conflicts[libmamba]\": 0.025153671612395137,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_conflicts_upperbound[classic]\": 0.025185598213112427,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_conflicts_upperbound[libmamba]\": 0.026160661014990275,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_multi_conflicts[classic]\": 0.025264537455383117,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_multi_conflicts[libmamba]\": 0.025916053833029626,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_free[classic]\": 0.030262157460552407,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_free[libmamba]\": 0.024836854949229558,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_no_upperbound[classic]\": 0.026977155147309896,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_no_upperbound[libmamba]\": 0.025593343644152104,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_upperbound_compound_depends[classic]\": 0.023499482071694056,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_upperbound_compound_depends[libmamba]\": 0.023712054969638532,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_version_star[classic]\": 0.02521529625646976,\n    \"tests/core/test_solve.py::test_determine_constricting_specs_no_conflicts_version_star[libmamba]\": 0.02228745507675965,\n    \"tests/core/test_solve.py::test_downgrade_python_prevented_with_sane_message[classic]\": 12.236631993820078,\n    \"tests/core/test_solve.py::test_downgrade_python_prevented_with_sane_message[libmamba]\": 5.485853195531896,\n    \"tests/core/test_solve.py::test_explicit_conda_downgrade[classic]\": 12.004500583221574,\n    \"tests/core/test_solve.py::test_explicit_conda_downgrade[libmamba]\": 6.951263989618943,\n    \"tests/core/test_solve.py::test_fast_update_with_update_modifier_not_set[classic]\": 5.160378873787344,\n    \"tests/core/test_solve.py::test_fast_update_with_update_modifier_not_set[libmamba]\": 3.795472597629759,\n    \"tests/core/test_solve.py::test_features_solve_1[classic]\": 11.680491895716754,\n    \"tests/core/test_solve.py::test_features_solve_1[libmamba]\": 0.8270690014263263,\n    \"tests/core/test_solve.py::test_force_reinstall_1[classic]\": 6.157162344310654,\n    \"tests/core/test_solve.py::test_force_reinstall_1[libmamba]\": 5.240907172161833,\n    \"tests/core/test_solve.py::test_force_reinstall_2[classic]\": 2.6449906236991625,\n    \"tests/core/test_solve.py::test_force_reinstall_2[libmamba]\": 1.695005099904066,\n    \"tests/core/test_solve.py::test_force_remove_1[classic]\": 13.45995058106573,\n    \"tests/core/test_solve.py::test_force_remove_1[libmamba]\": 5.0734009686679125,\n    \"tests/core/test_solve.py::test_freeze_deps_1[classic]\": 8.90904771790472,\n    \"tests/core/test_solve.py::test_freeze_deps_1[libmamba]\": 2.8520483197263307,\n    \"tests/core/test_solve.py::test_globstr_matchspec_compatible[classic]\": 1.110658484356277,\n    \"tests/core/test_solve.py::test_globstr_matchspec_compatible[libmamba]\": 1.0460310884251813,\n    \"tests/core/test_solve.py::test_globstr_matchspec_non_compatible[classic]\": 1.0531158730181676,\n    \"tests/core/test_solve.py::test_globstr_matchspec_non_compatible[libmamba]\": 1.151088585180696,\n    \"tests/core/test_solve.py::test_indirect_dep_optimized_by_version_over_package_count[classic]\": 1.6543861378898175,\n    \"tests/core/test_solve.py::test_indirect_dep_optimized_by_version_over_package_count[libmamba]\": 1.0366420710248185,\n    \"tests/core/test_solve.py::test_no_channels_error[classic]\": 0.021077548146244234,\n    \"tests/core/test_solve.py::test_no_channels_error[libmamba]\": 0.01688029233339969,\n    \"tests/core/test_solve.py::test_no_deps_1[classic]\": 11.83775649659096,\n    \"tests/core/test_solve.py::test_no_deps_1[libmamba]\": 5.42183840363413,\n    \"tests/core/test_solve.py::test_no_update_deps_1[classic]\": 11.932465618129664,\n    \"tests/core/test_solve.py::test_no_update_deps_1[libmamba]\": 7.025779122921504,\n    \"tests/core/test_solve.py::test_only_deps_1[classic]\": 3.5514635527286784,\n    \"tests/core/test_solve.py::test_only_deps_1[libmamba]\": 1.7868461550530208,\n    \"tests/core/test_solve.py::test_only_deps_2[classic]\": 17.139294564792543,\n    \"tests/core/test_solve.py::test_only_deps_2[libmamba]\": 7.524834265559651,\n    \"tests/core/test_solve.py::test_packages_in_solution_change_already_newest[classic]\": 0.026606206710255254,\n    \"tests/core/test_solve.py::test_packages_in_solution_change_already_newest[libmamba]\": 0.0358644759171666,\n    \"tests/core/test_solve.py::test_packages_in_solution_change_constrained[classic]\": 0.026043873796840866,\n    \"tests/core/test_solve.py::test_packages_in_solution_change_constrained[libmamba]\": 0.022948165786746147,\n    \"tests/core/test_solve.py::test_packages_in_solution_change_needs_update[classic]\": 0.022750583870971623,\n    \"tests/core/test_solve.py::test_packages_in_solution_change_needs_update[libmamba]\": 0.02951971382669301,\n    \"tests/core/test_solve.py::test_pinned_1[classic]\": 5.3457862554934135,\n    \"tests/core/test_solve.py::test_pinned_1[libmamba]\": 5.0614985155976715,\n    \"tests/core/test_solve.py::test_pinned_specs_CONDA_PINNED_PACKAGES[classic]\": 0.03763290570006184,\n    \"tests/core/test_solve.py::test_pinned_specs_CONDA_PINNED_PACKAGES[libmamba]\": 0.02542672167195106,\n    \"tests/core/test_solve.py::test_pinned_specs_all[classic]\": 0.15292284981993143,\n    \"tests/core/test_solve.py::test_pinned_specs_all[libmamba]\": 0.10216984476451477,\n    \"tests/core/test_solve.py::test_pinned_specs_conda_meta_pinned[classic]\": 0.028966327681042285,\n    \"tests/core/test_solve.py::test_pinned_specs_conda_meta_pinned[libmamba]\": 0.022698491149996912,\n    \"tests/core/test_solve.py::test_pinned_specs_condarc[classic]\": 0.13149128005943184,\n    \"tests/core/test_solve.py::test_pinned_specs_condarc[libmamba]\": 0.12773777082791335,\n    \"tests/core/test_solve.py::test_priority_1[classic]\": 38.048560872892395,\n    \"tests/core/test_solve.py::test_priority_1[libmamba]\": 11.553934652684257,\n    \"tests/core/test_solve.py::test_prune_1[classic]\": 7.299929596365899,\n    \"tests/core/test_solve.py::test_prune_1[libmamba]\": 2.2676286560814742,\n    \"tests/core/test_solve.py::test_python2_update[classic]\": 10.78033174111313,\n    \"tests/core/test_solve.py::test_python2_update[libmamba]\": 1.5198421260165147,\n    \"tests/core/test_solve.py::test_remove_with_constrained_dependencies[classic]\": 13.307393739172792,\n    \"tests/core/test_solve.py::test_remove_with_constrained_dependencies[libmamba]\": 1.5718707523508324,\n    \"tests/core/test_solve.py::test_solve_1[libmamba]\": 2.626776350119269,\n    \"tests/core/test_solve.py::test_solve_2[classic]\": 39.272133204361275,\n    \"tests/core/test_solve.py::test_solve_2[libmamba]\": 0.018924705658460925,\n    \"tests/core/test_solve.py::test_solve_msgs_exclude_vp[classic]\": 2.78654822160509,\n    \"tests/core/test_solve.py::test_solve_msgs_exclude_vp[libmamba]\": 1.912533963791152,\n    \"tests/core/test_solve.py::test_strict_custom_multichannel_allows_fallback_to_later_subchannel[classic]\": 0.02052452835911627,\n    \"tests/core/test_solve.py::test_strict_custom_multichannel_allows_fallback_to_later_subchannel[libmamba]\": 37.34448509447505,\n    \"tests/core/test_solve.py::test_timestamps_1[classic]\": 1.3025509372940836,\n    \"tests/core/test_solve.py::test_timestamps_1[libmamba]\": 0.7125887736258425,\n    \"tests/core/test_solve.py::test_unfreeze_when_required[classic]\": 3.193625426704279,\n    \"tests/core/test_solve.py::test_unfreeze_when_required[libmamba]\": 2.3232304880076944,\n    \"tests/core/test_solve.py::test_update_all_1[classic]\": 11.621182153219959,\n    \"tests/core/test_solve.py::test_update_all_1[libmamba]\": 5.3343053482019736,\n    \"tests/core/test_solve.py::test_update_deps_1[classic]\": 22.74901089143252,\n    \"tests/core/test_solve.py::test_update_deps_1[libmamba]\": 10.762311258498032,\n    \"tests/core/test_solve.py::test_update_deps_2[classic]\": 18.589904624377766,\n    \"tests/core/test_solve.py::test_update_deps_2[libmamba]\": 3.744749121854098,\n    \"tests/core/test_solve.py::test_update_prune_1[classic]\": 6.43687977448346,\n    \"tests/core/test_solve.py::test_update_prune_1[libmamba]\": 3.709491610846389,\n    \"tests/core/test_solve.py::test_update_prune_2[classic]\": 6.785436715278541,\n    \"tests/core/test_solve.py::test_update_prune_2[libmamba]\": 1.9239162076217349,\n    \"tests/core/test_solve.py::test_update_prune_3[classic]\": 7.365520466944183,\n    \"tests/core/test_solve.py::test_update_prune_3[libmamba]\": 1.9194089583330178,\n    \"tests/core/test_solve.py::test_update_prune_4[classic]\": 6.604107644171135,\n    \"tests/core/test_solve.py::test_update_prune_4[libmamba]\": 4.062756074709056,\n    \"tests/core/test_solve.py::test_update_prune_5[classic-False]\": 7.430519602886875,\n    \"tests/core/test_solve.py::test_update_prune_5[classic-True]\": 6.7012473003611674,\n    \"tests/core/test_solve.py::test_update_prune_5[libmamba-False]\": 3.552528421701025,\n    \"tests/core/test_solve.py::test_update_prune_5[libmamba-True]\": 3.899409159547911,\n    \"tests/core/test_solve.py::test_virtual_package_solver[classic]\": 2.569260719032285,\n    \"tests/core/test_solve.py::test_virtual_package_solver[libmamba]\": 0.01698972569729531,\n    \"tests/core/test_subdir_data.py::test_cache_fn_url_repo_anaconda_com\": 0.0028079153510145965,\n    \"tests/core/test_subdir_data.py::test_cache_fn_url_repo_continuum_io\": 0.002630707052845094,\n    \"tests/core/test_subdir_data.py::test_get_index_no_platform_with_offline_cache\": 2.4504032637563324,\n    \"tests/core/test_subdir_data.py::test_metadata_cache_clearing\": 0.05445617432546687,\n    \"tests/core/test_subdir_data.py::test_metadata_cache_works\": 3.113294040042959,\n    \"tests/core/test_subdir_data.py::test_repodata_version_2_base_url[no-credentials]\": 2.2547330763651794,\n    \"tests/core/test_subdir_data.py::test_repodata_version_2_base_url[with-auth]\": 1.0974275764118078,\n    \"tests/core/test_subdir_data.py::test_repodata_version_2_base_url[with-token]\": 0.016578329416127878,\n    \"tests/core/test_subdir_data.py::test_repodata_version_error\": 5.038823380534624,\n    \"tests/core/test_subdir_data.py::test_search_by_packagerecord\": 0.01128990357839903,\n    \"tests/core/test_subdir_data.py::test_state_is_not_json\": 0.04884360999245699,\n    \"tests/core/test_subdir_data.py::test_subdir_data_coverage\": 0.02598795447421371,\n    \"tests/core/test_subdir_data.py::test_subdir_data_dict_state\": 0.004875606644327361,\n    \"tests/core/test_subdir_data.py::test_subdir_data_prefers_conda_to_tar_bz2\": 0.023110970994400997,\n    \"tests/core/test_subdir_data.py::test_use_only_tar_bz2\": 0.038287646237833026,\n    \"tests/env/installers/test_conda_installer_explicit.py::test_explicit_with_user_specs\": 0.007657623616398601,\n    \"tests/env/installers/test_conda_installer_explicit.py::test_installer_installs_explicit\": 0.17269160639416217,\n    \"tests/env/installers/test_conda_installer_explicit.py::test_installer_type_checking_for_explicit\": 0.01127004737576375,\n    \"tests/env/specs/test_explicit.py::test_can_handle_explicit\": 0.0036064123745934477,\n    \"tests/env/specs/test_explicit.py::test_can_not_handle_requirements_txt\": 0.003373082745788483,\n    \"tests/env/specs/test_explicit.py::test_environment\": 0.26825586398088097,\n    \"tests/env/specs/test_explicit.py::test_no_environment_file\": 0.0033042730348935984,\n    \"tests/env/specs/test_requirements.py::test_can_not_handle_explicit\": 0.0038574770396906815,\n    \"tests/env/specs/test_requirements.py::test_environment\": 0.0033549980911451397,\n    \"tests/env/specs/test_requirements.py::test_no_environment_file\": 0.00365655436588184,\n    \"tests/env/specs/test_requirements.py::test_no_name\": 0.004394809471824144,\n    \"tests/env/specs/test_requirements.py::test_req_file_and_name\": 0.0035052763579616433,\n    \"tests/env/specs/test_yaml_file.py::test_environment_file_exist[Cep24YamlFileSpec]\": 0.0047663181557067846,\n    \"tests/env/specs/test_yaml_file.py::test_environment_file_exist[YamlFileSpec]\": 0.005010540933291693,\n    \"tests/env/specs/test_yaml_file.py::test_environment_file_not_yaml[Cep24YamlFileSpec-TypeError]\": 0.0034745771114651682,\n    \"tests/env/specs/test_yaml_file.py::test_environment_file_not_yaml[YamlFileSpec-PluginError]\": 0.00464387156463358,\n    \"tests/env/specs/test_yaml_file.py::test_filename\": 0.005110376079338934,\n    \"tests/env/specs/test_yaml_file.py::test_get_environment[Cep24YamlFileSpec]\": 0.0055165740618187825,\n    \"tests/env/specs/test_yaml_file.py::test_get_environment[YamlFileSpec]\": 0.006479414719682531,\n    \"tests/env/specs/test_yaml_file.py::test_no_environment_file[Cep24YamlFileSpec]\": 0.003223677715667403,\n    \"tests/env/specs/test_yaml_file.py::test_no_environment_file[YamlFileSpec]\": 0.003631809222171888,\n    \"tests/env/test_create.py::test_create_advanced_pip\": 29.9453337866182,\n    \"tests/env/test_create.py::test_create_empty_env\": 3.043594189069503,\n    \"tests/env/test_create.py::test_create_env_custom_platform\": 0.9249924588201082,\n    \"tests/env/test_create.py::test_create_env_default_packages\": 17.69350984708605,\n    \"tests/env/test_create.py::test_create_env_from_environment_yml_does_not_output_duplicate_warning\": 1.362841851106181,\n    \"tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[cep-24-/Users/runner/work/conda-libmamba-solver/conda-libmamba-solver/conda/tests/env/support/env_with_dependencies.yml]\": 8.799966797015738,\n    \"tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[cep-24-/Users/runner/work/conda/conda/tests/env/support/env_with_dependencies.yml]\": 11.304656637366625,\n    \"tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[explicit-/Users/runner/work/conda-libmamba-solver/conda-libmamba-solver/conda/tests/env/support/explicit.txt]\": 0.617149637011708,\n    \"tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[explicit-/Users/runner/work/conda/conda/tests/env/support/explicit.txt]\": 0.7581659631380523,\n    \"tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[requirements.txt-/Users/runner/work/conda-libmamba-solver/conda-libmamba-solver/conda/tests/env/support/requirements.txt]\": 10.53187922675677,\n    \"tests/env/test_create.py::test_create_env_from_file_with_mismatched_extension_via_env_spec[requirements.txt-/Users/runner/work/conda/conda/tests/env/support/requirements.txt]\": 12.57829650479584,\n    \"tests/env/test_create.py::test_create_env_from_non_existent_plugin\": 0.07521129260137792,\n    \"tests/env/test_create.py::test_create_env_json[example/environment.yml]\": 20.717422413288222,\n    \"tests/env/test_create.py::test_create_env_json[example/environment_with_pip.yml]\": 24.022319556275267,\n    \"tests/env/test_create.py::test_create_env_no_default_packages\": 13.27071263984563,\n    \"tests/env/test_create.py::test_create_host_port\": 0.00039910141472900175,\n    \"tests/env/test_create.py::test_create_update\": 13.632458002571244,\n    \"tests/env/test_create.py::test_create_update_remote_env_file\": 12.219563065501813,\n    \"tests/env/test_create.py::test_export_and_recreate_environment[env.yml-env.yaml]\": 1.9666666531876826,\n    \"tests/env/test_create.py::test_export_and_recreate_environment[environment-yaml-env.yaml]\": 1.8317181162906984,\n    \"tests/env/test_create.py::test_export_and_recreate_environment[reqs-env.txt]\": 2.2643710914704727,\n    \"tests/env/test_create.py::test_export_and_recreate_environment[requirements-env.txt]\": 1.6697434107070062,\n    \"tests/env/test_create.py::test_fail_to_create_env_in_dir_with_colon\": 0.06862541066761543,\n    \"tests/env/test_create.py::test_protected_dirs_error_for_env_create\": 0.1255099095252187,\n    \"tests/env/test_env.py::test_add_channels\": 0.00267755687745237,\n    \"tests/env/test_env.py::test_add_pip\": 0.006838540187678731,\n    \"tests/env/test_env.py::test_args_are_wildcarded\": 0.0029541280218447256,\n    \"tests/env/test_env.py::test_builds_spec_from_line_raw_dependency\": 0.00309859042092241,\n    \"tests/env/test_env.py::test_can_add_dependencies_to_environment\": 0.006646234828540174,\n    \"tests/env/test_env.py::test_channels_are_provided_by_kwarg\": 0.0027027232140380735,\n    \"tests/env/test_env.py::test_channels_default_to_empty_list\": 0.002560750449759723,\n    \"tests/env/test_env.py::test_channels_validation[channels0-Invalid type for 'channels']\": 0.003372487932214843,\n    \"tests/env/test_env.py::test_channels_validation[channels1-`channels` key must only contain strings.]\": 0.0035999009954622106,\n    \"tests/env/test_env.py::test_channels_validation[channels2-`channels` key must only contain strings.]\": 0.0033100119128273687,\n    \"tests/env/test_env.py::test_channels_validation[channels3-None]\": 0.0031499763424548553,\n    \"tests/env/test_env.py::test_create_and_update_env_with_just_vars\": 1.3612970452648983,\n    \"tests/env/test_env.py::test_creates_file_on_save\": 0.007510600892048453,\n    \"tests/env/test_env.py::test_dependencies_are_empty_by_default\": 0.0029379220404019326,\n    \"tests/env/test_env.py::test_dependencies_update_after_adding\": 0.005280949302831016,\n    \"tests/env/test_env.py::test_dependency_validation[dependencies0]\": 0.0038054048065086768,\n    \"tests/env/test_env.py::test_dependency_validation[dependencies1]\": 0.0026732437244419193,\n    \"tests/env/test_env.py::test_dependency_validation[dependencies2]\": 0.0028981154287145003,\n    \"tests/env/test_env.py::test_dependency_validation[dependencies3]\": 0.0031296229565040846,\n    \"tests/env/test_env.py::test_dependency_validation[dependencies4]\": 0.002996042102856336,\n    \"tests/env/test_env.py::test_dependency_validation_errors[None-EnvironmentFileInvalid-Invalid type for 'dependencies', expected a list]\": 0.004092016600757807,\n    \"tests/env/test_env.py::test_dependency_validation_errors[dependencies1-CondaMultiError-Invalid spec 'nota~matchspec']\": 0.004440440597355791,\n    \"tests/env/test_env.py::test_dependency_validation_errors[dependencies2-CondaMultiError-Invalid spec 'also!!not']\": 0.004061181126526033,\n    \"tests/env/test_env.py::test_dependency_validation_errors[dependencies3-CondaMultiError-is an invalid type]\": 0.0034138152095188547,\n    \"tests/env/test_env.py::test_dependency_validation_errors[dependencies4-EnvironmentFileInvalid-Invalid type for 'dependencies']\": 0.003451978391066684,\n    \"tests/env/test_env.py::test_empty_deps\": 0.006559335189895454,\n    \"tests/env/test_env.py::test_env_advanced_pip\": 10.87118874980462,\n    \"tests/env/test_env.py::test_environment_deprecated\": 0.0037055225346725304,\n    \"tests/env/test_env.py::test_envvars\": 0.007312818656441987,\n    \"tests/env/test_env.py::test_from_history\": 0.0077460884591359636,\n    \"tests/env/test_env.py::test_has_empty_filename_by_default\": 0.002739850278626674,\n    \"tests/env/test_env.py::test_has_empty_name_by_default\": 0.0026203171487959006,\n    \"tests/env/test_env.py::test_has_filename_if_provided\": 0.0027450808535533383,\n    \"tests/env/test_env.py::test_has_name_if_provided\": 0.0032603773615301197,\n    \"tests/env/test_env.py::test_http\": 0.08698257123501842,\n    \"tests/env/test_env.py::test_http_raises\": 0.10359924170668158,\n    \"tests/env/test_env.py::test_invalid_keys\": 0.007507674297678497,\n    \"tests/env/test_env.py::test_name_validation[1-Invalid type for 'name']\": 0.00368732355009409,\n    \"tests/env/test_env.py::test_name_validation[name-None]\": 0.003041645976380761,\n    \"tests/env/test_env.py::test_name_validation[name0-Invalid type for 'name']\": 0.004048961773683062,\n    \"tests/env/test_env.py::test_other_tips_of_dependencies_are_supported\": 0.002741418871586284,\n    \"tests/env/test_env.py::test_parses_dependencies_from_raw_file\": 0.004824111835305733,\n    \"tests/env/test_env.py::test_prefix_validation[1-Invalid type for 'prefix']\": 0.0036050734095179286,\n    \"tests/env/test_env.py::test_prefix_validation[path/to/prefix-None]\": 0.0030934958800843816,\n    \"tests/env/test_env.py::test_prefix_validation[prefix0-Invalid type for 'prefix']\": 0.003300635103915284,\n    \"tests/env/test_env.py::test_remove_channels\": 0.0027862229547346478,\n    \"tests/env/test_env.py::test_retains_full_filename\": 0.005412778645107665,\n    \"tests/env/test_env.py::test_returns_Environment\": 0.005816943218383147,\n    \"tests/env/test_env.py::test_to_dict_returns_dictionary_of_data\": 0.0027118497651488797,\n    \"tests/env/test_env.py::test_to_dict_returns_just_name_if_only_thing_present\": 0.0029091623654733533,\n    \"tests/env/test_env.py::test_to_yaml_returns_proper_yaml\": 0.005396696398186456,\n    \"tests/env/test_env.py::test_to_yaml_returns_yaml_parseable_string\": 0.0073475551182685984,\n    \"tests/env/test_env.py::test_to_yaml_takes_stream\": 0.004899920787343771,\n    \"tests/env/test_env.py::test_valid_keys\": 0.0073999109107112555,\n    \"tests/env/test_env.py::test_variables_validation[variables0-Invalid type for 'variables']\": 0.0036772198017815108,\n    \"tests/env/test_env.py::test_variables_validation[variables1-None]\": 0.003566884090278672,\n    \"tests/env/test_env.py::test_variables_validation[variables2-None]\": 0.0030207984965194665,\n    \"tests/env/test_env.py::test_with_pip\": 0.00619958327786766,\n    \"tests/env/test_pip_util.py::test_get_pip_installed_packages[Successfully installed foo bar-expected0]\": 0.003311049257128863,\n    \"tests/env/test_pip_util.py::test_get_pip_installed_packages[\\\\nCollecting attrs\\\\n  Using cached https://files.pythonhosted.org/packages/23/96/d828354fa2dbdf216eaa7b7de0db692f12c234f7ef888cc14980ef40d1d2/attrs-19.1.0-py2.py3-none-any.whl\\\\nInstalling collected packages: attrs\\\\nSuccessfully installed attrs-19.1.0\\\\n-expected1]\": 0.003434975588623382,\n    \"tests/env/test_pip_util.py::test_get_pip_installed_packages[\\\\nCollecting flask\\\\n  Using cached https://files.pythonhosted.org/packages/9b/93/628509b8d5dc749656a9641f4caf13540e2cdec85276964ff8f43bbb1d3b/Flask-1.1.1-py2.py3-none-any.whl\\\\nCollecting itsdangerous>=0.24 (from flask)\\\\n  Using cached https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl\\\\nCollecting click>=5.1 (from flask)\\\\n  Using cached https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl\\\\nCollecting Werkzeug>=0.15 (from flask)\\\\n  Using cached https://files.pythonhosted.org/packages/b7/61/c0a1adf9ad80db012ed7191af98fa05faa95fa09eceb71bb6fa8b66e6a43/Werkzeug-0.15.6-py2.py3-none-any.whl\\\\nCollecting Jinja2>=2.10.1 (from flask)\\\\n  Using cached https://files.pythonhosted.org/packages/1d/e7/fd8b501e7a6dfe492a433deb7b9d833d39ca74916fa8bc63dd1a4947a671/Jinja2-2.10.1-py2.py3-none-any.whl\\\\nCollecting MarkupSafe>=0.23 (from Jinja2>=2.10.1->flask)\\\\n  Using cached https://files.pythonhosted.org/packages/ce/c6/f000f1af136ef74e4a95e33785921c73595c5390403f102e9b231b065b7a/MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl\\\\nInstalling collected packages: itsdangerous, click, Werkzeug, MarkupSafe, Jinja2, flask\\\\nSuccessfully installed Jinja2-2.10.1 MarkupSafe-1.1.1 Werkzeug-0.15.6 click-7.0 flask-1.1.1 itsdangerous-1.1.0\\\\n-expected2]\": 0.002953577259935457,\n    \"tests/env/test_pip_util.py::test_get_pip_installed_packages[\\\\nCollecting flask\\\\n  Using cached https://files.pythonhosted.org/packages/9b/93/628509b8d5dc749656a9641f4caf13540e2cdec85276964ff8f43bbb1d3b/Flask-1.1.1-py2.py3-none-any.whl\\\\nRequirement already satisfied: Werkzeug>=0.15 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (0.15.6)\\\\nRequirement already satisfied: itsdangerous>=0.24 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (1.1.0)\\\\nRequirement already satisfied: Jinja2>=2.10.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (2.10.1)\\\\nRequirement already satisfied: click>=5.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (7.0)\\\\nRequirement already satisfied: MarkupSafe>=0.23 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from Jinja2>=2.10.1->flask) (1.1.1)\\\\nInstalling collected packages: flask\\\\nSuccessfully installed flask-1.1.1\\\\n-expected3]\": 0.003311296594202359,\n    \"tests/env/test_pip_util.py::test_get_pip_installed_packages_none[\\\\nRequirement already satisfied: flask in ./miniconda3/envs/fooo/lib/python3.7/site-packages (1.1.1)\\\\nRequirement already satisfied: itsdangerous>=0.24 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (1.1.0)\\\\nRequirement already satisfied: Jinja2>=2.10.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (2.10.1)\\\\nRequirement already satisfied: click>=5.1 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (7.0)\\\\nRequirement already satisfied: Werkzeug>=0.15 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from flask) (0.15.6)\\\\nRequirement already satisfied: MarkupSafe>=0.23 in ./miniconda3/envs/fooo/lib/python3.7/site-packages (from Jinja2>=2.10.1->flask) (1.1.1)\\\\n]\": 0.002730073023983998,\n    \"tests/env/test_pip_util.py::test_get_pip_installed_packages_none[]\": 0.0027804250830873807,\n    \"tests/env/test_pip_util.py::test_get_pip_installed_packages_none[foo]\": 0.004193938860104972,\n    \"tests/gateways/disk/test_create.py::test_deprecations[ProgressFileWrapper-TypeError]\": 0.0039571878708007475,\n    \"tests/gateways/disk/test_create.py::test_deprecations[create_application_entry_point-TypeError]\": 0.004080161471374526,\n    \"tests/gateways/disk/test_create.py::test_deprecations[create_fake_executable_softlink-TypeError]\": 0.0033430942232802827,\n    \"tests/gateways/disk/test_create.py::test_deprecations[extract_tarball-TypeError]\": 0.0032115498412424765,\n    \"tests/gateways/disk/test_delete.py::test_backoff_unlink\": 0.08767788767394429,\n    \"tests/gateways/disk/test_delete.py::test_backoff_unlink_doesnt_exist\": 0.003983408316192888,\n    \"tests/gateways/disk/test_delete.py::test_remove_dir\": 0.0891181802079068,\n    \"tests/gateways/disk/test_delete.py::test_remove_file\": 0.003927419025409388,\n    \"tests/gateways/disk/test_delete.py::test_remove_link_to_dir\": 0.1025336629393028,\n    \"tests/gateways/disk/test_delete.py::test_remove_link_to_file\": 0.005286145158566326,\n    \"tests/gateways/disk/test_delete.py::test_rm_rf\": 0.1386480953727838,\n    \"tests/gateways/disk/test_delete.py::test_rm_rf_couldnt\": 0.004276468299719552,\n    \"tests/gateways/disk/test_delete.py::test_rm_rf_does_not_follow_symlinks\": 0.1775690276511962,\n    \"tests/gateways/disk/test_delete.py::test_try_rmdir_all_empty_doesnt_exist\": 0.08873211858382052,\n    \"tests/gateways/disk/test_link.py::test_hard_link\": 0.0075921656064102715,\n    \"tests/gateways/disk/test_link.py::test_soft_link\": 0.00847194122446409,\n    \"tests/gateways/disk/test_lock.py::test_LockError_raised\": 0.009885982754759652,\n    \"tests/gateways/disk/test_lock.py::test_double_locking_fails\": 2.0334795595426414,\n    \"tests/gateways/disk/test_lock.py::test_lock_acquired_success\": 0.004935862682023107,\n    \"tests/gateways/disk/test_permissions.py::test_make_executable\": 0.004462469445844519,\n    \"tests/gateways/disk/test_permissions.py::test_make_writable\": 0.005033159127635437,\n    \"tests/gateways/disk/test_permissions.py::test_make_writable_dir_EACCES\": 0.004581862086998964,\n    \"tests/gateways/disk/test_permissions.py::test_make_writable_dir_EPERM\": 0.00432146212941095,\n    \"tests/gateways/disk/test_permissions.py::test_make_writable_dir_EROFS\": 0.004807406286139433,\n    \"tests/gateways/disk/test_permissions.py::test_make_writable_doesnt_exist\": 0.003653454991175568,\n    \"tests/gateways/disk/test_permissions.py::test_recursive_make_writable\": 0.004803209490141165,\n    \"tests/gateways/disk/test_read.py::test_cherrypy_py27_osx_no_binary\": 0.06124181715728597,\n    \"tests/gateways/disk/test_read.py::test_cherrypy_py36_osx_whl\": 0.06565830943813988,\n    \"tests/gateways/disk/test_read.py::test_pyjwt_py27_osx_no_binary\": 0.015013984563333463,\n    \"tests/gateways/disk/test_read.py::test_pyjwt_py36_osx_whl\": 0.0205097687391292,\n    \"tests/gateways/disk/test_read.py::test_scrapy_py27_osx_no_binary\": 0.12429563647460443,\n    \"tests/gateways/disk/test_read.py::test_scrapy_py36_osx_whl\": 0.14025408163061664,\n    \"tests/gateways/disk/test_read.py::test_six_py27_osx_no_binary_unmanageable\": 0.00716015536853768,\n    \"tests/gateways/disk/test_read.py::test_twilio_py27_osx_no_binary\": 0.16873970654404644,\n    \"tests/gateways/disk/test_read.py::test_twilio_py36_osx_whl\": 0.23200176466398886,\n    \"tests/gateways/test_connection.py::test_accept_range_none\": 1.0169261385140462,\n    \"tests/gateways/test_connection.py::test_add_binstar_token\": 0.2299709397065554,\n    \"tests/gateways/test_connection.py::test_get_channel_name_from_url[http://localhost-channels3-http://localhost]\": 0.015868017706784053,\n    \"tests/gateways/test_connection.py::test_get_channel_name_from_url[http://localhost/noarch/test-package-0.1.0.conda-channels2-http://localhost]\": 0.014958048816038856,\n    \"tests/gateways/test_connection.py::test_get_channel_name_from_url[https://conda.anaconda.org/conda-forge/linux-64/test-package-0.1.0.tar.bz2-channels1-conda-forge]\": 0.015908437952330233,\n    \"tests/gateways/test_connection.py::test_get_channel_name_from_url[https://repo.anaconda.com/pkgs/main/linux-64/test-package-0.1.0.conda-channels0-defaults]\": 0.01668872253526083,\n    \"tests/gateways/test_connection.py::test_get_session_returns_default\": 0.006169792269200127,\n    \"tests/gateways/test_connection.py::test_get_session_with_channel_settings\": 0.016998525643534067,\n    \"tests/gateways/test_connection.py::test_get_session_with_channel_settings_multiple\": 0.008233765201093833,\n    \"tests/gateways/test_connection.py::test_get_session_with_channel_settings_no_handler\": 0.006413971444630989,\n    \"tests/gateways/test_connection.py::test_get_session_with_request_headers\": 0.009829824665091122,\n    \"tests/gateways/test_connection.py::test_get_session_with_url_pattern[exact-url]\": 0.043743494076156825,\n    \"tests/gateways/test_connection.py::test_get_session_with_url_pattern[no-match]\": 0.01933786580966311,\n    \"tests/gateways/test_connection.py::test_get_session_with_url_pattern[url-prefix]\": 0.010777273847022036,\n    \"tests/gateways/test_connection.py::test_get_session_with_url_pattern[wildcard-match-same-schema]\": 0.011038403251890788,\n    \"tests/gateways/test_connection.py::test_get_session_with_url_pattern[wildcard-no-match-different-scheme]\": 0.009615988855546622,\n    \"tests/gateways/test_connection.py::test_get_session_with_url_pattern[wildcard-no-match-missing-scheme]\": 0.0073558346346325265,\n    \"tests/gateways/test_connection.py::test_local_file_adapter_200\": 0.009035780147922473,\n    \"tests/gateways/test_connection.py::test_local_file_adapter_404\": 0.3109380375244605,\n    \"tests/gateways/test_connection.py::test_offline[False]\": 0.01183789533561034,\n    \"tests/gateways/test_connection.py::test_offline[True]\": 0.02296177118956712,\n    \"tests/gateways/test_connection.py::test_prepare_request_allows_valid_plugin_headers\": 0.010397262161449872,\n    \"tests/gateways/test_connection.py::test_prepare_request_rejects_forbidden_plugin_headers\": 0.012552694490697756,\n    \"tests/gateways/test_connection.py::test_s3_download_uses_direct_path\": 0.2736298940409685,\n    \"tests/gateways/test_connection.py::test_s3_server\": 0.00036803917933440314,\n    \"tests/gateways/test_connection.py::test_s3_server_with_mock\": 0.00037645000896303167,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_case_insensitive\": 0.002792184781852739,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Accept-Charset]\": 0.003037656446984448,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Accept-Encoding]\": 0.003443442736499117,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Access-Control-Request-Headers]\": 0.003254291226670505,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Access-Control-Request-Method]\": 0.00327761080576088,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Connection]\": 0.0033614484618525124,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Content-Length]\": 0.002901701818510202,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Cookie]\": 0.0034266953314696777,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[DNT]\": 0.002925555327162294,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Date]\": 0.003146486381236182,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Expect]\": 0.002968584752474132,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Host]\": 0.003099520441811837,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Keep-Alive]\": 0.0029249359124618687,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Origin]\": 0.0030923659152001233,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Referer]\": 0.0030632920419865328,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Set-Cookie]\": 0.003046465301724,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[TE]\": 0.0033405372405025586,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Trailer]\": 0.00324630701540995,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Transfer-Encoding]\": 0.003168657214299745,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Upgrade]\": 0.0030508629456749243,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden[Via]\": 0.0033207762215910464,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Proxy-Authorization]\": 0.0032363671452905,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Proxy-Connection]\": 0.0033497779778725685,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Sec-Fetch-Dest]\": 0.0034457826966794148,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Sec-Fetch-Mode]\": 0.0030811682143165025,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[Sec-Fetch-Site]\": 0.003294861439844841,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_forbidden_prefixes[sec-ch-ua]\": 0.0033460003832785482,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-CONNECT-True]\": 0.0036165323493961734,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-GET-False]\": 0.0034648131235265386,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-Override-PUT-False]\": 0.0030196596527702698,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-Override-TRACE-True]\": 0.0031185801466319697,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-POST-False]\": 0.0037793737526674825,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-TRACE-True]\": 0.003882737858652577,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-HTTP-Method-TRACK-True]\": 0.003729942688331344,\n    \"tests/gateways/test_connection.py::test_validate_plugin_headers_method_override[X-Method-Override-CONNECT-True]\": 0.003479856258250466,\n    \"tests/gateways/test_logging.py::test_token_not_present_in_conda_create\": 2.891880551222096,\n    \"tests/gateways/test_logging.py::test_token_replace_big_string\": 0.003811855619003034,\n    \"tests/gateways/test_logging.py::test_token_replace_individual_strings\": 0.0031918925889712867,\n    \"tests/gateways/test_logging.py::test_token_url_filter_attached_to_loggers\": 0.009254643938754683,\n    \"tests/gateways/test_logging.py::test_token_url_filter_formats[http-ip-port-with-token]\": 0.0031741655530968015,\n    \"tests/gateways/test_logging.py::test_token_url_filter_formats[https-url-with-token]\": 0.0034690988218204787,\n    \"tests/gateways/test_logging.py::test_token_url_filter_formats[multiple-tokens-in-message]\": 0.003570992037700892,\n    \"tests/gateways/test_logging.py::test_token_url_filter_formats[path-only-with-token]\": 0.0033790094128309826,\n    \"tests/gateways/test_repodata_gateway.py::test_coverage_conda_http_errors\": 0.07126341836477429,\n    \"tests/gateways/test_repodata_gateway.py::test_get_cache_control_max_age\": 0.0035013073491725827,\n    \"tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[false-False]\": 0.016313284475275493,\n    \"tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[false-True]\": 0.2718303778495547,\n    \"tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[true-False]\": 0.031172172214538902,\n    \"tests/gateways/test_repodata_gateway.py::test_repodata_fetch_cached[true-True]\": 0.6333349678814396,\n    \"tests/gateways/test_repodata_gateway.py::test_repodata_fetch_formats\": 0.29206333375967103,\n    \"tests/gateways/test_repodata_gateway.py::test_repodata_fetch_jsondecodeerror\": 0.0073967813895560635,\n    \"tests/gateways/test_repodata_gateway.py::test_repodata_state_has_format\": 0.009283534353624263,\n    \"tests/gateways/test_repodata_gateway.py::test_save\": 0.21043645647528675,\n    \"tests/gateways/test_repodata_gateway.py::test_ssl_unavailable_error_message\": 0.00392825238327026,\n    \"tests/gateways/test_repodata_gateway.py::test_stale\": 0.0263335632257148,\n    \"tests/gateways/test_repodata_lock.py::test_lock_no_lock[False]\": 10.664511037758496,\n    \"tests/gateways/test_repodata_lock.py::test_lock_no_lock[True]\": 1.0094027054025718,\n    \"tests/gateways/test_repodata_lock.py::test_lock_rename\": 0.01953762077510777,\n    \"tests/gateways/test_repodata_shards.py::test_bytes_cache\": 0.007547738440273159,\n    \"tests/gateways/test_streams.py::test_redact_token_urls_matches_token_url_filter\": 0.002948677341886971,\n    \"tests/gateways/test_streams.py::test_stderr_writes_redacted_text\": 0.0037309774419942115,\n    \"tests/gateways/test_subprocess.py::test_subprocess_call_with_capture_output\": 0.4216251559072464,\n    \"tests/gateways/test_subprocess.py::test_subprocess_call_without_capture_output\": 0.4795472030499844,\n    \"tests/gateways/test_zstd.py::test_download_repodata\": 0.10159113028971792,\n    \"tests/gateways/test_zstd.py::test_repodata_info_jsondecodeerror\": 0.0895721841364877,\n    \"tests/gateways/test_zstd.py::test_repodata_state\": 0.0411568626674316,\n    \"tests/gateways/test_zstd.py::test_repodata_use_zst[False]\": 0.015195673236544423,\n    \"tests/gateways/test_zstd.py::test_repodata_use_zst[True]\": 0.013098609950431996,\n    \"tests/gateways/test_zstd.py::test_server_available\": 0.02150256966191195,\n    \"tests/gateways/test_zstd.py::test_zstd_fallback_on_invalid_zstd\": 0.03262767393515482,\n    \"tests/gateways/test_zstd.py::test_zstd_not_404\": 0.009567847919581644,\n    \"tests/models/test_channel.py::test_bare_channel_file\": 0.004675111165224124,\n    \"tests/models/test_channel.py::test_bare_channel_http\": 0.004570524117669543,\n    \"tests/models/test_channel.py::test_basic_multichannel\": 0.0049863544758693285,\n    \"tests/models/test_channel.py::test_canonicalized_url_gets_correct_token\": 0.016936635388717626,\n    \"tests/models/test_channel.py::test_channel_alias\": 0.020866740978424152,\n    \"tests/models/test_channel.py::test_channel_alias_channels\": 0.004349742306724392,\n    \"tests/models/test_channel.py::test_channel_alias_w_conda_path\": 0.014968287002477496,\n    \"tests/models/test_channel.py::test_channel_alias_w_subhcnnale\": 0.015014855431806704,\n    \"tests/models/test_channel.py::test_channel_cache\": 0.00516250556763031,\n    \"tests/models/test_channel.py::test_channel_equality_respects_platform\": 0.004170720217126365,\n    \"tests/models/test_channel.py::test_channel_host_port\": 0.004144654169491134,\n    \"tests/models/test_channel.py::test_channel_mangles_urls\": 0.005217484615942755,\n    \"tests/models/test_channel.py::test_channel_name_subdir_only\": 0.004003208172832212,\n    \"tests/models/test_channel.py::test_channels_with_dashes\": 0.020956459728777924,\n    \"tests/models/test_channel.py::test_custom_channels\": 0.022814924252077515,\n    \"tests/models/test_channel.py::test_custom_channels_port_token_auth\": 0.02235779004164807,\n    \"tests/models/test_channel.py::test_custom_token_in_channel\": 0.015123252310646972,\n    \"tests/models/test_channel.py::test_default_channel[None]\": 0.008732609889339256,\n    \"tests/models/test_channel.py::test_default_channel[win-32]\": 0.004201762820539509,\n    \"tests/models/test_channel.py::test_default_channels\": 0.022776371378136578,\n    \"tests/models/test_channel.py::test_defaults_channel\": 0.029720020477990643,\n    \"tests/models/test_channel.py::test_env_var_file_urls\": 0.007800060790544248,\n    \"tests/models/test_channel.py::test_expanded_variables\": 0.010992713418347094,\n    \"tests/models/test_channel.py::test_file_channel\": 0.0229244064370845,\n    \"tests/models/test_channel.py::test_file_url_with_backslashes\": 0.004272764316628354,\n    \"tests/models/test_channel.py::test_file_urls\": 0.005476831532078275,\n    \"tests/models/test_channel.py::test_local_channel\": 0.10356680929871413,\n    \"tests/models/test_channel.py::test_migrated_custom_channels\": 0.0226420713784981,\n    \"tests/models/test_channel.py::test_multichannel_priority\": 0.004823839649231719,\n    \"tests/models/test_channel.py::test_named_custom_channel\": 0.020857666801900095,\n    \"tests/models/test_channel.py::test_named_custom_channel_w_subchan\": 0.023387678182205454,\n    \"tests/models/test_channel.py::test_old_channel_alias\": 0.026695438865361954,\n    \"tests/models/test_channel.py::test_pkgs_main\": 0.02903829553337325,\n    \"tests/models/test_channel.py::test_pkgs_pro\": 0.027122088257751482,\n    \"tests/models/test_channel.py::test_ppc64le_vs_ppc64\": 0.005245141215534867,\n    \"tests/models/test_channel.py::test_prioritize_channels\": 0.004829289799639074,\n    \"tests/models/test_channel.py::test_regression_against_unknown_none\": 0.005937435489495916,\n    \"tests/models/test_channel.py::test_subdir_env_var\": 0.0150822756613486,\n    \"tests/models/test_channel.py::test_subdirs_env_var\": 0.018144085621829415,\n    \"tests/models/test_channel.py::test_subdirs_kwarg_takes_precedence_over_platform\": 0.005578320284910166,\n    \"tests/models/test_channel.py::test_token_in_custom_channel\": 0.005058523534375475,\n    \"tests/models/test_channel.py::test_unexpanded_variables\": 0.010017707270239512,\n    \"tests/models/test_channel.py::test_url_channel_w_platform\": 0.004874124355373916,\n    \"tests/models/test_channel.py::test_url_custom_channel\": 0.02277454195305068,\n    \"tests/models/test_channel.py::test_url_custom_channel_w_subchan\": 0.02154831312179366,\n    \"tests/models/test_dist.py::test_channel[.conda]\": 0.009263558949732988,\n    \"tests/models/test_dist.py::test_channel[.tar.bz2]\": 0.005290407544854359,\n    \"tests/models/test_dist.py::test_dist[.conda]\": 0.0059607886948114825,\n    \"tests/models/test_dist.py::test_dist[.tar.bz2]\": 0.004750734607949999,\n    \"tests/models/test_dist.py::test_dist_with_channel_url[.conda]\": 0.10608061077544521,\n    \"tests/models/test_dist.py::test_dist_with_channel_url[.tar.bz2]\": 0.11606908444125298,\n    \"tests/models/test_dist.py::test_dist_with_non_channel_url[.conda]\": 0.006832273281561652,\n    \"tests/models/test_dist.py::test_dist_with_non_channel_url[.tar.bz2]\": 0.006801704382346794,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[-None]\": 0.003559942984213849,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[0-None]\": 0.003581507554996246,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[0.0-None]\": 0.0031860512856660803,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[1-NoarchType.generic]\": 0.0037691424700346215,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[1.0-NoarchType.generic]\": 0.003941452634633288,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[42-NoarchType.generic]\": 0.0032218731008042192,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[FALSE-None]\": 0.004419948390809814,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[False-None0]\": 0.003414510105770859,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[False-None1]\": 0.0037489891679092493,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[GENERIC-NoarchType.generic]\": 0.0036909561166388358,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[Generic-NoarchType.generic]\": 0.003315116722145273,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[N-None]\": 0.0030759300523462004,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[NO-None]\": 0.005618376289585373,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[NONE-None]\": 0.003691935912382511,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[NULL-None]\": 0.0032401238641589013,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[No-None]\": 0.005167258804319472,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[NoarchType.generic-NoarchType.generic]\": 0.003419554899156863,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[NoarchType.python-NoarchType.python]\": 0.003228474180280429,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[Non-None]\": 0.003089853549083907,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[None-None]\": 0.003253043821562788,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[Null-None]\": 0.004335695333607072,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[OFF-None]\": 0.0033735747381643992,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[ON-NoarchType.generic]\": 0.00416832583772679,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[Off-None]\": 0.0038347235618285997,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[On-NoarchType.generic]\": 0.004132739999523365,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[PYTHON-NoarchType.python]\": 0.003511306720767652,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[Python-NoarchType.python]\": 0.003978188550644289,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[TRUE-NoarchType.generic]\": 0.004155661257401209,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[True-NoarchType.generic0]\": 0.004933710921069817,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[True-NoarchType.generic1]\": 0.003917838603347129,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[Y-NoarchType.generic]\": 0.004293513454107848,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[YES-NoarchType.generic]\": 0.0030511484962579345,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[Yes-NoarchType.generic]\": 0.0057472105646479595,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[\\\\x00-None]\": 0.003520964571235689,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[false-None]\": 0.0040364090352378685,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[foobar-CondaUpgradeError]\": 0.005168909262429408,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[generic-NoarchType.generic]\": 0.0033049005899962337,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[invalid-CondaUpgradeError]\": 0.003956175008654704,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[n-None]\": 0.004047630221773659,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[no-None]\": 0.004185430903354565,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[non-None]\": 0.003098764155772866,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[none-None]\": 0.0038143879082450263,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[null-None]\": 0.003314532322896719,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[off-None]\": 0.003356650625830281,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[on-NoarchType.generic]\": 0.004112368827072596,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[other-CondaUpgradeError]\": 0.00567212108028569,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[python-NoarchType.python]\": 0.004255939043025668,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[true-NoarchType.generic]\": 0.004145290914145445,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[unknown-CondaUpgradeError]\": 0.0037686998245693177,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[value2-NoarchType.python]\": 0.003571493027813554,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[value3-NoarchType.generic]\": 0.003921488363488119,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[y-NoarchType.generic]\": 0.003649593387737985,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[yes-NoarchType.generic]\": 0.003859763532801203,\n    \"tests/models/test_enums.py::test_noarch_type_coercion[~-None]\": 0.003582010480058302,\n    \"tests/models/test_environment.py::test_config_from_cli_channels_behaviors\": 0.00519968471867827,\n    \"tests/models/test_environment.py::test_config_from_cli_channels_empty\": 0.0033341956460281536,\n    \"tests/models/test_environment.py::test_create_environment_missing_required_fields\": 0.003583822885944259,\n    \"tests/models/test_environment.py::test_create_invalid_platform\": 0.003234472482033122,\n    \"tests/models/test_environment.py::test_create_missing_explicit_package\": 0.007498871094469546,\n    \"tests/models/test_environment.py::test_ensure_no_duplicate_named_explicit_packages\": 0.005051625273689534,\n    \"tests/models/test_environment.py::test_environment_config_channels_basic\": 0.004508173194480232,\n    \"tests/models/test_environment.py::test_environment_config_from_context\": 0.05028533868533594,\n    \"tests/models/test_environment.py::test_environments_merge\": 0.007158204463158883,\n    \"tests/models/test_environment.py::test_environments_merge_colliding_name\": 0.0036255615146318304,\n    \"tests/models/test_environment.py::test_environments_merge_colliding_platform\": 0.003115756177394852,\n    \"tests/models/test_environment.py::test_environments_merge_colliding_prefix\": 0.003099400418933132,\n    \"tests/models/test_environment.py::test_environments_merge_explicit_packages\": 0.005819205215104383,\n    \"tests/models/test_environment.py::test_explicit_packages\": 0.8465757798108724,\n    \"tests/models/test_environment.py::test_extrapolate\": 20.45164841398633,\n    \"tests/models/test_environment.py::test_from_cli_accepts_multi_platform_file_covering_current\": 0.01362900504681619,\n    \"tests/models/test_environment.py::test_from_cli_channel_order_base_file_cli\": 0.012390033546972119,\n    \"tests/models/test_environment.py::test_from_cli_empty\": 0.005553648846176814,\n    \"tests/models/test_environment.py::test_from_cli_empty_with_default_packages\": 0.01955364235020293,\n    \"tests/models/test_environment.py::test_from_cli_environment_inject_default_packages_override_file\": 0.02072441067543533,\n    \"tests/models/test_environment.py::test_from_cli_inject_default_packages_override\": 0.02506835679425927,\n    \"tests/models/test_environment.py::test_from_cli_mix_explicit_and_specs\": 0.005292108455368195,\n    \"tests/models/test_environment.py::test_from_cli_override_channels_excludes_file_channels\": 0.021041845006587807,\n    \"tests/models/test_environment.py::test_from_cli_pre_flight_rejects_incompatible_files[1]\": 0.005000869015663767,\n    \"tests/models/test_environment.py::test_from_cli_pre_flight_rejects_incompatible_files[2]\": 0.006673307390620664,\n    \"tests/models/test_environment.py::test_from_cli_with_explicit_specs\": 0.009271658655055755,\n    \"tests/models/test_environment.py::test_from_cli_with_files\": 0.008767826592271464,\n    \"tests/models/test_environment.py::test_from_cli_with_specs\": 0.007648601445422258,\n    \"tests/models/test_environment.py::test_from_prefix_behavior_with_pip_interoperability\": 22.95012265986908,\n    \"tests/models/test_environment.py::test_from_prefix_options_affect_correct_packages\": 0.6692511973016302,\n    \"tests/models/test_environment.py::test_from_prefix_package_population_semantics\": 0.5691129886412909,\n    \"tests/models/test_environment.py::test_merge_channel_settings\": 0.0031833267560315514,\n    \"tests/models/test_environment.py::test_merge_configs_channel_order_last_wins\": 0.002983162340473797,\n    \"tests/models/test_environment.py::test_merge_configs_deduplicate_values\": 0.0032020425128776544,\n    \"tests/models/test_environment.py::test_merge_configs_primitive_none_values_order\": 0.006096986508769032,\n    \"tests/models/test_environment.py::test_merge_configs_primitive_values_order_one\": 0.003087513236878511,\n    \"tests/models/test_environment.py::test_merge_configs_primitive_values_order_two\": 0.004333016197030526,\n    \"tests/models/test_match_spec.py::test_bracket_matches\": 0.012266794894752566,\n    \"tests/models/test_match_spec.py::test_build_glob_merge\": 0.03058006832106787,\n    \"tests/models/test_match_spec.py::test_build_glob_merge_channel\": 0.006967646326689065,\n    \"tests/models/test_match_spec.py::test_build_merge\": 0.006042858909677327,\n    \"tests/models/test_match_spec.py::test_build_number_and_filename\": 0.0031420452371329678,\n    \"tests/models/test_match_spec.py::test_build_number_merge\": 0.015375540371275316,\n    \"tests/models/test_match_spec.py::test_canonical_string_forms\": 0.01568749423694769,\n    \"tests/models/test_match_spec.py::test_catch_invalid_regexes\": 0.007076096472222989,\n    \"tests/models/test_match_spec.py::test_channel_matching\": 0.0070403817007833,\n    \"tests/models/test_match_spec.py::test_channel_merge\": 0.005467329201515743,\n    \"tests/models/test_match_spec.py::test_comment\": 0.0031631341769837768,\n    \"tests/models/test_match_spec.py::test_conda_build_form[build_only]\": 0.0034861756232130604,\n    \"tests/models/test_match_spec.py::test_conda_build_form[build_version]\": 0.0050048049714757565,\n    \"tests/models/test_match_spec.py::test_conda_build_form[name_only]\": 0.020045413310174908,\n    \"tests/models/test_match_spec.py::test_conda_build_form[version_only]\": 0.0144416247663975,\n    \"tests/models/test_match_spec.py::test_conda_env_form[conda-forge::numpy==1.21.0=py39h1234567_0-numpy=1.21.0=py39h1234567_0]\": 0.0048788033503977014,\n    \"tests/models/test_match_spec.py::test_conda_env_form[numpy=1.21.0-numpy=1.21.0]\": 0.0053551700782226855,\n    \"tests/models/test_match_spec.py::test_conda_env_form[numpy==1.21.0=py39h1234567_0-numpy=1.21.0=py39h1234567_0]\": 0.00342721895460896,\n    \"tests/models/test_match_spec.py::test_conda_env_form[pkgs/main::pandas==1.3.0=py39h123_0-pandas=1.3.0=py39h123_0]\": 0.005321912306124143,\n    \"tests/models/test_match_spec.py::test_conda_env_form[python==3.9.7-python=3.9.7]\": 0.004245387672004155,\n    \"tests/models/test_match_spec.py::test_conda_env_form[scipy==1.7.0=py39h456_0-scipy=1.7.0=py39h456_0]\": 0.004250334211871246,\n    \"tests/models/test_match_spec.py::test_conda_env_form_comprehensive\": 0.0074360424660663655,\n    \"tests/models/test_match_spec.py::test_conda_style\": 0.003668401771231211,\n    \"tests/models/test_match_spec.py::test_dist\": 0.006412339526439576,\n    \"tests/models/test_match_spec.py::test_dist_str\": 0.010328198341728942,\n    \"tests/models/test_match_spec.py::test_exact_values\": 0.004407377285509318,\n    \"tests/models/test_match_spec.py::test_hash\": 0.004370122878001328,\n    \"tests/models/test_match_spec.py::test_hash_merge_with_name[md5]\": 0.008405521774236847,\n    \"tests/models/test_match_spec.py::test_hash_merge_with_name[sha256]\": 0.006634089296876259,\n    \"tests/models/test_match_spec.py::test_hash_merge_wo_name[md5]\": 0.004637224162399524,\n    \"tests/models/test_match_spec.py::test_hash_merge_wo_name[sha256]\": 0.0039992895940978886,\n    \"tests/models/test_match_spec.py::test_index_record\": 0.006536236823753463,\n    \"tests/models/test_match_spec.py::test_invalid\": 0.0031402509288751736,\n    \"tests/models/test_match_spec.py::test_invalid_match_spec\": 0.002816325904337673,\n    \"tests/models/test_match_spec.py::test_invalid_version_reports_spec[pkg 4.2.2<6.0.0]\": 0.003738442073289037,\n    \"tests/models/test_match_spec.py::test_invalid_version_reports_spec[pkg>=0.10.0,<1.0.0<py312|>=0.13.0,<1.0.0>=py312]\": 0.004067183333541838,\n    \"tests/models/test_match_spec.py::test_key_value_features_canonical_string_forms\": 0.0006524862514404209,\n    \"tests/models/test_match_spec.py::test_legacy_features_canonical_string_forms\": 0.0032036813938352065,\n    \"tests/models/test_match_spec.py::test_license_match\": 0.012145479104848094,\n    \"tests/models/test_match_spec.py::test_match_1\": 0.016754595414248195,\n    \"tests/models/test_match_spec.py::test_matchspec_errors\": 0.007616768757113775,\n    \"tests/models/test_match_spec.py::test_merge_multiple_name\": 0.006072444974944864,\n    \"tests/models/test_match_spec.py::test_merge_single_name\": 0.007340756888316446,\n    \"tests/models/test_match_spec.py::test_no_name_match_spec\": 0.0050628825973125955,\n    \"tests/models/test_match_spec.py::test_no_triple_equals_roundtrip\": 0.0037936699948037606,\n    \"tests/models/test_match_spec.py::test_openssl_match\": 0.01021405450762953,\n    \"tests/models/test_match_spec.py::test_parse_build_number_brackets\": 0.003389219237559038,\n    \"tests/models/test_match_spec.py::test_parse_channel_subdir\": 0.004853523362150642,\n    \"tests/models/test_match_spec.py::test_parse_equal_equal\": 0.003959623132607563,\n    \"tests/models/test_match_spec.py::test_parse_errors\": 0.0038978140450418924,\n    \"tests/models/test_match_spec.py::test_parse_hard\": 0.004343764317819297,\n    \"tests/models/test_match_spec.py::test_parse_parens\": 0.004865214496543671,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_no_brackets\": 0.005484743567176536,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_tarball_url\": 0.006412029017559827,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_with_brackets\": 0.00543562749482061,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[conda-forge::numpy>=1.20-numpy->=1.20]\": 0.010376788446938935,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy 1.20 py39_0-numpy-1.20]\": 0.0045676444491826625,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy-numpy-None]\": 0.006130442966801122,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy>=1.20-numpy->=1.20]\": 0.005366335596400622,\n    \"tests/models/test_match_spec.py::test_parse_spec_str_with_precompiled_regex[numpy[version='>=1.20']-numpy->=1.20]\": 0.0055797461542888525,\n    \"tests/models/test_match_spec.py::test_pip_style2\": 0.004554794198002353,\n    \"tests/models/test_match_spec.py::test_pip_style[foo>=1.3-foo[version='>=1.3']]\": 0.004566816640789342,\n    \"tests/models/test_match_spec.py::test_pip_style[numpy >=1.9-numpy[version='>=1.9']]\": 0.00383974171170152,\n    \"tests/models/test_match_spec.py::test_pip_style[zope.int>=1.3,<3.0-zope.int[version='>=1.3,<3.0']]\": 0.0041374920565411255,\n    \"tests/models/test_match_spec.py::test_simple[foo=1.3.0=3-foo==1.3.0=3]\": 0.0033529111455398723,\n    \"tests/models/test_match_spec.py::test_simple[ipython=0.13.0-ipython=0.13.0]\": 0.004439682901795454,\n    \"tests/models/test_match_spec.py::test_simple[ipython=0.13.2-ipython=0.13.2]\": 0.00325458729880866,\n    \"tests/models/test_match_spec.py::test_simple[ipython==0.13.0-ipython==0.13.0]\": 0.003849329958700229,\n    \"tests/models/test_match_spec.py::test_simple[python-python]\": 0.003472460273026749,\n    \"tests/models/test_match_spec.py::test_simple[python=2.6*-python=2.6]\": 0.003712910946347747,\n    \"tests/models/test_match_spec.py::test_simple[python=2.6-python=2.6]\": 0.0041427295892660036,\n    \"tests/models/test_match_spec.py::test_star_name\": 0.0036963416982764446,\n    \"tests/models/test_match_spec.py::test_strictness\": 0.004758245114511353,\n    \"tests/models/test_match_spec.py::test_subdir_merge\": 0.006960002743274213,\n    \"tests/models/test_match_spec.py::test_tarball_match_specs\": 0.010554659838986078,\n    \"tests/models/test_match_spec.py::test_to_filename\": 0.0074369068365470565,\n    \"tests/models/test_match_spec.py::test_track_features_match\": 0.009762731550468844,\n    \"tests/models/test_match_spec.py::test_url_percent_encoding\": 0.00750713048833998,\n    \"tests/models/test_match_spec.py::test_version_wildcard_serialization\": 0.006709786804870906,\n    \"tests/models/test_package_info.py::test_package_info\": 0.009170463979238022,\n    \"tests/models/test_prefix_graph.py::test_deep_cyclical_dependency[classic]\": 3.2307693396316752,\n    \"tests/models/test_prefix_graph.py::test_deep_cyclical_dependency[libmamba]\": 0.8202815907893073,\n    \"tests/models/test_prefix_graph.py::test_general_graph_bfs_simple[classic]\": 0.02752151456360894,\n    \"tests/models/test_prefix_graph.py::test_general_graph_bfs_simple[libmamba]\": 0.02469876506821204,\n    \"tests/models/test_prefix_graph.py::test_general_graph_bfs_version[classic]\": 0.02704033004431867,\n    \"tests/models/test_prefix_graph.py::test_general_graph_bfs_version[libmamba]\": 0.02071930573531292,\n    \"tests/models/test_prefix_graph.py::test_prefix_graph_1[classic]\": 11.89839218245966,\n    \"tests/models/test_prefix_graph.py::test_prefix_graph_1[libmamba]\": 0.7625344397689006,\n    \"tests/models/test_prefix_graph.py::test_prefix_graph_2[classic]\": 12.161782469415503,\n    \"tests/models/test_prefix_graph.py::test_prefix_graph_2[libmamba]\": 0.6025674659818763,\n    \"tests/models/test_prefix_graph.py::test_remove_youngest_descendant_nodes_with_specs[classic]\": 12.59791070880558,\n    \"tests/models/test_prefix_graph.py::test_remove_youngest_descendant_nodes_with_specs[libmamba]\": 0.7567228198060517,\n    \"tests/models/test_prefix_graph.py::test_sort_without_prep[classic]\": 12.548428733435042,\n    \"tests/models/test_prefix_graph.py::test_sort_without_prep[libmamba]\": 2.0234840269046765,\n    \"tests/models/test_prefix_graph.py::test_windows_sort_orders_1[classic]\": 12.09246936156507,\n    \"tests/models/test_prefix_graph.py::test_windows_sort_orders_1[libmamba]\": 2.646793202639001,\n    \"tests/models/test_prefix_graph.py::test_windows_sort_orders_2[classic]\": 13.981669468573552,\n    \"tests/models/test_prefix_graph.py::test_windows_sort_orders_2[libmamba]\": 2.338847220107226,\n    \"tests/models/test_records.py::test_package_record_feature\": 0.005173244217278484,\n    \"tests/models/test_records.py::test_package_record_spec_strings[my-package-2.1.0-alpha-py38_custom.build-my-package=2.1.0-alpha=py38_custom.build-my-package=2.1.0-alpha]\": 0.0065073269262677595,\n    \"tests/models/test_records.py::test_package_record_spec_strings[numpy-1.21.0-py39h_0-numpy=1.21.0=py39h_0-numpy=1.21.0]\": 0.006142934370145408,\n    \"tests/models/test_records.py::test_package_record_spec_strings[scipy_special-1.7.0-py39_1-scipy_special=1.7.0=py39_1-scipy_special=1.7.0]\": 0.006227676624634121,\n    \"tests/models/test_records.py::test_package_record_spec_strings[tensorflow-2.8.0-cuda112py39_0-tensorflow=2.8.0=cuda112py39_0-tensorflow=2.8.0]\": 0.005156924685033037,\n    \"tests/models/test_records.py::test_package_record_spec_strings_vs_str\": 0.005015247205021807,\n    \"tests/models/test_records.py::test_package_record_timestamp\": 0.00648005601521746,\n    \"tests/models/test_records.py::test_package_virtual_package[123-testbuild]\": 0.006019286969045843,\n    \"tests/models/test_records.py::test_package_virtual_package[None-None]\": 0.00600946798340684,\n    \"tests/models/test_records.py::test_package_virtual_package[None-testbuild]\": 0.0058848096657603145,\n    \"tests/models/test_records.py::test_prefix_record_no_channel\": 0.005693643773878402,\n    \"tests/models/test_records.py::test_record_spec_strings_inheritance[PackageRecord-extra_kwargs0]\": 0.005815626015764926,\n    \"tests/models/test_records.py::test_record_spec_strings_inheritance[PrefixRecord-extra_kwargs1]\": 0.006356633371563395,\n    \"tests/models/test_records.py::test_requested_spec\": 0.8117094379738286,\n    \"tests/models/test_version.py::test_compatible_release_versions\": 0.0033548502327545413,\n    \"tests/models/test_version.py::test_compound_versions\": 0.004386219428056677,\n    \"tests/models/test_version.py::test_hexrd\": 0.0028335903446853844,\n    \"tests/models/test_version.py::test_invalid_version_specs\": 0.0035086162374608054,\n    \"tests/models/test_version.py::test_local_identifier\": 0.002893698407282012,\n    \"tests/models/test_version.py::test_match\": 0.006709881700962513,\n    \"tests/models/test_version.py::test_not_eq_star\": 0.0029682523670707148,\n    \"tests/models/test_version.py::test_openssl_convention\": 0.0036119924520672956,\n    \"tests/models/test_version.py::test_pep440\": 0.004759552813550929,\n    \"tests/models/test_version.py::test_pep_440_arbitrary_equality_operator\": 0.0036353202163421174,\n    \"tests/models/test_version.py::test_ver_eval\": 0.004008987491235885,\n    \"tests/models/test_version.py::test_ver_eval_errors\": 0.0027153132965055484,\n    \"tests/models/test_version.py::test_version_order\": 0.0062940185976681,\n    \"tests/models/test_version.py::test_version_spec_1\": 0.0037632647512376547,\n    \"tests/models/test_version.py::test_version_spec_2\": 0.0035142308313774392,\n    \"tests/models/test_version.py::test_version_spec_3\": 0.0032534223686041938,\n    \"tests/models/test_version.py::test_version_spec_4\": 0.0029155257503358047,\n    \"tests/notices/test_cache.py::test_clear_cache_invalidates_notices_cache[empty]\": 0.010570457357110692,\n    \"tests/notices/test_cache.py::test_clear_cache_invalidates_notices_cache[with-viewed-ids]\": 0.008500530285557164,\n    \"tests/notices/test_cache.py::test_clear_cache_removes_channel_response_caches\": 0.007092120357274975,\n    \"tests/notices/test_cache.py::test_clear_cache_survives_os_error[channel_response_cache]\": 0.008038792071488388,\n    \"tests/notices/test_cache.py::test_clear_cache_survives_os_error[notices_cache]\": 0.0076121331426455595,\n    \"tests/notices/test_core.py::test__conda_user_story__disable_notices\": 0.020367053638016545,\n    \"tests/notices/test_core.py::test__conda_user_story__more_notices_message\": 0.2007057923866766,\n    \"tests/notices/test_core.py::test__conda_user_story__only_see_once\": 0.21046136372666505,\n    \"tests/notices/test_core.py::test_display_notices_happy_path[200]\": 0.3588409190338839,\n    \"tests/notices/test_core.py::test_display_notices_happy_path[404]\": 0.35922588586512094,\n    \"tests/notices/test_core.py::test_display_notices_happy_path[500]\": 0.3527042334838735,\n    \"tests/notices/test_core.py::test_notices_decorator\": 0.2118576209379098,\n    \"tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.models.channel]\": 0.5382848835407467,\n    \"tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.cache]\": 0.5806117021259382,\n    \"tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.fetch]\": 0.5920366252926362,\n    \"tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.types]\": 0.54287130712237,\n    \"tests/notices/test_deferred_imports.py::test_notices_core_does_not_eagerly_import[conda.notices.views]\": 0.6431355750110966,\n    \"tests/notices/test_deferred_imports.py::test_notices_core_does_not_load_requests\": 0.5830005146927213,\n    \"tests/notices/test_fetch.py::test_get_channel_notice_response_malformed_json\": 0.18054409750828937,\n    \"tests/notices/test_fetch.py::test_get_channel_notice_response_timeout_error\": 0.17071506324788688,\n    \"tests/notices/test_fetch.py::test_notice_response_cache_expired\": 0.0032108957974727893,\n    \"tests/notices/test_types.py::test_channel_notice_response\": 0.0032682458531572323,\n    \"tests/notices/test_types.py::test_channel_notice_response_date_parse_error\": 0.003677279762496058,\n    \"tests/notices/test_types.py::test_channel_notice_response_integer_id\": 0.00337104353291486,\n    \"tests/notices/test_types.py::test_channel_notice_undefined_id\": 0.0027510107132150317,\n    \"tests/plugins/reporter_backends/test_console.py::test_console_reporter_renderer\": 0.005510690154991365,\n    \"tests/plugins/reporter_backends/test_console.py::test_console_reporter_renderer_envs_list\": 0.008036394779175003,\n    \"tests/plugins/reporter_backends/test_console.py::test_prompt\": 0.0034048920020896965,\n    \"tests/plugins/reporter_backends/test_console.py::test_prompt_bad_option\": 0.0030360054067023415,\n    \"tests/plugins/reporter_backends/test_console.py::test_prompt_error_reading_stdin\": 0.004028070671171783,\n    \"tests/plugins/reporter_backends/test_console.py::test_quiet_spinner\": 0.0030722202760591327,\n    \"tests/plugins/reporter_backends/test_console.py::test_quiet_spinner_with_error\": 0.003073517313413007,\n    \"tests/plugins/reporter_backends/test_console.py::test_spinner\": 0.17811483227544012,\n    \"tests/plugins/reporter_backends/test_console.py::test_spinner_with_error\": 0.17245834621479794,\n    \"tests/plugins/reporter_backends/test_console.py::test_spinner_with_os_error_errno_epipe\": 0.05262880860382246,\n    \"tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_os_error\": 0.004440995558287316,\n    \"tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_os_error_with_epipe_errno\": 0.004248382390983966,\n    \"tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_update_to_os_error\": 0.00785009554613117,\n    \"tests/plugins/reporter_backends/test_console.py::test_tqdm_progress_bar_update_to_os_error_with_errno_epipe\": 0.006966544852064212,\n    \"tests/plugins/reporter_backends/test_json.py::test_json_handler\": 0.0041311629028464615,\n    \"tests/plugins/reporter_backends/test_json.py::test_json_progress_bar_enabled\": 0.005660638829003523,\n    \"tests/plugins/reporter_backends/test_json.py::test_json_progress_bar_not_enabled\": 0.004905754310590926,\n    \"tests/plugins/reporter_backends/test_json.py::test_json_spinner\": 0.003611049693225991,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files[.pyc]\": 0.015875886504455424,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files[.pyo]\": 0.00894984968203431,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyc-False]\": 0.00772994808331688,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyc-True]\": 0.008367090464988973,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyo-False]\": 0.008963149296496062,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_altered_files_action[.pyo-True]\": 0.009563176257582066,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_cannot_be_loaded[.pyc]\": 0.008276223694463684,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_cannot_be_loaded[.pyo]\": 0.006397391811547099,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_keys_missing[.pyc]\": 0.007162406350872201,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_json_keys_missing[.pyo]\": 0.006998164665508332,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files[.pyc]\": 0.011781447006961664,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files[.pyo]\": 0.00838791565484797,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyc-False]\": 0.00800015559339902,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyc-True]\": 0.008554105732483708,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyo-False]\": 0.006931815513229597,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_no_altered_files_action[.pyo-True]\": 0.011672150826688314,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_wrong_path_version[.pyc]\": 0.007495635563210778,\n    \"tests/plugins/subcommands/doctor/health_checks/test_altered_files.py::test_wrong_path_version[.pyo]\": 0.0082759132087907,\n    \"tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_check_fails\": 1.3466379418855388,\n    \"tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_check_fails_verbose\": 0.7234452045964268,\n    \"tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_check_passes\": 1.0802666490831117,\n    \"tests/plugins/subcommands/doctor/health_checks/test_consistency.py::test_env_consistency_constrains_not_met\": 0.813246943138456,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_env_txt_check_action[.pyc]\": 0.008977506512466411,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_env_txt_check_action[.pyo]\": 0.00928789430549027,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_listed_on_envs_txt_file[.pyc]\": 0.011609293140803792,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_listed_on_envs_txt_file[.pyo]\": 0.011314278608687762,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_env_txt_check_action[.pyc]\": 0.008734295755155509,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_env_txt_check_action[.pyo]\": 0.016730102851809377,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_listed_on_envs_txt_file[.pyc]\": 0.008624352130239717,\n    \"tests/plugins/subcommands/doctor/health_checks/test_environment_txt.py::test_not_listed_on_envs_txt_file[.pyo]\": 0.010428676017651467,\n    \"tests/plugins/subcommands/doctor/health_checks/test_file_locking.py::test_file_locking_not_supported\": 4.810820967671605,\n    \"tests/plugins/subcommands/doctor/health_checks/test_file_locking.py::test_file_locking_supported[False]\": 6.767817787922704,\n    \"tests/plugins/subcommands/doctor/health_checks/test_file_locking.py::test_file_locking_supported[True]\": 6.8814076072136725,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files[.pyc]\": 0.00911673244378429,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files[.pyo]\": 0.0065599691999173,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyc-False]\": 0.007466797241951139,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyc-True]\": 0.0076224608010861715,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyo-False]\": 0.008005840454730496,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_missing_files_action[.pyo-True]\": 0.008743577614902487,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files[.pyc]\": 0.007901053000413515,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files[.pyo]\": 0.007343427657620289,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyc-False]\": 0.008552138941267341,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyc-True]\": 0.008324440148659483,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyo-False]\": 0.00764689380713016,\n    \"tests/plugins/subcommands/doctor/health_checks/test_missing_files.py::test_no_missing_files_action[.pyo-True]\": 0.0089609022979844,\n    \"tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[\\\"conda\\\"-\\\\u274c]\": 0.30753849066101596,\n    \"tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[-\\\\u2705]\": 0.23553904346533117,\n    \"tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[conda 1.11, otherpackages==1-\\\\u274c]\": 0.2603083469829682,\n    \"tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[conda 1.11-\\\\u2705]\": 0.3104817946396769,\n    \"tests/plugins/subcommands/doctor/health_checks/test_pinned.py::test_pinned_will_formatted_check[imnotinstalledyet-\\\\u274c]\": 0.21467348950000809,\n    \"tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_fails[.pyc]\": 6.297582319475705,\n    \"tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_fails[.pyo]\": 6.249821056575497,\n    \"tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_non_existent_path[.pyc]\": 0.008832447451241426,\n    \"tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_non_existent_path[.pyo]\": 0.009110954186630164,\n    \"tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_passes[.pyc]\": 0.011922255388591072,\n    \"tests/plugins/subcommands/doctor/health_checks/test_requests_ca_bundle.py::test_requests_ca_bundle_check_action_passes[.pyo]\": 0.014485253335845208,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_fix_dry_run\": 0.39784037051961885,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_fix_yes\": 0.4148902338991604,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_happy_path\": 5.0200480939832595,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_happy_path_show_help\": 0.07219343857403447,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_happy_path_verbose\": 4.9970653430133405,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_list\": 0.13406789903343638,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_specific_check\": 0.0907472065416626,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_with_non_existent_environment\": 0.07609475123204133,\n    \"tests/plugins/subcommands/doctor/test_cli.py::test_conda_doctor_with_test_environment\": 0.27861337083033827,\n    \"tests/plugins/test_auth_handlers.py::test_duplicated\": 0.007665690119912052,\n    \"tests/plugins/test_auth_handlers.py::test_get_auth_handler\": 0.006969075313656007,\n    \"tests/plugins/test_auth_handlers.py::test_get_auth_handler_multiple\": 0.006524755902660087,\n    \"tests/plugins/test_config.py::test_plugin_config_data_env_var_source\": 0.0030637448077123486,\n    \"tests/plugins/test_config.py::test_plugin_config_data_file_source\": 0.013743012054472502,\n    \"tests/plugins/test_config.py::test_plugin_config_data_skip_bad_values\": 0.002817226344228918,\n    \"tests/plugins/test_config.py::test_plugin_config_from_file\": 0.011927350585897854,\n    \"tests/plugins/test_config.py::test_plugin_describe_parameters\": 0.00498968948904248,\n    \"tests/plugins/test_config.py::test_plugins_config_from_environment\": 0.00579740913945244,\n    \"tests/plugins/test_env_specs.py::test_alias_and_name_collision_detect\": 0.008023455883016662,\n    \"tests/plugins/test_env_specs.py::test_alias_normalization\": 0.0030569937796257824,\n    \"tests/plugins/test_env_specs.py::test_available_platforms[default-single-platform]\": 0.0074796005469650595,\n    \"tests/plugins/test_env_specs.py::test_available_platforms[override-multi-platform]\": 0.0035393774217524765,\n    \"tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[cep-24-CEP-24 compliant YAML environment specification-environment]\": 0.008494092560384466,\n    \"tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[environment.yml-Standard YAML environment specification with dependencies-environment]\": 0.007847486451096754,\n    \"tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[explicit-Explicit package URLs for fully reproducible environments-lockfile]\": 0.006594440430049514,\n    \"tests/plugins/test_env_specs.py::test_builtin_specifiers_have_metadata[requirements.txt-Simple text file with package specifications-environment]\": 0.008694233581499018,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[environment.yaml-cep-24]\": 0.01316697181502479,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[environment.yml-cep-24]\": 0.01425829099436836,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[explicit.txt-explicit]\": 0.009831414372863796,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[requirements.txt-requirements.txt]\": 0.010903920305100928,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_by_filename[spec.txt-requirements.txt]\": 0.009709585586784496,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_no_match_raises_error\": 0.011734119405942774,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_pattern_matching_with_wildcard\": 0.017530553904978076,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_phase2_fallback\": 0.011693781324723264,\n    \"tests/plugins/test_env_specs.py::test_detect_environment_specifier_with_invalid_contents\": 0.01220711973718158,\n    \"tests/plugins/test_env_specs.py::test_detect_spec_with_aliases\": 0.005939518169326329,\n    \"tests/plugins/test_env_specs.py::test_dummy_random_spec_is_registered\": 0.0064157387636883745,\n    \"tests/plugins/test_env_specs.py::test_env_for_returns_requested_platform[default-single-platform]\": 0.0030488514844257963,\n    \"tests/plugins/test_env_specs.py::test_env_for_returns_requested_platform[override-multi-platform]\": 0.00371427228128951,\n    \"tests/plugins/test_env_specs.py::test_env_for_unknown_platform_raises[default-single-platform]\": 0.003448699265639732,\n    \"tests/plugins/test_env_specs.py::test_env_for_unknown_platform_raises[override-multi-platform]\": 0.003645143703167264,\n    \"tests/plugins/test_env_specs.py::test_env_spec_iteration_pattern[default-single-platform]\": 0.0031280101406565564,\n    \"tests/plugins/test_env_specs.py::test_env_spec_iteration_pattern[override-multi-platform]\": 0.0028568878906192197,\n    \"tests/plugins/test_env_specs.py::test_explicitly_select_a_non_autodetect_plugin\": 0.006245848841735704,\n    \"tests/plugins/test_env_specs.py::test_get_spec_by_aliases\": 0.006398527134109234,\n    \"tests/plugins/test_env_specs.py::test_naught_plugin_does_not_cause_unhandled_errors_during_detection\": 0.006730273527893397,\n    \"tests/plugins/test_env_specs.py::test_naughty_plugin_does_not_cause_unhandled_errors\": 0.00736016918818531,\n    \"tests/plugins/test_env_specs.py::test_raise_error_for_multiple_registered_installers\": 0.00765631810376444,\n    \"tests/plugins/test_env_specs.py::test_raise_error_for_overlapping_default_filename\": 0.0116032570959602,\n    \"tests/plugins/test_env_specs.py::test_raises_an_error_if_file_is_unhandleable\": 0.007368744576399407,\n    \"tests/plugins/test_env_specs.py::test_raises_an_error_if_named_plugin_can_not_be_handled\": 0.007090327744443193,\n    \"tests/plugins/test_env_specs.py::test_raises_an_error_if_no_plugins_found\": 0.006804721788143578,\n    \"tests/plugins/test_env_specs.py::test_raises_an_error_if_plugin_name_does_not_exist\": 0.006354536543177389,\n    \"tests/plugins/test_environment_export.py::test_alias_normalization_and_collision_detection\": 0.002946813686977528,\n    \"tests/plugins/test_environment_export.py::test_builtin_explicit_exporter_with_urls\": 0.01802255284536269,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[environment-json-expected_aliases1]\": 0.017756153623991355,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[environment-yaml-expected_aliases0]\": 0.018644908078563956,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[explicit-expected_aliases2]\": 0.017703460798188006,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_define_expected_aliases[requirements-expected_aliases3]\": 0.01726044850038585,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[environment-json-JSON format with channels and dependencies-environment]\": 0.018039065965149478,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[environment-yaml-YAML format with channels and dependencies-environment]\": 0.016292394540602006,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[explicit-Explicit URLs for exact package reproduction (lockfile)-lockfile]\": 0.018206100672976205,\n    \"tests/plugins/test_environment_export.py::test_builtin_exporters_have_metadata[requirements-Simple text format with package specifications-environment]\": 0.01747324587470653,\n    \"tests/plugins/test_environment_export.py::test_builtin_requirements_exporter\": 0.016268720391086663,\n    \"tests/plugins/test_environment_export.py::test_builtin_structured_exporters[environment-json-loads]\": 0.02027048783265313,\n    \"tests/plugins/test_environment_export.py::test_builtin_structured_exporters[environment-yaml-safe_load]\": 0.02870967088032949,\n    \"tests/plugins/test_environment_export.py::test_compare_export_commands[args0-explicit]\": 1.316152392412993,\n    \"tests/plugins/test_environment_export.py::test_compare_export_commands[args1-environment-yaml]\": 0.778207160648104,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[env.unknown-None]\": 0.017536309249967272,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[environment.json-environment-json]\": 0.016873746353078152,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[environment.yaml-environment-yaml]\": 0.01801045610069399,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[environment.yml-environment-yaml]\": 0.01749626729243094,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[explicit.txt-explicit]\": 0.014790890878769745,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[my-env.yaml-None]\": 0.018682296850089687,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[requirements.txt-requirements]\": 0.01621336104298367,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter[spec.txt-requirements]\": 0.022678629901541663,\n    \"tests/plugins/test_environment_export.py::test_detect_environment_exporter_with_fnmatch_pattern\": 0.023170417924257874,\n    \"tests/plugins/test_environment_export.py::test_explicit_exporter_cep23_compliance_error\": 0.0221987084998075,\n    \"tests/plugins/test_environment_export.py::test_exporter_error_conditions[explicit-test_env-Cannot export explicit format]\": 0.017262288026560192,\n    \"tests/plugins/test_environment_export.py::test_exporter_error_conditions[requirements-test_env_with_explicit_packages-Cannot export requirements format]\": 0.02076735969670557,\n    \"tests/plugins/test_environment_export.py::test_exporter_pattern_backward_compatibility\": 0.016224632228501776,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[environment-json-True]\": 0.015749925612667418,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[environment-yaml-True]\": 0.021487865078544124,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[explicit-True]\": 0.015594778148439736,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[json-True]\": 0.020948258046825124,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[reqs-True]\": 0.017308069056246635,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[requirements-True]\": 0.017224406696144723,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[txt-True]\": 0.016216740032647833,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[unknown-False]\": 0.015698985962109738,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[yaml-True]\": 0.016613710551387724,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporter_by_format[yml-True]\": 0.026334909340930985,\n    \"tests/plugins/test_environment_export.py::test_get_environment_exporters\": 0.014552350141568329,\n    \"tests/plugins/test_environment_export.py::test_multi_platform_export\": 0.020169154772262308,\n    \"tests/plugins/test_environment_export.py::test_only_one_export[both]\": 0.004329890229837614,\n    \"tests/plugins/test_environment_export.py::test_only_one_export[export]\": 0.0036666251069414502,\n    \"tests/plugins/test_environment_export.py::test_only_one_export[multiplatform_export]\": 0.0033263782310122172,\n    \"tests/plugins/test_environment_export.py::test_only_one_export[none]\": 0.004052532403604741,\n    \"tests/plugins/test_environment_export.py::test_single_platform_export\": 0.019970567381014673,\n    \"tests/plugins/test_environment_export.py::test_yaml_exporter_explicit_packages_format\": 0.024024565619456838,\n    \"tests/plugins/test_environment_export.py::test_yaml_exporter_handles_missing_name\": 0.019650522591410535,\n    \"tests/plugins/test_environment_export.py::test_yaml_exporter_with_empty_env\": 0.02407763092407155,\n    \"tests/plugins/test_health_checks.py::test_fix_user_cancels_no_warning\": 0.06348324256685361,\n    \"tests/plugins/test_health_checks.py::test_health_check_not_ran\": 0.08067126131253724,\n    \"tests/plugins/test_health_checks.py::test_health_check_ran\": 0.07264272032462459,\n    \"tests/plugins/test_hookspec.py::test_deprecations[spec_name]\": 0.0031193197575130394,\n    \"tests/plugins/test_manager.py::test_custom_plugin_name_validation\": 0.008085254422215004,\n    \"tests/plugins/test_manager.py::test_disable_external_plugins[VerboseSolverPlugin]\": 0.006214738268686431,\n    \"tests/plugins/test_manager.py::test_disable_external_plugins[tests.plugins.test_manager]\": 0.006113184373585004,\n    \"tests/plugins/test_manager.py::test_get_canonical_name_class\": 0.006542368999778708,\n    \"tests/plugins/test_manager.py::test_get_canonical_name_instance\": 0.008144821230154758,\n    \"tests/plugins/test_manager.py::test_get_canonical_name_module\": 0.0075716593664407646,\n    \"tests/plugins/test_manager.py::test_get_canonical_name_object\": 0.007913196866782225,\n    \"tests/plugins/test_manager.py::test_get_hook_results\": 0.0075480150563503505,\n    \"tests/plugins/test_manager.py::test_get_request_headers\": 0.005785211558514753,\n    \"tests/plugins/test_manager.py::test_get_session_headers\": 0.005854593280135572,\n    \"tests/plugins/test_manager.py::test_get_solvers\": 0.008660836242373633,\n    \"tests/plugins/test_manager.py::test_get_virtual_package_records\": 0.008551033199479982,\n    \"tests/plugins/test_manager.py::test_known_solver\": 0.005572591981367236,\n    \"tests/plugins/test_manager.py::test_load_entrypoints_blocked\": 0.020023113469780543,\n    \"tests/plugins/test_manager.py::test_load_entrypoints_importerror\": 0.02635443956196381,\n    \"tests/plugins/test_manager.py::test_load_entrypoints_register_valueerror\": 0.0244895820549357,\n    \"tests/plugins/test_manager.py::test_load_entrypoints_success\": 0.02081504973627186,\n    \"tests/plugins/test_manager.py::test_load_plugins_error\": 0.005028265473728042,\n    \"tests/plugins/test_manager.py::test_load_two_plugins_one_impls\": 0.006131178073084071,\n    \"tests/plugins/test_manager.py::test_load_without_plugins\": 0.005318565139236019,\n    \"tests/plugins/test_manager.py::test_plugin_bad_names[42]\": 0.0044280517655988965,\n    \"tests/plugins/test_manager.py::test_plugin_bad_names[False]\": 0.0029957171533611677,\n    \"tests/plugins/test_manager.py::test_plugin_bad_names[None]\": 0.0032415712129100958,\n    \"tests/plugins/test_manager.py::test_plugin_bad_names[True]\": 0.003122508126877475,\n    \"tests/plugins/test_manager.py::test_plugin_bad_names[name4]\": 0.003275519075487663,\n    \"tests/plugins/test_manager.py::test_plugin_bad_names[name5]\": 0.003880661508921257,\n    \"tests/plugins/test_manager.py::test_plugin_name\": 0.0029682670845329793,\n    \"tests/plugins/test_manager.py::test_unknown_solver\": 0.00703963639242222,\n    \"tests/plugins/test_package_extractors.py::test_extract_package\": 0.021662550161760608,\n    \"tests/plugins/test_package_extractors.py::test_get_package_extractor[.conda-None]\": 0.0030290625665706605,\n    \"tests/plugins/test_package_extractors.py::test_get_package_extractor[.not_supported-PluginError]\": 0.003399556193652548,\n    \"tests/plugins/test_package_extractors.py::test_get_package_extractor[.tar.bz2-None]\": 0.004023301412600717,\n    \"tests/plugins/test_package_extractors.py::test_get_package_extractors\": 0.007852096560838994,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[-None]\": 0.00958531527304922,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[/path/to/package.random-.random]\": 0.007628268520820376,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[package-None]\": 0.00862464517711072,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[package.RANDOM-.random]\": 0.007956133237427658,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[package.UPPER-.upper]\": 0.008374242823683153,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[package.other-None]\": 0.00712881760513211,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[package.random-.random]\": 0.007445992632944997,\n    \"tests/plugins/test_package_extractors.py::test_has_package_extension[package.upper-.upper]\": 0.0077897116552636024,\n    \"tests/plugins/test_package_extractors.py::test_plugin_fetches_correct_extractor\": 0.013194331998286131,\n    \"tests/plugins/test_post_commands.py::test_post_command_action_raises_exception\": 0.08068302357334976,\n    \"tests/plugins/test_post_commands.py::test_post_command_invoked\": 0.08712542703466457,\n    \"tests/plugins/test_post_commands.py::test_post_command_not_invoked\": 0.09041838527685707,\n    \"tests/plugins/test_post_solves.py::test_post_solve_action_raises_exception\": 2.3328227966555386,\n    \"tests/plugins/test_post_solves.py::test_post_solve_invoked\": 5.094257859332086,\n    \"tests/plugins/test_post_solves.py::test_post_solve_not_invoked\": 0.08201599760545449,\n    \"tests/plugins/test_pre_commands.py::test_pre_command_action_raises_exception\": 0.06230029086796897,\n    \"tests/plugins/test_pre_commands.py::test_pre_command_invoked\": 0.09129314093078957,\n    \"tests/plugins/test_pre_commands.py::test_pre_command_not_invoked\": 0.17536706074726083,\n    \"tests/plugins/test_pre_solves.py::test_pre_solve_action_raises_exception\": 0.08657864795963423,\n    \"tests/plugins/test_pre_solves.py::test_pre_solve_invoked\": 2.4695453120760034,\n    \"tests/plugins/test_pre_solves.py::test_pre_solve_not_invoked\": 0.12236142251893672,\n    \"tests/plugins/test_reporter_backends.py::test_console_reporter_backend[detail_view-classic-argument2-\\\\n test : something\\\\n\\\\n]\": 0.009365169067500819,\n    \"tests/plugins/test_reporter_backends.py::test_console_reporter_backend[detail_view-json-argument3-{\\\\n  \\\"test\\\": \\\"something\\\"\\\\n}]\": 0.007005687498229698,\n    \"tests/plugins/test_reporter_backends.py::test_console_reporter_backend[render-classic-test-test\\\\n]\": 0.008056675148156674,\n    \"tests/plugins/test_reporter_backends.py::test_console_reporter_backend[render-json-test-\\\"test\\\"]\": 0.008025333166073447,\n    \"tests/plugins/test_reporter_backends.py::test_default_reporter_backends_are_registered\": 0.006771138736534225,\n    \"tests/plugins/test_reporter_backends.py::test_dummy_reporter_backend_is_registered\": 0.006194539238443608,\n    \"tests/plugins/test_request_headers.py::test_get_request_headers[example.com/endpoint.json]\": 0.006653411391835246,\n    \"tests/plugins/test_request_headers.py::test_get_request_headers[example.com/path/somewhere.txt]\": 0.006345589340338879,\n    \"tests/plugins/test_request_headers.py::test_get_request_headers[example.com]\": 0.008144098059424447,\n    \"tests/plugins/test_request_headers.py::test_get_request_headers[random.com/endpoint.json]\": 0.00598712419980128,\n    \"tests/plugins/test_request_headers.py::test_get_request_headers[random.com]\": 0.025494286870836956,\n    \"tests/plugins/test_request_headers.py::test_get_session_headers[example.com/endpoint.json]\": 0.007032783561165888,\n    \"tests/plugins/test_request_headers.py::test_get_session_headers[example.com/path/somewhere.txt]\": 0.006878991426178119,\n    \"tests/plugins/test_request_headers.py::test_get_session_headers[example.com]\": 0.00703765694935107,\n    \"tests/plugins/test_request_headers.py::test_get_session_headers[random.com/endpoint.json]\": 0.0075935525041909285,\n    \"tests/plugins/test_request_headers.py::test_get_session_headers[random.com]\": 0.0073669041840607385,\n    \"tests/plugins/test_settings.py::test_conda_config_describe_includes_plugin_settings\": 0.19449053645257086,\n    \"tests/plugins/test_settings.py::test_conda_config_describe_not_included_without_plugins\": 0.210196759109919,\n    \"tests/plugins/test_settings.py::test_conda_config_describe_unknown_plugin_setting\": 0.09623649839138072,\n    \"tests/plugins/test_settings.py::test_conda_config_retrieves_correct_description_single_setting[map_parameter-Test map type setting]\": 0.0789919801113439,\n    \"tests/plugins/test_settings.py::test_conda_config_retrieves_correct_description_single_setting[seq_parameter-Test sequence type setting]\": 0.10242750077416646,\n    \"tests/plugins/test_settings.py::test_conda_config_retrieves_correct_description_single_setting[string_parameter-Test string type setting]\": 0.10363308288001571,\n    \"tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[map_parameter-plugins:\\\\n  map_parameter: {}\\\\n]\": 0.18714377340449692,\n    \"tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[non_existent_parameter-expected_output3]\": 0.25092493346149014,\n    \"tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[seq_parameter-plugins:\\\\n  seq_parameter: []\\\\n]\": 0.15745751557605991,\n    \"tests/plugins/test_settings.py::test_conda_config_show_for_individual_settings[string_parameter-plugins:\\\\n  string_parameter: value_one\\\\n]\": 0.16481232651289426,\n    \"tests/plugins/test_settings.py::test_conda_config_show_includes_plugin_settings\": 0.35308347765876164,\n    \"tests/plugins/test_settings.py::test_conda_config_with_invalid_setting\": 0.09380595714595716,\n    \"tests/plugins/test_settings.py::test_conda_config_with_map_settings\": 0.20213400208497723,\n    \"tests/plugins/test_settings.py::test_conda_config_with_sequence_settings\": 0.2022883663050726,\n    \"tests/plugins/test_settings.py::test_conda_config_with_string_settings\": 0.243344116087706,\n    \"tests/plugins/test_settings.py::test_get_settings\": 0.005662987026243048,\n    \"tests/plugins/test_settings.py::test_load_configuration_parameters\": 0.006853310174864632,\n    \"tests/plugins/test_settings.py::test_load_plugin_config_with_env_var\": 0.017499289558656067,\n    \"tests/plugins/test_settings.py::test_load_plugin_settings_with_condarc\": 0.018876155921854376,\n    \"tests/plugins/test_solvers.py::test_duplicated\": 0.008369093230795849,\n    \"tests/plugins/test_solvers.py::test_get_cached_solver_backend\": 0.009422568255713686,\n    \"tests/plugins/test_solvers.py::test_get_conflicting_solvers\": 0.006217978448739531,\n    \"tests/plugins/test_solvers.py::test_get_no_solver\": 0.005482644711644902,\n    \"tests/plugins/test_solvers.py::test_get_one_solver\": 0.006730303278486053,\n    \"tests/plugins/test_solvers.py::test_get_solver_backend\": 0.01641155444422631,\n    \"tests/plugins/test_solvers.py::test_get_solver_backend_multiple\": 0.016771564817395005,\n    \"tests/plugins/test_solvers.py::test_get_two_solvers\": 0.006695170782201824,\n    \"tests/plugins/test_solvers.py::test_solver_user_agent\": 0.01665571853597892,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[activate]\": 0.06177260556537377,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[clean]\": 0.06226391137041998,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[commands]\": 0.0675800940970349,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[compare]\": 0.08608266938810231,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[config]\": 0.07513000878264524,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[create]\": 0.06140359189716622,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[deactivate]\": 0.057411996240643366,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[env]\": 0.0640488712042599,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[export]\": 0.06234793988592619,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[info]\": 0.0562080393610683,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[init]\": 0.06201006758482683,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[install]\": 0.07061573965989579,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[list]\": 0.07887011101473526,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[notices]\": 0.08545970344759764,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[package]\": 0.05802724990717212,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[remove]\": 0.065092972818858,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[rename]\": 0.06104474672530978,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[run]\": 0.05919975456968734,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[search]\": 0.07538229353693991,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[uninstall]\": 0.06299568361248119,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[update]\": 0.08074024764327446,\n    \"tests/plugins/test_subcommands.py::test_cannot_override_builtin_commands[upgrade]\": 0.06356854133168038,\n    \"tests/plugins/test_subcommands.py::test_custom_plugin_extend_parser\": 0.061556785419216546,\n    \"tests/plugins/test_subcommands.py::test_custom_plugin_not_extend_parser\": 0.07862055262275564,\n    \"tests/plugins/test_subcommands.py::test_duplicated\": 0.0057731822583853894,\n    \"tests/plugins/test_subcommands.py::test_help\": 0.050954946550567,\n    \"tests/plugins/test_subcommands.py::test_invoked\": 0.07698505412312652,\n    \"tests/plugins/test_subcommands.py::test_parser_no_plugins\": 0.08041981941622058,\n    \"tests/plugins/test_transaction_hooks.py::test_post_transaction_raises_exception\": 0.6404788935587888,\n    \"tests/plugins/test_transaction_hooks.py::test_pre_transaction_raises_exception\": 1.1507677641662768,\n    \"tests/plugins/test_transaction_hooks.py::test_transaction_hooks_invoked\": 0.6020245166245038,\n    \"tests/plugins/test_types.py::TestCondaEnvironmentExporter::test_backward_compatibility_without_new_fields\": 0.0028872865716188267,\n    \"tests/plugins/test_types.py::TestCondaEnvironmentExporter::test_description_defaults_to_name\": 0.0028484493729574126,\n    \"tests/plugins/test_types.py::TestCondaEnvironmentExporter::test_explicit_description_preserved\": 0.003088349874418517,\n    \"tests/plugins/test_types.py::TestCondaEnvironmentSpecifier::test_backward_compatibility_without_new_fields\": 0.0024844005083586866,\n    \"tests/plugins/test_types.py::TestCondaEnvironmentSpecifier::test_description_defaults_to_name\": 0.002682113371995512,\n    \"tests/plugins/test_types.py::TestCondaEnvironmentSpecifier::test_explicit_description_preserved\": 0.0027951353499335177,\n    \"tests/plugins/test_virtual_packages.py::test_archspec_override[None-False]\": 0.9155074717026079,\n    \"tests/plugins/test_virtual_packages.py::test_archspec_override[bla-True]\": 0.42989588258824385,\n    \"tests/plugins/test_virtual_packages.py::test_conda_virtual_package\": 0.18528061166265875,\n    \"tests/plugins/test_virtual_packages.py::test_context_override[Both `CONDA_OVERRIDE_FOO` gets precedence and `context.override_virtual_packages` are set]\": 0.006146202871338018,\n    \"tests/plugins/test_virtual_packages.py::test_context_override[`CONDA_OVERRIDE_FOO` not set, but `context.override_virtual_packages` is set]\": 0.007645233713510137,\n    \"tests/plugins/test_virtual_packages.py::test_cuda_detection\": 0.8830738058967486,\n    \"tests/plugins/test_virtual_packages.py::test_cuda_override[override-empty]\": 0.012268142943350567,\n    \"tests/plugins/test_virtual_packages.py::test_cuda_override[override-set]\": 0.014623105741153873,\n    \"tests/plugins/test_virtual_packages.py::test_duplicated\": 5.46863610457061,\n    \"tests/plugins/test_virtual_packages.py::test_glibc_override[1.0-True]\": 0.0850121693783034,\n    \"tests/plugins/test_virtual_packages.py::test_glibc_override[None-False]\": 0.01753208275339104,\n    \"tests/plugins/test_virtual_packages.py::test_invoked\": 10.073163870885999,\n    \"tests/plugins/test_virtual_packages.py::test_linux_override[1.0-True]\": 0.13194370390661303,\n    \"tests/plugins/test_virtual_packages.py::test_linux_override[None-True]\": 0.3186377419880483,\n    \"tests/plugins/test_virtual_packages.py::test_linux_value\": 0.021509913486780732,\n    \"tests/plugins/test_virtual_packages.py::test_no_gpu_cuda\": 1.7684846435156838,\n    \"tests/plugins/test_virtual_packages.py::test_no_gpu_cuda_patched\": 0.0030077384507636922,\n    \"tests/plugins/test_virtual_packages.py::test_osx_override[1.0-True]\": 0.18206731992776873,\n    \"tests/plugins/test_virtual_packages.py::test_osx_override[None-False]\": 0.17099377735915752,\n    \"tests/plugins/test_virtual_packages.py::test_osx_value\": 0.1851026711234215,\n    \"tests/plugins/test_virtual_packages.py::test_override_mock_calls[base case, no override]\": 0.005760275512660375,\n    \"tests/plugins/test_virtual_packages.py::test_override_mock_calls[build overriden]\": 0.007536551836279036,\n    \"tests/plugins/test_virtual_packages.py::test_override_mock_calls[version overriden]\": 0.006500899900666107,\n    \"tests/plugins/test_virtual_packages.py::test_override_package_values[build override with `empty_override=None`]\": 0.00627737955667956,\n    \"tests/plugins/test_virtual_packages.py::test_override_package_values[build override]\": 0.00693018626692723,\n    \"tests/plugins/test_virtual_packages.py::test_override_package_values[no override]\": 0.006989725562024294,\n    \"tests/plugins/test_virtual_packages.py::test_override_package_values[version override with `empty_override=None`]\": 0.007210172353739085,\n    \"tests/plugins/test_virtual_packages.py::test_override_package_values[version override]\": 0.0075351215056720135,\n    \"tests/plugins/test_virtual_packages.py::test_package_is_NULL[`build=NULL` returns NULL package]\": 0.005375070916715054,\n    \"tests/plugins/test_virtual_packages.py::test_package_is_NULL[`empty_override=NULL` returns NULL package]\": 0.0049407674123928425,\n    \"tests/plugins/test_virtual_packages.py::test_package_is_NULL[`empty_override=None` returns valid package]\": 0.007513942850329148,\n    \"tests/plugins/test_virtual_packages.py::test_package_is_NULL[`version=NULL` returns NULL package ]\": 0.0048427485011914755,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[emscripten-wasm32]\": 0.021496093146411873,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[freebsd-64]\": 0.018615620055698667,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-32]\": 0.018728839385534646,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-64]\": 0.01962486604219331,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-aarch64]\": 0.017406860622091343,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-armv6l]\": 0.02218299271192618,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-armv7l]\": 0.01824059816962396,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-ppc64]\": 0.02133575797917302,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-ppc64le]\": 0.019776590750856707,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-riscv64]\": 0.018761136891662245,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[linux-s390x]\": 0.02053113765474566,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[osx-64]\": 0.01823272561242075,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[osx-aarch64]\": 0.02424930050214297,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[osx-arm64]\": 0.018783388633198585,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[wasi-wasm32]\": 0.017466387109981076,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[win-32]\": 0.0181591801528609,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[win-64_0]\": 0.018760478340339948,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[win-64_1]\": 0.02007159575746052,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[win-arm64]\": 0.016857272061901987,\n    \"tests/plugins/test_virtual_packages.py::test_subdir_override[zos-z]\": 0.02275127912617051,\n    \"tests/plugins/test_virtual_packages.py::test_version_validation[no version validation, no override]\": 0.006007388238801088,\n    \"tests/plugins/test_virtual_packages.py::test_version_validation[version validation, no override]\": 0.006513449096258592,\n    \"tests/plugins/test_virtual_packages.py::test_version_validation[version validation, override]\": 0.006204551934855947,\n    \"tests/plugins/test_virtual_packages.py::test_win_override[1.0-True]\": 0.019404970808739003,\n    \"tests/plugins/test_virtual_packages.py::test_win_override[None-False]\": 0.019115347223608994,\n    \"tests/plugins/test_virtual_packages.py::test_win_value\": 0.017087219092260148,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_activate_error[cmd.exe]\": 0.0002458790594808359,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_activate_invalid_temp[cmd.exe]\": 0.00042063285087991665,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_activate_script_failure[cmd.exe]\": 0.00019875575696461466,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_basic_integration[cmd.exe]\": 0.0003159745632226955,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_deactivate_help[cmd.exe]\": 0.00013845824997815726,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_existing_env_with_special_chars[python=3.12-cmd.exe]\": 0.0002098587464768927,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_existing_env_with_special_chars[test!important!env-cmd.exe]\": 0.0001399300667045376,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[!-cmd.exe]\": 0.00020486957180073062,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[%-cmd.exe]\": 0.0002490800666150348,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[(-cmd.exe]\": 0.00016090733314590893,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[)-cmd.exe]\": 0.0001390942660705613,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[=-cmd.exe]\": 0.00022614668170484802,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_env_activate_by_path[^-cmd.exe]\": 0.00028406664027064664,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[!-cmd.exe]\": 0.00014893552496879884,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[%-cmd.exe]\": 0.00021093394115634552,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[(-cmd.exe]\": 0.00013911547315435786,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[)-cmd.exe]\": 0.0003121441761457033,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[=-cmd.exe]\": 0.0001383077170960685,\n    \"tests/shell/test_cmd_exe.py::test_cmd_exe_special_char_prompt_display[^-cmd.exe]\": 0.0001641709216783755,\n    \"tests/shell/test_cmd_exe.py::test_legacy_activate_deactivate_cmd_exe[cmd.exe]\": 0.0002680293877887613,\n    \"tests/shell/test_cmd_exe.py::test_shell_available[cmd.exe]\": 0.0008555203299887173,\n    \"tests/shell/test_csh.py::test_basic_integration[csh]\": 5.782904011471404,\n    \"tests/shell/test_csh.py::test_basic_integration[tcsh]\": 6.45835370351718,\n    \"tests/shell/test_csh.py::test_shell_available[csh]\": 0.005801910700657312,\n    \"tests/shell/test_csh.py::test_shell_available[tcsh]\": 0.0016348798300461923,\n    \"tests/shell/test_fish.py::test_fish_basic_integration[fish]\": 16.553252755891833,\n    \"tests/shell/test_fish.py::test_fish_disable_prompt\": 0.04002660382289743,\n    \"tests/shell/test_fish.py::test_fish_prompt_functions_in_hook\": 0.025940803163042862,\n    \"tests/shell/test_fish.py::test_shell_available[fish]\": 0.003480408591897288,\n    \"tests/shell/test_posix.py::test_bash_activate_error[ash]\": 0.00022489826312394864,\n    \"tests/shell/test_posix.py::test_bash_activate_error[bash]\": 4.333333465566059,\n    \"tests/shell/test_posix.py::test_bash_activate_error[dash]\": 3.9077182643181265,\n    \"tests/shell/test_posix.py::test_bash_activate_error[zsh]\": 3.933610067817321,\n    \"tests/shell/test_posix.py::test_basic_integration[ash]\": 0.00020077279725626103,\n    \"tests/shell/test_posix.py::test_basic_integration[bash]\": 18.72139708631054,\n    \"tests/shell/test_posix.py::test_basic_integration[dash]\": 15.786398527837239,\n    \"tests/shell/test_posix.py::test_basic_integration[zsh]\": 14.269164675967236,\n    \"tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[ash]\": 0.00014093250931358176,\n    \"tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[bash]\": 5.903254690329539,\n    \"tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[dash]\": 0.0007039696829239963,\n    \"tests/shell/test_posix.py::test_legacy_activate_deactivate_bash[zsh]\": 5.42648422340978,\n    \"tests/shell/test_posix.py::test_shell_available[ash]\": 0.00024929907975246464,\n    \"tests/shell/test_posix.py::test_shell_available[bash]\": 0.0008256895662998032,\n    \"tests/shell/test_posix.py::test_shell_available[dash]\": 0.0026376560161624507,\n    \"tests/shell/test_posix.py::test_shell_available[zsh]\": 0.0024175747948098616,\n    \"tests/shell/test_powershell.py::test_powershell_PATH_management[powershell]\": 7.2476489560040225,\n    \"tests/shell/test_powershell.py::test_powershell_basic_integration[powershell]\": 12.217302827602913,\n    \"tests/shell/test_powershell.py::test_shell_available[powershell]\": 0.0013387154864506832,\n    \"tests/shell/test_shell.py::test_activate_deactivate_modify_path[ash]\": 0.0003109749971429464,\n    \"tests/shell/test_shell.py::test_activate_deactivate_modify_path[bash]\": 3.8133376031942756,\n    \"tests/shell/test_shell.py::test_activate_deactivate_modify_path[cmd.exe]\": 0.0004653699274529765,\n    \"tests/shell/test_shell.py::test_activate_deactivate_modify_path[dash]\": 3.8087155566696547,\n    \"tests/shell/test_shell.py::test_activate_deactivate_modify_path[zsh]\": 4.2154871779516405,\n    \"tests/shell/test_shell.py::test_stacking[0-None-base-base,sys]\": 5.7382223530537475,\n    \"tests/shell/test_shell.py::test_stacking[0-None-has-has,sys]\": 6.0376758999958575,\n    \"tests/shell/test_shell.py::test_stacking[0-None-not-sys]\": 6.381297716058559,\n    \"tests/shell/test_shell.py::test_stacking[0-base-base-base,sys]\": 5.812462940131706,\n    \"tests/shell/test_shell.py::test_stacking[0-base-has-has,sys]\": 5.743677036327138,\n    \"tests/shell/test_shell.py::test_stacking[0-base-not-sys]\": 5.4014515246491595,\n    \"tests/shell/test_shell.py::test_stacking[0-has-base-base,sys]\": 5.23241131087063,\n    \"tests/shell/test_shell.py::test_stacking[0-has-has-has,sys]\": 5.180682657233605,\n    \"tests/shell/test_shell.py::test_stacking[0-has-not-sys]\": 5.294801695063204,\n    \"tests/shell/test_shell.py::test_stacking[0-not-base-base,sys]\": 4.861150139402385,\n    \"tests/shell/test_shell.py::test_stacking[0-not-has-has,sys]\": 5.457715651725507,\n    \"tests/shell/test_shell.py::test_stacking[0-not-not-sys]\": 5.434530110608021,\n    \"tests/shell/test_shell.py::test_stacking[5-base,has-base-base,has,base,sys]\": 5.708179749206318,\n    \"tests/shell/test_shell.py::test_stacking[5-base,has-has-has,base,sys]\": 5.564470287904632,\n    \"tests/shell/test_shell.py::test_stacking[5-base,has-not-has,base,sys]\": 5.6035926011917425,\n    \"tests/shell/test_shell.py::test_stacking[5-base,not-base-base,base,sys]\": 5.847438248825592,\n    \"tests/shell/test_shell.py::test_stacking[5-base,not-has-has,base,sys]\": 5.662016030693767,\n    \"tests/shell/test_shell.py::test_stacking[5-base,not-not-base,sys]\": 6.0690570232138645,\n    \"tests/shell/test_shell.py::test_stacking[5-base-base-base,sys]\": 5.141397686845938,\n    \"tests/shell/test_shell.py::test_stacking[5-base-has-has,base,sys]\": 5.05193168878791,\n    \"tests/shell/test_shell.py::test_stacking[5-base-not-base,sys]\": 5.2321337906058165,\n    \"tests/shell/test_shell.py::test_stacking[5-has-base-base,has,sys]\": 4.777258764815082,\n    \"tests/shell/test_shell.py::test_stacking[5-has-has-has,sys]\": 5.322722087196407,\n    \"tests/shell/test_shell.py::test_stacking[5-has-not-has,sys]\": 4.882306776290024,\n    \"tests/shell/test_shell.py::test_stacking[5-not-base-base,sys]\": 5.044867115514644,\n    \"tests/shell/test_shell.py::test_stacking[5-not-has-has,sys]\": 5.485959755639582,\n    \"tests/shell/test_shell.py::test_stacking[5-not-not-sys]\": 5.6103257405898095,\n    \"tests/shell/test_xonsh.py::test_basic_integration[xonsh]\": 11.765378480289904,\n    \"tests/shell/test_xonsh.py::test_shell_available[xonsh]\": 0.003521802060237461,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-clang64 legacy]\": 0.0005246723909849743,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-clang64 mingw64]\": 0.0006734021704437323,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-legacy]\": 0.0005844013936734922,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-mingw64 legacy]\": 0.0005069061692844693,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-nothing]\": 0.0005036440354119912,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-ucrt64 clang64]\": 0.0005591097451168865,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-ucrt64 legacy]\": 0.0005632472932373152,\n    \"tests/test_activate.py::test_MSYS2_PATH[CmdExeActivator-ucrt64]\": 0.0006148346934850531,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-clang64 legacy]\": 0.0006473507228929518,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-clang64 mingw64]\": 0.0005413771438345744,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-legacy]\": 0.0006462888862071032,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-mingw64 legacy]\": 0.0006255875612446127,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-nothing]\": 0.0005628096783635726,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-ucrt64 clang64]\": 0.0006226076288705982,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-ucrt64 legacy]\": 0.0007027814671927231,\n    \"tests/test_activate.py::test_MSYS2_PATH[PowerShellActivator-ucrt64]\": 0.0007817917514211244,\n    \"tests/test_activate.py::test_PS1\": 0.016910813027425458,\n    \"tests/test_activate.py::test_PS1_no_changeps1\": 0.026089633212275476,\n    \"tests/test_activate.py::test_activate_and_deactivate_for_uninitialized_env\": 0.24236743753026635,\n    \"tests/test_activate.py::test_activate_default_env[CmdExeActivator]\": 3.708528571962274,\n    \"tests/test_activate.py::test_activate_default_env[CshActivator]\": 3.8039092424629977,\n    \"tests/test_activate.py::test_activate_default_env[FishActivator]\": 3.652926683503038,\n    \"tests/test_activate.py::test_activate_default_env[PosixActivator]\": 4.285253367946306,\n    \"tests/test_activate.py::test_activate_default_env[PowerShellActivator]\": 3.8392624820278534,\n    \"tests/test_activate.py::test_activate_default_env[XonshActivator]\": 3.700302838094288,\n    \"tests/test_activate.py::test_activate_environment_not_found\": 0.01539834954492413,\n    \"tests/test_activate.py::test_activate_same_environment\": 0.0211122723606492,\n    \"tests/test_activate.py::test_activator_invalid_command_arguments[command_args0-'activate', 'deactivate', 'hook', 'commands', or 'reactivate' command must be given.]\": 0.014577441419619737,\n    \"tests/test_activate.py::test_activator_invalid_command_arguments[command_args1-cannot specify both --stack and --no-stack to activate]\": 0.013788732410838354,\n    \"tests/test_activate.py::test_activator_invalid_command_arguments[command_args2-activate does not accept more than one argument:\\\\n\\\\\\\\['env-one', 'env-two'\\\\\\\\]\\\\n]\": 0.014547003939142242,\n    \"tests/test_activate.py::test_activator_invalid_command_arguments[command_args3-deactivate does not accept arguments\\\\nremainder_args: \\\\\\\\['env-one']\\\\n]\": 0.014709333370462164,\n    \"tests/test_activate.py::test_add_prefix_to_path_cmdexe\": 0.0009417907933933013,\n    \"tests/test_activate.py::test_add_prefix_to_path_posix\": 0.012556290396404775,\n    \"tests/test_activate.py::test_build_activate_dont_activate_unset_var\": 0.027527928543606344,\n    \"tests/test_activate.py::test_build_activate_dont_use_PATH\": 0.023559806439607797,\n    \"tests/test_activate.py::test_build_activate_restore_unset_env_vars\": 0.02567848124398732,\n    \"tests/test_activate.py::test_build_activate_shlvl_0\": 0.020332037795361985,\n    \"tests/test_activate.py::test_build_activate_shlvl_1\": 0.02468502498054346,\n    \"tests/test_activate.py::test_build_activate_shlvl_warn_clobber_vars\": 0.022262752929051957,\n    \"tests/test_activate.py::test_build_deactivate_dont_use_PATH\": 0.03811840143101291,\n    \"tests/test_activate.py::test_build_deactivate_shlvl_1\": 0.023247166264818226,\n    \"tests/test_activate.py::test_build_deactivate_shlvl_2_from_activate\": 0.027368461413021374,\n    \"tests/test_activate.py::test_build_deactivate_shlvl_2_from_stack\": 0.02607304658671075,\n    \"tests/test_activate.py::test_build_stack_shlvl_1\": 0.02492886829370028,\n    \"tests/test_activate.py::test_cmd_exe_basic[False]\": 0.0006057341503240473,\n    \"tests/test_activate.py::test_cmd_exe_basic[True]\": 0.0005893224046883573,\n    \"tests/test_activate.py::test_csh_basic[False]\": 0.0468090471400629,\n    \"tests/test_activate.py::test_csh_basic[True]\": 0.050547520884082243,\n    \"tests/test_activate.py::test_default_env\": 0.015939792366073013,\n    \"tests/test_activate.py::test_fish_basic[False]\": 0.04614205797594405,\n    \"tests/test_activate.py::test_fish_basic[True]\": 0.04657781443537956,\n    \"tests/test_activate.py::test_force_uppercase[False]\": 0.026655528984560407,\n    \"tests/test_activate.py::test_force_uppercase[True]\": 0.02746648180295163,\n    \"tests/test_activate.py::test_get_env_vars_big_whitespace\": 0.01774654961973053,\n    \"tests/test_activate.py::test_get_env_vars_empty_file\": 0.019680464600414296,\n    \"tests/test_activate.py::test_get_export_unset_vars[False]\": 0.026028076487933177,\n    \"tests/test_activate.py::test_get_export_unset_vars[True]\": 0.023372916422199443,\n    \"tests/test_activate.py::test_json_basic[False]\": 0.0435296231692352,\n    \"tests/test_activate.py::test_json_basic[True]\": 0.04751110903710841,\n    \"tests/test_activate.py::test_metavars_force_uppercase[False]\": 0.023703625723194156,\n    \"tests/test_activate.py::test_metavars_force_uppercase[True]\": 0.02502527279543966,\n    \"tests/test_activate.py::test_msys2_shell_line_endings[ash]\": 0.0007644537993299604,\n    \"tests/test_activate.py::test_msys2_shell_line_endings[bash]\": 0.000555247725275198,\n    \"tests/test_activate.py::test_msys2_shell_line_endings[dash]\": 0.0007169441260466816,\n    \"tests/test_activate.py::test_msys2_shell_line_endings[posix]\": 0.0012430328060216015,\n    \"tests/test_activate.py::test_msys2_shell_line_endings[zsh]\": 0.0006919160453980038,\n    \"tests/test_activate.py::test_msys2_shell_stdout_reconfiguration\": 0.0005528107574483903,\n    \"tests/test_activate.py::test_posix_basic[False]\": 0.04905513385811972,\n    \"tests/test_activate.py::test_posix_basic[True]\": 0.04679945132718183,\n    \"tests/test_activate.py::test_powershell_basic[False]\": 0.04571305769479569,\n    \"tests/test_activate.py::test_powershell_basic[True]\": 0.042200473155890796,\n    \"tests/test_activate.py::test_pre_post_command_invoked[activate]\": 0.022154079914958765,\n    \"tests/test_activate.py::test_pre_post_command_invoked[deactivate]\": 0.02003147919270893,\n    \"tests/test_activate.py::test_pre_post_command_invoked[hook]\": 0.032356490313062564,\n    \"tests/test_activate.py::test_pre_post_command_invoked[reactivate]\": 0.017773944558611032,\n    \"tests/test_activate.py::test_pre_post_command_raises[activate]\": 0.02298394773021649,\n    \"tests/test_activate.py::test_pre_post_command_raises[deactivate]\": 0.019295904380797653,\n    \"tests/test_activate.py::test_pre_post_command_raises[hook]\": 0.02098691226066586,\n    \"tests/test_activate.py::test_pre_post_command_raises[reactivate]\": 0.020960419009293116,\n    \"tests/test_activate.py::test_remove_prefix_from_path_1\": 0.014015392201132678,\n    \"tests/test_activate.py::test_remove_prefix_from_path_2\": 0.01487726187011807,\n    \"tests/test_activate.py::test_replace_prefix_in_path_1\": 0.01242845904984453,\n    \"tests/test_activate.py::test_replace_prefix_in_path_2\": 0.0006005416178609227,\n    \"tests/test_activate.py::test_xonsh_basic[False]\": 0.050166073830990504,\n    \"tests/test_activate.py::test_xonsh_basic[True]\": 0.0489877385542688,\n    \"tests/test_api.py::test_DepsModifier_contract\": 0.003492625807495849,\n    \"tests/test_api.py::test_PackageCacheData_contract\": 0.0036520954158717825,\n    \"tests/test_api.py::test_PackageCacheData_return_value_contract\": 0.010459680892345119,\n    \"tests/test_api.py::test_PrefixData_contract\": 0.0035142547040631893,\n    \"tests/test_api.py::test_PrefixData_return_value_contract\": 0.09334464997820753,\n    \"tests/test_api.py::test_Solver_inputs_contract\": 0.003951060224723726,\n    \"tests/test_api.py::test_Solver_return_value_contract\": 2.9044552925252947,\n    \"tests/test_api.py::test_SubdirData_contract\": 0.0032708914095841684,\n    \"tests/test_api.py::test_SubdirData_return_value_contract\": 4.620383626360983,\n    \"tests/test_api.py::test_UpdateModifier_contract\": 0.0031261993972934296,\n    \"tests/test_codesigned.py::test_stub_exe_signatures[shell/cli-32.exe]\": 0.0005824677071077604,\n    \"tests/test_codesigned.py::test_stub_exe_signatures[shell/cli-64.exe0]\": 0.000683729127923121,\n    \"tests/test_codesigned.py::test_stub_exe_signatures[shell/cli-64.exe1]\": 0.0005220852544052363,\n    \"tests/test_create.py::test_allow_softlinks[classic]\": 0.19097045758172887,\n    \"tests/test_create.py::test_allow_softlinks[libmamba]\": 0.17205139928262295,\n    \"tests/test_create.py::test_channel_usage_replacing_python[classic]\": 67.88313387325572,\n    \"tests/test_create.py::test_channel_usage_replacing_python[libmamba]\": 58.51468430857701,\n    \"tests/test_create.py::test_clone_env_with_conda[classic]\": 47.28573522728245,\n    \"tests/test_create.py::test_clone_env_with_conda[libmamba]\": 25.70558957757382,\n    \"tests/test_create.py::test_clone_offline_simple[classic]\": 1.0944170796826092,\n    \"tests/test_create.py::test_clone_offline_simple[libmamba]\": 0.8187205062500975,\n    \"tests/test_create.py::test_clone_offline_with_untracked[classic]\": 1.1061078003324532,\n    \"tests/test_create.py::test_clone_offline_with_untracked[libmamba]\": 1.3581768254088702,\n    \"tests/test_create.py::test_compile_pyc[classic-False]\": 10.751070309745632,\n    \"tests/test_create.py::test_compile_pyc[classic-True]\": 1.453668715806872,\n    \"tests/test_create.py::test_compile_pyc[libmamba-False]\": 10.772160082644113,\n    \"tests/test_create.py::test_compile_pyc[libmamba-True]\": 1.4929279506996012,\n    \"tests/test_create.py::test_conda_pip_interop_compatible_release_operator[classic]\": 1.9523717574244361,\n    \"tests/test_create.py::test_conda_pip_interop_compatible_release_operator[libmamba]\": 1.8653956252986603,\n    \"tests/test_create.py::test_conda_pip_interop_conda_editable_package[classic]\": 23.94965319848013,\n    \"tests/test_create.py::test_conda_pip_interop_conda_editable_package[libmamba]\": 24.577934761557334,\n    \"tests/test_create.py::test_conda_pip_interop_pip_clobbers_conda[classic]\": 0.0002033764683804794,\n    \"tests/test_create.py::test_conda_pip_interop_pip_clobbers_conda[libmamba]\": 0.00020410707211520327,\n    \"tests/test_create.py::test_conda_update_package_is_not_name_only_spec[classic]\": 0.023814191972481503,\n    \"tests/test_create.py::test_conda_update_package_is_not_name_only_spec[libmamba]\": 0.018703862738665762,\n    \"tests/test_create.py::test_conda_update_package_not_installed[classic]\": 0.021870647376956882,\n    \"tests/test_create.py::test_conda_update_package_not_installed[libmamba]\": 0.03184883339225639,\n    \"tests/test_create.py::test_create_default_packages[classic]\": 0.9353886114730591,\n    \"tests/test_create.py::test_create_default_packages[libmamba]\": 1.2135860364251636,\n    \"tests/test_create.py::test_create_default_packages_no_default_packages[classic]\": 1.1261365699842325,\n    \"tests/test_create.py::test_create_default_packages_no_default_packages[libmamba]\": 1.0401425296829088,\n    \"tests/test_create.py::test_create_download_only_without_prefix[classic]\": 0.4325701067478934,\n    \"tests/test_create.py::test_create_download_only_without_prefix[libmamba]\": 0.4360730943417712,\n    \"tests/test_create.py::test_create_dry_run[classic]\": 1.2772371135023306,\n    \"tests/test_create.py::test_create_dry_run[libmamba]\": 1.740715172327587,\n    \"tests/test_create.py::test_create_dry_run_json[classic]\": 0.5206226640470839,\n    \"tests/test_create.py::test_create_dry_run_json[libmamba]\": 0.6241330839500719,\n    \"tests/test_create.py::test_create_dry_run_without_prefix[classic]\": 0.17793924506283773,\n    \"tests/test_create.py::test_create_dry_run_without_prefix[libmamba]\": 0.16245431781081338,\n    \"tests/test_create.py::test_create_dry_run_yes_safety[classic]\": 0.018842038753135816,\n    \"tests/test_create.py::test_create_dry_run_yes_safety[libmamba]\": 0.02976797144770717,\n    \"tests/test_create.py::test_create_empty_env[classic]\": 0.2356111448725942,\n    \"tests/test_create.py::test_create_empty_env[libmamba]\": 0.7743431530789022,\n    \"tests/test_create.py::test_create_env_different_platform[classic-cli]\": 1.0963791308315165,\n    \"tests/test_create.py::test_create_env_different_platform[classic-env]\": 1.0096003474309687,\n    \"tests/test_create.py::test_create_env_different_platform[libmamba-cli]\": 1.0815446979163947,\n    \"tests/test_create.py::test_create_env_different_platform[libmamba-env]\": 0.5634945538942588,\n    \"tests/test_create.py::test_create_files_without_name_or_prefix_raises[classic]\": 0.029673345074735735,\n    \"tests/test_create.py::test_create_files_without_name_or_prefix_raises[libmamba]\": 0.023684691788109558,\n    \"tests/test_create.py::test_create_install_update_remove_smoketest[classic]\": 26.508850178905096,\n    \"tests/test_create.py::test_create_install_update_remove_smoketest[libmamba]\": 22.219018039491477,\n    \"tests/test_create.py::test_create_multiple_files_requires_name_or_prefix[classic]\": 0.016727534054244236,\n    \"tests/test_create.py::test_create_multiple_files_requires_name_or_prefix[libmamba]\": 0.01970398898833572,\n    \"tests/test_create.py::test_create_multiple_files_with_cli_prefix[classic]\": 1.0691139607208011,\n    \"tests/test_create.py::test_create_multiple_files_with_cli_prefix[libmamba]\": 1.041789816337657,\n    \"tests/test_create.py::test_create_name_overrides_file[classic]\": 1.0253661320187224,\n    \"tests/test_create.py::test_create_name_overrides_file[libmamba]\": 1.059079069069906,\n    \"tests/test_create.py::test_create_no_deps_flag[classic]\": 0.5378645823436494,\n    \"tests/test_create.py::test_create_no_deps_flag[libmamba]\": 0.24032002242470935,\n    \"tests/test_create.py::test_create_only_deps_flag[classic]\": 2.9655373084008922,\n    \"tests/test_create.py::test_create_only_deps_flag[libmamba]\": 2.497389444256294,\n    \"tests/test_create.py::test_create_override_channels_enabled[classic]\": 1.106929219221621,\n    \"tests/test_create.py::test_create_override_channels_enabled[libmamba]\": 1.554103890483582,\n    \"tests/test_create.py::test_create_with_clone_and_file_raises_argument_error[classic]\": 0.015250393097347603,\n    \"tests/test_create.py::test_create_with_clone_and_file_raises_argument_error[libmamba]\": 0.017075198959932657,\n    \"tests/test_create.py::test_create_with_clone_and_packages_raises_argument_error[classic]\": 0.020440265632460403,\n    \"tests/test_create.py::test_create_with_clone_and_packages_raises_argument_error[libmamba]\": 0.01976803461610719,\n    \"tests/test_create.py::test_create_with_env_variables_are_set_correctly[classic]\": 1.0057856780217427,\n    \"tests/test_create.py::test_create_with_env_variables_are_set_correctly[libmamba]\": 1.0713124552124507,\n    \"tests/test_create.py::test_create_without_prefix_raises_argument_error[classic]\": 0.023960630251046548,\n    \"tests/test_create.py::test_create_without_prefix_raises_argument_error[libmamba]\": 0.028415098797019332,\n    \"tests/test_create.py::test_cross_channel_incompatibility[classic]\": 8.900357910908015,\n    \"tests/test_create.py::test_cross_channel_incompatibility[libmamba]\": 3.446952355811601,\n    \"tests/test_create.py::test_directory_not_a_conda_environment[classic]\": 0.07951794013118989,\n    \"tests/test_create.py::test_directory_not_a_conda_environment[libmamba]\": 0.02196528243699194,\n    \"tests/test_create.py::test_disallowed_packages[classic]\": 2.7002199269588956,\n    \"tests/test_create.py::test_disallowed_packages[libmamba]\": 1.5439778984617267,\n    \"tests/test_create.py::test_dont_allow_mixed_file_arguments[classic-create]\": 0.029725573155844155,\n    \"tests/test_create.py::test_dont_allow_mixed_file_arguments[classic-install]\": 0.07784199342193587,\n    \"tests/test_create.py::test_dont_allow_mixed_file_arguments[classic-update]\": 0.02742656588422457,\n    \"tests/test_create.py::test_dont_allow_mixed_file_arguments[libmamba-create]\": 0.02223852191702872,\n    \"tests/test_create.py::test_dont_allow_mixed_file_arguments[libmamba-install]\": 0.034521081139561,\n    \"tests/test_create.py::test_dont_allow_mixed_file_arguments[libmamba-update]\": 0.03312793750348629,\n    \"tests/test_create.py::test_dont_remove_conda_1[classic]\": 31.331331054431125,\n    \"tests/test_create.py::test_dont_remove_conda_1[libmamba]\": 20.73568649932129,\n    \"tests/test_create.py::test_dont_remove_conda_2[classic]\": 31.18630084013002,\n    \"tests/test_create.py::test_dont_remove_conda_2[libmamba]\": 20.86660038196799,\n    \"tests/test_create.py::test_dont_remove_conda_3[classic]\": 50.58559115162624,\n    \"tests/test_create.py::test_dont_remove_conda_3[libmamba]\": 28.360798654874586,\n    \"tests/test_create.py::test_download_only_flag[classic]\": 1.624882210051123,\n    \"tests/test_create.py::test_download_only_flag[libmamba]\": 2.55784792362599,\n    \"tests/test_create.py::test_force_remove[classic]\": 2.9595843782733637,\n    \"tests/test_create.py::test_force_remove[libmamba]\": 3.5410473941296963,\n    \"tests/test_create.py::test_install_bound_virtual_package[classic]\": 0.00025325692809685847,\n    \"tests/test_create.py::test_install_bound_virtual_package[libmamba]\": 0.00042185590325146256,\n    \"tests/test_create.py::test_install_broken_post_install_keeps_existing_folders[classic]\": 2.7659658441338477,\n    \"tests/test_create.py::test_install_broken_post_install_keeps_existing_folders[libmamba]\": 3.2385470695202216,\n    \"tests/test_create.py::test_install_force_reinstall_flag[classic]\": 0.3559422397317964,\n    \"tests/test_create.py::test_install_force_reinstall_flag[libmamba]\": 0.613524843587271,\n    \"tests/test_create.py::test_install_multiple_files_with_cli_prefix[classic]\": 1.9399409968776993,\n    \"tests/test_create.py::test_install_multiple_files_with_cli_prefix[libmamba]\": 2.0725709452330805,\n    \"tests/test_create.py::test_install_only_deps_flag[classic]\": 1.0683579617015582,\n    \"tests/test_create.py::test_install_only_deps_flag[libmamba]\": 1.1901377245512768,\n    \"tests/test_create.py::test_install_prune_flag[classic]\": 13.319500993186987,\n    \"tests/test_create.py::test_install_prune_flag[libmamba]\": 11.429875213983227,\n    \"tests/test_create.py::test_install_python_and_search[classic]\": 25.104264344482413,\n    \"tests/test_create.py::test_install_python_and_search[libmamba]\": 17.98075769343601,\n    \"tests/test_create.py::test_install_tarball_from_file_based_channel[classic]\": 0.8399149669203245,\n    \"tests/test_create.py::test_install_tarball_from_file_based_channel[libmamba]\": 1.2972600459981587,\n    \"tests/test_create.py::test_install_update_deps_flag[classic]\": 1.6268467456458346,\n    \"tests/test_create.py::test_install_update_deps_flag[libmamba]\": 1.4353339746343834,\n    \"tests/test_create.py::test_install_update_deps_only_deps_flags[classic]\": 2.000208748661193,\n    \"tests/test_create.py::test_install_update_deps_only_deps_flags[libmamba]\": 2.047786342357797,\n    \"tests/test_create.py::test_install_virtual_packages[classic-__glibc-False]\": 0.91010250784694,\n    \"tests/test_create.py::test_install_virtual_packages[classic-__linux-False]\": 1.196957124820189,\n    \"tests/test_create.py::test_install_virtual_packages[classic-__osx-True]\": 0.43194616818453235,\n    \"tests/test_create.py::test_install_virtual_packages[classic-__unix-True]\": 0.4092945489263785,\n    \"tests/test_create.py::test_install_virtual_packages[classic-__win-False]\": 0.7514677663841479,\n    \"tests/test_create.py::test_install_virtual_packages[libmamba-__glibc-False]\": 1.05500607940086,\n    \"tests/test_create.py::test_install_virtual_packages[libmamba-__linux-False]\": 0.8382073622005697,\n    \"tests/test_create.py::test_install_virtual_packages[libmamba-__osx-True]\": 0.9146049314962565,\n    \"tests/test_create.py::test_install_virtual_packages[libmamba-__unix-True]\": 0.8710379250490972,\n    \"tests/test_create.py::test_install_virtual_packages[libmamba-__win-False]\": 0.8555915116014556,\n    \"tests/test_create.py::test_json_create_install_update_remove[classic]\": 1.1496353517449212,\n    \"tests/test_create.py::test_json_create_install_update_remove[libmamba]\": 4.074095050842808,\n    \"tests/test_create.py::test_list_with_pip_no_binary[classic]\": 12.296941562401221,\n    \"tests/test_create.py::test_list_with_pip_no_binary[libmamba]\": 10.57778716149989,\n    \"tests/test_create.py::test_list_with_pip_wheel[classic]\": 18.947441813718363,\n    \"tests/test_create.py::test_list_with_pip_wheel[libmamba]\": 17.02018346011683,\n    \"tests/test_create.py::test_menuinst_v2[classic]\": 2.2386456189710993,\n    \"tests/test_create.py::test_menuinst_v2[libmamba]\": 2.8403619881564692,\n    \"tests/test_create.py::test_mix_explicit_and_packages[classic-create]\": 0.08250883026523723,\n    \"tests/test_create.py::test_mix_explicit_and_packages[classic-install]\": 0.025744663530760103,\n    \"tests/test_create.py::test_mix_explicit_and_packages[libmamba-create]\": 0.041514198596031754,\n    \"tests/test_create.py::test_mix_explicit_and_packages[libmamba-install]\": 0.02074430752467978,\n    \"tests/test_create.py::test_mix_explicit_file_and_packages[classic-create]\": 0.22006636634315502,\n    \"tests/test_create.py::test_mix_explicit_file_and_packages[classic-install]\": 0.10615523491873802,\n    \"tests/test_create.py::test_mix_explicit_file_and_packages[libmamba-create]\": 0.1411405320602886,\n    \"tests/test_create.py::test_mix_explicit_file_and_packages[libmamba-install]\": 0.1634120200006421,\n    \"tests/test_create.py::test_must_provide_args_to_install[classic]\": 0.021405002398688113,\n    \"tests/test_create.py::test_must_provide_args_to_install[libmamba]\": 0.0275064644962914,\n    \"tests/test_create.py::test_neutering_of_historic_specs[classic]\": 0.00014250679505675685,\n    \"tests/test_create.py::test_neutering_of_historic_specs[libmamba]\": 0.00032951483864024394,\n    \"tests/test_create.py::test_no_channels[classic]\": 0.021480409853436303,\n    \"tests/test_create.py::test_no_channels[libmamba]\": 0.024062326640204048,\n    \"tests/test_create.py::test_noarch_generic_package[classic]\": 0.7101447008162439,\n    \"tests/test_create.py::test_noarch_generic_package[libmamba]\": 0.3725265375362923,\n    \"tests/test_create.py::test_noarch_python_package_reinstall_on_pyver_change[classic]\": 17.14187073624195,\n    \"tests/test_create.py::test_noarch_python_package_reinstall_on_pyver_change[libmamba]\": 17.626584722964616,\n    \"tests/test_create.py::test_noarch_python_package_with_entry_points[classic]\": 11.803124422041332,\n    \"tests/test_create.py::test_noarch_python_package_with_entry_points[libmamba]\": 14.43448279200523,\n    \"tests/test_create.py::test_noarch_python_package_without_entry_points[classic]\": 9.405674408668489,\n    \"tests/test_create.py::test_noarch_python_package_without_entry_points[libmamba]\": 14.034553697756811,\n    \"tests/test_create.py::test_nonadmin_file_untouched[classic]\": 2.05041183390323,\n    \"tests/test_create.py::test_nonadmin_file_untouched[libmamba]\": 2.0043944629869337,\n    \"tests/test_create.py::test_not_writable_env_raises_EnvironmentNotWritableError[classic]\": 0.03002431506553347,\n    \"tests/test_create.py::test_not_writable_env_raises_EnvironmentNotWritableError[libmamba]\": 0.048048049623064096,\n    \"tests/test_create.py::test_offline_with_empty_index_cache[classic]\": 3.2151878479833003,\n    \"tests/test_create.py::test_offline_with_empty_index_cache[libmamba]\": 4.599605530505972,\n    \"tests/test_create.py::test_override_channels_disabled[classic]\": 0.05854919871884532,\n    \"tests/test_create.py::test_override_channels_disabled[libmamba]\": 0.04532562680211737,\n    \"tests/test_create.py::test_package_cache_regression[classic]\": 0.9991344311856702,\n    \"tests/test_create.py::test_package_cache_regression[libmamba]\": 0.8575035640826982,\n    \"tests/test_create.py::test_package_optional_pinning[classic]\": 2.042795581994633,\n    \"tests/test_create.py::test_package_optional_pinning[libmamba]\": 2.0739727826206424,\n    \"tests/test_create.py::test_package_pinning[classic]\": 2.508352900009489,\n    \"tests/test_create.py::test_package_pinning[libmamba]\": 2.8189612382817595,\n    \"tests/test_create.py::test_packages_not_found[classic]\": 0.7593521905181035,\n    \"tests/test_create.py::test_packages_not_found[libmamba]\": 1.5670780868193561,\n    \"tests/test_create.py::test_pinned_override_with_explicit_spec[classic]\": 1.2916743141871017,\n    \"tests/test_create.py::test_pinned_override_with_explicit_spec[libmamba]\": 0.4317556728168961,\n    \"tests/test_create.py::test_post_link_run_in_env[classic]\": 2.1473524921103713,\n    \"tests/test_create.py::test_post_link_run_in_env[libmamba]\": 2.1949800713888736,\n    \"tests/test_create.py::test_python_site_packages_path[classic]\": 2.362631334163523,\n    \"tests/test_create.py::test_python_site_packages_path[libmamba]\": 2.284918739716196,\n    \"tests/test_create.py::test_remove_empty_env[classic]\": 0.9992973236311691,\n    \"tests/test_create.py::test_remove_empty_env[libmamba]\": 1.526236210405812,\n    \"tests/test_create.py::test_remove_force_remove_flag[classic]\": 10.800829202881651,\n    \"tests/test_create.py::test_remove_force_remove_flag[libmamba]\": 12.402270043267958,\n    \"tests/test_create.py::test_remove_ignore_nonenv[classic]\": 0.019421873126434418,\n    \"tests/test_create.py::test_remove_ignore_nonenv[libmamba]\": 0.03055672124438778,\n    \"tests/test_create.py::test_remove_spellcheck[classic]\": 0.9474763115536209,\n    \"tests/test_create.py::test_remove_spellcheck[libmamba]\": 0.9625504136583307,\n    \"tests/test_create.py::test_repodata_v2_base_url[classic]\": 1.156951921909545,\n    \"tests/test_create.py::test_repodata_v2_base_url[libmamba]\": 1.17937915485256,\n    \"tests/test_create.py::test_rm_rf[classic]\": 8.305353551170686,\n    \"tests/test_create.py::test_rm_rf[libmamba]\": 8.736023647984604,\n    \"tests/test_create.py::test_run_preserves_arguments[classic]\": 12.03162050593929,\n    \"tests/test_create.py::test_run_preserves_arguments[libmamba]\": 12.382208102612427,\n    \"tests/test_create.py::test_run_script_called[classic]\": 0.00017107834439094243,\n    \"tests/test_create.py::test_run_script_called[libmamba]\": 0.00020248723331163848,\n    \"tests/test_create.py::test_safety_checks_disabled[classic]\": 9.491944830629935,\n    \"tests/test_create.py::test_safety_checks_disabled[libmamba]\": 8.642464585729865,\n    \"tests/test_create.py::test_safety_checks_enabled[classic]\": 6.525433254849894,\n    \"tests/test_create.py::test_safety_checks_enabled[libmamba]\": 7.385361374954012,\n    \"tests/test_create.py::test_safety_checks_warn[classic]\": 13.114435020218446,\n    \"tests/test_create.py::test_safety_checks_warn[libmamba]\": 12.619409773008371,\n    \"tests/test_create.py::test_search_override_channels_enabled[classic]\": 1.2822596151664194,\n    \"tests/test_create.py::test_search_override_channels_enabled[libmamba]\": 3.393941107319437,\n    \"tests/test_create.py::test_shortcut_absent_does_not_barf_on_uninstall[classic]\": 0.7424729939777528,\n    \"tests/test_create.py::test_shortcut_absent_does_not_barf_on_uninstall[libmamba]\": 1.6058812716289605,\n    \"tests/test_create.py::test_shortcut_absent_when_condarc_set[classic]\": 0.7234791136308492,\n    \"tests/test_create.py::test_shortcut_absent_when_condarc_set[libmamba]\": 1.66828943833921,\n    \"tests/test_create.py::test_shortcut_creation_installs_shortcut[classic]\": 0.7576608935877068,\n    \"tests/test_create.py::test_shortcut_creation_installs_shortcut[libmamba]\": 1.555409853182622,\n    \"tests/test_create.py::test_strict_channel_priority[classic]\": 0.0003104461521301036,\n    \"tests/test_create.py::test_strict_channel_priority[libmamba]\": 0.0002925206990387271,\n    \"tests/test_create.py::test_strict_resolve_get_reduced_index[classic]\": 15.58024238818084,\n    \"tests/test_create.py::test_strict_resolve_get_reduced_index[libmamba]\": 14.72896878337811,\n    \"tests/test_create.py::test_tarball_install[classic]\": 1.0195648404409616,\n    \"tests/test_create.py::test_tarball_install[libmamba]\": 1.3671960162711279,\n    \"tests/test_create.py::test_tarball_install_and_bad_metadata[classic]\": 3.0090546607528497,\n    \"tests/test_create.py::test_tarball_install_and_bad_metadata[libmamba]\": 2.7176686740559592,\n    \"tests/test_create.py::test_transactional_rollback_simple[classic]\": 1.2326534086292142,\n    \"tests/test_create.py::test_transactional_rollback_simple[libmamba]\": 1.2257367622913173,\n    \"tests/test_create.py::test_transactional_rollback_upgrade_downgrade[classic]\": 2.0857767349917737,\n    \"tests/test_create.py::test_transactional_rollback_upgrade_downgrade[libmamba]\": 2.034331339247575,\n    \"tests/test_create.py::test_update_all_updates_pip_pkg[classic]\": 11.740064329929645,\n    \"tests/test_create.py::test_update_all_updates_pip_pkg[libmamba]\": 14.785368049917578,\n    \"tests/test_create.py::test_update_deps_flag_absent[classic]\": 1.7258403317310034,\n    \"tests/test_create.py::test_update_deps_flag_absent[libmamba]\": 1.6653954112652651,\n    \"tests/test_create.py::test_update_deps_flag_present[classic]\": 2.075812184341522,\n    \"tests/test_create.py::test_update_deps_flag_present[libmamba]\": 2.2352869782009672,\n    \"tests/test_create.py::test_update_with_pinned_packages[classic]\": 1.3115646102665963,\n    \"tests/test_create.py::test_update_with_pinned_packages[libmamba]\": 1.1073856679138019,\n    \"tests/test_create.py::test_use_index_cache[classic]\": 5.361974587606935,\n    \"tests/test_create.py::test_use_index_cache[libmamba]\": 5.666767704408559,\n    \"tests/test_deferred_deprecations.py::test_auxlib_logz_does_not_pull_in_serialize_json\": 0.6114771338124001,\n    \"tests/test_deferred_deprecations.py::test_common_serialize_does_not_pull_in_json\": 0.5446047338749054,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.auxlib.logz-DumpEncoder]\": 0.0034788951878397256,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.auxlib.logz-_DUMPS]\": 0.0048697448125381015,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.auxlib.logz-jsondumps]\": 0.003040599624910101,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.common.serialize-EntityEncoder]\": 0.0031713303749398847,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_access_warns[conda.common.serialize-json_load]\": 0.002951691124849276,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.auxlib.logz-DumpEncoder]\": 0.004020251999889979,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.auxlib.logz-_DUMPS]\": 0.0031425132499833808,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.auxlib.logz-jsondumps]\": 0.0035779628124430474,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.common.serialize-EntityEncoder]\": 0.0028907900624375316,\n    \"tests/test_deferred_deprecations.py::test_deprecated_symbol_identity_is_stable[conda.common.serialize-json_load]\": 0.0035395702499982917,\n    \"tests/test_deprecations.py::test_action[future]\": 0.0044182438317234285,\n    \"tests/test_deprecations.py::test_action[pending]\": 0.00541664716009917,\n    \"tests/test_deprecations.py::test_action[remove]\": 0.005431950371035186,\n    \"tests/test_deprecations.py::test_arguments[deprecated]\": 0.0032466886583508046,\n    \"tests/test_deprecations.py::test_arguments[pending]\": 0.0032989802700975532,\n    \"tests/test_deprecations.py::test_arguments[remove]\": 0.003003788489044623,\n    \"tests/test_deprecations.py::test_class[deprecated]\": 0.003677719167976667,\n    \"tests/test_deprecations.py::test_class[pending]\": 0.0035809882408914984,\n    \"tests/test_deprecations.py::test_class[remove]\": 0.002947096326060928,\n    \"tests/test_deprecations.py::test_constant[deprecated]\": 0.0075183894183992635,\n    \"tests/test_deprecations.py::test_constant[pending]\": 0.005277445718125409,\n    \"tests/test_deprecations.py::test_constant[remove]\": 0.005372092152927018,\n    \"tests/test_deprecations.py::test_constant_factory\": 0.0048106862031538355,\n    \"tests/test_deprecations.py::test_constant_factory_rejects_non_callable\": 0.003224860546811925,\n    \"tests/test_deprecations.py::test_constant_multiple_same_module\": 0.005467764958935707,\n    \"tests/test_deprecations.py::test_constant_rejects_value_and_factory_together\": 0.0029825083437806654,\n    \"tests/test_deprecations.py::test_constant_requires_value_or_factory\": 0.003131149124989463,\n    \"tests/test_deprecations.py::test_function[deprecated]\": 0.003940224642472782,\n    \"tests/test_deprecations.py::test_function[pending]\": 0.004158515388757535,\n    \"tests/test_deprecations.py::test_function[remove]\": 0.003690210341599531,\n    \"tests/test_deprecations.py::test_get_module\": 0.009101402134518669,\n    \"tests/test_deprecations.py::test_method[deprecated]\": 0.003427724884338752,\n    \"tests/test_deprecations.py::test_method[pending]\": 0.0038246018066272025,\n    \"tests/test_deprecations.py::test_method[remove]\": 0.0035730076325666254,\n    \"tests/test_deprecations.py::test_module[deprecated]\": 0.005709873295769871,\n    \"tests/test_deprecations.py::test_module[pending]\": 0.005757026679910626,\n    \"tests/test_deprecations.py::test_module[remove]\": 0.006056554962537127,\n    \"tests/test_deprecations.py::test_topic[deprecated]\": 0.003097506555348576,\n    \"tests/test_deprecations.py::test_topic[pending]\": 0.00296491721772514,\n    \"tests/test_deprecations.py::test_topic[remove]\": 0.00292892632514946,\n    \"tests/test_deprecations.py::test_version_fallback\": 0.0028319130509619206,\n    \"tests/test_exceptions.py::test_BasicClobberError\": 0.015000954344287255,\n    \"tests/test_exceptions.py::test_BinaryPrefixReplacementError\": 0.030370508470238176,\n    \"tests/test_exceptions.py::test_CommandNotFoundError_conda_build\": 0.023137409712241812,\n    \"tests/test_exceptions.py::test_CommandNotFoundError_simple\": 0.08503779496540848,\n    \"tests/test_exceptions.py::test_CondaFileNotFoundError\": 0.02614457214957533,\n    \"tests/test_exceptions.py::test_CondaHTTPError\": 0.02407791812465141,\n    \"tests/test_exceptions.py::test_CondaKeyError\": 0.025560102345471476,\n    \"tests/test_exceptions.py::test_DirectoryNotFoundError\": 0.026135163094552372,\n    \"tests/test_exceptions.py::test_ExceptionHandler_deprecations[error_upload_url-TypeError]\": 0.003971167691771904,\n    \"tests/test_exceptions.py::test_KnownPackageClobberError\": 0.014781273146093395,\n    \"tests/test_exceptions.py::test_MD5MismatchError\": 0.026274952658436636,\n    \"tests/test_exceptions.py::test_PackageNotFoundError\": 0.024508435187888086,\n    \"tests/test_exceptions.py::test_PackagesNotFoundError_use_only_tar_bz2[False]\": 0.014566723538497504,\n    \"tests/test_exceptions.py::test_PackagesNotFoundError_use_only_tar_bz2[True]\": 0.0149513020619996,\n    \"tests/test_exceptions.py::test_SharedLinkPathClobberError\": 0.015666147355176754,\n    \"tests/test_exceptions.py::test_TooManyArgumentsError\": 0.026383062166684457,\n    \"tests/test_exceptions.py::test_UnknownPackageClobberError\": 0.015891970896068582,\n    \"tests/test_exceptions.py::test_http_error_custom_reason_code\": 0.0265675500290234,\n    \"tests/test_exceptions.py::test_http_error_rfc_9457\": 0.030241939395618582,\n    \"tests/test_exceptions.py::test_platform_mismatch_error_is_conda_value_error\": 0.003381930703149294,\n    \"tests/test_exceptions.py::test_platform_mismatch_error_message[multiple-sources]\": 0.0029285635310323244,\n    \"tests/test_exceptions.py::test_platform_mismatch_error_message[single-source]\": 0.0034057841093861896,\n    \"tests/test_exceptions.py::test_print_unexpected_error_message_opt_out_1\": 0.1980406683991565,\n    \"tests/test_exceptions.py::test_print_unexpected_error_message_opt_out_2\": 0.1907824252358664,\n    \"tests/test_exceptions.py::test_print_unexpected_error_message_upload_1\": 0.22829197418619415,\n    \"tests/test_exceptions.py::test_print_unexpected_error_message_upload_2\": 0.21139891378094802,\n    \"tests/test_exceptions.py::test_print_unexpected_error_message_upload_3\": 0.18070197011762915,\n    \"tests/test_exceptions.py::test_proxy_error_custom_message\": 0.0030477522368924184,\n    \"tests/test_exceptions.py::test_proxy_error_default_message\": 0.0029993754732567813,\n    \"tests/test_exports.py::test_deprecations[CondaError-TypeError]\": 0.00351226590418312,\n    \"tests/test_exports.py::test_deprecations[CondaFileNotFoundError-TypeError]\": 0.0032071638855415583,\n    \"tests/test_exports.py::test_deprecations[CondaHTTPError-TypeError]\": 0.003067757260464929,\n    \"tests/test_exports.py::test_deprecations[CondaOSError-TypeError]\": 0.0034596477905702223,\n    \"tests/test_exports.py::test_deprecations[DEFAULT_CHANNELS-TypeError]\": 0.003340440686342228,\n    \"tests/test_exports.py::test_deprecations[DEFAULT_CHANNELS_UNIX-TypeError]\": 0.003191441620195099,\n    \"tests/test_exports.py::test_deprecations[DEFAULT_CHANNELS_WIN-TypeError]\": 0.0035293169241464237,\n    \"tests/test_exports.py::test_deprecations[EntityEncoder-None]\": 0.0029511192175821163,\n    \"tests/test_exports.py::test_deprecations[LinkError-TypeError]\": 0.003384041074396847,\n    \"tests/test_exports.py::test_deprecations[LockError-TypeError]\": 0.003298916368299331,\n    \"tests/test_exports.py::test_deprecations[PREFIX_PLACEHOLDER-TypeError]\": 0.0030236989891263433,\n    \"tests/test_exports.py::test_deprecations[PY3-TypeError]\": 0.003971405545943702,\n    \"tests/test_exports.py::test_deprecations[PaddingError-TypeError]\": 0.0029866695176146863,\n    \"tests/test_exports.py::test_deprecations[PathNotFoundError-TypeError]\": 0.003025143773549552,\n    \"tests/test_exports.py::test_deprecations[StringIO-None]\": 0.0034403012345046347,\n    \"tests/test_exports.py::test_deprecations[UnsatisfiableError-TypeError]\": 0.0033175728305442787,\n    \"tests/test_exports.py::test_deprecations[_PREFIX_PLACEHOLDER-TypeError]\": 0.0038477199851570535,\n    \"tests/test_exports.py::test_deprecations[input-OSError]\": 0.0029429662357645546,\n    \"tests/test_exports.py::test_deprecations[prefix_placeholder-TypeError]\": 0.0036691124626821855,\n    \"tests/test_exports.py::test_deprecations[string_types-None]\": 0.003337017713992612,\n    \"tests/test_exports.py::test_deprecations[text_type-None]\": 0.0036426997353251733,\n    \"tests/test_features.py::test_install_track_features_downgrade\": 3.8418179492930693,\n    \"tests/test_features.py::test_install_track_features_upgrade\": 4.069982759552939,\n    \"tests/test_features.py::test_remove_features_downgrade\": 1.7453559414100104,\n    \"tests/test_features.py::test_remove_features_upgrade\": 2.0062550155882897,\n    \"tests/test_fetch.py::test_checksum_checks_bytes[bad-type]\": 0.015820595968499183,\n    \"tests/test_fetch.py::test_checksum_checks_bytes[gibberish]\": 0.016717528127739682,\n    \"tests/test_fetch.py::test_checksum_checks_bytes[original]\": 0.02381266494523575,\n    \"tests/test_fetch.py::test_checksum_checks_bytes[upper]\": 0.02248818008901487,\n    \"tests/test_fetch.py::test_download_connectionerror\": 2.06096880005465,\n    \"tests/test_fetch.py::test_download_http_errors\": 0.021451091408166312,\n    \"tests/test_fetch.py::test_download_httperror\": 0.04206497788096284,\n    \"tests/test_fetch.py::test_download_size_none\": 0.013571278712536763,\n    \"tests/test_fetch.py::test_download_text\": 0.012280460648132287,\n    \"tests/test_fetch.py::test_download_when_ranges_not_supported\": 0.018060535266706746,\n    \"tests/test_fetch.py::test_fetchrepodate_connectionerror\": 2.0260956231628837,\n    \"tests/test_fetch.py::test_resume_bad_partial\": 0.018534390316048296,\n    \"tests/test_fetch.py::test_resume_download\": 0.05421581736441532,\n    \"tests/test_fetch.py::test_resume_partial\": 0.04847186257123998,\n    \"tests/test_fetch.py::test_tmpDownload\": 0.14452757046199594,\n    \"tests/test_history.py::test_calls_update_on_exit\": 0.008535112211056302,\n    \"tests/test_history.py::test_comment_parsing[conda 4.5.1]\": 0.0029815188769499734,\n    \"tests/test_history.py::test_comment_parsing[conda 4.5.1dev0]\": 0.0030514926475957316,\n    \"tests/test_history.py::test_comment_parsing[conda 4.5.1rc1]\": 0.002969354515175742,\n    \"tests/test_history.py::test_comment_parsing[post 4.4, install spec]\": 0.0031485661879629926,\n    \"tests/test_history.py::test_comment_parsing[post 4.4, update spec]\": 0.0026657024785347577,\n    \"tests/test_history.py::test_comment_parsing[pre 4.4, install many specs]\": 0.0028324806151136897,\n    \"tests/test_history.py::test_comment_parsing[pre 4.4, install one spec]\": 0.003611070082663764,\n    \"tests/test_history.py::test_comment_parsing[pre 4.4, install two specs]\": 0.003283436440998297,\n    \"tests/test_history.py::test_comment_parsing[pre 4.4, update one spec]\": 0.0030232597817952812,\n    \"tests/test_history.py::test_comment_parsing[pre 4.4, update two specs]\": 0.003019264323983136,\n    \"tests/test_history.py::test_empty_history_check_on_empty_env\": 0.00975956657029232,\n    \"tests/test_history.py::test_history_malformed\": 0.007517578645969741,\n    \"tests/test_history.py::test_parse_on_empty_env\": 0.009691744812870644,\n    \"tests/test_history.py::test_returns_history_object_as_context_object\": 0.007859093124813879,\n    \"tests/test_history.py::test_user_requests[0]\": 0.004371099409547981,\n    \"tests/test_history.py::test_user_requests[1]\": 0.0042620156340991405,\n    \"tests/test_history.py::test_user_requests[2]\": 0.0037746849411675948,\n    \"tests/test_history.py::test_user_requests[3]\": 0.003695436425266963,\n    \"tests/test_history.py::test_user_requests[4]\": 0.0032948410138273483,\n    \"tests/test_history.py::test_user_requests[5]\": 0.0035994256228339843,\n    \"tests/test_history.py::test_works_as_context_manager\": 0.0061098206556154545,\n    \"tests/test_install.py::test_binary[linux-64]\": 0.009776732354310662,\n    \"tests/test_install.py::test_binary[noarch]\": 0.007230797519658728,\n    \"tests/test_install.py::test_binary[win-64]\": 0.01335847066052624,\n    \"tests/test_install.py::test_default_text\": 0.008173238158757864,\n    \"tests/test_install.py::test_ends_with_newl[linux-64]\": 0.003485453630753459,\n    \"tests/test_install.py::test_ends_with_newl[noarch]\": 0.0031685618581675638,\n    \"tests/test_install.py::test_ends_with_newl[win-64]\": 0.003420285490404081,\n    \"tests/test_install.py::test_long_default_text\": 0.006562090636358963,\n    \"tests/test_install.py::test_multiple[linux-64]\": 0.0038053858991430323,\n    \"tests/test_install.py::test_multiple[noarch]\": 0.0031640410733866377,\n    \"tests/test_install.py::test_multiple[win-64]\": 0.0034344216915800797,\n    \"tests/test_install.py::test_no_extra[linux-64]\": 0.00304755049035602,\n    \"tests/test_install.py::test_no_extra[noarch]\": 0.003969851898703473,\n    \"tests/test_install.py::test_no_extra[win-64]\": 0.003418109780306016,\n    \"tests/test_install.py::test_read_no_link\": 0.006409740988742783,\n    \"tests/test_install.py::test_shorter[linux-64]\": 0.002888802880764943,\n    \"tests/test_install.py::test_shorter[noarch]\": 0.0032388927977170623,\n    \"tests/test_install.py::test_shorter[win-64]\": 0.0041452385271300895,\n    \"tests/test_install.py::test_simple[linux-64]\": 0.004606091655834078,\n    \"tests/test_install.py::test_simple[noarch]\": 0.0036431161803321794,\n    \"tests/test_install.py::test_simple[win-64]\": 0.00462715649040566,\n    \"tests/test_install.py::test_spaces[linux-64]\": 0.003070803490473728,\n    \"tests/test_install.py::test_spaces[noarch]\": 0.003359709129703901,\n    \"tests/test_install.py::test_spaces[win-64]\": 0.00351128135042496,\n    \"tests/test_install.py::test_too_long[linux-64]\": 0.002723104472152466,\n    \"tests/test_install.py::test_too_long[noarch]\": 0.003139374509201356,\n    \"tests/test_install.py::test_too_long[win-64]\": 0.00313746179283155,\n    \"tests/test_install.py::test_trash_outside_prefix\": 0.1114309753483765,\n    \"tests/test_install.py::test_two[linux-64]\": 0.003434245117295124,\n    \"tests/test_install.py::test_two[noarch]\": 0.003113097518428634,\n    \"tests/test_install.py::test_two[win-64]\": 0.003912564601335407,\n    \"tests/test_install.py::test_windows_entry_point\": 0.0018638421100382145,\n    \"tests/test_install.py::test_yield_lines\": 0.005888904305308097,\n    \"tests/test_instructions.py::test_check_files_in_tarball_files_exist\": 0.0033574874757952484,\n    \"tests/test_instructions.py::test_check_files_in_tarball_files_not_exist\": 0.0030015709234829124,\n    \"tests/test_instructions.py::test_expected_operation_order\": 0.00300731616007637,\n    \"tests/test_link_order.py::test_link_order_post_link_actions\": 2.249750756140972,\n    \"tests/test_link_order.py::test_link_order_post_link_depend\": 1.9792677411763395,\n    \"tests/test_misc.py::test_Utf8NamedTemporaryFile\": 0.004304852922879006,\n    \"tests/test_misc.py::test_cache_fn_url\": 0.0031083347836946816,\n    \"tests/test_misc.py::test_deprecations[url_pat-TypeError]\": 0.0032257521363478273,\n    \"tests/test_misc.py::test_explicit_missing_cache_entries\": 1.9245580644345932,\n    \"tests/test_misc.py::test_explicit_no_cache\": 0.025294800874997005,\n    \"tests/test_misc.py::test_explicit_parser[../doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03-ParseError]\": 0.003491346326908341,\n    \"tests/test_misc.py::test_explicit_parser[../doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03c4034246de428582e-None]\": 0.005986860791400265,\n    \"tests/test_misc.py::test_explicit_parser[doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03c4034246de428582e-None]\": 0.005842023608201633,\n    \"tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-2707f68aada792d1cf3a44c51d55b38b0cd65b0c192d2a5f9ef0550dc149a7d3-None]\": 0.006139148483206517,\n    \"tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-md5:5e9e17751f19d03c4034246de428582e-ParseError]\": 0.003970263977765232,\n    \"tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-sha123:2707f68aada792d1cf3a44c51d55b38b0cd65b0c192d2a5f9ef0550dc149a7d3-ParseError]\": 0.003578954013422642,\n    \"tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/conda-24.1.0-pyhd3eb1b0_0.conda-sha256:2707f68aada792d1cf3a44c51d55b38b0cd65b0c192d2a5f9ef0550dc149a7d3-None]\": 0.00551402418183645,\n    \"tests/test_misc.py::test_explicit_parser[https://conda.anaconda.org/conda-forge/noarch/doc8-1.1.1-pyhd8ed1ab_0.conda-5e9e17751f19d03c4034246de428582e-None]\": 0.005199508444378479,\n    \"tests/test_misc.py::test_url_pat_1\": 0.003029204915660908,\n    \"tests/test_misc.py::test_url_pat_2\": 0.0030702262322249807,\n    \"tests/test_misc.py::test_url_pat_3\": 0.003265474471465242,\n    \"tests/test_misc.py::test_walk_prefix\": 0.012396213328745099,\n    \"tests/test_priority.py::test_reorder_channel_priority[classic-with pinned_package]\": 2.608357664175627,\n    \"tests/test_priority.py::test_reorder_channel_priority[classic-without pinned_package]\": 2.68102307970993,\n    \"tests/test_priority.py::test_reorder_channel_priority[libmamba-with pinned_package]\": 2.870552515710332,\n    \"tests/test_priority.py::test_reorder_channel_priority[libmamba-without pinned_package]\": 2.67592430993507,\n    \"tests/test_reporters.py::test_confirm_yn_always_yes\": 0.01272500348370451,\n    \"tests/test_reporters.py::test_confirm_yn_dry_run_exit\": 0.01405534961087567,\n    \"tests/test_reporters.py::test_confirm_yn_no\": 0.013080754250823669,\n    \"tests/test_reporters.py::test_confirm_yn_yes\": 0.015184873293345407,\n    \"tests/test_reporters.py::test_get_progress_bar\": 0.0041382413807116505,\n    \"tests/test_reporters.py::test_get_progress_bar_context_managers\": 0.0026957148828876177,\n    \"tests/test_reporters.py::test_render\": 0.005929122667597395,\n    \"tests/test_resolve.py::test_Resolve_make_channel_priorities\": 0.004778115729816266,\n    \"tests/test_resolve.py::test_specs_by_name_copy_is_independent\": 0.0028499346666918694,\n    \"tests/test_solvers.py::TestClassicSolver::test_accelerate\": 5.244262261951888,\n    \"tests/test_solvers.py::TestClassicSolver::test_anaconda_nomkl\": 2.924408280822407,\n    \"tests/test_solvers.py::TestClassicSolver::test_arch_preferred_over_noarch_when_otherwise_equal\": 0.5837607178552465,\n    \"tests/test_solvers.py::TestClassicSolver::test_channel_priority_1\": 0.021857085780823817,\n    \"tests/test_solvers.py::TestClassicSolver::test_circular_dependencies\": 2.067609252544417,\n    \"tests/test_solvers.py::TestClassicSolver::test_empty\": 1.7486225985475088,\n    \"tests/test_solvers.py::TestClassicSolver::test_get_dists\": 3.299707489841372,\n    \"tests/test_solvers.py::TestClassicSolver::test_get_reduced_index_broadening_preferred_solution\": 0.6187623748846472,\n    \"tests/test_solvers.py::TestClassicSolver::test_get_reduced_index_broadening_with_unsatisfiable_early_dep\": 0.69907293245369,\n    \"tests/test_solvers.py::TestClassicSolver::test_install_package_with_feature\": 1.0049669653886268,\n    \"tests/test_solvers.py::TestClassicSolver::test_iopro_mkl\": 2.314088567216035,\n    \"tests/test_solvers.py::TestClassicSolver::test_iopro_nomkl\": 1.7044793545419332,\n    \"tests/test_solvers.py::TestClassicSolver::test_irrational_version\": 0.8317321038667843,\n    \"tests/test_solvers.py::TestClassicSolver::test_mkl\": 4.203353136830852,\n    \"tests/test_solvers.py::TestClassicSolver::test_no_features\": 5.19128651353391,\n    \"tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_build_greater\": 0.6266161597489135,\n    \"tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_build_greater_dep\": 0.6355594751684026,\n    \"tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_version_greater\": 0.6265794889653652,\n    \"tests/test_solvers.py::TestClassicSolver::test_noarch_preferred_over_arch_when_version_greater_dep\": 0.6564828836268091,\n    \"tests/test_solvers.py::TestClassicSolver::test_nonexistent\": 1.1731396320457503,\n    \"tests/test_solvers.py::TestClassicSolver::test_nonexistent_deps\": 7.244449725408078,\n    \"tests/test_solvers.py::TestClassicSolver::test_pseudo_boolean\": 3.152323410837957,\n    \"tests/test_solvers.py::TestClassicSolver::test_remove\": 3.659939109702015,\n    \"tests/test_solvers.py::TestClassicSolver::test_scipy_mkl\": 2.113473111495055,\n    \"tests/test_solvers.py::TestClassicSolver::test_surplus_features_1\": 0.5935045020918189,\n    \"tests/test_solvers.py::TestClassicSolver::test_surplus_features_2\": 0.630682239855327,\n    \"tests/test_solvers.py::TestClassicSolver::test_timestamps_and_deps\": 4.898586093867125,\n    \"tests/test_solvers.py::TestClassicSolver::test_unintentional_feature_downgrade\": 1.8947825317037186,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_any_two_not_three\": 2.4593792819782228,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_chain\": 0.6001223520053686,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_channel_priority\": 1.3158308012395143,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_expand_single\": 0.5929891083773617,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_from_r1\": 5.914934025449288,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_missing_dep\": 0.5890335709348116,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_1\": 0.6120793289768797,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_2\": 0.6133220021582018,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_3\": 0.6945943588123759,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_shortest_chain_4\": 0.6424707282915096,\n    \"tests/test_solvers.py::TestClassicSolver::test_unsat_simple\": 0.5968485113760914,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_accelerate\": 0.003379475682498219,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_anaconda_nomkl\": 0.7793559446955233,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_arch_preferred_over_noarch_when_otherwise_equal\": 0.5302684861182446,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_channel_priority_1\": 0.019267627614120136,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_circular_dependencies\": 1.6646177569765412,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_empty\": 0.6041463757603918,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_get_dists\": 0.6434936916367211,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_get_reduced_index_broadening_preferred_solution\": 0.5280244020530444,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_get_reduced_index_broadening_with_unsatisfiable_early_dep\": 0.5253145074552017,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_install_package_with_feature\": 0.6144131510329596,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_iopro_mkl\": 0.003825201539507539,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_iopro_nomkl\": 0.0031538551394951373,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_irrational_version\": 0.6234909372430631,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_mkl\": 0.003119788249541848,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_no_features\": 0.0032241658642971475,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_build_greater\": 0.5300217272105906,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_build_greater_dep\": 0.527720278941143,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_version_greater\": 0.5075887674398054,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_noarch_preferred_over_arch_when_version_greater_dep\": 0.5181913161193624,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_nonexistent\": 1.0067129349200277,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_nonexistent_deps\": 5.144002855619975,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_pseudo_boolean\": 0.00302261506543326,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_remove\": 0.0027261691254623463,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_scipy_mkl\": 0.003112466599404695,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_surplus_features_1\": 0.003008965329713636,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_surplus_features_2\": 0.0030800737400586797,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_timestamps_and_deps\": 4.203872181240609,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unintentional_feature_downgrade\": 0.0037459584011041544,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_any_two_not_three\": 1.9568347467061125,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_chain\": 0.5330459843134364,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_channel_priority\": 1.004942240595136,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_expand_single\": 0.5236852350273841,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_from_r1\": 1.7993064354881565,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_missing_dep\": 0.532090758251297,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_1\": 0.5428680159150936,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_2\": 0.4597743241370136,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_3\": 0.5376438391162703,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_shortest_chain_4\": 0.5544756413486285,\n    \"tests/test_solvers.py::TestLibMambaSolver::test_unsat_simple\": 0.5110583168969304,\n    \"tests/test_utils.py::test_ensure_dir\": 0.007325484739053447,\n    \"tests/test_utils.py::test_ensure_dir_errors\": 0.017416154223105013,\n    \"tests/test_utils.py::test_quote_for_shell[!-'!']\": 0.0028186698875886113,\n    \"tests/test_utils.py::test_quote_for_shell[\\\"-'\\\"']\": 0.0030323460272758435,\n    \"tests/test_utils.py::test_quote_for_shell[#-'#']\": 0.0031410666692085654,\n    \"tests/test_utils.py::test_quote_for_shell[$-'$']\": 0.0029740866259089778,\n    \"tests/test_utils.py::test_quote_for_shell[%-%]\": 0.002863558044692871,\n    \"tests/test_utils.py::test_quote_for_shell[&-'&']\": 0.0029168724560673424,\n    \"tests/test_utils.py::test_quote_for_shell['-''\\\"'\\\"'']\": 0.0032034546084106297,\n    \"tests/test_utils.py::test_quote_for_shell[(-'(']\": 0.0030112329607434457,\n    \"tests/test_utils.py::test_quote_for_shell[)-')']\": 0.002935573814604108,\n    \"tests/test_utils.py::test_quote_for_shell[*-'*']\": 0.0030004978853632497,\n    \"tests/test_utils.py::test_quote_for_shell[+-+]\": 0.0028171452809327645,\n    \"tests/test_utils.py::test_quote_for_shell[,-,]\": 0.0028992434549739484,\n    \"tests/test_utils.py::test_quote_for_shell[---]\": 0.004324868645491816,\n    \"tests/test_utils.py::test_quote_for_shell[.-.]\": 0.002770562707222328,\n    \"tests/test_utils.py::test_quote_for_shell[/-/]\": 0.002892496011995653,\n    \"tests/test_utils.py::test_quote_for_shell[1>/dev/null-'1>/dev/null']\": 0.003030949030200001,\n    \"tests/test_utils.py::test_quote_for_shell[1>NUL-'1>NUL']\": 0.0033181569529203855,\n    \"tests/test_utils.py::test_quote_for_shell[2>&1-'2>&1']\": 0.0031741354435959207,\n    \"tests/test_utils.py::test_quote_for_shell[2>/dev/null-'2>/dev/null']\": 0.002997383825571714,\n    \"tests/test_utils.py::test_quote_for_shell[2>NUL-'2>NUL']\": 0.002690562416169539,\n    \"tests/test_utils.py::test_quote_for_shell[:-:]\": 0.003113018615286333,\n    \"tests/test_utils.py::test_quote_for_shell[;-';']\": 0.004107060892808664,\n    \"tests/test_utils.py::test_quote_for_shell[<-'<']\": 0.003089653086976494,\n    \"tests/test_utils.py::test_quote_for_shell[=-=]\": 0.0028030245916607337,\n    \"tests/test_utils.py::test_quote_for_shell[>-'>']\": 0.0031496774753359187,\n    \"tests/test_utils.py::test_quote_for_shell[>/dev/null-'>/dev/null']\": 0.0030877749656593022,\n    \"tests/test_utils.py::test_quote_for_shell[>NUL-'>NUL']\": 0.0029749177112705274,\n    \"tests/test_utils.py::test_quote_for_shell[?-'?']\": 0.0032261177415407005,\n    \"tests/test_utils.py::test_quote_for_shell[@-@]\": 0.003124887403952385,\n    \"tests/test_utils.py::test_quote_for_shell[C:\\\\\\\\temp\\\\\\\\some ^%file^% > nul-\\\"C:\\\\\\\\temp\\\\\\\\some ^%%file^%% > nul\\\"]\": 0.0005629162670484008,\n    \"tests/test_utils.py::test_quote_for_shell[None-'']\": 0.0030222666715150007,\n    \"tests/test_utils.py::test_quote_for_shell[[-'[']\": 0.0033582446905370206,\n    \"tests/test_utils.py::test_quote_for_shell[\\\\\\\\-'\\\\\\\\']\": 0.0035160463528702618,\n    \"tests/test_utils.py::test_quote_for_shell[]-']']\": 0.003998100653854907,\n    \"tests/test_utils.py::test_quote_for_shell[^-'^']\": 0.003283783038926128,\n    \"tests/test_utils.py::test_quote_for_shell[arg1 and 2-'arg1 and 2']\": 0.003019283174604343,\n    \"tests/test_utils.py::test_quote_for_shell[arg1-arg1]\": 0.003450729935391127,\n    \"tests/test_utils.py::test_quote_for_shell[arg1\\\\nand\\\\n2-'arg1\\\\nand\\\\n2']\": 0.0053101889515873415,\n    \"tests/test_utils.py::test_quote_for_shell[malicious argument\\\\\\\\\\\"&whoami-\\\"malicious argument\\\\\\\\\\\"\\\"&whoami\\\"]\": 0.0006027899862676981,\n    \"tests/test_utils.py::test_quote_for_shell[numpy<1.22-'numpy<1.22']\": 0.003502997337890696,\n    \"tests/test_utils.py::test_quote_for_shell[numpy>=1.0-'numpy>=1.0']\": 0.003935085745804217,\n    \"tests/test_utils.py::test_quote_for_shell[one|two-'one|two']\": 0.003258907503058005,\n    \"tests/test_utils.py::test_quote_for_shell[{-'{']\": 0.003146904351960451,\n    \"tests/test_utils.py::test_quote_for_shell[|-'|']\": 0.003523664313247163,\n    \"tests/test_utils.py::test_quote_for_shell[}-'}']\": 0.0029325674099506625,\n    \"tests/test_utils.py::test_quote_for_shell[~-'~']\": 0.0028212153635374685,\n    \"tests/testing/test_fixtures.py::test_conda_cli\": 0.2558693174321708,\n    \"tests/testing/test_fixtures.py::test_empty_env\": 0.007354540833894733,\n    \"tests/testing/test_fixtures.py::test_env\": 0.2677063902839674,\n    \"tests/testing/test_fixtures.py::test_monkeypatch\": 0.013379577293109672,\n    \"tests/testing/test_fixtures.py::test_path_factory\": 0.00794483352206538,\n    \"tests/testing/test_fixtures.py::test_path_factory_mutual_exclusivity\": 0.008212140192182344,\n    \"tests/testing/test_fixtures.py::test_path_factory_name_mode\": 0.008569644958796684,\n    \"tests/testing/test_fixtures.py::test_path_factory_parts_mode[all parts]\": 0.005383813263242419,\n    \"tests/testing/test_fixtures.py::test_path_factory_parts_mode[infix only]\": 0.005908841887431463,\n    \"tests/testing/test_fixtures.py::test_path_factory_parts_mode[no parts]\": 0.0086000198988792,\n    \"tests/testing/test_fixtures.py::test_path_factory_parts_mode[prefix only]\": 0.007972492341759887,\n    \"tests/testing/test_fixtures.py::test_path_factory_parts_mode[suffix only]\": 0.006349098797783229,\n    \"tests/testing/test_fixtures.py::test_path_factory_uniqueness\": 0.006159604930153617,\n    \"tests/testing/test_fixtures.py::test_session_conda_cli\": 0.3211433814658595,\n    \"tests/testing/test_fixtures.py::test_session_tmp_env\": 0.005506416727074559,\n    \"tests/testing/test_fixtures.py::test_tmp_channel\": 3.8920311347546956,\n    \"tests/testing/test_fixtures.py::test_tmp_env\": 0.007779081580212708,\n    \"tests/testing/test_fixtures.py::test_tmp_env_mutual_exclusivity\": 0.007216002552818215,\n    \"tests/testing/test_fixtures.py::test_tmp_env_path_parts[all parts]\": 0.007172502574519128,\n    \"tests/testing/test_fixtures.py::test_tmp_env_path_parts[infix only]\": 0.00804005959157663,\n    \"tests/testing/test_fixtures.py::test_tmp_env_path_parts[name only]\": 0.006785611156671312,\n    \"tests/testing/test_fixtures.py::test_tmp_env_path_parts[no parts]\": 0.009183354457857751,\n    \"tests/testing/test_fixtures.py::test_tmp_env_path_parts[prefix only]\": 0.00927094053267215,\n    \"tests/testing/test_fixtures.py::test_tmp_env_path_parts[suffix only]\": 0.0076787262691856845,\n    \"tests/testing/test_fixtures.py::test_tmp_envs_dir\": 0.005981746846684455,\n    \"tests/testing/test_fixtures.py::test_tmp_pkgs_dir\": 0.007006202119866888,\n    \"tests/testing/test_http_test_server.py::test_dynamic_content_pattern\": 0.5133855936395878,\n    \"tests/testing/test_http_test_server.py::test_http_server_404_missing_file[tests/env/support]\": 0.5145906263158477,\n    \"tests/testing/test_http_test_server.py::test_http_server_directory_attribute\": 0.5135065212778307,\n    \"tests/testing/test_http_test_server.py::test_http_server_fixture_attributes[tests/env/support]\": 0.4561391647095376,\n    \"tests/testing/test_http_test_server.py::test_http_server_get_url_method[tests/env/support]\": 0.5227676049778793,\n    \"tests/testing/test_http_test_server.py::test_http_server_multiple_directories[tests/data]\": 0.48700759858707204,\n    \"tests/testing/test_http_test_server.py::test_http_server_multiple_directories[tests/env/support]\": 0.6400416279060936,\n    \"tests/testing/test_http_test_server.py::test_http_server_serves_files[tests/env/support]\": 0.5150678604261607,\n    \"tests/testing/test_http_test_server.py::test_http_server_subdirectories[tests/env/support]\": 0.5117658101228931,\n    \"tests/testing/test_http_test_server.py::test_http_server_without_marker\": 0.5538903345015489,\n    \"tests/testing/test_http_test_server.py::test_marker_validation_directory_type\": 0.2131500744503293\n}\n"
  },
  {
    "path": "news/TEMPLATE",
    "content": "### Enhancements\n\n* <news item>\n\n### Bug fixes\n\n* <news item>\n\n### Deprecations\n\n* <news item>\n\n### Docs\n\n* <news item>\n\n### Other\n\n* <news item>\n"
  },
  {
    "path": "pyproject.toml",
    "content": "[build-system]\nrequires = [\"hatchling\", \"hatch-vcs\"]\nbuild-backend = \"hatchling.build\"\n\n[project]\nname = \"conda-libmamba-solver\"\ndescription = \"The fast mamba solver, now in conda\"\nreadme = \"README.md\"\nauthors = [\n  {name = \"Anaconda, Inc.\", email = \"conda@continuum.io\"}\n]\nlicense = {file = \"LICENSE\"}\nclassifiers = [\n  \"License :: OSI Approved :: BSD License\",\n  \"Programming Language :: Python :: 3\",\n  \"Programming Language :: Python :: 3 :: Only\",\n  \"Programming Language :: Python :: 3.10\",\n  \"Programming Language :: Python :: 3.11\",\n  \"Programming Language :: Python :: 3.12\",\n  \"Programming Language :: Python :: 3.13\",\n  \"Programming Language :: Python :: Implementation :: CPython\",\n  \"Programming Language :: Python :: Implementation :: PyPy\"\n]\nrequires-python = \">=3.10\"\ndependencies = [\n  \"conda >=26.1\",\n  # \"libmambapy >=2\",\n  \"boltons >=23.0.0\",\n  \"msgpack >=1.1.1\",\n  \"requests >=2.28.0,<3\",\n  \"zstandard >=0.15\"\n]\ndynamic = [\n  \"version\"\n]\n\n[project.urls]\nhomepage = \"https://github.com/conda/conda-libmamba-solver\"\n\n[project.entry-points.conda]\nconda-libmamba-solver = \"conda_libmamba_solver.plugin\"\n\n[tool.hatch.version]\nsource = \"vcs\"\n\n[tool.black]\nline-length = 99\ntarget-version = ['py310', 'py311', 'py312', 'py313']\nexclude = '''\n(\n      ^/conda_libmamba_solver/_libmamba\\.py\n    | ^/tests/_reposerver\\.py\n)\n'''\n\n[tool.pytest.ini_options]\nminversion = \"6.0\"\naddopts = [\n  \"--color=yes\",\n  \"--tb=native\",\n  \"--strict-markers\"\n]\nfilterwarnings = [\n  # elevate all deprecation warnings to errors\n  \"error::PendingDeprecationWarning\",\n  \"error::DeprecationWarning\",\n  \"error::FutureWarning\",\n  # temporary ignores\n  \"ignore:conda.cli.install.print_activate:PendingDeprecationWarning:conda.env.env\",\n  \"ignore:`remote_definition`:FutureWarning:argparse\",\n  \"ignore:conda.core.prefix_data.python_record_for_prefix:PendingDeprecationWarning:conda.core.link\",\n  \"ignore:conda.core.prefix_data.PrefixDataType.__call__:PendingDeprecationWarning:conda_libmamba_solver.state\",\n  \"ignore:conda.env.specs.binstar:DeprecationWarning:conda\",\n  \"ignore:conda.env.specs.binstar:PendingDeprecationWarning:conda\",\n  \"ignore:.*conda.plugins.types.*:DeprecationWarning\",\n  \"ignore:.*conda.plugins.types.*:PendingDeprecationWarning\",\n  \"ignore:conda.trust:DeprecationWarning:conda\",\n  \"ignore:conda.trust:PendingDeprecationWarning:conda\",\n  \"ignore:conda.core.link.PrefixActions:DeprecationWarning:conda\",\n  \"ignore:conda.core.link.PrefixActions:PendingDeprecationWarning:conda\",\n  \"ignore:conda.base.constants.CONDA_PACKAGE_EXTENSIONS:PendingDeprecationWarning\",\n  \"ignore:conda.common.io.env_vars:PendingDeprecationWarning\",\n]\nmarkers = [\n  \"integration: integration tests that usually require an internet connect\",\n  \"slow: slow running tests\",\n  \"trouble: troublesome tests\",\n]\n\n[tool.ruff]\nexclude = [\"conda_libmamba_solver/mamba_utils.py\", \"tests/data/\"]\nline-length = 99\nshow-fixes = true\ntarget-version = \"py310\"\n\n[tool.ruff.lint]\n# E, W = pycodestyle errors and warnings\n# F = pyflakes\n# I = isort\n# D = pydocstyle\n# UP = pyupgrade\n# ISC = flake8-implicit-str-concat\n# TCH = flake8-type-checking\n# T10 = flake8-debugger\n# FA = flake8-future-annotations\n# see also https://docs.astral.sh/ruff/rules/\nselect = [\"E\", \"W\", \"F\", \"I\", \"D1\", \"UP\", \"ISC\", \"TCH\", \"T10\", \"FA\"]\n# E402 module level import not at top of file\n# E501 line too long\n# E722 do not use bare 'except'\n# E731 do not assign a lambda expression, use a def\n# D101 Missing docstring in public class\n# D102 Missing docstring in public method\n# D103 Missing docstring in public function\n# D104 Missing docstring in public package\n# D105 Missing docstring in magic method\n# D107 Missing docstring in `__init__`\nignore = [\"E402\", \"E501\", \"E722\", \"E731\", \"D101\", \"D102\", \"D103\", \"D104\", \"D105\", \"D107\"]\nextend-per-file-ignores = {\"docs/*\" = [\"D1\"], \"tests/*\" = [\"D1\"]}\npydocstyle = {convention = \"pep257\"}\nflake8-type-checking = {exempt-modules = [], strict = true}\n\n# [tool.pyright]\n# include = [\"conda_libmamba_solver\"]\n# ignore = [\"conda_libmamba_solver/*_v1.py\"]\n# strict = [\"**/\"]\n\n[tool.coverage.report]\nexclude_also = [\n  \"pragma: no cover\",\n  \"if TYPE_CHECKING:\",\n  \"\\\\.\\\\.\\\\.\",\n]\n"
  },
  {
    "path": "recipe/meta.yaml",
    "content": "package:\n  name: \"conda-libmamba-solver\"\n  version: \"{{ GIT_DESCRIBE_TAG }}.{{ GIT_BUILD_STR }}\"\n\nsource:\n  # git_url is nice in that it won't capture devenv stuff.  However, it only\n  # captures committed code, so pay attention.\n  git_url: ../\n  folder: src/\n\nbuild:\n  noarch: python\n  number: 0\n  script: \"{{ PYTHON }} -m pip install src/ -vv --no-deps --no-build-isolation\"\n\nrequirements:\n  host:\n    - python >=3.10\n    - pip\n    - hatchling\n    - hatch-vcs\n  run:\n    - python >=3.10\n    - conda >=26.1\n    - libmambapy >=2.0.0\n    - boltons >=23.0.0\n    - msgpack-python >=1.1.1\n    - requests >=2.28.0,<3\n    - zstandard >=0.15\n\ntest:\n  imports:\n    - conda_libmamba_solver\n  commands:\n    - conda create -n test --dry-run scipy --solver=libmamba\n    - >-\n      python -c\n      \"import conda_libmamba_solver as cls;\n      from importlib.metadata import version;\n      assert '{{ PKG_VERSION }}' == cls.__version__ == version('conda_libmamba_solver'),\n      '{{ PKG_VERSION }}' + f', {cls.__version__}, ' + version('conda_libmamba_solver')\n      \" || true\n    # we accept errors here because GIT_DESCRIBE_TAG has some accuracy issues.\n    # Shouldn't happen in production recipes; aka do not add '|| true' in the feedstock\n\nabout:\n  home: https://github.com/conda/conda-libmamba-solver\n  license: BSD-3-Clause\n  license_family: BSD\n  license_file: src/LICENSE\n  summary: 'The fast mamba solver, now in conda!'\n\nextra:\n  recipe-maintainers:\n    - jaimergp\n    - jezdez\n    - wolfv\n"
  },
  {
    "path": "rever.xsh",
    "content": "# edit this in https://github.com/conda/infrastructure\n\n$ACTIVITIES = [\"authors\", \"changelog\"]\n\n# Basic settings\n$PROJECT = $GITHUB_REPO = $(basename $(git remote get-url origin)).split('.')[0].strip()\n$GITHUB_ORG = \"conda\"\n\n# Authors settings\n$AUTHORS_FILENAME = \"AUTHORS.md\"\n$AUTHORS_SORTBY = \"alpha\"\n\n# Changelog settings\n$CHANGELOG_FILENAME = \"CHANGELOG.md\"\n$CHANGELOG_PATTERN = r\"\\[//\\]: # \\(current developments\\)\"\n$CHANGELOG_HEADER = \"\"\"[//]: # (current developments)\n\n## $VERSION ($RELEASE_DATE)\n\n\"\"\"\n$CHANGELOG_CATEGORIES = [\n    \"Enhancements\",\n    \"Bug fixes\",\n    \"Deprecations\",\n    \"Docs\",\n    \"Other\",\n]\n$CHANGELOG_CATEGORY_TITLE_FORMAT = \"### {category}\\n\\n\"\n$CHANGELOG_AUTHORS_TITLE = \"Contributors\"\n$CHANGELOG_AUTHORS_FORMAT = \"* @{github}\\n\"\n\ntry:\n    # allow repository to customize synchronized-from-infa rever config\n    from rever_overrides import *\nexcept ImportError:\n    pass\n"
  },
  {
    "path": "tests/__init__.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n"
  },
  {
    "path": "tests/channel_testing/helpers.py",
    "content": "# Copyright (C) 2019 QuantStack and the Mamba contributors.\n# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\nfrom __future__ import annotations\n\nimport os\nimport pathlib\nimport re\nimport socket\nimport sys\nfrom typing import TYPE_CHECKING\n\nimport pytest\nfrom xprocess import ProcessStarter\n\nif TYPE_CHECKING:\n    from xprocess import XProcess\n\n\ndef _dummy_http_server(\n    xprocess: XProcess,\n    name,\n    port,\n    auth=\"none\",\n    user=None,\n    password=None,\n    token=None,\n    path=None,\n):\n    \"\"\"\n    Adapted from\n    https://github.com/mamba-org/powerloader/blob/effe2b7e1/test/helpers.py#L11\n    \"\"\"\n    curdir = pathlib.Path(__file__).parent\n    print(\"Starting dummy_http_server\")\n\n    if not path:\n        path = curdir / \"..\" / \"data\" / \"mamba_repo\"\n\n    class Starter(ProcessStarter):\n        pattern = r\"Server started at localhost:(\\d+)\"\n        terminate_on_interrupt = True\n        timeout = 10\n        args = [\n            sys.executable,\n            \"-u\",  # unbuffered\n            str(curdir / \"reposerver.py\"),\n            \"-d\",\n            str(path),\n            \"--port\",\n            str(port),\n        ]\n        if auth == \"token\":\n            assert token\n            args += [\"--token\", token]\n        elif auth:\n            args += [\"--auth\", auth]\n        env = os.environ.copy()\n        env[\"PYTHONUNBUFFERED\"] = \"1\"\n        if user and password:\n            env[\"TESTPWD\"] = f\"{user}:{password}\"\n\n        def startup_check(self):  # type: ignore\n            nonlocal xprocess, port\n            info = xprocess.getinfo(name)\n            loglines: str = info.logpath.read_text(encoding=\"utf-8\")\n            for line in reversed(loglines.splitlines()):\n                match = re.search(self.pattern, line)  # type: ignore\n                if match:\n                    port = int(match.group(1))\n                    break\n            s = socket.socket()\n            address = \"localhost\"\n            error = False\n            try:\n                s.connect((address, port))\n            except Exception as e:\n                print(f\"something's wrong with {address}:{port}. Exception is {e}\")\n                error = True\n            finally:\n                s.close()\n\n            return not error\n\n    logfile = xprocess.ensure(name, Starter)\n    print(\"Logfile at\", logfile)\n\n    if user and password:\n        yield f\"http://{user}:{password}@localhost:{port}\"\n    elif token:\n        yield f\"http://localhost:{port}/t/{token}\"\n    else:\n        yield f\"http://localhost:{port}\"\n\n    xprocess.getinfo(name).terminate()\n\n\n@pytest.fixture\ndef http_server_auth_none(xprocess):\n    yield from _dummy_http_server(xprocess, name=\"http_server_auth_none\", port=8000, auth=\"none\")\n\n\n@pytest.fixture\ndef http_server_auth_none_debug_repodata(xprocess):\n    yield from _dummy_http_server(\n        xprocess,\n        name=\"http_server_auth_none_debug_repodata\",\n        port=8000,\n        auth=\"none-debug-repodata\",\n    )\n\n\n@pytest.fixture\ndef http_server_auth_none_debug_packages(xprocess):\n    yield from _dummy_http_server(\n        xprocess,\n        name=\"http_server_auth_none_debug_packages\",\n        port=8000,\n        auth=\"none-debug-packages\",\n    )\n\n\n@pytest.fixture\ndef http_server_auth_basic(xprocess):\n    yield from _dummy_http_server(\n        xprocess,\n        name=\"http_server_auth_basic\",\n        port=8000,\n        auth=\"basic\",\n        user=\"user\",\n        password=\"test\",\n    )\n\n\n@pytest.fixture\ndef http_server_auth_basic_email(xprocess):\n    yield from _dummy_http_server(\n        xprocess,\n        name=\"http_server_auth_basic_email\",\n        port=8000,\n        auth=\"basic\",\n        user=\"user@email.com\",\n        password=\"test\",\n    )\n\n\n@pytest.fixture\ndef http_server_auth_token(xprocess):\n    yield from _dummy_http_server(\n        xprocess,\n        name=\"http_server_auth_token\",\n        port=8000,\n        auth=\"token\",\n        token=\"xy-12345678-1234-1234-1234-123456789012\",\n    )\n"
  },
  {
    "path": "tests/channel_testing/reposerver.py",
    "content": "# Copyright (C) 2019 QuantStack and the Mamba contributors.\n# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nHelper module/script to launch a conda channel/server\nfor local testing.\n\nCopied from https://github.com/mamba-org/mamba/blob/53eb28d/mamba/tests/reposerver.py\non Apr 27 2022\n\nSee data/mamba_repo/LICENSE for full details\n\"\"\"\n\nimport argparse\nimport base64\nimport glob\nimport os\nimport re\nimport shutil\nfrom http.server import HTTPServer, SimpleHTTPRequestHandler\nfrom pathlib import Path\n\ntry:\n    import conda_content_trust.authentication as cct_authentication\n    import conda_content_trust.common as cct_common\n    import conda_content_trust.metadata_construction as cct_metadata_construction\n    import conda_content_trust.root_signing as cct_root_signing\n    import conda_content_trust.signing as cct_signing\n\n    conda_content_trust_available = True\nexcept ImportError:\n    conda_content_trust_available = False\n\nif os.environ.get(\"TESTPWD\"):\n    default_user, default_password = os.environ.get(\"TESTPWD\").split(\":\")\nelse:\n    default_user, default_password = None, None\n\nparser = argparse.ArgumentParser(description=\"Start a simple conda package server.\")\nparser.add_argument(\"-p\", \"--port\", type=int, default=8000, help=\"Port to use.\")\nparser.add_argument(\n    \"-d\",\n    \"--directory\",\n    type=str,\n    default=os.getcwd(),\n    help=\"Root directory for serving.\",\n)\nparser.add_argument(\n    \"-a\",\n    \"--auth\",\n    default=None,\n    type=str,\n    help=\"auth method (none, none-debug-repodata, none-debug-packages, basic, or token)\",\n)\nparser.add_argument(\n    \"--sign\",\n    action=\"store_true\",\n    help=\"Sign repodata (note: run generate_gpg_keys.sh before)\",\n)\nparser.add_argument(\n    \"--token\",\n    type=str,\n    default=None,\n    help=\"Use token as API Key\",\n)\nparser.add_argument(\n    \"--user\",\n    type=str,\n    default=default_user,\n    help=\"Use token as API Key\",\n)\nparser.add_argument(\n    \"--password\",\n    type=str,\n    default=default_password,\n    help=\"Use token as API Key\",\n)\nargs = parser.parse_args()\n\n\ndef get_fingerprint(gpg_output):\n    lines = gpg_output.splitlines()\n    fpline = lines[1].strip()\n    fpline = fpline.replace(\" \", \"\")\n    return fpline\n\n\nclass RepoSigner:\n    keys = {\n        \"root\": [],\n        \"key_mgr\": [\n            {\n                \"private\": \"c9c2060d7e0d93616c2654840b4983d00221d8b6b69c850107da74b42168f937\",\n                \"public\": \"013ddd714962866d12ba5bae273f14d48c89cf0773dee2dbf6d4561e521c83f7\",\n            },\n        ],\n        \"pkg_mgr\": [\n            {\n                \"private\": \"f3cdab14740066fb277651ec4f96b9f6c3e3eb3f812269797b9656074cd52133\",\n                \"public\": \"f46b5a7caa43640744186564c098955147daa8bac4443887bc64d8bfee3d3569\",\n            }\n        ],\n    }\n\n    def normalize_keys(self, keys):\n        out = {}\n        for ik, iv in keys.items():\n            out[ik] = []\n            for el in iv:\n                if isinstance(el, str):\n                    el = el.lower()\n                    keyval = cct_root_signing.fetch_keyval_from_gpg(el)\n                    res = {\"fingerprint\": el, \"public\": keyval}\n                elif isinstance(el, dict):\n                    res = {\n                        \"private\": el[\"private\"].lower(),\n                        \"public\": el[\"public\"].lower(),\n                    }\n                out[ik].append(res)\n\n        return out\n\n    def create_root(self, keys):\n        root_keys = keys[\"root\"]\n\n        root_pubkeys = [k[\"public\"] for k in root_keys]\n        key_mgr_pubkeys = [k[\"public\"] for k in keys[\"key_mgr\"]]\n\n        root_version = 1\n\n        root_md = cct_metadata_construction.build_root_metadata(\n            root_pubkeys=root_pubkeys[0:1],\n            root_threshold=1,\n            root_version=root_version,\n            key_mgr_pubkeys=key_mgr_pubkeys,\n            key_mgr_threshold=1,\n        )\n\n        # Wrap the metadata in a signing envelope.\n        root_md = cct_signing.wrap_as_signable(root_md)\n\n        root_md_serialized_unsigned = cct_common.canonserialize(root_md)\n\n        root_filepath = self.folder / f\"{root_version}.root.json\"\n        print(\"Writing out: \", root_filepath)\n        # Write unsigned sample root metadata.\n        with open(root_filepath, \"wb\") as fout:\n            fout.write(root_md_serialized_unsigned)\n\n        # This overwrites the file with a signed version of the file.\n        cct_root_signing.sign_root_metadata_via_gpg(root_filepath, root_keys[0][\"fingerprint\"])\n\n        # Load untrusted signed root metadata.\n        signed_root_md = cct_common.load_metadata_from_file(root_filepath)\n\n        cct_authentication.verify_signable(signed_root_md, root_pubkeys, 1, gpg=True)\n\n        print(\"[reposigner] Root metadata signed & verified!\")\n\n    def create_key_mgr(self, keys):\n        private_key_key_mgr = cct_common.PrivateKey.from_hex(keys[\"key_mgr\"][0][\"private\"])\n        pkg_mgr_pub_keys = [k[\"public\"] for k in keys[\"pkg_mgr\"]]\n        key_mgr = cct_metadata_construction.build_delegating_metadata(\n            metadata_type=\"key_mgr\",  # 'root' or 'key_mgr'\n            delegations={\"pkg_mgr\": {\"pubkeys\": pkg_mgr_pub_keys, \"threshold\": 1}},\n            version=1,\n            # timestamp   default: now\n            # expiration  default: now plus root expiration default duration\n        )\n\n        key_mgr = cct_signing.wrap_as_signable(key_mgr)\n\n        # sign dictionary in place\n        cct_signing.sign_signable(key_mgr, private_key_key_mgr)\n\n        key_mgr_serialized = cct_common.canonserialize(key_mgr)\n        with open(self.folder / \"key_mgr.json\", \"wb\") as fobj:\n            fobj.write(key_mgr_serialized)\n\n        # let's run a verification\n        root_metadata = cct_common.load_metadata_from_file(self.folder / \"1.root.json\")\n        key_mgr_metadata = cct_common.load_metadata_from_file(self.folder / \"key_mgr.json\")\n\n        cct_common.checkformat_signable(root_metadata)\n\n        if \"delegations\" not in root_metadata[\"signed\"]:\n            raise ValueError('Expected \"delegations\" entry in root metadata.')\n\n        root_delegations = root_metadata[\"signed\"][\"delegations\"]  # for brevity\n        cct_common.checkformat_delegations(root_delegations)\n        if \"key_mgr\" not in root_delegations:\n            raise ValueError('Missing expected delegation to \"key_mgr\" in root metadata.')\n        cct_common.checkformat_delegation(root_delegations[\"key_mgr\"])\n\n        # Doing delegation processing.\n        cct_authentication.verify_delegation(\"key_mgr\", key_mgr_metadata, root_metadata)\n\n        print(\"[reposigner] success: key mgr metadata verified based on root metadata.\")\n\n        return key_mgr\n\n    def sign_repodata(self, repodata_fn, keys):\n        target_folder = self.folder / repodata_fn.parent.name\n        if not target_folder.exists():\n            target_folder.mkdir()\n\n        final_fn = target_folder / repodata_fn.name\n        print(\"copy\", repodata_fn, final_fn)\n        shutil.copyfile(repodata_fn, final_fn)\n\n        pkg_mgr_key = keys[\"pkg_mgr\"][0][\"private\"]\n        cct_signing.sign_all_in_repodata(str(final_fn), pkg_mgr_key)\n        print(f\"[reposigner] Signed {final_fn}\")\n\n    def __init__(self, in_folder=args.directory):\n        self.keys[\"root\"] = [\n            get_fingerprint(os.environ[\"KEY1\"]),\n            get_fingerprint(os.environ[\"KEY2\"]),\n        ]\n\n        self.in_folder = Path(in_folder).resolve()\n        self.folder = self.in_folder.parent / (str(self.in_folder.name) + \"_signed\")\n\n        if not self.folder.exists():\n            os.mkdir(self.folder)\n\n        self.keys = self.normalize_keys(self.keys)\n        print(\"[reposigner] Using keys:\", self.keys)\n\n        print(\"[reposigner] Using folder:\", self.folder)\n\n        self.create_root(self.keys)\n        self.create_key_mgr(self.keys)\n        for f in glob.glob(str(self.in_folder / \"**\" / \"repodata.json\")):\n            self.sign_repodata(Path(f), self.keys)\n\n\nclass RepodataHeadersHandler(SimpleHTTPRequestHandler):\n    \"\"\"\n    This handler is used to debug requests to repodata.json files. We\n    make them error out with a failed redirection to a URL that\n    contains the client headers in the URL, encoded as base64.\n    \"\"\"\n\n    path_suffix_to_debug = \"repodata.json\"\n\n    def do_GET(self) -> None:\n        \"\"\"\n        HACK: if a repodata.json is requested, redirect\n        to a fake address which encodes the client headers\n        as b64. This way, we can parse the exception message in a test.\n        \"\"\"\n        if not self.path.endswith(self.path_suffix_to_debug):\n            return super().do_GET()\n        headers_b64 = base64.b64encode(str(self.headers).encode(\"utf-8\"))\n        self.send_response(307)  # redirect\n        self.send_header(\"Location\", f\"/headers/{headers_b64.decode('utf-8')}\")\n        self.end_headers()\n\n\nclass PackagesHeadersHandler(RepodataHeadersHandler):\n    \"Same as RepodataHeadersHandler, but it fails when tarballs are requested\"\n\n    path_suffix_to_debug = \".tar.bz2\"\n\n\nclass BasicAuthHandler(SimpleHTTPRequestHandler):\n    \"\"\"Main class to present webpages and authentication.\"\"\"\n\n    user = args.user\n    password = args.password\n    key = base64.b64encode(bytes(f\"{args.user}:{args.password}\", \"utf-8\")).decode(\"ascii\")\n\n    def do_HEAD(self):\n        self.send_response(200)\n        self.send_header(\"Content-type\", \"text/html\")\n        self.end_headers()\n\n    def do_AUTHHEAD(self):\n        self.send_response(401)\n        self.send_header(\"WWW-Authenticate\", 'Basic realm=\"Test\"')\n        self.send_header(\"Content-type\", \"text/html\")\n        self.end_headers()\n\n    def do_GET(self):\n        \"\"\"Present frontpage with user authentication.\"\"\"\n        auth_header = self.headers.get(\"Authorization\", \"\")\n\n        if not auth_header:\n            self.do_AUTHHEAD()\n            self.wfile.write(b\"no auth header received\")\n            pass\n        elif auth_header == \"Basic \" + self.key:\n            SimpleHTTPRequestHandler.do_GET(self)\n            pass\n        else:\n            self.do_AUTHHEAD()\n            self.wfile.write(auth_header.encode(\"ascii\"))\n            self.wfile.write(b\"not authenticated\")\n            pass\n\n\nclass CondaTokenHandler(SimpleHTTPRequestHandler):\n    \"\"\"Main class to present webpages and authentication.\"\"\"\n\n    api_key = args.token\n    token_pattern = re.compile(\"^/t/([^/]+?)/\")\n\n    def do_GET(self):\n        \"\"\"Present frontpage with user authentication.\"\"\"\n        match = self.token_pattern.search(self.path)\n        if match:\n            prefix_length = len(match.group(0)) - 1\n            new_path = self.path[prefix_length:]\n            found_api_key = match.group(1)\n            if found_api_key == self.api_key:\n                self.path = new_path\n                return SimpleHTTPRequestHandler.do_GET(self)\n\n        self.send_response(403)\n        self.send_header(\"Content-type\", \"text/html\")\n        self.end_headers()\n        self.wfile.write(b\"no valid api key received\")\n\n\nif args.sign:\n    if not conda_content_trust_available:\n        print(\"Conda content trust not installed!\")\n        exit(1)\n    signer = RepoSigner()\n    os.chdir(signer.folder)\nelse:\n    os.chdir(args.directory)\n\nif args.auth == \"none\":\n    handler = SimpleHTTPRequestHandler\nelif args.auth == \"none-debug-repodata\":\n    handler = RepodataHeadersHandler\nelif args.auth == \"none-debug-packages\":\n    handler = PackagesHeadersHandler\nelif args.auth == \"basic\" or (args.user and args.password):\n    handler = BasicAuthHandler\nelif args.auth == \"token\" or args.token:\n    handler = CondaTokenHandler\nelse:\n    print(\"No auth method given.\")\n    exit(1)\n\nPORT = args.port\n\nserver = HTTPServer((\"\", PORT), handler)\nprint(\"Server started at localhost:\" + str(server.server_port))\ntry:\n    server.serve_forever()\nexcept Exception as exc:\n    # Catch all sorts of interrupts\n    print(\"Shutting server down:\", exc.__class__.__name__, exc)\n    server.shutdown()\n    print(\"Server shut down\")\n"
  },
  {
    "path": "tests/conftest.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\npytest_plugins = (\n    # Add testing fixtures and internal pytest plugins here\n    \"conda.testing\",\n    \"conda.testing.fixtures\",\n)\n\n# Allow fixtures from test_shards to be available globally, specifically in\n# test_shards_subset:\nfrom .test_shards import (  # noqa: F401\n    http_server_shards as http_server_shards,\n)\nfrom .test_shards import (\n    mock_cache as mock_cache,\n)\nfrom .test_shards import (\n    prepare_shards_test as prepare_shards_test,\n)\nfrom .test_shards import (\n    shard_cache_with_data as shard_cache_with_data,\n)\nfrom .test_shards import (\n    shard_factory as shard_factory,\n)\n"
  },
  {
    "path": "tests/data/conda_build_recipes/LICENSE",
    "content": "This directory was taken from mamba-org/boa, commit 3213180564e51b72a27efed5183d21f97f630692, on May 12 2022\n\n---\n\nCopyright 2020 QuantStack and the Boa contributors.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "tests/data/conda_build_recipes/baddeps/meta.yaml",
    "content": "{% set name = \"stackvana-core\" %}\n{% set version = \"0.2021.43\" %}\n\npackage:\n  name: {{ name|lower }}\n  version: {{ version }}\n\nbuild:\n  number: 0\n\noutputs:\n  - name: stackvana-core-impl\n    version: {{ version }}\n    build:\n      script:\n        - echo \"BUILDING IMPL\" >> $PREFIX/stackvana-core-impl   # [unix]\n        - echo \"BUILDING IMPL\" >> %PREFIX%/stackvana-core-impl  # [win]\n  - name: stackvana-core\n    version: {{ version }}\n    run_exports:\n      - {{ pin_subpackage('stackvana-core-impl', exact=True) }}\n\n    requirements:\n      run:\n        - thispackagedoesnotexist >=100000000\n"
  },
  {
    "path": "tests/data/conda_build_recipes/jedi/meta.yaml",
    "content": "{% set name = \"jedi\" %}\n{% set version = \"0.19.2\" %}\n\npackage:\n  name: {{ name }}\n  version: {{ version }}\n\nsource:\n  url: https://pypi.io/packages/source/{{ name[0] }}/{{ name }}/{{ name }}-{{ version }}.tar.gz\n  sha256: 4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0\n\nbuild:\n  number: 0\n  script: {{ PYTHON }} -m pip install . --no-deps --no-build-isolation --ignore-installed --no-cache-dir -vv\n  # the minimal version of python supported is 3.6\n  skip: true  # [py<36]\n\nrequirements:\n  host:\n    - python\n    - pip\n    - setuptools\n    - wheel\n  run:\n    - python\n    - parso >=0.8.4,<0.9.0\n\ntest:\n  imports:\n    - jedi\n    - jedi.api\n    - jedi.common\n    - jedi.inference\n    - jedi.inference.compiled\n    - jedi.inference.compiled.subprocess\n    - jedi.inference.gradual\n    - jedi.inference.value\n    - jedi.plugins\n"
  },
  {
    "path": "tests/data/conda_build_recipes/multioutput/meta.yaml",
    "content": "{% set name = \"ocp\" %}\n{% set version = \"7.5.2beta\" %}\n{% set occt_version = \"=7.5.2\" %}\n\npackage:\n  name: {{ name }}-split\n  version: {{ version }}\n\nbuild:\n  number: 0\n\noutputs:\n  - name: ocp-devel\n    build:\n      script:\n        - echo \"BUILDING IMPL\" >> $PREFIX/stackvana-core-impl   # [unix]\n        - echo \"BUILDING IMPL\" >> %PREFIX%/stackvana-core-impl  # [win]\n\n  - name: ocp\n    build:\n      script:\n        - echo \"BUILDING IMPL\" >> $PREFIX/ocp   # [unix]\n        - echo \"BUILDING IMPL\" >> %PREFIX%/ocp  # [win]\n    requirements:\n      host:\n        - \"{{ pin_subpackage('ocp-devel', exact=True) }}\"\n      run:\n        - \"{{ pin_subpackage('ocp-devel', exact=True) }}\"\n"
  },
  {
    "path": "tests/data/conda_build_recipes/stackvana/meta.yaml",
    "content": "{% set name = \"stackvana-split\" %}\n{% set version = \"0.2021.43\" %}\n{% set eups_product = \"lsst_distrib\" %}\n\npackage:\n  name: {{ name|lower }}\n  version: {{ version }}\n\nbuild:\n  number: 0\n\noutputs:\n  - name: stackvana-core-impl\n    version: {{ version }}\n    build:\n      script:\n        - echo \"BUILDING IMPL\" >> $PREFIX/stackvana-core-impl  # [unix]\n        - echo \"BUILDING IMPL\" >> %PREFIX%/stackvana-core-impl  # [win]\n    test:\n      commands:\n        - echo OK\n  - name: stackvana-core\n    version: {{ version }}\n    build:\n      script:\n        - echo \"BUILDING CORE\" >> $PREFIX/stackvana-core  # [unix]\n        - echo \"BUILDING CORE\" >> %PREFIX%/stackvana-core  # [win]\n      run_exports:\n        - {{ pin_subpackage('stackvana-core-impl', exact=True) }}\n    requirements:\n      run:\n        - {{ pin_subpackage('stackvana-core-impl', exact=True) }}\n    test:\n      commands:\n        - echo OK\n  - name: stackvana-{{ eups_product }}\n    version: {{ version }}\n    build:\n      script:\n        - echo \"BUILDING {{ eups_product }}\" >> $PREFIX/stackvana-{{ eups_product }}  # [unix]\n        - echo \"BUILDING {{ eups_product }}\" >> %PREFIX%/stackvana-{{ eups_product }}  # [win]\n    requirements:\n      host:\n        - stackvana-core =={{ version }}\n      run:\n        - stackvana-core =={{ version }}\n    test:\n      commands:\n        - echo OK\n  - name: stackvana\n    version: {{ version }}\n    build:\n      script:\n        - echo \"BUILDING STACKVANA\" >> $PREFIX/stackvana  # [unix]\n        - echo \"BUILDING STACKVANA\" >> %PREFIX%/stackvana  # [win]\n    requirements:\n        - {{ pin_subpackage(\"stackvana-\" ~ eups_product, max_pin=\"x.x.x\") }}\n    test:\n      commands:\n        - echo OK\n"
  },
  {
    "path": "tests/data/lock_this_env.yml",
    "content": "channels:\n  - conda-forge\ndependencies:\n  - zlib\n"
  },
  {
    "path": "tests/data/mamba_repo/LICENSE",
    "content": "This directory was taken from mamba-org/mamba, commit bff16c2bdc4103ba74c23ab4fdbf58849a55981c, on Mar 17 2022\n\n---\n\nCopyright 2019 QuantStack and the Mamba contributors.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "tests/data/mamba_repo/channeldata.json",
    "content": "{\n  \"channeldata_version\": 1,\n  \"packages\": {\n    \"test-package\": {\n      \"activate.d\": false,\n      \"binary_prefix\": false,\n      \"deactivate.d\": false,\n      \"description\": null,\n      \"dev_url\": null,\n      \"doc_source_url\": null,\n      \"doc_url\": null,\n      \"home\": \"https://github.com/mamba-org/mamba\",\n      \"icon_hash\": null,\n      \"icon_url\": null,\n      \"identifiers\": null,\n      \"keywords\": null,\n      \"license\": \"BSD\",\n      \"post_link\": false,\n      \"pre_link\": false,\n      \"pre_unlink\": false,\n      \"recipe_origin\": null,\n      \"run_exports\": {},\n      \"source_git_url\": null,\n      \"source_url\": null,\n      \"subdirs\": [\n        \"noarch\"\n      ],\n      \"summary\": \"I am just a test package!\",\n      \"tags\": null,\n      \"text_prefix\": false,\n      \"timestamp\": 1613117294,\n      \"version\": \"0.1\"\n    }\n  },\n  \"subdirs\": [\n    \"noarch\"\n  ]\n}\n"
  },
  {
    "path": "tests/data/mamba_repo/index.html",
    "content": "<html>\n<head>\n  <title>repo</title>\n  <style type=\"text/css\">\n    a, a:active {\n      text-decoration: none; color: blue;\n    }\n    a:visited {\n      color: #48468F;\n    }\n    a:hover, a:focus {\n      text-decoration: underline; color: red;\n    }\n    body {\n      background-color: #F5F5F5;\n    }\n    h2 {\n      margin-bottom: 12px;\n    }\n    th, td {\n      font: 100% monospace; text-align: left;\n    }\n    th {\n      font-weight: bold; padding-right: 14px; padding-bottom: 3px;\n    }\n    th.tight {\n        padding-right: 6px;\n    }\n    td {\n      padding-right: 14px;\n    }\n    td.tight {\n        padding-right: 8px;\n    }\n    td.s, th.s {\n      text-align: right;\n    }\n    td.summary {\n      white-space: nowrap;\n      overflow: hidden;\n    }\n    td.packagename {\n      white-space: nowrap;\n      text-overflow: ellipsis;\n      overflow: hidden;\n      max-width: 180px;\n      padding-right: 8px;\n    }\n    td.version {\n      //white-space: nowrap;\n      overflow: hidden;\n      max-width: 90px;\n      padding-right: 8px;\n    }\n    table {\n      background-color: white;\n      border-top: 1px solid #646464;\n      border-bottom: 1px solid #646464;\n      padding-top: 10px;\n      padding-bottom: 14px;\n    }\n    address {\n      color: #787878;\n      padding-top: 10px;\n    }\n  </style>\n</head>\n<body>\n  <h2>repo</h2>\n  <h3><a href=\"rss.xml\">RSS Feed</a>&nbsp;&nbsp;&nbsp;<a href=\"channeldata.json\">channeldata.json</a></h3>\n<a href=\"noarch\">noarch</a>&nbsp;&nbsp;&nbsp;  <table>\n    <tr>\n      <th style=\"padding-right:18px;\">Package</th>\n      <th>Latest Version</th>\n      <th>Doc</th>\n      <th>Dev</th>\n      <th>License</th>\n<th class=\"tight\">noarch</th>      <th>Summary</th>\n    </tr>\n    <tr>\n      <td class=\"packagename\"><a href=\"https://github.com/mamba-org/mamba\" alt=\"test-package\">test-package</a></td>\n      <td class=\"version\">0.1</td>\n      <td></td>\n      <td></td>\n      <td class=\"tight\">BSD</td>\n<td>X</td>      <td class=\"summary\">I am just a test package!</td>\n    </tr>  </table>\n  <address>Updated: 2021-02-12 09:02:37 +0000 - Files: 1</address>\n</body>\n</html>\n"
  },
  {
    "path": "tests/data/mamba_repo/noarch/current_repodata.json",
    "content": "{\n  \"info\": {\n    \"subdir\": \"noarch\"\n  },\n  \"packages\": {\n    \"test-package-0.1-0.tar.bz2\": {\n      \"build\": \"0\",\n      \"build_number\": 0,\n      \"depends\": [],\n      \"license\": \"BSD\",\n      \"license_family\": \"BSD\",\n      \"md5\": \"2a8595f37faa2950e1b433acbe91d481\",\n      \"name\": \"test-package\",\n      \"noarch\": \"generic\",\n      \"sha256\": \"b908ffce2d26d94c58c968abf286568d4bcf87d1cfe6c994958351724a6f6988\",\n      \"size\": 5719,\n      \"subdir\": \"noarch\",\n      \"timestamp\": 1613117294885,\n      \"version\": \"0.1\"\n    }\n  },\n  \"packages.conda\": {},\n  \"removed\": [],\n  \"repodata_version\": 1\n}\n"
  },
  {
    "path": "tests/data/mamba_repo/noarch/index.html",
    "content": "<html>\n<head>\n  <title>repo/noarch</title>\n  <style type=\"text/css\">\n    a, a:active {\n      text-decoration: none; color: blue;\n    }\n    a:visited {\n      color: #48468F;\n    }\n    a:hover, a:focus {\n      text-decoration: underline; color: red;\n    }\n    body {\n      background-color: #F5F5F5;\n    }\n    h2 {\n      margin-bottom: 12px;\n    }\n    th, td {\n      font: 100% monospace; text-align: left;\n    }\n    th {\n      font-weight: bold; padding-right: 14px; padding-bottom: 3px;\n    }\n    td {\n      padding-right: 20px;\n    }\n    td.s, th.s {\n      text-align: right;\n    }\n    table {\n      background-color: white;\n      border-top: 1px solid #646464;\n      border-bottom: 1px solid #646464;\n      padding-top: 10px;\n      padding-bottom: 14px;\n    }\n    address {\n      color: #787878;\n      padding-top: 10px;\n    }\n  </style>\n</head>\n<body>\n  <h2>repo/noarch</h2>\n  <table>\n    <tr>\n      <th>Filename</th>\n      <th>Size</th>\n      <th>Last Modified</th>\n      <th>SHA256</th>\n      <th>MD5</th>\n    </tr>\n    <tr>\n      <td><a href=\"repodata.json\" alt=\"repodata.json\">repodata.json</a></td>\n      <td class=\"s\">586 B</td>\n      <td>2021-02-12 09:01:48 +0000</td>\n      <td>cc5f72aaa8d3f508c8adca196fe05cf4b19e1ca1006cfcbb3892d73160bd3b04</td>\n      <td>7501ec77771889b42a39c615158cb9c4</td>\n    </tr>    <tr>\n      <td><a href=\"repodata.json.bz2\" alt=\"repodata.json.bz2\">repodata.json.bz2</a></td>\n      <td class=\"s\">351 B</td>\n      <td>2021-02-12 09:01:48 +0000</td>\n      <td>9a0288ca48c6b8caa348d7cafefd0981c2d25dcb4a5837a5187ab200b8b9fb45</td>\n      <td>0c926155642f0e894d97dc8a5af7007b</td>\n    </tr>    <tr>\n      <td><a href=\"repodata_from_packages.json\" alt=\"repodata_from_packages.json\">repodata_from_packages.json</a></td>\n      <td class=\"s\">586 B</td>\n      <td>2021-02-12 09:01:48 +0000</td>\n      <td>cc5f72aaa8d3f508c8adca196fe05cf4b19e1ca1006cfcbb3892d73160bd3b04</td>\n      <td>7501ec77771889b42a39c615158cb9c4</td>\n    </tr>    <tr>\n      <td><a href=\"repodata_from_packages.json.bz2\" alt=\"repodata_from_packages.json.bz2\">repodata_from_packages.json.bz2</a></td>\n      <td class=\"s\">351 B</td>\n      <td>2021-02-12 09:01:48 +0000</td>\n      <td>9a0288ca48c6b8caa348d7cafefd0981c2d25dcb4a5837a5187ab200b8b9fb45</td>\n      <td>0c926155642f0e894d97dc8a5af7007b</td>\n    </tr>    <tr>\n      <td><a href=\"test-package-0.1-0.tar.bz2\" alt=\"test-package-0.1-0.tar.bz2\">test-package-0.1-0.tar.bz2</a></td>\n      <td class=\"s\">6 KB</td>\n      <td>2021-02-12 08:08:14 +0000</td>\n      <td>b908ffce2d26d94c58c968abf286568d4bcf87d1cfe6c994958351724a6f6988</td>\n      <td>2a8595f37faa2950e1b433acbe91d481</td>\n    </tr>  </table>\n  <address>Updated: 2021-02-12 09:02:37 +0000 - Files: 1</address>\n</body>\n</html>\n"
  },
  {
    "path": "tests/data/mamba_repo/noarch/repodata.json",
    "content": "{\n  \"info\": {\n    \"subdir\": \"noarch\"\n  },\n  \"packages\": {\n    \"test-package-0.1-0.tar.bz2\": {\n      \"build\": \"0\",\n      \"build_number\": 0,\n      \"depends\": [],\n      \"license\": \"BSD\",\n      \"license_family\": \"BSD\",\n      \"md5\": \"2a8595f37faa2950e1b433acbe91d481\",\n      \"name\": \"test-package\",\n      \"noarch\": \"generic\",\n      \"sha256\": \"b908ffce2d26d94c58c968abf286568d4bcf87d1cfe6c994958351724a6f6988\",\n      \"size\": 5719,\n      \"subdir\": \"noarch\",\n      \"timestamp\": 1613117294885,\n      \"version\": \"0.1\"\n    }\n  },\n  \"packages.conda\": {},\n  \"removed\": [],\n  \"repodata_version\": 1\n}\n"
  },
  {
    "path": "tests/data/mamba_repo/noarch/repodata_from_packages.json",
    "content": "{\n  \"info\": {\n    \"subdir\": \"noarch\"\n  },\n  \"packages\": {\n    \"test-package-0.1-0.tar.bz2\": {\n      \"build\": \"0\",\n      \"build_number\": 0,\n      \"depends\": [],\n      \"license\": \"BSD\",\n      \"license_family\": \"BSD\",\n      \"md5\": \"2a8595f37faa2950e1b433acbe91d481\",\n      \"name\": \"test-package\",\n      \"noarch\": \"generic\",\n      \"sha256\": \"b908ffce2d26d94c58c968abf286568d4bcf87d1cfe6c994958351724a6f6988\",\n      \"size\": 5719,\n      \"subdir\": \"noarch\",\n      \"timestamp\": 1613117294885,\n      \"version\": \"0.1\"\n    }\n  },\n  \"packages.conda\": {},\n  \"removed\": [],\n  \"repodata_version\": 1\n}\n"
  },
  {
    "path": "tests/data/mamba_repo/recipes/test-package/meta.yaml",
    "content": "package:\n  name: test-package\n  version: 0.1\n\nbuild:\n  number: 0\n  script: echo Hello world\n  noarch: generic\n\nabout:\n  home: https://github.com/mamba-org/mamba\n  license: BSD\n  license_family: BSD\n  summary: I am just a test package!\n"
  },
  {
    "path": "tests/http_test_server.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nLocal test server based on http.server\n\"\"\"\n\n# From conda/tests; data/reposerver.py was refusing connections on Windows for shards tests.\nfrom __future__ import annotations\n\nimport contextlib\nimport http.server\nimport queue\nimport socket\nimport threading\nfrom typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n    from collections.abc import Callable\n\n\ndef run_test_server(\n    directory: str, finish_request_action: Callable | None = None\n) -> http.server.ThreadingHTTPServer:\n    \"\"\"\n    Run a test server on a random port. Inspect returned server to get port,\n    shutdown etc.\n    \"\"\"\n\n    class DualStackServer(http.server.ThreadingHTTPServer):\n        daemon_threads = False  # These are per-request threads\n        allow_reuse_address = True  # Good for tests\n        request_queue_size = 64  # Should be more than the number of test packages\n\n        def server_bind(self):\n            # suppress exception when protocol is IPv4\n            with contextlib.suppress(Exception):\n                self.socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)\n            return super().server_bind()\n\n        def finish_request(self, request, client_address):\n            if finish_request_action:\n                finish_request_action()\n            self.RequestHandlerClass(request, client_address, self, directory=directory)\n\n    def start_server(queue):\n        try:\n            with DualStackServer((\"127.0.0.1\", 0), http.server.SimpleHTTPRequestHandler) as httpd:\n                host, port = httpd.socket.getsockname()[:2]\n                queue.put(httpd)\n                url_host = f\"[{host}]\" if \":\" in host else host\n                print(f\"Serving HTTP on {host} port {port} (http://{url_host}:{port}/) ...\")\n                try:\n                    httpd.serve_forever()\n                except KeyboardInterrupt:\n                    print(\"\\nKeyboard interrupt received, exiting.\")\n        except Exception as exc:\n            queue.put(exc)\n\n    started = queue.Queue()\n\n    threading.Thread(target=start_server, args=(started,), daemon=True).start()\n\n    result = started.get(timeout=1)\n    if isinstance(result, Exception):\n        raise result\n    return result\n\n\nif __name__ == \"__main__\":\n    server = run_test_server(directory=\".\")\n    print(server)\n"
  },
  {
    "path": "tests/repodata_time_machine.py",
    "content": "# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nconda repodata time machine\n\nGiven a date and a channel, this script will:\n\n- Download a local copy of the (unpatched) repodata\n- Trim to the closest timestamp\n- Download the closest repodata patches for that channel\n- Apply the patches\n- Generate a ready-to-use local channel\n\"\"\"\n\nimport bz2\nimport json\nimport os\nimport urllib.request\nfrom argparse import ArgumentParser\nfrom datetime import datetime\n\nimport requests\nfrom conda.base.context import context\nfrom conda.models.channel import Channel\nfrom conda_index.index import _apply_instructions\nfrom conda_package_handling.api import extract as cph_extract\n\nPATCHED_CHANNELS = {\"defaults\", \"main\", \"conda-forge\"}\n\n\ndef cli():\n    p = ArgumentParser()\n    p.add_argument(\"channels\", nargs=\"+\", metavar=\"channel\")\n    p.add_argument(\"-t\", \"--timestamp\", required=True, help=\"YYYY-MM-DD HH:MM:SS. Assumes UTC.\")\n    p.add_argument(\n        \"-s\",\n        \"--subdirs\",\n        default=f\"{context.subdir},noarch\",\n        help=\"Comma-separated list of subdirs to download. Include 'noarch' explicitly if needed.\",\n    )\n    return p.parse_args()\n\n\ndef download_repodata(channel, subdirs=None):\n    \"Download remote repodata JSON payload to a temporary location in disk\"\n    c = Channel(channel)\n    if c.canonical_name in PATCHED_CHANNELS:\n        repodata_fn = \"repodata_from_packages\"\n    else:\n        repodata_fn = \"repodata\"\n    subdirs = subdirs or context.subdirs\n    for url in c.urls(with_credentials=True, subdirs=subdirs):\n        subdir = url.strip(\"/\").split(\"/\")[-1]\n        urllib.request.urlretrieve(f\"{url}/{repodata_fn}.json.bz2\", f\"{repodata_fn}.json.bz2\")\n\n        with open(f\"{repodata_fn}.json.bz2\", \"rb\") as f:\n            with open(f\"{repodata_fn}.json\", \"wb\") as g:\n                g.write(bz2.decompress(f.read()))\n\n        yield f\"{repodata_fn}.json\", subdir\n\n\ndef trim_to_timestamp(repodata, timestamp: float):\n    trimmed_tar_pkgs = {}\n    trimmed_conda_pkgs = {}\n    with open(repodata) as f:\n        data = json.load(f)\n        for name, pkg in data[\"packages\"].items():\n            if pkg.get(\"timestamp\", 0) <= timestamp:\n                trimmed_tar_pkgs[name] = pkg\n        for name, pkg in data[\"packages.conda\"].items():\n            if pkg.get(\"timestamp\", 0) <= timestamp:\n                trimmed_conda_pkgs[name] = pkg\n    data[\"packages\"] = trimmed_tar_pkgs\n    data[\"packages.conda\"] = trimmed_conda_pkgs\n    fn = f\"trimmed.{os.path.basename(repodata)}\"\n    with open(fn, \"w\") as f:\n        json.dump(data, f)\n    return fn\n\n\ndef download_patches(channel, timestamp: float):\n    name = Channel(channel).canonical_name\n    if name != \"conda-forge\":\n        raise NotImplementedError(\"Only conda-forge is supported for now\")\n\n    url = \"https://api.anaconda.org/package/conda-forge/conda-forge-repodata-patches/files\"\n    r = requests.get(url)\n    r.raise_for_status()\n    pkgs = r.json()\n    closest_older = None\n    for pkg in sorted(pkgs, key=lambda pkg: pkg[\"attrs\"][\"timestamp\"]):\n        if pkg[\"attrs\"][\"timestamp\"] <= timestamp:\n            closest_older = pkg\n        else:\n            break\n    if closest_older is None:\n        raise ValueError(f\"No patch found for timestamp {timestamp}\")\n\n    fn = closest_older[\"basename\"].split(\"/\")[-1]\n    urllib.request.urlretrieve(f\"https:{closest_older['download_url']}\", fn)\n\n    extract_path = f\"conda-forge-repodata-patches-{closest_older['version']}\"\n    cph_extract(fn, dest_dir=extract_path)\n    return extract_path\n\n\ndef apply_patch(repodata_file, patch):\n    with open(repodata_file) as f, open(patch) as g:\n        repodata = json.load(f)\n        instructions = json.load(g)\n    fn = f\"patched.{os.path.basename(repodata_file)}\"\n    with open(fn, \"w\") as f:\n        patched = _apply_instructions(None, repodata, instructions)\n        json.dump(patched, f, indent=2)\n    return fn\n\n\ndef repodata_time_machine(channels, timestamp_str, subdirs=None):\n    horizon = datetime.strptime(timestamp_str, \"%Y-%m-%d %H:%M:%S\")\n    timestamp = horizon.timestamp() * 1000\n    original_dir = os.getcwd()\n    try:\n        workdir = f\"repodata-{timestamp_str.replace(' ', '-').replace(':', '-').replace('.', '-')}\"\n        os.makedirs(workdir, exist_ok=True)\n        os.chdir(workdir)\n        # Download repodata\n        for channel in channels:\n            print(\"Rolling back\", channel, \"to\", horizon)\n            channel_name = Channel(channel).canonical_name\n            os.makedirs(channel_name, exist_ok=True)\n            os.chdir(channel_name)\n            must_patch = channel_name in PATCHED_CHANNELS\n            if must_patch:\n                print(\"  Getting patches\")\n                patch_dir = os.path.abspath(download_patches(channel, timestamp))\n            for repodata, subdir in download_repodata(channel, subdirs=subdirs):\n                print(\"  Downloaded\", repodata, \"for\", subdir)\n                print(\"    Trimming...\")\n                abs_repodata = os.path.abspath(repodata)\n                os.makedirs(subdir, exist_ok=True)\n                os.chdir(subdir)\n                trimmed = trim_to_timestamp(abs_repodata, timestamp)\n                if must_patch:\n                    print(\"    Patching...\")\n                    instructions = f\"{patch_dir}/{subdir}/patch_instructions.json\"\n                    patched = apply_patch(trimmed, instructions)\n                    if not os.path.exists(\"repodata.json\"):\n                        os.symlink(patched, \"repodata.json\")\n                else:\n                    if not os.path.exists(\"repodata.json\"):\n                        os.symlink(trimmed, \"repodata.json\")\n                os.chdir(\"..\")\n            os.chdir(\"..\")\n        return workdir\n    finally:\n        os.chdir(original_dir)\n\n\ndef main():\n    args = cli()\n    return repodata_time_machine(args.channels, args.timestamp, args.subdirs.split(\",\"))\n\n\nif __name__ == \"__main__\":\n    main()\n    print(\"Done!\")\n"
  },
  {
    "path": "tests/requirements.txt",
    "content": "conda-build\nconda-forge::pytest-xprocess\nconda-index\nconda-lock\nconda-forge::pre-commit\npytest-codspeed >=4\nconda-forge::pytest-mock\n# needed for many conda tests\nflask\n"
  },
  {
    "path": "tests/run_in_profiler.py",
    "content": "#!/usr/bin/env python\n# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nTo be run with python -m scalene <this file>\n\"\"\"\n\nimport logging\nimport os\nimport pathlib\n\nfrom conda.base.context import reset_context\n\nimport tests.test_shards_subset\nfrom conda_libmamba_solver import shards, shards_cache, shards_subset\n\nos.environ[\"CONDA_TOKEN\"] = \"\"\nos.environ[\"CONDA_PLUGINS_USE_SHARDED_REPODATA\"] = \"1\"\nos.environ[\"CONDA_REPODATA_THREADS\"] = (\n    \"10\"  # shave a half second off our time by avoiding CondaSession() creation\n)\nreset_context()\npathlib.Path(\"/tmp/shards\").mkdir(exist_ok=True)\n\ntmp_path = pathlib.Path(\"/tmp/shards\")\n\nlogging.basicConfig(level=logging.INFO)\nfor module in (shards, shards_cache, shards_subset):\n    module.log.setLevel(logging.DEBUG)\n\ntests.test_shards_subset.test_build_repodata_subset_pipelined(None, tmp_path)\n"
  },
  {
    "path": "tests/test_channels.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\nfrom __future__ import annotations\n\nimport json\nimport os\nimport shutil\nimport sys\nimport time\nfrom pathlib import Path\nfrom subprocess import check_call\nfrom typing import TYPE_CHECKING\nfrom urllib.request import urlretrieve\n\nimport pytest\nfrom conda.base.context import reset_context\nfrom conda.common.compat import on_linux, on_win\nfrom conda.common.io import env_vars\nfrom conda.core.prefix_data import PrefixData\nfrom conda.exceptions import DryRunExit\nfrom conda.models.channel import Channel\nfrom conda.testing.integration import package_is_installed\n\nfrom conda_libmamba_solver.index import LibMambaIndexHelper\n\nfrom .channel_testing.helpers import (\n    http_server_auth_basic,  # noqa: F401\n    http_server_auth_basic_email,  # noqa: F401\n    http_server_auth_none,  # noqa: F401\n    http_server_auth_token,  # noqa: F401\n)\nfrom .utils import conda_subprocess, write_env_config\n\nif TYPE_CHECKING:\n    from conda.testing.fixtures import CondaCLIFixture, PathFactoryFixture, TmpEnvFixture\n\n    from .test_shards import ShardFactory\n\nDATA = Path(__file__).parent / \"data\"\n\n\ndef test_channel_matchspec(conda_cli: CondaCLIFixture, path_factory: PathFactoryFixture) -> None:\n    stdout, _, _ = conda_cli(\n        \"create\",\n        f\"--prefix={path_factory()}\",\n        \"--solver=libmamba\",\n        \"--json\",\n        \"--override-channels\",\n        \"--channel=defaults\",\n        \"conda-forge::libblas=*=*openblas\",\n        \"python=3.9\",\n    )\n    result = json.loads(stdout)\n    assert result[\"success\"] is True\n    for record in result[\"actions\"][\"LINK\"]:\n        if record[\"name\"] == \"numpy\":\n            assert record[\"channel\"] == \"conda-forge\"\n        elif record[\"name\"] == \"python\":\n            assert record[\"channel\"] == \"pkgs/main\"\n\n\ndef test_channels_prefixdata(tmp_env: TmpEnvFixture) -> None:\n    \"\"\"\n    Make sure libmamba does not complain about missing channels\n    used in previous commands.\n\n    See https://github.com/conda/conda/issues/11790\n    \"\"\"\n    with tmp_env(\"conda-forge::xz\", \"python=3.13\", \"--solver=libmamba\") as prefix:\n        p = conda_subprocess(\n            \"install\",\n            \"-yp\",\n            prefix,\n            \"pytest\",\n            \"--solver=libmamba\",\n        )\n        assert (\n            \"Selected channel specific (or force-reinstall) job, \"\n            \"but package is not available from channel. \"\n            \"Solve job will fail.\" not in (p.stdout + p.stderr)\n        )\n\n\ndef test_channels_installed_unavailable(\n    tmp_env: TmpEnvFixture,\n    conda_cli: CondaCLIFixture,\n) -> None:\n    \"\"\"Ensure we don't fail if a channel coming ONLY from an installed pkg is unavailable\"\"\"\n    with tmp_env(\"xz\", \"--solver=libmamba\") as prefix:\n        pd = PrefixData(prefix)\n        pd.load()\n        record = pd.get(\"xz\")\n        assert record\n        record.channel = Channel.from_url(\"file:///nonexistent\")\n\n        _, _, retcode = conda_cli(\n            \"install\",\n            f\"--prefix={prefix}\",\n            \"zlib\",\n            \"--solver=libmamba\",\n            \"--dry-run\",\n            raises=DryRunExit,\n        )\n\n\ndef _setup_conda_forge_as_defaults(prefix, force=False):\n    write_env_config(\n        prefix,\n        force=force,\n        channels=[\"defaults\"],\n        default_channels=[\"conda-forge\"],\n    )\n\n\ndef _setup_channels_alias(prefix, force=False):\n    write_env_config(\n        prefix,\n        force=force,\n        channels=[\"conda-forge\", \"defaults\"],\n        channel_alias=\"https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud\",\n        migrated_channel_aliases=[\"https://conda.anaconda.org\"],\n        default_channels=[\n            \"https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main\",\n            \"https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r\",\n            \"https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2\",\n        ],\n    )\n\n\ndef _setup_channels_custom(prefix, force=False):\n    write_env_config(\n        prefix,\n        force=force,\n        channels=[\"conda-forge\"],\n        custom_channels={\n            \"conda-forge\": \"https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud\",\n        },\n    )\n\n\n@pytest.mark.parametrize(\n    \"config_env\",\n    (\n        _setup_channels_alias,\n        _setup_channels_custom,\n    ),\n)\ndef test_mirrors_do_not_leak_channels(config_env, tmp_path, tmp_env):\n    \"\"\"\n    https://github.com/conda/conda-libmamba-solver/issues/108\n\n    On existing environments, we load channels from the prefix data information\n    to silence some warnings in libmamba (see `test_channels_prefixdata`).\n\n    In some configurations that use proxies or Anaconda mirrors, this can lead to\n    the non-mirrored (original) channels being loaded. In airgapped contexts, this\n    is undesirable.\n    \"\"\"\n\n    with env_vars({\"CONDA_PKGS_DIRS\": tmp_path}), tmp_env() as prefix:\n        assert (Path(prefix) / \"conda-meta\" / \"history\").exists()\n\n        # Setup conda configuration\n        config_env(prefix)\n        common = [\"-yp\", prefix, \"--solver=libmamba\", \"--json\", \"-vv\"]\n\n        env = os.environ.copy()\n        env[\"CONDA_PREFIX\"] = str(prefix)  # fake activation so config is loaded\n\n        # Create an environment using mirrored channels only\n        p = conda_subprocess(\"install\", *common, \"ca-certificates\", env=env)\n        result = json.loads(p.stdout)\n        if p.stderr:\n            assert \"conda.anaconda.org\" not in p.stderr\n\n        for pkg in result[\"actions\"][\"LINK\"]:\n            assert pkg[\"channel\"] == \"conda-forge\", pkg\n            assert (\n                pkg[\"base_url\"]\n                == \"https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge\"\n            ), pkg\n\n        # Make a change to that channel\n        p = conda_subprocess(\"install\", *common, \"zlib\", env=env)\n\n        # Ensure that the loaded channels are ONLY the mirrored ones\n        result = json.loads(p.stdout)\n        if p.stderr:\n            assert \"conda.anaconda.org\" not in p.stderr\n\n        for pkg in result[\"actions\"][\"LINK\"]:\n            assert pkg[\"channel\"] == \"conda-forge\", pkg\n            assert (\n                pkg[\"base_url\"]\n                == \"https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge\"\n            ), pkg\n\n        # Ensure that other end points were never loaded\n\n\n@pytest.mark.skipif(not on_linux, reason=\"Only run on Linux\")\ndef test_jax_and_jaxlib():\n    \"https://github.com/conda/conda-libmamba-solver/issues/221\"\n    env = os.environ.copy()\n    env[\"CONDA_SUBDIR\"] = \"linux-64\"\n    for specs in ((\"jax\", \"jaxlib\"), (\"jaxlib\", \"jax\")):\n        process = conda_subprocess(\n            \"create\",\n            \"--name=unused\",\n            \"--solver=libmamba\",\n            \"--json\",\n            \"--dry-run\",\n            \"--override-channels\",\n            \"-c\",\n            \"defaults\",\n            f\"conda-forge::{specs[0]}\",\n            f\"conda-forge::{specs[1]}\",\n            explain=True,\n            env=env,\n        )\n        result = json.loads(process.stdout)\n        assert result[\"success\"] is True\n        pkgs = {pkg[\"name\"] for pkg in result[\"actions\"][\"LINK\"]}\n        assert specs[0] in pkgs\n        assert specs[1] in pkgs\n\n\ndef test_encoding_file_paths(tmp_path: Path):\n    tmp_channel = tmp_path / \"channel+some+encodable+bits\"\n    repo = Path(__file__).parent / \"data/mamba_repo\"\n    shutil.copytree(repo, tmp_channel)\n    process = conda_subprocess(\n        \"create\",\n        \"-p\",\n        tmp_path / \"env\",\n        \"-c\",\n        tmp_channel,\n        \"test-package\",\n        \"--solver=libmamba\",\n    )\n    print(process.stdout)\n    print(process.stderr, file=sys.stderr)\n    assert process.returncode == 0\n    assert list((tmp_path / \"env\" / \"conda-meta\").glob(\"test-package-*.json\"))\n\n\ndef test_conda_build_with_aliased_channels(tmp_path):\n    \"https://github.com/conda/conda-libmamba-solver/issues/363\"\n    condarc = Path.home() / \".condarc\"\n    condarc_contents = condarc.read_text() if condarc.is_file() else None\n    env = os.environ.copy()\n    if on_win:\n        env[\"CONDA_BLD_PATH\"] = str(Path(os.environ.get(\"RUNNER_TEMP\", tmp_path), \"bld\"))\n    else:\n        env[\"CONDA_BLD_PATH\"] = str(tmp_path / \"conda-bld\")\n    try:\n        _setup_conda_forge_as_defaults(Path.home(), force=True)\n        conda_subprocess(\n            \"build\",\n            DATA / \"conda_build_recipes\" / \"jedi\",\n            \"--override-channels\",\n            \"--channel=defaults\",\n            capture_output=False,\n            env=env,\n        )\n    finally:\n        if condarc_contents:\n            condarc.write_text(condarc_contents)\n        else:\n            condarc.unlink()\n\n\ndef test_http_server_auth_none(\n    http_server_auth_none: str,  # noqa: F811\n    conda_cli: CondaCLIFixture,\n    path_factory: PathFactoryFixture,\n):\n    conda_cli(\n        \"create\",\n        f\"--prefix={path_factory()}\",\n        \"--solver=libmamba\",\n        \"--json\",\n        \"--override-channels\",\n        f\"--channel={http_server_auth_none}\",\n        \"test-package\",\n    )\n\n\ndef test_http_server_auth_basic(\n    http_server_auth_basic,  # noqa: F811\n    conda_cli: CondaCLIFixture,\n    path_factory: PathFactoryFixture,\n):\n    conda_cli(\n        \"create\",\n        f\"--prefix={path_factory()}\",\n        \"--solver=libmamba\",\n        \"--json\",\n        \"--override-channels\",\n        f\"--channel={http_server_auth_basic}\",\n        \"test-package\",\n    )\n\n\n@pytest.mark.parametrize(\"shards\", [True, False], ids=(\"shard\", \"noshard\"))\ndef test_http_server_auth_basic_email(\n    http_server_auth_basic_email,  # noqa: F811\n    conda_cli: CondaCLIFixture,\n    path_factory: PathFactoryFixture,\n    shards: bool,\n    monkeypatch,\n):\n    monkeypatch.setenv(\"CONDA_PLUGINS_USE_SHARDED_REPODATA\", str(shards))\n    conda_cli(\n        \"create\",\n        f\"--prefix={path_factory()}\",\n        \"--solver=libmamba\",\n        \"--json\",\n        \"--override-channels\",\n        f\"--channel={http_server_auth_basic_email}\",\n        \"test-package\",\n    )\n\n\ndef test_http_server_auth_token(\n    http_server_auth_token,  # noqa: F811\n    conda_cli: CondaCLIFixture,\n    path_factory: PathFactoryFixture,\n):\n    conda_cli(\n        \"create\",\n        f\"--prefix={path_factory()}\",\n        \"--solver=libmamba\",\n        \"--json\",\n        \"--override-channels\",\n        f\"--channel={http_server_auth_token}\",\n        \"test-package\",\n    )\n\n\ndef test_http_server_auth_token_in_defaults(\n    http_server_auth_token,  # noqa: F811\n    path_factory: PathFactoryFixture,\n) -> None:\n    condarc = Path.home() / \".condarc\"\n    condarc_contents = condarc.read_text() if condarc.is_file() else None\n    try:\n        write_env_config(\n            Path.home(),\n            force=True,\n            channels=[\"defaults\"],\n            default_channels=[http_server_auth_token],\n        )\n        reset_context()\n        conda_subprocess(\"info\", capture_output=False)\n        conda_subprocess(\n            \"create\",\n            f\"--prefix={path_factory()}\",\n            \"--solver=libmamba\",\n            \"test-package\",\n        )\n    finally:\n        if condarc_contents:\n            condarc.write_text(condarc_contents)\n        else:\n            condarc.unlink()\n\n\ndef test_local_spec() -> None:\n    \"\"\"https://github.com/conda/conda-libmamba-solver/issues/398\"\"\"\n    env = os.environ.copy()\n    env[\"CONDA_BLD_PATH\"] = str(DATA / \"mamba_repo\")\n    process = conda_subprocess(\n        \"create\",\n        \"--dry-run\",\n        \"--solver=libmamba\",\n        \"--channel=local\",\n        \"test-package\",\n        env=env,\n    )\n    assert process.returncode == 0\n\n    process = conda_subprocess(\n        \"create\",\n        \"--dry-run\",\n        \"--solver=libmamba\",\n        \"local::test-package\",\n        env=env,\n    )\n    assert process.returncode == 0\n\n\ndef test_nameless_channel(\n    http_server_auth_none: str,  # noqa: F811\n    conda_cli: CondaCLIFixture,\n    tmp_path: Path,\n):\n    out, err, rc = conda_cli(\n        \"create\",\n        f\"--prefix={tmp_path}\",\n        \"--solver=libmamba\",\n        \"--yes\",\n        \"--override-channels\",\n        f\"--channel={http_server_auth_none}\",\n        \"test-package\",\n    )\n    print(out)\n    print(err, file=sys.stderr)\n    assert not rc\n    out, err, rc = conda_cli(\n        \"install\",\n        f\"--prefix={tmp_path}\",\n        \"--solver=libmamba\",\n        \"--yes\",\n        f\"--channel={http_server_auth_none}\",\n        \"zlib\",\n    )\n    print(out)\n    print(err, file=sys.stderr)\n    assert not rc\n\n\ndef test_unknown_channels_do_not_crash(tmp_env: TmpEnvFixture, conda_cli: CondaCLIFixture) -> None:\n    \"\"\"https://github.com/conda/conda-libmamba-solver/issues/418\"\"\"\n    DATA = Path(__file__).parent / \"data\"\n    test_pkg = DATA / \"mamba_repo\" / \"noarch\" / \"test-package-0.1-0.tar.bz2\"\n    with tmp_env(\"ca-certificates\") as prefix:\n        # copy pkg to a new non-channel-like location without repodata around to obtain\n        # '<unknown>' channel and reproduce the issue\n        temp_pkg = Path(prefix, \"test-package-0.1-0.tar.bz2\")\n        shutil.copy(test_pkg, temp_pkg)\n        conda_cli(\"install\", f\"--prefix={prefix}\", temp_pkg)\n        assert package_is_installed(prefix, \"test-package\")\n        conda_cli(\"install\", f\"--prefix={prefix}\", \"zlib\")\n        assert package_is_installed(prefix, \"zlib\")\n\n\n@pytest.mark.skipif(not on_linux, reason=\"Only run on Linux\")\ndef test_use_cache_works_offline_fresh_install_keep(tmp_path):\n    \"\"\"\n    https://github.com/conda/conda-libmamba-solver/issues/396\n\n    constructor installers have a `-k` switch (keep) to leave the\n    pkgs/ cache prepopulated. Offline updating from the cache should be a\n    harmless no-op, not a hard crash.\n    \"\"\"\n    miniforge_url = (\n        \"https://github.com/conda-forge/miniforge/releases/\"\n        f\"latest/download/Miniforge3-Linux-{os.uname().machine}.sh\"\n    )\n    urlretrieve(miniforge_url, tmp_path / \"miniforge.sh\")\n    # bkfp: batch, keep, force, prefix\n    check_call([\"bash\", str(tmp_path / \"miniforge.sh\"), \"-bkfp\", tmp_path / \"miniforge\"])\n    env = os.environ.copy()\n    env[\"CONDA_ROOT_PREFIX\"] = str(tmp_path / \"miniforge\")\n    env[\"CONDA_PKGS_DIRS\"] = str(tmp_path / \"miniforge\" / \"pkgs\")\n    env[\"CONDA_ENVS_DIRS\"] = str(tmp_path / \"miniforge\" / \"envs\")\n    env[\"HOME\"] = str(tmp_path)  # ignore ~/.condarc\n    args = (\n        \"update\",\n        \"-p\",\n        tmp_path / \"miniforge\",\n        \"--all\",\n        \"--dry-run\",\n        \"--override-channels\",\n        \"--channel=conda-forge\",\n    )\n    kwargs = {\"capture_output\": False, \"check\": True, \"env\": env}\n    conda_subprocess(*args, \"--offline\", **kwargs)\n    conda_subprocess(*args, \"--use-index-cache\", **kwargs)\n    conda_subprocess(*args, \"--offline\", \"--use-index-cache\", **kwargs)\n\n\ndef test_channels_are_percent_encoded(tmp_path):\n    channel = tmp_path / \"channel with spaces\"\n    noarch = channel / \"noarch\"\n    noarch.mkdir(parents=True, exist_ok=True)\n    (noarch / \"repodata.json\").write_text(\"{}\")\n\n    index = LibMambaIndexHelper(channels=[Channel(str(channel))])\n    assert index.repos\n    for repo in index.repos:\n        assert \"%20\" in repo.url_no_cred\n        assert \"%20\" in repo.url_w_cred\n\n    index = LibMambaIndexHelper(channels=[], pkgs_dirs=[str(channel)])\n    assert index.repos\n    for repo in index.repos:\n        assert \"%20\" in repo.url_no_cred\n        assert \"%20\" in repo.url_w_cred\n\n\ndef test_channel_ordering(\n    conda_cli: CondaCLIFixture, monkeypatch: pytest.MonkeyPatch, shard_factory: ShardFactory\n) -> None:\n    \"\"\"https://github.com/conda/conda-libmamba-solver/issues/824\"\"\"\n    # Setup two shard servers. server_one will have a small\n    # delay in the response to mimic a slower response.\n    server_one = shard_factory.http_server_shards(\n        \"channel-ordering-one\", finish_request_action=lambda: time.sleep(0.2)\n    )\n    server_two = shard_factory.http_server_shards(\"channel-ordering-two\")\n\n    monkeypatch.setenv(\"CONDA_CHANNELS\", server_two)\n    monkeypatch.setenv(\"CONDA_PLUGINS_USE_SHARDED_REPODATA\", \"1\")\n    out, err, rc = conda_cli(\n        \"create\",\n        \"--dry-run\",\n        \"--solver=libmamba\",\n        f\"--channel={server_one}\",\n        \"foo\",\n        \"--json\",\n        raises=DryRunExit,\n    )\n    data = json.loads(out)\n    assert data.get(\"success\") is True\n    for link_package in data[\"actions\"][\"LINK\"]:\n        if link_package[\"name\"] == \"foo\":\n            # Match the base url of the package to the server url. But clip\n            # the trailing slash from the server url.\n            assert link_package[\"base_url\"] == server_one[:-1]\n\n    # Ensure that the ordering is respected in the other direction as well.\n    monkeypatch.setenv(\"CONDA_CHANNELS\", server_one)\n    monkeypatch.setenv(\"CONDA_PLUGINS_USE_SHARDED_REPODATA\", \"1\")\n    out, err, rc = conda_cli(\n        \"create\",\n        \"--dry-run\",\n        \"--solver=libmamba\",\n        f\"--channel={server_two}\",\n        \"foo\",\n        \"--json\",\n        raises=DryRunExit,\n    )\n    data = json.loads(out)\n    assert data.get(\"success\") is True\n    for link_package in data[\"actions\"][\"LINK\"]:\n        if link_package[\"name\"] == \"foo\":\n            # Match the base url of the package to the server url. But clip\n            # the trailing slash from the server url.\n            assert link_package[\"base_url\"] == server_two[:-1]\n"
  },
  {
    "path": "tests/test_downstream.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\nimport os\nfrom pathlib import Path\nfrom subprocess import CalledProcessError, check_call\n\nimport pytest\nfrom conda.base.context import context\n\nDATA = Path(__file__).parent / \"data\"\n\n\n@pytest.mark.parametrize(\n    \"recipe\",\n    [\n        pytest.param(x, id=x.name)\n        for x in sorted((DATA / \"conda_build_recipes\").iterdir())\n        if (x / \"meta.yaml\").is_file()\n    ],\n)\ndef test_build_recipe(recipe):\n    \"\"\"\n    Adapted from\n    https://github.com/mamba-org/boa/blob/3213180564/tests/test_mambabuild.py#L6\n\n    See /tests/data/conda_build_recipes/LICENSE for more details\n    \"\"\"\n    expected_fail_recipes = [\"baddeps\"]\n    env = os.environ.copy()\n    env[\"CONDA_SOLVER\"] = \"libmamba\"\n    recipe_name = Path(recipe).name\n    if recipe_name in expected_fail_recipes:\n        with pytest.raises(CalledProcessError):\n            check_call([\"conda-build\", recipe], env=env)\n    else:\n        check_call([\"conda-build\", recipe], env=env)\n\n\ndef test_conda_lock(tmp_path):\n    conda_exe_path = \"Scripts/conda.exe\" if os.name == \"nt\" else \"bin/conda\"\n    check_call(\n        [\n            \"conda-lock\",\n            \"lock\",\n            \"--platform\",\n            context.subdir,\n            \"--file\",\n            DATA / \"lock_this_env.yml\",\n            \"--conda\",\n            Path(context.conda_prefix) / conda_exe_path,\n        ],\n        cwd=tmp_path,\n    )\n"
  },
  {
    "path": "tests/test_experimental.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nEnsure experimental features work accordingly.\n\"\"\"\n\nfrom __future__ import annotations\n\nimport sys\nfrom subprocess import run\nfrom typing import TYPE_CHECKING\n\nimport pytest\nfrom conda.base.context import context, fresh_context\nfrom conda.exceptions import CondaEnvironmentError\n\nif TYPE_CHECKING:\n    from conda.testing.fixtures import CondaCLIFixture\n    from pytest import MonkeyPatch\n\n\ndef print_and_check_output(*args, **kwargs):\n    kwargs.setdefault(\"capture_output\", True)\n    kwargs.setdefault(\"universal_newlines\", True)\n    process = run(*args, **kwargs)\n    print(\"stdout\", process.stdout, \"---\", \"stderr\", process.stderr, sep=\"\\n\")\n    process.check_returncode()\n    return process\n\n\n@pytest.mark.xfail(reason=\"base protections not enabled anymore\")\ndef test_protection_for_base_env(monkeypatch: MonkeyPatch, conda_cli: CondaCLIFixture) -> None:\n    with pytest.raises(CondaEnvironmentError), fresh_context(CONDA_SOLVER=\"libmamba\"):\n        monkeypatch.delenv(\"PYTEST_CURRENT_TEST\", raising=False)\n        conda_cli(\n            \"install\",\n            f\"--prefix={context.root_prefix}\",\n            \"--dry-run\",\n            \"scipy\",\n            \"--solver=libmamba\",\n        )\n\n\ndef test_cli_flag_in_help():\n    commands_with_flag = (\n        [\"install\"],\n        [\"update\"],\n        [\"remove\"],\n        [\"create\"],\n        [\"env\", \"create\"],\n        [\"env\", \"update\"],\n        [\"env\", \"remove\"],\n    )\n    for command in commands_with_flag:\n        process = print_and_check_output([sys.executable, \"-m\", \"conda\"] + command + [\"--help\"])\n        assert \"--solver\" in process.stdout\n\n    commands_without_flag = (\n        [\"config\"],\n        [\"list\"],\n        [\"info\"],\n        [\"run\"],\n        [\"env\", \"list\"],\n    )\n    for command in commands_without_flag:\n        process = print_and_check_output([sys.executable, \"-m\", \"conda\"] + command + [\"--help\"])\n        assert \"--solver\" not in process.stdout\n"
  },
  {
    "path": "tests/test_index.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\nfrom __future__ import annotations\n\nimport json\nimport shutil\nimport time\nfrom pathlib import Path\nfrom typing import TYPE_CHECKING\n\nimport pytest\nfrom conda.base.context import context, reset_context\nfrom conda.common.compat import on_win\nfrom conda.core.subdir_data import SubdirData\nfrom conda.gateways.logging import initialize_logging\nfrom conda.models.channel import Channel\n\nfrom conda_libmamba_solver.index import (\n    LibMambaIndexHelper,\n    _is_sharded_repodata_enabled,\n    _package_info_from_package_dict,\n)\nfrom conda_libmamba_solver.shards import ShardLike, spec_to_package_name\nfrom conda_libmamba_solver.state import SolverInputState\n\nfrom .test_shards import CONDA_FORGE_WITH_SHARDS\n\nif TYPE_CHECKING:\n    import os\n\n    from conda.testing.fixtures import CondaCLIFixture\n    from pytest_benchmark.plugin import BenchmarkFixture\n    from pytest_mock import MockerFixture\n\n\ninitialize_logging()\nDATA = Path(__file__).parent / \"data\"\n\n\ndef test_given_channels(monkeypatch: pytest.MonkeyPatch, tmp_path: os.PathLike):\n    monkeypatch.setenv(\"CONDA_PKGS_DIRS\", str(tmp_path))\n    reset_context()\n    libmamba_index = LibMambaIndexHelper.from_platform_aware_channel(\n        channel=Channel(\"conda-test/noarch\")\n    )\n    assert libmamba_index.db.repo_count() == 1\n\n    conda_index = SubdirData(Channel(\"conda-test/noarch\"))\n    conda_index.load()\n\n    assert libmamba_index.db.package_count() == len(tuple(conda_index.iter_records()))\n\n\n@pytest.mark.parametrize(\n    \"only_tar_bz2\",\n    (\n        pytest.param(\"1\", id=\"CONDA_USE_ONLY_TAR_BZ2=true\"),\n        pytest.param(\"\", id=\"CONDA_USE_ONLY_TAR_BZ2=false\"),\n    ),\n)\ndef test_defaults_use_only_tar_bz2(monkeypatch: pytest.MonkeyPatch, only_tar_bz2: bool):\n    \"\"\"\n    Defaults is particular in the sense that it offers both .tar.bz2 and .conda for LOTS\n    of packages. SubdirData ignores .tar.bz2 entries if they have a .conda counterpart.\n    So if we count all the packages in each implementation, libmamba's has way more.\n    To remain accurate, we test this with `use_only_tar_bz2`:\n        - When true, we only count .tar.bz2\n        - When false, we only count .conda\n    \"\"\"\n    monkeypatch.setenv(\"CONDA_USE_ONLY_TAR_BZ2\", only_tar_bz2)\n    reset_context()\n    libmamba_index = LibMambaIndexHelper(\n        channels=[Channel(\"defaults\")],\n        subdirs=(\"noarch\",),\n        installed_records=(),  # do not load installed\n        pkgs_dirs=(),  # do not load local cache as a channel\n    )\n    n_repos = 3 if on_win else 2\n    assert len(libmamba_index.repos) == n_repos\n\n    libmamba_dot_conda_total = libmamba_index.n_packages(\n        filter_=lambda pkg: pkg.package_url.endswith(\".conda\")\n    )\n    libmamba_tar_bz2_total = libmamba_index.n_packages(\n        filter_=lambda pkg: pkg.package_url.endswith(\".tar.bz2\")\n    )\n\n    conda_dot_conda_total = 0\n    conda_tar_bz2_total = 0\n    for channel_url in Channel(\"defaults/noarch\").urls(subdirs=(\"noarch\",)):\n        conda_index = SubdirData(Channel(channel_url))\n        conda_index.load()\n        for pkg in conda_index.iter_records():\n            if pkg[\"url\"].endswith(\".conda\"):\n                conda_dot_conda_total += 1\n            elif pkg[\"url\"].endswith(\".tar.bz2\"):\n                conda_tar_bz2_total += 1\n            else:\n                raise RuntimeError(f\"Unrecognized package URL: {pkg['url']}\")\n\n    if only_tar_bz2:\n        assert conda_tar_bz2_total == libmamba_tar_bz2_total\n        assert libmamba_dot_conda_total == conda_dot_conda_total == 0\n    else:\n        assert conda_dot_conda_total == libmamba_dot_conda_total\n        assert conda_tar_bz2_total == libmamba_tar_bz2_total\n\n\ndef test_reload_channels(tmp_path: Path):\n    (tmp_path / \"noarch\").mkdir(parents=True, exist_ok=True)\n    shutil.copy(DATA / \"mamba_repo\" / \"noarch\" / \"repodata.json\", tmp_path / \"noarch\")\n    initial_repodata = (tmp_path / \"noarch\" / \"repodata.json\").read_text()\n    index = LibMambaIndexHelper(channels=[Channel(str(tmp_path))])\n    initial_count = index.n_packages()\n    SubdirData._cache_.clear()\n\n    data = json.loads(initial_repodata)\n    package = data[\"packages\"][\"test-package-0.1-0.tar.bz2\"]\n    data[\"packages\"][\"test-package-copy-0.1-0.tar.bz2\"] = {**package, \"name\": \"test-package-copy\"}\n    modified_repodata = json.dumps(data)\n    (tmp_path / \"noarch\" / \"repodata.json\").write_text(modified_repodata)\n\n    assert initial_repodata != modified_repodata\n    # TODO: Remove this sleep after addressing\n    # https://github.com/conda/conda/issues/13783\n    time.sleep(1)\n    index.reload_channel(Channel(str(tmp_path)))\n    assert index.n_packages() == initial_count + 1\n\n\n@pytest.mark.parametrize(\n    \"load_type,requested\",\n    [\n        (\"shard\", (\"python\",)),\n        (\"shard\", (\"django\", \"celery\")),\n        (\"shard\", (\"vaex\",)),\n        (\"repodata\", (\"vaex\",)),\n        (\"main\", ()),\n    ],\n    ids=[\"shard-small\", \"shard-medium\", \"shard-large\", \"noshard\", \"main\"],\n)\ndef test_load_channel_repo_info_shards(\n    load_type: str,\n    requested: tuple[str, ...],\n    tmp_path: Path,\n    conda_cli: CondaCLIFixture,\n    monkeypatch: pytest.MonkeyPatch,\n    benchmark: BenchmarkFixture,\n):\n    \"\"\"\n    Benchmark shards/not-shards under different dependency tree sizes.\n    \"\"\"\n    load_channel = \"defaults\" if load_type == \"main\" else CONDA_FORGE_WITH_SHARDS\n\n    monkeypatch.setattr(context.plugins, \"use_sharded_repodata\", load_type == \"shard\")\n    assert _is_sharded_repodata_enabled() == (load_type == \"shard\")\n\n    in_state = SolverInputState(str(tmp_path / \"env\"), requested=requested)\n\n    subdir = context.subdir  # override to hunt bugs\n\n    def index():\n        return LibMambaIndexHelper(\n            # this is expanded to noarch, linux-64 for shards.\n            channels=[Channel(f\"{load_channel}/{subdir}\")],\n            subdirs=(\n                \"noarch\",\n                subdir,\n            ),\n            installed_records=(),  # do not load installed\n            pkgs_dirs=(),  # do not load local cache as a channel\n            in_state=in_state,\n        )\n\n    index_helper = benchmark.pedantic(index, rounds=1)\n\n    assert len(index_helper.repos) > 0\n\n\n@pytest.mark.parametrize(\n    \"add_pip\",\n    (\n        pytest.param(True, id=\"add_pip=True\"),\n        pytest.param(False, id=\"add_pip=False\"),\n    ),\n)\ndef test_add_pip_as_python_dependency_sharded(\n    monkeypatch: pytest.MonkeyPatch,\n    mocker: MockerFixture,\n    add_pip: bool,\n):\n    \"\"\"\n    Regression test for https://github.com/conda/conda-libmamba-solver/issues/918.\n    When sharded repodata is used, add_pip_as_python_dependency must be honored.\n    \"\"\"\n    monkeypatch.setenv(\"CONDA_ADD_PIP_AS_PYTHON_DEPENDENCY\", \"true\" if add_pip else \"false\")\n    reset_context()\n\n    # Verify the context was set correctly\n    assert context.add_pip_as_python_dependency == add_pip, (\n        f\"Context add_pip_as_python_dependency={context.add_pip_as_python_dependency}, \"\n        f\"expected {add_pip}\"\n    )\n\n    # Python interpreter packages are always platform-specific (never noarch).\n    # libmamba only injects pip when the package's platform is a real platform\n    # present in the db — so the test must use the current subdir, not \"noarch\".\n    subdir = context.subdir\n    shardlike = ShardLike(\n        {\n            \"info\": {\"subdir\": subdir, \"base_url\": \"\", \"shards_base_url\": \"\"},\n            \"packages\": {\n                \"python-3.10.0-h1234567_0.tar.bz2\": {\n                    \"name\": \"python\",\n                    \"version\": \"3.10.0\",\n                    \"build\": \"h1234567_0\",\n                    \"build_number\": 0,\n                    \"depends\": [],\n                }\n            },\n            \"packages.conda\": {},\n            \"repodata_version\": 2,\n        },\n        url=f\"https://shards.example.com/{subdir}/\",\n    )\n    shardlike.fetch_shard(\"python\")\n\n    in_state = SolverInputState(prefix=\"idontexist\", requested=(\"python\",))\n\n    mocker.patch(\n        \"conda_libmamba_solver.index._is_sharded_repodata_enabled\",\n        return_value=True,\n    )\n    mocker.patch(\n        \"conda_libmamba_solver.index.build_repodata_subset\",\n        return_value={f\"https://shards.example.com/{subdir}/\": shardlike},\n    )\n    index_helper = LibMambaIndexHelper(\n        channels=[Channel(\"https://shards.example.com\")],\n        subdirs=(subdir,),\n        installed_records=(),\n        pkgs_dirs=(),\n        in_state=in_state,\n    )\n\n    python_records = index_helper.search(\"python\")\n    assert python_records\n\n    # Verify the package was loaded correctly\n    python_rec = python_records[0]\n    assert python_rec.name == \"python\", f\"Expected python, got {python_rec.name}\"\n    # subdir will attach to channel, not record\n    pip_in_depends = any(\n        spec_to_package_name(dep) == \"pip\" for dep in (python_records[0].depends or [])\n    )\n    if add_pip:\n        assert pip_in_depends\n    else:\n        assert not pip_in_depends\n\n\ndef test_load_channels_order(shard_factory, mocker: MockerFixture):\n    # Setup two shard servers. server_one will have a small\n    # delay in the response to mimic a slower response.\n    server_one = shard_factory.http_server_shards(\n        \"one\", finish_request_action=lambda: time.sleep(0.2)\n    )\n    server_two = shard_factory.http_server_shards(\"two\")\n\n    channel_one = Channel.from_url(f\"{server_one}/noarch\")\n    channel_two = Channel.from_url(f\"{server_two}/noarch\")\n    index_args = {\n        \"channels\": [\n            channel_one,\n            channel_two,\n        ],\n        \"in_state\": SolverInputState(prefix=\"idontexist\"),\n    }\n\n    mocker.patch(\n        \"conda_libmamba_solver.index._is_sharded_repodata_enabled\",\n        return_value=True,\n    )\n    shard_enabled_index = LibMambaIndexHelper(**index_args)\n\n    # The expected output is that all of channel_one subdirs (noarch and current\n    # platform) are ordered higher than channel_two subdirs.\n    expected_output_channels = [\n        channel_one.canonical_name,\n        channel_one.canonical_name,\n        channel_two.canonical_name,\n        channel_two.canonical_name,\n    ]\n    assert [\n        repo.channel.canonical_name for repo in shard_enabled_index.repos\n    ] == expected_output_channels\n\n\ndef test_package_info_from_package_dict_add_pip_as_python_dependency():\n    \"\"\"\n    Test that _package_info_from_package_dict appends \"pip\" to dependencies\n    when add_pip_as_python_dependency=True for Python packages.\n    \"\"\"\n    # Test with Python 3.x package and add_pip_as_python_dependency=True\n    python_record = {\n        \"name\": \"python\",\n        \"version\": \"3.11.0\",\n        \"build\": \"h96f0305_0\",\n        \"build_number\": 0,\n        \"depends\": [\"libffi >=3.4,<4.0\"],\n        \"subdir\": \"osx-64\",\n    }\n\n    package_info = _package_info_from_package_dict(\n        python_record,\n        \"python-3.11.0-h96f0305_0.tar.bz2\",\n        url=\"https://conda.anaconda.com/pkgs/main/osx-64/python-3.11.0-h96f0305_0.tar.bz2\",\n        channel_id=\"pkgs/main\",\n        add_pip_as_python_dependency=True,\n    )\n\n    # pip should be appended to dependencies\n    assert \"pip\" in package_info.dependencies\n    assert \"libffi >=3.4,<4.0\" in package_info.dependencies\n    assert len(package_info.dependencies) == 2\n    assert package_info.name == \"python\"\n    assert package_info.version == \"3.11.0\"\n\n\ndef test_package_info_from_package_dict_add_pip_as_python_dependency_false():\n    \"\"\"\n    Test that _package_info_from_package_dict does NOT append \"pip\" when\n    add_pip_as_python_dependency=False.\n    \"\"\"\n    python_record = {\n        \"name\": \"python\",\n        \"version\": \"3.11.0\",\n        \"build\": \"h96f0305_0\",\n        \"build_number\": 0,\n        \"depends\": [\"libffi >=3.4,<4.0\"],\n        \"subdir\": \"osx-64\",\n    }\n\n    package_info = _package_info_from_package_dict(\n        python_record,\n        \"python-3.11.0-h96f0305_0.tar.bz2\",\n        url=\"https://conda.anaconda.com/pkgs/main/osx-64/python-3.11.0-h96f0305_0.tar.bz2\",\n        channel_id=\"pkgs/main\",\n        add_pip_as_python_dependency=False,\n    )\n\n    # pip should NOT be appended\n    assert \"pip\" not in package_info.dependencies\n    assert len(package_info.dependencies) == 1\n    assert list(package_info.dependencies) == [\"libffi >=3.4,<4.0\"]\n\n\ndef test_package_info_from_package_dict_add_pip_python2():\n    \"\"\"\n    Test that _package_info_from_package_dict appends \"pip\" for Python 2.x packages.\n    \"\"\"\n    python_record = {\n        \"name\": \"python\",\n        \"version\": \"2.7.18\",\n        \"build\": \"h9ed2024_0\",\n        \"build_number\": 0,\n        \"depends\": [],\n        \"subdir\": \"osx-64\",\n    }\n\n    package_info = _package_info_from_package_dict(\n        python_record,\n        \"python-2.7.18-h9ed2024_0.tar.bz2\",\n        url=\"https://conda.anaconda.com/pkgs/main/osx-64/python-2.7.18-h9ed2024_0.tar.bz2\",\n        channel_id=\"pkgs/main\",\n        add_pip_as_python_dependency=True,\n    )\n\n    # pip should be appended for Python 2.x as well\n    assert \"pip\" in package_info.dependencies\n    assert len(package_info.dependencies) == 1\n\n\ndef test_package_info_from_package_dict_add_pip_non_python_package():\n    \"\"\"\n    Test that _package_info_from_package_dict does NOT append \"pip\" for non-Python packages.\n    \"\"\"\n    record = {\n        \"name\": \"numpy\",\n        \"version\": \"1.24.0\",\n        \"build\": \"py311h5a7a992_0\",\n        \"build_number\": 0,\n        \"depends\": [\"python >=3.11\"],\n        \"subdir\": \"osx-64\",\n    }\n\n    package_info = _package_info_from_package_dict(\n        record,\n        \"numpy-1.24.0-py311h5a7a992_0.tar.bz2\",\n        url=\"https://conda.anaconda.com/pkgs/main/osx-64/numpy-1.24.0-py311h5a7a992_0.tar.bz2\",\n        channel_id=\"pkgs/main\",\n        add_pip_as_python_dependency=True,\n    )\n\n    # pip should NOT be appended for non-Python packages\n    assert \"pip\" not in package_info.dependencies\n    assert len(package_info.dependencies) == 1\n    assert list(package_info.dependencies) == [\"python >=3.11\"]\n\n\ndef test_package_info_from_package_dict_add_pip_invalid_version():\n    \"\"\"\n    Test that _package_info_from_package_dict does NOT append \"pip\" for Python packages\n    with versions that don't start with \"2.\" or \"3.\".\n    \"\"\"\n    record = {\n        \"name\": \"python\",\n        \"version\": \"1.0.0\",  # Invalid Python version\n        \"build\": \"h0000_0\",\n        \"build_number\": 0,\n        \"depends\": [],\n        \"subdir\": \"osx-64\",\n    }\n\n    package_info = _package_info_from_package_dict(\n        record,\n        \"python-1.0.0-h0000_0.tar.bz2\",\n        url=\"https://conda.anaconda.com/pkgs/main/osx-64/python-1.0.0-h0000_0.tar.bz2\",\n        channel_id=\"pkgs/main\",\n        add_pip_as_python_dependency=True,\n    )\n\n    # pip should NOT be appended for invalid Python versions\n    assert \"pip\" not in package_info.dependencies\n    assert len(package_info.dependencies) == 0\n"
  },
  {
    "path": "tests/test_performance.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nMeasure the speed and memory usage of the different backend solvers\n\"\"\"\n\nfrom __future__ import annotations\n\nfrom pathlib import Path\nfrom typing import TYPE_CHECKING\n\nimport pytest\nfrom conda.base.context import context\nfrom conda.exceptions import DryRunExit\n\nif TYPE_CHECKING:\n    from collections.abc import Iterable\n\n    from conda.testing.fixtures import CondaCLIFixture, TmpEnvFixture\n    from pytest import FixtureRequest\n\npytestmark = [\n    pytest.mark.slow,\n    pytest.mark.usefixtures(\"parametrized_solver_fixture\"),\n    pytest.mark.skip,\n]\n\nTEST_DATA_DIR = Path(__file__).parent / \"data\"\nPLATFORM = context.subdir\n\n\ndef _get_channels_from_lockfile(path: Path) -> tuple[str, ...]:\n    \"\"\"Parse `# channels: conda-forge,defaults` comments\"\"\"\n    for line in path.read_text().splitlines():\n        if line.startswith(\"# channels:\"):\n            return tuple(line.split(\":\")[1].strip().split(\",\"))\n    return ()\n\n\ndef _channels_as_args(channels: Iterable[str]) -> tuple[str, ...]:\n    if not channels:\n        return ()\n    return (\"--override-channels\", *(f\"--channel={channel}\" for channel in channels))\n\n\n@pytest.fixture(\n    scope=\"session\",\n    params=TEST_DATA_DIR.glob(\"*.lock\"),\n)\ndef prefix_and_channels(\n    request: FixtureRequest,\n    session_tmp_env: TmpEnvFixture,\n) -> Iterable[tuple[Path, tuple[str, ...]]]:\n    lockfile = Path(request.param)\n    lock_platform = lockfile.suffixes[-2]\n    if not lock_platform.endswith(PLATFORM):\n        pytest.skip(f\"Running platform {PLATFORM} does not match file platform {lock_platform}\")\n\n    with pytest.MonkeyPatch.context() as monkeypatch:\n        monkeypatch.setenv(\"CONDA_TEST_SAVE_TEMPS\", \"1\")\n\n        with session_tmp_env(\"--file\", lockfile) as prefix:\n            channels = _get_channels_from_lockfile(lockfile)\n            yield prefix, channels\n\n\ndef test_update_python(\n    prefix_and_channels: tuple[Path, tuple[str, ...]],\n    conda_cli: CondaCLIFixture,\n) -> None:\n    prefix, channels = prefix_and_channels\n    try:\n        conda_cli(\n            \"update\",\n            f\"--prefix={prefix}\",\n            \"--dry-run\",\n            *_channels_as_args(channels),\n            \"python\",\n        )\n    except DryRunExit:\n        assert True\n    else:\n        # this can happen if \"all requirements are satisfied\"\n        assert True\n\n\ndef test_install_python_update_deps(\n    prefix_and_channels: tuple[Path, tuple[str, ...]],\n    conda_cli: CondaCLIFixture,\n) -> None:\n    prefix, channels = prefix_and_channels\n    conda_cli(\n        \"install\",\n        f\"--prefix={prefix}\",\n        \"--dry-run\",\n        *_channels_as_args(channels),\n        \"python\",\n        \"--update-deps\",\n        raises=DryRunExit,\n    )\n\n\ndef test_update_all(\n    prefix_and_channels: tuple[Path, tuple[str, ...]],\n    conda_cli: CondaCLIFixture,\n) -> None:\n    prefix, channels = prefix_and_channels\n    conda_cli(\n        \"update\",\n        f\"--prefix={prefix}\",\n        \"--dry-run\",\n        *_channels_as_args(channels),\n        \"--all\",\n        raises=DryRunExit,\n    )\n\n\ndef test_install_vaex_from_conda_forge_and_defaults(conda_cli: CondaCLIFixture) -> None:\n    conda_cli(\n        \"create\",\n        \"--dry-run\",\n        *_channels_as_args([\"conda-forge\", \"defaults\"]),\n        \"python=3.9\",\n        \"vaex\",\n        raises=DryRunExit,\n    )\n"
  },
  {
    "path": "tests/test_plugin.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nEnsure configuration plugin functions as expected\n\"\"\"\n\nimport pytest\nfrom conda.auxlib.ish import dals\nfrom conda.base.context import context, reset_context\n\n\n@pytest.fixture(scope=\"function\", autouse=True)\ndef always_reset_context():\n    reset_context()\n\n\ndef test_enabled_sharded_repodata():\n    \"\"\"\n    Ensure that the setting `plugins.enable_sharded_repodata` exists and is set\n    to the correct default value.\n    \"\"\"\n    assert context.plugins.use_sharded_repodata  # type: ignore\n\n\ndef test_enabled_sharded_repodata_environment_variable(monkeypatch):\n    \"\"\"\n    Ensure that the sharded repodata flag can be controlled by its corresponding environment variable.\n    \"\"\"\n    monkeypatch.setenv(\"CONDA_PLUGINS_USE_SHARDED_REPODATA\", \"true\")\n    context.__init__()\n\n    assert context.plugins.use_sharded_repodata  # type: ignore\n\n\ndef test_enabled_sharded_repodata_condarc(tmp_path):\n    \"\"\"\n    Ensure that the sharded repodata flag can be controlled by a condarc file.\n    \"\"\"\n    condarc_file = tmp_path / \"conda.yml\"\n    with condarc_file.open(\"w\") as f:\n        condarc_yml = dals(\"\"\"\n            plugins:\n              use_sharded_repodata: true\n        \"\"\")\n        f.write(condarc_yml)\n\n    context.__init__(search_path=(str(condarc_file),))\n\n    assert context.plugins.use_sharded_repodata  # type: ignore\n"
  },
  {
    "path": "tests/test_repoquery.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\nimport json\n\nfrom conda.models.channel import Channel\n\nfrom conda_libmamba_solver.index import LibMambaIndexHelper\n\nfrom .utils import conda_subprocess, python_site_packages_path_support\n\n\ndef test_repoquery():\n    p = conda_subprocess(\"repoquery\", \"--help\")\n    assert \"whoneeds\" in p.stdout\n    assert \"depends\" in p.stdout\n    assert \"search\" in p.stdout\n\n    p = conda_subprocess(\"repoquery\", \"depends\", \"conda\", \"--json\")\n    print(p.stdout)\n    data = json.loads(p.stdout)\n    assert data[\"result\"][\"status\"] == \"OK\"\n    assert len(data[\"result\"][\"pkgs\"]) > 0\n    assert len([p for p in data[\"result\"][\"pkgs\"] if p[\"name\"] == \"python\"]) == 1\n\n\ndef test_query_search():\n    index = LibMambaIndexHelper(channels=[Channel(\"conda-forge\")])\n    for query in (\n        \"ca-certificates\",\n        \"ca-certificates =2022.9.24\",\n        \"ca-certificates >=2022.9.24\",\n        \"ca-certificates >2022.9.24\",\n        \"ca-certificates<2022.9.24,>2020\",\n        \"ca-certificates<=2022.9.24,>2020\",\n        \"ca-certificates !=2022.9.24,>2020\",\n        \"ca-certificates=*=*_0\",\n        # TODO: channel specs are accepted but they seem to be ignored by libmambapy.Query!\n        # \"defaults::ca-certificates\",\n        # \"defaults::ca-certificates=2022.9.24\",\n        # \"defaults::ca-certificates[version='>=2022.9.24']\",\n        # \"defaults::ca-certificates[build='*_0']\",\n    ):\n        results = index.search(query)\n        assert len(results) > 0, query\n\n    assert index.search(\"ca-certificates=*=*_0\") == index.search(\"ca-certificates[build='*_0']\")\n    assert index.search(\"ca-certificates >=2022.9.24\") == index.search(\n        \"ca-certificates[version='>=2022.9.24']\"\n    )\n\n\ndef test_query_search_includes_python_site_packages_path():\n    index = LibMambaIndexHelper(channels=[Channel(\"conda-forge\")], subdirs=(\"linux-64\", \"noarch\"))\n    results = index.search(\"python=3.13.2=h4724d56_1_cp313t\")\n    assert len(results) == 1\n    prec = results[0]\n    assert prec.name == \"python\"\n    assert prec.version == \"3.13.2\"\n    if python_site_packages_path_support:\n        assert prec.python_site_packages_path == \"lib/python3.13t/site-packages\"\n    else:\n        assert prec.python_site_packages_path is None\n"
  },
  {
    "path": "tests/test_shards.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nTest sharded repodata.\n\"\"\"\n\nfrom __future__ import annotations\n\nimport hashlib\nimport json\nimport logging\nimport os\nimport sqlite3\nimport tempfile\nimport threading\nimport time\nfrom contextlib import contextmanager\nfrom pathlib import Path\nfrom typing import TYPE_CHECKING, NamedTuple\n\nimport conda.gateways.repodata\nimport msgpack\nimport pytest\nimport zstandard\nfrom conda.base.context import context, reset_context\nfrom conda.core.subdir_data import SubdirData\nfrom conda.models.channel import Channel\nfrom requests import Request, Response\n\nfrom conda_libmamba_solver import shards, shards_cache, shards_subset\nfrom conda_libmamba_solver.index import (\n    LibMambaIndexHelper,\n    _is_sharded_repodata_enabled,\n)\nfrom conda_libmamba_solver.shards import (\n    ShardLike,\n    Shards,\n    _repodata_shards,\n    _safe_urljoin_with_slash,\n    _shards_connections,\n    batch_retrieve_from_cache,\n    fetch_channels,\n    fetch_shards_index,\n    shard_mentioned_packages,\n)\nfrom conda_libmamba_solver.shards_subset import (\n    RepodataSubset,\n)\nfrom tests import http_test_server\n\nif TYPE_CHECKING:\n    from collections.abc import Callable, Iterable, Iterator\n\n    from conda_libmamba_solver.shards_typing import ShardsIndexDict\n\nHERE = Path(__file__).parent\n\n# was conda-forge-sharded during testing\nCONDA_FORGE_WITH_SHARDS = \"conda-forge\"\n\nROOT_PACKAGES = [\n    \"__archspec\",\n    \"__conda\",\n    \"__osx\",\n    \"__unix\",\n    \"bzip2\",\n    \"ca-certificates\",\n    \"expat\",\n    \"icu\",\n    \"libexpat\",\n    \"libffi\",\n    \"liblzma\",\n    \"libmpdec\",\n    \"libsqlite\",\n    \"libzlib\",\n    \"ncurses\",\n    \"openssl\",\n    \"pip\",\n    \"python\",\n    \"python_abi\",\n    \"readline\",\n    \"tk\",\n    \"twine\",\n    \"tzdata\",\n    \"xz\",\n    \"zlib\",\n]\n\n\ndef package_names(shard: shards_cache.ShardDict):\n    \"\"\"\n    All package names mentioned in a shard (should be a single package name)\n    \"\"\"\n    return set(package[\"name\"] for package in shard[\"packages\"].values()) | set(\n        package[\"name\"] for package in shard[\"packages.conda\"].values()\n    )\n\n\ndef expand_channels(channels: list[Channel], subdirs: Iterable[str] | None = None):\n    \"\"\"\n    Expand channels list into a dict of subdir-aware channels, matching\n    LibMambaIndexHelper behavior.\n    \"\"\"\n    subdirs_ = list(context.subdirs) if subdirs is None else subdirs\n    channels_urls = LibMambaIndexHelper._channel_urls(subdirs_, channels)\n    channels_urls = LibMambaIndexHelper._encoded_urls_to_channels(channels_urls)\n    return channels_urls\n\n\n@contextmanager\ndef _timer(name: str, callback=None):\n    \"\"\"\n    Print measured time with name as part of message. Call\n    callback(nanoseconds_elapsed) if given.\n    \"\"\"\n    begin = time.monotonic_ns()\n    yield\n    end = time.monotonic_ns()\n    print(f\"{name} took {(end - begin) / 1e9:0.6f}s\")\n    if callback:\n        callback(end - begin)\n\n\n@pytest.fixture\ndef prepare_shards_test(monkeypatch: pytest.MonkeyPatch):\n    \"\"\"\n    Reset token to avoid being logged in. e.g. the testing channel doesn't understand them.\n    Enable shards.\n    \"\"\"\n    logging.basicConfig(level=logging.INFO)\n    for module in (shards, shards_cache, shards_subset):\n        module.log.setLevel(logging.DEBUG)\n\n    monkeypatch.setenv(\"CONDA_TOKEN\", \"\")\n    monkeypatch.setenv(\"CONDA_PLUGINS_USE_SHARDED_REPODATA\", \"1\")\n    reset_context()\n    assert _is_sharded_repodata_enabled()\n\n\n@pytest.fixture\ndef empty_shards_cache(tmp_path):\n    \"\"\"\n    Empty shards cache, with cleanup.\n    \"\"\"\n    with shards_cache.ShardCache(tmp_path) as cache:\n        yield cache\n        cache.remove_cache()\n\n\n# 'foo' and 'bar' have circular dependencies on each other; dependencies on\n# missing shards (which are not an error during traversal; the solver may or may\n# not complain if ran); and 'constrains' to exercise other parts of the code.\n\n# TODO may need to give these unique prefixes, version numbers ending in\n# '.tar.bz2', '.conda' to avoid confusing tar-vs-conda code. May need to create\n# a few more packages giving a richer dependency graph.\n\nFAKE_REPODATA = {\n    \"info\": {\"subdir\": \"noarch\", \"base_url\": \"\", \"shards_base_url\": \"\"},\n    \"packages\": {\n        \"foo.tar.bz2\": {\n            \"name\": \"foo\",\n            \"version\": \"1\",\n            \"build\": \"0_a\",\n            \"build_number\": 0,\n            \"depends\": [\"bar\", \"baz\"],\n        },\n        \"bar.tar.bz2\": {\n            \"name\": \"bar\",\n            \"version\": \"1\",\n            \"build\": \"0_a\",\n            \"build_number\": 0,\n            \"depends\": [\"foo\"],\n        },\n        \"no-matching-conda.tar.bz2\": {\n            \"name\": \"foo\",\n            \"version\": \"0.1\",\n            \"build\": \"0_a\",\n            \"build_number\": 0,\n        },\n    },\n    \"packages.conda\": {\n        \"foo.conda\": {\n            \"name\": \"foo\",\n            \"version\": \"1\",\n            \"build\": \"0_a\",\n            \"build_number\": 0,\n            \"depends\": [\"bar\", \"baz\"],\n            \"constrains\": [\"splat<3\"],\n            \"sha256\": hashlib.sha256().digest(),\n        },\n        \"bar.conda\": {\n            \"name\": \"bar\",\n            \"version\": \"1\",\n            \"build\": \"0_a\",\n            \"build_number\": 0,\n            \"depends\": [\"foo\"],\n            \"constrains\": [\"splat<3\"],\n            \"sha256\": hashlib.sha256().digest(),\n        },\n        \"no-matching-tar-bz2.conda\": {\n            \"name\": \"foo\",\n            \"version\": \"2\",\n            \"build\": \"0_a\",\n            \"build_number\": 0,\n            \"depends\": [\"quux\", \"warble\"],\n            \"constrains\": [\"splat<3\"],\n            \"sha256\": hashlib.sha256().digest(),\n        },\n    },\n    \"repodata_version\": 2,\n}\n\n\ndef ensure_hex_hash(repodata: dict):\n    \"\"\"\n    Convert every hash in a repodata to hex. Copy repodata.\n    \"\"\"\n    new_repodata = {**repodata}\n    for group in (\"packages\", \"packages.conda\"):\n        for name, record in repodata[group].items():\n            record = {**record}\n            new_repodata[group][name] = record\n            for hash_type in \"sha256\", \"md5\":\n                if hash_value := record.get(hash_type):\n                    if not isinstance(hash_value, str):\n                        record[hash_type] = bytes(hash_value).hex()\n    return new_repodata\n\n\ndef shard_for_name(repodata, name):\n    return {\n        group: {k: v for (k, v) in repodata[group].items() if v[\"name\"] == name}\n        for group in (\"packages\", \"packages.conda\")\n    }\n\n\nFAKE_SHARD = shard_for_name(FAKE_REPODATA, \"foo\")\nFAKE_SHARD_2 = shard_for_name(FAKE_REPODATA, \"bar\")\n\n\nclass ShardFactory:\n    \"\"\"\n    Create http server shards in a temporary directory. Use this\n    class in the context of tests to generate multiple shard servers\n    that can be cleaned up after use.\n\n    Example:\n\n    ```\n    # create shard factory with its root in a temporary directory\n    shard_factory = ShardFactory(tmp_path_factory.mktemp(\"sharded_repo\"))\n\n    # create an http server serving the testing data\n    url = shard_factory.http_server_shards(\"http_server_shards\")\n\n    # make a request to the server\n    subdir_data = SubdirData(Channel.from_url(f\"{url}/noarch\"))\n    found = fetch_shards_index(subdir_data)\n\n    # shutdown up all servers created by this factory\n    shard_factory.clean_up_http_servers()\n    ```\n    \"\"\"\n\n    def __init__(self, root: Path = tempfile.gettempdir()):\n        self.root = root\n        self._http_servers = []\n\n    def clean_up_http_servers(self):\n        \"\"\"Shutdown all the servers created by this factory.\"\"\"\n        for http in self._http_servers:\n            http.shutdown()\n        self._http_servers = []\n\n    def http_server_shards(\n        self, dir_name: str, finish_request_action: Callable | None = None\n    ) -> str:\n        \"\"\"Create a new http server serving shards from a temporary directory.\n\n        :param dir_name: The name of the directory to create the shards in.\n        :param finish_request_action: An optional callable to be called after each request is finished.\n        :return: The URL of the http server serving the shards.\n        \"\"\"\n        shards_repository = self.root / dir_name / \"sharded_repo\"\n        shards_repository.mkdir(parents=True)\n        noarch = shards_repository / \"noarch\"\n        noarch.mkdir()\n\n        foo_shard = zstandard.compress(msgpack.dumps(FAKE_SHARD))  # type: ignore\n        foo_shard_digest = hashlib.sha256(foo_shard).digest()\n        (noarch / f\"{foo_shard_digest.hex()}.msgpack.zst\").write_bytes(foo_shard)\n\n        bar_shard = zstandard.compress(msgpack.dumps(FAKE_SHARD_2))  # type: ignore\n        bar_shard_digest = hashlib.sha256(bar_shard).digest()\n        (noarch / f\"{bar_shard_digest.hex()}.msgpack.zst\").write_bytes(bar_shard)\n\n        malformed = {\"follows_schema\": False}\n        bad_schema = zstandard.compress(msgpack.dumps(malformed))  # type: ignore\n        malformed_digest = hashlib.sha256(bad_schema).digest()\n\n        (noarch / f\"{malformed_digest.hex()}.msgpack.zst\").write_bytes(bad_schema)\n        not_zstd = b\"not zstd\"\n        (noarch / f\"{hashlib.sha256(not_zstd).digest().hex()}.msgpack.zst\").write_bytes(not_zstd)\n        not_msgpack = zstandard.compress(b\"not msgpack\")\n        (noarch / f\"{hashlib.sha256(not_msgpack).digest().hex()}.msgpack.zst\").write_bytes(\n            not_msgpack\n        )\n        fake_shards: ShardsIndexDict = {\n            \"info\": {\"subdir\": \"noarch\", \"base_url\": \"\", \"shards_base_url\": \"\"},\n            \"version\": 1,\n            \"shards\": {\n                \"foo\": foo_shard_digest,\n                \"bar\": bar_shard_digest,\n                \"wrong_package_name\": foo_shard_digest,\n                \"fake_package\": b\"\",\n                \"malformed\": hashlib.sha256(bad_schema).digest(),\n                \"not_zstd\": hashlib.sha256(not_zstd).digest(),\n                \"not_msgpack\": hashlib.sha256(not_msgpack).digest(),\n            },\n        }\n        (shards_repository / \"noarch\" / \"repodata_shards.msgpack.zst\").write_bytes(\n            zstandard.compress(msgpack.dumps(fake_shards))  # type: ignore\n        )\n\n        http = http_test_server.run_test_server(\n            str(shards_repository), finish_request_action=finish_request_action\n        )\n        self._http_servers.append(http)\n\n        host, port = http.socket.getsockname()[:2]\n        url_host = f\"[{host}]\" if \":\" in host else host\n        return f\"http://{url_host}:{port}/\"\n\n\n@pytest.fixture(scope=\"session\")\ndef shard_factory(tmp_path_factory, request: pytest.FixtureRequest) -> ShardFactory:\n    \"\"\"\n    Use ShardFactory to manage creating and cleaning up shards for testing.\n\n    Example:\n\n    ```\n    def test_something(shard_factory: ShardFactory):\n        server_one = shard_factory.http_server_shards(\"one\")\n        server_two = shard_factory.http_server_shards(\"two\")\n        ...\n    ```\n    \"\"\"\n    shards_repository = tmp_path_factory.mktemp(\"sharded_repo\")\n    shard_factory = ShardFactory(shards_repository)\n\n    def close_servers():\n        shard_factory.clean_up_http_servers()\n\n    request.addfinalizer(close_servers)\n    return shard_factory\n\n\n@pytest.fixture(scope=\"session\")\ndef http_server_shards(tmp_path_factory) -> Iterable[str]:\n    \"\"\"\n    A shard repository with a difference.\n    \"\"\"\n    shard_factory = ShardFactory(tmp_path_factory.mktemp(\"sharded_repo\"))\n    url = shard_factory.http_server_shards(\"http_server_shards\")\n    yield url\n    shard_factory.clean_up_http_servers()\n\n\n@pytest.mark.parametrize(\"error_code\", [404, 405, 416, 511])\ndef test_fetch_shards_index_mark_unavailable(monkeypatch, tmp_path, error_code):\n    expect_should_check_shards = not (400 <= error_code < 500 and error_code != 416)\n\n    # Guarantee clean cache to avoid interference from previous tests\n    monkeypatch.setenv(\"CONDA_PKGS_DIRS\", str(tmp_path))\n    reset_context()\n\n    class MockSession:\n        proxies = None\n        get_count = 0\n\n        def __call__(self, *args):\n            return self\n\n        def get(self, url, *args, **kwargs):\n            self.get_count += 1\n            request = Request(\"GET\", url).prepare()\n            response = Response()\n            response.request = request\n            response.url = url\n            # due to fetch_shards_index going through conda_http_errors, only\n            # 404 may be converted to the RepodataUnavailable exception we are\n            # looking for:\n            response.status_code = error_code\n            return response\n\n    mock_session = MockSession()\n    monkeypatch.setattr(shards, \"get_session\", mock_session)\n\n    channel = Channel(\"http://localhost/mock/noarch\")\n    subdir_data = SubdirData(channel)\n\n    repo_cache = subdir_data.repo_cache\n    repo_cache.load_state()\n    assert repo_cache.state.should_check_format(\"shards\")\n\n    fetch_shards_index(subdir_data, None)\n\n    # load json directly due to issues with repo_cache API, also\n    # fetch_shards_index gets a different repo_cache instance:\n    repo_cache.state.update(json.loads(repo_cache.cache_path_state.read_text()))\n    assert repo_cache.state.should_check_format(\"shards\") == expect_should_check_shards\n    assert mock_session.get_count == 1\n\n    # assert that retry skips over shards without trying to GET\n    get_count = mock_session.get_count\n    second_try = fetch_shards_index(subdir_data, None)\n    assert second_try is None\n    assert mock_session.get_count == get_count + expect_should_check_shards\n\n\ndef test_fetch_shards_error(http_server_shards, empty_shards_cache):\n    channel = Channel.from_url(f\"{http_server_shards}/noarch\")\n    subdir_data = SubdirData(channel)\n    found = fetch_shards_index(subdir_data, empty_shards_cache)\n    assert found\n\n    not_found = fetch_shards_index(\n        SubdirData(Channel.from_url(f\"{http_server_shards}/linux-64\")), empty_shards_cache\n    )\n    assert not not_found\n\n    # cover \"unexpected package name in shard\" branch\n    found.visited.clear()\n    assert \"packages\" in found.fetch_shard(\"wrong_package_name\")\n\n    # one non-error shard\n    shard_a = found.fetch_shard(\"foo\")\n    shard_b = found.fetch_shard(\"foo\")\n    assert shard_a is shard_b\n    found.visited.clear()  # force sqlite3 cache usage\n    shard_c = found.fetch_shard(\"foo\")\n    assert shard_a is not shard_c\n    assert shard_a == shard_c\n\n    with pytest.raises(conda.gateways.repodata.RepodataIsEmpty):\n        found.fetch_shard(\"fake_package\")\n\n    # currently logs KeyError: 'packages', doesn't cache, returns decoded msgpack\n    malo = found.fetch_shard(\"malformed\")\n    assert malo == {\"follows_schema\": False}  # XXX should we return None or raise\n\n    with pytest.raises(zstandard.ZstdError):\n        found.fetch_shard(\"not_zstd\")\n\n    # unclear if all possible \"bad msgpack\" errors inherit from a common class\n    # besides ValueError\n    with pytest.raises(ValueError):\n        found.fetch_shard(\"not_msgpack\")\n\n\ndef test_shards_base_url():\n    \"\"\"\n    Test Shards() URL functions.\n    \"\"\"\n\n    def with_urls(url, base_url, shards_base_url):\n        # Shards() with different url's\n        return Shards(\n            {\n                \"info\": {\n                    \"subdir\": \"noarch\",\n                    \"base_url\": base_url,\n                    \"shards_base_url\": shards_base_url,\n                },\n                \"version\": 1,\n                \"shards\": {\"fake_package\": bytes.fromhex(\"abcd\")},\n            },\n            url,\n            None,  # type: ignore\n        )\n\n    shards = with_urls(\n        \"https://conda.anaconda.org/channel-name/noarch/\",\n        \"\",\n        \"https://shards.example.com/channel-name\",\n    )\n\n    assert (\n        shards.shard_url(\"fake_package\")\n        == \"https://shards.example.com/channel-name/abcd.msgpack.zst\"\n    )\n\n    shards = with_urls(shards.url, \"\", \"\")\n\n    assert (\n        shards.shard_url(\"fake_package\")\n        == \"https://conda.anaconda.org/channel-name/noarch/abcd.msgpack.zst\"\n    )\n\n    # where packages are stored\n    assert shards.base_url == \"https://conda.anaconda.org/channel-name/noarch/\"\n\n    # packages on a different domain than shards.url\n    shards = with_urls(\n        \"https://conda.anaconda.org/channel-name/noarch/\",\n        \"https://prefix.dev/conda-forge/noarch/\",\n        \"https://shards.example.com/channel-name\",\n    )\n\n    assert shards.base_url == \"https://prefix.dev/conda-forge/noarch/\"\n\n    # no-trailing-/ example from prefix.dev metadata\n\n    shards = with_urls(\n        \"https://prefix.dev/conda-forge/osx-arm64/repodata_shards.msgpack.zst\",\n        \"https://prefix.dev/conda-forge/osx-arm64\",\n        \"\",\n    )\n\n    # shards_base_url is url joined with shards_base_url, suitable for string concatenation\n    assert shards.shards_base_url == \"https://prefix.dev/conda-forge/osx-arm64/\"\n    assert (\n        shards.shard_url(\"fake_package\")\n        == \"https://prefix.dev/conda-forge/osx-arm64/abcd.msgpack.zst\"\n    )\n\n    # relative shards_base_url\n    shards = with_urls(\n        \"https://prefix.dev/conda-forge/osx-arm64/repodata_shards.msgpack.zst\",\n        \"https://prefix.dev/conda-forge/noarch/\",\n        \"./shards/\",\n    )\n    assert shards.shards_base_url == \"https://prefix.dev/conda-forge/osx-arm64/shards/\"\n\n    # relative shards_base_url, with parent directory\n    shards = with_urls(\n        \"https://prefix.dev/conda-forge/osx-arm64/repodata_shards.msgpack.zst\",\n        \"https://prefix.dev/conda-forge/noarch/\",\n        \"../shards/\",\n    )\n    shards.shards_index[\"info\"][\"shards_base_url\"] = \"../shards\"\n    assert shards.shards_base_url == \"https://prefix.dev/conda-forge/shards/\"\n\n    # s3 vs https\n    shards = with_urls(\n        \"s3://index-bucket/linux-64\",  # shards index stored on s3\n        \"s3://package-bucket/linux-64\",  # packages stored on different s3 bucket\n        \"https://example.org/shards/\",  # individual shards stored on https for some reason\n    )\n    assert shards.shard_url(\"fake_package\") == \"https://example.org/shards/abcd.msgpack.zst\"\n\n    # s3 and relative base_url\n    shards = with_urls(\n        \"s3://index-bucket/linux-64/repodata_shards.msgpack.zst\",  # shards index stored on s3\n        \"s3://package-bucket/linux-64\",  # packages stored on different s3 bucket\n        \"./shards/\",  # individual shards stored on https for some reason\n    )\n    assert shards.shard_url(\"fake_package\") == \"s3://index-bucket/linux-64/shards/abcd.msgpack.zst\"\n\n\ndef test_shard_mentioned_packages_2():\n    assert set(shard_mentioned_packages(FAKE_SHARD)) == set(\n        (\n            \"bar\",\n            \"baz\",\n            \"quux\",\n            # \"splat\", # omit constrains\n            \"warble\",\n        )\n    )\n\n    # check that the bytes hash was converted to hex\n    assert FAKE_SHARD[\"packages.conda\"][\"foo.conda\"][\"sha256\"] == hashlib.sha256().hexdigest()  # type: ignore\n\n\ndef test_fetch_shards_channels(prepare_shards_test: None):\n    \"\"\"\n    Test all channels fetch as Shards or ShardLike, depending on availability.\n    \"\"\"\n    channels = list(context.default_channels)\n    print(channels)\n\n    channels.append(Channel(CONDA_FORGE_WITH_SHARDS))\n\n    channel_data = fetch_channels(expand_channels(channels))\n\n    # at least one should be real shards, not repodata.json presented as shards.\n    assert any(isinstance(channel, Shards) for channel in channel_data.values())\n\n\ndef test_shards_cache(tmp_path: Path):\n    cache = shards_cache.ShardCache(tmp_path)\n\n    # test copy, context manager features\n    with cache.copy() as cache2:\n        assert cache2.conn is not cache.conn\n\n    fake_shard = {\"foo\": \"bar\"}\n    annotated_shard = shards_cache.AnnotatedRawShard(\n        \"https://foo\",\n        \"foo\",\n        zstandard.compress(msgpack.dumps(fake_shard)),  # type: ignore\n    )\n    cache.insert(annotated_shard)\n\n    data = cache.retrieve(annotated_shard.url)\n    assert data == fake_shard\n    assert data is not fake_shard\n\n    data2 = cache.retrieve(\"notfound\")\n    assert data2 is None\n\n    assert (tmp_path / shards_cache.SHARD_CACHE_NAME).exists()\n\n    cache.close()\n\n\ndef test_shards_cache_recovery(tmp_path: Path):\n    \"\"\"\n    Test that we can recover from a bad shards database.\n    \"\"\"\n    db_path = tmp_path / shards_cache.SHARD_CACHE_NAME\n    db_path.write_bytes(os.urandom(1024))\n\n    cache = shards_cache.ShardCache(tmp_path, create=False)\n    # sqlite3 won't complain until SQL is executed, but ShardCache() creates the\n    # schema if it doesn't exist:\n    with pytest.raises(sqlite3.DatabaseError):\n        cache.connect(retry=False)\n    cache.connect(retry=True)\n    assert cache.retrieve(\"notfound\") is None\n\n\ndef test_shards_cache_uses_wal(tmp_path: Path):\n    \"\"\"WAL journal mode is enabled on a fresh cache.\"\"\"\n    with shards_cache.ShardCache(tmp_path) as cache:\n        mode = cache.conn.execute(\"PRAGMA journal_mode\").fetchone()[0]\n    assert mode == \"wal\"\n\n\ndef test_shards_cache_concurrent_read_write(tmp_path: Path):\n    \"\"\"Concurrent readers and writers must not raise OperationalError (#924).\"\"\"\n    compressor = zstandard.ZstdCompressor(level=1)\n    errors: list[Exception] = []\n    stop = threading.Event()\n\n    def writer(base):\n        try:\n            with shards_cache.ShardCache(base, create=False) as cache_copy:\n                for i in range(200):\n                    if stop.is_set():\n                        break\n                    shard = shards_cache.AnnotatedRawShard(\n                        f\"https://shard{i}\",\n                        f\"pkg{i}\",\n                        compressor.compress(msgpack.dumps({f\"pkg{i}\": \"data\"})),\n                    )\n                    cache_copy.insert(shard)\n        except Exception as exc:\n            errors.append(exc)\n\n    def reader(base):\n        try:\n            with shards_cache.ShardCache(base, create=False) as cache_copy:\n                for i in range(200):\n                    if stop.is_set():\n                        break\n                    urls = [f\"https://shard{j}\" for j in range(i + 1)]\n                    cache_copy.retrieve_multiple(urls)\n        except Exception as exc:\n            errors.append(exc)\n\n    with shards_cache.ShardCache(tmp_path) as cache:\n        w = threading.Thread(target=writer, args=(cache.base,))\n        r = threading.Thread(target=reader, args=(cache.base,))\n        w.start()\n        r.start()\n        w.join(timeout=10)\n        r.join(timeout=10)\n        stop.set()\n\n    # No sqlite3.OperationalError from either thread\n    assert errors == []\n\n\nNUM_FAKE_SHARDS = 64\n\n\nclass MockCache(NamedTuple):\n    \"\"\"\n    Contain all the elements needed to be returned by the `mock_cache` fixture\n    \"\"\"\n\n    num_shards: int\n    shards: list[shards_cache.AnnotatedRawShard]\n    cache: shards_cache.ShardCache\n\n\n@pytest.fixture()\ndef mock_cache(tmp_path: Path) -> Iterator[MockCache]:\n    \"\"\"\n    Set up a mock shard cache that will be used by multiple benchmark tests.\n    \"\"\"\n    with shards_cache.ShardCache(tmp_path) as cache:\n        NUM_FAKE_SHARDS = 64\n        fake_shards = []\n\n        compressor = zstandard.ZstdCompressor(level=1)\n        for i in range(NUM_FAKE_SHARDS):\n            fake_shard = {f\"foo{i}\": \"bar\"}\n            annotated_shard = shards_cache.AnnotatedRawShard(\n                f\"https://foo{i}\",\n                f\"foo{i}\",\n                compressor.compress(msgpack.dumps(fake_shard)),  # type: ignore\n            )\n            cache.insert(annotated_shard)\n            fake_shards.append(annotated_shard)\n\n        yield MockCache(num_shards=NUM_FAKE_SHARDS, shards=fake_shards, cache=cache)\n\n\n@pytest.fixture\ndef shard_cache_with_data(\n    mock_cache: MockCache,\n) -> tuple[shards_cache.ShardCache, list[shards_cache.AnnotatedRawShard]]:\n    \"\"\"\n    ShardCache with some data already inserted.\n    \"\"\"\n    return mock_cache.cache, mock_cache.shards\n\n\ndef test_shard_cache_multiple(\n    tmp_path: Path,\n    shard_cache_with_data: tuple[shards_cache.ShardCache, list[shards_cache.AnnotatedRawShard]],\n):\n    \"\"\"\n    Test that retrieve_multiple() is equivalent to several retrieve() calls.\n    \"\"\"\n    cache, fake_shards = shard_cache_with_data\n\n    none_retrieved = cache.retrieve_multiple([])  # coverage\n    assert none_retrieved == {}\n\n    start_multiple = time.monotonic_ns()\n    retrieved = cache.retrieve_multiple([shard.url for shard in fake_shards])\n    end_multiple = time.monotonic_ns()\n\n    assert len(retrieved) == NUM_FAKE_SHARDS\n\n    print(\n        f\"retrieve {len(fake_shards)} shards in a single call: {(end_multiple - start_multiple) / 1e9:0.6f}s\"\n    )\n\n    start_single = time.monotonic_ns()\n    for i, url in enumerate([shard.url for shard in fake_shards]):\n        single = cache.retrieve(url)\n        assert retrieved[url] == single\n    end_single = time.monotonic_ns()\n    print(\n        f\"retrieve {len(fake_shards)} shards with multiple calls: {(end_single - start_single) / 1e9:0.6f}s\"\n    )\n\n    if (end_single - start_single) != 0:  # avoid ZeroDivisionError\n        print(\n            f\"Multiple API takes {(end_multiple - start_multiple) / (end_single - start_single):.2f} times as long.\"\n        )\n\n        assert (end_multiple - start_multiple) / (end_single - start_single) < 1, (\n            \"batch API took longer\"\n        )\n\n    assert (tmp_path / shards_cache.SHARD_CACHE_NAME).exists()\n\n\ndef test_shard_cache_clear_remove(tmp_path):\n    \"\"\"\n    Test clear, remove cache functions not otherwise used.\n    \"\"\"\n    cache = shards_cache.ShardCache(tmp_path)\n\n    cache.insert(shards_cache.AnnotatedRawShard(\"https://bar\", \"bar\", b\"bar\"))\n    assert len(list(cache.conn.execute(\"SELECT * FROM SHARDS\"))) == 1\n\n    cache.clear_cache()\n    assert list(cache.conn.execute(\"SELECT * FROM SHARDS\")) == []\n\n    assert (cache.base / shards_cache.SHARD_CACHE_NAME).exists()\n    cache.remove_cache()\n    assert not (cache.base / shards_cache.SHARD_CACHE_NAME).exists()\n\n    cache.close()\n\n\ndef test_shardlike():\n    \"\"\"\n    ShardLike class presents repodata.json as shards in a way that is suitable\n    for our subsetting algorithm.\n    \"\"\"\n    repodata = json.loads(\n        (Path(__file__).parent / \"data\" / \"mamba_repo\" / \"noarch\" / \"repodata.json\").read_text()\n    )\n\n    bad_repodata = repodata.copy()\n    bad_repodata[\"info\"] = {**bad_repodata[\"info\"], \"base_url\": 4}\n    with pytest.raises(TypeError):\n        ShardLike(bad_repodata)\n\n    # make fake packages\n    for n in range(10):\n        for m in range(n):  # 0 test0's\n            repodata[\"packages\"][f\"test{n}{m}.tar.bz2\"] = {\"name\": f\"test{n}\"}\n            repodata[\"packages.conda\"][f\"test{n}{m}.tar.bz2\"] = {\"name\": f\"test{n}\"}\n\n    as_shards = ShardLike(repodata)\n\n    assert len(as_shards.repodata_no_packages)\n    assert len(as_shards.shards)\n\n    assert sorted(as_shards.shards[\"test4\"][\"packages\"].keys()) == [\n        \"test40.tar.bz2\",\n        \"test41.tar.bz2\",\n        \"test42.tar.bz2\",\n        \"test43.tar.bz2\",\n    ]\n\n    fetched_shard = as_shards.fetch_shard(\"test1\")\n    assert fetched_shard[\"packages\"][\"test10.tar.bz2\"][\"name\"] == \"test1\"\n    assert as_shards.url in repr(as_shards)\n    assert \"test1\" in as_shards\n\n    fetched_shards = as_shards.fetch_shards((\"test1\", \"test2\"))\n    assert len(fetched_shards) == 2\n    assert fetched_shards[\"test1\"]\n    assert fetched_shards[\"test2\"]\n\n    as_shards.visited.update(fetched_shards)\n    as_shards.visited[\"package-that-does-not-exist\"] = None\n    repodata = as_shards.build_repodata()\n    assert len(repodata[\"packages\"]) == 3\n    assert len(repodata[\"packages.conda\"]) == 3\n\n\ndef test_shardlike_repr():\n    \"\"\"\n    Code coverage for ShardLike.__repr__()\n    \"\"\"\n    shardlike = ShardLike(\n        {\n            \"packages\": {},\n            \"packages.conda\": {},\n            \"info\": {\"base_url\": \"\", \"shards_base_url\": \"\", \"subdir\": \"noarch\"},\n            \"repodata_version\": 1,\n        },\n        \"https://conda.anaconda.org/\",\n    )\n    cls, url, *_ = repr(shardlike).split()\n    assert \"ShardLike\" in cls\n    assert shardlike.url == url\n\n\ndef test_shard_hash_as_array():\n    \"\"\"\n    Test that shard hashes can be bytes or list[int], for rattler compatibility.\n    \"\"\"\n    name = \"package\"\n    fake_shard: ShardsIndexDict = {\n        \"info\": {\"subdir\": \"noarch\", \"base_url\": \"\", \"shards_base_url\": \"\"},\n        \"repodata_version\": 1,\n        \"shards\": {\n            name: list(hashlib.sha256().digest()),  # type: ignore\n        },\n    }\n\n    fake_shard_2 = fake_shard.copy()\n    fake_shard_2[\"shards\"] = fake_shard[\"shards\"].copy()\n    fake_shard_2[\"shards\"][name] = hashlib.sha256().digest()\n\n    assert isinstance(fake_shard[\"shards\"][name], list)\n    assert isinstance(fake_shard_2[\"shards\"][name], bytes)\n\n    index = Shards(fake_shard, \"\", None)  # type: ignore\n    index_2 = Shards(fake_shard_2, \"\", None)  # type: ignore\n\n    shard_url = index.shard_url(name)\n    shard_url_2 = index_2.shard_url(name)\n    assert shard_url == shard_url_2\n\n\ndef test_shards_coverage():\n    \"\"\"\n    Call Shards() methods that are not otherwise called.\n    \"\"\"\n    shard = shards.Shards(\n        {\n            \"info\": {\"subdir\": \"noarch\", \"base_url\": \"\", \"shards_base_url\": \"./shards/\"},\n            \"version\": 1,\n            \"shards\": {},\n        },\n        \"https://example.org/noarch/repodata_shards.msgpack.zst\",\n    )  # type: ignore\n    with pytest.raises(KeyError):\n        # The visit_shard() method is used for ShardLike (from monolithic\n        # repodata) and makes a package part of the generated repodata. For\n        # Shards() (from sharded repodata), we assign directly to visited and\n        # don't wind up calling visit_shard().\n        shard.visit_package(\"package\")\n    shard.visited[\"package\"] = {}  # type: ignore[assign]\n    assert shard.visit_package(\"package\") == {}\n\n    assert shard.shards_cache is None\n    with pytest.raises(ValueError, match=\"shards_cache\"):\n        shard._process_fetch_result(None, None, None, None)\n\n\ndef test_ensure_hex_hash_in_record():\n    \"\"\"\n    Test that ensure_hex_hash_in_record() converts bytes to hex strings.\n    \"\"\"\n    name = \"package\"\n    sha256_hash = hashlib.sha256()\n    md5_hash = hashlib.md5()\n    for sha, md5 in [\n        (sha256_hash.digest(), md5_hash.digest()),\n        (list(sha256_hash.digest()), list(md5_hash.digest())),\n        (sha256_hash.hexdigest(), md5_hash.hexdigest()),\n    ]:\n        record = {\n            \"name\": name,\n            \"sha256\": sha,\n            \"md5\": md5,\n        }\n\n        updated = shards.ensure_hex_hash(record)  # type: ignore\n        assert isinstance(updated[\"sha256\"], str)  # type: ignore\n        assert updated[\"sha256\"] == sha256_hash.hexdigest()  # type: ignore\n        assert isinstance(updated[\"md5\"], str)  # type: ignore\n        assert updated[\"md5\"] == md5_hash.hexdigest()  # type: ignore\n\n\ndef test_batch_retrieve_from_cache(\n    prepare_shards_test: None, empty_shards_cache: shards_cache.ShardCache\n):\n    \"\"\"\n    Test single database query to fetch cached shard URLs in a batch.\n    \"\"\"\n    channels = [*context.default_channels, Channel(CONDA_FORGE_WITH_SHARDS)]\n    roots = ROOT_PACKAGES[:]\n\n    with _timer(\"repodata.json/shards index fetch\"):\n        channel_data = fetch_channels(expand_channels(channels))\n\n    with _timer(\"Shard fetch\"):\n        sharded = [channel for channel in channel_data.values() if isinstance(channel, Shards)]\n        for shard in sharded:\n            shard.shards_cache = empty_shards_cache\n        assert sharded, \"No sharded repodata found\"\n        remaining = batch_retrieve_from_cache(sharded, roots)\n        print(f\"{len(remaining)} shards to fetch from network\")\n\n    # execute \"no sharded channels\" branch\n    remaining = batch_retrieve_from_cache([], [\"python\"])\n    assert remaining == []\n\n\n@pytest.mark.benchmark\n@pytest.mark.parametrize(\"retrieval_type\", [\"retrieve_multiple\", \"retrieve_single\"])\ndef test_shard_cache_multiple_profile(retrieval_type, mock_cache: MockCache):\n    \"\"\"\n    Measure the difference between `shards_cache.retrieve_multiple` and `shards_cache.retrieve`.\n\n    `shards_cache.retrieve_multiple should be faster than `shards_cache.retrieve`.\n    \"\"\"\n    if retrieval_type == \"retrieve_multiple\":\n        retrieved = mock_cache.cache.retrieve_multiple([shard.url for shard in mock_cache.shards])\n        assert len(retrieved) == mock_cache.num_shards\n\n    elif retrieval_type == \"retrieve_single\":\n        retrieved = {}\n        for i, url in enumerate([shard.url for shard in mock_cache.shards]):\n            single = mock_cache.cache.retrieve(url)\n            retrieved[url] = single\n\n        assert len(retrieved) == mock_cache.num_shards\n\n\ndef test_shards_connections(monkeypatch):\n    \"\"\"\n    Test _shards_connections() and execute all its code.\n    \"\"\"\n    assert context.repodata_threads is None\n    assert _shards_connections() == 10  # requests' default\n\n    monkeypatch.setattr(shards, \"SHARDS_CONNECTIONS_DEFAULT\", 7)\n    assert _shards_connections() == 7\n\n    monkeypatch.setattr(context, \"_repodata_threads\", 4)\n    assert _shards_connections() == 4\n\n\ndef test_filter_packages_simple():\n    simple = {\n        \"packages\": {\"a.tar.bz2\": {}, \"b.tar.bz2\": {}},\n        \"packages.conda\": {\n            \"a.conda\": {},\n        },\n    }\n    trimmed = shards_subset.filter_redundant_packages(simple)  # type: ignore\n    assert trimmed[\"packages\"] == {\"b.tar.bz2\": {}}\n\n    assert shards_subset.filter_redundant_packages(simple, use_only_tar_bz2=True) is simple  # type: ignore\n\n\n# the function under test is not particularly slow but downloads large repodata\n# unnecessarily. Useful if remove_legacy_packages needs to be debugged.\n@pytest.mark.skip(reason=\"slow\")\n@pytest.mark.benchmark\n@pytest.mark.parametrize(\n    \"channel\", (\"conda-forge/linux-64\", \"https://repo.anaconda.com/pkgs/main/linux-64\")\n)\ndef test_filter_packages_repodata(channel, benchmark):\n    repodata, _ = SubdirData(Channel(channel)).repo_fetch.fetch_latest_parsed()\n    print(\n        f\"Original {channel} has {len(repodata['packages'])} .tar.bz2 packages and {len(repodata['packages.conda'])} .conda packages\"\n    )\n\n    repodata_trimmed = {}\n\n    def remove():\n        nonlocal repodata_trimmed\n        repodata_trimmed = shards_subset.filter_redundant_packages(repodata)  # type: ignore\n\n    benchmark(remove)\n\n    print(\n        f\"Trimmed {channel} has {len(repodata_trimmed['packages'])} .tar.bz2 packages and {len(repodata['packages.conda'])} .conda packages\"\n    )\n\n\ndef test_offline_mode_expired_cache(http_server_shards, monkeypatch, tmp_path):\n    \"\"\"\n    Test that expired cached shards are used when offline mode is enabled.\n    \"\"\"\n    # Guarantee clean cache to avoid interference from previous tests\n    monkeypatch.setenv(\"CONDA_PKGS_DIRS\", str(tmp_path))\n    reset_context()\n\n    channel = Channel.from_url(f\"{http_server_shards}/noarch\")\n    subdir_data = SubdirData(channel)\n\n    # Populate cache\n    found = fetch_shards_index(subdir_data, None)\n    assert found is not None\n\n    # Fetch a shard to populate the sqlite3 cache. Install shards cache, since found will have None cache.\n    with shards_subset._install_shards_cache([found]):\n        found.fetch_shard(\"foo\")\n\n    repo_cache = subdir_data.repo_fetch.repo_cache\n    assert repo_cache.cache_path_shards.exists()\n\n    # Make cache stale by setting refresh_ns to 1 day ago\n    cache_state = repo_cache.state\n    cache_state[\"refresh_ns\"] = time.time_ns() - (24 * 60 * 60 * 1_000_000_000)\n\n    # Persist stale timestamp\n    with repo_cache.lock(\"r+\") as state_file:\n        state_file.seek(0)\n        state_file.truncate()\n        state_dict = dict(cache_state)\n        json.dump(state_dict, state_file)\n\n    assert repo_cache.stale()\n\n    # Enable offline mode\n    monkeypatch.setattr(context, \"offline\", True)\n    reset_context()\n\n    found_offline = fetch_shards_index(subdir_data, None)\n    assert found_offline is not None\n\n    subset = RepodataSubset([found_offline])\n    subset.reachable_pipelined((\"foo\",))\n    repodata = found_offline.build_repodata()\n    assert len(repodata[\"packages\"]) + len(repodata[\"packages.conda\"]) > 0, \"no package records\"\n\n\ndef test_offline_mode_no_cache(http_server_shards, empty_shards_cache, monkeypatch, tmp_path):\n    \"\"\"\n    Test that offline mode falls back gracefully when no cache exists.\n\n    When offline and no cache exists, the system should fall back to non-sharded repodata\n    rather than failing.\n    \"\"\"\n    # Guarantee empty cache as to not interfere with other tests.\n    monkeypatch.setenv(\"CONDA_PKGS_DIRS\", str(tmp_path))\n    reset_context()\n\n    channel = Channel.from_url(f\"{http_server_shards}/noarch\")\n    subdir_data = SubdirData(channel)\n\n    # Remove cache if it exists\n    repo_cache = subdir_data.repo_fetch.repo_cache\n    assert not repo_cache.cache_path_shards.exists()\n\n    # Enable offline mode\n    monkeypatch.setattr(context, \"offline\", True)\n    reset_context()\n\n    # Try to fetch shards index in offline mode without cache\n    # Should return None (fallback to non-sharded repodata)\n    found = fetch_shards_index(subdir_data, empty_shards_cache)\n    assert found is None\n\n\ndef test_offline_mode_missing_shard_in_cache(\n    http_server_shards, empty_shards_cache, tmp_path, monkeypatch\n):\n    \"\"\"\n    Test that offline mode handles missing shards gracefully when the package\n    exists in the shard index but the shard is not cached.\n\n    When offline and a package is in the shard index but not in cache,\n    offline_nofetch_thread should return an empty shard rather than failing.\n    \"\"\"\n    # Guarantee empty cache; the other 'test_offline...' test can cause 'assert\n    # found is not None' to fail.\n    monkeypatch.setenv(\"CONDA_PKGS_DIRS\", str(tmp_path))\n    reset_context()\n\n    channel = Channel.from_url(f\"{http_server_shards}/noarch\")\n    subdir_data = SubdirData(channel)\n\n    # Fetch the shards index (so \"bar\" is in the index)\n    found = fetch_shards_index(subdir_data, empty_shards_cache)\n    assert found is not None\n    # Verify \"bar\" is in the index\n    assert \"bar\" in found\n\n    # Fetch \"foo\" shard to ensure cache exists, but don't fetch \"bar\"\n    found.fetch_shard(\"foo\")\n\n    # Verify \"bar\" shard is not in the cache\n    bar_shard_url = found.shard_url(\"bar\")\n    cache = shards_cache.ShardCache(Path(conda.gateways.repodata.create_cache_dir()))\n    assert cache.retrieve(bar_shard_url) is None, \"bar shard should not be in cache\"\n\n    # Enable offline mode\n    monkeypatch.setattr(context, \"offline\", True)\n    reset_context()\n\n    # Fetch shards index again in offline mode (should use cached index)\n    found_offline = fetch_shards_index(subdir_data, empty_shards_cache)\n    assert found_offline is not None\n\n    # Try to reach \"bar\" which is in index but not in cache\n    # In offline mode, this should return an empty shard gracefully\n    subset = RepodataSubset([found_offline])\n    subset.reachable_pipelined((\"bar\",))\n\n    # Build repodata - should complete without crashing\n    repodata = found_offline.build_repodata()\n    # The repodata may be empty since \"bar\" is not cached and returns empty shard\n    assert isinstance(repodata, dict)\n\n\ndef test_repodata_shards_sends_etag(monkeypatch, tmp_path):\n    \"\"\"\n    Test that repodata_shards(), normally only called by fetch_shards_index, can\n    send etag. (Our test web server doesn't use etag).\n    \"\"\"\n    # Guarantee clean cache to avoid interference from previous tests\n    monkeypatch.setenv(\"CONDA_PKGS_DIRS\", str(tmp_path))\n    reset_context()\n\n    class MockSession:\n        proxies = None\n        get_count = 0\n\n        def __call__(self, *args):\n            return self\n\n        def get(self, url, headers, **kwargs):\n            self.url = url\n            self.headers = headers\n            self.kwargs = kwargs\n            raise NotImplementedError()\n\n    mock_session = MockSession()\n    monkeypatch.setattr(shards, \"get_session\", mock_session)\n\n    channel = Channel(\"http://localhost/mock/noarch\")\n    subdir_data = SubdirData(channel)\n\n    repo_cache = subdir_data.repo_cache\n    repo_cache.load_state()\n    repo_cache.state[\"etag\"] = \"etag\"\n\n    with pytest.raises(NotImplementedError):\n        _repodata_shards(channel.url(), repo_cache)\n\n    assert mock_session.headers == {\"If-None-Match\": \"etag\"}\n\n\n@pytest.mark.parametrize(\n    \"base_url,relative_url,expected\",\n    [\n        # HTTP URLs - standard urljoin behavior\n        (\n            \"https://repo.anaconda.com/pkgs/main/linux-64\",\n            \"\",\n            \"https://repo.anaconda.com/pkgs/main/\",\n        ),\n        (\n            \"https://repo.anaconda.com/pkgs/main/linux-64\",\n            \"subdir\",\n            \"https://repo.anaconda.com/pkgs/main/\",\n        ),\n        # Realistic file URLs: in practice, base_url is a repodata file URL,\n        # and urljoin(url, \".\") strips the filename to get the directory.\n        (\n            \"https://repo.anaconda.com/pkgs/main/linux-64/repodata_shards.msgpack.zst\",\n            \"\",\n            \"https://repo.anaconda.com/pkgs/main/linux-64/\",\n        ),\n        (\n            \"s3://bucket-name/linux-64/repodata_shards.msgpack.zst\",\n            \"\",\n            \"s3://bucket-name/linux-64/\",\n        ),\n        (\n            \"s3://bucket-name/linux-64/repodata_shards.msgpack.zst\",\n            \".\",\n            \"s3://bucket-name/linux-64/\",\n        ),\n        (\n            \"file:///path/to/channel/linux-64/repodata_shards.msgpack.zst\",\n            \"\",\n            \"file:///path/to/channel/linux-64/\",\n        ),\n        (\n            \"ftp://ftp.example.com/pub/linux-64/repodata_shards.msgpack.zst\",\n            \"\",\n            \"ftp://ftp.example.com/pub/linux-64/\",\n        ),\n        # Trailing-slash directory URLs are preserved as-is for all schemes\n        (\"s3://bucket-name/linux-64/\", \"\", \"s3://bucket-name/linux-64/\"),\n        (\"file:///path/to/channel/linux-64/\", \"\", \"file:///path/to/channel/linux-64/\"),\n        # Non-HTTP without trailing slash: urljoin treats the last segment as a\n        # filename (consistent with HTTP behavior above)\n        (\"s3://bucket-name/linux-64\", \"\", \"s3://bucket-name/\"),\n        (\"s3://bucket-name/linux-64\", \".\", \"s3://bucket-name/\"),\n        (\"file:///path/to/channel/linux-64\", \"\", \"file:///path/to/channel/\"),\n        (\"ftp://ftp.example.com/pub/linux-64\", \"\", \"ftp://ftp.example.com/pub/\"),\n    ],\n)\ndef test_safe_urljoin_with_slash(base_url, relative_url, expected):\n    \"\"\"\n    Test _safe_urljoin_with_slash handles various URL schemes correctly.\n\n    urljoin only works for schemes in ``urllib.parse.uses_relative`` (http, https,\n    file, ftp, etc.). For unregistered schemes like s3://, it returns just ``\".\"``\n    instead of the resolved URL. This function handles those via scheme-swap.\n\n    All schemes should behave consistently: the last path segment without a\n    trailing slash is treated as a filename and stripped.\n\n    See: https://github.com/conda/conda-libmamba-solver/issues/866\n    \"\"\"\n    result = _safe_urljoin_with_slash(base_url, relative_url)\n    assert result == expected\n"
  },
  {
    "path": "tests/test_shards_subset.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\nfrom __future__ import annotations\n\nimport concurrent.futures\nimport json\nimport queue\nimport random\nimport threading\nimport time\nimport urllib.parse\nfrom contextlib import suppress\nfrom pathlib import Path\nfrom queue import Empty, SimpleQueue\nfrom typing import TYPE_CHECKING\nfrom unittest.mock import patch\n\nimport conda.gateways.repodata\nimport pytest\nimport pytest_codspeed\nfrom conda.base.context import context, reset_context\nfrom conda.common.compat import on_win\nfrom conda.core.subdir_data import SubdirData\nfrom conda.models.channel import Channel\nfrom requests.exceptions import HTTPError\n\nfrom conda_libmamba_solver import shards_cache, shards_subset\nfrom conda_libmamba_solver.index import _package_info_from_package_dict\nfrom conda_libmamba_solver.shards import (\n    ShardLike,\n    Shards,\n    fetch_channels,\n    fetch_shards_index,\n)\nfrom conda_libmamba_solver.shards_subset import (\n    NodeId,\n    RepodataSubset,\n    build_repodata_subset,\n    combine_batches_until_none,\n    exception_to_queue,\n)\nfrom tests.test_shards import (\n    FAKE_REPODATA,\n    ROOT_PACKAGES,\n    _timer,\n    ensure_hex_hash,\n    expand_channels,\n)\n\nfrom .test_shards import CONDA_FORGE_WITH_SHARDS\n\nif TYPE_CHECKING:\n    from collections.abc import Sequence\n\n    from conda.testing.fixtures import CondaCLIFixture\n    from pytest_benchmark.plugin import BenchmarkFixture\n\n    from conda_libmamba_solver.shards_typing import ShardDict\n\n\n# avoid underscores in names to parse them easily\nTESTING_SCENARIOS = [\n    {\n        \"name\": \"python\",\n        \"packages\": [\"python\"],\n        \"prefetch_packages\": [],\n        \"channel\": CONDA_FORGE_WITH_SHARDS,\n        \"platform\": \"linux-64\",\n    },\n    {\n        \"name\": \"data_science_ml\",\n        \"packages\": [\"scikit-learn\", \"matplotlib\"],\n        \"prefetch_packages\": [\"python\", \"numpy\"],\n        \"channel\": CONDA_FORGE_WITH_SHARDS,\n        \"platform\": \"linux-64\",\n    },\n    {\n        \"name\": \"web_development\",\n        \"packages\": [\"django\", \"celery\"],\n        \"prefetch_packages\": [\"python\", \"requests\"],\n        \"channel\": CONDA_FORGE_WITH_SHARDS,\n        \"platform\": \"linux-64\",\n    },\n    {\n        \"name\": \"scientific_computing\",\n        \"packages\": [\"scipy\", \"sympy\", \"pytorch\"],\n        \"prefetch_packages\": [\"python\", \"numpy\", \"pandas\"],\n        \"channel\": CONDA_FORGE_WITH_SHARDS,\n        \"platform\": \"linux-64\",\n    },\n    {\n        \"name\": \"devops_automation\",\n        \"packages\": [\"ansible\", \"pyyaml\", \"jinja2\"],\n        \"prefetch_packages\": [\"python\"],\n        \"channel\": CONDA_FORGE_WITH_SHARDS,\n        \"platform\": \"linux-64\",\n    },\n    {\n        \"name\": \"vaex\",\n        \"packages\": [\"vaex\"],\n        \"prefetch_packages\": [\"python\", \"numpy\", \"pandas\"],\n        \"channel\": CONDA_FORGE_WITH_SHARDS,\n        \"platform\": \"linux-64\",\n    },\n]\n\nif True:  # one fast, one slow-ish scenario for faster tests unless debugging.\n    TESTING_SCENARIOS = [\n        scenario\n        for scenario in TESTING_SCENARIOS\n        if scenario[\"name\"] in (\"python\", \"devops_automation\")\n    ]\n\n\ndef codspeed_supported():\n    \"\"\"\n    TODO: temporary measure to skip these tests if we do not have pytest-codspeed >=4\n    \"\"\"\n    try:\n        major, minor, bug = pytest_codspeed.__version__.split(\".\")\n        return int(major) >= 4\n    except (ValueError, AttributeError):\n        # If this fails, it means we want to skip this test\n        return False\n\n\ndef clean_cache(conda_cli: CondaCLIFixture):\n    \"\"\"\n    Clean cache and assert it completed without error except on Windows\n    \"\"\"\n    out, err, return_code = conda_cli(\"clean\", \"--yes\", \"--all\")\n\n    # Windows CI runners cannot reliably remove this file, so we don't care\n    # about this assertion on that platform.\n\n    # \"err\" will include log.debug output on certain test runners, so we can't\n    # check it to determine whether there was an error.\n    if not on_win:\n        assert not return_code, \"conda clean returned {return_code} != 0\"\n\n\ndef repodata_subset_size(channel_data):\n    \"\"\"\n    Measure the size of a repodata subset as serialized to JSON. Discard data.\n    \"\"\"\n    repodata_size = 0\n    for _, shardlike in channel_data.items():\n        repodata = shardlike.build_repodata()\n        repodata_text = json.dumps(\n            repodata, indent=0, separators=(\",\", \":\"), sort_keys=True, ensure_ascii=False\n        )\n        repodata_size += len(repodata_text.encode(\"utf-8\"))\n\n    return repodata_size\n\n\n@pytest.mark.skipif(not codspeed_supported(), reason=\"pytest-codspeed-version-4\")\n@pytest.mark.parametrize(\"cache_state\", (\"cold\", \"warm\"))\n@pytest.mark.parametrize(\"algorithm\", (\"bfs\", \"pipelined\"))\n@pytest.mark.parametrize(\n    \"scenario\",\n    TESTING_SCENARIOS,\n    ids=[scenario[\"name\"] for scenario in TESTING_SCENARIOS],\n)\ndef test_traversal_algorithm_benchmarks(\n    benchmark: BenchmarkFixture,\n    cache_state: str,\n    algorithm: str,\n    scenario: dict,\n):\n    \"\"\"\n    Benchmark multiple traversal algorithms for retrieving repodata shards with\n    a variety of parameter states (described below).\n\n    cache_state:\n        Either \"cold\" or \"warm\" representing shards available or not available in\n        SQLite, respectively.\n\n    algorithm:\n        Method used to fetch shards\n\n    scenario:\n        List of packages to use to create an environment\n    \"\"\"\n    cache = shards_cache.ShardCache(Path(conda.gateways.repodata.create_cache_dir()))\n    if cache_state == \"warm\":\n        # Clean shards cache just once for \"warm\"; leave index cache intact.\n        cache.remove_cache()\n\n    def setup():\n        if cache_state != \"warm\":\n            # For \"cold\", we want to clean shards cache before each round of benchmarking\n            cache.remove_cache()\n\n        channels = [Channel(f\"{scenario['channel']}/{scenario['platform']}\")]\n        channel_data = fetch_channels(expand_channels(channels))\n\n        assert channel_data is not None\n        assert len(channel_data) in (2, 4), \"Expected 2 or 4 channels fetched\"\n\n        subset = RepodataSubset((*channel_data.values(),))\n\n        return (subset,), {}\n\n    def target(subset: RepodataSubset):\n        with _timer(\"\"):\n            subset.reachable(scenario[\"packages\"], strategy=algorithm)\n\n    warmup_rounds = 1 if cache_state == \"warm\" else 0\n\n    benchmark.pedantic(target, setup=setup, rounds=1, warmup_rounds=warmup_rounds)\n\n\n@pytest.mark.parametrize(\n    \"scenario\",\n    TESTING_SCENARIOS,\n    ids=[scenario[\"name\"] for scenario in TESTING_SCENARIOS],\n)\ndef test_traversal_algorithms_match(conda_cli, scenario: dict):\n    \"\"\"\n    Ensure that all traversal algorithms return the same repodata subset.\n    \"\"\"\n    channel = Channel(f\"{scenario['channel']}/{scenario['platform']}\")\n    channels = expand_channels([channel])\n\n    repodata_algorithm_map = {\n        \"bfs\": build_repodata_subset(scenario[\"packages\"], channels, algorithm=\"bfs\"),\n        \"pipelined\": build_repodata_subset(scenario[\"packages\"], channels, algorithm=\"pipelined\"),\n    }\n\n    for subdir in repodata_algorithm_map[\"bfs\"].keys():\n        repodatas = []\n\n        for algorithm, repodata_subset in repodata_algorithm_map.items():\n            repodatas.append(repodata_subset[subdir].build_repodata())\n\n        assert all(x == y for x, y in zip(repodatas, repodatas[1:]))\n\n\n# region pipelined\n\n\n# try with big, and empty root_packages.\n@pytest.mark.parametrize(\n    \"root_packages\", [ROOT_PACKAGES[:] + [\"vaex\"], []], ids=[\"complex\", \"empty\"]\n)\ndef test_build_repodata_subset_pipelined(\n    prepare_shards_test: None, root_packages: list[str], tmp_path\n):\n    \"\"\"\n    Build repodata subset using a worker threads dependency traversal algorithm.\n    \"\"\"\n    channels = []\n    # channels.extend(context.default_channels)\n    channels.append(Channel(CONDA_FORGE_WITH_SHARDS))\n\n    with _timer(\"fetch_channels()\"):\n        channel_data = fetch_channels(expand_channels(channels))\n\n    def assert_quick(ns: int):\n        # Check that the 1 second queue timeout doesn't happen on an empty\n        # traversal.\n        if not root_packages:\n            assert (ns / 1e9) < 0.05, \"Empty shard traversal should be quick.\"\n\n    with _timer(\"RepodataSubset.reachable_pipelined()\", assert_quick):\n        subset = RepodataSubset((*channel_data.values(),))\n        subset.reachable_pipelined(root_packages)\n        print(f\"{len(subset.nodes)} (channel, package) nodes discovered\")\n\n    print(\"Channels:\", \",\".join(urllib.parse.urlparse(url).path[1:] for url in channel_data))\n\n\ndef test_shards_cache_thread(\n    shard_cache_with_data: tuple[shards_cache.ShardCache, list[shards_cache.AnnotatedRawShard]],\n):\n    \"\"\"\n    Test sqlite3 retrieval thread.\n    \"\"\"\n    cache, fake_shards = shard_cache_with_data\n    in_queue: SimpleQueue[list[NodeId] | None] = SimpleQueue()\n    shard_out_queue: SimpleQueue[list[tuple[NodeId, ShardDict]]] = SimpleQueue()\n    network_out_queue: SimpleQueue[list[NodeId]] = SimpleQueue()\n\n    # this kind of thread can crash, and we don't hear back without our own\n    # handling.\n    cache_thread = threading.Thread(\n        target=shards_subset.cache_fetch_thread,\n        args=(in_queue, shard_out_queue, network_out_queue, cache),\n        daemon=False,\n    )\n\n    fake_nodes = [NodeId(shard.package, channel=\"\", shard_url=shard.url) for shard in fake_shards]\n\n    # several batches, then None \"finish thread\" sentinel\n    in_queue.put(fake_nodes[:1])\n    in_queue.put([NodeId(\"notfound\", channel=\"\", shard_url=\"https://example.com/notfound\")])\n    in_queue.put(fake_nodes[1:3])\n    in_queue.put(\n        [\n            NodeId(\"notfound2\", channel=\"\", shard_url=\"https://example.com/notfound2\"),\n            NodeId(\"notfound3\", channel=\"\", shard_url=\"https://example.com/notfound3\"),\n        ]\n    )\n    in_queue.put(fake_nodes[3:])\n    in_queue.put(None)\n\n    cache_thread.start()\n\n    # combined into a single output batch\n    batch = shard_out_queue.get(timeout=1)\n    for node_id, shard in batch:\n        assert node_id in fake_nodes\n        assert shard == cache.retrieve(node_id.shard_url)\n\n    # no \"done\" sentinel in shard_out_queue\n    with pytest.raises(queue.Empty):\n        shard_out_queue.get_nowait()\n\n    while notfound := network_out_queue.get(timeout=1):\n        for node_id in notfound:\n            assert node_id.shard_url.startswith(\"https://example.com/notfound\")\n\n    cache_thread.join(5)\n\n\ndef test_shards_network_thread(http_server_shards, shard_cache_with_data):\n    \"\"\"\n    Test network retrieval thread, meant to be chained after the sqlite3 thread\n    by having network_in_queue = sqlite3 thread's network_out_queue.\n    \"\"\"\n    cache, fake_shards = shard_cache_with_data\n    channel = Channel.from_url(f\"{http_server_shards}/noarch\")\n    subdir_data = SubdirData(channel)\n    found = fetch_shards_index(subdir_data, None)\n    assert found\n\n    invalid_shardlike = ShardLike(\n        {},  # type: ignore\n        url=\"file:///non-network/shard/url\",\n    )\n\n    network_in_queue: SimpleQueue[list[NodeId] | None] = SimpleQueue()\n    shard_out_queue: SimpleQueue[list[tuple[NodeId, ShardDict]]] = SimpleQueue()\n\n    # this kind of thread can crash, and we don't hear back without our own\n    # handling.\n    network_thread = threading.Thread(\n        target=shards_subset.network_fetch_thread,\n        args=(network_in_queue, shard_out_queue, cache, [found, invalid_shardlike]),\n        daemon=False,\n    )\n\n    node_ids = [NodeId(package, found.url) for package in found.package_names]\n\n    # Only fetch \"foo\" and \"bar\" because these are valid shards\n    for node_id in node_ids:\n        if node_id.package in (\"foo\", \"bar\"):\n            network_in_queue.put([node_id])\n\n    network_thread.start()\n\n    with suppress(Empty):\n        while batch := shard_out_queue.get(timeout=1):\n            for url, shard in batch:\n                assert isinstance(shard, dict)\n\n                # Make sure this is either one of the two packages from above (\"foo\" or \"bar\")\n                assert set(shard.get(\"packages\", {}).keys()).intersection(\n                    (\"foo.tar.bz2\", \"bar.tar.bz2\")\n                )\n\n    # Worker produces TypeError if non-network NodeId is sent and one of the\n    # shardlikes has its url. (If no shardlike has NodeId's url, it produces\n    # KeyError).\n    network_in_queue.put([NodeId(\"nope\", invalid_shardlike.url)])\n    assert isinstance(shard_out_queue.get(timeout=1), TypeError)\n\n    # Terminate with sentinel\n    network_in_queue.put(None)\n\n    network_thread.join(5)\n\n\n# endregion\n\n\n@pytest.mark.parametrize(\"algorithm\", [\"bfs\", \"pipelined\"])\ndef test_build_repodata_subset_error_propagation(http_server_shards, algorithm, mocker, tmp_path):\n    \"\"\"\n    Ensure errors encountered during shard fetching are properly propagated.\n\n    This test uses http_server_shards to fetch the initial shards index,\n    then mocks the actual shard fetching to simulate network errors.\n    \"\"\"\n\n    # Use http_server_shards to set up the initial channel with shards index\n    channel = Channel.from_url(f\"{http_server_shards}/noarch\")\n    root_packages = [\"foo\"]\n\n    # Override cache dir location for tests; ensures it's empty\n    mocker.patch(\"conda.gateways.repodata.create_cache_dir\", return_value=str(tmp_path))\n\n    # Mock batch_retrieve_from_network to raise an error for bfs algorithm\n    if algorithm == \"bfs\":\n        with patch(\n            \"conda_libmamba_solver.shards_subset.batch_retrieve_from_network\"\n        ) as mock_batch:\n            # Simulate a network error when fetching shards\n            mock_batch.side_effect = HTTPError(\"Simulated network error\")\n\n            with pytest.raises(HTTPError, match=\"Simulated network error\"):\n                build_repodata_subset(\n                    root_packages, expand_channels([channel]), algorithm=algorithm\n                )\n\n    # For pipelined algorithm, mock the session.get to raise an error\n    elif algorithm == \"pipelined\":\n        # Patch at the module level before threads start\n        original_executor = shards_subset.ThreadPoolExecutor\n\n        def mock_executor(*args, **kwargs):\n            executor = original_executor(*args, **kwargs)\n            original_submit = executor.submit\n\n            def mock_submit(fn, *fn_args, **fn_kwargs):\n                if fn.__name__ == \"fetch\":\n                    raise HTTPError(\"Simulated network error during pipelined fetch\")\n                return original_submit(fn, *fn_args, **fn_kwargs)\n\n            executor.submit = mock_submit\n            return executor\n\n        with patch(\"conda_libmamba_solver.shards_subset.ThreadPoolExecutor\", mock_executor):\n            # The pipelined algorithm should propagate this error\n            with pytest.raises(HTTPError, match=\"Simulated network error during pipelined fetch\"):\n                build_repodata_subset(\n                    root_packages, expand_channels([channel]), algorithm=algorithm\n                )\n\n\n@pytest.mark.parametrize(\"algorithm\", [\"bfs\", \"pipelined\"])\ndef test_build_repodata_subset_package_not_found(http_server_shards, algorithm, tmp_path, mocker):\n    \"\"\"\n    Ensure packages that cannot be found result in empty repodata.\n\n    This test uses http_server_shards to fetch the initial shards index,\n    and then tests the code to make sure an empty repodata is produced at the end.\n    \"\"\"\n\n    # Use http_server_shards to set up the initial channel with shards index\n    channel = Channel.from_url(f\"{http_server_shards}/noarch\")\n    root_packages = [\"404-package-not-found\"]\n\n    # Override cache dir location for tests; ensures it's empty\n    mocker.patch(\"conda.gateways.repodata.create_cache_dir\", return_value=str(tmp_path))\n\n    channel_data = build_repodata_subset(\n        root_packages, expand_channels([channel]), algorithm=algorithm\n    )\n\n    for shardlike in channel_data.values():\n        assert not shardlike.build_repodata().get(\"packages\")\n\n\n@pytest.mark.parametrize(\"algorithm\", [\"bfs\", \"pipelined\"])\ndef test_build_repodata_subset_local_server(http_server_shards, algorithm, monkeypatch, tmp_path):\n    \"\"\"\n    Ensure we can fetch and build a valid repodata subset from our mock local server.\n    \"\"\"\n    # Guarantee clean cache to avoid interference from previous tests\n    monkeypatch.setenv(\"CONDA_PKGS_DIRS\", str(tmp_path))\n    reset_context()\n\n    channel = Channel.from_url(f\"{http_server_shards}/noarch\")\n    root_packages = [\"foo\"]\n\n    expected_repodata = ensure_hex_hash(FAKE_REPODATA)\n    expected_repodata = shards_subset.filter_redundant_packages(expected_repodata)  # type: ignore\n\n    channel_data = build_repodata_subset(\n        root_packages, {channel.url() or \"\": channel}, algorithm=algorithm\n    )\n\n    for shardlike in channel_data.values():\n        # expanded in fetch_channels() \"channel.urls(True, context.subdirs)\"\n        if \"/noarch/\" not in shardlike.url:\n            continue\n        actual_repodata = shardlike.build_repodata()\n\n        assert actual_repodata == expected_repodata, (\n            \"actual\",\n            actual_repodata,\n            \"expected\",\n            expected_repodata,\n        )\n\n\ndef test_build_repodata_subset_no_shards(http_server_shards):\n    \"\"\"\n    If no channel has repodata_shards.msgpack.zst, build_repodata_subset()\n    returns None.\n    \"\"\"\n    channels = expand_channels([Channel(http_server_shards + \"/notfound\")])\n    assert build_repodata_subset([], channels) is None\n\n\ndef test_build_repodata_subset(prepare_shards_test: None, tmp_path):\n    \"\"\"\n    Build repodata subset, convert it into libmamba objects, and compute the\n    size if the subset was serialized as repodata.json.\n    \"\"\"\n\n    # installed, plus what we want to add (twine)\n    root_packages = ROOT_PACKAGES[:]\n\n    channels = list(context.default_channels)\n    channels.append(Channel(CONDA_FORGE_WITH_SHARDS))\n    channel_dict = expand_channels(channels)\n\n    with _timer(\"build_repodata_subset()\"):\n        channel_data = build_repodata_subset(root_packages, channel_dict)\n\n    # convert to PackageInfo for libmamba, without temporary files\n    package_info = []\n    for channel, shardlike in channel_data.items():\n        repodata = shardlike.build_repodata()\n        # Don't like going back and forth between channel objects and URLs;\n        # build_repodata_subset() expands channels into per-subdir URLs as\n        # part of fetch:\n        channel_object = Channel(channel)\n        channel_id = str(channel_object)\n        for package_group in (\"packages\", \"packages.conda\"):\n            for filename, record in repodata.get(package_group, {}).items():\n                package_info.append(\n                    _package_info_from_package_dict(\n                        record,\n                        filename,\n                        url=shardlike.url,\n                        channel_id=channel_id,\n                    )\n                )\n\n    assert len(package_info), \"no packages in subset\"\n\n    print(f\"{len(package_info)} packages in subset\")\n\n    with _timer(\"write_repodata_subset()\"):\n        repodata_size = repodata_subset_size(channel_data)\n    print(f\"Repodata subset would be {repodata_size} bytes as json\")\n\n    # e.g. this for noarch and osx-arm64\n    # % curl https://conda.anaconda.org/conda-forge-sharded/noarch/repodata.json.zst | zstd -d | wc\n    full_repodata_benchmark = 138186556 + 142680224\n\n    print(\n        f\"Versus only noarch and osx-arm64 full repodata: {repodata_size / full_repodata_benchmark:.02f} times as large\"\n    )\n\n    print(\"Channels:\", \",\".join(urllib.parse.urlparse(url).path[1:] for url in channel_data))\n\n\n@pytest.mark.parametrize(\"only_tar_bz2\", (True, False))\n@pytest.mark.parametrize(\"strategy\", (\"pipelined\", \"bfs\"))\ndef test_only_tar_bz2(http_server_shards, tmp_path, only_tar_bz2, strategy):\n    \"\"\"\n    Ensure we avoid tar_bz2 in \"use .conda\" mode.\n\n    Should we exclude all .conda in \"only .tar.bz2\" mode? Can we drop this legacy mode?\n    \"\"\"\n    channel = Channel.from_url(f\"{http_server_shards}/noarch\")\n    root_packages = [\"foo\"]\n\n    channel_data = fetch_channels({channel.url() or \"\": channel})\n    subset = RepodataSubset((*channel_data.values(),))\n    subset._use_only_tar_bz2 = only_tar_bz2\n    subset.reachable(root_packages, strategy=strategy)\n\n    repodata = json.dumps(subset.shardlikes[0].build_repodata(), indent=True)\n\n    if only_tar_bz2:\n        assert len(subset.shardlikes[0].build_repodata()[\"packages\"]) > 0, repodata\n    else:\n        assert set(subset.shardlikes[0].build_repodata()[\"packages\"]) == {\n            \"no-matching-conda.tar.bz2\"\n        }, repodata\n\n\ndef test_pipelined_with_slow_queue_operations(http_server_shards, mocker, tmp_path):\n    \"\"\"\n    Test that simulates slow queue operations which can trigger race conditions\n    where the main thread might timeout waiting for results.\n    \"\"\"\n    channel = Channel.from_url(f\"{http_server_shards}/noarch\")\n    root_packages = [\"foo\"]\n\n    # Override cache dir location for tests\n    mocker.patch(\"conda.gateways.repodata.create_cache_dir\", return_value=str(tmp_path))\n\n    # Create a custom queue that adds delays\n    class SlowQueue(SimpleQueue):\n        def __init__(self, *args, **kwargs):\n            super().__init__(*args, **kwargs)\n            self.put_count = 0\n\n        def put(self, item, *args, **kwargs):\n            self.put_count += 1\n            # Add delay every few puts to simulate slow operations\n            if self.put_count % 3 == 0:\n                time.sleep(0.05)\n            return super().put(item, *args, **kwargs)\n\n    def slow_simple_queue_factory(*args, **kwargs):\n        # Only slow down shard_out_queue (not all queues)\n        return SlowQueue(*args, **kwargs)\n\n    mocker.patch(\"conda_libmamba_solver.shards_subset.SimpleQueue\", slow_simple_queue_factory)\n\n    # This should complete despite slow queue operations\n    channel_data = build_repodata_subset(\n        root_packages, expand_channels([channel]), algorithm=\"pipelined\"\n    )\n\n    # Verify results\n    found_packages = False\n    for shardlike in channel_data.values():\n        if \"/noarch/\" in shardlike.url and shardlike.build_repodata().get(\"packages\"):\n            found_packages = True\n    assert found_packages\n\n\ndef test_pipelined_shutdown_race_condition(http_server_shards, mocker, tmp_path):\n    \"\"\"\n    Test the specific race condition where the main thread checks pending/in_flight\n    and finds them empty, but worker threads are still processing items.\n    \"\"\"\n    channel = Channel.from_url(f\"{http_server_shards}/noarch\")\n    root_packages = [\"foo\"]\n\n    mocker.patch(\"conda.gateways.repodata.create_cache_dir\", return_value=str(tmp_path))\n\n    # Track when drain_pending is called\n    original_drain_pending = RepodataSubset.drain_pending\n    drain_count = {\"count\": 0}\n\n    def tracked_drain_pending(self, pending, shardlikes_by_url):\n        drain_count[\"count\"] += 1\n        result = original_drain_pending(self, pending, shardlikes_by_url)\n        # Add delay after drain to increase chance of race condition\n        if drain_count[\"count\"] > 1:\n            time.sleep(0.1)\n        return result\n\n    mocker.patch.object(RepodataSubset, \"drain_pending\", tracked_drain_pending)\n\n    # Run multiple times to increase chance of hitting race condition\n    for _ in range(10):\n        channel_data = build_repodata_subset(\n            root_packages, expand_channels([channel]), algorithm=\"pipelined\"\n        )\n\n        # Verify we got valid results\n        found_packages = False\n        for shardlike in channel_data.values():\n            if \"/noarch/\" in shardlike.url and shardlike.build_repodata().get(\"packages\"):\n                found_packages = True\n        assert found_packages\n\n\ndef test_pipelined_timeout(http_server_shards, monkeypatch, tmp_path):\n    \"\"\"\n    Test that pipelined times out if a URL is never fetched.\n    \"\"\"\n    # Guarantee clean cache to avoid interference from previous tests\n    monkeypatch.setenv(\"CONDA_PKGS_DIRS\", str(tmp_path))\n    monkeypatch.setenv(\"CONDA_REMOTE_READ_TIMEOUT_SECS\", \"1\")\n    monkeypatch.setenv(\"CONDA_REMOTE_MAX_RETRIES\", \"0\")\n    reset_context()\n\n    channel = Channel.from_url(f\"{http_server_shards}/noarch/\")\n    root_packages = [\"foo\"]\n\n    # fetch_channels() will expand noarch/ to include context.subdirs, but we only want a single subdir here.\n    # shardlikes = fetch_channels([channel])\n\n    channel = Channel.from_url(f\"{http_server_shards}/noarch\")\n    subdir_data = SubdirData(channel)\n    shardlikes = [fetch_shards_index(subdir_data, None)]\n\n    queue = SimpleQueue()\n\n    # a slow and ineffective get()\n    monkeypatch.setattr(\n        \"conda.gateways.connection.session.CondaSession.get\", lambda *args, **kwargs: queue.get()\n    )\n\n    # faster failure\n    monkeypatch.setattr(\"conda_libmamba_solver.shards_subset.REACHABLE_PIPELINED_MAX_TIMEOUTS\", 1)\n    monkeypatch.setattr(\"conda_libmamba_solver.shards_subset.THREAD_WAIT_TIMEOUT\", 0)\n\n    assert len(shardlikes) == 1, \"test expects a single channel\"\n    assert all(isinstance(shardlike, Shards) for shardlike in shardlikes), (\n        \"test expects real sharded channel\"\n    )\n    subset = RepodataSubset(shardlikes)\n    with pytest.raises(TimeoutError, match=\"shard\"):\n        subset.reachable_pipelined(root_packages)\n\n    queue.put(None)\n\n\ndef test_combine_batches_blocking_scenario():\n    \"\"\"\n    Test the scenario where combine_batches_until_none would block indefinitely\n    without the timeout fix.\n\n    This simulates the case where:\n    1. Producer sends a few items\n    2. Producer crashes or stops sending before sending None\n    3. Consumer blocks forever waiting for more items\n    \"\"\"\n    test_queue: SimpleQueue[Sequence[NodeId] | None] = SimpleQueue()\n\n    # Put some items in the queue\n    test_queue.put([NodeId(\"package1\", \"channel1\")])\n    test_queue.put([NodeId(\"package2\", \"channel2\")])\n\n    # Simulate producer failure - don't send None sentinel\n    # Without timeout fix, this would block forever\n\n    received = []\n    timeout_occurred = False\n\n    def consumer():\n        nonlocal timeout_occurred\n        try:\n            for batch in combine_batches_until_none(test_queue):\n                received.extend(batch)\n                # After processing existing items, iterator should timeout\n                # rather than block forever\n        except Exception:\n            timeout_occurred = True\n\n    consumer_thread = threading.Thread(target=consumer, daemon=True)\n    consumer_thread.start()\n\n    # Wait for consumer to process existing items\n    consumer_thread.join(timeout=2)\n\n    # With the timeout fix, the thread should still be alive (waiting)\n    # but not blocking indefinitely - it will timeout periodically\n    # Let's verify it processed the items we sent\n    assert len(received) == 2\n    assert any(node.package == \"package1\" for node in received)\n\n\n@pytest.mark.integration\ndef test_pipelined_extreme_race_conditions(\n    prepare_shards_test,\n    http_server_shards,\n    mocker,\n    tmp_path,\n):\n    \"\"\"\n    Introduce random delays in Queue operations to look for race conditions.\n\n    This test:\n    - Adds random delays at multiple points\n    - Runs many iterations\n    - Uses smaller timeouts\n    - Simulates thread scheduling variability\n    \"\"\"\n    channel = Channel(\"conda-forge-sharded/linux-64\")\n    root_packages = [\"python\", \"vaex\"]\n\n    mocker.patch(\"conda.gateways.repodata.create_cache_dir\", return_value=str(tmp_path))\n\n    # Create a chaotic queue class that adds random delays\n    class ChaoticQueue(SimpleQueue):\n        def get(self, block=True, timeout=None):\n            # Random delay before get\n            if random.random() < 0.3:  # 30% chance\n                time.sleep(random.uniform(0.001, 0.02))\n            return super().get(block=block, timeout=timeout)\n\n        def put(self, item, block=True, timeout=None):\n            # Random delay before put\n            if random.random() < 0.3:  # 30% chance\n                time.sleep(random.uniform(0.001, 0.02))\n            return super().put(item, block=block, timeout=timeout)\n\n    # Patch at module level\n    mocker.patch(\"conda_libmamba_solver.shards_subset.SimpleQueue\", ChaoticQueue)\n\n    # Run multiple iterations to increase chance of hitting race condition\n    failures = []\n    for iteration in range(20):\n        try:\n            channel_data = build_repodata_subset(\n                root_packages, expand_channels([channel]), algorithm=\"pipelined\"\n            )\n\n            # Verify we got results\n            found = any(\n                \"/noarch/\" in s.url and s.build_repodata().get(\"packages\")\n                for s in channel_data.values()\n            )\n            assert found, f\"Iteration {iteration}: No packages found\"\n        except Exception as e:\n            failures.append((iteration, str(e)))\n\n    # With our fixes, there should be no failures\n    assert not failures, f\"Failed on iterations: {failures}\"\n\n\n@pytest.mark.parametrize(\"num_threads\", [1, 2, 5])\ndef test_pipelined_concurrent_stress(http_server_shards, mocker, tmp_path, num_threads):\n    \"\"\"\n    Run pipelined algorithm from multiple threads concurrently. This can expose\n    race conditions in shared state or thread coordination.\n\n    (Actually the concurrency issues happen in fetch_channels() which deals with\n    reading, writing repodata_shards.msgpack.zst to disk.)\n    \"\"\"\n    channel = Channel.from_url(f\"{http_server_shards}/noarch\")\n    root_packages = [\"foo\"]\n\n    mocker.patch(\"conda.gateways.repodata.create_cache_dir\", return_value=str(tmp_path))\n\n    errors = []\n\n    def run_subset():\n        try:\n            channel_data = build_repodata_subset(\n                root_packages, expand_channels([channel]), algorithm=\"pipelined\"\n            )\n            # Verify results\n            for shardlike in channel_data.values():\n                if \"/noarch/\" in shardlike.url:\n                    packages = shardlike.build_repodata().get(\"packages\", {})\n                    if packages:\n                        return True\n            return False\n        except Exception as e:\n            errors.append(e)\n            raise\n\n    # Run multiple instances concurrently\n    with concurrent.futures.ThreadPoolExecutor(max_workers=num_threads) as executor:\n        futures = [executor.submit(run_subset) for _ in range(num_threads)]\n        results = [f.result(timeout=30) for f in futures]\n\n    assert not errors, f\"Errors occurred: {errors}\"\n    assert all(results), \"Some runs didn't find packages\"\n\n\ndef test_worker_thread_exception_propagation():\n    \"\"\"\n    Test that exceptions in worker threads are properly propagated to main thread.\n    Without proper exception handling, the main thread could timeout waiting for\n    results that will never arrive.\n    \"\"\"\n    in_queue = SimpleQueue()\n    out_queue = SimpleQueue()\n\n    @exception_to_queue\n    def failing_worker(in_q, out_q):\n        # Process one item successfully\n        item = in_q.get()\n        out_q.put(f\"processed: {item}\")\n\n        # Then raise an exception\n        raise ValueError(\"Simulated worker failure\")\n\n    # Put test data\n    in_queue.put(\"test_item\")\n\n    # Run worker in thread\n    worker = threading.Thread(target=failing_worker, args=(in_queue, out_queue), daemon=True)\n    worker.start()\n\n    # Should get the successful result first\n    result = out_queue.get(timeout=1)\n    assert result == \"processed: test_item\"\n\n    # Should get the exception propagated\n    exception = out_queue.get(timeout=1)\n    assert isinstance(exception, ValueError)\n    assert \"Simulated worker failure\" in str(exception)\n\n    # Worker should also send None to in_queue to signal termination\n    sentinel = in_queue.get(timeout=1)\n    assert sentinel is None\n\n\ndef test_shutdown_with_pending_work(http_server_shards, mocker, tmp_path):\n    \"\"\"\n    Test the race condition where main thread initiates shutdown while\n    worker threads still have work in their queues.\n    \"\"\"\n    channel = Channel.from_url(f\"{http_server_shards}/noarch\")\n    root_packages = [\"foo\"]\n\n    mocker.patch(\"conda.gateways.repodata.create_cache_dir\", return_value=str(tmp_path))\n\n    # Track shutdown events\n    shutdown_events = []\n\n    class TrackShutdownQueue(SimpleQueue):\n        def put(self, item, *args, **kwargs):\n            if item is None:\n                shutdown_events.append(\n                    {\n                        \"time\": time.time(),\n                        \"thread\": threading.current_thread().name,\n                    }\n                )\n            return super().put(item, *args, **kwargs)\n\n    # Patch at module level\n    mocker.patch(\"conda_libmamba_solver.shards_subset.SimpleQueue\", TrackShutdownQueue)\n\n    # Run the algorithm\n    channel_data = build_repodata_subset(\n        root_packages, expand_channels([channel]), algorithm=\"pipelined\"\n    )\n\n    # Verify we got results\n    found = any(\n        \"/noarch/\" in s.url and s.build_repodata().get(\"packages\") for s in channel_data.values()\n    )\n    assert found\n\n    # Verify shutdown was initiated (None was sent to queues)\n    assert len(shutdown_events) > 0, \"Shutdown was never initiated\"\n\n\ndef test_repodata_subset_misc():\n    \"\"\"\n    Test utility functions on RepodataSubset.\n    \"\"\"\n    assert tuple(\n        RepodataSubset.has_strategy(strategy) for strategy in (\"bfs\", \"pipelined\", \"squirrel\")\n    ) == (True, True, False)\n"
  },
  {
    "path": "tests/test_solver.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\nfrom __future__ import annotations\n\nimport json\nimport os\nimport re\nimport sys\nfrom itertools import chain, permutations, repeat\nfrom pathlib import Path\nfrom subprocess import check_call, run\nfrom textwrap import dedent\nfrom typing import TYPE_CHECKING\n\nimport pytest\nfrom conda.base.context import context, reset_context\nfrom conda.common.compat import on_linux, on_mac, on_win\nfrom conda.core.prefix_data import PrefixData\nfrom conda.exceptions import (\n    DryRunExit,\n    PackagesNotFoundError,\n    SpecsConfigurationConflictError,\n    UnsatisfiableError,\n)\nfrom conda.testing.integration import package_is_installed\n\nfrom conda_libmamba_solver.exceptions import LibMambaUnsatisfiableError\nfrom conda_libmamba_solver.solver import LibMambaSolver as Solver\n\nfrom .utils import conda_subprocess, python_site_packages_path_support\n\nif TYPE_CHECKING:\n    from conda.testing.fixtures import CondaCLIFixture, TmpEnvFixture\n    from pytest import MonkeyPatch\n\n\ndef test_python_downgrade_reinstalls_noarch_packages(\n    tmp_env: TmpEnvFixture,\n    conda_cli: CondaCLIFixture,\n) -> None:\n    \"\"\"\n    Reported in https://github.com/conda/conda/issues/11346\n\n    See also test_create::test_noarch_python_package_reinstall_on_pyver_change\n    in conda/conda test suite. Note that we use conda-forge here deliberately;\n    defaults at the time of writing (March 2022) packages pip as a non-noarch\n    build, which means it has a different name across Python versions. conda-forge\n    uses noarch here, so the package is the same across Python versions. Probably\n    why upstream didn't catch this error before.\n    \"\"\"\n    with tmp_env(\n        \"--override-channels\",\n        \"--channel=conda-forge\",\n        \"--solver=libmamba\",\n        \"pip\",\n        \"python=3.11\",\n    ) as prefix:\n        assert PrefixData(prefix).get(\"python\").version.startswith(\"3.11\")\n        if on_win:\n            pip = str(prefix / \"Scripts\" / \"pip.exe\")\n        else:\n            pip = str(prefix / \"bin\" / \"pip\")\n        check_call([pip, \"--version\"])\n\n        conda_cli(\n            \"install\",\n            f\"--prefix={prefix}\",\n            \"--solver=libmamba\",\n            \"--override-channels\",\n            \"--channel=conda-forge\",\n            \"--yes\",\n            \"python=3.10\",\n        )\n        PrefixData._cache_.clear()\n        assert PrefixData(prefix).get(\"python\").version.startswith(\"3.10\")\n        check_call([pip, \"--version\"])\n\n\ndef test_defaults_specs_work(conda_cli: CondaCLIFixture) -> None:\n    \"\"\"\n    See https://github.com/conda/conda-libmamba-solver/issues/173\n\n    `conda install defaults::<pkg_name>` fails with libmamba due to a\n    mapping issue between conda and libmamba.Repo channel names.\n    defaults is secretly (main, r and msys2), and repos are built using those\n    actual channels. A bug in libmamba fails to map this relationship.\n\n    We are testing our workaround (https://github.com/conda/conda-libmamba-solver/issues/173)\n    works for now, but we should probably help fix this in libmamba.\n    \"\"\"\n    out, err, rc = conda_cli(\n        \"create\",\n        \"--dry-run\",\n        \"--json\",\n        \"--solver=libmamba\",\n        \"--override-channels\",\n        \"--channel=conda-forge\",\n        \"python=3.10\",\n        \"defaults::libarchive\",\n        raises=DryRunExit,\n    )\n    data = json.loads(out)\n    assert data.get(\"success\") is True\n    for link in data[\"actions\"][\"LINK\"]:\n        if link[\"name\"] == \"libarchive\":\n            assert link[\"channel\"] in (\"defaults\", \"pkgs/main\")\n            break\n    else:\n        raise AssertionError(\"libarchive not found in LINK actions\")\n\n\ndef test_determinism(tmpdir):\n    \"Based on https://github.com/conda/conda-libmamba-solver/issues/75\"\n    env = os.environ.copy()\n    env.pop(\"PYTHONHASHSEED\", None)\n    env[\"CONDA_PKGS_DIRS\"] = str(tmpdir / \"pkgs\")\n    installed_bokeh_versions = []\n    common_args = (\n        sys.executable,\n        \"-mconda\",\n        \"create\",\n        \"--name=unused\",\n        \"--dry-run\",\n        \"--yes\",\n        \"--json\",\n        \"--solver=libmamba\",\n        \"--channel=conda-forge\",\n        \"--override-channels\",\n    )\n    pkgs = (\"python=3.8\", \"bokeh\", \"hvplot\")\n    # Two things being tested in the same loop:\n    # - Repeated attempts of the same input should give the same result\n    # - Input order (from the user side) should not matter, and should give the same result\n    for i, pkg_list in enumerate(chain(repeat(pkgs, 10), permutations(pkgs, len(pkgs)))):\n        offline = (\"--offline\",) if i else ()\n        process = run([*common_args, *offline, *pkg_list], env=env, text=True, capture_output=True)\n        if process.returncode:\n            print(\"Attempt:\", i)\n            print(process.stdout)\n            print(process.stderr, file=sys.stderr)\n            process.check_returncode()\n        data = json.loads(process.stdout)\n        assert data[\"success\"] is True\n        for pkg in data[\"actions\"][\"LINK\"]:\n            if pkg[\"name\"] == \"bokeh\":\n                installed_bokeh_versions.append(pkg[\"version\"])\n                break\n        else:\n            raise AssertionError(\"Didn't find bokeh!\")\n    assert len(set(installed_bokeh_versions)) == 1\n\n\ndef test_update_from_latest_not_downgrade(\n    tmp_env: TmpEnvFixture,\n    conda_cli: CondaCLIFixture,\n) -> None:\n    \"\"\"Based on two issues where an upgrade caused a downgrade in a given package\n\n    Suppose we have two python versions 3.11.2 and 3.11.3. The bug is when:\n    $ conda install python | grep python\n    python 3.11.3\n    $ conda update python | grep python\n    python 3.11.2\n\n    Update should not downgrade the package\n     - https://github.com/conda/conda-libmamba-solver/issues/71\n     - https://github.com/conda/conda-libmamba-solver/issues/156\n    \"\"\"\n    with tmp_env(\n        \"--override-channels\",\n        \"--channel=conda-forge\",\n        \"--solver=libmamba\",\n        \"python\",\n    ) as prefix:\n        original_python = PrefixData(prefix).get(\"python\")\n        conda_cli(\n            \"update\",\n            f\"--prefix={prefix}\",\n            \"--solver=libmamba\",\n            \"--override-channels\",\n            \"--channel=conda-forge\",\n            \"python\",\n        )\n        update_python = PrefixData(prefix).get(\"python\")\n        assert original_python.version == update_python.version\n\n\n@pytest.mark.skipif(not on_linux, reason=\"Linux only\")\ndef test_too_aggressive_update_to_conda_forge_packages(tmp_env: TmpEnvFixture) -> None:\n    \"\"\"\n    Comes from report in https://github.com/conda/conda-libmamba-solver/issues/240\n    We expect a minimum change to the 'base' environment if we only ask for a single package.\n    conda classic would just change a few (<5) packages, but libmamba seemed to upgrade\n    EVERYTHING it can to conda-forge.\n\n    In July 2024 this test was updated so it updates ca-certificates instead of libzlib to account\n    for differences in how conda-forge and defaults package this library.\n    \"\"\"\n    with tmp_env(\"conda\", \"python\", \"--override-channels\", \"--channel=defaults\") as prefix:\n        cmd = (\n            \"install\",\n            \"-p\",\n            prefix,\n            \"-c\",\n            \"conda-forge\",\n            \"ca-certificates\",\n            \"--json\",\n            \"--dry-run\",\n            \"-y\",\n            \"-vvv\",\n        )\n        env = os.environ.copy()\n        env.pop(\"CONDA_SOLVER\", None)\n        # libmamba seems to take these more seriously than conda... by default the aggressive\n        # update list is ca-certificates, openssl and certifi. We clear it in this test so we\n        # can only test the CLI specs _we_ pass.\n        env[\"CONDA_AGGRESSIVE_UPDATE_PACKAGES\"] = \"\"\n        p_classic = conda_subprocess(*cmd, \"--solver=classic\", explain=True, env=env)\n        p_libmamba = conda_subprocess(*cmd, \"--solver=libmamba\", explain=True, env=env)\n        data_classic = json.loads(p_classic.stdout)\n        data_libmamba = json.loads(p_libmamba.stdout)\n        assert (\n            len(data_libmamba.get(\"actions\", {}).get(\"LINK\", ()))\n            <= len(data_classic.get(\"actions\", {}).get(\"LINK\", ()))\n            <= 1\n        )\n\n\n@pytest.mark.skipif(context.subdir != \"linux-64\", reason=\"Linux-64 only\")\ndef test_pinned_with_cli_build_string(tmp_env: TmpEnvFixture) -> None:\n    specs = (\n        \"scipy=1.7.3=py37hf2a6cf1_0\",\n        \"python=3.7.3\",\n        \"pandas=1.2.5=py37h295c915_0\",\n    )\n    channels = (\n        \"--override-channels\",\n        \"--channel=conda-forge\",\n        \"--channel=defaults\",\n    )\n    with tmp_env(*specs, *channels) as prefix:\n        Path(prefix, \"conda-meta\").mkdir(exist_ok=True)\n        Path(prefix, \"conda-meta\", \"pinned\").write_text(\n            dedent(\n                \"\"\"\n                python ==3.7.3\n                pandas ==1.2.5 py37h295c915_0\n                scipy ==1.7.3 py37hf2a6cf1_0\n                \"\"\"\n            ).lstrip()\n        )\n        # We ask for the same packages or name-only, it should be compatible\n        for valid_specs in (specs, (\"python\", \"pandas\", \"scipy\")):\n            p = conda_subprocess(\n                \"install\",\n                \"-p\",\n                prefix,\n                *valid_specs,\n                *channels,\n                \"--dry-run\",\n                \"--json\",\n                explain=True,\n                check=False,\n            )\n            data = json.loads(p.stdout)\n            assert data.get(\"success\")\n            assert data[\"message\"] == \"All requested packages already installed.\"\n\n        # However if we ask for a different version, it should fail\n        invalid_specs = (\"python=3.8\", \"pandas=1.2.4\", \"scipy=1.7.2\")\n        p = conda_subprocess(\n            \"install\",\n            \"-p\",\n            prefix,\n            *invalid_specs,\n            *channels,\n            \"--dry-run\",\n            \"--json\",\n            explain=True,\n            check=False,\n        )\n        data = json.loads(p.stdout)\n        assert not data.get(\"success\")\n        assert data[\"exception_name\"] == \"SpecsConfigurationConflictError\"\n\n        non_existing_specs = (\"python=0\", \"pandas=1000\", \"scipy=24\")\n        p = conda_subprocess(\n            \"install\",\n            \"-p\",\n            prefix,\n            *non_existing_specs,\n            *channels,\n            \"--dry-run\",\n            \"--json\",\n            explain=True,\n            check=False,\n        )\n        data = json.loads(p.stdout)\n        assert not data.get(\"success\")\n        # Conda 2026 1Q renames exception to PackagesNotFoundInChannelError\n        assert re.match(\"PackagesNotFound.*Error\", data[\"exception_name\"])\n\n\ndef test_constraining_pin_and_requested():\n    env = os.environ.copy()\n    env[\"CONDA_PINNED_PACKAGES\"] = \"python=3.10\"\n\n    # This should fail because it contradicts the pinned packages\n    p = conda_subprocess(\n        \"create\",\n        \"-n\",\n        \"unused\",\n        \"--dry-run\",\n        \"--json\",\n        \"python=3.11\",\n        \"--override-channels\",\n        \"-c\",\n        \"conda-forge\",\n        env=env,\n        explain=True,\n        check=False,\n    )\n    data = json.loads(p.stdout)\n    assert not data.get(\"success\")\n    assert data[\"exception_name\"] == \"SpecsConfigurationConflictError\"\n\n    # This is ok because it's a no-op\n    p = conda_subprocess(\n        \"create\",\n        \"-n\",\n        \"unused\",\n        \"--dry-run\",\n        \"--json\",\n        \"python\",\n        env=env,\n        explain=True,\n        check=False,\n    )\n    data = json.loads(p.stdout)\n    assert data.get(\"success\")\n    assert data.get(\"dry_run\")\n\n\ndef test_locking_pins(\n    monkeypatch: MonkeyPatch,\n    tmp_env: TmpEnvFixture,\n    conda_cli: CondaCLIFixture,\n) -> None:\n    monkeypatch.setenv(\"CONDA_PINNED_PACKAGES\", \"zlib\")\n    with tmp_env(\"zlib\") as prefix:\n        # Should install just fine\n        zlib = PrefixData(prefix).get(\"zlib\")\n        assert zlib\n\n        # This should fail because it contradicts the lock packages\n        out, err, retcode = conda_cli(\n            \"install\",\n            f\"--prefix={prefix}\",\n            \"--dry-run\",\n            \"zlib=1.2.11\",\n            \"--json\",\n            raises=SpecsConfigurationConflictError,\n        )\n        assert str(zlib) in retcode.value.dump_map()[\"error\"]\n\n        # This is a no-op and ok. It won't involve changes.\n        try:\n            out, err, retcode = conda_cli(\n                \"install\",\n                f\"--prefix={prefix}\",\n                \"zlib\",\n                \"--dry-run\",\n                \"--json\",\n            )\n        except DryRunExit:\n            assert True\n        else:\n            data = json.loads(out)\n            assert data.get(\"success\")\n            assert data[\"message\"] == \"All requested packages already installed.\"\n\n\ndef test_ca_certificates_pins(tmp_env: TmpEnvFixture, conda_cli: CondaCLIFixture) -> None:\n    ca_certificates_pin = \"ca-certificates=2023\"\n    with tmp_env() as prefix:\n        Path(prefix, \"conda-meta\").mkdir(exist_ok=True)\n        Path(prefix, \"conda-meta\", \"pinned\").write_text(f\"{ca_certificates_pin}\\n\")\n\n        for cli_spec in (\n            \"ca-certificates\",\n            \"ca-certificates=2023\",\n            \"ca-certificates>0\",\n            \"ca-certificates<2024\",\n            \"ca-certificates!=2022\",\n        ):\n            out, err, retcode = conda_cli(\n                \"install\",\n                f\"--prefix={prefix}\",\n                cli_spec,\n                \"--dry-run\",\n                \"--json\",\n                \"--override-channels\",\n                \"--channel=conda-forge\",\n                raises=DryRunExit,\n            )\n            data = json.loads(out)\n            assert data.get(\"success\")\n            assert data.get(\"dry_run\")\n\n            for pkg in data[\"actions\"][\"LINK\"]:\n                if pkg[\"name\"] == \"ca-certificates\":\n                    assert pkg[\"version\"].startswith(\"2023.\"), cli_spec\n                    break\n            else:\n                raise AssertionError(\"ca-certificates not found in LINK actions\")\n\n\n@pytest.mark.skipif(\n    context.subdir == \"osx-arm64\", reason=\"python=2.7 not available in this platform\"\n)\ndef test_python_update_should_not_uninstall_history(\n    tmp_env: TmpEnvFixture,\n    conda_cli: CondaCLIFixture,\n) -> None:\n    \"\"\"\n    https://github.com/conda/conda-libmamba-solver/issues/341\n\n    Original report complained about an upgrade to Python 3.12 removing numpy from the\n    (originally) py311 environment because at that point in time numpy for py312 was not yet\n    available in defaults. Since at some point it will be, we will test for similar behavior\n    here, but in a way that we know will never be reverted: typing_extensions being available for\n    Python 2.7.\n\n    Given a Python 3.8 + typing-extensions environment, the solver should not allow us to\n    change to Python 2.7 because typing-extensions is in history, and the only solution to get\n    Python 2.7 is to remove it. Hence, we expect a conflict that mentions both.\n    \"\"\"\n    channels = \"--override-channels\", \"-c\", \"conda-forge\"\n    solver = \"--solver\", \"libmamba\"\n    with tmp_env(\"python=3.8\", \"typing_extensions>=4.8\", *channels, *solver) as prefix:\n        assert package_is_installed(prefix, \"python=3.8\")\n        assert package_is_installed(prefix, \"typing_extensions>=4.8\")\n        with pytest.raises(\n            LibMambaUnsatisfiableError,\n            match=r\"python 2\\.7.|\\n*typing_extensions\",\n        ):\n            conda_cli(\n                \"install\",\n                f\"--prefix={prefix}\",\n                \"python=2.7\",\n                *channels,\n                *solver,\n                \"--dry-run\",\n            )\n\n\ndef test_python_downgrade_with_pins_removes_truststore(tmp_env: TmpEnvFixture) -> None:\n    \"\"\"\n    https://github.com/conda/conda-libmamba-solver/issues/354\n    \"\"\"\n    channels = \"--override-channels\", \"-c\", \"conda-forge\"\n    solver = \"--solver\", \"libmamba\"\n    with tmp_env(\"python=3.10\", \"conda\", *channels, *solver) as prefix:\n        zstd_version = PrefixData(prefix).get(\"zstd\").version\n        for pin in (None, \"zstd\", f\"zstd={zstd_version}\"):\n            env = os.environ.copy()\n            if pin:\n                env[\"CONDA_PINNED_PACKAGES\"] = pin\n            p = conda_subprocess(\n                \"install\",\n                f\"--prefix={prefix}\",\n                *channels,\n                *solver,\n                \"--dry-run\",\n                \"--json\",\n                \"python=3.9\",\n                env=env,\n                check=False,\n            )\n            data = json.loads(p.stdout)\n            assert p.returncode == 0\n            assert data.get(\"success\")\n            assert data.get(\"dry_run\")\n            link_dict = {pkg[\"name\"]: pkg for pkg in data[\"actions\"][\"LINK\"]}\n            unlink_dict = {pkg[\"name\"]: pkg for pkg in data[\"actions\"][\"UNLINK\"]}\n            assert link_dict[\"python\"][\"version\"].startswith(\"3.9.\")\n            assert \"truststore\" in unlink_dict\n            if pin:\n                # shouldn't have changed!\n                assert \"zstd\" not in link_dict\n                assert \"zstd\" not in unlink_dict\n\n\n@pytest.mark.parametrize(\"spec\", (\"__glibc\", \"__unix\", \"__linux\", \"__osx\", \"__win\"))\ndef test_install_virtual_packages(conda_cli: CondaCLIFixture, spec: str) -> None:\n    \"\"\"\n    Ensures a solver knows how to deal with virtual specs in the CLI.\n    This mean succeeding only if the virtual package is available.\n    https://github.com/conda/conda-libmamba-solver/issues/480\n\n    TODO: Remove once https://github.com/conda/conda/pull/13784 is merged\n    \"\"\"\n    if any(\n        [\n            on_linux and spec in (\"__glibc\", \"__unix\", \"__linux\"),\n            on_mac and spec in (\"__unix\", \"__osx\"),\n            on_win and spec == \"__win\",\n        ]\n    ):\n        raises = DryRunExit  # success\n    else:\n        raises = (UnsatisfiableError, PackagesNotFoundError)\n    conda_cli(\"create\", \"--dry-run\", \"--offline\", spec, raises=raises)\n\n\ndef test_urls_are_percent_decoded(tmp_path: Path) -> None:\n    solver = Solver(\n        prefix=tmp_path, channels=[\"conda-forge\"], specs_to_add=[\"x264\"], command=\"create\"\n    )\n    records = solver.solve_final_state()\n    for record in records:\n        if record.name == \"x264\":\n            print(record.url)\n            assert \"!\" in record.url\n            assert \"%\" not in record.url\n            break\n    else:\n        pytest.fail(\"Solution didn't include x264\")\n\n\ndef test_prune_existing_env(\n    conda_cli: CondaCLIFixture,\n    tmp_path: Path,\n    tmp_env: TmpEnvFixture,\n) -> None:\n    \"\"\"\n    https://github.com/conda/conda-libmamba-solver/issues/595\n    \"\"\"\n    (tmp_path / \"env.yml\").write_text(\n        dedent(\n            \"\"\"\n        channels:\n        - defaults\n        dependencies:\n        - ca-certificates\n        \"\"\"\n        )\n    )\n    with tmp_env(\"zstd\") as prefix:\n        out, err, rc = conda_cli(\n            \"env\",\n            \"update\",\n            f\"--prefix={prefix}\",\n            f\"--file={tmp_path / 'env.yml'}\",\n            \"--prune\",\n        )\n        assert rc == 0\n        PrefixData._cache_.clear()\n        assert not PrefixData(prefix).get(\"zstd\", None)\n        assert PrefixData(prefix).get(\"ca-certificates\")\n\n\ndef test_prune_existing_env_dependencies_are_solved(\n    conda_cli: CondaCLIFixture,\n    tmp_path: Path,\n    tmp_env: TmpEnvFixture,\n) -> None:\n    \"\"\"\n    https://github.com/conda/conda-libmamba-solver/issues/595\n    \"\"\"\n    (tmp_path / \"env.yml\").write_text(\n        dedent(\n            \"\"\"\n            channels:\n            - conda-forge\n            dependencies:\n            - python=3.13\n            - numpy=2.2.2\n            \"\"\"\n        )\n    )\n    with tmp_env(\"python=3.13\") as prefix:\n        out, err, rc = conda_cli(\n            \"env\",\n            \"update\",\n            f\"--prefix={prefix}\",\n            f\"--file={tmp_path / 'env.yml'}\",\n            \"--prune\",\n            \"-vv\",\n        )\n        print(out)\n        print(err, file=sys.stderr)\n        assert rc == 0\n        PrefixData._cache_.clear()\n        assert PrefixData(prefix).get(\"python\").version.startswith(\"3.13\")\n        assert PrefixData(prefix).get(\"numpy\")\n        out, err, rc = conda_cli(\"run\", f\"--prefix={prefix}\", \"python\", \"-c\", \"import numpy\")\n        print(out)\n        print(err, file=sys.stderr)\n        assert rc == 0\n\n\ndef test_satisfied_skip_solve_matchspec(\n    conda_cli: CondaCLIFixture, tmp_env: TmpEnvFixture\n) -> None:\n    with tmp_env(\"ca-certificates\") as prefix:\n        conda_cli(\n            \"install\",\n            f\"--prefix={prefix}\",\n            \"--satisfied-skip-solve\",\n            \"ca-certificates>10000\",\n            raises=PackagesNotFoundError,\n        )\n\n\n# @pytest.mark.skipif(context.subdir != \"linux-64\", reason=\"Linux x64 only\")\n@pytest.mark.parametrize(\n    \"specs\",\n    (\n        pytest.param((\"pytorch\", \"torchvision>0.12\"), id=\"pytorch\"),\n        pytest.param((\"pytorch>0\", \"torchvision>0.12\"), id=\"pytorch>0\"),\n        pytest.param((\"pytorch=2\", \"torchvision>0.12\"), id=\"pytorch=2\"),\n    ),\n)\ndef test_pytorch_gpu(specs):\n    \"\"\"\n    https://github.com/conda/conda-libmamba-solver/issues/646\n\n    This test must run in a subprocess because it's sensitive to side effects\n    from other tests. There must be some global state in the libmamba Database / Pool\n    objects. When run in isolation, it always passed.\n    \"\"\"\n    env = os.environ.copy()\n    env[\"CONDA_OVERRIDE_CUDA\"] = \"12.6\"\n    env[\"CONDA_OVERRIDE_GLIBC\"] = \"2.30\"\n    env[\"CONDA_OVERRIDE_LINUX\"] = \"5.15.167.4\"\n    env[\"CONDA_OVERRIDE_ARCHSPEC\"] = \"skylake\"\n    p = conda_subprocess(\n        \"create\",\n        \"--dry-run\",\n        \"--override-channels\",\n        \"--channel=conda-forge\",\n        \"--platform=linux-64\",\n        \"--json\",\n        *specs,\n        env=env,\n    )\n    result = json.loads(p.stdout)\n    assert result[\"success\"]\n    for record in result[\"actions\"][\"LINK\"]:\n        if record[\"name\"] == \"pytorch\":\n            print(record)\n            assert \"cuda\" in record[\"build_string\"]\n            break\n    else:\n        raise AssertionError(\"No pytorch found\")\n\n\n_CROSS_PLATFORM_TARGET = \"linux-64\" if context.subdir != \"linux-64\" else \"win-64\"\n\n\n@pytest.mark.parametrize(\n    \"subdirs,expected_platform\",\n    (\n        pytest.param(\n            (_CROSS_PLATFORM_TARGET, \"noarch\"),\n            _CROSS_PLATFORM_TARGET,\n            id=\"cross-platform-target\",\n        ),\n        pytest.param(\n            (\"noarch\",),\n            context.subdir,\n            id=\"noarch-only-fallback\",\n        ),\n    ),\n)\ndef test_cross_platform_spinner_message(\n    tmp_path: Path,\n    subdirs: tuple[str, ...],\n    expected_platform: str,\n) -> None:\n    \"\"\"\n    https://github.com/conda/conda-libmamba-solver/pull/911\n\n    The ``Platform:`` line of the metadata-collection spinner message should\n    show the first non-``noarch`` entry of ``self.subdirs`` (the actual\n    target platform during cross-platform export) and fall back to\n    ``context.subdir`` when ``self.subdirs`` only contains ``noarch``.\n    \"\"\"\n    from conda.models.channel import Channel\n\n    solver = Solver(\n        prefix=tmp_path,\n        channels=[\"conda-forge\"],\n        specs_to_add=[\"tzdata\"],\n        command=\"create\",\n    )\n    # Assign after construction so the noarch-only case bypasses the\n    # ``next(s for s in self.subdirs if s != \"noarch\")`` call in ``__init__``.\n    solver.subdirs = subdirs\n    message = solver._collect_all_metadata_spinner_message(channels=[Channel(\"conda-forge\")])\n    assert f\"Platform: {expected_platform}\" in message\n    assert \"Platform: noarch\" not in message\n\n\ndef test_channel_subdir_set_correctly(tmp_env: TmpEnvFixture) -> None:\n    \"\"\"\n    https://github.com/conda/conda-libmamba-solver/issues/662\n    \"\"\"\n    with tmp_env(\n        \"--override-channels\",\n        \"--channel=conda-forge\",\n        \"--solver=libmamba\",\n        \"tzdata\",\n        \"bzip2\",\n    ) as prefix:\n        cm_path: Path = prefix / \"conda-meta\"\n        for prec_path in cm_path.glob(\"*.json\"):\n            if prec_path.name.startswith(\"bzip2-\"):\n                payload = json.loads(prec_path.read_text())\n                assert not payload[\"channel\"].endswith(\"noarch\")\n            if prec_path.name.startswith(\"tzdata-\"):\n                payload = json.loads(prec_path.read_text())\n                assert payload[\"channel\"].endswith(\"noarch\")\n\n\ndef test_python_site_packages_path(tmp_env: TmpEnvFixture) -> None:\n    with tmp_env(\n        \"--override-channels\",\n        \"--channel=conda-forge\",\n        \"--solver=libmamba\",\n        \"python-freethreading=3.13\",\n    ) as prefix:\n        PrefixData._cache_.clear()\n        prec = PrefixData(prefix).get(\"python\")\n        assert prec.name == \"python\"\n        assert prec.version.startswith(\"3.13\")\n        if python_site_packages_path_support:\n            if context.subdir.startswith(\"win\"):\n                assert prec.python_site_packages_path == \"Lib/site-packages\"\n            else:\n                assert prec.python_site_packages_path == \"lib/python3.13t/site-packages\"\n        else:\n            assert prec.python_site_packages_path is None\n\n\n@pytest.mark.skipif(on_win, reason=\"Missing free-threaded Python build?\")\n@pytest.mark.parametrize(\"shards\", (True, False))\ndef test_track_features_recorded_correctly(tmp_env, monkeypatch, shards):\n    monkeypatch.setenv(\"CONDA_PLUGINS_USE_SHARDED_REPODATA\", \"1\" if shards else \"0\")\n    reset_context()\n    with tmp_env(\"python=3.14=*_cp314t\", \"--override-channels\", \"-c\", \"conda-forge\") as prefix:\n        python = PrefixData(prefix).get(\"python\")\n        print(\n            json.dumps(\n                {k: v for k, v in python.dump().items() if k not in (\"files\", \"paths_data\")},\n                indent=2,\n            )\n        )\n        tf = python.track_features\n        assert tf == (\"py_freethreading\",)\n"
  },
  {
    "path": "tests/test_solver_differences.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nThis module collects examples of environments that were hard to solve, required\nworkarounds or didn't meet users' expectations... specially if compared to conda classic.\n\"\"\"\n\nimport json\nimport os\n\nimport pytest\nfrom conda.common.compat import on_linux\n\nfrom .repodata_time_machine import repodata_time_machine\nfrom .utils import conda_subprocess\n\n\n@pytest.mark.skip(reason=\"Fixed by #381. v1.8.2 is now found.\")\ndef test_pydantic_182_not_on_python_311():\n    \"\"\"\n    See daico007's report on https://github.com/conda/conda-libmamba-solver/issues/115\n\n    - The original environment file didn't specify a Python version.\n    - conda classic does find that Python 3.10 and pydantic 1.8.2 are compatible\n    - libsolv has to try all Python versions, starting with 3.11 as of writing,\n      and then tries different pydantic versions. It finds 0.18.2 is compatible, but\n      because it's noarch with an open-ended upper bound.\n    - If we do specify that we want a Python version for which pydantic 1.8.2 is available,\n      libsolv correctly finds it.\n\n    After #381, where stricter specs are ordered first in the solver task, the solver\n    does find the correct pydantic as classic does.\n    \"\"\"\n    env = os.environ.copy()\n    env[\"CONDA_SUBDIR\"] = \"linux-64\"\n    args = (\n        \"create\",\n        \"-n\",\n        \"unused\",\n        \"--dry-run\",\n        \"--override-channels\",\n        \"-c\",\n        \"conda-forge\",\n        \"--json\",\n    )\n    pkgs = (\n        \"numpy\",\n        \"sympy\",\n        \"unyt<=2.8\",\n        \"boltons\",\n        \"lxml\",\n        \"pydantic<1.9.0\",\n        \"networkx\",\n        \"ele>=0.2.0\",\n        \"forcefield-utilities\",\n    )\n    p = conda_subprocess(\n        *args,\n        \"--solver=classic\",\n        *pkgs,\n        env=env,\n    )\n    data = json.loads(p.stdout)\n    pydantic = next(pkg for pkg in data[\"actions\"][\"LINK\"] if pkg[\"name\"] == \"pydantic\")\n    assert pydantic[\"version\"] == \"1.8.2\"\n\n    p = conda_subprocess(\n        *args,\n        \"--solver=libmamba\",\n        *pkgs,\n    )\n    data = json.loads(p.stdout)\n    pydantic = next(pkg for pkg in data[\"actions\"][\"LINK\"] if pkg[\"name\"] == \"pydantic\")\n    assert pydantic[\"version\"] != \"1.8.2\"  # this was the bug, now fixed\n\n    p = conda_subprocess(\n        *args,\n        \"--solver=libmamba\",\n        *pkgs,\n        \"python<3.11\",\n    )\n    data = json.loads(p.stdout)\n    pydantic = next(pkg for pkg in data[\"actions\"][\"LINK\"] if pkg[\"name\"] == \"pydantic\")\n    assert pydantic[\"version\"] == \"1.8.2\"\n\n\n@pytest.mark.skipif(not on_linux, reason=\"Only relevant on Linux\")\ndef test_gpu_cpu_mutexes():\n    \"\"\"\n    See:\n        - https://github.com/conda/conda-libmamba-solver/issues/115#issuecomment-1399040871\n        - https://github.com/conda/conda-libmamba-solver/issues/115#issuecomment-1399040867\n        - https://github.com/conda/conda-libmamba-solver/issues/131\n\n    This behaviour difference is known and explained at\n    https://github.com/conda/conda-libmamba-solver/issues/131#issuecomment-1440745813.\n\n    If at some point this changes (e.g. libmamba fix), this test will capture it.\n    \"\"\"\n    args = (\n        \"create\",\n        \"-n\",\n        \"unused\",\n        \"--dry-run\",\n        \"--json\",\n        \"--override-channels\",\n        \"-c\",\n        \"conda-forge\",\n        \"-c\",\n        \"pyg\",\n        \"-c\",\n        \"pytorch\",\n    )\n    pkgs = (\n        \"cpuonly\",\n        \"pyg=2.1.0\",\n        \"python=3.9\",\n        \"pytorch::pytorch=1.12\",\n    )\n    env = os.environ.copy()\n    env[\"CONDA_SUBDIR\"] = \"linux-64\"\n    p = conda_subprocess(\n        *args,\n        \"--solver=classic\",\n        *pkgs,\n        env=env,\n    )\n    data = json.loads(p.stdout)\n    found = 0\n    target_pkgs = (\"pytorch\", \"pyg\")\n    for pkg in data[\"actions\"][\"LINK\"]:\n        if pkg[\"name\"] in target_pkgs:\n            found += 1\n            assert \"cpu\" in pkg[\"build_string\"]\n        elif pkg[\"name\"] == \"cudatoolkit\":\n            raise AssertionError(\"CUDA shouldn't be installed due to 'cpuonly'\")\n    assert found == len(target_pkgs)\n\n    p = conda_subprocess(\n        *args,\n        \"--solver=libmamba\",\n        *pkgs,\n        env=env,\n    )\n    data = json.loads(p.stdout)\n\n    # This should not happen, but it does. See docstring.\n    assert next(pkg for pkg in data[\"actions\"][\"LINK\"] if pkg[\"name\"] == \"cudatoolkit\")\n\n    # This was working correctly between Oct-Dec 2025, but broke again when\n    # `__cuda=0=0` was removed from non-cuda systems\n    # https://github.com/conda/conda/commit/8d36401a0c8b378720db1dc786c0e026bb621fb0\n\n    p = conda_subprocess(\n        *args,\n        \"--solver=libmamba\",\n        \"cpuonly\",\n        \"pyg=2.1.0\",\n        \"python=3.9\",\n        \"pytorch::pytorch\",  # more recent pytorch versions seem to be properly packaged\n        env=env,\n    )\n    data = json.loads(p.stdout)\n    # This should not happen, but it does. See docstring.\n    assert not next((pkg for pkg in data[\"actions\"][\"LINK\"] if pkg[\"name\"] == \"cudatoolkit\"), None)\n\n\n@pytest.mark.skipif(not on_linux, reason=\"Slow test, only run on Linux\")\ndef test_old_panel(tmp_path):\n    \"\"\"\n    https://github.com/conda/conda-libmamba-solver/issues/64\n\n    We could not reproduce this test until #381. Note this is not a problem\n    in the non-time-machine'd repodata (as of 2023-11-16 at least).\n    \"\"\"\n    os.chdir(tmp_path)\n    print(\"Patching repodata...\")\n    old_repodata = os.path.abspath(\n        repodata_time_machine(\n            channels=[\"conda-forge\", \"pyviz/label/dev\"],\n            timestamp_str=\"2022-06-16 12:31:00\",\n            subdirs=(\"osx-64\", \"noarch\"),\n        )\n    )\n    with open(f\"{old_repodata}/conda-forge/osx-64/repodata.json\") as f:\n        for line in f:\n            # Make sure we have patched the repodata correctly\n            # Python 3.11 only appeared in October 2022\n            assert '\"python-3.11.0-' not in line\n\n    channel_prefix = f\"file://{old_repodata}/\"\n    env = os.environ.copy()\n    env[\"CONDA_SUBDIR\"] = \"osx-64\"\n    env[\"CONDA_REPODATA_THREADS\"] = \"1\"\n    env[\"CONDA_DEFAULT_THREADS\"] = \"1\"\n    env[\"CONDA_FETCH_THREADS\"] = \"1\"\n    env[\"CONDA_REMOTE_CONNECT_TIMEOUT_SECS\"] = \"1\"\n    env[\"CONDA_REMOTE_MAX_RETRIES\"] = \"1\"\n    env[\"CONDA_REMOTE_BACKOFF_FACTOR\"] = \"1\"\n    env[\"CONDA_REMOTE_READ_TIMEOUT_SECS\"] = \"1\"\n    args = (\n        \"create\",\n        \"-n\",\n        \"unused\",\n        \"--dry-run\",\n        \"--json\",\n        \"--override-channels\",\n        \"-c\",\n        f\"{channel_prefix}pyviz/label/dev\",\n        \"-c\",\n        f\"{channel_prefix}conda-forge\",\n        \"--repodata-fn=repodata.json\",\n    )\n    pkgs = (\n        \"python=3.8\",\n        \"lumen\",\n    )\n\n    for solver in (\"classic\", \"libmamba\"):\n        print(\"Solving with\", solver)\n        p = conda_subprocess(\n            *args,\n            \"--solver\",\n            solver,\n            *pkgs,\n            env=env,\n        )\n        data = json.loads(p.stdout)\n        panel = next(pkg for pkg in data[\"actions\"][\"LINK\"] if pkg[\"name\"] == \"panel\")\n        assert panel[\"version\"] == \"0.14.0a2\"\n"
  },
  {
    "path": "tests/test_user_agent.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\n\"\"\"\nEnsure the right User-Agent headers are set by `conda.context`.\nThese will be sent to the server on each request.\n\"\"\"\n\nimport json\nimport os\nfrom importlib.metadata import version\nfrom subprocess import check_output\n\nimport pytest\n\n\n@pytest.mark.parametrize(\"solver\", (\"classic\", \"libmamba\"))\ndef test_user_agent_conda_info(solver):\n    env = os.environ.copy()\n    env[\"CONDA_SOLVER\"] = solver\n    out = check_output([\"conda\", \"info\", \"--json\"], env=env)\n    info = json.loads(out)\n    assert \"conda/\" in info[\"user_agent\"]\n    if solver == \"classic\":\n        assert \"solver/\" not in info[\"user_agent\"]\n    elif solver == \"libmamba\":\n        assert \"solver/libmamba\" in info[\"user_agent\"]\n        assert f\"conda-libmamba-solver/{version('conda-libmamba-solver')}\" in info[\"user_agent\"]\n        assert f\"libmambapy/{version('libmambapy')}\" in info[\"user_agent\"]\n"
  },
  {
    "path": "tests/test_workarounds.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\nimport asyncio\nimport ctypes\nimport json\nimport signal\nimport subprocess as sp\nimport sys\n\nimport pytest\nfrom conda.common.compat import on_win\n\n\ndef test_matchspec_star_version():\n    \"\"\"\n    Specs like `libblas=*=*mkl` choked on `MatchSpec.conda_build_form()`.\n    We work around that with `.utils.safe_conda_build_form()`.\n    Reported in https://github.com/conda/conda/issues/11347\n    \"\"\"\n    sp.check_call(\n        [\n            sys.executable,\n            \"-m\",\n            \"conda\",\n            \"create\",\n            \"-p\",\n            \"UNUSED\",\n            \"--dry-run\",\n            \"--override-channels\",\n            \"-c\",\n            \"conda-test\",\n            \"--solver=libmamba\",\n            \"activate_deactivate_package=*=*0\",\n        ]\n    )\n\n\ndef test_build_string_filters():\n    process = sp.run(\n        [\n            sys.executable,\n            \"-m\",\n            \"conda\",\n            \"create\",\n            \"-p\",\n            \"UNUSED\",\n            \"--dry-run\",\n            \"--solver=libmamba\",\n            \"numpy=*=*py38*\",\n            \"--json\",\n        ],\n        stdout=sp.PIPE,\n        text=True,\n    )\n    print(process.stdout)\n    process.check_returncode()\n    data = json.loads(process.stdout)\n    assert data[\"success\"]\n    for pkg in data[\"actions\"][\"LINK\"]:\n        if pkg[\"name\"] == \"python\":\n            assert pkg[\"version\"].startswith(\"3.8\")\n        if pkg[\"name\"] == \"numpy\":\n            assert \"py38\" in pkg[\"build_string\"]\n\n\n@pytest.mark.trouble\n@pytest.mark.parametrize(\"shards\", (True, False), ids=[\"shards\", \"noshards\"])\n@pytest.mark.parametrize(\"stage\", [\"Collecting package metadata\", \"Solving environment\"])\ndef test_ctrl_c(stage, shards):\n    TIMEOUT = 20\n\n    async def run() -> tuple[str, str, int]:\n        loop = asyncio.get_running_loop()\n        deadline = loop.time() + TIMEOUT\n        env = {\n            \"CONDA_PLUGINS_USE_SHARDED_REPODATA\": str(shards),\n            \"PYTHONHASHSEED\": str(0xAD792856),\n        }\n        p = await asyncio.create_subprocess_exec(\n            sys.executable,\n            \"-m\",\n            \"conda\",\n            \"create\",\n            \"-p\",\n            \"UNUSED\",\n            \"--dry-run\",\n            \"--solver=libmamba\",\n            \"--override-channels\",\n            \"--channel=conda-forge\",\n            \"--quiet\",\n            \"vaex\",\n            stdout=asyncio.subprocess.PIPE,\n            stderr=asyncio.subprocess.PIPE,\n            env=env,\n        )\n        lines: list[str] = []\n        while True:\n            remaining = deadline - loop.time()\n            if remaining <= 0:\n                break\n            try:\n                chunk = await asyncio.wait_for(p.stdout.readline(), timeout=remaining)\n            except asyncio.TimeoutError:\n                break\n            if not chunk:\n                break\n            line = chunk.decode()\n            lines.append(line)\n            print(line.strip())\n            if stage in line:\n                break\n\n        if loop.time() >= deadline:\n            stdout_text = \"\".join(lines)\n            raise RuntimeError(f\"Timeout after {TIMEOUT} seconds\\n{stdout_text}\")\n\n        # works around Windows' awkward CTRL-C signal handling\n        # https://stackoverflow.com/a/64357453\n        if on_win:\n            try:\n                kernel = ctypes.windll.kernel32\n                kernel.FreeConsole()\n                kernel.AttachConsole(p.pid)\n                kernel.SetConsoleCtrlHandler(None, 1)\n                kernel.GenerateConsoleCtrlEvent(0, 0)\n                remaining = deadline - loop.time()\n                await asyncio.wait_for(p.wait(), timeout=remaining)\n            finally:\n                kernel.SetConsoleCtrlHandler(None, 0)\n        else:\n            p.send_signal(signal.SIGINT)\n            remaining = deadline - loop.time()\n            await asyncio.wait_for(p.wait(), timeout=remaining)\n\n        remaining = deadline - loop.time()\n        if remaining <= 0:\n            raise RuntimeError(f\"Timeout after {TIMEOUT} seconds\")\n        stdout_tail = await asyncio.wait_for(p.stdout.read(), timeout=remaining)\n        stderr_tail = await asyncio.wait_for(p.stderr.read(), timeout=remaining)\n        stdout_text = \"\".join(lines) + stdout_tail.decode()\n        stderr_text = stderr_tail.decode()\n        return stdout_text, stderr_text, p.returncode\n\n    stdout_text, stderr_text, returncode = asyncio.run(run())\n    assert returncode != 0\n    assert \"KeyboardInterrupt\" in stdout_text + stderr_text\n"
  },
  {
    "path": "tests/utils.py",
    "content": "# Copyright (C) 2022 Anaconda, Inc\n# Copyright (C) 2023 conda\n# SPDX-License-Identifier: BSD-3-Clause\nimport sys\nfrom pathlib import Path\nfrom subprocess import CompletedProcess, run\n\nfrom libmambapy.specs import PackageInfo\nfrom ruamel.yaml import YAML\n\npython_site_packages_path_support = getattr(PackageInfo, \"python_site_packages_path\", False)\n\n\ndef conda_subprocess(*args, explain=False, capture_output=True, **kwargs) -> CompletedProcess:\n    cmd = [sys.executable, \"-m\", \"conda\", *[str(a) for a in args]]\n    check = kwargs.pop(\"check\", True)\n    if explain:\n        print(\"+\", \" \".join(cmd))\n    p = run(\n        cmd,\n        capture_output=capture_output,\n        text=kwargs.pop(\"text\", capture_output),\n        check=False,\n        **kwargs,\n    )\n    if capture_output and (explain or p.returncode):\n        print(p.stdout)\n        print(p.stderr, file=sys.stderr)\n    if check:\n        p.check_returncode()\n    return p\n\n\ndef write_env_config(prefix, force=False, **kwargs):\n    condarc = Path(prefix) / \".condarc\"\n    if condarc.is_file() and not force:\n        raise RuntimeError(f\"File {condarc} already exists. Use force=True to overwrite.\")\n    yaml = YAML(typ=\"full\", pure=True)\n    with open(condarc, \"w\") as f:\n        yaml.dump(kwargs, f)\n"
  }
]