pyhanko-cli 0.3.1__tar.gz → 0.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pyhanko_cli-0.3.1/src/pyhanko_cli.egg-info → pyhanko_cli-0.4.0}/PKG-INFO +4 -3
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/certomancer.yml +16 -6
- pyhanko_cli-0.4.0/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/decrypter-x25519.key.pem +3 -0
- pyhanko_cli-0.4.0/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/decrypter-x448.key.pem +4 -0
- pyhanko_cli-0.4.0/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/decrypter1.key.pem +5 -0
- pyhanko_cli-0.4.0/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/decrypter2.key.pem +6 -0
- pyhanko_cli-0.4.0/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/decrypter3.key.pem +8 -0
- pyhanko_cli-0.4.0/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/intermediate_ca.key.pem +6 -0
- pyhanko_cli-0.4.0/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/ocsp.key.pem +6 -0
- pyhanko_cli-0.4.0/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/root_ca.key.pem +6 -0
- pyhanko_cli-0.4.0/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/signer.key.pem +6 -0
- pyhanko_cli-0.4.0/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/signer2.key.pem +6 -0
- pyhanko_cli-0.4.0/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/tsa.key.pem +6 -0
- pyhanko_cli-0.4.0/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/tsa2.key.pem +6 -0
- pyhanko_cli-0.4.0/pyhanko_testing_commons/test_data/data/crypto/keys-rsa/tsa.key.pem +30 -0
- pyhanko_cli-0.4.0/pyhanko_testing_commons/test_data/data/fonts/LICENSE.SourceSerif +93 -0
- pyhanko_cli-0.4.0/pyhanko_testing_commons/test_data/data/fonts/SourceSerif4-Regular.otf +0 -0
- pyhanko_cli-0.4.0/pyhanko_testing_commons/test_data/data/pdf/.gitignore +1 -0
- pyhanko_cli-0.4.0/pyhanko_testing_commons/test_data/data/pdf/layout-tests/double-newline.pdf +0 -0
- pyhanko_cli-0.4.0/pyhanko_testing_commons/test_data/data/pdf/layout-tests/source-serif-test.pdf +0 -0
- pyhanko_cli-0.4.0/pyhanko_testing_commons/test_data/data/pdf/no-mediabox.pdf +0 -0
- pyhanko_cli-0.4.0/pyhanko_testing_commons/test_data/data/pdf/pubkey-ecc-test.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyproject.toml +6 -4
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko/cli/_ctx.py +41 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko/cli/_root.py +17 -2
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko/cli/_trust.py +6 -1
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko/cli/commands/crypt.py +9 -6
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko/cli/commands/signing/__init__.py +9 -2
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko/cli/commands/signing/pkcs11_cli.py +5 -4
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko/cli/commands/signing/plugin.py +57 -2
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko/cli/commands/signing/simple.py +5 -4
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko/cli/commands/signing/utils.py +10 -5
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko/cli/commands/validation/validate.py +9 -57
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko/cli/config.py +40 -1
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko/cli/plugin_api.py +13 -0
- pyhanko_cli-0.4.0/src/pyhanko/cli/version.py +2 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0/src/pyhanko_cli.egg-info}/PKG-INFO +4 -3
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko_cli.egg-info/SOURCES.txt +5 -4
- pyhanko_cli-0.4.0/src/pyhanko_cli.egg-info/requires.txt +7 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/tests/conftest.py +6 -4
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/tests/test_cli_crypt.py +22 -24
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/tests/test_cli_ltv.py +2 -90
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/tests/test_cli_plugins.py +110 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/tests/test_cli_signing.py +127 -29
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/tests/test_cli_signing_pkcs11.py +35 -15
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/tests/test_config.py +1 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/tests/validation/conftest.py +10 -6
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/tests/validation/test_cli_qualified_validation.py +60 -25
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/tests/validation/test_cli_validation.py +145 -49
- pyhanko_cli-0.3.1/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/decrypter-x25519.key.pem +0 -3
- pyhanko_cli-0.3.1/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/decrypter-x448.key.pem +0 -4
- pyhanko_cli-0.3.1/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/decrypter1.key.pem +0 -5
- pyhanko_cli-0.3.1/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/decrypter2.key.pem +0 -6
- pyhanko_cli-0.3.1/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/decrypter3.key.pem +0 -7
- pyhanko_cli-0.3.1/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/intermediate_ca.key.pem +0 -9
- pyhanko_cli-0.3.1/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/ocsp.key.pem +0 -9
- pyhanko_cli-0.3.1/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/root_ca.key.pem +0 -9
- pyhanko_cli-0.3.1/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/signer.key.pem +0 -9
- pyhanko_cli-0.3.1/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/signer2.key.pem +0 -9
- pyhanko_cli-0.3.1/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/tsa.key.pem +0 -9
- pyhanko_cli-0.3.1/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/tsa2.key.pem +0 -9
- pyhanko_cli-0.3.1/pyhanko_testing_commons/test_data/data/fonts/FreeSerif.otf +0 -0
- pyhanko_cli-0.3.1/pyhanko_testing_commons/test_data/data/fonts/LICENSE.freeserif +0 -29
- pyhanko_cli-0.3.1/pyhanko_testing_commons/test_data/data/pdf/.gitignore +0 -1
- pyhanko_cli-0.3.1/pyhanko_testing_commons/test_data/data/pdf/layout-tests/double-newline.pdf +0 -0
- pyhanko_cli-0.3.1/pyhanko_testing_commons/test_data/data/pdf/layout-tests/freeserif-test.pdf +0 -0
- pyhanko_cli-0.3.1/pyhanko_testing_commons/test_data/data/pdf/pubkey-ecc-test.pdf +0 -0
- pyhanko_cli-0.3.1/src/pyhanko/cli/version.py +0 -2
- pyhanko_cli-0.3.1/src/pyhanko_cli.egg-info/requires.txt +0 -6
- pyhanko_cli-0.3.1/tests/validation/test_cli_legacy_ltv.py +0 -125
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/LICENSE +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/MANIFEST.in +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/README.md +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/__init__.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/__init__.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/certomancer_trust_lists.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-dsa/intermediate_ca.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-dsa/ocsp.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-dsa/params.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-dsa/root_ca.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-dsa/signer.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-dsa/signer2.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-dsa/tsa.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-dsa/tsa2.key.pem +0 -0
- /pyhanko_cli-0.3.1/pyhanko_testing_commons/test_data/data/crypto/keys-rsa/tsa.key.pem → /pyhanko_cli-0.4.0/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/tsa_rsa.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-ed25519/intermediate_ca.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-ed25519/ocsp.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-ed25519/root_ca.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-ed25519/signer.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-ed25519/signer2.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-ed25519/tsa.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-ed25519/tsa2.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-ed448/intermediate_ca.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-ed448/ocsp.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-ed448/root_ca.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-ed448/signer.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-ed448/signer2.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-ed448/tsa.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-ed448/tsa2.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-rsa/indep_tsa.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-rsa/indep_tsa_root.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-rsa/interm_aa.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-rsa/intermediate_ca.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-rsa/leaf_aa.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-rsa/ocsp.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-rsa/root_aa.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-rsa/root_ca.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-rsa/signer.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-rsa/signer2.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/keys-rsa/tsa2.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/ocsp.req.der +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/ocsp.resp.der +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/real-misissued-qtst-cert.cer +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/real-qcert.cer +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/real-qtst-cert.cer +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/selfsigned.cert.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/selfsigned.key.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/selfsigned.pfx +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/some-chain.cert.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca/ca-chain.cert.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca/interm/decrypter1-old.cert.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca/interm/decrypter1.cert.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca/interm/decrypter1.pfx +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca/interm/decrypter2.cert.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca/interm/decrypter2.pfx +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca/interm/interm-ocsp.cert.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca/interm/interm-ocsp.pfx +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca/interm/signer1-long.cert.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca/interm/signer1-long.pfx +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca/interm/signer1.cert.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca/interm/signer1.pfx +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca/interm/signer2.cert.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca/interm/signer2.pfx +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca/root/interm.cert.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca/root/interm.pfx +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca/root/root.cert.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca/root/root.pfx +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca/root/tsa.cert.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca/root/tsa.pfx +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca/root/tsa2.cert.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca/root/tsa2.pfx +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca-setup/ca-setup.sh +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca-setup/openssl.base.cnf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca-setup/pkcs11-setup-certomancer.sh +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca-setup/pkcs11-setup.sh +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/testing-ca-setup/setup-params +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/crypto/tsa.cert.pem +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/fonts/LICENSE.Noto +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/fonts/NotoSans-Regular.ttf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/fonts/NotoSansArabic-Regular.ttf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/fonts/NotoSerifJP-Regular.otf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/fonts/NotoSerifSubset.otf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/img/stamp-indexed.png +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/img/stamp.png +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/broken-objstream1.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/broken-objstream2.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/broken-objstream3.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/broken-objstream4.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/broken-objstream5.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/broken-objstream6.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/certified-with-indirect-refs-in-dir.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/circular-page-tree.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/coverage-anomalies/base.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/coverage-anomalies/one-byterange.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/coverage-anomalies/signature-gap-too-big.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/coverage-anomalies/tail-uncovered.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/coverage-anomalies/weird-byterange.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/ed448-disallowed-hash.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/ed448-shake256-nolen.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/embedded-encrypted-nocf.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/empty-a4.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/extensions-direct.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/extensions-indirect-not-all-paths.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/extensions-indirect.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/extensions-update-direct.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/extensions-update-indirect.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/fontembed.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/form-tree-circular-ref-input.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/form-update-ap-indirect-sneaky-trailer.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/form-update-no-override-appearance-stream-ap-indirect-sneaky.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/form-update-no-override-appearance-stream-ap-indirect.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/form-update-original-ap-type-wrong.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/form-update-override-appearance-stream-ap-indirect-sneaky.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/form-update-override-appearance-stream-ap-indirect.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/form-update-override-appearance-stream-sneaky.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/form-update-override-appearance-stream.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/info-bin-producer-string.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/layout-tests/arabic-box.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/layout-tests/bitmap-bg.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/layout-tests/code128-test.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/layout-tests/fancy-qr-stamp-test.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/layout-tests/form-fill-result.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/layout-tests/four-stamps-fixed.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/layout-tests/four-stamps-natural.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/layout-tests/ja-vert-stamps.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/layout-tests/leaky-graphics-state-stamp-no-corr-result.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/layout-tests/leaky-graphics-state-stamp-result.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/layout-tests/scaled-bitmap-bg.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/layout-tests/stamp-from-static-pdf.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/layout-tests/stamp-on-pdf-bg.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/layout-tests/text-stamp-color.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/layout-tests/undef-bg-size.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/leaky-graphics-state-doc.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/malformed-encrypt-dict1.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/malformed-encrypt-dict2.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-aes256-empty-encrypted-string.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-aes256-malformed-oe.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-aes256-malformed-perms.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-aes256.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-annotless.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-badxref.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-broken-xref-size.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-hybrid-xref-mswordstyle.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-hybrid-xref-weirdgen.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-hybrid-xref.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-illegal-header.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-one-field-indir-annots.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-pdf-ua-and-a.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-pubkey-aes256.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-pubkey-rc4-envelope.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-pubkey-rc4.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-pubkey-unknown-envelope-alg.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-rc4.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-signed-twice-both-created.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-signed-twice-no-sig-type.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-signed-twice-second-created.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-startxref-hopeless.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-startxref-hopeless2.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-startxref-hopeless3.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-startxref-obo1.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-startxref-obo2.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-startxref-obo3.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-startxref-obo4.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-startxref-obo5.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-startxref-obo6.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-startxref-same-line.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-two-fields-aes256.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-two-fields-pubkey-aes256.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-two-fields-pubkey-rc4.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-two-fields-signed-twice.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-two-fields-tagged.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-two-fields.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-two-pages.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-with-field-aes256.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-with-field-pubkey-aes256.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-with-field-pubkey-rc4.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-with-field-rc4.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-with-field-tagged.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-with-field.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-with-nonexistent-refs.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-with-orphaned-xrefs.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-with-simple-form.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-with-textfield-group-var.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-with-textfield-group.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal-xref.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/minimal.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/pades-lta-dss-indirect-arrs-test-2.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/pades-lta-dss-indirect-arrs-test.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/pades-with-old-style-signing-cert-attr-issser.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/pades-with-old-style-signing-cert-attr.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/page-tree-direct-kid.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/pdf-background-test.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/pdf-sig-with-econtent.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/pubkey-3des-test.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/pubkey-rc2-test.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/safedocs/CompactedPDFSyntaxTest.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/safedocs/SOURCE +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/scribble-decomp.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/scribble-in-arr.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/scribble.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/separate-annots-kids-indir.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/sig-no-signed-attrs.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/sig-with-ski-sid.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/signed-encrypted-pubkey-with-catalog-ref.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/source +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/struct-tree-circular-ref.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/pdf/uncompressed-objstream-sample.pdf +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/tl/COPYRIGHT +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/tl/eu-lotl-pivot-282.xml +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/tl/eu-lotl-pivot-300.xml +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/tl/eu-lotl-pivot-335.xml +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/tl/eu-lotl-pivot-341.xml +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/tl/eu-lotl.xml +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/tl/tsl-be.xml +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/tl/tsl-ee.xml +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/xml/bad-xml/SOURCE +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/xml/bad-xml/cyclic.xml +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/xml/bad-xml/dtd.xml +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/xml/bad-xml/external.xml +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/xml/bad-xml/external_file.xml +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/xml/bad-xml/quadratic.xml +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/xml/bad-xml/simple-ns.xml +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/xml/bad-xml/simple.xml +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/xml/bad-xml/xmlbomb.xml +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/xml/bad-xml/xmlbomb2.xml +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/data/xml/bad-xml/xmp-with-harmless-entity.xml +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_data/samples.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_utils/__init__.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_utils/csc_utils/__init__.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_utils/csc_utils/csc_dummy_client.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_utils/layout_test_utils.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_utils/pkcs11_utils/__init__.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_utils/pkcs11_utils/config.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_utils/pkcs11_utils/fixtures.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/pyhanko_testing_commons/test_utils/signing_commons.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/setup.cfg +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko/__main__.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko/cli/__init__.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko/cli/cache.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko/cli/commands/__init__.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko/cli/commands/fields.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko/cli/commands/stamp.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko/cli/commands/validation/__init__.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko/cli/commands/validation/ltv.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko/cli/py.typed +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko/cli/runtime.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko/cli/utils.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko_cli.egg-info/dependency_links.txt +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko_cli.egg-info/entry_points.txt +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/src/pyhanko_cli.egg-info/top_level.txt +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/tests/__init__.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/tests/test_cli_field_mgmt.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/tests/test_cli_stamp.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/tests/test_runtime.py +0 -0
- {pyhanko_cli-0.3.1 → pyhanko_cli-0.4.0}/tests/validation/__init__.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyhanko-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
4
4
|
Summary: CLI tools for stamping and signing PDF files
|
|
5
5
|
Author-email: Matthias Valvekens <dev@mvalvekens.be>
|
|
6
6
|
Maintainer-email: Matthias Valvekens <dev@mvalvekens.be>
|
|
@@ -27,8 +27,9 @@ Description-Content-Type: text/markdown
|
|
|
27
27
|
License-File: LICENSE
|
|
28
28
|
Requires-Dist: asn1crypto>=1.5.1
|
|
29
29
|
Requires-Dist: tzlocal>=4.3
|
|
30
|
-
Requires-Dist: pyhanko<0.
|
|
31
|
-
Requires-Dist: pyhanko-certvalidator<0.
|
|
30
|
+
Requires-Dist: pyhanko<0.36,>=0.35.0
|
|
31
|
+
Requires-Dist: pyhanko-certvalidator<0.32,>=0.31.0
|
|
32
|
+
Requires-Dist: certifi>=2023.5.7
|
|
32
33
|
Requires-Dist: click!=8.2.0,>=8.1.3
|
|
33
34
|
Requires-Dist: platformdirs>=4.3.8
|
|
34
35
|
Dynamic: license-file
|
|
@@ -37,25 +37,21 @@ keysets:
|
|
|
37
37
|
keys:
|
|
38
38
|
root:
|
|
39
39
|
path: root_ca.key.pem
|
|
40
|
-
password: secret
|
|
41
40
|
interm:
|
|
42
41
|
path: intermediate_ca.key.pem
|
|
43
|
-
password: secret
|
|
44
42
|
tsa:
|
|
45
43
|
path: tsa.key.pem
|
|
46
|
-
password: secret
|
|
47
44
|
tsa2:
|
|
48
45
|
path: tsa2.key.pem
|
|
46
|
+
tsa-rsa:
|
|
47
|
+
path: tsa_rsa.key.pem
|
|
49
48
|
password: secret
|
|
50
49
|
interm-ocsp:
|
|
51
50
|
path: ocsp.key.pem
|
|
52
|
-
password: secret
|
|
53
51
|
signer1:
|
|
54
52
|
path: signer.key.pem
|
|
55
|
-
password: secret
|
|
56
53
|
signer2:
|
|
57
54
|
path: signer2.key.pem
|
|
58
|
-
password: secret
|
|
59
55
|
decrypter1:
|
|
60
56
|
path: decrypter1.key.pem # secp256r1
|
|
61
57
|
decrypter2:
|
|
@@ -333,6 +329,20 @@ pki-architectures:
|
|
|
333
329
|
testing-ca-ecdsa:
|
|
334
330
|
template: testing-ca
|
|
335
331
|
keyset: testing-ca-ecdsa
|
|
332
|
+
entities:
|
|
333
|
+
tsa-rsa:
|
|
334
|
+
common-name: Time Stamping Authority (RSA)
|
|
335
|
+
certs:
|
|
336
|
+
tsa-rsa:
|
|
337
|
+
template: tsa
|
|
338
|
+
subject: tsa-rsa
|
|
339
|
+
subject-key: tsa-rsa
|
|
340
|
+
services:
|
|
341
|
+
time-stamping:
|
|
342
|
+
tsa-rsa:
|
|
343
|
+
signing-key: tsa-rsa
|
|
344
|
+
signing-cert: tsa-rsa
|
|
345
|
+
digest-algo: sha512
|
|
336
346
|
ecc-testing-ca-with-decrypters:
|
|
337
347
|
template: testing-ca
|
|
338
348
|
keyset: testing-ca-ecdsa
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
-----BEGIN PRIVATE KEY-----
|
|
2
|
+
MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDD9QeFAQJqX70LshnR4
|
|
3
|
+
GrKhYdtpFlc+9Yiihn3Tz7gX1fsBxwdOXEQm9JpB37MHacahZANiAARh5dNyrcfb
|
|
4
|
+
0Qwp60P4a65l5f0m3ol/SNQl/Lb1EYwovPjJuch9stppDWyZvGqJXfBuIBWhgJGd
|
|
5
|
+
QgXsKu1DDX6eJzUjzqv9bqjDMT2xHXYEucfM+dI5BvmwJq8xAAYMSyo=
|
|
6
|
+
-----END PRIVATE KEY-----
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
-----BEGIN PRIVATE KEY-----
|
|
2
|
+
MIHuAgEAMBAGByqGSM49AgEGBSuBBAAjBIHWMIHTAgEBBEIBtuGYcLkK2RLn5sMm
|
|
3
|
+
CXa7q9GJIKnc/KWK0wskosgbJgQ9X5l9SaD/SLY+LnFOTZHqwVCm7JidGUyb5JTB
|
|
4
|
+
525E7K+hgYkDgYYABAHtqDSTH6safq3VrnZHmt6QI+HcT8z1ORO4OqBHxcFhAp7y
|
|
5
|
+
ZG5jGazFi73NTgGOyVJgzTVwzcaPdrTPmaSNUtoyrgCTdMbv5yPmQlS7mXuZ+r2b
|
|
6
|
+
5TmdoIVi2ptXGi/5FEPeVotN//cLtrVS3U6px0mrEWNQH/ml7H7WshfDw/Idqf2Y
|
|
7
|
+
0Q==
|
|
8
|
+
-----END PRIVATE KEY-----
|
pyhanko_cli-0.4.0/pyhanko_testing_commons/test_data/data/crypto/keys-ecdsa/intermediate_ca.key.pem
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
-----BEGIN PRIVATE KEY-----
|
|
2
|
+
MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDAEzwhf7zGYpmekTy2i
|
|
3
|
+
jKcPuGIL+VQs2v5EOuisZSDUtdF9kPKjo9N2Q7TOTjTAOM2hZANiAASPyBseZ0vP
|
|
4
|
+
AX2RKlwrPKg8Rcgmw5OdkxmRmSGgXtmm24eILFxQosQyxdyQK8AaijYLs/86rgfk
|
|
5
|
+
cvjwZ9mE0z0XhZs617SLovbuWvDg6aQGpUQR8AwbJIe/LqWO8cqqyMI=
|
|
6
|
+
-----END PRIVATE KEY-----
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
-----BEGIN PRIVATE KEY-----
|
|
2
|
+
MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDB753e9U9IilLa3iBVJ
|
|
3
|
+
YrVnnXJG1zcac7RST0YnBrR35KVZkyfEysJdE70MTD8DLf+hZANiAARDcIq1rs/Q
|
|
4
|
+
s65aLELkes5BVgyYvPL0y/5aN2TV2p0iwzBtcMsGexPs9SShp5qJClVpCUQwq0kQ
|
|
5
|
+
nCZ4aLc5liR8uJf9UckKNiG+BjUfZGpwrC0uUAzrD18X06NH6aPLoNc=
|
|
6
|
+
-----END PRIVATE KEY-----
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
-----BEGIN PRIVATE KEY-----
|
|
2
|
+
MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDDZELAjP9K1Tu4d60c4
|
|
3
|
+
uH3PIXkaFbK7VikKYA0CSET06LUUBI/19tvxn6LXWVrXUQShZANiAARoSeKHPKF8
|
|
4
|
+
tzbuY8/kVNgy6/2Tm6KU4H2CRsMTCCaTfOGhQOJFu5hLomfrW6S+mMz5Vzr+c/68
|
|
5
|
+
TUsoH8vLL3c6mrlsZDZhL95esPZCK3ScxyBFUHShKaCMM61Th3UVOxo=
|
|
6
|
+
-----END PRIVATE KEY-----
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
-----BEGIN PRIVATE KEY-----
|
|
2
|
+
MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDCGwezdoIghoZnBPZM/
|
|
3
|
+
K2yhCVZUkHLDdx8nQtlqqPc+NpHS9UsOM0UnphiB1AbXu6ihZANiAARz7HrBWoCv
|
|
4
|
+
7KyhernqqqAGDoiw34adGQd2wmsN+5TYhwhDCzS+vqtjc4m9FYER0T402HYMe7bM
|
|
5
|
+
SikY3y1JITMlGL3mspfnuMEgeRRpNw8jAqu7inScPOfTp4oKyIrOpjQ=
|
|
6
|
+
-----END PRIVATE KEY-----
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
-----BEGIN PRIVATE KEY-----
|
|
2
|
+
MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDCtw/AbLPj9CsE7SyIm
|
|
3
|
+
xGUNFRvZonjaR7XZbNuls8Hh6dGVsiz2lYj1dpcPQ7NBLgGhZANiAASv5DVAVL8+
|
|
4
|
+
aNjbkjaFLCfMZx+KxudP6yewKTYk9kMQmx+9dEscz5XSUI/auHUCaYC4wtwWmV1w
|
|
5
|
+
9IveFV+6JEU+0CRtiGRw9RvfGQcSasBrBJPkd/uUw33RGb1E/749YEI=
|
|
6
|
+
-----END PRIVATE KEY-----
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
-----BEGIN PRIVATE KEY-----
|
|
2
|
+
MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDCHHys1SN4eaB8YckPF
|
|
3
|
+
5BbJlHK1rebbDPVW/uwBybEYizVHLdVFFD3Wcbqmy5q5X0KhZANiAARHmIokodeT
|
|
4
|
+
7yai1BnAKotkTFb9RKE5OFnULiwW1dGNmdl2+R7WBhf5kzMf6YwEO9u75XJlut26
|
|
5
|
+
leaIyem4jPQdcH4f/EjHJ4vZPrxVr1/5mm5tRJtWCxhvXdkQsROCsPY=
|
|
6
|
+
-----END PRIVATE KEY-----
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
-----BEGIN PRIVATE KEY-----
|
|
2
|
+
MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDAt+eMBC8Uv+2JX+rwq
|
|
3
|
+
5MHMVEHQu8sqtpVQ+w7lrnM7RlOXN2Z88tIhnFX83mOGPbmhZANiAAS/1cx5q4Ac
|
|
4
|
+
2jSchMuKX7k8lgx9IV3GJwNnzZccmDGApP/P9nCg8SX6z1wKGohVgGkxpPuseBZQ
|
|
5
|
+
fi1qXujiuJL0BCCrGsSZRHxufnwzwo2y5hgT9ZCqi8elECdRp6pAIcY=
|
|
6
|
+
-----END PRIVATE KEY-----
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
|
2
|
+
Proc-Type: 4,ENCRYPTED
|
|
3
|
+
DEK-Info: AES-256-CBC,32635A4426FAA0AD7E76EB7D3ED8D696
|
|
4
|
+
|
|
5
|
+
PS9YmhrMah6NQwKb0emFT+Vi0gP4LA2WSn963waS6NHaeXJsCjqUBzWsjfhH3+MZ
|
|
6
|
+
VFNf+e8YMPojJR7WLLn0aweSEsJ2HtPebbmCqcf3VA0BUDDkpStvWx+06UIb9BcI
|
|
7
|
+
6kZrJyVfpw0paAEt65i5faTrnAu5VxApQ8RxaCexYAm2abvdSBnBkqBG/Flh4nku
|
|
8
|
+
zUSl60WgynpX742e4l0++Twsw4RHQGSOPnvdT5VxSrcXSxL0Wgr0gDkHFMYBtYj3
|
|
9
|
+
NV6upBmHCjasLmAEZZmf4F34jDOCPmx0yPKlwVx/y5M+zq6XKQh6Cawoq0Pxy/Cl
|
|
10
|
+
2y+/mPMUlY//fVdVCbbfwsU+U82n1mlEno6UhIiAlkPasmqX/fTZkWGZmhN5jrim
|
|
11
|
+
vm+dlqv/AhC3neJZLSITNq/idyWp3hpV3cZhQYWXw23zP5l+4IZf3PHuXpDaRKUG
|
|
12
|
+
ehaYN1ddbjXA8yaRf+UzROuE/eZg0+w3Y5GLObHzGmAMfi3D436MEj44ljiYu72P
|
|
13
|
+
OEpPvFJpr+WS/ftLFXe/wUyyHmp9dhY9E6Nrb0zK1ex8pOJXCa2nLpzMOmzwBObN
|
|
14
|
+
M4n1lx3exJPW8amVT3vhNpGVX0yryZzV0Y1xlWT5cwYWKR5+WASJxLXhxDaFHO+6
|
|
15
|
+
kwEx8tRtO/JW5zreWZh3u1Bp7+O/I09wAfCvil40gHur5GsxbfJ3UlqvxzT9qmo4
|
|
16
|
+
6sUZbW7HdGYwCwHpTkXDd3l0UULyx5zAcuiEHBmSRXL2pLJF/ekVqTk7NvqpgsN8
|
|
17
|
+
AM1vB+uBFJHOiQ9ZxQTzM0P90Oby0IUhEdMFQQQAtmoZsw+LUhwwOAYrofjUYm5G
|
|
18
|
+
NZwWMwifFU5rMDgjvh6GNVVN+egtjwqamvxN/DXHO3AFMu4x9+EAtYg+k9bYbb9u
|
|
19
|
+
g5HpYblTQIg9ekZniC3Ik6Il7l/jzw6vB+1lFovQdBa+/jcqOEhZrbhsQzVi50FC
|
|
20
|
+
iSnIoZb+ZbbGa+rJam+OPtQ7C5WtbpLapukhnLgAyOUTrKBjDe1eOdoFyKBCQvc9
|
|
21
|
+
s+xDtppj9FcBSfZQ1VFk5RkSEw8KSD6PEDLEgLo1MY0AxQwb83IYy2UTPRoB84MY
|
|
22
|
+
9HcrAm/fRYT1wqjv2n+BxZkdNq7ErpHLyvn/TA8vvIxT/A43qsmG7/g35p1f+fm/
|
|
23
|
+
RySDLGNZe4Wedr+/ipFKhECeSPsc/AewrOz2fU/unCY5UUB0NqKIOBE5mHG7fP9Q
|
|
24
|
+
53ivR3ZFbvtW99xv1vEM/DyYdPEvSCSni7wjVJhnvhf0vbi8GEX68WIWQRvTbmD9
|
|
25
|
+
C8LzN1NFCc77jLwL+i9yr01yfDNBkFFR8hUS+Gkw5gBB2QD2xFzWpK0808phxU35
|
|
26
|
+
QBsOaVtyOH5cp+/xHpUSHBb7sd49YMiN8k2XuDEB9HHXqEeSLx8Y0MbDW+Mqo1Z5
|
|
27
|
+
IsflLMWE50gI6aAnaRL0tPlCttwCqT3CH527D4AmJkuFBhpvawJ0AuKLzMZMoH7K
|
|
28
|
+
/a0yuApjwY1T93x0yY5IAiraLNsBRgNUzN6Dg7nIp3TfvIDfHFYXunfc2ch8jctm
|
|
29
|
+
0Aw9Snb499iYKY4+sho5ZaEzcWwwHV9Y2bkelG47I3zncSJSMKYm81Hw2jbrPgec
|
|
30
|
+
-----END RSA PRIVATE KEY-----
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
Copyright 2014 - 2023 Adobe (http://www.adobe.com/), with Reserved Font Name ‘Source’. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries.
|
|
2
|
+
|
|
3
|
+
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
4
|
+
|
|
5
|
+
This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
-----------------------------------------------------------
|
|
9
|
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
10
|
+
-----------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
PREAMBLE
|
|
13
|
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
14
|
+
development of collaborative font projects, to support the font creation
|
|
15
|
+
efforts of academic and linguistic communities, and to provide a free and
|
|
16
|
+
open framework in which fonts may be shared and improved in partnership
|
|
17
|
+
with others.
|
|
18
|
+
|
|
19
|
+
The OFL allows the licensed fonts to be used, studied, modified and
|
|
20
|
+
redistributed freely as long as they are not sold by themselves. The
|
|
21
|
+
fonts, including any derivative works, can be bundled, embedded,
|
|
22
|
+
redistributed and/or sold with any software provided that any reserved
|
|
23
|
+
names are not used by derivative works. The fonts and derivatives,
|
|
24
|
+
however, cannot be released under any other type of license. The
|
|
25
|
+
requirement for fonts to remain under this license does not apply
|
|
26
|
+
to any document created using the fonts or their derivatives.
|
|
27
|
+
|
|
28
|
+
DEFINITIONS
|
|
29
|
+
"Font Software" refers to the set of files released by the Copyright
|
|
30
|
+
Holder(s) under this license and clearly marked as such. This may
|
|
31
|
+
include source files, build scripts and documentation.
|
|
32
|
+
|
|
33
|
+
"Reserved Font Name" refers to any names specified as such after the
|
|
34
|
+
copyright statement(s).
|
|
35
|
+
|
|
36
|
+
"Original Version" refers to the collection of Font Software components as
|
|
37
|
+
distributed by the Copyright Holder(s).
|
|
38
|
+
|
|
39
|
+
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
40
|
+
or substituting -- in part or in whole -- any of the components of the
|
|
41
|
+
Original Version, by changing formats or by porting the Font Software to a
|
|
42
|
+
new environment.
|
|
43
|
+
|
|
44
|
+
"Author" refers to any designer, engineer, programmer, technical
|
|
45
|
+
writer or other person who contributed to the Font Software.
|
|
46
|
+
|
|
47
|
+
PERMISSION & CONDITIONS
|
|
48
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
49
|
+
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
50
|
+
redistribute, and sell modified and unmodified copies of the Font
|
|
51
|
+
Software, subject to the following conditions:
|
|
52
|
+
|
|
53
|
+
1) Neither the Font Software nor any of its individual components,
|
|
54
|
+
in Original or Modified Versions, may be sold by itself.
|
|
55
|
+
|
|
56
|
+
2) Original or Modified Versions of the Font Software may be bundled,
|
|
57
|
+
redistributed and/or sold with any software, provided that each copy
|
|
58
|
+
contains the above copyright notice and this license. These can be
|
|
59
|
+
included either as stand-alone text files, human-readable headers or
|
|
60
|
+
in the appropriate machine-readable metadata fields within text or
|
|
61
|
+
binary files as long as those fields can be easily viewed by the user.
|
|
62
|
+
|
|
63
|
+
3) No Modified Version of the Font Software may use the Reserved Font
|
|
64
|
+
Name(s) unless explicit written permission is granted by the corresponding
|
|
65
|
+
Copyright Holder. This restriction only applies to the primary font name as
|
|
66
|
+
presented to the users.
|
|
67
|
+
|
|
68
|
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
69
|
+
Software shall not be used to promote, endorse or advertise any
|
|
70
|
+
Modified Version, except to acknowledge the contribution(s) of the
|
|
71
|
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
72
|
+
permission.
|
|
73
|
+
|
|
74
|
+
5) The Font Software, modified or unmodified, in part or in whole,
|
|
75
|
+
must be distributed entirely under this license, and must not be
|
|
76
|
+
distributed under any other license. The requirement for fonts to
|
|
77
|
+
remain under this license does not apply to any document created
|
|
78
|
+
using the Font Software.
|
|
79
|
+
|
|
80
|
+
TERMINATION
|
|
81
|
+
This license becomes null and void if any of the above conditions are
|
|
82
|
+
not met.
|
|
83
|
+
|
|
84
|
+
DISCLAIMER
|
|
85
|
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
86
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
87
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
88
|
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
89
|
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
90
|
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
91
|
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
92
|
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
93
|
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!*.pdf
|
|
Binary file
|
pyhanko_cli-0.4.0/pyhanko_testing_commons/test_data/data/pdf/layout-tests/source-serif-test.pdf
ADDED
|
Binary file
|
|
@@ -33,12 +33,13 @@ requires-python = ">=3.10"
|
|
|
33
33
|
dependencies = [
|
|
34
34
|
"asn1crypto>=1.5.1",
|
|
35
35
|
"tzlocal>=4.3",
|
|
36
|
-
"pyhanko>=0.
|
|
37
|
-
"pyhanko-certvalidator>=0.
|
|
36
|
+
"pyhanko>=0.35.0,<0.36",
|
|
37
|
+
"pyhanko-certvalidator>=0.31.0,<0.32",
|
|
38
|
+
"certifi>=2023.5.7",
|
|
38
39
|
"click>=8.1.3,!=8.2.0",
|
|
39
40
|
"platformdirs>=4.3.8",
|
|
40
41
|
]
|
|
41
|
-
version = "0.
|
|
42
|
+
version = "0.4.0"
|
|
42
43
|
|
|
43
44
|
|
|
44
45
|
[project.readme]
|
|
@@ -53,7 +54,7 @@ Changes = "https://docs.pyhanko.eu/en/latest/changelog.html"
|
|
|
53
54
|
"Issue Tracker" = "https://github.com/MatthiasValvekens/pyHanko/issues"
|
|
54
55
|
|
|
55
56
|
[dependency-groups]
|
|
56
|
-
testing-base = ["pytest>=6.1.1", "requests-mock>=1.8.0", "freezegun>=1.1.0", "certomancer>=0.13.0,<0.
|
|
57
|
+
testing-base = ["pytest>=6.1.1", "requests-mock>=1.8.0", "freezegun>=1.1.0", "certomancer>=0.13.0,<0.15", "pytest-cov>=4.0,<7.2", "pytest-asyncio>=1.1.0,<2.0"]
|
|
57
58
|
testing = [{include-group = "testing-base"}, "aiohttp>=3.9,<3.14", "pytest-aiohttp>=1.0.4,<1.2.0", "pyhanko[pkcs11,opentype,async_http,image-support,qr,etsi]"]
|
|
58
59
|
|
|
59
60
|
[project.scripts]
|
|
@@ -76,6 +77,7 @@ markers = [
|
|
|
76
77
|
"hsm: run test on HSM platform",
|
|
77
78
|
"algo: indicate signing algorithm used in test", # so far only used in PKCS#11 suite
|
|
78
79
|
]
|
|
80
|
+
strict = true
|
|
79
81
|
|
|
80
82
|
[tool.coverage.run]
|
|
81
83
|
omit = ["*docs*", "*test*", "*venv*", "setup.py", "_saslprep.py"]
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import getpass
|
|
2
|
+
from abc import ABC, abstractmethod
|
|
1
3
|
from dataclasses import dataclass, field
|
|
2
4
|
from typing import Optional
|
|
3
5
|
|
|
@@ -6,6 +8,39 @@ from pyhanko.sign.fields import SigFieldSpec
|
|
|
6
8
|
from pyhanko.sign.signers import PdfSignatureMetadata
|
|
7
9
|
from pyhanko.stamp import BaseStampStyle
|
|
8
10
|
|
|
11
|
+
__all__ = [
|
|
12
|
+
'PasswordPrompter',
|
|
13
|
+
'GetpassPrompter',
|
|
14
|
+
'UXContext',
|
|
15
|
+
'CLIContext',
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class PasswordPrompter(ABC):
|
|
20
|
+
"""
|
|
21
|
+
Interface for prompting the user for a password / passphrase / PIN.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
@abstractmethod
|
|
25
|
+
def prompt_for_password(self, prompt: str) -> str:
|
|
26
|
+
"""
|
|
27
|
+
Prompt the user for a password.
|
|
28
|
+
|
|
29
|
+
:param prompt: The prompt string to display to the user.
|
|
30
|
+
:return: The password entered by the user.
|
|
31
|
+
"""
|
|
32
|
+
raise NotImplementedError
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class GetpassPrompter(PasswordPrompter):
|
|
36
|
+
"""
|
|
37
|
+
Default :class:`PasswordPrompter` implementation that uses
|
|
38
|
+
:func:`getpass.getpass`.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
def prompt_for_password(self, prompt: str) -> str:
|
|
42
|
+
return getpass.getpass(prompt=prompt)
|
|
43
|
+
|
|
9
44
|
|
|
10
45
|
@dataclass
|
|
11
46
|
class UXContext:
|
|
@@ -21,6 +56,12 @@ class UXContext:
|
|
|
21
56
|
or passes `--style-name` explicitly.
|
|
22
57
|
"""
|
|
23
58
|
|
|
59
|
+
prompter: PasswordPrompter = field(default_factory=GetpassPrompter)
|
|
60
|
+
"""
|
|
61
|
+
Implementation to use when prompting the user for a password, passphrase
|
|
62
|
+
or PIN.
|
|
63
|
+
"""
|
|
64
|
+
|
|
24
65
|
|
|
25
66
|
@dataclass
|
|
26
67
|
class CLIContext:
|
|
@@ -3,8 +3,9 @@ import logging
|
|
|
3
3
|
from typing import Iterable, Optional
|
|
4
4
|
|
|
5
5
|
import click
|
|
6
|
+
import yaml
|
|
6
7
|
from pyhanko.cli._ctx import CLIContext
|
|
7
|
-
from pyhanko.cli.config import CLIRootConfig,
|
|
8
|
+
from pyhanko.cli.config import CLIRootConfig, parse_cli_config_from_dict
|
|
8
9
|
from pyhanko.cli.plugin_api import (
|
|
9
10
|
SIGNING_PLUGIN_ENTRY_POINT_GROUP,
|
|
10
11
|
SIGNING_PLUGIN_REGISTRY,
|
|
@@ -71,7 +72,7 @@ def _root(ctx: click.Context, config, verbose, no_plugins):
|
|
|
71
72
|
ctx_obj: CLIContext = ctx.obj
|
|
72
73
|
cfg: Optional[CLIRootConfig] = None
|
|
73
74
|
if config_text is not None:
|
|
74
|
-
cfg =
|
|
75
|
+
cfg = load_root_config(yaml.safe_load(config_text), no_plugins)
|
|
75
76
|
ctx_obj.config = cfg.config
|
|
76
77
|
log_config = cfg.log_config
|
|
77
78
|
else:
|
|
@@ -107,6 +108,20 @@ def _root(ctx: click.Context, config, verbose, no_plugins):
|
|
|
107
108
|
logging.debug('There was no configuration to parse.')
|
|
108
109
|
|
|
109
110
|
|
|
111
|
+
def load_root_config(config_dict, only_default_plugins=False) -> CLIRootConfig:
|
|
112
|
+
|
|
113
|
+
cfg = parse_cli_config_from_dict(config_dict)
|
|
114
|
+
|
|
115
|
+
from .commands.signing import register
|
|
116
|
+
|
|
117
|
+
plugins_to_register = _load_plugins(
|
|
118
|
+
cfg, plugins_enabled=not only_default_plugins
|
|
119
|
+
)
|
|
120
|
+
register(plugins_to_register)
|
|
121
|
+
|
|
122
|
+
return cfg
|
|
123
|
+
|
|
124
|
+
|
|
110
125
|
def _load_plugins(root_config: Optional[CLIRootConfig], plugins_enabled: bool):
|
|
111
126
|
from importlib import metadata
|
|
112
127
|
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
+
import ssl
|
|
2
3
|
from dataclasses import dataclass
|
|
3
4
|
from datetime import timedelta
|
|
4
5
|
from typing import Any, Dict, Iterable, Optional, TypeVar, Union
|
|
5
6
|
|
|
7
|
+
import certifi
|
|
6
8
|
import click
|
|
7
9
|
from asn1crypto import x509
|
|
8
10
|
from pyhanko.cli.cache import get_eutl_cache_dir
|
|
@@ -114,7 +116,10 @@ async def init_trust_manager(
|
|
|
114
116
|
if settings.eutl_force_redownload:
|
|
115
117
|
tl_cache.reset()
|
|
116
118
|
|
|
117
|
-
|
|
119
|
+
ssl_context = ssl.create_default_context(cafile=certifi.where())
|
|
120
|
+
async with aiohttp.ClientSession(
|
|
121
|
+
connector=aiohttp.TCPConnector(ssl=ssl_context)
|
|
122
|
+
) as client:
|
|
118
123
|
if isinstance(settings.territories, str) and settings.territories:
|
|
119
124
|
territories = {
|
|
120
125
|
t.strip() for t in settings.territories.split(',')
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import getpass
|
|
2
|
-
|
|
3
1
|
import click
|
|
4
2
|
from pyhanko.cli._root import cli_root
|
|
3
|
+
from pyhanko.cli.plugin_api import prompt_for_password
|
|
5
4
|
from pyhanko.cli.runtime import pyhanko_exception_manager
|
|
6
5
|
from pyhanko.cli.utils import _warn_empty_passphrase, readable_file
|
|
7
6
|
from pyhanko.keys import load_certs_from_pemder
|
|
@@ -37,7 +36,7 @@ def encrypt_file(infile, outfile, password, recipient):
|
|
|
37
36
|
"Specify either a password or a list of recipients."
|
|
38
37
|
)
|
|
39
38
|
elif not password and not recipient:
|
|
40
|
-
password =
|
|
39
|
+
password = prompt_for_password(prompt='Output file password: ')
|
|
41
40
|
|
|
42
41
|
recipient_certs = None
|
|
43
42
|
if recipient:
|
|
@@ -96,7 +95,7 @@ def decrypt_with_password(infile, outfile, password, force):
|
|
|
96
95
|
"File is not encrypted with the standard (password-based) security handler"
|
|
97
96
|
)
|
|
98
97
|
if not password:
|
|
99
|
-
password =
|
|
98
|
+
password = prompt_for_password(prompt='File password: ')
|
|
100
99
|
auth_result = r.decrypt(password)
|
|
101
100
|
if auth_result.status == crypt.AuthStatus.USER and not force:
|
|
102
101
|
raise click.ClickException(
|
|
@@ -147,7 +146,9 @@ def decrypt_with_pemder(infile, outfile, key, cert, passfile, force, no_pass):
|
|
|
147
146
|
passphrase = passfile.read()
|
|
148
147
|
passfile.close()
|
|
149
148
|
elif not no_pass:
|
|
150
|
-
passphrase =
|
|
149
|
+
passphrase = prompt_for_password(prompt='Key passphrase: ').encode(
|
|
150
|
+
'utf-8'
|
|
151
|
+
)
|
|
151
152
|
if not passphrase:
|
|
152
153
|
_warn_empty_passphrase()
|
|
153
154
|
passphrase = None
|
|
@@ -206,7 +207,9 @@ def _decrypt_pubkey(
|
|
|
206
207
|
@decrypt_force_flag
|
|
207
208
|
def decrypt_with_pkcs12(infile, outfile, pfx, passfile, force):
|
|
208
209
|
if passfile is None:
|
|
209
|
-
passphrase =
|
|
210
|
+
passphrase = prompt_for_password(prompt='Key passphrase: ').encode(
|
|
211
|
+
'utf-8'
|
|
212
|
+
)
|
|
210
213
|
else:
|
|
211
214
|
passphrase = passfile.readline().strip().encode('utf-8')
|
|
212
215
|
passfile.close()
|
|
@@ -7,7 +7,10 @@ from pyhanko.cli._trust import (
|
|
|
7
7
|
build_vc_kwargs,
|
|
8
8
|
trust_options,
|
|
9
9
|
)
|
|
10
|
-
from pyhanko.cli.commands.signing.plugin import
|
|
10
|
+
from pyhanko.cli.commands.signing.plugin import (
|
|
11
|
+
command_from_plugin,
|
|
12
|
+
preconfigured_identity_command,
|
|
13
|
+
)
|
|
11
14
|
from pyhanko.cli.commands.stamp import select_style
|
|
12
15
|
from pyhanko.cli.utils import parse_field_location_spec
|
|
13
16
|
from pyhanko.pdf_utils.incremental_writer import IncrementalPdfFileWriter
|
|
@@ -273,9 +276,12 @@ def register(plugins: List[SigningCommandPlugin]):
|
|
|
273
276
|
# we reset the command list before (re)populating it, in order to
|
|
274
277
|
# make the tests more consistent
|
|
275
278
|
addsig.commands = {}
|
|
279
|
+
available_commands = {}
|
|
276
280
|
for signer_plugin in plugins:
|
|
277
281
|
if signer_plugin.is_available():
|
|
278
|
-
|
|
282
|
+
cmd = command_from_plugin(signer_plugin)
|
|
283
|
+
addsig.add_command(cmd)
|
|
284
|
+
available_commands[signer_plugin.subcommand_name] = cmd
|
|
279
285
|
else:
|
|
280
286
|
addsig.add_command(
|
|
281
287
|
click.Command(
|
|
@@ -284,6 +290,7 @@ def register(plugins: List[SigningCommandPlugin]):
|
|
|
284
290
|
callback=_unavailable(signer_plugin),
|
|
285
291
|
)
|
|
286
292
|
)
|
|
293
|
+
addsig.add_command(preconfigured_identity_command(available_commands))
|
|
287
294
|
|
|
288
295
|
|
|
289
296
|
readable_file = click.Path(exists=True, readable=True, dir_okay=False)
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import contextlib
|
|
2
2
|
import dataclasses
|
|
3
|
-
import getpass
|
|
4
3
|
import os
|
|
5
4
|
from typing import ContextManager, List, Optional
|
|
6
5
|
|
|
7
6
|
import click
|
|
8
7
|
from pyhanko.cli._ctx import CLIContext
|
|
9
8
|
from pyhanko.cli.config import CLIConfig
|
|
10
|
-
from pyhanko.cli.plugin_api import SigningCommandPlugin
|
|
9
|
+
from pyhanko.cli.plugin_api import SigningCommandPlugin, prompt_for_password
|
|
11
10
|
from pyhanko.cli.utils import logger, readable_file
|
|
12
11
|
from pyhanko.config.errors import ConfigurationError
|
|
13
12
|
from pyhanko.config.pkcs11 import (
|
|
@@ -193,13 +192,15 @@ def _pkcs11_signer_context(
|
|
|
193
192
|
)
|
|
194
193
|
|
|
195
194
|
if pkcs11_config.prompt_pin == PKCS11PinEntryMode.PROMPT and pin is None:
|
|
196
|
-
pin =
|
|
195
|
+
pin = prompt_for_password(prompt='PKCS#11 user PIN: ')
|
|
197
196
|
|
|
198
197
|
with pkcs11.PKCS11SigningContext(pkcs11_config, user_pin=pin) as signer:
|
|
199
198
|
if pkcs11_config.signing_pin_mode == PKCS11SigningPinEntryMode.PROMPT:
|
|
200
199
|
|
|
201
200
|
def _signing_kwargs(*_args, **_kwargs):
|
|
202
|
-
signing_pin =
|
|
201
|
+
signing_pin = prompt_for_password(
|
|
202
|
+
prompt='PKCS#11 signing PIN: '
|
|
203
|
+
)
|
|
203
204
|
return {'pin': signing_pin}
|
|
204
205
|
|
|
205
206
|
signer.sign_kwargs = _signing_kwargs
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
from datetime import datetime
|
|
3
|
-
from typing import List, Optional
|
|
3
|
+
from typing import Dict, List, Optional
|
|
4
4
|
|
|
5
5
|
import click
|
|
6
6
|
import tzlocal
|
|
@@ -103,7 +103,9 @@ def _callback_logic(
|
|
|
103
103
|
out.write(output_bytes)
|
|
104
104
|
else:
|
|
105
105
|
with open_for_signing(
|
|
106
|
-
infile_path=infile,
|
|
106
|
+
infile_path=infile,
|
|
107
|
+
lenient=cli_ctx.lenient,
|
|
108
|
+
prompter=cli_ctx.ux.prompter,
|
|
107
109
|
) as w:
|
|
108
110
|
if cli_ctx.ux.visible_signature_desired:
|
|
109
111
|
_ensure_field_visible(
|
|
@@ -146,3 +148,56 @@ def command_from_plugin(plugin: SigningCommandPlugin) -> click.Command:
|
|
|
146
148
|
help=plugin.help_summary,
|
|
147
149
|
params=params,
|
|
148
150
|
)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def preconfigured_identity_command(
|
|
154
|
+
plugins_by_name: Dict[str, click.Command],
|
|
155
|
+
) -> click.Command:
|
|
156
|
+
|
|
157
|
+
def _callback(*, identity: str, infile: str, outfile: str):
|
|
158
|
+
ctx = click.get_current_context()
|
|
159
|
+
cli_ctx: CLIContext = ctx.obj
|
|
160
|
+
config = cli_ctx.config
|
|
161
|
+
if config is None:
|
|
162
|
+
raise click.ClickException(
|
|
163
|
+
"Identity command requires a config file"
|
|
164
|
+
)
|
|
165
|
+
try:
|
|
166
|
+
identity_obj = config.identities[identity]
|
|
167
|
+
except KeyError:
|
|
168
|
+
raise click.ClickException(
|
|
169
|
+
f"Identity {identity!r} not found in config file"
|
|
170
|
+
)
|
|
171
|
+
try:
|
|
172
|
+
plugin = plugins_by_name[identity_obj.plugin]
|
|
173
|
+
except KeyError:
|
|
174
|
+
raise click.ClickException(
|
|
175
|
+
f"Plugin {identity_obj.plugin!r} referenced by "
|
|
176
|
+
f"identity {identity!r} is not available"
|
|
177
|
+
)
|
|
178
|
+
# To make sure the semantics of the "identity <key>" invocation
|
|
179
|
+
# are the exact same as those of the underlying plugin's command,
|
|
180
|
+
# we invoke the _actual_ command here
|
|
181
|
+
valid_keys = {p.name for p in plugin.params}
|
|
182
|
+
params = {}
|
|
183
|
+
for k, v in identity_obj.parameters.items():
|
|
184
|
+
if k not in valid_keys:
|
|
185
|
+
raise click.ClickException(
|
|
186
|
+
f"Parameter {k!r} defined by {identity!r} "
|
|
187
|
+
f"not known for plugin {identity_obj.plugin!r}."
|
|
188
|
+
)
|
|
189
|
+
params[k] = v
|
|
190
|
+
params['infile'] = infile
|
|
191
|
+
params['outfile'] = outfile
|
|
192
|
+
ctx.invoke(plugin, **params)
|
|
193
|
+
|
|
194
|
+
return click.Command(
|
|
195
|
+
name="identity",
|
|
196
|
+
callback=_callback,
|
|
197
|
+
help="sign using identity defined in config file",
|
|
198
|
+
params=[
|
|
199
|
+
click.Argument(('identity',), type=str),
|
|
200
|
+
click.Argument(('infile',), type=readable_file),
|
|
201
|
+
click.Argument(('outfile',), type=writable_file),
|
|
202
|
+
],
|
|
203
|
+
)
|