python-pkginfo-0.6.5/.cargo_vcs_info.json0000644000000001360000000000100140200ustar { "git": { "sha1": "bc96c05d3ed6b1aedc3ff46a1c89497c36b305a7" }, "path_in_vcs": "" }python-pkginfo-0.6.5/.github/dependabot.yml000064400000000000000000000006721046102023000170050ustar 00000000000000# To get started with Dependabot version updates, you'll need to specify which # package ecosystems to update and where the package manifests are located. # Please see the documentation for all configuration options: # https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates version: 2 updates: - package-ecosystem: "github-actions" directory: "/" schedule: interval: "monthly" python-pkginfo-0.6.5/.github/workflows/CI.yml000064400000000000000000000021741046102023000172270ustar 00000000000000on: push: branches: - main pull_request: name: CI jobs: check: name: Check runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: cargo check --all-features test: name: Test Suite runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] steps: - uses: actions/checkout@v4 - run: cargo test - run: cargo test --all-features test-direct-minimal-versions: name: Test Direct Minimal Versions runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: rustup toolchain add nightly - run: cargo +nightly update -Z minimal-versions - run: cargo +stable test clippy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: rustup component add clippy - run: cargo clippy --all-features --locked -- -D warnings fmt: name: Format runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: rustup component add rustfmt - run: cargo fmt --all -- --check - run: npx prettier --check "**/*.md" python-pkginfo-0.6.5/.gitignore000064400000000000000000000000101046102023000145670ustar 00000000000000/target python-pkginfo-0.6.5/Cargo.toml0000644000000032730000000000100120230ustar # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies. # # If you are reading this file be aware that the original Cargo.toml # will likely look very different (and much more reasonable). # See Cargo.toml.orig for the original contents. [package] edition = "2021" name = "python-pkginfo" version = "0.6.5" authors = ["messense "] build = false autolib = false autobins = false autoexamples = false autotests = false autobenches = false description = "Parse Python package metadata from sdist and bdists and etc." readme = "README.md" keywords = [ "python", "pkginfo", "metadata", ] license = "MIT" repository = "https://github.com/PyO3/python-pkginfo-rs" [lib] name = "python_pkginfo" path = "src/lib.rs" [[test]] name = "test_distribution" path = "tests/test_distribution.rs" [dependencies.bzip2] version = "0.4.4" optional = true [dependencies.flate2] version = "1.0.33" [dependencies.fs-err] version = "3.0.0" [dependencies.mailparse] version = "0.15" [dependencies.rfc2047-decoder] version = "1.0.6" [dependencies.serde] version = "1.0.210" features = ["derive"] optional = true [dependencies.tar] version = "0.4.41" [dependencies.thiserror] version = "2.0.3" [dependencies.xz] version = "0.1.7" optional = true package = "xz2" [dependencies.zip] version = ">=0.6,<3" features = ["deflate"] default-features = false [dev-dependencies.serde_json] version = "1.0.128" [features] deprecated-formats = [ "bzip2", "xz", "zip/bzip2", ] python-pkginfo-0.6.5/Cargo.toml.orig000064400000000000000000000016351046102023000155040ustar 00000000000000[package] name = "python-pkginfo" version = "0.6.5" authors = ["messense "] edition = "2021" description = "Parse Python package metadata from sdist and bdists and etc." keywords = ["python", "pkginfo", "metadata"] license = "MIT" readme = "README.md" repository = "https://github.com/PyO3/python-pkginfo-rs" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] bzip2 = { version = "0.4.4", optional = true } flate2 = "1.0.33" fs-err = "3.0.0" mailparse = "0.15" rfc2047-decoder = "1.0.6" serde = { version = "1.0.210", features = ["derive"], optional = true } tar = "0.4.41" thiserror = "2.0.3" xz = { package = "xz2", version = "0.1.7", optional = true } zip = { version = ">=0.6,<3", default-features = false, features = ["deflate"] } [dev-dependencies] serde_json = "1.0.128" [features] deprecated-formats = ["bzip2", "xz", "zip/bzip2"] python-pkginfo-0.6.5/Changelog.md000064400000000000000000000002401046102023000150150ustar 00000000000000# Changelog ## 0.6.3 - Disable `bzip2` and `time` feature of the `zip` crate by default. `bzip2` support was already behind a feature, and `time` was unused. python-pkginfo-0.6.5/LICENSE000064400000000000000000000021201046102023000136100ustar 00000000000000The MIT License (MIT) Copyright (c) 2021-present PyO3 Project and Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. python-pkginfo-0.6.5/README.md000064400000000000000000000020271046102023000140700ustar 00000000000000# python-pkginfo-rs [![GitHub Actions](https://github.com/PyO3/python-pkginfo-rs/workflows/CI/badge.svg)](https://github.com/PyO3/python-pkginfo-rs/actions?query=workflow%3ACI) [![Crates.io](https://img.shields.io/crates/v/python-pkginfo.svg)](https://crates.io/crates/python-pkginfo) [![docs.rs](https://docs.rs/python-pkginfo/badge.svg)](https://docs.rs/python-pkginfo/) Parse Python package metadata from sdist and bdists and etc. A Rust port of the [pkginfo](https://pypi.org/project/pkginfo/) Python library. ## Installation Add it to your `Cargo.toml`: ```toml [dependencies] python-pkginfo = "0.6" ``` then you are good to go. If you are using Rust 2015 you have to add `extern crate python_pkginfo` to your crate root as well. ## Example ```rust use python_pkginfo::Distribution; fn main() { let dist = Distribution::new("path/to/package.whl").unwrap(); println!("{:#?}", dist.metadata()); } ``` ## License This work is released under the MIT license. A copy of the license is provided in the [LICENSE](./LICENSE) file. python-pkginfo-0.6.5/src/distribution.rs000064400000000000000000000175561046102023000165020ustar 00000000000000use std::fmt; use std::io::{BufReader, Read}; use std::path::Path; use std::str::FromStr; #[cfg(feature = "bzip2")] use bzip2::read::BzDecoder; use flate2::read::GzDecoder; #[cfg(feature = "xz")] use xz::bufread::XzDecoder; #[cfg(feature = "xz")] use xz::stream::Stream as XzStream; use zip::ZipArchive; use crate::{Error, Metadata}; /// Python package distribution type #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum DistributionType { /// Source distribution SDist, /// Binary distribution egg format Egg, /// Binary distribution wheel format Wheel, } #[derive(Debug, Clone, Copy)] enum SDistType { Zip, GzTar, #[cfg(feature = "deprecated-formats")] Tar, #[cfg(feature = "bzip2")] BzTar, #[cfg(feature = "xz")] XzTar, } /// Python package distribution #[derive(Debug, Clone)] pub struct Distribution { dist_type: DistributionType, metadata: Metadata, python_version: String, } impl fmt::Display for DistributionType { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { DistributionType::SDist => write!(f, "sdist"), DistributionType::Egg => write!(f, "bdist_egg"), DistributionType::Wheel => write!(f, "bdist_wheel"), } } } impl FromStr for SDistType { type Err = Error; fn from_str(s: &str) -> Result { let dist_type = match s { "zip" => SDistType::Zip, "gz" | "tgz" => SDistType::GzTar, #[cfg(feature = "deprecated-formats")] "tar" => SDistType::Tar, #[cfg(feature = "bzip2")] "bz2" | "tbz" => SDistType::BzTar, #[cfg(feature = "xz")] "lz" | "lzma" | "tlz" | "txz" | "xz" => SDistType::XzTar, _ => return Err(Error::UnknownDistributionType), }; Ok(dist_type) } } impl Distribution { /// Open and parse a distribution from `path` pub fn new(path: impl AsRef) -> Result { let path = path.as_ref(); let ext = path .extension() .and_then(|ext| ext.to_str()) .ok_or(Error::UnknownDistributionType)?; Ok(if let Ok(sdist_type) = ext.parse() { Self { dist_type: DistributionType::SDist, metadata: Self::parse_sdist(path, sdist_type)?, python_version: "source".to_string(), } } else { match ext { "egg" => { let parts: Vec<&str> = path .file_stem() .unwrap() .to_str() .unwrap() .split('-') .collect(); let python_version = match parts.as_slice() { [_name, _version, py_ver] => py_ver, _ => "any", }; Self { dist_type: DistributionType::Egg, metadata: Self::parse_egg(path)?, python_version: python_version.to_string(), } } "whl" => { let parts: Vec<&str> = path .file_stem() .unwrap() .to_str() .unwrap() .split('-') .collect(); let python_version = match parts.as_slice() { [_name, _version, py_ver, _abi_tag, _plat_tag] => py_ver, _ => "any", }; Self { dist_type: DistributionType::Wheel, metadata: Self::parse_wheel(path)?, python_version: python_version.to_string(), } } _ => return Err(Error::UnknownDistributionType), } }) } /// Returns distribution type pub fn r#type(&self) -> DistributionType { self.dist_type } /// Returns distribution metadata pub fn metadata(&self) -> &Metadata { &self.metadata } /// Returns the supported Python version tag /// /// For source distributions the version tag is always `source` pub fn python_version(&self) -> &str { &self.python_version } fn parse_sdist(path: &Path, sdist_type: SDistType) -> Result { match sdist_type { SDistType::Zip => Self::parse_zip(path, "PKG-INFO"), SDistType::GzTar => { Self::parse_tar(GzDecoder::new(BufReader::new(fs_err::File::open(path)?))) } #[cfg(feature = "deprecated-formats")] SDistType::Tar => Self::parse_tar(BufReader::new(fs_err::File::open(path)?)), #[cfg(feature = "bzip2")] SDistType::BzTar => { Self::parse_tar(BzDecoder::new(BufReader::new(fs_err::File::open(path)?))) } #[cfg(feature = "xz")] SDistType::XzTar => Self::parse_tar(XzDecoder::new_stream( BufReader::new(fs_err::File::open(path)?), XzStream::new_auto_decoder(u64::MAX, 0).unwrap(), )), } } fn parse_egg(path: &Path) -> Result { Self::parse_zip(path, "EGG-INFO/PKG-INFO") } fn parse_wheel(path: &Path) -> Result { Self::parse_zip(path, ".dist-info/METADATA") } fn parse_tar(reader: R) -> Result { let mut reader = tar::Archive::new(reader); let metadata_file = reader .entries()? .map(|entry| -> Result<_, Error> { let entry = entry?; if entry.path()?.ends_with("PKG-INFO") { Ok(Some(entry)) } else { Ok(None) } }) .find_map(|x| x.transpose()); if let Some(metadata_file) = metadata_file { let mut entry = metadata_file?; let mut buf = Vec::new(); entry.read_to_end(&mut buf)?; Metadata::parse(&buf) } else { Err(Error::MetadataNotFound) } } fn parse_zip(path: &Path, metadata_file_suffix: &str) -> Result { let reader = BufReader::new(fs_err::File::open(path)?); let mut archive = ZipArchive::new(reader)?; let metadata_files: Vec<_> = archive .file_names() .filter(|name| name.ends_with(metadata_file_suffix)) .map(ToString::to_string) .collect(); match metadata_files.as_slice() { [] => Err(Error::MetadataNotFound), [metadata_file] => { let mut buf = Vec::new(); archive.by_name(metadata_file)?.read_to_end(&mut buf)?; Metadata::parse(&buf) } [file1, file2] if file1.ends_with(".egg-info/PKG-INFO") || file2.ends_with(".egg-info/PKG-INFO") => { let mut buf = Vec::new(); archive.by_name(file1)?.read_to_end(&mut buf)?; Metadata::parse(&buf) } _ => { let top_level_files: Vec<_> = metadata_files .iter() .filter(|f| { let path = Path::new(f); path.components().count() == 2 }) .collect(); if top_level_files.len() == 1 { let mut buf = Vec::new(); archive.by_name(top_level_files[0])?.read_to_end(&mut buf)?; return Metadata::parse(&buf); } Err(Error::MultipleMetadataFiles(metadata_files)) } } } } python-pkginfo-0.6.5/src/error.rs000064400000000000000000000015041046102023000150760ustar 00000000000000use std::io; use mailparse::MailParseError; use thiserror::Error; use zip::result::ZipError; /// The error type #[derive(Error, Debug)] pub enum Error { /// I/O error #[error(transparent)] Io(#[from] io::Error), /// mail parse error #[error(transparent)] MailParse(#[from] MailParseError), /// Zip parse error #[error(transparent)] Zip(#[from] ZipError), /// Metadata field not found #[error("metadata field {0} not found")] FieldNotFound(&'static str), /// Unknown distribution type #[error("unknown distribution type")] UnknownDistributionType, /// Metadata file not found #[error("metadata file not found")] MetadataNotFound, /// Multiple metadata files found #[error("found multiple metadata files: {0:?}")] MultipleMetadataFiles(Vec), } python-pkginfo-0.6.5/src/lib.rs000064400000000000000000000002531046102023000145130ustar 00000000000000mod distribution; mod error; mod metadata; pub use crate::distribution::{Distribution, DistributionType}; pub use crate::error::Error; pub use crate::metadata::Metadata; python-pkginfo-0.6.5/src/metadata.rs000064400000000000000000000267421046102023000155400ustar 00000000000000use std::str::FromStr; use mailparse::MailHeaderMap; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::Error; /// Python package metadata #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))] #[derive(Debug, Clone, Default, PartialEq, Eq)] pub struct Metadata { /// Version of the file format; legal values are `1.0`, `1.1`, `1.2`, `2.1` and `2.2`. pub metadata_version: String, /// The name of the distribution. pub name: String, /// A string containing the distribution’s version number. pub version: String, /// A Platform specification describing an operating system supported by the distribution /// which is not listed in the “Operating System” Trove classifiers. #[cfg_attr(feature = "serde", serde(default))] pub platforms: Vec, /// Binary distributions containing a PKG-INFO file will use the Supported-Platform field /// in their metadata to specify the OS and CPU for which the binary distribution was compiled. #[cfg_attr(feature = "serde", serde(default))] pub supported_platforms: Vec, /// A one-line summary of what the distribution does. #[cfg_attr(feature = "serde", serde(default))] pub summary: Option, /// A longer description of the distribution that can run to several paragraphs. #[cfg_attr(feature = "serde", serde(default))] pub description: Option, /// A list of additional keywords, separated by commas, to be used to /// assist searching for the distribution in a larger catalog. #[cfg_attr(feature = "serde", serde(default))] pub keywords: Option, /// A string containing the URL for the distribution’s home page. #[cfg_attr(feature = "serde", serde(default))] pub home_page: Option, /// A string containing the URL from which this version of the distribution can be downloaded. #[cfg_attr(feature = "serde", serde(default))] pub download_url: Option, /// A string containing the author’s name at a minimum; additional contact information may be provided. #[cfg_attr(feature = "serde", serde(default))] pub author: Option, /// A string containing the author’s e-mail address. It can contain a name and e-mail address in the legal forms for a RFC-822 `From:` header. #[cfg_attr(feature = "serde", serde(default))] pub author_email: Option, /// Text indicating the license covering the distribution where the license is not a selection from the `License` Trove classifiers or an SPDX license expression. #[cfg_attr(feature = "serde", serde(default))] pub license: Option, /// An SPDX expression indicating the license covering the distribution. #[cfg_attr(feature = "serde", serde(default))] pub license_expression: Option, /// Paths to files containing the text of the licenses covering the distribution. #[cfg_attr(feature = "serde", serde(default))] pub license_files: Vec, /// Each entry is a string giving a single classification value for the distribution. #[cfg_attr(feature = "serde", serde(default))] pub classifiers: Vec, /// Each entry contains a string naming some other distutils project required by this distribution. #[cfg_attr(feature = "serde", serde(default))] pub requires_dist: Vec, /// Each entry contains a string naming a Distutils project which is contained within this distribution. #[cfg_attr(feature = "serde", serde(default))] pub provides_dist: Vec, /// Each entry contains a string describing a distutils project’s distribution which this distribution renders obsolete, /// meaning that the two projects should not be installed at the same time. #[cfg_attr(feature = "serde", serde(default))] pub obsoletes_dist: Vec, /// A string containing the maintainer’s name at a minimum; additional contact information may be provided. /// /// Note that this field is intended for use when a project is being maintained by someone other than the original author: /// it should be omitted if it is identical to `author`. #[cfg_attr(feature = "serde", serde(default))] pub maintainer: Option, /// A string containing the maintainer’s e-mail address. /// It can contain a name and e-mail address in the legal forms for a RFC-822 `From:` header. /// /// Note that this field is intended for use when a project is being maintained by someone other than the original author: /// it should be omitted if it is identical to `author_email`. #[cfg_attr(feature = "serde", serde(default))] pub maintainer_email: Option, /// This field specifies the Python version(s) that the distribution is guaranteed to be compatible with. #[cfg_attr(feature = "serde", serde(default))] pub requires_python: Option, /// Each entry contains a string describing some dependency in the system that the distribution is to be used. #[cfg_attr(feature = "serde", serde(default))] pub requires_external: Vec, /// A string containing a browsable URL for the project and a label for it, separated by a comma. #[cfg_attr(feature = "serde", serde(default))] pub project_urls: Vec, /// A string containing the name of an optional feature. Must be a valid Python identifier. /// May be used to make a dependency conditional on whether the optional feature has been requested. #[cfg_attr(feature = "serde", serde(default))] pub provides_extras: Vec, /// A string stating the markup syntax (if any) used in the distribution’s description, /// so that tools can intelligently render the description. #[cfg_attr(feature = "serde", serde(default))] pub description_content_type: Option, /// A string containing the name of another core metadata field. #[cfg_attr(feature = "serde", serde(default))] pub dynamic: Vec, } impl Metadata { /// Parse distribution metadata from metadata bytes pub fn parse(content: &[u8]) -> Result { // HACK: trick mailparse to parse as UTF-8 instead of ASCII let mut mail = b"Content-Type: text/plain; charset=utf-8\n".to_vec(); mail.extend_from_slice(content); let msg = mailparse::parse_mail(&mail)?; let headers = msg.get_headers(); let get_first_value = |name| { headers.get_first_header(name).and_then(|header| { match rfc2047_decoder::decode(header.get_value_raw()) { Ok(value) => { if value == "UNKNOWN" { None } else { Some(value) } } Err(_) => None, } }) }; let get_all_values = |name| { let values: Vec = headers .get_all_values(name) .into_iter() .filter(|value| value != "UNKNOWN") .collect(); values }; let metadata_version = headers .get_first_value("Metadata-Version") .ok_or(Error::FieldNotFound("Metadata-Version"))?; let name = headers .get_first_value("Name") .ok_or(Error::FieldNotFound("Name"))?; let version = headers .get_first_value("Version") .ok_or(Error::FieldNotFound("Version"))?; let platforms = get_all_values("Platform"); let supported_platforms = get_all_values("Supported-Platform"); let summary = get_first_value("Summary"); let body = msg.get_body()?; let description = if !body.trim().is_empty() { Some(body) } else { get_first_value("Description") }; let keywords = get_first_value("Keywords"); let home_page = get_first_value("Home-Page"); let download_url = get_first_value("Download-URL"); let author = get_first_value("Author"); let author_email = get_first_value("Author-email"); let license = get_first_value("License"); let license_expression = get_first_value("License-Expression"); let license_files = get_all_values("License-File"); let classifiers = get_all_values("Classifier"); let requires_dist = get_all_values("Requires-Dist"); let provides_dist = get_all_values("Provides-Dist"); let obsoletes_dist = get_all_values("Obsoletes-Dist"); let maintainer = get_first_value("Maintainer"); let maintainer_email = get_first_value("Maintainer-email"); let requires_python = get_first_value("Requires-Python"); let requires_external = get_all_values("Requires-External"); let project_urls = get_all_values("Project-URL"); let provides_extras = get_all_values("Provides-Extra"); let description_content_type = get_first_value("Description-Content-Type"); let dynamic = get_all_values("Dynamic"); Ok(Metadata { metadata_version, name, version, platforms, supported_platforms, summary, description, keywords, home_page, download_url, author, author_email, license, license_expression, license_files, classifiers, requires_dist, provides_dist, obsoletes_dist, maintainer, maintainer_email, requires_python, requires_external, project_urls, provides_extras, description_content_type, dynamic, }) } } impl FromStr for Metadata { type Err = Error; fn from_str(s: &str) -> Result { Metadata::parse(s.as_bytes()) } } #[cfg(test)] mod tests { use super::Metadata; use crate::Error; #[test] fn test_parse_from_str() { let s = "Metadata-Version: 1.0"; let meta: Result = s.parse(); assert!(matches!(meta, Err(Error::FieldNotFound("Name")))); let s = "Metadata-Version: 1.0\nName: asdf"; let meta = Metadata::parse(s.as_bytes()); assert!(matches!(meta, Err(Error::FieldNotFound("Version")))); let s = "Metadata-Version: 1.0\nName: asdf\nVersion: 1.0"; let meta = Metadata::parse(s.as_bytes()).unwrap(); assert_eq!(meta.metadata_version, "1.0"); assert_eq!(meta.name, "asdf"); assert_eq!(meta.version, "1.0"); let s = "Metadata-Version: 1.0\nName: asdf\nVersion: 1.0\nDescription: a Python package"; let meta: Metadata = s.parse().unwrap(); assert_eq!(meta.description.as_deref(), Some("a Python package")); let s = "Metadata-Version: 1.0\nName: asdf\nVersion: 1.0\n\na Python package"; let meta: Metadata = s.parse().unwrap(); assert_eq!(meta.description.as_deref(), Some("a Python package")); let s = "Metadata-Version: 1.0\nName: asdf\nVersion: 1.0\nAuthor: 中文\n\n一个 Python 包"; let meta: Metadata = s.parse().unwrap(); assert_eq!(meta.author.as_deref(), Some("中文")); assert_eq!(meta.description.as_deref(), Some("一个 Python 包")); } #[cfg(feature = "serde")] #[test] fn test_serde_deserialize() { let input = r#"{"metadata_version": "2.3", "name": "example", "version": "1.0.0"}"#; let _metadata: Metadata = serde_json::from_str(input).unwrap(); } } python-pkginfo-0.6.5/tests/fixtures/build-0.4.0-py2.py3-none-any.whl000064400000000000000000000334421046102023000230450ustar 00000000000000PKұRmi"8build/__init__.py[msܶ~?L)6SM/OXmg4Ix$R$O>I5cߑ 3Ng%m=}SѦg[F}sX,6+rJΈ`))[iٓW򶸦D\;k<'+}}}-@=PhzK_yS{d M %~oXs--ow0[] ;%+{|=/=SrSmQ1)yS^-Oۢá)yE6%oD `4%js Z2UlQ0pgFǬٶ$K,^ۡ^qrX77~N kZ߽WŏCP|k#Ts夽\n=J+#Rð釶WofˮA==.LRWt`ꫫE R.K|Q <` Xe!WGTj('ه/g/a9*hSEK ]߶d[}^>#5]A:Ʃ1 |eMJJx&ʺ@V~&?{ &hE6{r۟`Gt(P ׆7 -X-,[ݲ>cAmJ[3RKWxa=˺$ӯ% K@ Y$\'n4d}0 ݲdLFݻ"rO{ i=&KO R@h$o:ʹb!!meՒnEWUr݃{,YXƥ!ؒvKX/\ G/vɴ$?z EW$9ݟ֐%R3ZW0CLR # ̞qǐX@qYsϚ 3 R67o8Z zPg)f=KJ.Oh:3(Ml@`wA,77)wC3 Cx3dph5MW¾BَfÊq :3C0mL"9)@g儢mhH cWWLlWn= i0dD0DIH&=;^*pLzgEoU+"ܠsG!(%kD 4d;i%?o%sFlOt QtR?5,V|DzǚA`(@ɚ!#hp-=j'a:('QaL@l3JZl7^4L6:sF˽/[T9"XI|(VUI94cj%LӡfMII=(yRdWT&WK<I!g!HdUdlbxJKg{@ta7Z鯻Rݷ{SDf=,DPI0PÃo״/XxQ f<[kc5}UO#}Tw@d1㜝ɞH₴iҠP ?$Hˡ2 !{M n \-QOU)ը t՝rӣj%\* pgEiJQK{aImrVd)X "ycŕDŽ 4P@I *GKM>H$8Թ$gհ5BPZ:#3ܭpҘizG)z&s*=@AQ e{ '$[:BAZ0 th:&0@4I %P9 ݷxwHw:z{ah;re*X^ru(p%kyQ.ܴ[,P ?m>;2,eF[t*I+@%I#V +o 0F+٘Jn *R8ʙT}7v`W|P߳FQ}KN\vjz|E 2!Z@(  ^YE.^>44RCV붨C*xܸ QYjpTF|)2Pb ~=='M/4gK,xZ[UPau Y5D~-*K!\p`ҧsus=C/a7ڮAp 0+ʓC(`\TJ]!|d\@lrȒX;d"*|zD# ^@9xxx2?qS4Xx4qJ#K觾ṫŨt`D #j*R)vFYOބ4Vsi|m;$^Y=|7);R-Xb1V0Up4.#qqB[ ]J@ W-: &?Vk.6L2Rw{Ȅ8\Nx<_.Ђf,BybJH! c$dKE*HKBXqKV¦ä ɇfS7a{kⓝr@TǨ2fNCXs9<}l׹\Zbgy"2z |'SpK3GO RD#\+奎ZIrnRy Hlnx/ap!%f|u<ðzГhr@(b5W_Ct^G.]5`k,ԋaг/59)?3HfȦY_}>B)]^yZeCEM^Ʌs0 bG%Ih6 ܾRgN~ fY=_gg-7OAmA*.OK (hph BI^ (VY'Div+cx_2a΋W9p3|[8ع嵲 ;MUS2cm>G I<0~=?ւU˜3!.F8V<3zژ f_-ϱ{u2^Ok\ Jbvm|Җ$007? RP6e<:8k nj\H} excj&bC -ty[X9YsC]\Lx||p#|ݤ@D[9RxҒo^nM꯳W,e6 \ 3IM!xϸ>,5G&չzr羿N ?s {y`=7--hc@'piOGoo^дQM胂cMw'ϼG}x &PKRj - build/__main__.pyYo_A$prmWe"nM- K[TI* ?$r>{$r8p>c?'YArV)z4ZI%Yjt#iԤkfFn8:ojUȮ}2/2/\r׻ Me|dJ1՘|n(/`wlXU:3?~w5|v}&Pp)oІUiyoe8!䘬؝VDprx)nA,˫ l8#Ȁ$gf'tE2laa-n *-US.nȼ&SU|ͧ v[GhZ:%5&J˅5[1,>f^FpeB&?l%)*dF?_}Ȫ{*]FLZ4\o#@G!JWBns[Rګ.IP\׵W?E[)DIgVNg^vUёy^"Psb JBNWVUuP8 n$;т_Ȱ[ϵ?4:E_]}zuNj FA2T@}KΊ } NzbXJ AǢ7aY]Q2q۔  PQI'1'6C\ KHhdm٠~*S.Z9øչ=X.'@#Lv@mV:J}No-Qli7pp*@Ze7p)JCx4~oQ,Av?tIp &J$in+[-I*uHعݾ h-N nY Z|5,{, ! }Z[ ^(ܨ5T;p+Cvsa0W'X"SE1@֢' c pT"Ip 'vhZϺdX̓\ib#(P̮eC_^Ɲ}>εu|jx/*9LvSE4I .%Xj`J>ۤ}&teBq}( Ni'eNNkF߂̃w5ҵ>0{d.r7ypdW9a*lG8,S/="0ITz&m'V,R{I dq ĹoQ4G+7XhHFfB=v#FL8Z$kv`q_@54Ѿ~-~Ȣ^Ͻv-$˝7MDT"^ Ӽܷom?d@O' oyxx Nl;16}:B2| @ AvMŤ-pM0JBU8|J[L\Q<;3Q7XQtMI;a%]3n/Drx-m^RԛUH׶EGPgີg7y@9&܅UH/_EP7PAմںy޴׌:W枑>x<ӐCN^BU6!H0ZAX3 mU۠p~< ):ZپС% ;G?oa2jIJ2zY夳C']& Av6 &0%lN͕nc2@{kvukfsx\W-+IF&oOZcJ>AL3 9ԖQ#u"cPKRQ3 ' build/env.pyZKsFWJ17ц8*G=T(̀_ iuyt'''7,Eytg! "M*JLYYTEyy"MC>-.wiޔUsَ1.iʭHlCIꚾ*&o/^*ڤ|>Jy.e]R*  &;y%!e5 ¸HTRA?R$̸4!dKm"X3?+|b'X$Yi<ב)ԪDd=$RAX\G a ۄ[q6[B1[;DlPsT$Hu)n$,H)?cN=M|t]\ c}acS~x}:V5y7)D܀[@7NNr ?o T?2V/ی UB#'J6ΩB8嫟@-\_wzt(#-O9"9{1D`YtXCƮli\9E02vJ & "d+$<19 ȲȡgŞKhA^4g*HGS^Llp'Qb)SlSPB6̝@*;#1vsFi~`GSZ`Ϳ:d`+>ԗMg嘴T*wB,3EÞ4l6d-&F%Z'-b_XlC6L(7MT1:Ra v( +6u$ T\֩"-kIE@}cXA7’B=82/m Jd*,:`'2EMUQ?>(a3yfH IMuՃ,nAur)P*(U7uj>)R_jw"/)1*%tU{w85ٝZœ!vtp~;bd %ďDkYƆa'$dkOͷ(VbҽMb#SVuN 0-nÆhEhЍnU҉pLL6* |6L̩_<%#:go?[ݾ# ҪCñ,?|Msҭ e];vqZ4?]V570'{,+'n8eNg2N-="``qҷGY3/WT:9"O;U ,C)&oκ5 l`.=*+'0?(R7/w)ֆZ_Y}sJdg=~f>&g@3R+t6DQY*e* W%,&|Ϙ? Ƈ#J,xLA7䵩Yzi1] e%rhD@5֯1=VQ ^5'+t!EI_9 "V&BBQ%l>˹6kH3NY˿'d.Y N{+MyiaY's||JuD!!V߯k ,_kVOQڮMyxPO+ eFDXu˫m*ZH T2%|:: K?v ׹Ac>HdoQ=71(7JiOLa6 6]<̏k}~&*t|$< aЛP4s.I!4SS\y+zxHܣP]8zBr֎=[ G؀wnP4[O]M)z:I/7({]׿Ʊpq,quCSڮ3U:mUҕHMͭ/[Ћ>2B'igE30V߯hs#:S`{ vWA?NDDԑap CƼƿW'nPKRbuild/py.typedPKR7VYbuild-0.4.0.dist-info/LICENSEUR͎0)FvZUUMb!AY$ q}u&VBf< {h߾s@<|ڏն_Gmi原he޺ fAw1cjp01{ .  dhƻ}8p {WYxPt4]ЁPp1#$nv@oOpqaa8T4iz7r)8 D +Y<0a%֓6B-,W[(-|y,X2'$["兂L,BPU^/ leD&6B9/$0X1DΘZ#}Yj HMXA`Y6ck/I $j+BRGil J2&1lU h"6 N-cK(rXhSՍ(y LFsY <{9PIpuoZR2*i4PKRo䯸2build-0.4.0.dist-info/METADATAWR6Sh[8!f;Y`vl+YJr7}>E_Gل&^)9w~stCߩLuq]F(O/>* C%(JĠ$$N,_Nn.~{W\1J G&/iZXP㝳 ,GXO`ӿp,X(7QdUYe] Ddl~%i* !1M1'f*U1mȉl(׺]^лTrFSx?"EDyYeS #pCDoS}ƈG#7DlTb:@?WLQ;poװ]kX 쩟P(VZJ(~. }4}*SeP ; O/NO6Q[67wV4hi|wҰ<\B I}'m BTp `&Ew3׮h1e*©Yp`vRbh >ڲ-gR8}4D6ei< Ccca;8]LAӮ2,g%Xd^kW̜tyݾo>TS.tШ1I3,7$Ilo{55! F-  $+L)\9Ka',_$I2щc'2/Ct#^umۺ0@0 99mC~6B-˅v, ٢m\LüΕYa3ƥɃNa;[Nb-nF9n^b(RKIǞ;bϻAmxV%x (bN ooof& %Dت7B;gI *R5Vr2I^KN(>aۢw!eu7Ţu4z`O MÄ"LGTA8OJ%ԷUj9)z)Ʋ̞T5X`ǴO+_H)"ypk)llOZC;b{ôCл2ٷ_$)) mAC<#HpCWg˾|oK=mݏFs4<9<^^ q}PKRȝ_nbuild-0.4.0.dist-info/WHEEL HM K-*ϳR03rOK-J,/RHJ,./Q0363 /, (-JLR()*M ILR(4KM̫#DPKR!Km&build-0.4.0.dist-info/entry_points.txtN+I/N.,()*,(JM.M*IQUz񹉙yVy%Ey%\\zEy\DPKR=k##build-0.4.0.dist-info/top_level.txtK*IPKRPA >build-0.4.0.dist-info/RECORDuI0},^ A 1Zӷ WC?,C,s^#5]aEq {zϹsB(NW)ϻu>ͭ7̓*;CIol_P̧6u 0\ /-ulAe )OTBrH ;FSYkp勵s+"tH>2NH䤘0g3h51+ًHC85c-#5;dnE~ «دQL~FM:Ykj,zY"PCUSfUYj*~bݶ nf7ֵΑ)+vAllm,w~-pw8|ؼfvmn31#-6 dw=/ٕnj R[^EZ$$7@X%Wj1build-0.4.0.dist-info/RECORDPK  4python-pkginfo-0.6.5/tests/fixtures/build-0.4.0-py3.9.egg000064400000000000000000000655241046102023000207370ustar 00000000000000PKR܆ w EGG-INFO/PKG-INFOVn6}W"ݶ)"ɗ HIP$CXXbMZrW:[EBax̅s{,fy6\~s2 aVpwV]vn,c  r)109 {GhQw~Uz9IBiaSC¦if"%%Pby?Llzw.CHɂ3p 6-f~ /sԡWX6fs&7ԤZgoR"\]w{pp4< 'P7o]K󭱥9rJfcv7@Y=>̕Li.38ۃ DDL+SSÒ3<K\%䰻 0M}Db|wZF/{ m <'OWxz/.])1\r{HP؊̨BGQXgE՟L" GcjCL (Ps:e\DvtN}\*ra)ި r;nh͘n-YJe#!4cNZEn +U&7/}%+7.jp_ Pz"?]_|]_ݍn&X f s,rCiNkIj~B6@L\.\~R-}wG;j vÝ5~Yc(w;k؍%ɨ<'7B5Fxwk~sΟݫy 2?-^AKGj), 1B[ɿPKR3`EGG-INFO/SOURCES.txtu 0}ߥ3F)^*ס&cM'c:"RwM9׻Zg=[l\Ɖc%Y28e}i@ cP֮AQ:nd@1pR܇mt~ݲ0׵0xk?ILL6nF%p PKR2EGG-INFO/dependency_links.txtPKR!KmEGG-INFO/entry_points.txtN+I/N.,()*,(JM.M*IQUz񹉙yVy%Ey%\\zEy\DPKR2EGG-INFO/not-zip-safePKR9p EGG-INFO/requires.txtun0E =@#pd6in݌sYG oع(#N5+P"o.^02<;Y8 dtaDwg Q9]S^цVHYUEhiמU2mq]huˍ1 鞲ĝɍq Kp,(n%ߕ>yEQVh6/a1,JK: x$~V蒋cvTfa f;G mQ<&1t5p7оPKR=k#EGG-INFO/top_level.txtK*IPKRmi"8build/__init__.py[msܶ~?L)6SM/OXmg4Ix$R$O>I5cߑ 3Ng%m=}SѦg[F}sX,6+rJΈ`))[iٓW򶸦D\;k<'+}}}-@=PhzK_yS{d M %~oXs--ow0[] ;%+{|=/=SrSmQ1)yS^-Oۢá)yE6%oD `4%js Z2UlQ0pgFǬٶ$K,^ۡ^qrX77~N kZ߽WŏCP|k#Ts夽\n=J+#Rð釶WofˮA==.LRWt`ꫫE R.K|Q <` Xe!WGTj('ه/g/a9*hSEK ]߶d[}^>#5]A:Ʃ1 |eMJJx&ʺ@V~&?{ &hE6{r۟`Gt(P ׆7 -X-,[ݲ>cAmJ[3RKWxa=˺$ӯ% K@ Y$\'n4d}0 ݲdLFݻ"rO{ i=&KO R@h$o:ʹb!!meՒnEWUr݃{,YXƥ!ؒvKX/\ G/vɴ$?z EW$9ݟ֐%R3ZW0CLR # ̞qǐX@qYsϚ 3 R67o8Z zPg)f=KJ.Oh:3(Ml@`wA,77)wC3 Cx3dph5MW¾BَfÊq :3C0mL"9)@g儢mhH cWWLlWn= i0dD0DIH&=;^*pLzgEoU+"ܠsG!(%kD 4d;i%?o%sFlOt QtR?5,V|DzǚA`(@ɚ!#hp-=j'a:('QaL@l3JZl7^4L6:sF˽/[T9"XI|(VUI94cj%LӡfMII=(yRdWT&WK<I!g!HdUdlbxJKg{@ta7Z鯻Rݷ{SDf=,DPI0PÃo״/XxQ f<[kc5}UO#}Tw@d1㜝ɞH₴iҠP ?$Hˡ2 !{M n \-QOU)ը t՝rӣj%\* pgEiJQK{aImrVd)X "ycŕDŽ 4P@I *GKM>H$8Թ$gհ5BPZ:#3ܭpҘizG)z&s*=@AQ e{ '$[:BAZ0 th:&0@4I %P9 ݷxwHw:z{ah;re*X^ru(p%kyQ.ܴ[,P ?m>;2,eF[t*I+@%I#V +o 0F+٘Jn *R8ʙT}7v`W|P߳FQ}KN\vjz|E 2!Z@(  ^YE.^>44RCV붨C*xܸ QYjpTF|)2Pb ~=='M/4gK,xZ[UPau Y5D~-*K!\p`ҧsus=C/a7ڮAp 0+ʓC(`\TJ]!|d\@lrȒX;d"*|zD# ^@9xxx2?qS4Xx4qJ#K觾ṫŨt`D #j*R)vFYOބ4Vsi|m;$^Y=|7);R-Xb1V0Up4.#qqB[ ]J@ W-: &?Vk.6L2Rw{Ȅ8\Nx<_.Ђf,BybJH! c$dKE*HKBXqKV¦ä ɇfS7a{kⓝr@TǨ2fNCXs9<}l׹\Zbgy"2z |'SpK3GO RD#\+奎ZIrnRy Hlnx/ap!%f|u<ðzГhr@(b5W_Ct^G.]5`k,ԋaг/59)?3HfȦY_}>B)]^yZeCEM^Ʌs0 bG%Ih6 ܾRgN~ fY=_gg-7OAmA*.OK (hph BI^ (VY'Div+cx_2a΋W9p3|[8ع嵲 ;MUS2cm>G I<0~=?ւU˜3!.F8V<3zژ f_-ϱ{u2^Ok\ Jbvm|Җ$007? RP6e<:8k nj\H} excj&bC -ty[X9YsC]\Lx||p#|ݤ@D[9RxҒo^nM꯳W,e6 \ 3IM!xϸ>,5G&չzr羿N ?s {y`=7--hc@'piOGoo^дQM胂cMw'ϼG}x &PKRj - build/__main__.pyYo_A$prmWe"nM- K[TI* ?$r>{$r8p>c?'YArV)z4ZI%Yjt#iԤkfFn8:ojUȮ}2/2/\r׻ Me|dJ1՘|n(/`wlXU:3?~w5|v}&Pp)oІUiyoe8!䘬؝VDprx)nA,˫ l8#Ȁ$gf'tE2laa-n *-US.nȼ&SU|ͧ v[GhZ:%5&J˅5[1,>f^FpeB&?l%)*dF?_}Ȫ{*]FLZ4\o#@G!JWBns[Rګ.IP\׵W?E[)DIgVNg^vUёy^"Psb JBNWVUuP8 n$;т_Ȱ[ϵ?4:E_]}zuNj FA2T@}KΊ } NzbXJ AǢ7aY]Q2q۔  PQI'1'6C\ KHhdm٠~*S.Z9øչ=X.'@#Lv@mV:J}No-Qli7pp*@Ze7p)JCx4~oQ,Av?tIp &J$in+[-I*uHعݾ h-N nY Z|5,{, ! }Z[ ^(ܨ5T;p+Cvsa0W'X"SE1@֢' c pT"Ip 'vhZϺdX̓\ib#(P̮eC_^Ɲ}>εu|jx/*9LvSE4I .%Xj`J>ۤ}&teBq}( Ni'eNNkF߂̃w5ҵ>0{d.r7ypdW9a*lG8,S/="0ITz&m'V,R{I dq ĹoQ4G+7XhHFfB=v#FL8Z$kv`q_@54Ѿ~-~Ȣ^Ͻv-$˝7MDT"^ Ӽܷom?d@O' oyxx Nl;16}:B2| @ AvMŤ-pM0JBU8|J[L\Q<;3Q7XQtMI;a%]3n/Drx-m^RԛUH׶EGPgີg7y@9&܅UH/_EP7PAմںy޴׌:W枑>x<ӐCN^BU6!H0ZAX3 mU۠p~< ):ZپС% ;G?oa2jIJ2zY夳C']& Av6 &0%lN͕nc2@{kvukfsx\W-+IF&oOZcJ>AL3 9ԖQ#u"cPKRQ3 ' build/env.pyZKsFWJ17ц8*G=T(̀_ iuyt'''7,Eytg! "M*JLYYTEyy"MC>-.wiޔUsَ1.iʭHlCIꚾ*&o/^*ڤ|>Jy.e]R*  &;y%!e5 ¸HTRA?R$̸4!dKm"X3?+|b'X$Yi<ב)ԪDd=$RAX\G a ۄ[q6[B1[;DlPsT$Hu)n$,H)?cN=M|t]\ c}acS~x}:V5y7)D܀[@7NNr ?o T?2V/ی UB#'J6ΩB8嫟@-\_wzt(#-O9"9{1D`YtXCƮli\9E02vJ & "d+$<19 ȲȡgŞKhA^4g*HGS^Llp'Qb)SlSPB6̝@*;#1vsFi~`GSZ`Ϳ:d`+>ԗMg嘴T*wB,3EÞ4l6d-&F%Z'-b_XlC6L(7MT1:Ra v( +6u$ T\֩"-kIE@}cXA7’B=82/m Jd*,:`'2EMUQ?>(a3yfH IMuՃ,nAur)P*(U7uj>)R_jw"/)1*%tU{w85ٝZœ!vtp~;bd %ďDkYƆa'$dkOͷ(VbҽMb#SVuN 0-nÆhEhЍnU҉pLL6* |6L̩_<%#:go?[ݾ# ҪCñ,?|Msҭ e];vqZ4?]V570'{,+'n8eNg2N-="``qҷGY3/WT:9"O;U ,C)&oκ5 l`.=*+'0?(R7/w)ֆZ_Y}sJdg=~f>&g@3R+t6DQY*e* W%,&|Ϙ? Ƈ#J,xLA7䵩Yzi1] e%rhD@5֯1=VQ ^5'+t!EI_9 "V&BBQ%l>˹6kH3NY˿'d.Y N{+MyiaY's||JuD!!V߯k ,_kVOQڮMyxPO+ eFDXu˫m*ZH T2%|:: K?v ׹Ac>HdoQ=71(7JiOLa6 6]<̏k}~&*t|$< aЛP4s.I!4SS\y+zxHܣP]8zBr֎=[ G؀wnP4[O]M)z:I/7({]׿Ʊpq,quCSڮ3U:mUҕHMͭ/[Ћ>2B'igE30V߯hs#:S`{ vWA?NDDԑap CƼƿW'nPKRbuild/py.typedPKR;8<0)build/__pycache__/__init__.cpython-39.pycZou]K:N:e;>N^r$KuMս=n)K.O"E&@NȿM H S(--Ph?h? <.$̾y{fق1~IQIS+™Ÿʵjt,5ce蚵tY9A׼(4g}QlZ9k9o7KVy:\ǭEky:\'S֩沵L}i X+t=c\,QG,SAP}bý5( e+7l 3~-\Na^$BusR}Yu_4jĞ37IEmp|߶#bsuq!&!ٚ'N@syS"G=lWY"H?ASkU%$H\N!8l̬h4Q̐u(璯LrT^3`:[lH:?ic@i0]߬y8F28S D*K"&uCPG?h Dg=R' Tz^{P˙M#|0&]~mGFxF  f֨Dܳ40f7͊X&p'dr.T=?Nf\h S#ϣumYq, -}6hE`&4\p{8O#lbUK(.ߠ_@ X4Fk)-2ճ9dW(uCy g fNfx\|jfgeo)-SWz} ؊I]ҲVqy=,~~/ݲYuӃ\pKZ@ o`wi{En !mXfL7Go\PG n@C4Mph`oGN ˌ-6{kj^\ fêh+ӂE%Í*62:xub>=`*Xc2cEb]56*"!hkCa;B^BZY ORʛ_-q-ߑS=Qc_YoxU_ [owWC8'c+rk?LG~m'SAk =+ 9|Q^O`"PM G!Ǫ#7#Hq!%U"ߪ^+pܖbqFi/h5POy0R5Qh옎! /1Bz8D:[*=oBzQ2"Z`s,Ӗ4]UY jS J}{%}&VnW"EphJ{P%A Y$m~[˽Uby0>o>]W+Q/Տu1=37z^J?ws@m:f;e,o@8zZ&/mޠ67/,+%'N( :|h O[/a+j+‹ִp$=1*/#tFSNɷЍQHC`^t _F.ǩz&5%#cC1Ep=A4^GD`H|%M=(dLt$4"E^^>k )P3ʘ&5 x(dHA h-%}í%b8s11xΉP~k"1;>e'5EtI3; @p|.Bx 1˼꥗$=#mk |r8 踏{b &3oOK0O@.`bL%ʚ<Za6bO,y:;>G*֫;t_#r ث0q,9)dZT6 PTAC"6[0uz K^}-W>scz8kGƈa'â{iٶh$1Uڤנ&JM.iB!fl#-35g'ZY|QL8\̷_C|zՋl]` jA+˪XmAY@iӘq`0Jfw+Q2+&;P:\=@ocn}E~BelY9xT 5GJKkCw8W/N oխצ&D$ޞ0"JMC>;-`;b̝3޼<ɠHGw }솤@bf;mLxp0ۋDE25{ܚ3aL@JHS@ŀxρRXohcz)܉9瑉{N8Q@l Y&)4o4L*6 aQDu*;dV6fikMSP(Nu|I6taHLT非T|0 1Q|%~ c)o d U@N8T* <~xĻ}~䷷tjf JfęGeS9&\7%L6c C-z ^+7b'ҶN(s4{zBGvKu6cC2L6C_;PIj`EW !P1y IvS8Z:fΧX*x[يy| wc` a.)4\>r~۴2s0;DO|T H?vͼzB``Pya{Q@$obޞQ D6Q0+̤b#?h64ȃ~:9h|![{ 4DS䗕4YyB.M*ѴYU@Pdg&~c +(5{dka&!qМo}=ZP!a̓!^3 vH  CֶߘBIB/[Ow2 . x0nߏ c7QgC~HA3eX)^O#$cE:;cP$zao$L`H#orA;_6Ӭcx…y_ Jo&\&jv w9rw*0-(Yr[< ^OkD@=kpQKtC{tJJ0O t *2 iMߘ>GjtVR&a>1R.rtrX<(iN64ѿ(&'bB- LIݎSfnR(7XPSYI-slULf'҆pjuFwahg |c!;l}|Zz]*{JQ0;PjGW)*g_P_5:sYO)v4#y($=V)XFâ}XK6'`x6Ov)?<ãoYR#߲NkGzœFp2|3z O"#1<9}t' ^u*SbOO:;1!,2K3/(PKR?X} )build/__pycache__/__main__.cpython-39.pycXMp BcK_DvR3ʲqv8NGi*O]Q ^,-&;0)f:NǜzkڛiނHř`?~ӶoR)~<“\R*Tm**ID5Wop 6]Z n1];r’[ wf8; o9ιs;qGݣr\EU$tWu=%W48Bߨ zXuONѧM-4-x?M:GaġУtjEctǡ =AOBY,=u| +4EJ~F+>J#dEM-DjG5FLudvԺ!Z6j,5]~#XZx'.uvEn/Ӳ>h_~ DDQ I8lm~=`z &VS=(kKM6Rk67)|WDž=abZF"h${iAr45bh!KRG|/& "ũ=hq~eoRJdzŪK/g$O^ZxgidڎBtVK*? G`CJNR:2:2dtmBU3:Dv8~0c aXqͦS0(l"g!߹s[NC'LkYGk1e0XZ~֍[RB~ǏBQ16XǡHu' :şQq OyD03*jL>*<ˤJWyPݩ^u&>%O|(ʇzj'PUW.qHc<%IH3,j-#+FY,b-~hW2ޫm\n5\]8*[}k3Geعќ9"<7yCt_+t xntSiA#l+wծ]>GJ؃pQx7n]Vk Hw'JjVx4DMwA!XqҀ]31j!Cm#%kff/)L \s; ?%khCFrfhT9+EWpw=-~j^4NCEXTiU(~ hZksSd;_f{$BptTMm8_,$w{n 3wqJW "_3Pqعu`YWK@iU`75@($ow ZZmo[Uz&LDŽ^Kq c3dUJa{Hav͆% O'bnA_QL7X vֆoB5>='fԼWSbz0GAYq$R9aWvU+gՎvZmS}5[b:ԍy#&d 9B:䅯LJ$wk,08è\-)W /~5r'6#HnV` yIy+;`BβsARqu6!G` @&IZlV``|N۱ as1>Ǔ}03^!\SѠ;0Pz`U `n"͐Nbあs cJF;j5#y΅W?zff@wEq'I+l4kA2UĴ kϺD&ZZɶ:0fS/T4v1ɑ-fkC-ls}CU./~]0b]{{ŝ zc-05Tg'kx: WPvxzrk$lPgaԖz%u˓5l]6?=,ag 脤vKQMF)ʏC$ ܲ}]hvRK ,Bí*& j '΂9B 2+hPh_N],Jj@d :l3"  Acb*Бݑufݩz"u7+Ɲ7++=o-glI<9&zlb'$}Ez͟w\{G|ӵ.<\^^ p_Ol١Ө>T}Zه\ӕ* %%l6wE7~ʊEP%#EdTK YOBUMΈH:AH2*A7`{%\̹ɵ5sS(?ZoME>ׄva=ʺffb*njJ]Ɔ0Zاҋz7F!^/t,͍5dc-ڜ0_+ǐ"f֝;[{wx.JaH,_@8#:|ȇBJ~ _u*rs^%|yu}޿V.D;v*K,AEfw#mya:b,RHZ GI s飴#µN3/bfϸ+))B(ٵLOx61_䊏78?TV -lPE4 XĢz!(PKRL"Jk"$build/__pycache__/env.cpython-39.pycYsFvGk0S(+6kGfDJWhl)Ū,͵ NcH`8LK*^R{T 䤪rL尕|CB4}{ gv$߯''$ߥS~~S"IT$J"OْST-U<5KOų`Ӱ ,ZEx*?c\SmYk֯XΚy`-R\F%ZWU"˴p(#֬+AjF uHqY_~&+N7!Sٺc)%w%o  "-}%ђ Lheh)c-xx&MWmA¡ ¶\*ŗ.$X]zߥ2<5:H+GuN@M ={Q؂Fjv5caW(*IfwpwNV.sv[nb|^8D鴡A!@RUN݈\fae:ھ˝FˉJP`;uDu(\ tCBW(U2N H A1̎(8?0u" cMӉL~wMfhnd^>Bt\Gθ׷&V7}0  4j~-Eb]E;0:mlo-woV:IiDu$TWT <2)pCֽ9YVbX,%(l=֫Ѻ:Nؘ&hvTM6{máLHY3;kv=HlW:$CJxsB>{A8Rx:y 9[6ߺXK=JCɜok 9/{(?zVӕgU*I1/c+V?ilf+ Uq=Dt(P[ʿOXvZD=~6V>\,^hOz2g;DTn|cmmuF7)|SILt>FRKd^6~S4!9|FDdJCC)z' :(DTxa#=/@YT,V5s" ޾ȅjz?4P\a=s絨9D_ j`mzMkU%Qvp(G.JVM⑂H}K;FIe-`-!NdٰHkShIq{qCl ִ0g怛grIY^uER&_*Ć:EjIBB:=::!IC|\ OoBqw,#<ecQ|#Mzg -omvnТDg`lAfR/{7.,]a:mA : oнiق<4m> 8.̈P0xB[q3f3зt %)YӺ;Ұ2fBgl<9<~NC-%!3;znZuM#ag#-<paߜ&0S%\eQ ewI<"b7ykD*{K=>oO_㷦y^VP7az/Bs_?/䁌! rBЍ|DE^(D 7Ẕ?_)cP$k-lΜZƫUK|P>!{F_᳃JOIwe.=*ǫ6<`Q-  k3$ טuZ@$w4aǼaKM6wۆHrk݄]{z~Eau 3i@F7$C&0k2>D})+ ^l*ݣܗL)<o=AOQGˍL4 1@𝸒X6&%Vk[P,a?G3'O-÷ʇ|]X-'TxOv33 OeKDU*X"i-f?!B|zH(D}r׵GЄpA ĩ`|+6odMS:.,ҡF-C_دhپ7zz?? F`4Ag a"RC4;2&"8avяuw_c JF?ĵ/?v3/HHLڇJ}w??x/oo\ߩOq6y} 23B4֭&*r*2Z2& бņC)J&*k9k28G]aVٵNRxU608݈~xGЂe[ޘ=Q 6 9á\nw Vvy=N0E]֪N*;ZYZf-/|i4ůZ46RQ.|C*ϓ+P&L]ܩD'hSry+{rT*%@P̱>߀8(b .Dto2@{ V*(pl'Ee0[k*x?؍ǫ{~1Ku~=Liޜ 0SӶ|CM#Ea\' ojSnw-mw$zI }{OϞ#"|axS&`/"by .H ?&/iYEbO?A>@[bSr\i E.!/;?02?PKR܆ w EGG-INFO/PKG-INFOPKR3`<EGG-INFO/SOURCES.txtPKR2EGG-INFO/dependency_links.txtPKR!KmMEGG-INFO/entry_points.txtPKR2EGG-INFO/not-zip-safePKR9p EGG-INFO/requires.txtPKR=k#EEGG-INFO/top_level.txtPKRmi"8build/__init__.pyPKRj - build/__main__.pyPKR7:].!build/_compat.pyPKRQ3 ' `#build/env.pyPKR/build/py.typedPKR;8<0)/build/__pycache__/__init__.cpython-39.pycPKR?X} )uFbuild/__pycache__/__main__.cpython-39.pycPKR- p(Sbuild/__pycache__/_compat.cpython-39.pycPKRL"Jk"$Vbuild/__pycache__/env.cpython-39.pycPKefpython-pkginfo-0.6.5/tests/fixtures/build-0.4.0.tar000064400000000000000000002640001046102023000200710ustar 00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1622691171.2277687 build-0.4.0/0000777000175000017500000000000000000000000014515 5ustar00codespacecodespace00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1622691142.0 build-0.4.0/LICENSE0000666000175000017500000000213100000000000015517 0ustar00codespacecodespace00000000000000Copyright © 2019 Filipe Laíns Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1622691205.8282268 build-0.4.0/PKG-INFO0000666000175000017500000000556700000000000015627 0ustar00codespacecodespace00000000000000Metadata-Version: 2.1 Name: build Version: 0.4.0 Summary: A simple, correct PEP517 package builder Home-page: UNKNOWN Author: Filipe Laíns Author-email: lains@riseup.net License: MIT Project-URL: homepage, https://github.com/pypa/build Project-URL: changelog, https://pypa-build.readthedocs.io/en/stable/changelog.html Description: # build [![CI check](https://github.com/pypa/build/workflows/check/badge.svg)](https://github.com/pypa/build/actions) [![CI test](https://github.com/pypa/build/actions/workflows/test.yml/badge.svg)](https://github.com/pypa/build/actions/workflows/test.yml) [![codecov](https://codecov.io/gh/pypa/build/branch/main/graph/badge.svg)](https://codecov.io/gh/pypa/build) [![Documentation Status](https://readthedocs.org/projects/pypa-build/badge/?version=latest)](https://pypa-build.readthedocs.io/en/latest/?badge=latest) [![PyPI version](https://badge.fury.io/py/build.svg)](https://pypi.org/project/build/) [![Discord](https://img.shields.io/discord/803025117553754132?label=Discord%20chat%20%23build&style=flat-square)](https://discord.gg/pypa) A simple, correct PEP517 package builder. See the [documentation](https://pypa-build.readthedocs.io/en/latest/) for more information. ### Installation `build` can be installed via `pip` or an equivalent via: ```console $ pip install build ``` ### Usage ```console $ python -m build ``` This will build the package in an isolated environment, generating a source-distribution and wheel in the directory `dist/`. See the [documentation](https://pypa-build.readthedocs.io/en/latest/) for full information. ### Code of Conduct Everyone interacting in the build's codebase, issue trackers, chat rooms, and mailing lists is expected to follow the [PSF Code of Conduct]. [psf code of conduct]: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md Platform: UNKNOWN Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7 Description-Content-Type: text/markdown Provides-Extra: docs Provides-Extra: test Provides-Extra: typing Provides-Extra: virtualenv ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1622691142.0 build-0.4.0/README.md0000666000175000017500000000274000000000000015777 0ustar00codespacecodespace00000000000000# build [![CI check](https://github.com/pypa/build/workflows/check/badge.svg)](https://github.com/pypa/build/actions) [![CI test](https://github.com/pypa/build/actions/workflows/test.yml/badge.svg)](https://github.com/pypa/build/actions/workflows/test.yml) [![codecov](https://codecov.io/gh/pypa/build/branch/main/graph/badge.svg)](https://codecov.io/gh/pypa/build) [![Documentation Status](https://readthedocs.org/projects/pypa-build/badge/?version=latest)](https://pypa-build.readthedocs.io/en/latest/?badge=latest) [![PyPI version](https://badge.fury.io/py/build.svg)](https://pypi.org/project/build/) [![Discord](https://img.shields.io/discord/803025117553754132?label=Discord%20chat%20%23build&style=flat-square)](https://discord.gg/pypa) A simple, correct PEP517 package builder. See the [documentation](https://pypa-build.readthedocs.io/en/latest/) for more information. ### Installation `build` can be installed via `pip` or an equivalent via: ```console $ pip install build ``` ### Usage ```console $ python -m build ``` This will build the package in an isolated environment, generating a source-distribution and wheel in the directory `dist/`. See the [documentation](https://pypa-build.readthedocs.io/en/latest/) for full information. ### Code of Conduct Everyone interacting in the build's codebase, issue trackers, chat rooms, and mailing lists is expected to follow the [PSF Code of Conduct]. [psf code of conduct]: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1622691142.0 build-0.4.0/pyproject.toml0000666000175000017500000000062700000000000017436 0ustar00codespacecodespace00000000000000[build-system] requires = ['setuptools >= 40.8.0', 'wheel'] build-backend = 'setuptools.build_meta' [tool.black] line-length = 127 skip-string-normalization = true target-version = ['py38', 'py37', 'py36', 'py35', 'py27'] [tool.isort] profile = "black" lines_between_types = 1 lines_after_imports = 2 line_length = 127 known_first_party = "build" skip = [] # "build" is included in the default skip list ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1622691205.8282268 build-0.4.0/setup.cfg0000666000175000017500000000453200000000000016342 0ustar00codespacecodespace00000000000000[metadata] name = build version = 0.4.0 description = A simple, correct PEP517 package builder long_description = file: README.md long_description_content_type = text/markdown author = Filipe Laíns author_email = lains@riseup.net license = MIT license_file = LICENSE classifiers = License :: OSI Approved :: MIT License Programming Language :: Python :: 2 Programming Language :: Python :: 2.7 Programming Language :: Python :: 3 Programming Language :: Python :: 3.5 Programming Language :: Python :: 3.6 Programming Language :: Python :: 3.7 Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 Programming Language :: Python :: Implementation :: CPython Programming Language :: Python :: Implementation :: PyPy project_urls = homepage = https://github.com/pypa/build changelog = https://pypa-build.readthedocs.io/en/stable/changelog.html [options] packages = find: install_requires = packaging>=19.0 pep517>=0.9.1 toml>=0.10.0 colorama;os_name == "nt" # not actually a runtime dependency, only supplied as there is not "recomended dependency" support importlib-metadata>=0.22;python_version < "3.8" typing>=3.5.3.0;python_version < "3" virtualenv>=20.0.35;python_version < "3" python_requires = >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* package_dir = =src [options.entry_points] console_scripts = pyproject-build = build.__main__:entrypoint pipx.run = build = build.__main__:entrypoint [options.extras_require] docs = furo>=2020.11.19b18 sphinx~=3.0 sphinx-argparse-cli>=1.5 sphinx-autodoc-typehints>=1.10 test = filelock>=3 pytest>=4 pytest-cov>=2 pytest-mock>=2 pytest-xdist>=1.34 typing = mypy==0.800 typing-extensions>=3.7.4.3 virtualenv = virtualenv>=20.0.35 [options.package_data] build = py.typed [options.packages.find] where = src [bdist_wheel] universal = 1 [tool:pytest] junit_family = xunit2 norecursedirs = tests/integration/* markers = isolated [flake8] max-line-length = 127 max-complexity = 10 extend-ignore = E203 [mypy] ignore_missing_imports = True strict = True [coverage:run] omit = setup.py *bin/pyproject-build *bin\pyproject-build.exe [coverage:report] exclude_lines = \#\s*pragma: no cover ^\s*raise NotImplementedError\b [coverage:paths] source = src */site-packages *\site-packages [coverage:html] show_contexts = true [egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1622691142.0 build-0.4.0/setup.py0000666000175000017500000000004700000000000016230 0ustar00codespacecodespace00000000000000from setuptools import setup setup() ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1622691171.2277687 build-0.4.0/src/0000777000175000017500000000000000000000000015304 5ustar00codespacecodespace00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1622691171.2277687 build-0.4.0/src/build/0000777000175000017500000000000000000000000016403 5ustar00codespacecodespace00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1622691142.0 build-0.4.0/src/build/__init__.py0000666000175000017500000003432600000000000020524 0ustar00codespacecodespace00000000000000# SPDX-License-Identifier: MIT """ build - A simple, correct PEP 517 package builder """ __version__ = '0.4.0' import contextlib import difflib import io import os import subprocess import sys import types import warnings from collections import OrderedDict from typing import AbstractSet, Any, Callable, Dict, Iterator, Mapping, Optional, Sequence, Set, Text, Tuple, Type, Union import pep517.wrappers import toml import toml.decoder if sys.version_info < (3,): FileNotFoundError = IOError PermissionError = OSError RunnerType = Callable[[Sequence[str], Optional[Union[bytes, Text]], Optional[Dict[str, str]]], None] ConfigSettingsType = Mapping[str, Union[str, Sequence[str]]] _ExcInfoType = Union[ Tuple[Type[BaseException], BaseException, types.TracebackType], Tuple[None, None, None], ] _DEFAULT_BACKEND = { 'build-backend': 'setuptools.build_meta:__legacy__', 'requires': ['setuptools >= 40.8.0', 'wheel'], } class BuildException(Exception): """ Exception raised by ProjectBuilder """ class BuildBackendException(Exception): """ Exception raised when the backend fails """ def __init__(self, exception, description=None, exc_info=(None, None, None)): # type: (Exception, Optional[str], _ExcInfoType) -> None super(BuildBackendException, self).__init__() self.exception = exception # type: Exception self.exc_info = exc_info self._description = description def __str__(self): # type: () -> str if self._description: return self._description return 'Backend operation failed: {!r}'.format(self.exception) class TypoWarning(Warning): """ Warning raised when a potential typo is found """ def _validate_source_directory(srcdir): # type: (str) -> None if not os.path.isdir(srcdir): raise BuildException('Source {} is not a directory'.format(srcdir)) pyproject_toml = os.path.join(srcdir, 'pyproject.toml') setup_py = os.path.join(srcdir, 'setup.py') if not os.path.exists(pyproject_toml) and not os.path.exists(setup_py): raise BuildException('Source {} does not appear to be a Python project: no pyproject.toml or setup.py'.format(srcdir)) def check_dependency(req_string, ancestral_req_strings=(), parent_extras=frozenset()): # type: (str, Tuple[str, ...], AbstractSet[str]) -> Iterator[Tuple[str, ...]] """ Verify that a dependency and all of its dependencies are met. :param req_string: Requirement string :param parent_extras: Extras (eg. "test" in myproject[test]) :yields: Unmet dependencies """ import packaging.requirements if sys.version_info >= (3, 8): import importlib.metadata as importlib_metadata else: import importlib_metadata req = packaging.requirements.Requirement(req_string) if req.marker: extras = frozenset(('',)).union(parent_extras) # a requirement can have multiple extras but ``evaluate`` can # only check one at a time. if all(not req.marker.evaluate(environment={'extra': e}) for e in extras): # if the marker conditions are not met, we pretend that the # dependency is satisfied. return try: dist = importlib_metadata.distribution(req.name) except importlib_metadata.PackageNotFoundError: # dependency is not installed in the environment. yield ancestral_req_strings + (req_string,) else: if req.specifier and not req.specifier.contains(dist.version, prereleases=True): # the installed version is incompatible. yield ancestral_req_strings + (req_string,) elif dist.requires: for other_req_string in dist.requires: for unmet_req in check_dependency(other_req_string, ancestral_req_strings + (req_string,), req.extras): # a transitive dependency is not satisfied. yield unmet_req def _find_typo(dictionary, expected): # type: (Mapping[str, str], str) -> None if expected not in dictionary: for obj in dictionary: if difflib.SequenceMatcher(None, expected, obj).ratio() >= 0.8: warnings.warn( "Found '{}' in pyproject.toml, did you mean '{}'?".format(obj, expected), TypoWarning, ) @contextlib.contextmanager def _working_directory(path): # type: (str) -> Iterator[None] current = os.getcwd() os.chdir(path) try: yield finally: os.chdir(current) class ProjectBuilder(object): """ The PEP 517 consumer API. """ def __init__( self, srcdir, # type: str python_executable=sys.executable, # type: Union[bytes, Text] scripts_dir=None, # type: Optional[Union[bytes, Text]] runner=pep517.wrappers.default_subprocess_runner, # type: RunnerType ): # type: (...) -> None """ :param srcdir: The source directory :param scripts_dir: The location of the scripts dir (defaults to the folder where the python executable lives) :param python_executable: The python executable where the backend lives :param runner: An alternative runner for backend subprocesses The 'runner', if provided, must accept the following arguments: - cmd: a list of strings representing the command and arguments to execute, as would be passed to e.g. 'subprocess.check_call'. - cwd: a string representing the working directory that must be used for the subprocess. Corresponds to the provided srcdir. - extra_environ: a dict mapping environment variable names to values which must be set for the subprocess execution. The default runner simply calls the backend hooks in a subprocess, writing backend output to stdout/stderr. """ self.srcdir = os.path.abspath(srcdir) # type: str _validate_source_directory(srcdir) spec_file = os.path.join(srcdir, 'pyproject.toml') try: with io.open(spec_file, encoding='UTF-8') as f: spec = toml.load(f) except FileNotFoundError: spec = {} except PermissionError as e: raise BuildException("{}: '{}' ".format(e.strerror, e.filename)) except toml.decoder.TomlDecodeError as e: raise BuildException('Failed to parse {}: {} '.format(spec_file, e)) build_system = spec.get('build-system') # if pyproject.toml is missing (per PEP 517) or [build-system] is missing (per PEP 518), # use default values. if build_system is None: _find_typo(spec, 'build-system') build_system = _DEFAULT_BACKEND # if [build-system] is present, it must have a ``requires`` field (per PEP 518). elif 'requires' not in build_system: _find_typo(build_system, 'requires') raise BuildException("Missing 'build-system.requires' in {}".format(spec_file)) # if ``build-backend`` is missing, inject the legacy setuptools backend # but leave ``requires`` alone to emulate pip. elif 'build-backend' not in build_system: _find_typo(build_system, 'build-backend') build_system['build-backend'] = _DEFAULT_BACKEND['build-backend'] self._build_system = build_system self._backend = self._build_system['build-backend'] self._scripts_dir = scripts_dir self._hook_runner = runner self._hook = pep517.wrappers.Pep517HookCaller( self.srcdir, self._backend, backend_path=self._build_system.get('backend-path'), python_executable=python_executable, runner=self._runner, ) def _runner(self, cmd, cwd=None, extra_environ=None): # type: (Sequence[str], Optional[Union[bytes, Text]], Optional[Dict[str, str]]) -> None # if script dir is specified must be inserted at the start of PATH (avoid duplicate path while doing so) if self.scripts_dir is not None: paths = OrderedDict() # type: Dict[str, None] paths[str(self.scripts_dir)] = None if 'PATH' in os.environ: paths.update((i, None) for i in os.environ['PATH'].split(os.pathsep)) extra_environ = {} if extra_environ is None else extra_environ extra_environ['PATH'] = os.pathsep.join(paths) self._hook_runner(cmd, cwd, extra_environ) @property def python_executable(self): # type: () -> Union[bytes, Text] """ The Python executable used to invoke the backend. """ # make mypy happy exe = self._hook.python_executable # type: Union[bytes, Text] return exe @python_executable.setter def python_executable(self, value): # type: (Union[bytes, Text]) -> None self._hook.python_executable = value @property def scripts_dir(self): # type: () -> Union[None, bytes, Text] """ The folder where the scripts are stored for the python executable. """ return self._scripts_dir @scripts_dir.setter def scripts_dir(self, value): # type: (Union[None, bytes, Text]) -> None self._scripts_dir = value @property def build_system_requires(self): # type: () -> Set[str] """ The dependencies defined in the ``pyproject.toml``'s ``build-system.requires`` field or the default build dependencies if ``pyproject.toml`` is missing or ``build-system`` is undefined. """ return set(self._build_system['requires']) def get_requires_for_build(self, distribution, config_settings=None): # type: (str, Optional[ConfigSettingsType]) -> Set[str] """ Return the dependencies defined by the backend in addition to :attr:`build_system_requires` for a given distribution. :param distribution: Distribution to get the dependencies of (``sdist`` or ``wheel``) :param config_settings: Config settings for the build backend """ hook_name = 'get_requires_for_build_{}'.format(distribution) get_requires = getattr(self._hook, hook_name) with self._handle_backend(hook_name): return set(get_requires(config_settings)) def check_dependencies(self, distribution, config_settings=None): # type: (str, Optional[ConfigSettingsType]) -> Set[Tuple[str, ...]] """ Return the dependencies which are not satisfied from the combined set of :attr:`build_system_requires` and :meth:`get_requires_for_build` for a given distribution. :param distribution: Distribution to check (``sdist`` or ``wheel``) :param config_settings: Config settings for the build backend :returns: Set of variable-length unmet dependency tuples """ dependencies = self.get_requires_for_build(distribution, config_settings).union(self.build_system_requires) return {u for d in dependencies for u in check_dependency(d)} def prepare(self, distribution, output_directory, config_settings=None): # type: (str, str, Optional[ConfigSettingsType]) -> Optional[str] """ Prepare metadata for a distribution. :param distribution: Distribution to build (must be ``wheel``) :param output_directory: Directory to put the prepared metadata in :param config_settings: Config settings for the build backend :returns: The full path to the prepared metadata directory """ prepare = getattr(self._hook, 'prepare_metadata_for_build_{}'.format(distribution)) try: return self._call_backend(prepare, output_directory, config_settings, _allow_fallback=False) except BuildBackendException as exception: if isinstance(exception.exception, pep517.wrappers.HookMissing): return None raise def build(self, distribution, output_directory, config_settings=None, metadata_directory=None): # type: (str, str, Optional[ConfigSettingsType], Optional[str]) -> str """ Build a distribution. :param distribution: Distribution to build (``sdist`` or ``wheel``) :param output_directory: Directory to put the built distribution in :param config_settings: Config settings for the build backend :param metadata_directory: If provided, should be the return value of a previous ``prepare`` call on the same ``distribution`` kind :returns: The full path to the built distribution """ build = getattr(self._hook, 'build_{}'.format(distribution)) kwargs = {} if metadata_directory is None else {'metadata_directory': metadata_directory} return self._call_backend(build, output_directory, config_settings, **kwargs) def _call_backend(self, callback, outdir, config_settings=None, **kwargs): # type: (Callable[...,str], str, Optional[ConfigSettingsType], Any) -> str outdir = os.path.abspath(outdir) if os.path.exists(outdir): if not os.path.isdir(outdir): raise BuildException("Build path '{}' exists and is not a directory".format(outdir)) else: os.mkdir(outdir) with self._handle_backend(callable.__name__): basename = callback(outdir, config_settings, **kwargs) # type: str return os.path.join(outdir, basename) @contextlib.contextmanager def _handle_backend(self, hook): # type: (str) -> Iterator[None] with _working_directory(self.srcdir): try: yield except pep517.wrappers.BackendUnavailable as exception: raise BuildBackendException( exception, "Backend '{}' is not available.".format(self._backend), sys.exc_info(), ) except subprocess.CalledProcessError as exception: raise BuildBackendException(exception, 'Backend subproccess exited when trying to invoke {}'.format(hook)) except Exception as exception: raise BuildBackendException(exception, exc_info=sys.exc_info()) __all__ = ( '__version__', 'ConfigSettingsType', 'RunnerType', 'BuildException', 'BuildBackendException', 'TypoWarning', 'check_dependency', 'ProjectBuilder', ) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1622691142.0 build-0.4.0/src/build/__main__.py0000666000175000017500000001664300000000000020507 0ustar00codespacecodespace00000000000000# SPDX-License-Identifier: MIT from __future__ import print_function import argparse import os import subprocess import sys import traceback import warnings from typing import Iterable, List, Optional, Sequence, TextIO, Type, Union import build from build import BuildBackendException, BuildException, ConfigSettingsType, ProjectBuilder from build.env import IsolatedEnvBuilder try: import colorama except ImportError: pass else: colorama.init() # fix colors on windows __all__ = ['build', 'main', 'main_parser'] def _showwarning(message, category, filename, lineno, file=None, line=None): # pragma: no cover # type: (Union[Warning, str], Type[Warning], str, int, Optional[TextIO], Optional[str]) -> None prefix = 'WARNING' if sys.stdout.isatty(): prefix = '\33[93m' + prefix + '\33[0m' print('{} {}'.format(prefix, str(message))) warnings.showwarning = _showwarning def _error(msg, code=1): # type: (str, int) -> None # pragma: no cover """ Print an error message and exit. Will color the output when writing to a TTY. :param msg: Error message :param code: Error code """ prefix = 'ERROR' if sys.stdout.isatty(): prefix = '\33[91m' + prefix + '\33[0m' print('{} {}'.format(prefix, msg)) exit(code) def _format_dep_chain(dep_chain): # type: (Sequence[str]) -> str return ' -> '.join(dep.partition(';')[0].strip() for dep in dep_chain) def _build_in_isolated_env(builder, outdir, distributions, config_settings): # type: (ProjectBuilder, str, List[str], ConfigSettingsType) -> None for distribution in distributions: with IsolatedEnvBuilder() as env: builder.python_executable = env.executable builder.scripts_dir = env.scripts_dir # first install the build dependencies env.install(builder.build_system_requires) # then get the extra required dependencies from the backend (which was installed in the call above :P) env.install(builder.get_requires_for_build(distribution)) builder.build(distribution, outdir, config_settings) def _build_in_current_env(builder, outdir, distributions, config_settings, skip_dependency_check=False): # type: (ProjectBuilder, str, List[str], ConfigSettingsType, bool) -> None for dist in distributions: if not skip_dependency_check: missing = builder.check_dependencies(dist) if missing: _error( 'Missing dependencies:' + ''.join('\n\t' + dep for deps in missing for dep in (deps[0], _format_dep_chain(deps[1:])) if dep) ) builder.build(dist, outdir, config_settings) def build_package(srcdir, outdir, distributions, config_settings=None, isolation=True, skip_dependency_check=False): # type: (str, str, List[str], Optional[ConfigSettingsType], bool, bool) -> None """ Run the build process. :param srcdir: Source directory :param outdir: Output directory :param distributions: Distributions to build (sdist and/or wheel) :param config_settings: Configuration settings to be passed to the backend :param isolation: Isolate the build in a separate environment :param skip_dependency_check: Do not perform the dependency check """ if not config_settings: config_settings = {} try: builder = ProjectBuilder(srcdir) if isolation: _build_in_isolated_env(builder, outdir, distributions, config_settings) else: _build_in_current_env(builder, outdir, distributions, config_settings, skip_dependency_check) except BuildException as e: _error(str(e)) except BuildBackendException as e: if isinstance(e.exception, subprocess.CalledProcessError): print() else: if e.exc_info: traceback.print_exception( e.exc_info[0], e.exc_info[1], e.exc_info[2], limit=-1, ) else: if sys.version_info >= (3, 5): print(traceback.format_exc(-1)) else: print(traceback.format_tb()) _error(str(e)) def main_parser(): # type: () -> argparse.ArgumentParser """ Construct the main parser. """ # mypy does not recognize module.__path__ # https://github.com/python/mypy/issues/1422 paths = build.__path__ # type: Iterable[Optional[str]] # type: ignore parser = argparse.ArgumentParser() parser.add_argument( 'srcdir', type=str, nargs='?', default=os.getcwd(), help='source directory (defaults to current directory)', ) parser.add_argument( '--version', '-V', action='version', version='build {} ({})'.format(build.__version__, ', '.join(path for path in paths if path)), ) parser.add_argument( '--sdist', '-s', action='store_true', help='build a source distribution (enabled by default if no target is specified)', ) parser.add_argument( '--wheel', '-w', action='store_true', help='build a wheel (enabled by default if no target is specified)', ) parser.add_argument( '--outdir', '-o', type=str, help='output directory (defaults to {{srcdir}}{sep}dist)'.format(sep=os.sep), ) parser.add_argument( '--skip-dependency-check', '-x', action='store_true', help='do not check that build dependencies are installed', ) parser.add_argument( '--no-isolation', '-n', action='store_true', help='do not isolate the build in a virtual environment', ) parser.add_argument( '--config-setting', '-C', action='append', help='pass options to the backend. options which begin with a hyphen must be in the form of ' '"--config-setting=--opt(=value)" or "-C--opt(=value)"', ) return parser def main(cli_args, prog=None): # type: (List[str], Optional[str]) -> None """ Parse the CLI arguments and invoke the build process. :param cli_args: CLI arguments :param prog: Program name to show in help text """ parser = main_parser() if prog: parser.prog = prog args = parser.parse_args(cli_args) distributions = [] config_settings = {} if args.config_setting: for arg in args.config_setting: setting, _, value = arg.partition('=') if setting not in config_settings: config_settings[setting] = value else: if not isinstance(config_settings[setting], list): config_settings[setting] = [config_settings[setting]] config_settings[setting].append(value) if args.sdist: distributions.append('sdist') if args.wheel: distributions.append('wheel') # default targets if not distributions: distributions = ['sdist', 'wheel'] # outdir is relative to srcdir only if omitted. outdir = os.path.join(args.srcdir, 'dist') if args.outdir is None else args.outdir build_package(args.srcdir, outdir, distributions, config_settings, not args.no_isolation, args.skip_dependency_check) def entrypoint(): # type: () -> None main(sys.argv[1:]) if __name__ == '__main__': # pragma: no cover main(sys.argv[1:], 'python -m build') ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1622691142.0 build-0.4.0/src/build/_compat.py0000666000175000017500000000237700000000000020410 0ustar00codespacecodespace00000000000000import abc import sys from typing import TYPE_CHECKING, Callable, TypeVar _T = TypeVar('_T') def add_metaclass(metaclass): # type: (type) -> Callable[[_T], _T] """Class decorator for creating a class with a metaclass (borrowed from six code).""" def wrapper(cls): # type: (_T) -> _T orig_vars = cls.__dict__.copy() slots = orig_vars.get('__slots__') if slots is not None: if isinstance(slots, str): # pragma: no cover slots = [slots] # pragma: no cover for slots_var in slots: # pragma: no cover orig_vars.pop(slots_var) # pragma: no cover orig_vars.pop('__dict__', None) orig_vars.pop('__weakref__', None) if hasattr(cls, '__qualname__'): orig_vars['__qualname__'] = cls.__qualname__ # type: ignore return metaclass(cls.__name__, cls.__bases__, orig_vars) # type: ignore return wrapper if sys.version_info[0] == 2: abstractproperty = abc.abstractproperty else: if TYPE_CHECKING: # pragma: no cover abstractproperty = property # pragma: no cover else: def abstractproperty(func): return property(abc.abstractmethod(func)) __all__ = ( 'abstractproperty', 'add_metaclass', ) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1622691142.0 build-0.4.0/src/build/env.py0000666000175000017500000002364100000000000017553 0ustar00codespacecodespace00000000000000""" Creates and manages isolated build environments. """ import abc import functools import os import platform import shutil import subprocess import sys import sysconfig import tempfile from types import TracebackType from typing import Iterable, Optional, Tuple, Type import packaging.requirements import packaging.version import build from ._compat import abstractproperty, add_metaclass if sys.version_info < (3, 8): import importlib_metadata as metadata else: from importlib import metadata try: import virtualenv except ImportError: virtualenv = None @add_metaclass(abc.ABCMeta) class IsolatedEnv(object): """Abstract base of isolated build environments, as required by the build project.""" @abstractproperty def executable(self): # type: () -> str """The executable of the isolated build environment.""" raise NotImplementedError @abstractproperty def scripts_dir(self): # type: () -> str """The scripts directory of the isolated build environment.""" raise NotImplementedError @abc.abstractmethod def install(self, requirements): # type: (Iterable[str]) -> None """ Install packages from PEP 508 requirements in the isolated build environment. :param requirements: PEP 508 requirements """ raise NotImplementedError class IsolatedEnvBuilder(object): """Builder object for isolated environments.""" _has_virtualenv = None # type: Optional[bool] def __init__(self): # type: () -> None self._path = None # type: Optional[str] def _should_use_virtualenv(self): # type: () -> Optional[bool] # virtualenv might be incompatible if it was installed separately # from build. This verifies that virtualenv and all of its # dependencies are installed as specified by build. if self._has_virtualenv is None: self.__class__._has_virtualenv = virtualenv is not None and not any( packaging.requirements.Requirement(d[1]).name == 'virtualenv' for d in build.check_dependency('build[virtualenv]') if len(d) > 1 ) return self._has_virtualenv def __enter__(self): # type: () -> IsolatedEnv """ Create an isolated build environment. :return: The isolated build environment """ self._path = tempfile.mkdtemp(prefix='build-env-') try: # use virtualenv on Python 2 or when valid virtualenv is available (as it's faster than venv) if sys.version_info < (3,) or self._should_use_virtualenv(): executable, scripts_dir = _create_isolated_env_virtualenv(self._path) else: executable, scripts_dir = _create_isolated_env_venv(self._path) return _IsolatedEnvVenvPip(path=self._path, python_executable=executable, scripts_dir=scripts_dir) except Exception: # cleanup folder if creation fails self.__exit__(*sys.exc_info()) raise def __exit__(self, exc_type, exc_val, exc_tb): # type: (Optional[Type[BaseException]], Optional[BaseException], Optional[TracebackType]) -> None """ Delete the created isolated build environment. :param exc_type: The type of exception raised (if any) :param exc_val: The value of exception raised (if any) :param exc_tb: The traceback of exception raised (if any) """ if self._path is not None and os.path.exists(self._path): # in case the user already deleted skip remove shutil.rmtree(self._path) class _IsolatedEnvVenvPip(IsolatedEnv): """ Isolated build environment context manager Non-standard paths injected directly to sys.path will still be passed to the environment. """ def __init__(self, path, python_executable, scripts_dir): # type: (str, str, str) -> None """ :param path: The path where the environment exists :param python_executable: The python executable within the environment """ self._path = path self._python_executable = python_executable self._scripts_dir = scripts_dir @property def path(self): # type: () -> str """The location of the isolated build environment.""" return self._path @property def executable(self): # type: () -> str """The python executable of the isolated build environment.""" return self._python_executable @property def scripts_dir(self): # type: () -> str return self._scripts_dir def install(self, requirements): # type: (Iterable[str]) -> None """ Install packages from PEP 508 requirements in the isolated build environment. :param requirements: PEP 508 requirement specification to install :note: Passing non-PEP 508 strings will result in undefined behavior, you *should not* rely on it. It is merely an implementation detail, it may change any time without warning. """ if not requirements: return # pip does not honour environment markers in command line arguments # but it does for requirements from a file with tempfile.NamedTemporaryFile('w+', prefix='build-reqs-', suffix='.txt', delete=False) as req_file: req_file.write(os.linesep.join(requirements)) try: cmd = [ self.executable, '-{}m'.format('E' if sys.version_info[0] == 2 else 'I'), 'pip', 'install', '--use-pep517', '--no-warn-script-location', '-r', os.path.abspath(req_file.name), ] subprocess.check_call(cmd) finally: os.unlink(req_file.name) def _create_isolated_env_virtualenv(path): # type: (str) -> Tuple[str, str] """ On Python 2 we use the virtualenv package to provision a virtual environment. :param path: The path where to create the isolated build environment :return: The Python executable and script folder """ cmd = [str(path), '--no-setuptools', '--no-wheel', '--activators', ''] result = virtualenv.cli_run(cmd, setup_logging=False) executable = str(result.creator.exe) script_dir = str(result.creator.script_dir) return executable, script_dir # venv only exists on Python 3+ if sys.version_info >= (3,): # noqa: C901 @functools.lru_cache(maxsize=None) def _fs_supports_symlink(): # type: () -> bool """Return True if symlinks are supported""" # Using definition used by venv.main() if os.name != 'nt': return True # Windows may support symlinks (setting in Windows 10) with tempfile.NamedTemporaryFile(prefix='build-symlink-') as tmp_file: dest = '{}-b'.format(tmp_file) try: os.symlink(tmp_file.name, dest) os.unlink(dest) return True except (OSError, NotImplementedError, AttributeError): return False def _create_isolated_env_venv(path): # type: (str) -> Tuple[str, str] """ On Python 3 we use the venv package from the standard library. :param path: The path where to create the isolated build environment :return: The Python executable and script folder """ import venv venv.EnvBuilder(with_pip=True, symlinks=_fs_supports_symlink()).create(path) executable, script_dir, purelib = _find_executable_and_scripts(path) # Get the version of pip in the environment pip_distribution = next(iter(metadata.distributions(name='pip', path=[purelib]))) current_pip_version = packaging.version.Version(pip_distribution.version) if platform.system() == 'Darwin' and int(platform.mac_ver()[0].split('.')[0]) >= 11: # macOS 11+ name scheme change requires 20.3. Intel macOS 11.0 can be told to report 10.16 for backwards # compatibility; but that also fixes earlier versions of pip so this is only needed for 11+. is_apple_silicon_python = sys.version_info >= (3, 6) and platform.machine() != 'x86_64' minimum_pip_version = '21.0.1' if is_apple_silicon_python else '20.3.0' else: # PEP-517 and manylinux1 was first implemented in 19.1 minimum_pip_version = '19.1.0' if current_pip_version < packaging.version.Version(minimum_pip_version): subprocess.check_call([executable, '-m', 'pip', 'install', 'pip>={}'.format(minimum_pip_version)]) # Avoid the setuptools from ensurepip to break the isolation subprocess.check_call([executable, '-m', 'pip', 'uninstall', 'setuptools', '-y']) return executable, script_dir def _find_executable_and_scripts(path): # type: (str) -> Tuple[str, str, str] """ Detect the Python executable and script folder of a virtual environment. :param path: The location of the virtual environment :return: The Python executable, script folder, and purelib folder """ config_vars = sysconfig.get_config_vars().copy() # globally cached, copy before altering it config_vars['base'] = path env_scripts = sysconfig.get_path('scripts', vars=config_vars) if not env_scripts: raise RuntimeError("Couldn't get environment scripts path") exe = 'pypy3' if platform.python_implementation() == 'PyPy' else 'python' if os.name == 'nt': exe = '{}.exe'.format(exe) executable = os.path.join(env_scripts, exe) if not os.path.exists(executable): raise RuntimeError('Virtual environment creation failed, executable {} missing'.format(executable)) purelib = sysconfig.get_path('purelib', vars=config_vars) if not purelib: raise RuntimeError("Couldn't get environment purelib folder") return executable, env_scripts, purelib __all__ = ( 'IsolatedEnvBuilder', 'IsolatedEnv', ) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1622691142.0 build-0.4.0/src/build/py.typed0000666000175000017500000000000000000000000020070 0ustar00codespacecodespace00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1622691205.8282268 build-0.4.0/src/build.egg-info/0000777000175000017500000000000000000000000020075 5ustar00codespacecodespace00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1622691205.0 build-0.4.0/src/build.egg-info/PKG-INFO0000666000175000017500000000556700000000000021207 0ustar00codespacecodespace00000000000000Metadata-Version: 2.1 Name: build Version: 0.4.0 Summary: A simple, correct PEP517 package builder Home-page: UNKNOWN Author: Filipe Laíns Author-email: lains@riseup.net License: MIT Project-URL: homepage, https://github.com/pypa/build Project-URL: changelog, https://pypa-build.readthedocs.io/en/stable/changelog.html Description: # build [![CI check](https://github.com/pypa/build/workflows/check/badge.svg)](https://github.com/pypa/build/actions) [![CI test](https://github.com/pypa/build/actions/workflows/test.yml/badge.svg)](https://github.com/pypa/build/actions/workflows/test.yml) [![codecov](https://codecov.io/gh/pypa/build/branch/main/graph/badge.svg)](https://codecov.io/gh/pypa/build) [![Documentation Status](https://readthedocs.org/projects/pypa-build/badge/?version=latest)](https://pypa-build.readthedocs.io/en/latest/?badge=latest) [![PyPI version](https://badge.fury.io/py/build.svg)](https://pypi.org/project/build/) [![Discord](https://img.shields.io/discord/803025117553754132?label=Discord%20chat%20%23build&style=flat-square)](https://discord.gg/pypa) A simple, correct PEP517 package builder. See the [documentation](https://pypa-build.readthedocs.io/en/latest/) for more information. ### Installation `build` can be installed via `pip` or an equivalent via: ```console $ pip install build ``` ### Usage ```console $ python -m build ``` This will build the package in an isolated environment, generating a source-distribution and wheel in the directory `dist/`. See the [documentation](https://pypa-build.readthedocs.io/en/latest/) for full information. ### Code of Conduct Everyone interacting in the build's codebase, issue trackers, chat rooms, and mailing lists is expected to follow the [PSF Code of Conduct]. [psf code of conduct]: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md Platform: UNKNOWN Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7 Description-Content-Type: text/markdown Provides-Extra: docs Provides-Extra: test Provides-Extra: typing Provides-Extra: virtualenv ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1622691205.0 build-0.4.0/src/build.egg-info/SOURCES.txt0000666000175000017500000000054000000000000021760 0ustar00codespacecodespace00000000000000LICENSE README.md pyproject.toml setup.cfg setup.py src/build/__init__.py src/build/__main__.py src/build/_compat.py src/build/env.py src/build/py.typed src/build.egg-info/PKG-INFO src/build.egg-info/SOURCES.txt src/build.egg-info/dependency_links.txt src/build.egg-info/entry_points.txt src/build.egg-info/requires.txt src/build.egg-info/top_level.txt././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1622691205.0 build-0.4.0/src/build.egg-info/dependency_links.txt0000666000175000017500000000000100000000000024143 0ustar00codespacecodespace00000000000000 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1622691205.0 build-0.4.0/src/build.egg-info/entry_points.txt0000666000175000017500000000015500000000000023374 0ustar00codespacecodespace00000000000000[console_scripts] pyproject-build = build.__main__:entrypoint [pipx.run] build = build.__main__:entrypoint ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1622691205.0 build-0.4.0/src/build.egg-info/requires.txt0000666000175000017500000000067200000000000022502 0ustar00codespacecodespace00000000000000packaging>=19.0 pep517>=0.9.1 toml>=0.10.0 [:os_name == "nt"] colorama [:python_version < "3"] typing>=3.5.3.0 virtualenv>=20.0.35 [:python_version < "3.8"] importlib-metadata>=0.22 [docs] furo>=2020.11.19b18 sphinx~=3.0 sphinx-argparse-cli>=1.5 sphinx-autodoc-typehints>=1.10 [test] filelock>=3 pytest>=4 pytest-cov>=2 pytest-mock>=2 pytest-xdist>=1.34 [typing] mypy==0.800 typing-extensions>=3.7.4.3 [virtualenv] virtualenv>=20.0.35 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1622691205.0 build-0.4.0/src/build.egg-info/top_level.txt0000666000175000017500000000000600000000000022623 0ustar00codespacecodespace00000000000000build python-pkginfo-0.6.5/tests/fixtures/build-0.4.0.tar.bz2000064400000000000000000000274341046102023000205750ustar 00000000000000BZh91AY&SYx;;'H@"`;/>io]% !hjf6} 5z^}H;EjeOwX}ܽq{垙Vܱo--{&ݫ;V!q{xx鮵Z6{HM4 xF&)'(Lz4x)?Q6z  54ɪoBLhHzD )S4P4h@I@i 1SS4 z$A j=Fzd4h$!4L=$6Li4̙'шG?r<=1%Bc 2uUOpcI͠=/{˰ѫau3tDh2!  xV2mYZs$Xc$$ @!"$4dUb eVPV1Sb)]is+]Ϯ6:u(yr2Ϝ7,Vߢ-R+C~`R۩Ye#Cї2cE!P]p~֟lOж5oU q8uaSjMlŘ@"m:3ygd.Jnx !ih; 56} `F$HLu!4zw)B8;)@Ni-ϭɘ:Z r6۵Ïv5&S4Fc2YgɈ1#Uã4exHT.'@A<""d[[s$u5IU. 4U4̋p6zve6=HUU+ڠzJj DA(>-^6Xb##aayU݀v" ?n-?u1c/ ar[ŜƦN@K iri0o I5Z-1RzZS  Q}ϓ2o ދ$N,SBGeU\ &ZI\#`R P=JQ*{9QBQ5s=C+ 1РOV0tW ]WS_Igr+qr;T# ~NJIC^]W\IcES 6HDkJvCn 5֘ma a]A&(+`dl~/wFM{:A25^j6UzXK Rt@UeRf\^Dj]<>TJi*4,g"/$AD߫!-%]^ᙴ(LQevnhYY& E @򮤯Œ ke-ji7 [:Ɔ4nPJ04!BtUՕ2r*-W"N =u{T`uM>G& HM*p>FzqtСՁ@^R.E/ 礛=!!!bW_뭙='hə'@ R("P'ӫ6S]nxqg)̾è*a!˅2C1b)IQyяq=z+m2th67ɪ?7Yuwy{O쒜^e$2x.%l~򵄌mI_ϗ=1gN.NUAܚ,h M<۫^7u$jYTdw;*aoomͶFp!~~^ESoEX]<~hw~tާoѭ`.{PFWyxRF/ Dcx0'VQRTXL0_ Aڠ=-wմE+Qhl]/d4XW. ȇTZ^# xZW.(H]Lr>xVr,ӓԼLbZ;fgM˃o{f Q"@pCn*6[M~f\tjYM^/Ƣ l ),wn۷áUQHv&cł6U:0壢yt#5 (Muf=={P?Eߠ^Cf){}Ǐ^=Qs\():| ԷݪF׋SJ†T!5FTճzNt_a>>  ޅe,!(͗oTO{";F@1]X!FUJ'`r (|bn wiy!zѸ@SC=J-3kCQx,7![`JD;WܒYt\5QMx4)A lg ̌Lz{"]LRl܁ܺrA`|\Yy;~H@q#8>]"K~Y譄d-S͌,;P1nIܚrDU,^0>Df *q@Q=cW/O쫠1y/ 0Ċ<=^ig屐qs`!Y.A2SaWE XpQɨ1>Ӿ} =|~933UK~NX(» ߍaG<"+MQc8OZO4!  v°}R+)ɆP!8@HfLB$Y! OKy -ls D4mD(~*OQry Fưf7e1[(e|Fk* H:uL 2k)- jKs'(Ԥ˄ ʼY3=vBM1BdD6*gߓd;NoD{??}#bKl?b惖Y/˨5*~sb;rޚs#ǝ`?Ó|طI 3Qb'?9љ)b"HNNdm:d4̓&!RO}Ou';/k{M.stq=P?I$Kz&?L)}ɦ&&07$Dup.3ifXz,0TC_m@ڋ = Ӊn׮/Woo\x~_Vd)Q9UrXRNyLi@2Ih\c EaRcT aQy#G5@n8w[Qv svϮuP-Ց8K]ǥc}S>Y̒psbTCQRyg* .z^n /9BgoU9޶մjTB3e\S bn:8sUYؤGFP|KhNpfE@Nςk@Xky|x`s ߆}H W^)aa@֫6/9֞56]# ìͯ6EQEPv yS73@'F@}F[;:d1(*Rrg3n+殸EF64ڝ16r9p'LmTFճ'5b1ܥ.0C35VgiJSXS7^=Tݬ@/K5 ݾ{OU]ޭswlpimysaC,m_ǠEd4 И*tLGQ{В\ /w)8A3 9Ϗy3VyacX잍QpK5Ӭ1b~7 \<8J^2d.BY$%A=ˍ9 a`gkGj8j 5i0M:Í #m d*ˠ 86<$"Z"Csyؐp՗'FM3 + Q,ys&5%kq0Klo~j1~c/MMapAئDsi$ڰ,W7h.`d!-Qޚ^ "jyI!0/,?z,A!87IXܨAdW0zX Js;a [zMF:lO|F#i2_VYN&,s"Wx9E>,&"qAC92S[fC»6[GS_˪'VW  Nj[}{TrOY!b \.TY@viMCm-;<=aYݲ!"*rgםB`M /Ғ ek f*m,X6VkĢ sWjvB*FGbCC@xXWdl#,MAِDL]Ciۃ +M ix9"LA(ߟJz_+} 8)܍ F :w(黜8p / Ɣ!g[W*9` ٛJ\ͩ|RKTc8ApbPfvÃ802ml_Px L ,DNƓUtQ&Ay|#<L2$Yd`[vv:nVa쬴aL@KCF!~!AF /JdR5 0)d2yrH)hesb 9q 瑡0FSWVG DiAuP -!cXG-`2ͮH3%%ԳKAѓNmf-T+r U*J1B1R $ҍ-|ba`B!!6şoB6wHer󐄄!dϕbHPnI3cwa$jb"y!/-I~\憐A\Gnv…kVYmSr s':fNWR*'5Nk"ˈ!֯bv5 xd5NxwZj\nIJ. h]`HcAC%)-LDN\2aDt2!PV,fHFA, GB0ghl.P`=ٖ%fdo~ˈ$_*.wg "q+;U T:* +"ڱ$.lݪSÿqGھs8%ؔ^+/"o' <ѵ10r.{G5\ >NH8qǨ^x/ PSCd5@ (t9gr=F|d\XGe+e[ cC]5b%%BҲ[abHx\fvМ@r4n„H XGb~6 ~:L-و !F Bu}kV+)d:AD@݈q%ր68C' n&}b1zPjS}Npva݇{td`(6`ahYFG!9d;Χ\HA(B ᄄ`9 w6"iGJa@NP*nB`=ᗾc^ e\"SKSJ&{XDQEYTFJSF  CП' QE}טكcÖto؏T5n|q0!>HQ ;z_ۡ)PHM-eQiRh2X !F`zæ1ͫJ2R!̉ Hhc+BBڏV.Sc H6}qֻarM$4dߵ0EDV((b`H8'^"l]B;FP]] h\ r( ,DX db H,$ݪ]{_Z X2e! $T*p 2,[s39ReR`NA /HNE>|&UwY.&ilmC ;ep"&튍@<)܂d+ M lc~`fm}/9y;Z3<ʅLcRp>@#t$A8r0:`4=]RjDb8tZ IqP,4QĮk%9CS;$7G*9T(}ƬKQ pl j!0GYǑd$P" D1bP1#"@VܐX)2‹ch1a1P9Nsquа|W{cqwl' W2,{.qz/;=, cndRRdUXĬ}ӑsSbO82!rX .#'̊ML^$cPA^SRo1p ĵX 0Et@75,0cIN1)O8!YPCZ ӄLaH6g Inm79Ma 7QUM0 LmI&~bD!`'@Y ޘwZTB&`jX`HYHµ11V ` 0-@ɩB" AVQp Hz@j֋$hPlGNcD{ PBo'dJT%C a)I?l~TQ i7afK&s$Ѓ1֐ E0HDF)"1~lVLBѢh@+^`؜LX1PXCcߐr++l*SN`\V ( ܦ@,$ɚz89L#(-P 4d&$xJ 4СZ8 9HKM̀m!?l8hhk#X_6 ,Y,S ŒAa'w Yw&p J 5'=c?H*N)_nP^x6~T-h-.z \pˠ2 M s.%>wŶD=z<ͅ PFyiq闧mٹDdH @/o/lPDKC\LHd kx_#7-I\KpGkn8!Pelu nedз I@2iuKXYU2C0- >MY& ʨB +dDi@cz;`!B}Ze`(7"{ʠF5 CurL?C/w7c覸TIoZz[P5xЉ;,\jVbA}(&pj,،`HNbK E nQbOT|؟}BtdQ!`%=ܬ{l{K`n2_6޶6\UtћBOƲYIJP` P]s4 j# EEa}<5[d $*LV!-g ^ 17LeN 0;"ܧ?Av8~KG!G+CT Ga@,+.$;bd"@5Pzy[p漓pIJ*m;mi3S&gV۲vʑ9`,O½BXy{ Jm_|z^4ӞJ|aSF&0eѰ'Jk'ZIݭ36[42奎Q'z;c$RE $DM4=sS/Z+]]-ɹRŀD2 ݙ a01^oMn^AFωsI@x̭m="'xJjO!ty&N vtI&zΨFD"$9H,(>' " ૗.-~w@'T%$^%ZBy=v) &\S/ٲLfV &ۯ#3L$bOh&r9&`{֥M=ؐHBX>]bP<(HA84 a1K%`ak3ѵU%+,*1d#-gvM(0e=Lڷp !*PJQ0n W( n]j.!1Qt2n330Pw kcX(hڛGahdQۍ A3A,Ű<£bV[j-g.QYWxK$XL}=ǝ)ӽ j}HQ0j {*<-x5L#t Ρ 8\opeRkpi(Z aFX;`[Q PdSVR0[J "L" M`g ,t C7+oOF@8>@:ճWt-22BEy)$H@  !ܺtL`pHz9&{|wؽ |[Hp_ȇTar<п$M~XC2QR0u4,y=!=71`{DJ_1ՏwTR01Dx!Hs0 EDd'ОC. =0h]Z Ml{YH g|`python-pkginfo-0.6.5/tests/fixtures/build-0.4.0.tar.gz000064400000000000000000000334171046102023000205160ustar 00000000000000`build-0.4.0.tar}vFhOёwd/sNIubK:EI/qnUu7 eǚ8H647;_; "O?>V[v y!4iiN^kh0;{[]s6Rm;άym;Wl)ԉ"Ǐe h7wS'm5;mYR?$s|ptrqE2kYNS?(?fOb/k7[/+sg{c~wz 43'Q>s#6qB`cgXgqX0b:f 6s s1s& F:y(  a0O?clDOq!Jl42tl>wsI0YDq:dx!Aܩ[08%ž#ΦCÚMlby &c3YxBii4VheݻI0żF2hФCeZ31?tqDQ0.n u? 8tVūj (wccf6LlRcĆO@VFb` S3 BꎀB22]y_ӟި/_d|o?Ύ₝oAw'?%{s*yu=:44 '.^yC?ӳ>}sxAsۂQ?~[go8RP˹xϯ0 ۇǧ'8ӓsYa_&E>8 GxBSʝZLȂ]}9<u]`a5Y%_e?ݽr hFvnQZ:A8ޜq<Mo~{WCϳqpJ7VϽ-U"˪;[3QwZ'.| gˌv^ w#Xô;u!uqo5;vjuzvz?1|ݡv3ѯs䔮jS/u/z8$^iMH Ddz}:: {9;xWrPS7l`\ ߺ6ܽ=0tsb{xN *uf d/n >kLשw ͂/Q!xq[7 |:;H#+y8p'j#&hr.F. fܼ1枷AA8"1w@T"DoZɍ9_m)faL#+`'ipv*낡\͢ut"_wj;9E>8=0ΑN9^l%>#>eg]a@bqc;1 w~-޺ChguQ.G>dKRϑ~D<-KΏF翻[YN<#UӪ(~G'UI^U_H;R=/Z0rU"Pz7RU@&{F̿h""xzQ}n| Kg ߿8zO7wV-ؙ^PDNw6lBE荦Puf:Y}'sߊ3zK# ,4):|kQl0^P8 2Tx!gdϽQ~_W׋N"`4~ZvY[r* ߞȵ^;me939ڍldt'[d:/sc^e f@=p7{ٚ9~މuwlg2?[hz>' ƚbi9?V>K`/h\p|D&a;Kag<eⳙ34_-jė 2_Q?bf[0s}=g;`Qgl_!sʝ,tkZj l<㌲`pU%i__[͎,c6l 0i &LYnHE 5P*\XcBM8&h::RT1sg&|8 (P ;d42[/-XlP? R9j!oq5Np4P0q8\Lے_'*9{Tb-#U:]=@fS"FF 8 1Rlbȡ)L$+&n;>[$^sE=僻6ockdO]%{6@us6`UD{ZGtD61p;TC#~]F^tTX@]=ajÆ;V!@EkZn*^#/ rp=xM73Sɤ5:3ɝ{-_}3LS QІ-qBߝQ/}O`uscglFn|!=A50 8?rO@9X1@Fl`4ER_K)l%*s+jv:( LQsAZI]R_v`K봚eC;[{?gvs_y?G-c,QawKS<5-KxGKcccC6~Xem0X0Qyn_ H[oѼ? THqg^62 RpspQgxbGE} '}Qgc:;F8=âuvJgɶWgίs8 ^PO_9naޅP@-S0&"oJq$+v5R9'A*&4||{z_q_]A]h^Px·zEha:b$k GNWhLWk:ÐE1E@ȁ|~9˜0ڰcRvwVtn\pãW\ZxtrR]bߵ,ۃeUxsiedƾJUopR@| &B}/̮='4}Nt9`d^_Έ}9ިΜtrxIXޫf'VK(=i2 *rUq/4`pu 3x%R5,@P & c ($69 "5@ |m% BmFPH/K J\pӓ:uq,Je,$0ϲݿ/_UedXRdWό̹Gժރd=PHh}QpDS +5H570MF"5Uku`YB42t= P\غVd&? B#YLk rBwhZ$1=8J`u ɗ|OY:.A&456Z$EɪdhHS +e]~Xh_6*HsU3L;r, lq=$(IMiMI%SEҼ_J)QZ2H3^+&hTT굚9GƤAU6S&} =b0HVܟ6vCZlC_vB+MbUq 7eUŕB+|/ϱbym;ָV1^ M"Bfg"i_:oSAiQ4#:Ҍ=YeAx)M@+$?3nՊ^4s$%YK5QB*]:?t<8ਇƝ^+'a5wV  18k;ٹRuEYl aܮ^BW1#@[;ƤA;d `&ItE= )1yę"n& GQ#쵨I1TWL W+epVp,UTDڦFn\ ەܮk4ú,ɺCϑJ$ /WM~z fCHXqɇ,!RV~xL̼Nm=!4}.E/ oޖ EJ NVG)9RJ+*%% 8?eַŕU$@ˣԠvO77:w}sS[ !gn/;)1ߒʞCUzk5HS̯8mp) wylcn/#&Y=7As/4ձ"at{M$6>9Il MG~ϜTL׎{S=7xl6vo_e)m6J%5P`HJ77rsçxnnr CɄds*i*ųl}H31RA=AZMIe=mGkI 2s$YMs/6j @j fv\A<믋\%E3!ƍbO80V#3!S'toZwS5?fw9@ K\p]pn :>UP81,m0ҺAGGgf񑸿Ь {ƻ{ xj'RZeY`UZ<`Nô9dDAGȿWxa _[ Dԧ'[ՙeI5,{eӿXU;Y(_M2hV;zo+8ɰ3t3]=4gnjIkSo $k.E4kג.;V <úb`;DB 2|QA]?BFxO#)Zx0K8J%yPJ|JGaB}\| 離ԪJAArN:+^IuK0w< En> Xي,9H.̹6:77UNhx#WQ3B# MD ꒙U&U?uv*+ Ir2Co]4C>ܞe6(w}k;nr Tv\l%-8sCs]b-DVdULgWziPؐ1B%l8 dđ`2MTuG2fbrp縢I<oR( -5CRɓIYHlZ++K|> V'*]vڲFs?OܼB׏!Ī *X}都}_w'VL߀Ruǧžc_{W.gR9m3+0=v<|.̣v)}ṫlf@vW3> 0)M.pp-`_>{ě@'G춍tmnq rRK&ˉ(A#apnM;Wzə`j~-)a2qh5Y}g\!bbjMPD5Tlldԝ@ƁAB(8@:\Mq{g״&jFrQ9Vbdt\ޑ5h]&n@a!qNp](AI?՘j9`"r-~POJ 5M+g!ڠ3ABUD<Șp[yUrQJp/CWuӵv/NY+zrP5&_Uݹ[Vr״=TɾwHZ(rh(u cE#x< '" "tB˙7á"'NI-J/Go]ʰXT3V,rj^] <$h& GP-)x@niňWzeW B q~XLOiS?7 ۝;K/HÝ@)2ّu0' Z.+r[E ]D(d5m<\N/.2 }@+1fO<VBJa~t:fL-0>^uI.Sx[+L@x,l 1I9E/1PA\t]7eA^sD rE_,݄4@?k+,UZj+ *fy;~:gLS9_YJFHҳ]'&X:t^z$ŸI\.ʗ52m>[a4Plb=Ujz ԟ|]VsTю8,@EzC^]!ۀP(P%_%n۝VfowwJ)v~Fe(Jd~y0huF"cL_z/qp343O'Om@5\˗W|M } L!ET:WRŢUw%,Mc[nR:p, {AE4tBBM9.w)6~(zb4+ɓ$ u_Ɂ>`1Mudby7M-81^iqu/-XM%8{eēJKc .J1XeaM{Z t(sAOZ-Pٗ]!OqOe5b`¬[|];Wjhei)N摣tnI[.ʰx"{HgߥUPjR<čЌMB"nޠ4߶VtSiOo(bf åae+j'_T >xu]3yTT oU&\2nsVq]«^Ql"2.\*pr6ݟ#SGr`| 7$N*Z'ZQq/{T/ږ^ɞMI3An ЌXs4}=-(Cp-%)si73`x1á4;-S8[!H7sqKVWG]/lI\cx*t~5\n<_I7/X.OZWyr4%11?ӹ|?9 -E9ɷ [!*03;@dE282Fe3o]r Fē Asl_YfPK@;9tbG6:>y/v_Z< a.>)|^ ī/IFF߅2fB} m l{' H)KUPvŪ?WLg֨QA=8MNq ]O51āpK>4_*l7iP9fr\)wW$ L/zh[QADCaAj6em ) TI'!whqϴ%]?^ݪDOB`˥vdwk S2A(.Ɲ tSb.!  `pܡ L`5`'*2I8/Ez+tSUlh5}~QiyjhLA8$Ϙ"l $%sg(5;6Hr _.;xl;9#1p ]+'eKGg|/)!t~[GMJw꜡~;,`|0b%]_MQe"ՒqnWy"D7ҾU(2cY[OwQo_cOg4ЍʬY䑐ZQ~A߫`+Y=87Zl?N{R=-)52ɣh`HiaG*L$Bq>O&9fJ%jI' D#Z{ iSյQ 9n[tbς!H^^.DAP&A6oh8C/ U|ӫ"UyhjU\=΅dDk $` ?f{"3cuD޹~E$`Un.oJX(pzfPnvbOsž=0aʻjM#@^GW\+ p|vF*hAv՚yi >aSeJeEx}ԠT8@]_)27j[/Em=B]qNt8[T-*ELu-~N''"i ,`+sT{vY9tiҷe<1u=@N*렂h/TJ(Xd6ʛP/Kg Sgh-?8?NJ$W/{/VsUnXo:q=~ ߅]O/ W_n?wOO'y qNeme{W83&/Itj,"E'jC<}g"::tٻON>1$3H6z]ٮ}3*~1xw&Œ&* <9ZѝRWIg " 63"fR̜S8t \L*/W__0Օ}Ļ`G^pmR;=;ft;=T(U4؉5*c)s1~A%Z0 Mk D`(ОM ;a09*$Mo~+B6n{[DUw8;Gi|yzf ACîk<}ntrc3!4ۭpVg'*S ǟj?x9:CG隨 ^MCdJLMG*3 fܼ1枷ڃq>:讈T%ꕈ9(E͹Uq[YӨ.` <>t<B$#.^ex]0Y4n`];s >_pqg~ܸ$CDap#x#ːn~)H.Yqj.?]sqVVS>8??|{L{"RL=4h,zO<Φ&E1l9#oy`PF]44^>f:筚r/r/_D7lvOK/[6P[ϕ8 ^KשO͔+TM3;7ùm\n__>*jmgf]O$+^Zy(1ʸ%7x^S_ 4Fr𗽎<e ՚%=(]ѐ1g?6kc4 j֋~kψf׿o v8˺υɋy@M S>S>S>S>S>S>S>S>S>S>S>S>S>S>S>S>S>S>S>2cH(hpython-pkginfo-0.6.5/tests/fixtures/build-0.4.0.tar.lz000064400000000000000000000271211046102023000205160ustar 00000000000000]1IVb}]]swY`] hv>;#gvS%&-3\J_3H:o {<ꠦ=\celw_ BoВ 6Xux/=#RP(ЊJ<s=bcH"( 0Y?A0u;7'GS^A b$%c!Lwa8,v|֔ Sw&B5AO/)`#5Ử(SOuyUPm|YD m4>Vꬮ >>wTp!AMP_h_Dz-|B{  OS޾yrM:Y|Rs:T\?9!Vp.=[YTƾ㏙hJ:P~ +@Jv2?.ZTʳ_(VL߷Ovp 8[UIԀ+`XRB"[޾Yc"IhWP?T"KQr eoi._lʮNV02su &O"mHNΜPED"2ұau̬R/-50}3l{ȎM xUr(1XhkkYD̓D]|GB#K_-Kzs  Ea()GOב1;RoHA xnq^ 5 +8`J^\iB_T.Bd,@7 ~"\NTԌ$Gc95k+ ϋY(6HdܴR&QOo ͜ F\N+pZ]*@|βk$,`+ (\' ͤzr2 ?[kr.֣ 6niJ'8ZeĂ_ dUt?ܥ9P22髚9wEF>(T1%n\B8٥{BvQy(~fR̛huZ349ij@ Ld#:uG>S?Z3&<mݢ$Qĕ&#nf !:EuNMAسxB+]-}w/z[wzo.4~%vLvHdW@*8wOMk4yutZژg$JG,^ǪxBեeс)_`YԨ%@%H?oJ~=k;;CEYrb'F* {bu>@~:meqf ybk%1hZ0nQsm/GZf&;Cw9ӉqH}x47c FEYR_p8=)yU^$;SE iy'|!)Pq?h)I",V"ʹ6eRʧONP E}sGevh4BOZB=vvK"°p 7[5|³kݠ5,0F5QCiq4+OAgd$.ﶇ,]^[0 eFM-@|/ ο9(K~ ϖ%YAĹ/MB 7O"*rifKۄ: HW+x,Y Z6|qChA9> 65DnlvZ_^zTB nAvT":Z9JP;8$>$7HYT?$yLQsfM, !vr& gl(W;XՏJS:E;SQn|l(|U7rxrxT!l]_cㅊ8iwm^tF.c_ pZW'd45Q| Y:ٗh嘷jԨ^Yh%,au;w+}8W:wIx+KQ+{|bWMdэ%xNږt\J2UgOf:R[ ;@оS؆d_ѭtWU1 4`y#lMG(y'gS}Y'6o^{ڒo)skR)Ef)F!)112YQϬ*r$W+JtFN}M$Qǧ$7-?æbLwHZaqnمފ$:UC r rm1Z6V7]ˏ@3AO˚e&̶jh~ƆF!EdY7~d ~+d}tFQ9.#`1,d\?MU ?QTP pXVc߅Kad؟QkDՀlP-|M8KOm ըV+$yJ\2M:hHMeR\Qx9 2JPrj{)ek 7t$k;k&$]ZR)̚d]>OV[f(ܸ/#+H~gT<+6;5/ z^|{ i{}r38w,g}brZ,v)\?eN/IT'23ʸH.')4=v4Q ,+<{N#Џ+h%iyRMTz@u(qm D09Vi ]`JK|҅RqA):pLtzfwȯɴkT+d[dp$nئ_Zz@liZ,srh,g!3$dygX\&> p]@І}vZ~^N\(Izi< ^}!GcĜL;Yٸ|CeE~9Hӎ4 &[ycs/F|1H_c aw(6_J=$*س:~z;.m7:h'e ;rdxW(2wֱsWlsH Ѱ!d[Aٙ q?SQIk.UA^c9`ffѲ@z3/mm8b_#,GT 1q. ;m4FjhˈN .tpY"d!#2Hg>n|Qh;{)l/ʒ ̣(IuDN;YNx\~e8G0%r5u_͉oꚔ|sk `uUpŴAd}isUӄcjg ? PO3,{1Ej_cz5t/Jtr?({^ `J  e_9|{;~IMyOxђh9])m UdsVX`339aFٔ;uaLRA Sٲdi3,Cj_}py`[ه@uDƮ4(dC- FRr:,9ޛ Lj43 u.N=YPUk;8׭~Y_i9WsJgtղtW tv^6tC,8Qr!qŧ1݁1k^ڮ}M=9Z)}5~9ξULmY`ZIX(p/~R{*;`q< 7to<)8 [ÀFV$;' J5*&!4 NIN B㾲 p'2%ZjKux7IhFqp{.ifC*Tf d#wʚ3ۡu;I2Z6%xwcm]|{ [t̗9_Βˊ̩0?ZǤUFY}iypw'﷒Ijp‡[3 pe)CMc7SROxnĤɦ)0o6R~+:df)I)d\v*؛4=B[ꠞCk@R58MBɂrXaA6i &[X_o+^)1cS㢙قME'|.v=^N965w'=J{Iqyxx}>2S.6)k`OLRyˎ g.gAd@oNNJ!uzqt/8]m]fke.'`W Q/.\R!~cn_P?7}3EWs{G O~ȳVt'M@:=r%Fuz`PgT M{K[R'3lB(tfŬ`ԼƵE0pEٗIgNylI [4b^ #qߊ́$SOۈ 6(0Wp!q~M:"&aP + ^N8sgIpRԁ)$w@&~NMPɌ`Gu+)E (BzSˠg;L6-ՈBngBJaA-d)(#wG8iM闣 jMXᯛ?)/1y]h^A f$ +h%R& c*GT#? ݐI> dnMR-kcj|37ݛdy:,¦[ wbll6V#BLY7 xU JRpO[WPA:A5.+YgC|OKēq \+3$4~UmE4 [<-8Q( mF°2G{ݼʋ;k"q@Tpam{s áOb_!8~. J15 \8F 1(eDèWjMa(pe:= q z] g륁pkW$ɻIڮ~*" He\ [t1 Ks$GsC3btmu8f߹_f>Ju8V~/%YGIv#6cPJ҃|W:(0ęÐA|U;`L If0KdvsѰ#h>(y8,\FlWd/EKmap8/}rW J+V$HqCLo57Z ;#a*fdIA#./$uQ$LY1G_յYTUD0iKGw[Y^7AEJOʃCULzEځ*< '9xEW*O.J. 񕀷J,L,M&ALĂn 0JapÕ0Ξako!.(wSBV>?lrpvPƛ)RjöZ6ڇ5qsfğAz6qy9٩.ŊCQ:N#"xCکZ PWr(+/[%SPo'R'TY?lj+MB/ Qq OL99cCxNyɦegg)f 뱷@/""BÛf4ꪸհs봰uP3!P6><;s$U~]oQLo(_IXw(`JSݢ<]*X]dLOͺf6`r&f۱i_+Ҍv}g[km. vAr9$)hFI a8fҡL'_.i蝹PpQl|"۲+JR b2f ̓vo`wL~w 5Zn[~ZNZXTc훳&/{Ӱ\b)6lANp/O](Axv.XŹR}8:xD&3ιK+jjMXno~N| Wcdar[eއE<'4[fY/0cD*^^*BJ KYt0Kq֚qFmK/%xe{x`mk!Yaḍ8:x.Wl蝊зEx=$`Շ'_J) }tpq\ i B5ʿv(3ύ6am'(A;S2$2p\i6'w7K; RrJhe|[Gp3,76(uM@/O)^֓ؤTq̏NB+du|F=[fs7gfѫ 3X:i P XL LEeK'[XI_l=P+̖iċɶXKXaI\'}_F;B'-(jk]YeaerS) )})RH$;!g@$hd˞=;i8\Ea:{qB9f4mf y*8d 7<L7cCN^ܛg2+@emNsfD)JݩvJb~l"JNUh=Y?R7m-ǧBjqVvqJ' z7gћ |4Ee0#}N҅ 4ayU5Od>ڻ*N(䬑[ 2<>.qnls0f {q%'.59f@W2!FC1c|q>~*5uJ|E ss?97|K~|ޱǻbx kFeHIRĦav(:\nB $v=Q umn JЅ!˺SFԐ'{G IЖR}T lƮ;M#[ۖ˯Q8LROT&h$IY;HS<_geNkmh;X/[:NfuOZ-SEJU۟4ޝ8fbPpuecrD&mn4r5DļNoGΪ^998OtG78ƣR丁՝bN5֭v~ɉιz3>~/6!5n$A+wfׂv3v] 8%+AtiH׈ ~א;\:{l'O0_6 z~ꔌn6|+_< pIMW-DXUϜ @KYWvʿ9o )ʄAR)eZqS=BԥI$OrHP@,#vPSGKKA{h̻ 3*|ekּs ~ΕJڅ,, 1R/LOP)4$M82eW*.e&āx3HyQ!*L\]7y_tXg3`dW47OuI,FlzTjf$l-05ŮUNlf ]7;"K=m-x=#.w[hl"J-:pb7WLTD߭ ߰Z|sNZ٘,އ@)EP lx}Y8`+Q4μ]%س9yۥb!xZ iq D,1)j=&m}fb)PZT+%TOd҄Nt]CEUk0 '46}K}ͬs3/ۅ+js#%| A5[oя*Is[?&OP"r|[[QA҈OF#y+O*v5~^fD ޖnIQu֤ g{~LպI#0KAě7ӺOx[5=bG[᝽@,Q߿[\.r5%?T()WI͝yK\CxXvl;E)28(GV\'70vȎbN!ESqc.g?W{ZB;]Q0C:[7}GYkp"l OxsF|GZ֕iюgZ 0ko spNQJ{dιϋm}ѧ}AaBqA-;Ux/\ۯM]EJ)wb# ԘՌ@vr|6!P4#Rg (^鞋p7Pouy&ب{\c%`U37D(P$-owUg8P85NjDŽڱW52TɆQ% u +}RCkp5C))vGs7h7A?a4/ ZEd,h`a IaL* Imlp\- +@iFbxy.,N}H_F }ZZ;R5?ZQ߽0%Aے@w3RӘ?ΗXX1*9Al2iUZbtCeB2!ՆG *^ P]7Vd(0įs3ʨ\]M"dlʠ+ʪ/;AJ6A4uw˞P :t +RJ7yғm.hT$w*Dg˩*&_o,"[+QwЕ 2~F9mD~|i+S O(?;I~1W4eEe'wrR?9 ճ]C)"@&_] gAuh.oL-oBHq:D78?$ie@fIIEI(TBi;q[(ޕ(d:pz+uCq'miCu4?;d\JqW^( >WFfj8I<ٚu&,Y#zWD t9ފA~^f9wAvٳ6dCyݦ# _-HYeG" п]0d(LWLâE5jAHSR[RJҸ nοU[#Nژ'IG|V F_~ bu>mӧ#VV\VYIp`_ @0 mBNhHϑC@DJ]f+q8:D"e G7FTf?zq69}ܝHàn\Ndo K,bz# ]jTZ`tzF[AGF/( cËxH4Ns=Ϊ &WlH$@/tv8f߿z>T7%<<ȇl:l6̇%j25.Av1&Wi'.a 毿Ƣ1{U5u 1[POY=L)H-;뽭r#f2̡&0[q !bq0Vr`9N`cg/QqkLKCb b):Jrn=ES&lF5Cj5+ٓ%@rKME;CeP R-B AFT ; {%Ȱ.'VEJt #H+,cj\~[J+GN4>NJ;l´* ;\ /H&'pz`H=CkYܾ;;8DVrv !-U95:-rDbRFm".sxPOfށ^g`'n$G=y #`09 S buq\uVߟwzyK¬K 0BZ6u&U-E0~m.TxL֕vzcµ|%u_72To1N+)OGlF(Ng;x ;SKaT22i. vc;=c4e]Hr8WgBdR;{9y;Fbd59L30y/Y^')Q~Ψ_7C*\&XҦJ鑕 )_nkzXXD ":?,_^ ~Cb~œ!01i.T'دa3\ `M% p]EGш=M[v1KJJ,F!n 9{~鬨0+4,bUE$IܡBJ!(|na-a0bgm$g^*R{Vfz y"vAڦB(t9 uRSUY@JzvXۅzI'9\ub?rt*hagjCbChqM1׬nDڷS3S$ay{ܷ;+&'/NNdz8n=؜\r*I@%Yd}u? -8mf,uLݰ,ӞW0yÕ{禇@q4+DxZ45 \QM;G#e^bxOvgRQmtMs vE^|%0.' ۙg@ԿASe cWhgf)|h8YoU}NUˈ{c/Oц%y8|ٓypu0}K;LJ%yd#b U ur=ӻ-`w]=#n4})aRRab}9&(* +(iFNYZV=Zo"cwdY[?[RqiU ΛkBfGSё[D$wj1ʚ,BnG-в"dgX@1J|$kӁ3NFO!C>=)\աٛ~"HPt=*g8m_S)~AX#zy5̱{zx/A˦,(%ڿ"~.v7 y_.= ehiN̽v .;I_ײ/v8;J+%L;v^(xe5\(-o /U`?Un~^4āq̥*Af 0 T|gH;Ad6R<%zWc߃b +fLkI>ُPbwۂ#w/EN#;p(U~'Vܧ+M V1Y:tCV4pxFDIy'oJ~oCGb+}\DV:i6JK>a$؟عqMlh?_P=,GR$Pn~JU08e7WWR͐>ʝmڰl$DwdT9xRh%Vbª{asGi: R\!hYu k3[b ^V}r5> WgcM}VZw97Rk8϶`a .+YuZ~N0I_yCbď](L"d3Xz+f3ƋO}"L" Ӯ-RFQ@&PhoG3TTz씝-_@sǀX1p ^ M}^+;z19k27l)lH#qDmPrL]`DD#ږ̿:8U nzѼ'5ږ_T#dmyQh[;XQGr*Phm46A+,kyݕ>̲*Հu\+ȼ뛯@e_T1gM58)ZM2C1&WEp׈*h^.hH)$Q%T 2`e<K4ƉO>Q@̂eԕ9}l#9`(-Y䤘^vqh$²m8yUHÈw>>iRY}B*Nl.+k5 S_5SW+cڴ=+)%ky{< (K6 bq-Ԗug}s BҊ2vfYuee a9rx*(Ѕ&)aN#L#ZQh, Ƅwߎ\&Wug3 rN;iVǿi۽[5ϟVEZꊄ5KryMHt:bC=B}{G8l;аVqWŽd,  k#[V!Dښ4ph׳7,3 EehO\D+wz;K?JZ~iU}ZS򫔸L^).+y8ÎqJb8|Dr.Q*[zXa2(y/̊:V3Bv'Z i^N ij|zeW^c#h/`Ƀ!9 C!ns2Au@}-M[HҗJ>~;sXG&joe!O< yV-TAriSu|VŰ{`ˤQCVgks[dBB,~71 mGvpV#;,B@FE+j4NG*/:rb)XjEx@3VA*ҲU{d.ZVadSn_aދsdvvZte U+l+8ǿ@SF~j=o꓈E,CXt++1s9`,Z'?q!%x\M [x28࡙QXm`i1'~zmDñY]Jxj\2=xUy?;8ޟ&BƤlś.{'ʽW~.XS&I}=ǀՏ;&ME?rDyְdK`0u;١?P|ѤA*:GzRb;,'KD"~YO\q8kknQsB\-'g|Leg?l HGo*c좧53x-}޻o'PUQ otKƓmWmϵLjv@jEGfPO-}4? /3ZYms/ܮѝl)$UBC /İ/kօP,2.݈-dt\s+߀hi 2-^ ic<_ݢ ~=̾c,!y” 0r֦{0se2x2 Z_ߎ}>$ ITrjYRb9B;z(F3)mĢJ{)ӈG/a{G‘X`;09 =3ԚEx߀˟IH1R-{D$|/K踛YfiGܣaH5,AGJe>CO(GLVAFeD笻ޱ:'q/ߺX;Dgrz9v"CkJ\4Hhwb] Vc18U@ :Ͱ҇w#E,Z[N3@7 @ M/ePPnڐcֺ]rRm~w*m8Rw,SovjA[\K8ak<ߵ >﫩0Lέd[-GB%;1@7k87hU:au/qZe lS {#US+`r)@t pRX-Rrb`lS\"JōGgo璇q:##''exY0GsUTr er BwI;+׳*$`9I(Wj '"*4#ew'--=:^箧usz +e09Z/c#n47HPS <3s\ywqWuo$5rLVS|‘62/2_C,z 5fGΥ?윝u*lLq|4 KShJ-EʝpA@mWmWe|l49"M9S]F$ .OoZ?F-hCc5.F^#rkIu+RbVD %e8H#=eЋT=,2Xxu oiQWϰT˝9@?uoἚ-et>u ډ`NNobXAO$z +:| ~gv0}ޤ5Ǻ6=or}z&| #F=;j;l"M#_w=^Jwgzαh?Dʓ]lML '&:q\5m!Jd 9Nc[9Iܻ'2-gx]@-IKtNKɅd3*]cw?+ @BvG={hKBt{6Є;~KjAbW;йbl]6N#d:a s?5B܇4ב.!fB X):Z7{Lbryɽ+zBs1?2$\SBz==zMiuKW ["_ї{HD:X-Wۄvٵjc0_]_tt"0$ 'c~tTzGgTώ`wub5EiAmr xޚҏaej ?U7D" 7>j.Ao/^Y ݋Vtr(pPsw{aW0!r( ^k;W`-h32!%.q.`Ztz%rB5FBOh|Bپ ?parY8-{ (ԙ[ZRDija&a*VkAlcE(Dzkliӗ6|.Z(/LbnMa5\>:i `ɉԪ?<tٙ=cUGvs)HVT['l & y8r7lJj#Vˡ" h>,ʭԥ+)PLg kjNvk'Yڲ'yǚű+j`0$ ,n1D/*FwٚWTNN"M݄澡@Ko,]"CѫQ5f0Rkrp.bʷ! a#aS4P₧TP}øԖy[xBt?J'4o]N{gҼ.p`^$!/7njvjR}'qeY~"Wȡ*Eꛝ Y(sYQ#]-|ll 6z;e SRNYcpGu;7?rt5׶,ɻ8lc]ʘ!SbF>*417\]5g zAVL@'8ńcS9CGC . SC%20Ɖ|SLԗ\W{ȸ8Lgpܔ(YGnAD+ ܗdW el%l$ a\HxB++z^:JhwJi@8Ays I"7aBv(n*&(> $8js (^25R|$7қ88" V!SkP:w}S!Ѳ@6 +cXz1.'*-zՃgxfLȫD5ZX+/5i1Z0Y`#dM; Kƒ;ő:*|B[c}+"9 ܭ8n@ervC M~r h_z ƯrE[t}>' N]U*~%rmL5\@x8b~-޲9LOI|rTZ?A( dȒ%Z."պGg&==/E5|V* V|Мa4o_%^#ε/~9wZG^) ,Gq1*xO2m$]%^J֔9LF]vŘLL Z uϝ+hkGW!}@*Ѻ]ॡGNv- n6< >ɶ|$0r2tRӋ䩅#y?%`O<=gPߨ.Y]2b"YyNnWBr^/TsȪ ڷӉ8Z,K̈́ѐ!)6mЎ 5f%ݔ:gJ>6)F8MjX彣4~yud紦b̂PO(paHKܤ%Zc%lֶV8_7/ZҷBWP_a{(6~'S ,2zp$B`JuczB ~[V"ʫ#H:`he5 O7l%ưRR7\]xE ?;}g J`Aau-ZGt6.Dzc\ܐ3hFޡ;# ?:"f8{ J&rs FMD5ҹ%P(mMryt:+(W#d%4ã ʽՐGLy 䫚R)|6-9+BD'jra GSѧIiVdўe :5viHz9kjKy^Ji G|fs"XoP2oA xFsH>R: h` J>K۪+zτ KA .oش1?$EN1B֎cG2bD0_ZnuiZ9[X-U!4I_d} \P⾀tntz[3cq<iN -X[شB|ƍo,a c.s {Es۳ơ [\{{R܁a9M\ZA:6-a|r$5i@\ {i*Ҡa } Q}3..mIb0Fg ZK H f䧚Yb_5/9\AN~'y@!#فݿ-p4zHPWWf:FIs;>&2V+Ի{BkPvҜ{ɤkkI9QF* `޸hA tFVS\%-p7D7kWVuIq[뒑2h@O㙆~XtH_ O̮W^gx C2bԖŻD"!&I+CiJӨ[^pnW Y& BrI:Q`@'njP?p'cp,VZPQp={3FOr꡻pIJ;W"7xKE'-jտͦyǪ>)Y4R8.v:*m&O[t $)h_xd tNƦwD k>1} guFhn J=Wjy9fN2?^<_29-q@P"MoS25+w)\zgYZpython-pkginfo-0.6.5/tests/fixtures/build-0.4.0.zip000064400000000000000000000435141046102023000201120ustar 00000000000000PKR build-0.4.0/PKRbuild-0.4.0/src/PKR܆ w build-0.4.0/PKG-INFOVn6}W"ݶ)"ɗ HIP$CXXbMZrW:[EBax̅s{,fy6\~s2 aVpwV]vn,c  r)109 {GhQw~Uz9IBiaSC¦if"%%Pby?Llzw.CHɂ3p 6-f~ /sԡWX6fs&7ԤZgoR"\]w{pp4< 'P7o]K󭱥9rJfcv7@Y=>̕Li.38ۃ DDL+SSÒ3<K\%䰻 0M}Db|wZF/{ m <'OWxz/.])1\r{HP؊̨BGQXgE՟L" GcjCL (Ps:e\DvtN}\*ra)ި r;nh͘n-YJe#!4cNZEn +U&7/}%+7.jp_ Pz"?]_|]_ݍn&X f s,rCiNkIj~B6@L\.\~R-}wG;j vÝ5~Yc(w;k؍%ɨ<'7B5Fxwk~sΟݫy 2?-^AKGj), 1B[ɿPKR7VYbuild-0.4.0/LICENSEUR͎0)FvZUUMb!AY$ q}u&VBf< {h߾s@<|ڏն_Gmi原he޺ fAw1cjp01{ .  dhƻ}8p {WYxPt4]ЁPp1#$nv@oOpqaa8T4iz7r)8 D +Y<0a%֓6B-,W[(-|y,X2'$["兂L,BPU^/ leD&6B9/$0X1DΘZ#}Yj HMXA`Y6ck/I $j+BRGil J2&1lU h"6 N-cK(rXhSՍ(y LFsY <{9PIpuoZR2*i4PKR$build-0.4.0/pyproject.tomlUn0 yh{R.a/A( a-BƦ>}CR{hqMJ S#|MϞ3$?n\\s,`FVG]L i&` Qo^њrvG\JЈ>'hܺ0iߚ80` n庱D}?mײH.p#|p=N `H UTrg 'ӛ_&_[1+mODhfz6,ӾAbPKRgbuild-0.4.0/README.mdTQk0~u[dPH;hJ-KE\INSZž$t}}F7R$Y}X-nmBSf*R5%KvnpS^meR2(ҶR I l,A* )!Qnf%Ԥ._Vz,veXS iw6j0[ښ_yYƽP\nuHqh03(C:T#42se[7 uy ʡھY]阱UR ţ$ɷt>糳lzh.EOp4=e%Mgk0v b M"8IU `JX^/3)BtA4IcX m9|4v*$T0!BV: xn*B瘙e (|sGރC//q|_J;g]GAb:: VZC{NZX 3ebW̛8TsؕB@X w`l Y,m_7JK0k\5oOkͣ~ ccΩù5q|&8G8`pᯠB? ~{ R$K-(qUu,Y~o}miw@reGZ^]?xZzXܧOPKRw!'build-0.4.0/setup.pyK+U(N-)-()V-/*pqqi M.PKR*tOZ build-0.4.0/setup.cfgVn6>OzoFLYv$:hu٭[ 4H7S: P'k (^]M#dA:v&[a|ǻNF ͵{ZsjxK蜀%R2{m/.Sr<(ք|<|RsP'Ex+m۳3(\(x"EwoTRA͇KK ,dp7oo1V?BhBb2XY]Z^B*TZ _ӣ1jqj?v\f8cnjA·NW%8֬qk0zA+'I)|lXĴ'> jYйcB'FBl*_KBtD[ĬRfl.N +Z7j1a,%kt;kuCUS#S(/P'T+)Q.qѱ]\X $qTBb{7':D 1l&o֣!kPW)VfgokCv~B6>cS6꧒/_R͌T9-!~`e2ʲ ʲyt=#̎$󖻾5 NաMب4e&ŝtjWBO- ƹp/zI5[:8w1lJ?B8?ǹz&B S6;%Ӻ5r1cxaC#8yAC4{mzf|TX^ձk7! y פQ"&EZλ+J}UZ] DiܝrMs%[;'#*c~[bX cU==\\JWX6fs&7ԤZgoR"\]w{pp4< 'P7o]K󭱥9rJfcv7@Y=>̕Li.38ۃ DDL+SSÒ3<K\%䰻 0M}Db|wZF/{ m <'OWxz/.])1\r{HP؊̨BGQXgE՟L" GcjCL (Ps:e\DvtN}\*ra)ި r;nh͘n-YJe#!4cNZEn +U&7/}%+7.jp_ Pz"?]_|]_ݍn&X f s,rCiNkIj~B6@L\.\~R-}wG;j vÝ5~Yc(w;k؍%ɨ<'7B5Fxwk~sΟݫy 2?-^AKGj), 1B[ɿPKR3`*build-0.4.0/src/build.egg-info/SOURCES.txtu 0}ߥ3F)^*ס&cM'c:"RwM9׻Zg=[l\Ɖc%Y28e}i@ cP֮AQ:nd@1pR܇mt~ݲ0׵0xk?ILL6nF%p PKR!Km/build-0.4.0/src/build.egg-info/entry_points.txtN+I/N.,()*,(JM.M*IQUz񹉙yVy%Ey%\\zEy\DPKR9p +build-0.4.0/src/build.egg-info/requires.txtun0E =@#pd6in݌sYG oع(#N5+P"o.^02<;Y8 dtaDwg Q9]S^цVHYUEhiמU2mq]huˍ1 鞲ĝɍq Kp,(n%ߕ>yEQVh6/a1,JK: x$~V蒋cvTfa f;G mQ<&1t5p7оPKR=k#,build-0.4.0/src/build.egg-info/top_level.txtK*IPKR23build-0.4.0/src/build.egg-info/dependency_links.txtPKRQ3 'build-0.4.0/src/build/env.pyZKsFWJ17ц8*G=T(̀_ iuyt'''7,Eytg! "M*JLYYTEyy"MC>-.wiޔUsَ1.iʭHlCIꚾ*&o/^*ڤ|>Jy.e]R*  &;y%!e5 ¸HTRA?R$̸4!dKm"X3?+|b'X$Yi<ב)ԪDd=$RAX\G a ۄ[q6[B1[;DlPsT$Hu)n$,H)?cN=M|t]\ c}acS~x}:V5y7)D܀[@7NNr ?o T?2V/ی UB#'J6ΩB8嫟@-\_wzt(#-O9"9{1D`YtXCƮli\9E02vJ & "d+$<19 ȲȡgŞKhA^4g*HGS^Llp'Qb)SlSPB6̝@*;#1vsFi~`GSZ`Ϳ:d`+>ԗMg嘴T*wB,3EÞ4l6d-&F%Z'-b_XlC6L(7MT1:Ra v( +6u$ T\֩"-kIE@}cXA7’B=82/m Jd*,:`'2EMUQ?>(a3yfH IMuՃ,nAur)P*(U7uj>)R_jw"/)1*%tU{w85ٝZœ!vtp~;bd %ďDkYƆa'$dkOͷ(VbҽMb#SVuN 0-nÆhEhЍnU҉pLL6* |6L̩_<%#:go?[ݾ# ҪCñ,?|Msҭ e];vqZ4?]V570'{,+'n8eNg2N-="``qҷGY3/WT:9"O;U ,C)&oκ5 l`.=*+'0?(R7/w)ֆZ_Y}sJdg=~f>&g@3R+t6DQY*e* W%,&|Ϙ? Ƈ#J,xLA7䵩Yzi1] e%rhD@5֯1=VQ ^5'+t!EI_9 "V&BBQ%l>˹6kH3NY˿'d.Y N{+MyiaY's||JuD!!V߯k ,_kVOQڮMyxPO+ eFDXu˫m*ZH T2%|:: K?v ׹Ac>HdoQ=71(7JiOLa6 6]<̏k}~&*t|$< aЛP4s.I!4SS\y+zxHܣP]8zBr֎=[ G؀wnP4[O]M)z:I/7({]׿Ʊpq,quCSڮ3U:mUҕHMͭ/[Ћ>2B'igE30V߯hs#:S`{ vWA?NDDԑap CƼƿW'nPKRmi"8!build-0.4.0/src/build/__init__.py[msܶ~?L)6SM/OXmg4Ix$R$O>I5cߑ 3Ng%m=}SѦg[F}sX,6+rJΈ`))[iٓW򶸦D\;k<'+}}}-@=PhzK_yS{d M %~oXs--ow0[] ;%+{|=/=SrSmQ1)yS^-Oۢá)yE6%oD `4%js Z2UlQ0pgFǬٶ$K,^ۡ^qrX77~N kZ߽WŏCP|k#Ts夽\n=J+#Rð釶WofˮA==.LRWt`ꫫE R.K|Q <` Xe!WGTj('ه/g/a9*hSEK ]߶d[}^>#5]A:Ʃ1 |eMJJx&ʺ@V~&?{ &hE6{r۟`Gt(P ׆7 -X-,[ݲ>cAmJ[3RKWxa=˺$ӯ% K@ Y$\'n4d}0 ݲdLFݻ"rO{ i=&KO R@h$o:ʹb!!meՒnEWUr݃{,YXƥ!ؒvKX/\ G/vɴ$?z EW$9ݟ֐%R3ZW0CLR # ̞qǐX@qYsϚ 3 R67o8Z zPg)f=KJ.Oh:3(Ml@`wA,77)wC3 Cx3dph5MW¾BَfÊq :3C0mL"9)@g儢mhH cWWLlWn= i0dD0DIH&=;^*pLzgEoU+"ܠsG!(%kD 4d;i%?o%sFlOt QtR?5,V|DzǚA`(@ɚ!#hp-=j'a:('QaL@l3JZl7^4L6:sF˽/[T9"XI|(VUI94cj%LӡfMII=(yRdWT&WK<I!g!HdUdlbxJKg{@ta7Z鯻Rݷ{SDf=,DPI0PÃo״/XxQ f<[kc5}UO#}Tw@d1㜝ɞH₴iҠP ?$Hˡ2 !{M n \-QOU)ը t՝rӣj%\* pgEiJQK{aImrVd)X "ycŕDŽ 4P@I *GKM>H$8Թ$gհ5BPZ:#3ܭpҘizG)z&s*=@AQ e{ '$[:BAZ0 th:&0@4I %P9 ݷxwHw:z{ah;re*X^ru(p%kyQ.ܴ[,P ?m>;2,eF[t*I+@%I#V +o 0F+٘Jn *R8ʙT}7v`W|P߳FQ}KN\vjz|E 2!Z@(  ^YE.^>44RCV붨C*xܸ QYjpTF|)2Pb ~=='M/4gK,xZ[UPau Y5D~-*K!\p`ҧsus=C/a7ڮAp 0+ʓC(`\TJ]!|d\@lrȒX;d"*|zD# ^@9xxx2?qS4Xx4qJ#K觾ṫŨt`D #j*R)vFYOބ4Vsi|m;$^Y=|7);R-Xb1V0Up4.#qqB[ ]J@ W-: &?Vk.6L2Rw{Ȅ8\Nx<_.Ђf,BybJH! c$dKE*HKBXqKV¦ä ɇfS7a{kⓝr@TǨ2fNCXs9<}l׹\Zbgy"2z |'SpK3GO RD#\+奎ZIrnRy Hlnx/ap!%f|u<ðzГhr@(b5W_Ct^G.]5`k,ԋaг/59)?3HfȦY_}>B)]^yZeCEM^Ʌs0 bG%Ih6 ܾRgN~ fY=_gg-7OAmA*.OK (hph BI^ (VY'Div+cx_2a΋W9p3|[8ع嵲 ;MUS2cm>G I<0~=?ւU˜3!.F8V<3zژ f_-ϱ{u2^Ok\ Jbvm|Җ$007? RP6e<:8k nj\H} excj&bC -ty[X9YsC]\Lx||p#|ݤ@D[9RxҒo^nM꯳W,e6 \ 3IM!xϸ>,5G&չzr羿N ?s {y`=7--hc@'piOGoo^дQM胂cMw'ϼG}x &PKRbuild-0.4.0/src/build/py.typedPKR7:] build-0.4.0/src/build/_compat.pyTM0W 6H/aٖ҃)DJʦ^%~7:z`j\1Zs?Ja׿~׻o%pꡗ?2x m:+iQz:U%U/Iyc@bX4RXh'DDpV@֜e1+0,*RdQ:x梛#2<ƪ=B(YBW7Jx+a!/uLW{,<~<@U;m<<-PNiQ Gp 1KRjOΨױlbON&Juɷ7}TwsR\Ӭ(Ɲ%>ZپС% ;G?oa2jIJ2zY夳C']& Av6 &0%lN͕nc2@{kvukfsx\W-+IF&oOZcJ>AL3 9ԖQ#u"cPKRj - !build-0.4.0/src/build/__main__.pyYo_A$prmWe"nM- K[TI* ?$r>{$r8p>c?'YArV)z4ZI%Yjt#iԤkfFn8:ojUȮ}2/2/\r׻ Me|dJ1՘|n(/`wlXU:3?~w5|v}&Pp)oІUiyoe8!䘬؝VDprx)nA,˫ l8#Ȁ$gf'tE2laa-n *-US.nȼ&SU|ͧ v[GhZ:%5&J˅5[1,>f^FpeB&?l%)*dF?_}Ȫ{*]FLZ4\o#@G!JWBns[Rګ.IP\׵W?E[)DIgVNg^vUёy^"Psb JBNWVUuP8 n$;т_Ȱ[ϵ?4:E_]}zuNj FA2T@}KΊ } NzbXJ AǢ7aY]Q2q۔  PQI'1'6C\ KHhdm٠~*S.Z9øչ=X.'@#Lv@mV:J}No-Qli7pp*@Ze7p)JCx4~oQ,Av?tIp &J$in+[-I*uHعݾ h-N nY Z|5,{, ! }Z[ ^(ܨ5T;p+Cvsa0W'X"SE1@֢' c pT"Ip 'vhZϺdX̓\ib#(P̮eC_^Ɲ}>εu|jx/*9LvSE4I .%Xj`J>ۤ}&teBq}( Ni'eNNkF߂̃w5ҵ>0{d.r7ypdW9a*lG8,S/="0ITz&m'V,R{I dq ĹoQ4G+7XhHFfB=v#FL8Z$kv`q_@54Ѿ~-~Ȣ^Ͻv-$˝7MDT"^ Ӽܷom?d@O' oyxx Nl;16}:B2| @ AvMŤ-pM0JBU8|J[L\Q<;3Q7XQtMI;a%]3n/Drx-m^RԛUH׶EGPgີg7y@9&܅UH/_EP7PAմںy޴׌:W枑>x<ӐCN^BU6!H0ZAX3 mU۠p~< ):<] 7%csoxar0ekV3g7uv m s8QfV{J[$ n0izlvvBa .kS(0IVRXKCt(a'GGp1˦GZ&+#Y]OXg@=,Ou/Vw7oPe]8iZ wO$I;7-ۮ I+`|bo8u$OLO|&{~}"RQ7d[7frOd.>'Jr(D#z OTujN":Ҟ0>?4xŧx`|֦MzCjFz Fj,NI&0lj(>7#ʽY!,gtv%N_.^N?ye|F`"UHDm_՝H ctXF=}$թ4Vz~^ @a_%b*%xܰ/+Fbq`mXHp{w+O#4ĊX5潄J8:6;h ) rڎ TPX3X_-~3A8Et땂KmL'rxt1EtgFhkmm 26n۵{W]MVAJ~BU0/DM |"tdRha4N'E>!KVz%SΫmBdo(ӊޏ>ȁQC%is^2T:PKdSо}Upy/__init__.pyi]A0E>}zQQ 1}qɊ>zRDy = \`5Sn,ϑ% oYV?s[ S"-q ^<ʔ$4]=*p]B5u70+)Ȱ2<1tGJBtz5, PKdS$37py/__metainfo.py-/*Q(*L,R2 K2rs4̜xM=&PKdS*kXpy/_builtin.pyWK6W  hC."(Zhni@f"Ie %嬃/|3΃RMkwI5(*cžSW ׵R<)m69wx*hy+h7/>?Da6jj{qE͌{~ *!pڠ S"fрS`.R ܾ" D1ߦ?Ekw[*lԿAv"<=@hFG\XXqYM9)螙$YA/>9f9U㠮ڵ 8"6b%%HM,UΈ3dL9ƾd(M*U#ٻ!~kS,E/CR܌Y'yp ;n+IӼv3)8P2šf=`P>P[=x}W+}߆KRB{2Aފ./Yđ{7b)MG^[:Fe s{=>|;2,\3'Co87BVJm^ۥdžV:w{%1F &':vЛ$gKIf} ϥnV4F}tK:/;._̰q=G9GPՖ>&P6*+@F_,zwwmƴObtD}xd~?&uX4ã?Svnl@Ձfd ~sIxzեB}28p/|gpH2u/PKdS(/Fe py/_error.pyVmkF_1(ˇ*)+LIRIb²JG{gwezI\N,3}fG}K$Rߩ%|H2S%s 2ya+oA "n=ʢ*ĸ%<b)sbe.LhkL=+e+ DB(*$ӥT4R0S#b !aՋtMqi0`K@iDT>liKDwS{8*CI  e n&U*1JS0Ы\V;ڻ5Z=#^N45C0;{i'&EBIbp 895)j7&r<:&PSj$3ܶh nTvRa;5iB OÑDU5r&E2w{64 ZՇPKdS[oG py/_std.pyuRn0 z CvVCGCD, "_J‰HI!1H^_RJsnK}_*?]- $Юt!a'* 8gtG>}'>k!h9xU㲭>bBD $jI$mܶ5OǦm;kM'^xevI]ű!gVjiuXhc7V( o#!goHͩXy]^k8B/ş(,ڮg02l RH䤭zTudjo#ʮmʟYPKdSC'tpy/_version.py5 0DPKsRb+V̀ 1sar5\WH(l9'><- w/kb^`4ۣZ-8g>PKdS/*r py/_xmlgen.pyYێS^L$g-MfmѢhnf:0(˒Y7U)矟>z cm aevV׋ MHR oIq6;>z1%yH˩1z9YBg*}a(qօS+,܊Ul/; zP*-GLj9z ;oS49Jxfw,X*#λPNj(1 * // ,[.d+Y|)E}uM9!3kw71[~ˏpW:vĎ $o(x)2Vi3E>pC\-.VĜڅl+qU TJU{b(Umr˃k\XOUXhx#p7\냳-mvqnxm 9nu.9cd5e = vj _dfEULʫuv\n#EYuXeTmɯ "4jif5MdC51ie8N[n产-\l\-AC* J-d 5 Wf(,P0}J@vI)3Ցx \kf!ݛE*.瞘 @,JTR&VH:Ppn 9hhCb|AŸ9hH[g m"?ޱ.`65e7=%4.泮at"ڏD!}2Du0v;."F'W RZϡ{,B)z(f0Ci #."8 rIqU柔=:PT6Ի_GQ@,xe* Lm*1sBނʚֻV5@;*+o4z'"fOK1mQf>!ztVbë73;U5 ^6B,,Z,u}]f3(Nང1[2 boWk@P|>;X `^Ǒ93[ -v'f%*?nۼ 3yH,Mݤ 1Z<05p_.et(CMtDu5EPDOg`"@҉<:eɱ_c\mK\f;ᤕ&+q>Ha82.heDZY MӘk֋}V &9d`n>0hRh EX~8C:?/Z"cfyU1K_s^lfܺ1&\OL]x3~:nַzYvuvX䯓d=_:?9yy\|D\hY>?wXozr0Kg(kd7>Gh}g2tZ"BvY xi !NDka|ȥi3 ꔞ,HgB_(z.yjSc< Y48G*@"D-0NlLܹv n AZUr &gYG\=iywŞG|(2NpUxUPOWt%ՁO̴*`e&` &Y4x\YE툯  [.4mbp$dxUgIXpͬkwu+&k`ۈA$ o-M2mTlD' z߿OÉ{mdV׈)z{_]DzAM**a  { '^ihZAgwA7}j bqTKi/* mje5n^LkH8!*=t?ëTeEVqv\'7sX%W+_Ϋ'9U:"J*@R;b2%dvl@^Vgiߑx88 7.*9L}s`aOTOPu~#cT_'bɇ =|fS҉&~uI}czqRm3B?M8UpU׻mwAPKdS_:  py/path.pyiYm6 _>Wڡ@_lӉY$%׏"[r.نH`S$EQCJ}j($n~J-WGp7 i&?WtlI d@Nύ&_QO r3:;Q+lRI-#J%ٻO. o[Vn"OC4jv]c`GJ,,Ut|*$8,'B.&hr!lA^X{բnrDE@+8|P hMѿ©uO -3t'*(he6 n^%W4.! #N#/q7 2M6dΚ]A2#PxJ}6(NWH01"qS]cº׍ H})&ƶ gR)͌!I28ab<ƱX [$~@w)'Cqڍ 25q:z8EU~Ҡ:8YeCEXηǏTJ)䭣U6ݡƨq4-}t38QuS)W0(%j<) )7(Ld+R`s)3v[R7gD"~*a*4ZI'zmCe/i>- d`_ jPѧ qN\]ɨ|;038{._Ӯ40~Hbw81ab]jHm`W P\ Y2v%5Q3,fE9Q`),z*f/I rϫܲ kۨ1G8%06oKhP|FR8Vov?r#˜JdŔ; :WlHƨ;ܠ ˶#7]Stx"%m3נ lt3kutH(y^Zy = ]4VV֔n,˳f7U$!r_7oKwߐS-3Wٳa$@1T4+h!Ϳn6ms.8 1\ECuQ(YcM#u/B"ǡmr.h)I3wfsv'z=/.dۧ$[^tR#I?rh}w&Ng*Q^ȃfw ]0b=j1$& <,ԁ =97{oPKdS py/py.typedPKdSu 1 py/test.py]1 0 EwB c@*ecP߾vCozos*Z 2GBigDr;ڧiR۰w8:ڔ~ŘFzw; T X)(؃wT=,q D 7PKdS(zv.M py/xml.pyiun0E|,IDT*4!䐁51 8s}ǥijk+unC𬄵_D,"x#40-j蠜9'Q["PAP8&qI̝ǟgS̺ Ks%yhQX6Fcq|/j(It&aV"2#VsOLtIfxwgfĔPIKt|]Q\s-Zuk+LeMiI3.^g a9a?Kj)5-|Sѵ-tUe~8ck'v: D[3&PKdSQ-.py/_code/__init__.pySRRR(,S+.HM.OOIUHOK-J<PKdSXz ,py/_code/_assertionnew.pykoۺ":CPH{bL%")屮;琔HJN49c`q8Zv@_khӧ/z o vl>5r($xHqaQ>Q#^/1Z ,X-Zb0lBh_.MLbrP8$oaPP\4ztK^u/X` ĥ}MMϽkRkQG&؝( ߍrhl *6H0ZS$QMU$У|之@I4}{d{0b}䟢c7ï[\;`1\]pi MSeUWe{G~U=#?N_u3 r9f ~!,d.P*[ynk~حt~^gAs@o+! ? rNƅ{ 'rA땋qEpBP<JMZC1aeu6Lތ\k"ށ'z_'|u@Q髣&%oi mGŽʰOD#ئẫ.˺`گRA׵u> ,T72ML<~VU,䊳BO[v]BgyU8U4iݺkԱНO.<\`ݤ\ xMGϐL§6 &Xe%4*;;ntd*cOaJ73jViol@HrHgo"~h3g{A;6P Le]J]FO߇d{nG_Fn0*$9z6}P#R+c9Ai!^ߙt/a|I V(:"QgF#]26 R2>OGΩwèWyV A۔F2-L|bEIR1p(IX~Tk7vW}r$2ph*&RpK<,IL;15z ~+A|k? =@HﲉIh I)TPL)F_9DJyT40TR[NӳTy#bll^bTv=|O+bsO1%as߾`bK'h/Kdz+ɳ)oV"kk&I 1X]iwkv̆wN)N:C 8sdFR0@y@{-D1elPD6eI4ANRqgAAFnn郺<6;3z9Rd{>G:{ ]=ͣE.NZ5j: DJG+mCZZ3Kefl4c^OJȢV1 MSZV)V v,=krOdq]8xeqD# gGxy.8^*#8!Vo!3?|w`tbۇǥ zQD/|F왿o F\9@෯qs lįp+pӗ^$? }trZ0ѽ93_ձn }L+m+UZ&[as_m!k}}'b[]Vx ] .PnDGB1śL%]{ۂci~!\1iG7ѹKN{ܵi>9Ew2qD p8ł=MӢ4}`_N3 ѯe)%[  2Y4eo8 9xoP'[F|È L@: JmL8:)w#^ql2yOEiCp>Pn!ǺhpРw4$I(7vX -۽ƷS|KWDvJzx pGM~j$1!ЇKLi2A٭xQ$Oo0nt|k'WPKdSfEpy/_code/_assertionold.py[m6_AxѺIއE|t/)/%VW ޵~ IhI8#@p8/ Y7B*ُJ월u-X\7e%3L6Ƃ uH&B׾K03M<^cPU "~Of dh/xMQy̓}qx/#Eg$tw;`W KIt=- k)|N>0#!h!y\!({=1vq gO1_x섚Dިu.I<#t꫁,LhYS8sk2԰FWIh#>FF=iL߾\H::c?a){b(nPtPԭ%k78[d, BO<uy$b,]Lٚ{#CG^D(ЋAώSx)uԃƾUvu@=75+ŘvR/`'nS2gF\eHg겙 m:w8,t8.Ym}WUc0!% 5U)٧,`~ Qhjө1\",{){ZY)!c8qCɠd ,NbV6Gkb,~ ˵f]bӢc,;'PlH^[V1HǝG9Ư;>c[א2ݽY2)'P&LdhzG%򃩠[%HmnT,+1LzĄL[V%/ FҟǧOWWzk4%zD:26 OVN:R >FMX2|-ָrJ0ғ41/M<2JsK9UClu*k5Z"=Dj5+!UxX2 jf; w4:msѿ Z:Sw=ҁ}\fcv<B :M\߲ ²$TAӠ]lSXs8.TV3IKE M"lSN \ wHT˰!!dL͆}bE܏`8~B.#E4mELz L"몟)YQ,|4: ܻ֙_{盬*ﹶ3m7v'60pH*}kbI*-ݛKtzT!{?)aDj,о Ug=&''0?Aq%Ye9>w61u2~ܴ'"jamCTb2eQ#_3<̱oC/vq[xqC:>8ю.zXp>"&| h&R3I[`H!IʼnG6vP(5 N#'# %O/fDJuUm6no8_SF!v?rfžSw-AY@2[]0 3-`\ѕGwGAl3!?Yj;_FP?6_|nǷoGiv0vܱy{tMWV޲!Oɴj4ЅV&^7XtLϛ6!`8z }0 0#gCDi_'^Vuf9Tdž;춠ը#zȁ\{8`cM8fe4TffߋG>3BN[@oˊLB6z/6Jn[U I3 N&5zS=e`+yIAv6JIz5m0/)R{n}{u 6459g=='}sy}C:}>@y ?} |Iȋr؟7Pg.A~ .eg^5@(tg_$յ(ӂ!n}cN8Bgӊ{@ /<'}5^Hpht$ ҝc_?_4!mmnt,-=mi1s:w,z1^بBlAǰz+Z!s3m 9_.nFmviIAϒf? *`#cdi\Ũ X ~csC= g;@Uiٸ/5\W̢Zg/oWU eELϐVmEoY5+ 2 6c}l,#%&t5^5 I`@w5da\Zsϧ^c0 ǖYαpU2!.9?q)]D~ۍ% -T0ŏݘFGz+/JX-_W( @~r]QCb Kz6w7DJ—xffZe'P] D2^jrtZRF PK DelY)Kp gF.L 7v_SFke1Pѕ~} 醮5[.Ł%3q;q Gԗ( \DKMAj k}5Z̺hFL݊ Q<-1c/^ؓv"~"[bar)|}dgnz_]N/Hw_n]b)y"4E)_F%]E&oMz643{-54co۷ۯ۷xLWrE` e=m 9 y>,4e۷k}R~?@B#u~r'_?UL!@pۘRog v !6Mdi Rg){~wZg9޷7,ъWn=A`-wC슬 PKdS h py/_code/_py2traceback.pyVMo8W lGv unölV)fCIտHIg̼y3館n'ߖox˸80PvC^3 X)1H}o[^Knjhlɶ3փ:Წ 4ƶWFWF!dGzQ2gZ} O&{",x|C;f}+w&yR `aQ> !`9_MӗU(Vꄃ0PQV#05$5ZiqVR*Oa hϤ&D^jY< %MZk\# G.L|:tE]@-tZByHD=SӅ@؆ZQ/ 9`$.^^=uf$ /km<#v`!^>pX+A.]$s؟9P -23VF!th!ȥ)gOS@R[ s]~N_':hJ"G߂>cuiICuWPƴ(*q%P} TVWU6VGj\rԕT:{!>d03N;[Gͣ.usw'n978T6jM8QȬO/ 3*NΘrM1BMزd.Yj7VWn_˼bR3NBFFl^p"rr-)._&Hϑx@x6"n0Lq0Jq.0ֈ#n8/k[vp}lxvFaJ5QN)y_yƙS?6) 8{ &qtV3Q{1X3~h/`)Es qIYvXi(w>f9Lt:ϧj5`.턎*oDy 9nF0n<{2A"=̐ 39`}R+mL%e\.'ږ|y<X< L[(l:HH,>/PKdS{yf py/_code/assertion.pyVo8~]5ڷj[iԓҷl ol$Zm h|3  mAG˸a֨ A)ҭ: AQ\!#} q\a.3QCpJrN)qC{ߝBo|3xSDN*8R)Yܑ۪̆`u`ɹ#}~PKdS hdkpy/_code/code.py=k7Wt4J5O.d]{f,%Q[.߯X$p bKdX,֛t7mM첲jg/w߽3weXʪ/Em6 *{̹Eۣ<c,s "jein_e̳C(mRb i]/J{BUŪY|?~y&C M@d4em߫6+PpL5_Mb1TemM~ugEW};ljRuS#?Hӝ&U=?4Q l\L##ڷ]_{q]=QzdW۶id+$o({YM xpˣaU+Hݪ֢\7Db Bwm/{%` 1}SְYd]shWJdé/`̮ N@\ eGeb5yլjbh"yQ2ǥM=Ɲud.[ݫG"}No&_f?CBEWqr*{TeΪf[~eM u,*`_~8[?65pQC9T^K{t ybV1Ț ='wO6t-pvu┧BXE4 ̼UxR0+d)lj(ǬnvlrLx0d(R [ J:c™޹Wa"jh{թ6r{lȩN*fn*^O&us-<~؍:&(bLTdkS=t2뎫&ҪOu r!( HBVR(a  =}A'MC0/B_yKXR@;=řNFd]z;9+!N Te6n8mJ AnU-)t\G]+H˅Y- &{ݼXCz=̙3(qAmƆ3;fbޚ2wX'v"r' A  iF9 rVmUTn)l%[YqZwVEY!@(SZuzҼ]lyDѧ {1n E׊:MsԹ/(@f3tzSAqъa df4>h M8p4 Oyc9+&K0UE _TDx]c| $vO9.p^xӏ 46)P+Zиuq@.my*av^Rz`4qrekwGviz0ίb NCxIC+`|l9? 3, bJh#FD[hyV>o7ǝއ:=\U}"HF}8i T `a=bMz9]#$6y#V]i}EFbP'&<ᷩ .H4C ou*gBY#4tu*kGeS뷸a'PA#>2FY/Z0Q[>I xS,/na $C-vj9C{9؅g_dWž;TC#lTݗ{U9_jRT]nF_;b -/|@W-` y4~9nvpP ?RUkFɖnQ]g0b]W&k?QO``,v90μ#3َ]^"<"?PܾeY#]ڑ|$|zsdDd]-ՕEA>jwqcFXU-})C.53?v{L&}189X_=6mi ĥaPf_XҭuPn kP9=Hg:uYt;WJSCb!0@seQES =f7]A89N Y\̏ͥɘl>ڰȟMB1P˛@iBv+fEZ$'zjqK겸˸g Z;- kt3x&OH{ {n d=& .;PWRQ#eO՜ԡ΋/YcpQdՙ 6` 9zZ fPtMb@?]>w ,5i%oS)&vfbMYkEo c(nQz)HCZ=BǂVjo@>8ႆ5K?@z8@}ad&vf鈸}x<݌ օS ov(PZ&dap>-x|oħCv QݳEϳYôiݺH h13_M&Ut$~D9GK\-Zwbc4LYCjoO:Ѵt]Hwy\Œa:||%Z|F\ K6kY~3p(~[Ɵ,/N?4!: ymYgJzm&jཬٲ71A?p,𤡹ڔqp_Px|~MT/eϺ#I ]gYf &e}6xzsw pUxb Y|Z s0z|cK6A,@mJ<"ByS?M^uL guOU?l~ЖpnO y[Ӿ%Q`tb"Pv=^^&)ķ2ôxbm4Ajl\ڂwm)K<ǘfic a`r}zf#s)[v}J\L35ݾ*C=gc|4C %#w{}X2\cabCsHHJW80c9s/O V;Ց OD;W|+Q7x RTa&lu.jTnVłv8Hv6!XeJ]uъ 0TJUK9LmÌsQ|-LJ(6e]vCIIb=WM0]dGt;bh쨙ؿ2B"wL=4*3xoQ_\]Bn}э\i˩L΂>PAOï$_L*Vq~Q=%v_ /oplXHA 3g"~Υs \L“4?S^ 84޲!4ơ4ጷm]DA Ys3+[8h46J(1Hd Bkhë́ibKET2_޿r'Q>cܬ-lD'-fQWV tK܁0dE 3nh3hA%,YW:<~P]&B5<4grJ)3\،pkjToiw@:j/Ɗ7pIqG=zYO(Mz?,Qߘ6 ](WV%YGK:;}S39_;Q5*@O]E sS ݔR&mgXZ} (䒐ƄT>yx' cgy,H31yS=0> [^zgwپ(#cJ̍lHVgLv6!AZÇS RdIegF{O4 8əN[YsOЈuM]n.lտtg%.7tGUZATKglnچ",p^Uh_6{c&dcb9lzn6ʖ.9)j 2d@.9!>!ak힒*L,̨Gww0D;^ڤxφe_ HtԦ> m` [wb[tOlO sw[ϺN#Skk $^ CO,8'.7ydUe~=%_XԢ%8S0,uv ~r{m9b5J@ۺiӘ  GI-S| Ǔ- HfU9omOjOҥ#)e|4MAսO sU(ٔqT|+_̎7|]fL3%abJop$iXEJpvz-_ xe&9kS.6Dáuy|Lq)oC9ZӤ 1 /!qt4pe $ȸ'EQbqcl 56g}h/rrƺ@dSlGfa[}oEpc(Cܡ; PxWܞeX0rj&ϓFU,fn`UE{)hFz`YOa䋋PKdS!_6py/_code/source.pymo6gqا`ڻvp-;![E4QJ)iQIJH>|y[z]Zn;lӮnlM3knߩ2E_U_i#C뎍T?/'x567E)J٬k3b~0eF~:~n~Hm&[t=M|۶u0 `ٶLʨ y|>)t󠸫ˬv0h#j˪[R4RŦWx2vbpxjf!'i8vmg ~6LOΰP#)AX428 Ⱦ@K'U:YeGoVN}3V<\j䛾rNY `Q?fۮ%Dckw)= Pޞ^=|4`l _8 L4dy 3@dC*BüW{ͷiTY!NEw҉i% iǺ_JKCh8r<ف1sTQDtZxݎtXGg@/7,1>M:"ddv!*s 7eZk} ą?){xttKKlh&FѡO)^zW#ᓦ^O3s5T!G !Af#|pC@O&.B_YBtE 0z\6 ς6Z6m | |l3f-/H¿a~d|0Z0ߌ6V$K7w6ec@͑YD; ʍ&z0h@\[ Jɶ+jE'L'm- R=HTLڢo@"3N.g!:xV;M'J ]RRDjb&eJ=?MV` hAb|${t)Y`cKC'*82υ 0KL s6ӁZ+٭08Sg`1;\H$j%vT25"DG!/ :W MoG&2q~lX`npn`|#q.Q$=Lj\EYmC¡qPH?,`k-jں-wR@-@K-2%dM?dzF &]k%A!T*Ȅwo!,`֏`Ğ${ :#a{ed8\LtXW y['pNz%f9175IKb9?x]|Pg`饘8#1!:mXi L8+;}nG<p2=Ek]HR,qHsxҽ\q3;I tJԮq`:=.*HGn?$GUޚªAf\dc4<5z@  Y"-lM3P2=N졖(jjUhJc ~n5cҤ]Rְ<2#qBFW$-1'Ôg6wtaVR;!Ha` Fy+Yc͋l1/tr6}*xh:%:EzDp`< OKACh`GN-r)k3%tob> }y"A:oE+V*6B",4ZvUͱ+= { )!a:M*0y+2ṘӑjT fMEy:"y Qlbz@!F 9r,lLW!*N4| D42 9Y= 9>*CڏC٦Qf&÷j)-̕L4,Ou}Eӭ`sJ\QK\96{dz]Cʥ)uk58X #zi~TnQ' {z[l{ *meW+tSԝSd)BHN% {֗$r45[pgZG3L5!#m :'^L rź HG~VDNXcc$CI=,laUN$+ f(P4Aln!'ӃD$x1M,|;s;)IL^Ў´ 1CKk/-+o9!Q< Lt !p471=CoD )4Dep=ZSw+9;Y6SQm-! iʸTbyprrI6^s0\\WG,;p[N.:=Τ킹Znjy=bC#y@фv|@&RE]K">gm-RYRǘT=l)tWqsb\~staNMC\τPҍ%,R^BJU N~|YHմX* ѵ $)l뵍agXHp4apw OtT/"1|}ZiZ);dчmx7uboE\ɹQL7ذ R٫7vʣ&i) ]7+Z$ %U,Fl1 hDʭj{,daCA<Qs@lWYIzp!4Mb&! y܉;"_c,DP5P`e"S)$wB[ԅVF27@ R3H em' [8CN$_NMsfx]E Wh׊:"۹aKoi/ c]ðvCPNPٜ:8wӜiȩ̵6D8' wC37s*8\;h'sl݁+]EWW WndY?W Ut "P_ZݘQRmvQ M( WWTbAˏ`:#4Ɗnj+oN*0J wDB2y[2oZN$+7f.{, uGÜI17s罟ns.G۰Rfɹ)<, >AB>Ƴ,X tDp*6ǻcX} ''(FK@>.\ ݲ3]g}~~9xڍbwudCpkN9hrTPrEbA׭+.!teY wO ^\vU` o)2Sec0肁11cPKdSG8py/_io/__init__.pySRRR+(-/-R 9y JJJ\PKdS& -py/_io/capture.pyZmo_' *Uh'RU>8C Pf ܥe{gfߗC̬^ 9k<>)Mg3|^X#?zK55kj9lDiZϫ˥_?3cx}x&y[XU" tR]3$ZkJQqB|tw/%<|%_,E{sGx+fDR:%gg^.o\_4%_-v}Z~fB`1US*/B*Ph~/of3-{z>3 y?T\}WqlfmfcTEvRW]gAt|xX< Py BdGܭ+Vt{``?DbC/}Sxsn-h^z;-١i[%b`Ɠb;<=(rw;#|1Mn.c۪qO:528l]|ͪATcu='oSl'p+xx 3 ^Ytex`\zV0sRk~X|Wpg悊jԄh~;dn?~=ήס0 QBǼj*v+ =sM>N *- %ж xu@@o3tѐPBBFBkw1-IuGGbWS?򢺆uM;RCqdV;2f%Heˋ #\/Tɐ ĘI98N;*2u"FUF&xSrtG%I# ^}:-)jRcl4И^Йr 0ءYn- LuQ E;| $$]zlaO [LAZH ۦ,@ԢfqcztEOlS VB|E듼c/Ze\-̉!0l:.#*#S+pBm!”=@0TaũK"".s.atfS[WBI  ihmol=|[]b —W~>S!]zTPy=Vcc.=iuP.8%Y `򈌰3kXG~h)8>H4P)#>̦J>JpZR|rE9 Me#40sX&Ҙ2|X^jEjPЭ2c4@Id&q u%:j/j6`#9ڕ5e:+9w+w 0J d<[~rìzn= Mn`)&&- imCߣ ˮ`И+71 4joשrĸ2a*3O:{))A"4Q/zC¿z∠CV޿7'r2AH|=LZMԝ;"uzzV>`MGMKa2Gp"ۃL3ev {ukv&B~Lo{ߑxd ؂L }L(ooi~&f0C[OkVk3gSm2į38==u:v'n&sCqpA!` F9-`/7^0@Nj9;ʆ/y}hF$ܑyN@JURPӏZw#//ם6naj0F:r]l4٨gf F}nGLfD(Ouk!2adw]U90FY]tI*);=!)aNh#&0S`4ɟf7^U1ur#ńv0i.]"hK$ Di#fYڳ٭u-S[>/-{X(ztm`細]\L[j9HGy+1 vx;{ s] :W=!S<|,yyQ _&~M]ZSKC2Ak:(ʤ ]{YѮ Vخ-+!b(A[6,^c`b-aYsji+yc "d)..~8]*z󣟤 0L#BA^zi]"~ nrIVr rhHr^AMEN,U`R׾a*]q *}Ґ\ %]!]_N 27(g>Fd`wz=5D|ZK>TBȸ{[oL8R{R\3]dw;Eg>׿˂_PKdSW py/_io/saferepr.pyVn8) Jf=m}moi 8fBSI>}g(m(JD~?7Cݵ\:2ŝ$V;#= ;3Q"OZK\4+% H\: 7҃V[#u>S 4 (SAG/nWa_?X6teZj]Nքgtz]@?â^(+޹Aط? 6'̪3nd L |V^P{?ybwr4֐L)$ŋ33m=>K‰4t.$T⏄tRqM?4e4`4LJpf[;Gt?Mr1,$'# }^:R=?A}|yx%ʲtHԳSyi_{> qZQẌ́Scz!M f2o+Rq8ԂS@̋'6rzF/Y*0]U\*;jڽ֋MX k%Yx7=/4 5$p:+U8?ktw"Um⨗򧬪VjWL=ū&5:F?'4f,V&H+`߻YwQRygrP yVohƣW4#誂ugGRsZ=QVhthHWW~6lp첡A40hv"лjnP C{5~3 Q~o Fڶ#e'2Z{v#pˎZ p?sfCx=7^4}*Cɜ坵c>%Ӎ!O~PKdSm"z9py/_io/terminalwriter.py;is8+teE&2[>&ɸF8vun"!mT`d}$ӳ_VC" ]- >x3(@DiEu(c"eg(IQsw0u-Wi&XG,EiC_j3Xm<ˁ%f|~?A`"K@ɝQ r1E[G1b`}dY(|qK\ D b}.d,B >"/QJ?|%':Ͳ4 ddt|?+?!_00ZێEѴ-eBDq4~h~z%rl̸(8J88}Dj-D"HD X"+QA~4Fi b{oT"W'?]\ψYcdokytw`!ncss@W4@MK&Rj/zCXS(l=CqzA16qbP)u gO?{t;OxhCQ_A^{$rh\Ki(6L#OGY'/\\Gq;ׯu +<+`%\ sI0#aj7vi_VΛz5LTU $:[ytWEnɱ3ۗcgEKf4 mX=<ȉ^,_ܠJxjW_snNЏq/N#qt;Ү p?G~Έ9H~Ep03\Д#_񐢏Z(S2\9܈b]%|Ma@\Ch\P/z*cM.BeU?7Ԟ:"_ %$(Vqɒ-B±s9UTubckXpF}3qo~"_ I41F>cQQi?ˡ'$gVs.Ret&@(ڶ5mOi`FyͨXo<$ݻ=42A N6Z初Mgf/돟NGM+i?1N߷i L&Ӌ.A2Γ"]Dh 6$|"X<\0o<(BO}a{C1900M 2hBbJ;#?X<\> xmK'{qC;=$>!,{|a_c18fsHv&@!JLLUJW|ڌ(e~vW@"]<^D #{-qd m A ܂U3r/M2XTMvQ祋6}+=jS,Jv˩e(/kSmzzq!;AGE/(N`}wZi˲fRll$ xR0y˱Q (C9 @*3ܙ jX@#dTm `|M:FiFlgujaã#GGun5ay;cy},ED/'gKZNu(Q}N ]R;Mp^y ]/֭MעĀV!jȔ,v*oܗD"yHu:b/2q78r& ,]iey D3) {8NmƂo.UPy&aH]ݙC=iFZ&p&6z9aS11yҤ"q|7h$|)-R$ekJىc "64.G\W$ W-iN \l`%aʱō,{/WbCy]B6"u `mrA/Xg]_-Uųv~²O6Yra??J{0E%0UdjSop=3ְ.s>H4 RuuW |ԱL]#l}vimw$zHzӖvD^(;wpqi UQ'YjNp*@:D*qƉJ=6ʚؐ2ίO;s aLVA3@-WNv5rj 9-wX*تEK-$բWmZkDcՐ⇏1Q,/b.#ٸjU*]ClEׯ3t;F;}ua8Y+]nJ(1Gx7RVs^&8Lю!JhݙPfV ES:Qo(SAB{U$<teEߏOAJOEHSaR"|ct6i=cZ谭j nho.!ޚe"+Jxus%wYZVҴmTӪ{h4mfaH‡ۉdfh͸ ѴN&MkEq:Bvx=l nd:%9.2ݑq{ٶ_!M~ n56N/ēՓ03< ."]vJ2z'fw_Ng0-gk/1 JO,OiN'o8<{ 'ϤsDe"/c,PV.3O\冽8vx`աxݕTGMn;3#V:*TҊX&I 6Nwѯ[6b K%SyN)M(ػbV P音짨oUs%)zݿ'鳏P:j'-ϒjUto2:fçZf ~~vTt\Ab 64++WoUkn3wZUNq: -jm*-rga ?Yۚcd}A $./6TmUU;u)AQJ|%m!* vjـ =ǻ@pNmfu,w]חoYSӦ:[^45 Ĥ*,?e$yj$uz,2ppO7cbH4\®D'pWSN)DQ#^YC>6jVwTSdF!vRU=:b8Hn!>1cBFvѧ]MzFdUNAn;ESs4 fE ݣ5sfN>%M[f41BҴ,z#ZHb)l#Lm9,TKCP5R$0zcA.ڏ¶PD$X9~{M Ot95OuoΊ t ^6`:uj^HyGҧ6{w|dsT@{ Lnzi"+,"ft&jow|8gx#Uv?=ڬ92i[bվ}7L@l6ƀ4G܏FU0ΖoR+e3&u猊i0VPë7r|)uM̳g„{9t Y U13k+ȷdA(\/ƱHL)2'+,,+tIj25i.G N `RqiO]_3-CVt~sa4h!KXǑ& ksnͥdjx iΨ_9Gɽfw9\-Z1B++L7[8}wv}o^__˛Wg@^g||hv/j >|P MeУ## _!e{sLLv PKdS py/_log/warning.pyVM6W0.$!).A$=a4P@R a+s޼<N*C!'zЛMK{TaR[*1]/ewO f(M5&'>+)' 2@c–ɿ*L+ĝQ`z%VwVom:wS6#y#~qزcg,IM(5 E+9izQ?I3aR>w=il/$˳/.!.G3 $! aurV ; RUEF!Nwp^M.58hJPT6pKLԳy'/& {>`]XqG|:YrO6XWaׅ5eߪ_C_HrtGk} Y)[ glr68pJQSYm3"z]neγ݋|+d^[a^IN;۳+RXXFJے J0+^ĶR+՗,hzsM!FP5&"1T>^@o_vO$ɰn/](zӌC! Ϗxyta_(%A6cX b;H~/kugZ^hy3׈''oYwn "YNBxaC/Qjp(U!AL7 GZ/q'Z#.ɏ3/3VG|a\1OXzx{_ ˻m? \ֻˋ(8raFC1PikE0ragp\ϘWPZ/~#W%H2plE1]}r#vYki[%>IړVW;Y-NyP }Zvb⑉57X|_WŅ/Mg P(Cu}W' (o+ eNGoB/Iؿ2ג'9hk)+3Ch7Ydbx}X՛n7c V0z ! ^bu ڶe4`Zi)!)@VL(Q՛o6ȐD褷؅L%jR+s"<f^C%@XïS8T42BǭǯɚYL?\@52= C`j1(mթ HP1XM6 d] ="$$:6ٜ=jD `A{s`,Й`m5,i\`M+ض-ڿ=DeF(J gj(Q-+GR jr6ܧY|O&ҏe?7YX`;EFv9 a܆)$VA֯S {zǧP2؏|5Mld*[s`D;*eG-ޞLX|.k!%k41tjj{j4  tYQ+~"x,^76_$뒪7-꼝-q#'| ,6G,Zش)kXAMGCHK12kTP[%ipU$mk:za /$g 6 8} h( !dpvn`q,coQZΙ8"!,F>IhH@1STeGğGTXê? =#ЋS*@YY%u8SIc#k{Q#2JIF7^{|c?I,X1j 0{4_c:pi߃aS6h'M]0.Rz7d o.iL3ykJPAn=yH`=6EPy0P b UސJ=m 3&InQc+,NaVgP"zu^ðjC=AP_sn\!/, ]i3X|AvhSg= i(E"5x:?E|BRMK `cz ;4L:9xL?zLhƹu5Om%-!6pߔU8Q };$ Ij(2CDGKiC3b:ͲI{nZ/-ٓS:A 6O Ž@lw9n[>KodwBf!| .D*fMɑTn{p3v!"!o/+@j㻽CaΦ#XPծ+{i uW<}Hx!J3́h~NWgw17rhyFdOk1# r,:'؄~݆wSHGN2."3# GJ ~smK4SA򰇙f$;DzH];CT[Z@:&9`_Fl4wp`u.[Q_h_-㜵")fTA,z(:=cEXyZ+h$Re2OU)]ccSSjb BjKepk(+NmuyJmwbKqjrVp?xPH4;2eWN=J0gT}5 3KVn"?~`0 q2FSx?ec/9%Fvu|I`w]WpbMTgajw[D=1b=CGamV}9d/ilrkà?o粴s᭿0{iMO$ /|& - R#3O5Ut΁l],M W+O%D*EW*x)T0|_9DO+aaoBnU - Xr PZ*)*aAʅ[Y)pcAƜ|׌z]H'LӘx:{,D BQHR,>8ib`XJ ; bF%ni2S1FV%x_FD L-`iՁǦ\WaO~C ӆaZԡ"9x#`wR$ʰEbK㊆o2p#P0g &ôg'89:^%g041dV(g|؊IHDqvCQ'7Sސ6txe ;#X Lg]O9l;_E}$$dTjl~wua~WTK']Zxg0448b ~Lmc4fx&F̐Q`Ȃbj|"Uy rzʴ7Mwe~ ifo" >t^*VPg$w2e/a_PKdSMS%py/_path/local.py=k㶑W0pf7w'[WnJ$z(R&(u?JK*{G"h4ݍnp4"-mڬ|-FMU6ll&z&!?flCSsLIt%3iT!oQ^M3`g}2Ә1ͦ*g r_FKO-"|>n~&Q2iTV%8uH5 yy?2݈|N>ZUgyDYL,MrVxٖ ӈZ5O-`ʈ@cLRpS Nt^~ϳWo޿ogo}8}=A|C]2 }vv(R)@⸚,5l%ASf4OK6ɬ`m1l=giB`iUZ_ynj+foFv`tarhi.Ej^iM]Wu<#1t`2t>1Y^d3" Pp௉Odr{y74U][N"sZZF >oޞ8}h_+3Ir J;82~T͋, z9j a@qoJ}%+fߦRXX+jG 0ח,i,roVgQR(-38>"[ȗȢ>J̡YU;]cBxOu+z )-(Ϣ', =@p)D.b#J?%1;Fpe`YCs71ұH7,f;q+^~5ZQPiD‘Szkڝ "BkiђHa̫"_DU$ 6z %7ުȼmQڢ i"ȷiY֊l1RyX`nD)U6/X0F"0k˕?IOQ\š'EM|k-?s+ZQ VOxN*Q*:-vQF AU[/X);0x8'~Lt:vY TSG[6iغ횴堡gX8'xM( 䑋pWg9F6(`7y [D1wH/_Gƶ>b/,)خFtFytnpge>cdUоb:>"ok7BmZ蛓hzigaqcEs l,V /c&df3} ʒOˆ 6 j]l,qPI&/w{nOF8Y"'I- '\N3&z @>DC 8ɳ!ݼ~FّI;d VWanPB6C_{ nWIaij۪oAP]_A<- S5P$VEI7}h>ZkPlڲ"_-U(EF8| 6{0nRڦsNOm:Y-t6Hkp`f @NJlA yG3ҋ("")43Z菠KmT2ů&y/k#tA@]vV *#Jk !}. Q/VUѐ3^r>#ʪ<mG Vlh#m-f]b֩\+]Zc1Q鹾8F,a/FWl[MBcY勮)+H!"$fDɠ%_;A6=K1HO /j,Es $ѿzd 7CP-M[)76cy I)j9o)J_Ahcqi ݵ;r$Nć¯J1H3 A i墇pisj>5˜sVeU '>mԤfBmNi6b}F4-@`B0lpocb; BKyг8C "!ɪ JIj`ŗկ//"-]}nPo-qHz+G7O76a0дS(SDt0T<g}Dp /)FՑvmQeO*Mt_Vh 5zZӠAsjEچ||aeOypU ě h&e%15hYڈYKzm"f/ KaAr"g/j^1j^5ˢ^xX%>y2_ȫ3ozՅ6\4EzA#Cm:x:l>qT>m[JIc/RgFo}B41wʰb=~D-/$RGq'"HesP?5:& `dz)o1, 1zİ_5B[f }h=L-( @8m0]"EK<p '6A1' 81nf@1=eLK;siwP==ubW&zE)Q{BǠ%12)SXA A_Rq.utoJֻqX% w U~)U sCKGePvQ `"\x\p‭&cВ{Rh(`rZՁ9i /㬳¬,]aRlI(z F0I4}v@c=b8Ob1`Gc6FGAPp--oWQ~f]alkm`t=6UO-Z *J_'lOi U֐@/FrgA8Dt"9]^ P(cI^JQ7G k\ $0泈DJ: }*]4mZxŀ0`w-6ps'-٫iP% >#r۸q(Y<4D"Pt!v|غFB`3[E_l=뭶CNZƞN `Ǽ&&J [GsۢBA$@!(D!`@Ti.bE٧@@a!>$܄/O-Z<~hJ#@|q}زLecm^b,CuSU? },UV¦hƐ :ˍoеpphkwѿ[)ʃˆiNKm9C>l10nLR\Ӛ&}ooN{<yMQxU&&$TuTURbŶ2)`F$\Nq9@O@Ҷ %!+7ƃ͢QQ{(b)cvtN%kCY)xv-ꙸ~0&RgJP΢䒎X4c}8qΪMX)/E Aq|tDANjUkcC$X fkD,iOp]Z صvrC[+K{яp" 4jGj'z,u2'K[5ak)S qjD<Žx=Qv :>zn#̒bˇ' f#0WjpęffF„ j4sFj) _K zå!IV'fFl}R1昦zF;,ه@uϯ/W*T7QE  G;@'b%=Ppp|W~W獘ZYڤ_͈D܇ZwD]- w܉a s+M*L|`1GOh4{JA4N".ơ# В#I ?j@GC9o)"0aF}<0T7>R]`8 V4\s\\6k4 /SO蜩HA0tB.(%-s6$G z+9?M!*I\90qˠ4]_4Ip U{mNp=ndFH&J/$ 'yz|

}of@Y}ؤ [SMг"*W<;[Ti4tnahh>`.ok^u uWJT%;F:bAa>bEdB gM9 \C@HӪc3@)&Ce}&2XaU_?[a,ւ)@ Ƞ,)1Ԉ{}cFď9-Ǩ'8c>h|\CqlzהxcҍkgZXU)X5UkOgWV \poݼ0{B,D`H-vYJo-HbbiJn4V.SgS,2 ;Wb9!*5Q/$Mu[__Ua8\@k$%hc8"TeR kƳCiKQcd(Bq>t)+=*je d=u}, @OT0.‘iK2u ҽr$ӌ=[k>#yN:@xFw)*V?~R{Eш|[Sh"OhJD0 $0L;仚mK;yס~{:"RfWt%LF^QUt6CP n_i`gRlK ~Z dCgQ^0n*BKA~,NuoAt׆Rcjy_ˉ܌|55N8Bœ=^G+ `ZXxG ȺNӁ<$%Eb@zϺO*$6o/@#ZYqE#6IC}TJ;"l /-M ) N%rz$A6}4ǰ6cxؔ+LON=jm\pakmdg5wэ/BYh_!|Ysi?s Gm 05 VWl17RknQ3q,/o[md ͍x.bls+l65{h"\bN+199{ttCQ䋸."djۜCy+FKK.pUF*N,m+t4YcVB*wQutQ{)-^7;)(GAO{ۑw"ГnV햟f~݇yO>Pc.BTmD ]j6E? qNOǦ ђ',lM_ghUMT7kXѳ aR+7;6lMV\ݯ͸d J;A{(g~v~:K:G[<#9=P *  S2ijU޽iG^zj||﹦P&CC'ƍ<[r/39^f]Wj"ע(–=J{﹌7gotMM 7K?No q2+E`q,Cr%wMI`捗Haཫ_iy99mP^|aT`~}xxv :Dt&CnLXXm@z }ܕk#tE¢\'4eE*xE)k]U[fvX*yj:]8ccJ6&[uѾ!0EBaT:Pi4DK5K*h@W$`!)!};/)c/6 4pv e$+ϛCGVL^!Ǖʃ>[;Y8`uUގk|O:c f0fhdp/)|㧛7޽4oG K?r:#UO?㩅x·Njaߟ0Nu)[ |e q?͏Ppzkoy_Y 4b`Iäs-|,0A|v+' E ZbIq Y9OJWu+4o:R vsa;pʘn{{o`|rM8'OwLjk. frC+홫ȒCSE+f@)3~P=ep >"e]jO{!_agf_rrE(K2b6i{\~_Xܴ_Ӈ|ntzc>FzHƓM'˺b{m JBb@~<ǎ檍r8#{> Pm [ *zb4 b*?Lbh3iY2ȧ% .*Cl@KI6B32b>.&EHhgFss]VܺM6K5PH)؀śK UE4d.JuSkh9'LW. Dt_257-#*wsژyܣ_wFcP9\7:oxÛ^\fPwXHM(/޽}S7/?/7?~z]VW%U͖,cC`J2.~gF:v0 ˜#/F#@D䣇M`eX=$yR\cy:Π#U[O؁N`+u%L -,e R.)sDʜ׮QI61aE܉Esdp'fd ([;e\,+e~Uf.w˄1>ZCt]gREbPuf< WX Y6'^w6  QS͌}x޽_%zWbP'$ CK ;HbOqBo`ҷlq Q=Y=^)sv\Pc:0^? 02m.4N] ,Qzc#Ғrqat}ibm}4y!:Dr(~EVgdva(3v>n~_ϯsC; bGa1'rn2($Z7V^]\,r }{4A b +Neb̿/;ܥAzZ))=k Qq*cs{v( |+8G {V':9Jy3ϑ|N73dh40Hhș>%Ą yi{.l}r ƏҾy3Eu' }`f_ ʃ?aCJqz3.wI۝C!߿?8XQP("dV *!X/;>p×ޝ\f4 ׭L7tF{1=N8R+9qsݷ= \:yCEYZqP8lhm%f%^],o~+sZ +r 1a}n-fXƦ??y%>ٝzT@퓨?~0=H4v8? ;0ۗxІc^Ox̂:^^Eǔ@5a2%]WzE>v9QEc@k 4_:j^mЛC/sEah/wv/Z5 c ńCC߼VHNZAeQ%F ᰥb{'t _H750\Jh =f}#6Jo/\vƓH] ?RM> PXRwF]w"T ?PKdS^-={9py/_path/svnurl.py;s۶@ˑ)FrOL\No"!5@ֻv wL,X, h:N"SbM$߱zsÅLagWUlJ3xX9wyN"V,Le-OS5"M`(L@$BT>S%@ylE;kn|V"R66Ap;E>>F,a .h*IIGD[ٛ>O&./`%JC)Ǜbꏀm `| r/k(Ly*Pna,Q nYHl0)+*&tDR"2`d|N79ݓw8[-ξiyaLmsɣ"<{jaI^vvD8W8՞>j~Kt ) ^ lY"\VaqW!E !Gkm5Hу ]o8ڇB }&(u;&XmQ,xUM*`>6lBWP}*<=m9(}&T4MpAYgؙREsw<+v_Je)`m΀rR1!O0pw{! M$w .p^S&r[ d2&%qSWƦOU5QXr<-Orǀ4P$}`g1Qm; r" !mx֒CaQ;7aP& !iknjr,KQS&N @M- :jQ [֜F)s % ,S0)j}0M1@ at` Y1wb;,0T;ئb*V`X`al@]KLXp!D!l| I-\rqeAc\p!y%jw`֔k0=LjE-_H{@..~y܃U``_Z~1deRrmZі F'OE#4ruS̜߱-Asv`mA :#338?_9H 9BE}.9 Aaܩl*~dT09٫;yOMu88Qn=n2[-<ϐL+%ngeuPSκf&u\}|ݗj{\>c9*tvV9 DC* -ygJ !2驁fA5|yVthМkG ש6dݗ]Zvˆ*7̼kUw|յz̐6!1ޑT)V}FsL%Z3%wsRIЧ].g+l!JPb^GK#q%I|d.Pgr^hrohK~KKO4H6ہ={ȍ:PsC&-""TNCb8hSvEגe f|BV䲻;=1ܛFXN,>XwǻPCrîVBG)>91!J%Zìi4&Wb5xBvwDW{i#69e}DYiWMS2M5,Y= wsA{%ꙂCSPJ N) 1#GK]YhUgaMe=]<+0}mQkov%36Ԓ+h {R&PVG;lYؠt:/n>/,ڇ̴N߲Py*!+fqE@:=E򧌮nqk6ra ~ SጕW oplG zθ*vV:Ԃ1&f7cɻ,,+>R ;>w|.:66@u $K=]ks>L ةR!JʩC,do@"ɶE0P m^|{w1Z/aMԍո aWMLN拳_?=˯''¶/ċ7+zy~Pf%z/0YUgR}x=3 R+L^UR?yHXX_} ,^}~l~_-_j!DuIv\șvTu(7%q u^v SEtcQzq{u*Ag)^ άk ?39>)~C{*ī5>V02' 5;!s);AnUHh |B2U2 KryQ'kE_S.[/Ͼ?ogf4M˾v Ѷq(؉.c/ T/Uj2{t5z# dc'/x9!CJ*n^>d/NC2d8<)xR4ZP \ot pIȎ^]\m]Q[GM"~(z#jۊ v$CWWnX1@J Q-M0L5EۀϜ LSƺbx:7h҅Rw1]N-X4ӈp#\_%,5L)ҍҚwuXj@J )ru+jZgsYeg;Bn󉖝A;]k5wґenk~R?Tiy,蕨 _Q?1a34+wo?R +vzSU"xM :QMob aY\;Km.ܻ<#_?PKdS前,1py/_path/svnwc.py}ksFw65 md땽;QTl+iY I@@Qf7djャJ,ݧOw> {M99VL"iT[lmU) MV7j}'MګxoO7 (Dވ*$/ŲH `|VTX4w6_ecQˤ4U,u̚fV$q| #W?{8Y^DYN۪?or=.>3;lW8릨br8妮a)QkQ>aaI\d =ZfXU6=l]0/yyQoNg;7 ;[huByɊ od&ݟ w`{ik95Pܛ8hA#8*zر7ȞY?W6e*KX4o,i{"給&l@(ڴL$mMV cM|p{UBUfš؇-2mDrf^+EUů%*ƒzF{JNMe%[7m? WefA//|`~7[o75$SpBٸ&Bqg)mN]IvO8ɠɘ5 ܥpQgɵ5+o<9!vEB xA#9 u }u7Zx3Du;eC柯VYoۺȓﶝr*k/ BM fœ2<C+~pM zduv W g tMVbRS[!_Yᑴ0>,Ho\E60v0rEO# A b!eUNheUj\^apwy3ga`bqM&-)6@!Ԡ I#b]Q)h3X9Cb}d>봾Z k2O uW($hx3VQ n({IQ`#R {ǃѽ2MD=a^.MOn&p:Y=C*izs|8{ZHV*O^o=д44APƨZZZDw$r;e/Ѱ80VxcW7B=Y uvTl;qyqlM{ 8mG*r{9vx>F6vDz4ILVױ󫂀c{GYtT-~Rg6aC$:n,m#mܖɆXj_U[49֋3v&;RrVkq׬A9pan aw#(B^w(_6B~`t9j^$E D̒O8V8`;̃W 8ɦEtprɵxɼވ9ȟ,6G[-mk@ *@9OԬ9r҅lg8ɽ_Ύú(#=JfPӠ_bulxkvL?4dޕEE$`הӁ9FhV+ Hn/ JC0ZxdLԙD *Jֱ@qfB!ewF;̣dп;{T[YN\gQ~9"_《bC?lR^YF3cOsj]˴?BV!}:@"Qx&B^!qeGQ}q4?7R4fd#,£٫+Ka2 {v|CH*RfI ovW~݂UJF E'܈Cؠz%+d-?yў&WPɟg}3|0r2띌D66@Lw:R!U57[)#MnwJ. 9>Hɪ&u%q?EE-X }0M0一PԱU[whUCnԉm0i4X"0b*[d%1JlYC5j .B JBJ7 K{pY4c7/Yh`#B^{oQ@̨+u4lJ=;و;( ']\U+t2U^U)ibJRb= [ "]%@=j2-v8B#6#*>uv\yw9s*tM^t }kIpXk9kpDn6鲟>gaHs~Ce䐈Myעj%:8A䔰8N‘' +!Ѩice&ܹ v[]S'Og| ʛ|SH c_d`"@*w1nJ̕MF `~ɋ;%BI<^gwQl$'tx+e [Iʮ)Fmkpy4Hn G9xs`*ebʹ6f0}+ۢ5H<$0+D'''cٴ;+?mkҍ4CTMfHT @UMEiy;9yOt?z*~gg⹘?+q֊R.KqVGʃ#Mr 4Uu h݇޽8- ft9zi\S" U?֚r~6=;:3 aCw#;`MKr3"LPerȅ#<KDžRh%LKžaә?fHhb,4$m՚20|Uv#t6t;ଧAd .nqPD!3I@]#26( RYkwA- 6P\7g7rb5:쾄?˓ovЈ82iފGy;_L q<Fgͳهg#1t5ѩeؑ+jzk%:~0\C|gG]I2''| 96%jVvڒC8S7{XOs#,.q 9't@_FY%Clh$H΄7*zaF)' SVnseډedtf&vJ[3C)dH[7aH4Iev8HOT!5ۛ`- 0Ɓ1a|fp^~Za[SXNw1;=sKds_&/4 ώ5FJXl̼xQTޕ=xN4XY' TtZ]?mb'Tkq+E;V[2ז#^kTOxw,;6\ST6!pLxs#b Nc*|ll+jV2zT+tkh沣N=Şfaʆ ?((Gafr- sD:Ă𵅣ƃuem!e+ c3pY[J t:bcE~+KX3g - EEJ#\lx&b ]a k ^ݴHYEʛe,Ïis 1 0:b@?s`P〘J`NĔ4+| H`˫74gFu$aFw3(@ }jMjS7Շ/*,ů޾8ϟ +)l190n${l0Ӈv)i^;X)G9i5>ۃaImNN@K~g|݉+)nq{PNֹLIBPib3}rڧ8Rjbˊ۵n̛ɒH-%gǫj(~J}Fv|Mf]w `RT2*0k41 N" 5"E=cYE,-جSIH yvzBm`߱XĪ>Đ6t@#t@?  ]մ_Ƞw6aeֹ^k4Llm#oVg$G&v8Fiᜁl]Vܛׇz\']Jޝ(YJĀǖ+2NJۃ+AMMb6cW" QuNWnB8`= `8H֞ru:52rK wBV5e頕A`6ʤO:uPKUZ* 58. < ,2AjOl!*/\߮H=/Kgru(כˉ0f,UzHB:@p;i-``梭QdôNvVR eLٝYu+MQ(x,W65"H2*afgG-IA]&fиK`=`eYa%ڬd&Zl‡.\处4VI˞lf2LC@eDE &\_?Rͮ)Z -#2 U!(1c  MȱƬ{r=(8f~a=#rfp`ɣ ö/.,JǦkoseHS4*p@%L8XIv. &+2|Yiw`RGv^Bi@X(,ݤtrI6 K+O9 'AY4j0q1I[]yF^Ry?Q!OR#Ũ`afܬ2,_@1@+ԑY;2Qwև]dXj"`(ke,-h5HkP\8"#|9V=qc1rp)%7ISC'&9.?=n }eo>>9Yfv,b\΢HF$/Vl9*[550dj0E"k1 LWO^Β'+OeL꒓VP޸cEt4 NN0%Pj|;ѻfwqFeYiTm$ɷumXV;Fh8շ޹ȂN"',WD۸Rv%E4R~14?ϔӋ%UlҮG:CN8 rT+wnxx_jCR^a3Tf[d.@xì~wBU~K O]{U#A_2*{GLjKхU ,(|36t=`/4`rVTwa&5ˤuICSQK |(C=mNoTxѳӣyh Nc{sIJR)Vso3SڳܙwuhXur4GqeW.RK=v D A|}󢨺ݎcKo-&;,-\IJxUKe(+7㹬_U79FZ`BLZс> GnýiWNN㴪oeh6M4 1s@"@9Ͱ1}ܵOMR8_Rܣ |SLCG Xd)1C'}=x `ԧ]@;?ņ^tJ a=X:q LZ(Vf%ZIp(g9<ɺz]4TmS^ D,ffZx!20 e 00xjK8=}:g;,cX=<'o$o>gP6d`SNf%ݝ,.@Ӡu〿r` 7d~IʗYJ;`.d9&By5Zpg;: DR[ yҭ go HF (khEbrh>w4F~UxbHʰ?ҁ Եt-2OZ7hB)ءJ⤽O3rۢSV8e4|sw߭^>tz \4J:z{q(ͳ~yEK v0~uH*ߢ$hd֫ oa⬔KSI*.@wI'309.ʷ+uHgEޣ/&>yZ$nJ&/+m,rg pV|?ӂ%uZ2 02p\%]Pc&tk` 1̬֒zgADVkDv+jf*=/=~jh5$SʒtBIov B[M0VXQZ=qԥL P!xo+x4c{9z)㨒=GHZ*.5~a- u- 2Nޱݷo{®>UV|~n@.qt@DoQ]VtGԒJ^lcޚj֌"tǮbT%xN,)vP<뿗es[,(_1ހ=A ܈%(D39z_CdCTS#Y4nT?b)_m>l'1E!Ϣ^(JZ L̬C7G>6ͥY%RߟDtg(@+U;2qΖY~NQ wyh&+%)q|(Ӟե /-# g?3:4.Ϡ9Gi0Ԓ.IicD#U;U]9AN+kZumR@M}E^6CT(grdD+?EBg[ޒیzm^e 6_Pۨ lz#@58m0u"EWY9~w~~]h+_w1Ӟ|} M;4 eo|hG6r_'wTH$uq(oðkf/˳HV':}(7XX}(ДPp 6x nƢ~(vT>~QT<`'Ar}{,.ӗF!٭^F~9'佾7Na7~5UֽB2ę& 51E6?dH?am ;nu/4:L5{.v=DHxQ۞65 +<KjhjMJ $=A)#ڸh=a]8]ԕ`: kb#JjG_w+~gOdv4IT/yz|yj5 a7EXů2/5HVYfaԿN_ـY=oڔJ5pi޴o.rbT\bˣɗˣlyI&NH/>/rC 'dt!nl*]%֣o;"5[ 5x$-_N`6/?}&B71==7 ̰-_g (8U`gϾ~~_Hx` I储?ļ|&>m_'2wT7 Nի nC>=C<-N}O}s*]ݼ;~q5⌺~eM.yeԲ=C/w|Uᕱ@E\U970_jLK)?ME*5Hڇt{ YZ}\K}z4>+l~]vu1_v`=Gwx[ $_엊[X7 A/C77%<6IUNз L7Sy)NFbxlrNO8o(ftgyW m:} !tC<^4V;<\G t~}:giR\W..Qc2?8٭9$bU8Qkd+sŐ&6s+$nKq#Uҟr!ˢJ}VMVN?Ce5`rdlMāTRUa-|Y^dtxܤ vŗм u=.?f[0*=J*'֝ݸ88-'ĄszZW XF6Z5rB@;4TJɠ+ZZ#]uL7 k*]v4;խ֡_v8'uآtUT#/p`Us3noX7C{%7"=$G䇟O_~R`=~bV빣f`LPVckkgҫaqU=ߣ B_8AaR:f毝ue\%`{*fB!FU@N)_^Kf|<*H8e4*i;76cZoDv,| ]r0g;̽}|ax\adlE摩+r''%ܑKґgȬ#!\׿pTж++&ZH#_oa.| ~v}|bR{UIO%3^:n)q贈CO1**!f%azaޕ|׷ak$L`Ծ m_ ;aX;n,ܖefPS"bs;F3NBY)gBҐ0Kq(f[m6I>G $ J;Ie5)UbN>kCRa%yH~0r2sx[7NK-PKdSˈҨlpy/_process/forkedfunc.pyWQo6 ~rtv إC[;`hu,C(ɶ$!DERhXD-ϴm_XA%8(qRP1^33cs* uOTQAU+jx!UK2:8BN"H"H&4qQleiW#vhPМH'UE-OY[?eI-2HdɁ.%7 K`q\,+,i6W5+"%ܴV;#Q0EcI2(aR`D#IeexXȲ;bu4^)dED,f}|֟YaD| J'5ћ,YE_hH͗YUdΰ lE])f;*&L%a d[ : wXקJPrB`nԜ҆}ZT"/pq٥&oHanF^v;W&T%E44DZlhQwJڤK:SYflcWlɨFEٚv\ j~Dʃ""bV+^xDV,@mG==i\N2(w`ʄ_˱ UWeI+pEPbXV? ?`iؐ.'xf;}kfrdޟ|o߽b[rjBW7B@_sڨ䖏r^tm4b7> [5YA 9RP&bs`V2lQmѧy%yy6'30a}٥˙`F9Qȑ02<@ ˣ %"&caמ\a͇],ڭqh?ai2O`8.?VO}'<`%k>鐼Kיx< fnRAI1*uSCICv  uρ#yc=:jSrKe[%"2t*$݆ fo|OxTׁŊ}U׬@§V:aOI m[[IBy/t0!qP]#3CA(^PKdSYX,py/_process/killproc.pyQj1+.l#*<R%݌m0$P(y/Xؖ_o=!OfGρ~K=R0>1\AɊHtȞt\X:}F`_T7AT*RE,2L޳x:Sx F(ˢHvzQv}}[?+ŵP=[PiT)[[ԛ1kS’w)Knd5RW]2_{EZaOxvEK<D/"Wт,i0PKdS!py/_vendored_packages/__init__.pyPKdSL&lB(py/_vendored_packages/apipkg/__init__.pyX[۸~j^쮣Lt) (6f Zmƴ( NMQ3Ï߹RM,tr0J b(a=v=7s=vЌ1~z~D+~e"G)Lb'&O!?Jؠ٢}&Ro{%FY~m_'d?[Bȧ_X,z';89.iAAeSTD@dIis|B+#8U鳣3UP!Vm/voK'mXY|351=Mgn-hqΞkb %Z8ب1~l_qoM> H)9-[Ŵ.hٯO|w f鰸<ֻ8rM/@}*98gI[}^jzF`C=o+qJqGA]l?"_Q)a=ۘ-Ttl_w!-^p= mm O,=R=#aL)f-i7@=S8Q@7Sx~6EX=cm˛XW7 3q8h/;#4{rFBfe'<[ڡdfL^gsSÖ(zwd"`PPx$#Ft}6F=H1/G!;F!;W{W@z8;@v~X;W1 ;c(}H(+ -~rPL-:Q4$D8er3r!ѫepBu$ x3bj @p?'nF.FGBT-l|>7˦m>Z !t@晫%ϙxv{N^Aodv-fz>3oQ(3PtEq5S)fn (g:ns*:ED}_)@tK= JL26XI6. xUd iϵvo2Bع5NM9v i)e7l&ikO#VKYQAiagH(ss>|0N ߺdbfkw[injbeMyr }~ִ:ϛe5[ ihW+.h\62\#3S3Z '\׎r\>VH~GGg`mJdc^Ԑ멿`=tTOmﵫ/ N,w:>u'q()l*RFs*/0*ܕlg9M] #eEp ՛[Kc/_MrZ^AA=k֟%2<&Ȏ4\H'#{WWc"8Vk6i4/CdCض^RcBWx]Nl$jD\ TCY-uEdO7~_V祿\8K0ZzkP &(9@2LV_}=;GQ <@&XQKcY,_ +{^;rsƾA${vt1wԲ?h۪tkۋ4>`v*½ ο4Nn;F싎|X@Fσ j@83ዥt1WMk@<.m9y\[K Lg6՘R2MܒUgzW'2̌UBzZ (M^hԵnL3]Đ_y-~ϝܶ>"RO@+4TŘO&R]iE(kb vg]ښPFZϖ9A$!גџ8hjm= Ӧ5&7<@Tv'>&NG Ui}QΣwN[],)˔G]*Nq!cp'^dF~6w7 PKdSW8s'py/_vendored_packages/apipkg/version.py5 0DPKI~K6$[7 syf@9ݰv[.DL+Eܿh[EJ[[xIhVȌՖJ1/&gf~4p=gPKdS]OX+py/_vendored_packages/iniconfig/__init__.pyX[o6~ ۘ!EEh3 E62%rWc9$Ee'50;CEQDیeAvh*J%eRt'dYr/5'8݂'Zx )EQ4ﳪ 8yɞ?x7y/_6#fy AGN<| Zv}"hU.y8ē&ŏa_]d2X]jўHm%yeKygD;-셞SvO5wv7jz)Z2^~3# YGƧ< b$n L;[(H LJnwૃl ۃlu"0$bԜ /gu·ӑGSbTl M r1UMYɜ @W;$X_SBTfpFyN 1+ A1.$ Cyמ6th}%'I%X" U \9-MYbP$푦V")ZQۜ"G}6#'}c5b=2 g}п$dC;ax "v=سu ]CR9]' (<6oc54F/F!ٹa 'cKH]E}dX R)Se^1LA*AN/qZ2B0.x-x$ Ǐl&NQ"d꡻"] $@tqT+\"x$rMe%8ń죇; sʹ>vr& jwcv o?9`Z6k# &(&6$LW |]/0h\Bv&áB:Hk7\93V}Jq FdLIHcy 5>(LCl5poL}MU c +ZܙZ5A'oc_,wco6]%SP7dž<. 5\d z="'D__7gaLSȀmrpXI ddZ3Q"M Gz ^Kh] xE_UN4^uQ6ot&n˯CI1.Wi~>5Y+ZM>~PKdSsШ,py/_vendored_packages/iniconfig/__init__.pyiRN0+VF HpiPܲ n=~mZą\LfgvwRsh5Ts F i(5?Bo=]/&"~ p"b"P˝>2AP)*RšX8 ɃP';` ~2Mk DQcWrDRC. VEI&xMtW KЧvBĻ TLi=LAuP9ZHN/x_P{_:cyNbAK>Ӑ\םpxrSKoG]E2pҙ҉쯄.[k,-/Z Olb*[8b>hrM~`o?n%sIW1|,^A8;(IT-L}Ϊ;ߖ / •U6>ahkӝqwEMmiU-!K|,ڣ^D$>2e*Dbш8.uF|eZ66Nw_$ݱ+qaKf_3`>dj#^EgG0g0y vc"O ʟAȃka+sbU%է3}ZMTUpHMFs<jI  E5?9a$o%HDq9b|+:E@9f&:c 1iې4L)ؖ3>L*ڴ<'oFI9*WmvN*GyJ?L=t_Oz[aM[o+wAhb6;,f PKdS_npy-1.11.0.dist-info/WHEEL HM K-*ϳR03rOK-J,/RHJ,./Q0363 /, (-JLR()*M ILR(4KM̫#DPKdS㚘!py-1.11.0.dist-info/top_level.txt+PKdS6py/_vendored_packages/apipkg-2.0.0.dist-info/INSTALLER+,PKdSO=Z4py/_vendored_packages/apipkg-2.0.0.dist-info/LICENSE]RK0+FZ){3I9f)G8UQL`wy|1+NW# .m&kwf3NxvcDwn&-| 2Bjh")vnº~"֚4}&bIp|wuO OǀtH<AnuK|\h@Ǝ,?d 9_:\HFS{ƑnF xEm"uaw u+\!VМ_$Zb#~ؠ}sz3 pá2| 5o7?-}Yja6" NxwR)-)5G ))/ b+Pg,I 3(r [Yg2&1͙(HY|AI䡄njS4ZȒle fU|5O)QYvJ :׷5j?PKdS\/*5py/_vendored_packages/apipkg-2.0.0.dist-info/METADATAWms~C[%2MU ;ԦDw \K&}'[bߞ}Wɿu{^F6lsfm]sv /+(uȺ1ֳZ[L-& +Ӎv6O*q7Mߴ~k,n*R{ |4Zwj͵v嶖lODͥ*iv%f W"{'KMv_[~n nzYvsr-ĝPs:V% D ]i+)4[Q{p=goƚ;!~½v9/ ׇ/}YZˏRWf~W .><ʚuMr޴GP{}(}+>RX9ZGǝ}7GjF j&\<Ȓ6Ac+˭.(~nn)WߞN|<[Bw•V6P+M׀ u'RaYP2I ɾ& E:Ӳ=`}| XfOn) lccVT-H[ HŽȎe3p\)ִHd:6Urg;cor*5Mx@q.g84&pl'pb#ǖ˭Pͳ%sY:o+cϮ^ΞsDLÆpQ( ;a;$ ڈ691NW!eb~XC[HfD -M+$JM덕\v?^1E55$Se$13̬ȾWE*+^:"VCmİEx34ur|l;_*>WM%l2("@4SӥdT?Qf ւkœ[>#%5?Bo=]/&"~ p"b"P˝>2AP)*RšX8 ɃP';` ~2Mk DQcWrDRC. VEI&xMtW KЧvBĻ TLi=LAuP9ZHN/x_P{_:cyNbAK>Ӑk|ºENP0^F9;MCS +=}1)#hY3[(-Rp{ۚK+ereч W|Z5eHSx xO.Ecw.(3ȖOe{jwM3QK]}a(j;Z du|ԯ_GM;) ?\P𚢿Op `u L-.&EpK3$Tj*c`q@jL&+H%́VghèKWrujGPwxt! o5PKdSwժ_6py/_vendored_packages/iniconfig-1.1.1.dist-info/RECORD=@ʇL8 "` :zqӺp?u-eqFf-A]!fwv [mmy]3ʛLsK^Rvz{1wf&U;hQQa!fu`xN_.4CɆ"[ &]GD”샾hdclҤ#ݝ r+;{`0bUk&,֟1+:|;>Eؙ;{%I  jpLHaiv񸸦h+2<ҥ5tCW.?]T9R7ƒCE8b@![4Q7kf1J$ )DOk&j>`BW0/sYΞ Kt)wTy7@>^[yp.$@$$RԪLV-m]}@Mm7 \Rh\D~ =ӒeJ}(g "k>joNE >FI)BvTb vט,rL1siҥ;b ݕړ} 15qGY?M0-b ꃇd|FPב9GuFwUVgCRIDr#G-O`?l}Y\|ٻCe|1`!)PovR{̘9 ?I |WQ/g8KIB^U7BGjH~@f:_Q/z%ƖT58[gW'˧ 8 `o nb _MZ,-"YoM\$LK'*4Ƭ|a4(t9r?︸(ZВEp䐵 YAnqfj,߾8f&ssHIuダz/m}pHPIa{'Y[|h&I`F\ @{q/q}{n=2.u󑸧 I9sg2ۙq r9 CO?־L'鹁 3o;wxOt2ٗ7#|v̿/З0F/Y^e5w:Xh{~f h٨O>6WFϨ2.;Sқ _S`nkJ8C 'mk^DbѲ̙Z4MZz Gۅ{lNl:ϓ?OOU ]79lSz?-I8M]mO؟w\,/aWkͶvŨ[K]X V 6D(B}6Q3w[GK.j1<+Ki|&Y +e\ű{W?lPJ%|I*9!P{ r KYϭ?x(؜ִ'[^6٭GMcn(W%x{ w3BHpQy֬YN&g̵N02 4+Eϯ cgFy⤜cfJ7?4uo&sb$,&w"%@ l<py/_vendored_packages/iniconfig/__init__.pyPKdSsШ,Apy/_vendored_packages/iniconfig/__init__.pyiPKdS(Cpy/_vendored_packages/iniconfig/py.typedPKdSp^%Dpy-1.11.0.dist-info/LICENSEPKdSs3 Fpy-1.11.0.dist-info/METADATAPKdS_nJpy-1.11.0.dist-info/WHEELPKdS㚘!Kpy-1.11.0.dist-info/top_level.txtPKdS6Kpy/_vendored_packages/apipkg-2.0.0.dist-info/INSTALLERPKdSO=Z42Lpy/_vendored_packages/apipkg-2.0.0.dist-info/LICENSEPKdS\/*5Npy/_vendored_packages/apipkg-2.0.0.dist-info/METADATAPKdSw!3Vpy/_vendored_packages/apipkg-2.0.0.dist-info/RECORDPKdS6/Xpy/_vendored_packages/apipkg-2.0.0.dist-info/REQUESTEDPKdS_n2Xpy/_vendored_packages/apipkg-2.0.0.dist-info/WHEELPKdSy :4Ypy/_vendored_packages/apipkg-2.0.0.dist-info/top_level.txtPKdS9Ypy/_vendored_packages/iniconfig-1.1.1.dist-info/INSTALLERPKdSp^%7Ypy/_vendored_packages/iniconfig-1.1.1.dist-info/LICENSEPKdSme 8\py/_vendored_packages/iniconfig-1.1.1.dist-info/METADATAPKdSwժ_6`py/_vendored_packages/iniconfig-1.1.1.dist-info/RECORDPKdS9cpy/_vendored_packages/iniconfig-1.1.1.dist-info/REQUESTEDPKdS_n5ucpy/_vendored_packages/iniconfig-1.1.1.dist-info/WHEELPKdSȡc ='dpy/_vendored_packages/iniconfig-1.1.1.dist-info/top_level.txtPKdS$ dpy-1.11.0.dist-info/RECORDPK@@npython-pkginfo-0.6.5/tests/test_distribution.rs000064400000000000000000000076211046102023000201040ustar 00000000000000use python_pkginfo::{Distribution, DistributionType}; #[test] fn test_parse_wheel() { let dist = Distribution::new("tests/fixtures/build-0.4.0-py2.py3-none-any.whl").unwrap(); assert_eq!(dist.r#type(), DistributionType::Wheel); let metadata = dist.metadata(); assert_eq!(metadata.metadata_version, "2.1"); assert_eq!(metadata.name, "build"); assert!(metadata.home_page.is_none()); assert!(metadata.download_url.is_none()); assert_eq!(dist.python_version(), "py2.py3"); } #[test] fn test_parse_wheel_with_vendored_pkgs() { let dist = Distribution::new("tests/fixtures/py-1.11.0-py2.py3-none-any.whl").unwrap(); assert_eq!(dist.r#type(), DistributionType::Wheel); let metadata = dist.metadata(); assert_eq!(metadata.metadata_version, "2.1"); assert_eq!(metadata.name, "py"); assert_eq!(dist.python_version(), "py2.py3"); } #[test] fn test_parse_egg() { let dist = Distribution::new("tests/fixtures/build-0.4.0-py3.9.egg").unwrap(); assert_eq!(dist.r#type(), DistributionType::Egg); let metadata = dist.metadata(); assert_eq!(metadata.metadata_version, "2.1"); assert_eq!(metadata.name, "build"); assert!(metadata.home_page.is_none()); assert!(metadata.download_url.is_none()); assert_eq!(dist.python_version(), "py3.9"); } #[test] fn test_parse_sdist_zip() { let dist = Distribution::new("tests/fixtures/build-0.4.0.zip").unwrap(); assert_eq!(dist.r#type(), DistributionType::SDist); let metadata = dist.metadata(); assert_eq!(metadata.metadata_version, "2.1"); assert_eq!(metadata.name, "build"); assert!(metadata.home_page.is_none()); assert!(metadata.download_url.is_none()); assert_eq!(dist.python_version(), "source"); } #[cfg(feature = "deprecated-formats")] #[test] fn test_parse_sdist_tar() { let dist = Distribution::new("tests/fixtures/build-0.4.0.tar").unwrap(); assert_eq!(dist.r#type(), DistributionType::SDist); let metadata = dist.metadata(); assert_eq!(metadata.metadata_version, "2.1"); assert_eq!(metadata.name, "build"); assert!(metadata.home_page.is_none()); assert!(metadata.download_url.is_none()); } #[test] fn test_parse_sdist_tar_gz() { let dist = Distribution::new("tests/fixtures/build-0.4.0.tar.gz").unwrap(); assert_eq!(dist.r#type(), DistributionType::SDist); let metadata = dist.metadata(); assert_eq!(metadata.metadata_version, "2.1"); assert_eq!(metadata.name, "build"); assert_eq!(metadata.author.as_deref(), Some("Filipe Laíns")); assert!(metadata.home_page.is_none()); assert!(metadata.download_url.is_none()); assert_eq!(dist.python_version(), "source"); } #[cfg(feature = "bzip2")] #[test] fn test_parse_sdist_tar_bz2() { let dist = Distribution::new("tests/fixtures/build-0.4.0.tar.bz2").unwrap(); assert_eq!(dist.r#type(), DistributionType::SDist); let metadata = dist.metadata(); assert_eq!(metadata.metadata_version, "2.1"); assert_eq!(metadata.name, "build"); assert!(metadata.home_page.is_none()); assert!(metadata.download_url.is_none()); assert_eq!(dist.python_version(), "source"); } #[cfg(feature = "xz")] #[test] fn test_parse_sdist_tar_lz() { let dist = Distribution::new("tests/fixtures/build-0.4.0.tar.lz").unwrap(); assert_eq!(dist.r#type(), DistributionType::SDist); let metadata = dist.metadata(); assert_eq!(metadata.metadata_version, "2.1"); assert_eq!(metadata.name, "build"); assert!(metadata.home_page.is_none()); assert!(metadata.download_url.is_none()); } #[cfg(feature = "xz")] #[test] fn test_parse_sdist_tar_xz() { let dist = Distribution::new("tests/fixtures/build-0.4.0.tar.xz").unwrap(); assert_eq!(dist.r#type(), DistributionType::SDist); let metadata = dist.metadata(); assert_eq!(metadata.metadata_version, "2.1"); assert_eq!(metadata.name, "build"); assert!(metadata.home_page.is_none()); assert!(metadata.download_url.is_none()); }