chore: use ruff instead of black and isort
What changed, and why it matters
This commit is a routine housekeeping change that swaps the Python code-formatting tools used in the project from `black` and `isort` to `ruff`. It updates configuration files, build scripts, and reformats many source files to match the new tool's style. There is no change to what the software actually does, no new features, and no indication of any security problem or fix.
No security action required. Treat as a normal developer-experience/tooling change.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The commit replaces black/isort with ruff/ruff format across the Trezor firmware repository. Changes are limited to pyproject.toml, Makefile, GitHub workflow, and mass-reformatting of Python files. The diff shows only whitespace, import ordering, line wrapping, and removal of blank lines after class definitions—i.e., stylistic transformations. No functional logic, cryptographic operations, protocol handling, or access-control checks are modified.
Changed components
Build/lint tooling (Makefile, pyproject.toml, .github/workflows/prebuild.yml)Python source formatting across core/, python/, tests/, tools/, common/, storage/, crypto/fuzzer/, docs/Inspect captured patch +257 / −446
### .github/workflows/prebuild.yml
@@ -26,7 +26,7 @@ jobs:
uses: 13rac1/block-fixup-merge-action@bd5504fb9ca0253e109d98eb86b7debc01970cdc # 13rac1/block-fixup-merge-action@v2.0.0
# Check the code for style correctness and perform some static code analysis.
- # Biggest part is the python one - using `flake8`, `isort`, `black`, `pylint` and `pyright`,
+ # Biggest part is the python one - using `ruff`, `flake8`, `pylint` and `pyright`,
# also checking Rust files by `rustfmt` and C files by `clang-format`.
# Changelogs formats are checked.
style_check:
@@ -41,7 +41,7 @@ jobs:
run: git submodule update --init --recursive vendor/QR-Code-generator
- uses: ./.github/actions/environment
- name: "Run style check"
- run: nix-shell --run "uv run make style_check BLACK_FAST=0"
+ run: nix-shell --run "uv run make style_check"
- name: "Run .editorconfig check"
run: nix-shell --run "uv run make editor_check"
### Makefile
@@ -38,23 +38,12 @@ C_FILES = $(shell find . -type f -name '*.[ch]' | grep -f ./tools/style.c.inclu
PROTO_FILES = $(shell find common core -type f -name '*.proto')
RUST_CRATES = $(shell find core -type f -name Cargo.toml -printf "%h\n")
-# suppress black's warning - remove when using Python 3.14
-BLACK_FAST ?= 1
-
-ifeq ($(BLACK_FAST),1)
-BLACK_FLAGS=--fast
-else
-BLACK_FLAGS=
-endif
-
style_check: pystyle_check ruststyle_check cstyle_check protostyle_check changelog_check translations_style_check yaml_check docs_summary_check editor_check ## run all style checks
style: pystyle ruststyle cstyle protostyle changelog_style translations_style ## apply all code styles (Python+Rust+C+protobuf+changelog+translation JSON)
pystyle_check: ## run code style check on application sources and tests
flake8 --version
- isort --version | awk '/VERSION/{print $$2}'
- black --version
ruff --version
pylint --version
pyright --version
@@ -64,29 +53,23 @@ pystyle_check: ## run code style check on application sources and tests
@make typecheck
@echo [FLAKE8]
@flake8 $(PY_FILES)
- @echo [ISORT]
- @isort --check-only $(PY_FILES)
- @echo [BLACK]
- @black --check $(BLACK_FLAGS) $(PY_FILES)
@echo [RUFF]
@ruff check $(PY_FILES)
+ @ruff format --check $(PY_FILES)
@echo [PYLINT]
@pylint $(PY_FILES)
@echo [PYTHON]
- make -C python style_check BLACK_FLAGS=$(BLACK_FLAGS)
+ make -C python style_check
pystyle_quick_check: ## run the basic style checks, suitable for a quick git hook
- @isort --check-only $(PY_FILES)
- @black --check $(BLACK_FLAGS) $(PY_FILES)
- make -C python style_quick_check BLACK_FLAGS=$(BLACK_FLAGS)
+ @ruff format --check $(PY_FILES)
+ @ruff check --select I $(PY_FILES)
+ make -C python style_quick_check
pystyle: ## apply code style on application sources and tests
- @echo [ISORT]
- @isort $(PY_FILES)
- @echo [BLACK]
- @black $(BLACK_FLAGS) $(PY_FILES)
@echo [RUFF]
@ruff check --fix $(PY_FILES)
+ @ruff format $(PY_FILES)
@echo [TYPECHECK]
@make -C core typecheck
@echo [TYPECHECK - COMMON and TOOLS]
@@ -96,7 +79,7 @@ pystyle: ## apply code style on application sources and tests
@echo [PYLINT]
@pylint $(PY_FILES)
@echo [PYTHON]
- make -C python style BLACK_FLAGS=$(BLACK_FLAGS)
+ make -C python style
changelog_check: ## check changelog format
@echo [CHANGELOG-CHECK]
### common/protob/pb2py
@@ -742,8 +742,8 @@ WritableFile = click.Path(dir_okay=False, writable=True)
WritableDirectory = click.Path(exists=True, file_okay=False, writable=True)
-@click.command()
# fmt: off
+@click.command()
@click.argument("proto", nargs=-1, type=ReadableFile, required=True)
@click.option("--python-outdir", type=WritableDirectory, help="Output directory for Python classes (contents will be deleted)")
@click.option("--python-extension", default="py", help="Use .pyi to generate type stubs")
### common/tools/cointool.py
@@ -617,8 +617,8 @@ def cli(colors: bool) -> None:
USE_COLORS = colors
-@cli.command()
# fmt: off
+@cli.command()
@click.option("--backend/--no-backend", "-b", default=False, help="Check blockbook/bitcore responses")
@click.option("--icons/--no-icons", default=True, help="Check icon files")
# fmt: on
@@ -714,8 +714,8 @@ def check(backend: bool, icons: bool) -> None:
device_choice = click.Choice(["connect", "suite", "T1B1", "T2T1", "T2B1"])
-@cli.command()
# fmt: off
+@cli.command()
@click.option("-o", "--outfile", type=click.File(mode="w"), default="-")
@click.option("-s/-S", "--support/--no-support", default=True, help="Include support data for each coin")
@click.option("-p", "--pretty", is_flag=True, help="Generate nicely formatted JSON")
@@ -862,8 +862,8 @@ def modify_coin(coin: Coin) -> Coin:
outfile.write("\n")
-@cli.command()
# fmt: off
+@cli.command()
@click.argument("paths", type=click.Path(path_type=Path), metavar="[path]...", nargs=-1)
@click.option("-o", "--outfile", type=click.Path(dir_okay=False, writable=True, path_type=Path), help="Alternate output file")
@click.option("-v", "--verbose", is_flag=True, help="Print rendered file names")
@@ -945,8 +945,8 @@ def do_render(src: Path, dst: Path) -> None:
do_render(file, file.parent / file.stem)
-@cli.command()
# fmt: off
+@cli.command()
@click.option("-v", "--verbose", is_flag=True, help="Print timestamp and merkle root")
# fmt: on
def new_definitions(verbose: bool) -> None:
### common/tools/maxfee.py
@@ -60,8 +60,8 @@ def setup_logging(verbose):
root.addHandler(handler)
-@click.command()
# fmt: off
+@click.command()
@click.argument("filename", nargs=-1, type=click.Path(writable=True))
@click.option("-m", "--cost", type=float, default=10.0, show_default=True, help="Maximum transaction fee in USD")
@click.option("-s", "--txsize", type=int, default=250, show_default=True, help="Transaction size in bytes")
### common/tools/support.py
@@ -175,8 +175,8 @@ def fix(dry_run):
write_support_info()
-@cli.command()
# fmt: off
+@cli.command()
@click.option("-m", "--ignore-missing", is_flag=True, help="Do not fail on missing supportinfo")
# fmt: on
def check(ignore_missing):
@@ -218,8 +218,8 @@ def check(ignore_missing):
sys.exit(1)
-@cli.command()
# fmt: off
+@cli.command()
@click.option("-r", '--releases', multiple=True, type=str, help='Key-value pairs of model and version. E.g. "T2B1=2.6.1"')
@click.option("-n", "--dry-run", is_flag=True, help="Do not write changes")
@click.option("-f", "--force", is_flag=True, help="Proceed even with bad version/device info")
@@ -336,8 +336,8 @@ def show(keyword):
print_support(coin)
-@cli.command(name="set")
# fmt: off
+@cli.command(name="set")
@click.argument("key", required=True)
@click.argument("entries", nargs=-1, required=True, metavar="entry=value [entry=value]...")
@click.option("-r", "--reason", help="Reason for not supporting")
### core/src/apps/bitcoin/sign_tx/helpers.py
@@ -264,47 +264,86 @@ def confirm_dialog(self) -> Awaitable[Any]:
return layout.confirm_multiple_accounts()
-def confirm_output(output: TxOutput, coin: CoinInfo, amount_unit: AmountUnit, output_index: int, chunkify: bool, address_n: Bip32Path | None) -> Awaitable[None]: # type: ignore [awaitable-return-type]
+def confirm_output(
+ output: TxOutput,
+ coin: CoinInfo,
+ amount_unit: AmountUnit,
+ output_index: int,
+ chunkify: bool,
+ address_n: Bip32Path | None,
+) -> Awaitable[None]: # type: ignore [awaitable-return-type]
return (
yield UiConfirmOutput( # type: ignore [awaitable-return-type]
output, coin, amount_unit, output_index, chunkify, address_n
)
)
-def confirm_decred_sstx_submission(output: TxOutput, coin: CoinInfo, amount_unit: AmountUnit) -> Awaitable[None]: # type: ignore [awaitable-return-type]
+def confirm_decred_sstx_submission(
+ output: TxOutput, coin: CoinInfo, amount_unit: AmountUnit
+) -> Awaitable[None]: # type: ignore [awaitable-return-type]
return (yield UiConfirmDecredSSTXSubmission(output, coin, amount_unit)) # type: ignore [awaitable-return-type]
-def show_payment_request_details(provider_address: str, payment_req: PaymentRequest, coin: CoinInfo, amount_unit: AmountUnit, address_n: Bip32Path | None) -> Awaitable[bool]: # type: ignore [awaitable-return-type]
- return (yield UiConfirmPaymentRequest(provider_address, payment_req, coin, amount_unit, address_n)) # type: ignore [awaitable-return-type]
+def show_payment_request_details(
+ provider_address: str,
+ payment_req: PaymentRequest,
+ coin: CoinInfo,
+ amount_unit: AmountUnit,
+ address_n: Bip32Path | None,
+) -> Awaitable[bool]: # type: ignore [awaitable-return-type]
+ return (
+ yield UiConfirmPaymentRequest( # type: ignore [awaitable-return-type]
+ provider_address, payment_req, coin, amount_unit, address_n
+ )
+ )
def confirm_replacement(description: str, txid: AnyBytes) -> Awaitable[Any]: # type: ignore [awaitable-return-type]
return (yield UiConfirmReplacement(description, txid)) # type: ignore [awaitable-return-type]
-def confirm_modify_output(txo: TxOutput, orig_txo: TxOutput, coin: CoinInfo, amount_unit: AmountUnit) -> Awaitable[Any]: # type: ignore [awaitable-return-type]
+def confirm_modify_output(
+ txo: TxOutput, orig_txo: TxOutput, coin: CoinInfo, amount_unit: AmountUnit
+) -> Awaitable[Any]: # type: ignore [awaitable-return-type]
return (yield UiConfirmModifyOutput(txo, orig_txo, coin, amount_unit)) # type: ignore [awaitable-return-type]
-def confirm_modify_fee(title: str, user_fee_change: int, total_fee_new: int, fee_rate: float, coin: CoinInfo, amount_unit: AmountUnit) -> Awaitable[Any]: # type: ignore [awaitable-return-type]
+def confirm_modify_fee(
+ title: str,
+ user_fee_change: int,
+ total_fee_new: int,
+ fee_rate: float,
+ coin: CoinInfo,
+ amount_unit: AmountUnit,
+) -> Awaitable[Any]: # type: ignore [awaitable-return-type]
return (
yield UiConfirmModifyFee( # type: ignore [awaitable-return-type]
title, user_fee_change, total_fee_new, fee_rate, coin, amount_unit
)
)
-def confirm_total(spending: int, fee: int, fee_rate: float, coin: CoinInfo, amount_unit: AmountUnit, address_n: Bip32Path | None) -> Awaitable[None]: # type: ignore [awaitable-return-type]
+def confirm_total(
+ spending: int,
+ fee: int,
+ fee_rate: float,
+ coin: CoinInfo,
+ amount_unit: AmountUnit,
+ address_n: Bip32Path | None,
+) -> Awaitable[None]: # type: ignore [awaitable-return-type]
return (yield UiConfirmTotal(spending, fee, fee_rate, coin, amount_unit, address_n)) # type: ignore [awaitable-return-type]
-def confirm_joint_total(spending: int, total: int, coin: CoinInfo, amount_unit: AmountUnit) -> Awaitable[Any]: # type: ignore [awaitable-return-type]
+def confirm_joint_total(
+ spending: int, total: int, coin: CoinInfo, amount_unit: AmountUnit
+) -> Awaitable[Any]: # type: ignore [awaitable-return-type]
return (yield UiConfirmJointTotal(spending, total, coin, amount_unit)) # type: ignore [awaitable-return-type]
-def confirm_feeoverthreshold(fee: int, coin: CoinInfo, amount_unit: AmountUnit) -> Awaitable[Any]: # type: ignore [awaitable-return-type]
+def confirm_feeoverthreshold(
+ fee: int, coin: CoinInfo, amount_unit: AmountUnit
+) -> Awaitable[Any]: # type: ignore [awaitable-return-type]
return (yield UiConfirmFeeOverThreshold(fee, coin, amount_unit)) # type: ignore [awaitable-return-type]
@@ -320,15 +359,19 @@ def confirm_foreign_address(address_n: list) -> Awaitable[Any]: # type: ignore
return (yield UiConfirmForeignAddress(address_n)) # type: ignore [awaitable-return-type]
-def confirm_nondefault_locktime(lock_time: int, lock_time_disabled: bool) -> Awaitable[Any]: # type: ignore [awaitable-return-type]
+def confirm_nondefault_locktime(
+ lock_time: int, lock_time_disabled: bool
+) -> Awaitable[Any]: # type: ignore [awaitable-return-type]
return (yield UiConfirmNonDefaultLocktime(lock_time, lock_time_disabled)) # type: ignore [awaitable-return-type]
def confirm_multiple_accounts() -> Awaitable[Any]: # type: ignore [awaitable-return-type]
return (yield UiConfirmMultipleAccounts()) # type: ignore [awaitable-return-type]
-def request_tx_meta(tx_req: TxRequest, coin: CoinInfo, tx_hash: AnyBytes | None = None) -> Awaitable[PrevTx]: # type: ignore [awaitable-return-type]
+def request_tx_meta(
+ tx_req: TxRequest, coin: CoinInfo, tx_hash: AnyBytes | None = None
+) -> Awaitable[PrevTx]: # type: ignore [awaitable-return-type]
assert tx_req.details is not None
tx_req.request_type = RequestType.TXMETA
tx_req.details.tx_hash = tx_hash
@@ -352,7 +395,9 @@ def request_tx_extra_data(
return ack.tx.extra_data_chunk
-def request_tx_input(tx_req: TxRequest, i: int, coin: CoinInfo, tx_hash: AnyBytes | None = None) -> Awaitable[TxInput]: # type: ignore [awaitable-return-type]
+def request_tx_input(
+ tx_req: TxRequest, i: int, coin: CoinInfo, tx_hash: AnyBytes | None = None
+) -> Awaitable[TxInput]: # type: ignore [awaitable-return-type]
assert tx_req.details is not None
if tx_hash:
tx_req.request_type = RequestType.TXORIGINPUT
@@ -365,7 +410,9 @@ def request_tx_input(tx_req: TxRequest, i: int, coin: CoinInfo, tx_hash: AnyByte
return _sanitize_tx_input(ack.tx.input, coin)
-def request_tx_prev_input(tx_req: TxRequest, i: int, coin: CoinInfo, tx_hash: AnyBytes | None = None) -> Awaitable[PrevInput]: # type: ignore [awaitable-return-type]
+def request_tx_prev_input(
+ tx_req: TxRequest, i: int, coin: CoinInfo, tx_hash: AnyBytes | None = None
+) -> Awaitable[PrevInput]: # type: ignore [awaitable-return-type]
assert tx_req.details is not None
tx_req.request_type = RequestType.TXINPUT
tx_req.details.request_index = i
@@ -375,7 +422,9 @@ def request_tx_prev_input(tx_req: TxRequest, i: int, coin: CoinInfo, tx_hash: An
return _sanitize_tx_prev_input(ack.tx.input, coin)
-def request_tx_output(tx_req: TxRequest, i: int, coin: CoinInfo, tx_hash: AnyBytes | None = None) -> Awaitable[TxOutput]: # type: ignore [awaitable-return-type]
+def request_tx_output(
+ tx_req: TxRequest, i: int, coin: CoinInfo, tx_hash: AnyBytes | None = None
+) -> Awaitable[TxOutput]: # type: ignore [awaitable-return-type]
assert tx_req.details is not None
if tx_hash:
tx_req.request_type = RequestType.TXORIGOUTPUT
@@ -388,7 +437,9 @@ def request_tx_output(tx_req: TxRequest, i: int, coin: CoinInfo, tx_hash: AnyByt
return _sanitize_tx_output(ack.tx.output, coin)
-def request_tx_prev_output(tx_req: TxRequest, i: int, coin: CoinInfo, tx_hash: AnyBytes | None = None) -> Awaitable[PrevOutput]: # type: ignore [awaitable-return-type]
+def request_tx_prev_output(
+ tx_req: TxRequest, i: int, coin: CoinInfo, tx_hash: AnyBytes | None = None
+) -> Awaitable[PrevOutput]: # type: ignore [awaitable-return-type]
assert tx_req.details is not None
tx_req.request_type = RequestType.TXOUTPUT
tx_req.details.request_index = i
### core/src/apps/cardano/seed.py
@@ -23,9 +23,8 @@
from trezor.enums import CardanoDerivationType
from trezor.wire.protocol_common import Context
- from apps.common.keychain import Handler
+ from apps.common.keychain import Handler, MsgOut
from apps.common.keychain import Keychain as Slip21Keychain
- from apps.common.keychain import MsgOut
from apps.common.paths import Bip32Path
CardanoMessages = (
### core/src/apps/common/seed.py
@@ -121,7 +121,6 @@ async def derive_and_store_roots(
derive_and_store_secrets(ctx, passphrase)
else: # v1 protocol
-
if utils.BITCOIN_ONLY:
# === Bitcoin-only variant ===
# We use the simple version of `get_seed` that never needs to derive anything else.
### core/src/apps/debug/__init__.py
@@ -62,7 +62,9 @@ def layout_is_ready() -> bool:
layout = ui.CURRENT_LAYOUT
return isinstance(layout, ui.Layout) and layout.is_layout_attached()
- def wait_until_layout_is_running(timeout: int | None = _DEADLOCK_SLEEP_MS) -> Awaitable[None]: # type: ignore [awaitable-return-type]
+ def wait_until_layout_is_running(
+ timeout: int | None = _DEADLOCK_SLEEP_MS,
+ ) -> Awaitable[None]: # type: ignore [awaitable-return-type]
start = utime.ticks_ms()
layout_change_box.clear()
while not layout_is_ready():
### core/src/apps/debug/n1w1_mock.py
@@ -74,7 +74,6 @@ async def confirm_connect(
self_ctx: N1W1Context = self
class _Connect(Layout):
-
def create_tasks(self) -> Iterator[loop.Task[None]]:
from trezor.ui import Shutdown
from trezorui_api import CONFIRMED
### core/src/apps/ethereum/yielding_vaults.py
@@ -2,6 +2,7 @@
if TYPE_CHECKING:
from buffer_types import AnyBytes
+
from trezor.messages import EthereumNetworkInfo
from .keychain import MsgInSignTx
### core/src/apps/homescreen/device_menu.py
@@ -78,7 +78,6 @@ async def handle_device_menu() -> None:
# Remain in the device loop until the menu is explicitly closed
while True:
-
is_initialized = storage_device.is_initialized()
led_configurable = is_initialized and utils.USE_RGB_LED
haptic_configurable = is_initialized and utils.USE_HAPTIC
### core/src/apps/management/authenticate_device.py
@@ -127,7 +127,6 @@ def _sig_size(signature: AnyBytes | None) -> int | None:
}
while req.proof_type is not None:
-
if req.index is None:
blob = all_signatures[req.proof_type]
if blob is None:
### core/src/apps/management/recovery_device/layout.py
@@ -294,7 +294,6 @@ async def choose_handler(method: BackupMethod | None) -> type[RecoveryHandler]:
return _DisplayHandler
else:
-
if TYPE_CHECKING:
from .recover import Slip39State
### core/src/apps/management/reset_device/layout.py
@@ -167,7 +167,6 @@ async def slip39_advanced_show_and_confirm_shares(
class _DisplayBackup:
-
async def intro(self, num_of_words: int | None = None) -> None:
from trezor.ui.layouts.reset import show_intro_backup
@@ -223,7 +222,6 @@ async def choose_backup_handler(method: BackupMethod | None) -> BackupHandler:
if utils.USE_N1W1:
-
from trezor import TR
if TYPE_CHECKING:
@@ -236,7 +234,6 @@ def __init__(self, msg: str) -> None:
self.msg = msg
class _N1W1Backup:
-
async def intro(self, num_of_words: int | None = None) -> None:
# TODO(N1W1): design/copy
pass
### core/src/apps/monero/signing/state.py
@@ -11,7 +11,6 @@
class State:
-
STEP_INIT = 0
STEP_INP = 100
STEP_VINI = 300
### core/src/apps/nem/layout.py
@@ -8,7 +8,6 @@
from .helpers import NEM_MAX_DIVISIBILITY
if TYPE_CHECKING:
-
from trezor.ui.layouts import PropertyType
### core/src/apps/solana/predefined_transaction.py
@@ -16,7 +16,6 @@
from .types import is_address_reference
if TYPE_CHECKING:
-
from trezor.messages import PaymentRequest
from .transaction import Fee
### core/src/apps/solana/transaction/instructions.py
@@ -19,7 +19,12 @@
)
from ..types import PropertyTemplate, UIProperty
from .instruction import Instruction
-from .parse import parse_byte, parse_memo, parse_pubkey, parse_string
+from .parse import (
+ parse_byte,
+ parse_memo,
+ parse_pubkey,
+ parse_string,
+)
if TYPE_CHECKING:
from typing import Any, TypeGuard
@@ -368,7 +373,6 @@ class SystemProgramCreateAccountWithSeedInstruction(Instruction):
base_account: Account | None
class SystemProgramAdvanceNonceAccountInstruction(Instruction):
-
nonce_account: Account
recent_blockhashes_sysvar: Account
nonce_authority: Account
@@ -427,7 +431,6 @@ class SystemProgramTransferWithSeedInstruction(Instruction):
recipient_account: Account
class SystemProgramUpgradeNonceAccountInstruction(Instruction):
-
nonce_account: Account
class StakeProgramInitializeInstruction(Instruction):
@@ -450,7 +453,6 @@ class StakeProgramAuthorizeInstruction(Instruction):
lockup_authority: Account | None
class StakeProgramDelegateStakeInstruction(Instruction):
-
initialized_stake_account: Account
vote_account: Account
clock_sysvar: Account
@@ -476,7 +478,6 @@ class StakeProgramWithdrawInstruction(Instruction):
lockup_authority: Account | None
class StakeProgramDeactivateInstruction(Instruction):
-
delegated_stake_account: Account
clock_sysvar: Account
stake_authority: Account
@@ -490,7 +491,6 @@ class StakeProgramSetLockupInstruction(Instruction):
lockup_or_withdraw_authority: Account
class StakeProgramMergeInstruction(Instruction):
-
destination_stake_account: Account
source_stake_account: Account
clock_sysvar: Account
@@ -509,7 +509,6 @@ class StakeProgramAuthorizeWithSeedInstruction(Instruction):
lockup_authority: Account | None
class StakeProgramInitializeCheckedInstruction(Instruction):
-
uninitialized_stake_account: Account
rent_sysvar: Account
stake_authority: Account
@@ -555,7 +554,6 @@ class ComputeBudgetProgramSetComputeUnitPriceInstruction(Instruction):
lamports: int
class TokenProgramInitializeAccountInstruction(Instruction):
-
account_to_initialize: Account
mint_account: Account
owner: Account
@@ -583,7 +581,6 @@ class TokenProgramApproveInstruction(Instruction):
owner: Account
class TokenProgramRevokeInstruction(Instruction):
-
source_account: Account
owner: Account
@@ -609,19 +606,16 @@ class TokenProgramBurnInstruction(Instruction):
owner: Account
class TokenProgramCloseAccountInstruction(Instruction):
-
account_to_close: Account
destination_account: Account
owner: Account
class TokenProgramFreezeAccountInstruction(Instruction):
-
account_to_freeze: Account
token_mint: Account
freeze_authority: Account
class TokenProgramThawAccountInstruction(Instruction):
-
account_to_freeze: Account
token_mint: Account
freeze_authority: Account
@@ -668,7 +662,6 @@ class TokenProgramInitializeAccount2Instruction(Instruction):
rent_sysvar: Account
class TokenProgramSyncNativeInstruction(Instruction):
-
token_account: Account
class TokenProgramInitializeAccount3Instruction(Instruction):
@@ -678,11 +671,9 @@ class TokenProgramInitializeAccount3Instruction(Instruction):
mint_account: Account
class TokenProgramInitializeImmutableOwnerInstruction(Instruction):
-
account_to_initialize: Account
class Token2022ProgramInitializeAccountInstruction(Instruction):
-
account_to_initialize: Account
mint_account: Account
owner: Account
@@ -710,7 +701,6 @@ class Token2022ProgramApproveInstruction(Instruction):
owner: Account
class Token2022ProgramRevokeInstruction(Instruction):
-
source_account: Account
owner: Account
@@ -736,19 +726,16 @@ class Token2022ProgramBurnInstruction(Instruction):
owner: Account
class Token2022ProgramCloseAccountInstruction(Instruction):
-
account_to_close: Account
destination_account: Account
owner: Account
class Token2022ProgramFreezeAccountInstruction(Instruction):
-
account_to_freeze: Account
token_mint: Account
freeze_authority: Account
class Token2022ProgramThawAccountInstruction(Instruction):
-
account_to_freeze: Account
token_mint: Account
freeze_authority: Account
@@ -795,7 +782,6 @@ class Token2022ProgramInitializeAccount2Instruction(Instruction):
rent_sysvar: Account
class Token2022ProgramSyncNativeInstruction(Instruction):
-
token_account: Account
class Token2022ProgramInitializeAccount3Instruction(Instruction):
@@ -805,11 +791,9 @@ class Token2022ProgramInitializeAccount3Instruction(Instruction):
mint_account: Account
class Token2022ProgramInitializeImmutableOwnerInstruction(Instruction):
-
account_to_initialize: Account
class AssociatedTokenAccountProgramCreateInstruction(Instruction):
-
funding_account: Account
associated_token_account: Account
wallet_address: Account
@@ -819,7 +803,6 @@ class AssociatedTokenAccountProgramCreateInstruction(Instruction):
rent_sysvar: Account | None
class AssociatedTokenAccountProgramCreateIdempotentInstruction(Instruction):
-
funding_account: Account
associated_token_account: Account
wallet_addr: Account
@@ -828,7 +811,6 @@ class AssociatedTokenAccountProgramCreateIdempotentInstruction(Instruction):
spl_token: Account
class AssociatedTokenAccountProgramRecoverNestedInstruction(Instruction):
-
nested_account: Account
token_mint_nested: Account
associated_token_account: Account
### core/src/apps/tron/helpers.py
@@ -3,7 +3,6 @@
from trezor.crypto import base58
if TYPE_CHECKING:
-
from buffer_types import AnyBytes
### core/src/apps/tron/sign_tx.py
@@ -115,7 +115,6 @@ async def process_contract(
is_different_owner = owner_address is not None and owner_address != signer_address
if messages.TronTransferContract.is_type_of(contract):
-
# Contract specific validation
if contract.amount > _INT64_MAX:
raise DataError("Tron: invalid transfer amount")
@@ -190,7 +189,6 @@ async def process_contract(
)
elif messages.TronVoteWitnessContract.is_type_of(contract):
-
# Contract specific validation
if len(contract.votes) > 9:
raise DataError("Tron: too many votes")
@@ -199,7 +197,6 @@ async def process_contract(
await layout.confirm_votes(contract)
elif messages.TronDelegateResourceContract.is_type_of(contract):
-
raw_lock_period = contract.lock_period # local_cache_attribute
lock = contract.lock # local_cache_attribute
### core/src/ble.py
@@ -12,7 +12,6 @@
ble.set_enabled(enable)
ble.start_comm()
if enable:
-
start_ms = utime.ticks_ms()
while utime.ticks_diff(utime.ticks_ms(), start_ms) < 5000:
### core/src/boot.py
@@ -92,7 +92,6 @@ async def bootscreen() -> None:
while True:
try:
-
if lock_manager.can_lock_device():
enforce_welcome_screen_duration()
if utils.INTERNAL_MODEL == "T2T1":
### core/src/prof/__main__.py
@@ -94,7 +94,7 @@ def dump_data(self, filename: str) -> None:
self.count_last_line(allocs_per_last_line)
with open(filename, "w") as f:
for key, val in self.data.items():
- f.write(f'{key} {val["total_allocs"]} {val["calls"]}\n')
+ f.write(f"{key} {val['total_allocs']} {val['calls']}\n")
def write_data(self) -> None:
self.dump_data("alloc_data.txt")
### core/src/storage/cache_common.py
@@ -65,9 +65,7 @@ def get(self, key: int, default: T | None = None) -> bytes | T | None: # noqa:
def get_bool(self, key: int) -> bool: # noqa: F811
return self.get(key) is not None
- def get_int(
- self, key: int, default: T | None = None
- ) -> int | T | None: # noqa: F811
+ def get_int(self, key: int, default: T | None = None) -> int | T | None: # noqa: F811
encoded = self.get(key)
if encoded is None:
return default
@@ -136,9 +134,7 @@ def get(self, key: int, default: T | None = None) -> bytes | T | None: # noqa:
def get_bool(self, key: int) -> bool: # noqa: F811
return super().get_bool(key & ~SESSIONLESS_FLAG)
- def get_int(
- self, key: int, default: T | None = None
- ) -> int | T | None: # noqa: F811
+ def get_int(self, key: int, default: T | None = None) -> int | T | None: # noqa: F811
return super().get_int(key & ~SESSIONLESS_FLAG, default)
def is_set(self, key: int) -> bool:
### core/src/trezor/ui/layouts/bolt/__init__.py
@@ -766,7 +766,6 @@ async def confirm_blob(
verb_cancel=None,
chunkify=chunkify,
) as layout:
-
if ask_pagination and layout.page_count() > 1:
return await _confirm_ask_pagination(
br_name,
@@ -1028,7 +1027,6 @@ async def confirm_trade(
if not utils.BITCOIN_ONLY:
-
_INFO_DATA_ROWS = const(3)
_INFO_DATA_WIDTH_BYTES = const(9)
@@ -2258,7 +2256,6 @@ async def confirm_signverify(
hold=not verify,
verb=TR.buttons__confirm,
) as message_layout:
-
while True:
if message_layout.page_count() <= LONG_MSG_PAGE_THRESHOLD:
result = await interact(message_layout, br_name, BR_CODE_OTHER)
### core/src/trezor/ui/layouts/caesar/__init__.py
@@ -789,7 +789,6 @@ async def confirm_blob(
hold=hold,
chunkify=chunkify,
) as layout:
-
if ask_pagination and layout.page_count() > 1:
assert not hold
return await _confirm_ask_pagination(
@@ -819,7 +818,6 @@ async def _confirm_ask_pagination(
button=TR.buttons__confirm,
items=[(description, False), (data, True)],
) as confirm_more_layout:
-
while True:
if not await should_show_more(
title,
@@ -1763,7 +1761,6 @@ async def confirm_ethereum_tx(
extra_title=TR.confirm_total__title_fee,
verb_cancel="^",
) as summary_layout:
-
if is_send:
title = TR.words__recipient
else:
@@ -1965,11 +1962,13 @@ async def confirm_tron_summary(
display_amount, display_amount_label = None, None
display_fee, display_fee_label = fee, TR.words__fee_limit
else:
- display_amount, display_amount_label = amount or "", (
- TR.words__amount if amount else ""
+ display_amount, display_amount_label = (
+ amount or "",
+ (TR.words__amount if amount else ""),
)
- display_fee, display_fee_label = fee or "", (
- TR.words__fee_limit if fee else ""
+ display_fee, display_fee_label = (
+ fee or "",
+ (TR.words__fee_limit if fee else ""),
)
with trezorui_api.confirm_summary(
title=title or TR.words__title_summary,
@@ -2215,7 +2214,6 @@ async def confirm_modify_output(
)
with address_ctx as address_layout, modify_ctx as modify_layout:
-
send_button_request = True
while True:
await raise_if_not_confirmed(
@@ -2305,7 +2303,6 @@ async def confirm_signverify(
hold=not verify,
chunkify=chunkify,
) as message_layout:
-
# Allowing to go back from the second screen
while True:
await confirm_blob(
### core/src/trezor/ui/layouts/caesar/reset.py
@@ -143,7 +143,6 @@ async def _prompt_number(
min_count=min_count,
max_count=max_count,
) as num_input:
-
result = await interact(
num_input,
br_name,
### core/src/trezor/ui/layouts/delizia/__init__.py
@@ -72,7 +72,6 @@ async def confirm_action(
prompt_title=prompt_title or title,
external_menu=not (prompt_screen or hold),
) as flow:
-
if prompt_screen or hold:
# Note: multi-step confirm (prompt_screen/hold)
# can't work with external menus yet
@@ -2269,7 +2268,6 @@ async def confirm_signverify(
info=False,
verb=TR.buttons__confirm,
) as message_layout:
-
if message_layout.page_count() <= LONG_MSG_PAGE_THRESHOLD:
await interact(message_layout, br_name, BR_CODE_OTHER)
else:
### core/src/trezor/ui/layouts/eckhart/__init__.py
@@ -2395,7 +2395,6 @@ async def confirm_signverify(
info=False,
cancel=True,
) as message_layout:
-
if message_layout.page_count() <= LONG_MSG_PAGE_THRESHOLD:
await interact(message_layout, br_name, BR_CODE_OTHER)
else:
### core/src/trezor/ui/layouts/homescreen.py
@@ -76,7 +76,6 @@ def _first_paint(self) -> None:
class HomescreenBase:
-
RENDER_INDICATOR: object | None = None
def __init__(self, ctx: trezorui_api.LayoutContext[trezorui_api.UiResult]) -> None:
### core/src/trezor/utils.py
@@ -77,11 +77,11 @@
from typing import TYPE_CHECKING
if __debug__:
- from trezorutils import get_gc_info # noqa: F401
- from trezorutils import (
+ from trezorutils import ( # noqa: F401
LOG_STACK_USAGE,
check_heap_fragmentation,
clear_gc_info,
+ get_gc_info,
update_gc_info,
)
### core/src/trezor/wire/__init__.py
@@ -162,7 +162,6 @@ async def handle_session_thp(*ifaces: WireInterface) -> None:
loop.clear()
else:
-
# Reallocated once per session and shared between all wire interfaces.
# Acquired by the first call to `CodecContext.read_from_wire()`.
WIRE_BUFFER_PROVIDER = Provider(bytearray(8192))
### core/src/trezor/wire/protocol_common.py
@@ -60,7 +60,6 @@ def __init__(
self.button_request_handler = ButtonRequestHandler(self)
if TYPE_CHECKING:
-
# When `expected_types` is None, any received message is treated as unexpected
# and an exception is raised after the message is received.
@overload
### core/src/trezor/wire/thp/__init__.py
@@ -17,7 +17,6 @@
class ThpUnallocatedSessionError(WireError):
-
def __init__(self, session_id: int) -> None:
self.session_id = session_id
### core/src/trezor/wire/thp/pairing_context.py
@@ -29,7 +29,6 @@
class PairingContext(Context):
-
def __init__(self, channel_ctx: Channel) -> None:
super().__init__(channel_ctx.iface, channel_ctx.channel_id, "ThpMessageType")
self.channel_ctx: Channel = channel_ctx
@@ -78,7 +77,6 @@ async def handle(self, next_message: Message | None = None) -> None:
log.exception(__name__, exc, iface=self.iface)
finally:
if next_message is None:
-
# Shut down the loop if there is no next message waiting.
return # pylint: disable=lost-exception
### core/src/trezor/wire/thp/session_context.py
@@ -28,7 +28,6 @@
class GenericSessionContext(Context):
-
def __init__(self, channel: Channel, session_id: int) -> None:
super().__init__(channel.iface, channel.channel_id)
self.channel: Channel = channel
@@ -115,7 +114,6 @@ def get_session_state(self) -> SessionState: ...
class SeedlessSessionContext(GenericSessionContext):
-
def __init__(self, channel_ctx: Channel, session_id: int) -> None:
super().__init__(channel_ctx, session_id)
@@ -128,7 +126,6 @@ def cache(self) -> DataCache:
class SessionContext(GenericSessionContext):
-
def __init__(self, channel_ctx: Channel, session_cache: SessionThpCache) -> None:
if channel_ctx.channel_id_bytes() != session_cache.channel_id:
raise Exception(
### core/tests/fixtures.py
@@ -1,3 +1 @@
-LONG_STRING_50000: str = (
- 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc convallis aliquet egestas. Nam sed interdum neque. Donec semper, risus in pretium venenatis, sapien dolor lobortis quam, vitae viverra justo quam ullamcorper turpis. Phasellus vel dignissim lorem, non tempus lorem. Quisque dictum suscipit sagittis. Cras vel orci eget velit pellentesque bibendum blandit pretium augue. Donec eget leo fringilla turpis tempor venenatis eget et odio. Sed lacinia mauris vel fringilla gravida. Pellentesque commodo consequat dui ut tempus. Morbi vulputate nulla sed dui cursus tempor. Sed dui nisl, pellentesque sit amet risus rhoncus, venenatis tempus ligula. Nulla commodo pretium diam, laoreet porta eros suscipit non. Aliquam congue est scelerisque rhoncus tincidunt. Mauris id risus a felis faucibus congue. Nunc tempor tincidunt dapibus. Praesent accumsan facilisis ultricies. Praesent lectus odio, accumsan sed lacinia vel, dignissim nec nisl. Pellentesque laoreet ornare velit, in mattis massa tempor et. Curabitur tincidunt pharetra faucibus. Duis iaculis quam sed risus viverra tincidunt. Aenean dignissim rhoncus nisl. Donec a sapien erat. Integer porta massa non imperdiet fermentum. Curabitur ultrices dolor non quam commodo varius. Integer fringilla ac nisl gravida gravida. Nulla mollis tortor neque, id hendrerit leo ornare eu. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas lobortis felis quis turpis porta scelerisque. Ut sapien justo, lobortis ut suscipit nec, viverra eu ligula. Sed ornare sapien non augue tempor euismod. Sed convallis nisl quis velit luctus, nec molestie magna tincidunt. Vivamus gravida augue et diam sodales, sed iaculis ante molestie. Suspendisse id velit sed mauris venenatis pharetra accumsan vel augue. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin suscipit auctor lorem nec mollis. Nulla massa nunc, finibus vel tellus sit amet, varius aliquam elit. Suspendisse finibus urna at nibh rutrum dapibus. Maecenas ut eros a nulla eleifend viverra dignissim id purus. Quisque gravida elit at tellus tincidunt iaculis. Donec ac nunc lorem. Vivamus velit quam, gravida in orci sit amet, sodales varius arcu. Etiam egestas consequat pharetra. Morbi vitae tellus vel tellus gravida tincidunt id quis sem. Fusce sed ipsum convallis, aliquam leo ac, volutpat lacus. Morbi in mauris ornare, suscipit felis quis, sodales eros. Morbi porttitor tortor mi, vel bibendum justo hendrerit sed. Donec ut mi interdum, rhoncus dui vel, elementum eros. Morbi eget fringilla arcu. Fusce mattis turpis ac lacus posuere mollis. Nullam nisi leo, semper id elit et, condimentum vehicula diam. Nunc dapibus condimentum massa mollis vehicula. Aenean eleifend eget sapien pulvinar blandit. Morbi tempor lectus odio, nec congue dui egestas ut. Aliquam erat volutpat. Donec a ipsum ipsum. Sed magna massa, convallis id est non, venenatis tincidunt nibh. Aenean ex tellus, finibus quis tortor quis, semper eleifend mi. Fusce ultrices blandit lobortis. Praesent non tincidunt magna. Suspendisse vel turpis vestibulum, placerat dolor et, egestas ex. Maecenas quis accumsan nulla, at rutrum eros. Duis at congue tellus, et dignissim tellus. In sit amet nisi in lorem consectetur vestibulum eget ac metus. Praesent lacinia dolor et dolor vehicula blandit. Aenean placerat nunc in risus auctor, ac consectetur elit blandit. Donec vestibulum molestie dictum. Donec a consequat turpis, et fringilla risus. Morbi congue velit non nisl volutpat malesuada. Etiam ut eros nec risus molestie dignissim non et sapien. Proin vulputate tempus accumsan. Nulla nibh diam, elementum eget mauris sed, rhoncus vestibulum enim. Nam cursus erat sit amet ex porta luctus. Fusce mollis facilisis arcu sed sodales. Quisque quis risus vehicula, interdum arcu in, sagittis mauris. Donec suscipit tempor gravida. Donec pharetra erat ante, non vehicula neque varius eget. Proin eu aliquet lacus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam consequat, nisl eget venenatis euismod, justo felis aliquet nisi, sit amet ornare nibh purus in metus. Fusce quis justo magna. Quisque faucibus enim sit amet elit fringilla, eu pharetra magna pretium. Praesent nibh erat, rhoncus at feugiat vitae, mattis et enim. Aliquam eget dolor leo. Integer vestibulum purus id arcu aliquet, at semper nulla pretium. In ut dui arcu. Nunc vel congue massa. Donec enim est, scelerisque nec pretium rutrum, semper nec sem. Aliquam consectetur ex quis risus venenatis, porta pharetra felis fermentum. Cras turpis ante, molestie eget justo vel, porttitor cursus arcu. Fusce et enim et nisi sagittis tristique quis at nulla. Duis efficitur quis nunc at dignissim. Vestibulum erat neque, finibus a hendrerit eu, vehicula aliquam lacus. Vivamus consectetur ex auctor sapien finibus, ut egestas nisl mattis. Nulla eget dignissim sapien. In odio justo, condimentum rhoncus felis vel, tincidunt commodo nibh. Praesent accumsan libero sed fermentum mollis. Curabitur eget porta velit, ut mollis lorem. Nulla semper mollis fringilla. Aliquam condimentum feugiat quam, at vestibulum tortor vulputate et. Ut congue eu lacus venenatis porttitor. Mauris ultricies porta orci, quis mollis dui egestas ut. Nulla quis volutpat ipsum. Donec quis massa velit. Nulla facilisi. Phasellus vestibulum nunc ante, a finibus nulla vehicula non. Quisque volutpat orci at leo hendrerit, gravida iaculis massa vulputate. Sed at magna nibh. Maecenas sed tempor justo. Cras quis libero non sem viverra placerat. Proin nulla nunc, ullamcorper in congue eu, rhoncus sed mi. Aenean pellentesque nibh id elit auctor, sit amet bibendum erat mattis. In hac habitasse platea dictumst. Integer eu maximus ipsum. Mauris hendrerit lectus purus, nec scelerisque mi iaculis quis. Proin orci risus, feugiat id placerat nec, faucibus eu arcu. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nullam porttitor, quam a scelerisque pellentesque, tellus felis facilisis sem, blandit vehicula sapien quam at purus. Pellentesque lectus ex, iaculis non semper eget, facilisis non risus. Curabitur mattis tortor id metus scelerisque, in congue dolor bibendum. Morbi at blandit felis. Vivamus hendrerit dui nibh, et finibus mi sollicitudin cursus. Sed tempus risus nisi, id aliquam eros scelerisque sed. Quisque eu lacus et urna tristique blandit vitae eleifend arcu. Nunc malesuada in lectus nec aliquet. Vivamus laoreet pretium quam, eu dapibus felis tristique aliquet. Ut malesuada volutpat nisi, non facilisis augue blandit sit amet. Vivamus faucibus nunc eget fermentum semper. Duis commodo vel odio eu tincidunt. Vestibulum hendrerit tempus viverra. Proin pharetra, diam ac commodo fermentum, nibh lacus scelerisque dolor, at euismod lorem ipsum ut augue. Cras id viverra elit. Vivamus mollis nulla quis tellus lacinia tempus. Nulla odio ex, mattis in mollis ac, viverra ac lacus. Donec quis ipsum nisi. Aliquam at tellus nec sem pellentesque accumsan. Fusce accumsan nisi id faucibus varius. Aliquam consectetur consequat metus, eu varius diam sollicitudin ac. Sed tristique placerat ipsum, sed luctus risus semper sed. Vestibulum pulvinar eros in tortor viverra sollicitudin. Duis eu hendrerit magna. Aliquam tristique lorem tortor, in scelerisque nulla fermentum vel. Phasellus ut molestie justo. Integer at felis quis massa hendrerit ullamcorper. Cras ut vestibulum est, eget interdum elit. Morbi iaculis mattis scelerisque. Vivamus tincidunt sed mi eget ultricies. Donec aliquet lacus et mi fringilla malesuada. Nullam sed mauris mauris. Nulla vitae nulla viverra, accumsan dui vitae, vehicula magna. Donec elementum, lacus vitae blandit finibus, est arcu aliquam sapien, nec finibus velit diam et ligula. Duis id leo sit amet quam tincidunt facilisis. Duis mauris ipsum, mattis ut massa sodales, pharetra rhoncus orci. Sed sagittis sodales ex nec dignissim. In venenatis semper tortor sed vestibulum. Vestibulum cursus lacus ut suscipit mattis. Curabitur vitae mi sapien. Mauris lobortis gravida lectus, vel tempor nisi imperdiet nec. Aliquam rhoncus, sapien nec pulvinar molestie, diam ipsum consectetur sem, eu molestie risus tortor id erat. Ut vel laoreet nunc. Donec vel placerat leo, sit amet lacinia leo. Ut aliquet libero arcu, non elementum mauris fringilla ac. Aliquam erat volutpat. Aliquam vestibulum orci felis, a eleifend lectus dignissim quis. Nulla eleifend ipsum magna, nec volutpat mauris egestas non. Ut vestibulum semper cursus. Donec elementum ipsum enim, in eleifend massa dapibus ac. Fusce ac purus nisl. Etiam tempor, lorem malesuada commodo fermentum, orci felis blandit arcu, eget venenatis massa risus eu lectus. Sed quis est ultrices purus lobortis gravida a aliquet velit. Nam ut semper nisi. Curabitur non placerat magna, non volutpat enim. Pellentesque libero nunc, placerat porttitor euismod quis, dictum ac neque. Pellentesque nisl orci, aliquam in tristique sed, rhoncus ultricies leo. Phasellus ultricies, nunc quis facilisis ullamcorper, felis orci rutrum est, sed imperdiet sem tortor iaculis tortor. Nam facilisis mollis semper. Vestibulum mattis semper condimentum. Aenean et varius augue, eget dapibus urna. Phasellus vehicula, justo ac tempor fringilla, lorem libero ornare dolor, quis interdum felis magna pharetra elit. Nam turpis eros, faucibus eu mattis ac, rhoncus quis dolor. Praesent iaculis lectus a nibh tempus volutpat. Fusce imperdiet efficitur ante, eu lobortis enim pellentesque nec. Quisque blandit pulvinar libero, id porttitor tortor ullamcorper eu. Donec pharetra laoreet ultrices. Proin ultrices, nisi ac luctus aliquam, magna enim sagittis ex, non mattis sem risus sit amet massa. Aliquam erat volutpat. Sed tempus metus quis augue egestas pharetra. Nulla eleifend mauris eu mollis pharetra. Pellentesque cursus ac massa quis euismod. Proin mattis nunc ac pharetra molestie. Praesent interdum bibendum leo, sit amet faucibus nibh scelerisque non. Nullam felis odio, finibus nec iaculis ut, tempor at dolor. Donec ultrices dolor quis nunc varius, at pharetra sapien pulvinar. Phasellus eget vulputate urna, sit amet porta est. Curabitur posuere est id orci tincidunt facilisis. Quisque accumsan viverra libero, id interdum libero viverra at. Nullam lectus justo, efficitur non aliquet at, accumsan sit amet lorem. Phasellus mattis consectetur posuere. Integer eleifend felis sed nisl posuere pretium. Nulla libero tellus, semper vel pretium nec, scelerisque ac lacus. Nam tempor cursus orci a eleifend. Aenean posuere commodo finibus. Nulla sagittis molestie ipsum, eget egestas felis interdum a. Ut nunc ex, porta ac commodo vitae, dictum vel velit. Vivamus mauris dui, sollicitudin sed enim vel, volutpat varius felis. Maecenas elementum dictum justo ac accumsan. Fusce vitae suscipit nisl. Donec arcu risus, varius a quam vitae, rutrum auctor erat. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean odio eros, fringilla eget cursus vel, tristique sit amet quam. Mauris vehicula, nulla nec placerat tincidunt, massa quam porta eros, et mollis velit nisl nec lectus. In congue accumsan libero, egestas imperdiet lectus egestas quis. Sed nec massa sit amet lectus elementum congue. Quisque consectetur, sapien vitae rhoncus molestie, dolor sem venenatis erat, posuere accumsan dolor elit tempus ante. In imperdiet, tortor in condimentum tempor, quam mauris condimentum dolor, eget accumsan leo risus vitae erat. Cras lorem tellus, dapibus sed viverra id, aliquam interdum nunc. Sed luctus dictum libero, sit amet aliquet erat accumsan vitae. Nulla dignissim sodales tellus nec sodales. Maecenas iaculis a leo posuere congue. Fusce sed ligula erat. Vivamus vel placerat leo, ac venenatis nisi. Nam quis volutpat metus, laoreet laoreet erat. Vivamus eu est elementum, sodales odio nec, venenatis sem. Morbi non quam nec leo imperdiet egestas vitae ut diam. Aenean efficitur libero et lacus imperdiet, id aliquam ex bibendum. Donec rhoncus, mi vitae convallis tristique, eros risus condimentum justo, id lobortis felis metus in nibh. Donec vestibulum laoreet fringilla. Quisque venenatis tincidunt egestas. Curabitur pulvinar odio ut mauris pellentesque dictum. Fusce suscipit, eros id hendrerit vestibulum, nibh lorem sodales lectus, at suscipit erat tortor non justo. Cras lacinia feugiat elementum. Donec eu convallis leo. Donec ac lectus odio. Nunc semper eget erat commodo accumsan. Fusce feugiat dolor in molestie maximus. Donec efficitur faucibus dolor sit amet vulputate. Suspendisse et aliquet risus, quis commodo dolor. Curabitur pulvinar iaculis ligula, quis lacinia tellus posuere nec. Pellentesque bibendum consectetur sapien mattis dictum. Aliquam rhoncus maximus fringilla. Sed efficitur lobortis molestie. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas ac justo odio. Duis lacinia lacus eget eros efficitur, eget auctor ante mollis. Fusce sodales tellus velit, et tempus lectus mollis at. Praesent sed accumsan ligula. In feugiat nunc vel ultricies egestas. Suspendisse potenti. Integer lorem ante, gravida sed blandit a, sollicitudin eu nibh. Nam hendrerit maximus purus eu fermentum. Sed metus lacus, fermentum et lorem vestibulum, posuere rutrum sapien. Pellentesque non velit nec nunc vestibulum dictum at nec metus. Suspendisse et tristique justo. Aenean laoreet ligula augue, volutpat tincidunt urna faucibus facilisis. Nunc consectetur dolor vitae euismod tincidunt. Quisque interdum dignissim pellentesque. Phasellus sem augue, consequat vitae finibus sed, accumsan ut felis. Mauris accumsan pharetra tortor non ultrices. Integer laoreet enim dui, in viverra nisi lacinia eu. Mauris rhoncus vel leo aliquet blandit. Nullam molestie aliquet pharetra. Etiam tempus nunc vel justo ultrices, a varius lorem mattis. Nunc sagittis ligula volutpat, aliquet ex vestibulum, dapibus eros. Donec dolor metus, iaculis et facilisis quis, blandit pulvinar massa. Nullam mi dolor, placerat eu ultricies eget, suscipit sit amet erat. Sed sodales imperdiet lorem sed aliquet. Donec et nulla orci. Duis maximus blandit odio vel aliquet. Sed mollis blandit dapibus. Fusce vestibulum orci in ante facilisis tempor. Proin quis felis nec quam gravida facilisis. In feugiat ligula ut odio sodales, non rutrum magna dapibus. Suspendisse massa turpis, varius id imperdiet et, lacinia vel nunc. Morbi vestibulum mi sed sapien suscipit mollis. Cras a auctor enim, a elementum tortor. Curabitur quis sapien eget tortor placerat lacinia ut at eros. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam malesuada sapien neque, non bibendum libero ornare vel. Nullam ullamcorper diam nec risus ullamcorper, quis condimentum ipsum maximus. Vivamus faucibus in massa et imperdiet. Phasellus luctus metus eu feugiat hendrerit. Proin nec blandit diam. Maecenas id placerat dolor, vitae gravida nulla. Ut scelerisque venenatis lacus, id consequat mauris gravida nec. Etiam vel lorem lobortis, lobortis enim et, sollicitudin tortor. Sed volutpat purus vitae orci elementum vehicula semper nec urna. Nullam sit amet fermentum elit. Nam eros dolor, aliquet quis sollicitudin sed, pulvinar sit amet justo. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris eget felis varius, porta ligula quis, facilisis diam. In blandit interdum libero ut luctus. Nulla facilisi. Morbi arcu augue, suscipit non gravida ac, fringilla id metus. Nullam mollis turpis ac orci tempus ultricies. Vestibulum sit amet massa quis sem lacinia dapibus a et tortor. Vestibulum lacus ligula, tempus sed semper in, viverra sed arcu. Ut semper condimentum diam. Vestibulum mollis sagittis purus, ac fringilla metus imperdiet a. Etiam vel consequat justo, a bibendum nisi. Cras eu lorem vitae velit lobortis fermentum pulvinar non lacus. Maecenas consectetur eget ligula et laoreet. Cras enim leo, fringilla eget posuere vel, vestibulum eu arcu. Phasellus commodo velit dictum mauris ultrices, eu dignissim libero feugiat. Integer vulputate est in nisi tincidunt, non ultrices elit lobortis. Nunc vel accumsan mauris. Nulla eu felis nunc. Morbi at ultricies odio, ut semper metus. Pellentesque bibendum posuere est ullamcorper sollicitudin. Quisque et orci fermentum, sagittis leo vel, porta quam. Suspendisse lacinia sollicitudin velit eget sagittis. Quisque dignissim, ligula a venenatis elementum, libero dui tempor turpis, vel finibus odio lacus et risus. Integer varius, eros vel consequat ultricies, arcu ipsum condimentum ligula, pretium auctor risus urna eu lorem. Nullam aliquam orci in sagittis malesuada. Aliquam nec vulputate sapien. Pellentesque facilisis erat et mauris auctor, ac tincidunt sapien elementum. Sed cursus sit amet diam eu aliquet. Fusce egestas tempor vulputate. Donec ac mollis justo. Ut nec quam sed purus molestie lobortis. Mauris ultrices sem leo. In sagittis mattis porta. Cras gravida neque porttitor mi imperdiet aliquam. Morbi vel pulvinar augue. Sed ac tortor in nibh convallis lobortis. Vestibulum ultrices lacus in dui pharetra, in mattis est pharetra. Vivamus non diam vitae nulla hendrerit placerat a sit amet dolor. Vivamus sit amet metus dui. Maecenas viverra, tortor ac congue ultrices, justo tortor semper lacus, nec vestibulum lacus mauris in nisi. Sed aliquam nisl nec libero sollicitudin lacinia. Vivamus dignissim ante tellus, quis ultrices massa pharetra id. Nulla efficitur augue turpis, non volutpat lectus faucibus vel. Proin vitae nibh hendrerit, tincidunt enim a, congue ex. In non mattis lacus, sed eleifend augue. Sed at neque ac lacus pulvinar pellentesque. Nulla convallis interdum tortor, eu pulvinar diam placerat non. Vivamus eget nunc velit. Vivamus accumsan erat at lacus congue, quis tristique tellus ultricies. Integer malesuada placerat ante et lacinia. Sed felis sapien, ultrices sit amet metus ac, feugiat interdum lacus. Aenean vel tempus turpis. Vestibulum a mattis mauris, non finibus odio. Praesent non felis odio. Nunc est enim, finibus et ornare vitae, maximus at magna. Phasellus a massa quis nunc sollicitudin vestibulum a vitae urna. Pellentesque hendrerit arcu ut urna viverra, quis pretium dui dapibus. Ut et metus in nulla iaculis varius. Curabitur sit amet enim porta, bibendum lectus non, ultricies orci. Phasellus mollis, justo ac aliquam finibus, arcu felis pellentesque velit, non rutrum nisl nulla in risus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras sed lacinia dolor. Nulla varius condimentum commodo. Praesent in metus at risus pulvinar consequat ac quis lacus. Praesent neque diam, tempus in ipsum at, vestibulum tincidunt velit. In vel erat nibh. Etiam quis fermentum magna. Curabitur finibus, nibh sit amet cursus consequat, tortor orci tempor nunc, ac ullamcorper odio eros nec dui. Fusce aliquet venenatis congue. Cras vel viverra purus. Sed lobortis vehicula tellus. Praesent lectus elit, convallis at sagittis vitae, convallis ut turpis. Praesent sed diam augue. Integer bibendum sagittis arcu, non bibendum tortor mattis ut. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In odio purus, ultricies ut lorem vitae, consectetur semper elit. Duis tristique quam quis sapien pretium, et egestas odio rutrum. Aliquam ullamcorper nulla arcu, ut faucibus dolor vestibulum in. Praesent ac odio porttitor, accumsan nisi eu, finibus odio. Quisque nulla quam, porttitor in justo et, pellentesque mattis enim. Aenean suscipit iaculis lacinia. Sed pharetra dapibus leo commodo auctor. Quisque at turpis scelerisque, bibendum tellus vitae, viverra urna. Integer mauris orci, posuere ac sollicitudin sit amet, commodo eu lectus. Sed vel ornare nisi. Praesent nisl enim, imperdiet suscipit ornare a, volutpat non ante. Phasellus interdum sodales feugiat. Vestibulum vehicula placerat dui. Curabitur venenatis volutpat turpis ac dapibus. Etiam tristique leo eu arcu egestas blandit. Donec porta nibh vitae sapien egestas faucibus. Nunc convallis odio et convallis condimentum. Vivamus et nulla ac lacus commodo molestie. Suspendisse maximus libero euismod, accumsan sapien eu, congue tortor. Pellentesque sit amet ligula nisl. Etiam convallis tortor sapien, et rutrum nisl venenatis quis. Duis dolor orci, porta ut ligula sit amet, congue posuere tellus. Morbi eu ultrices lacus, nec semper felis. Duis lacinia urna nisi, sit amet aliquet felis condimentum ac. Maecenas vitae aliquam ante. Nam vestibulum mauris semper magna eleifend fringilla. Proin varius tempor elit, vitae rutrum orci placerat ut Donec purus nibh, pharetra in sodales id, maximus sed libero. Aliquam ut libero eget magna iaculis dignissim vel a odio. Pellentesque cursus, mauris vitae molestie vulputate, odio massa vestibulum urna, ut maximus urna elit quis enim. Curabitur vulputate, purus ut pharetra pharetra, lectus ex rhoncus turpis, vitae lobortis purus enim et metus. Donec lobortis dolor non porttitor bibendum. Nullam at ligula tincidunt mi tempus venenatis semper sit amet elit. Duis hendrerit dui sed sagittis euismod. Sed bibendum mauris ex Quisque tincidunt neque sed vulputate posuere. Vivamus id ullamcorper sem. Phasellus nec ex nec lectus porta varius ac ut quam. Praesent augue nisl, ornare quis sapien sed, placerat pellentesque nisi. Maecenas ipsum dui, elementum a maximus a, maximus vitae dolor. Vestibulum porta sed nisi et accumsan. Pellentesque et vestibulum nunc, sit amet gravida ipsum. Sed cursus mi in est lacinia, id pretium ipsum rutrum. Nunc lacinia bibendum nulla, id convallis ante luctus a. Quisque tempus, nibh vitae sodales convallis, nulla dui vulputate nunc, ac molestie mauris erat at nunc. Aliquam vel est a sem porta congue. Integer ut tortor quis ipsum efficitur efficitur. Integer hendrerit, sem in placerat varius, nulla ligula malesuada tortor, quis tempor diam erat id risus. Nulla porta mi vel pulvinar lobortis. Pellentesque laoreet neque a pellentesque convallis. Aliquam elementum, mauris eu aliquam ultrices, lacus ligula feugiat purus, eget porttitor lorem dolor at dolor Suspendisse potenti. Ut dictum tortor auctor hendrerit tristique. Phasellus et feugiat lacus. Mauris eu tortor mauris. Praesent eget nibh volutpat leo placerat aliquet. Sed est diam, imperdiet eget condimentum non, imperdiet et nibh. Duis eu tortor sollicitudin velit viverra mattis sit amet at felis. Donec accumsan, lorem sit amet vehicula dapibus, erat felis facilisis nibh, nec facilisis libero tellus vitae ante. Aliquam diam erat, vestibulum et tortor nec, dictum rutrum lectus. Curabitur vitae dapibus arcu. Fusce tempor turpis quam, at elementum nulla dapibus nec. Aliquam eu sollicitudin nisi. Sed interdum est id justo sagittis accumsan. Donec eu mauris non tellus lobortis volutpat sed eu lorem. Donec vehicula lorem nec nibh pharetra, nec hendrerit velit viverra. Cras id interdum lectus, eu gravida nisi Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam elit lorem, ullamcorper nec ligula nec, blandit rutrum dui. Aliquam ut neque sodales, fermentum orci vitae, lobortis felis. Donec vel malesuada risus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vivamus sagittis justo vitae interdum vehicula. Nulla eget rutrum nulla, viverra ornare eros. Suspendisse commodo velit vel nibh egestas consequat. Vivamus ullamcorper, urna ut pharetra gravida, tellus mi venenatis dui, non viverra augue lectus at elit. Morbi mattis interdum porta. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Cras est velit, condimentum at ornare ac, gravida non justo. Donec fermentum dictum purus, vitae vehicula sapien semper at. Fusce maximus ac dolor hendrerit pulvinar. Suspendisse dignissim eu enim eget pretium. Praesent faucibus rutrum quam, vitae congue magna cursus id Vestibulum pellentesque vehicula mi. Aenean vestibulum, dui sed porta porttitor, quam dui lobortis nibh, ut lobortis arcu purus quis libero. Sed faucibus elit eget nunc suscipit, nec porta leo auctor. Ut vel ornare ligula. Nam id nisi in ante feugiat aliquam vitae eu velit. Nulla a congue nisi, id finibus lacus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam semper tempor mauris sed elementum. Ut sagittis est sit amet lacus cursus feugiat Nullam sed tellus lacus. Curabitur imperdiet leo non velit aliquet, ut luctus risus imperdiet. Nam ullamcorper pellentesque lacus id fringilla. Nullam vel magna id ante aliquam gravida. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut gravida fermentum augue sit amet ultrices. Phasellus faucibus libero eros. Etiam lorem lacus, tristique non mauris pretium, tincidunt blandit nisl. Vivamus nec lacinia nisl. Maecenas feugiat orci mollis mauris placerat, dapibus dignissim dui aliquet. Suspendisse potenti. Aenean suscipit, massa a facilisis bibendum, urna dui aliquet neque, ac feugiat massa turpis et felis. Integer scelerisque quis nulla vitae maximus. Curabitur risus sem, congue non diam in, luctus pulvinar eros. Aenean dui dui, commodo eu purus convallis, vehicula pulvinar tortor Nullam nec ultrices magna. Cras commodo nibh sed maximus tristique. Donec at massa aliquam dui tristique consectetur ac nec nulla. Cras in dapibus arcu. Phasellus tellus ex, rhoncus in dignissim sit amet, convallis sed neque. Ut ut lobortis nulla. Vestibulum faucibus mattis volutpat. In a est ex. In commodo diam vitae ante ultricies dignissim. Maecenas sodales nibh eu placerat tempus. Sed luctus ipsum at ante auctor, a ultrices orci imperdiet Integer vitae vehicula erat. Fusce ac felis eget ante hendrerit vulputate sit amet quis metus. Cras in quam quis ligula pretium dignissim. Vivamus et finibus augue, sagittis laoreet mauris. Etiam nec gravida metus. Nulla vulputate nec diam quis sagittis. Donec nec libero eu augue tincidunt eleifend Nunc volutpat, justo ut consectetur finibus, magna nisl vulputate arcu, sed iaculis lectus arcu at arcu. Ut non purus urna. Etiam vel rutrum orci, eu iaculis mauris. Duis lobortis, odio vitae eleifend mollis, arcu ipsum pretium ex, quis finibus tellus augue ut purus. Nullam aliquam placerat metus, id iaculis ante efficitur a. Ut dolor metus, tincidunt tristique congue eget, posuere eget nisi. Nullam ac nisl vitae mi laoreet malesuada nec ut felis. Aenean ac mi dui Donec vitae tempus odio. Suspendisse neque leo, vulputate vel porta quis, efficitur vel nibh. Quisque id risus ipsum. Vivamus interdum bibendum nulla, sit amet sollicitudin neque dignissim quis. Vivamus rhoncus nisi ante, at gravida odio auctor ac. Morbi pulvinar sodales dui, sit amet mattis lorem laoreet semper. Pellentesque at tristique mauris, a ullamcorper sem. Quisque lobortis, nisl eu consectetur tempus, neque nulla maximus diam, ac ultricies purus sem nec nulla. Donec euismod, diam ut tincidunt aliquam, urna leo mattis neque, at pellentesque dui arcu eu tellus. Vestibulum tempus eros eget consequat eleifend Quisque rutrum laoreet sem, a consequat justo tristique vitae. Aenean pulvinar vel dui eget sodales. In hac habitasse platea dictumst. In semper ante nulla, ut laoreet ex auctor sit amet. Curabitur non elit eu nisl elementum elementum. Phasellus convallis lectus quis venenatis porta. Cras id ante nunc. Proin sit amet ante orci. Aenean vel justo ultricies, cursus tortor eu, scelerisque purus Aliquam nec pretium tellus, sit amet lobortis metus. Maecenas sed libero eget massa imperdiet dictum a ac lectus. Duis ullamcorper ullamcorper odio, laoreet molestie orci pharetra sed. Donec non laoreet sem. In porta accumsan leo sit amet faucibus. Nullam interdum tortor elit, nec venenatis dolor interdum ac. Cras felis urna, malesuada a metus id, luctus tincidunt mauris. Nunc sollicitudin, dolor at cursus dignissim, dolor eros convallis massa, a dictum magna nisi vel tellus. Sed sed efficitur sapien, consectetur consectetur augue. Sed tincidunt pulvinar risus pharetra porttitor. Praesent iaculis, elit vitae finibus pulvinar, eros orci maximus diam, eget tempus mauris massa vitae magna Aenean euismod porta justo ac placerat. Praesent suscipit velit et luctus eleifend. Nam mauris dolor, pretium id dolor quis, dignissim sagittis neque. Donec aliquam massa sit amet fermentum suscipit. Pellentesque ut orci dolor. Etiam mattis ex neque, non auctor dui dignissim eu. Fusce risus quam, interdum ultricies felis et, hendrerit vehicula lorem. Duis lectus elit, interdum dictum tincidunt eget, rhoncus sed felis. Quisque ac pulvinar nisl, eget vulputate eros. Donec lacinia varius massa nec euismod. Aliquam lobortis hendrerit turpis, ac placerat urna. Fusce non odio in nulla pellentesque aliquet eget ut orci. Aenean sit amet est justo. Ut sed lorem et urna fermentum bibendum Suspendisse tempor ipsum non venenatis consequat. Morbi in vehicula felis. Ut gravida nec dolor vitae aliquet. Proin vulputate, felis non faucibus vulputate, mi lacus faucibus lacus, at cursus nulla lacus in dui. Ut in semper turpis. Cras euismod vitae leo luctus commodo. Maecenas nulla est, mattis non erat vitae, pellentesque aliquet nisi. Donec a eros auctor, auctor urna eu, placerat lorem. Curabitur mi risus, eleifend sed mollis eget, blandit vitae quam. Aenean fermentum iaculis orci, id commodo enim suscipit ac. Pellentesque suscipit massa at mi mattis feugiat. Suspendisse facilisis mauris et sem mattis eleifend In eu tincidunt quam. In hac habitasse platea dictumst. Cras mattis turpis iaculis ligula fringilla laoreet. Fusce dignissim erat eget ex lacinia facilisis. Quisque dapibus feugiat ornare. Suspendisse ante metus, rhoncus sed vulputate vitae, aliquet nec magna. Ut dictum nunc volutpat risus luctus hendrerit Aliquam ultricies vestibulum vulputate. Balada o vete Rolleovej; Túto vetu - záväznú, no krátku nechal nám pán Rolle na pamiatku. Každému z vás iste cestu skríži (Neubrunn, Vencko: skriptá z analýzy). V tej vete je skrytá vôňa kvetov. Dovoľte mi zblížiť vás s tou vetou. Predpoklady - tie su vskutku malé: spojitosť na celom intervale no a vnútri, vlastnosť to nie nová funkciu f možno derivovať. Na okrajoch potom už len stačí ak sa "f(a)" "f(b)" rovnať ráči. Keď už spĺňa tieto predpoklady, funkcia f máva veľké klady kdesi v (a,b) bod c sa už kľuje f` sa v céčku vynuluje. Snáď stratíme dve-tri slová o tom, ako vetu dokazovať: ak f žije medzi konštantami urobte si, prosím, dôkaz sami. No a ak je nekonštantne pestré celkom iste nadobúda extrém. Zvyšok úvah, nie je ich tak veľa nechame na prácu čitateľa. Je to iste pocta poézie, že pán Rolle oddnes v básňach žije. Zato, prosím, priateľ slovesnosti neuberaj vetám na presnosti. To, čo básnik do obrazov snuje matematik presne sformuluje. Nullam sit amet lorem tincidunt, pharetra sapien a, dignissim eros. In hac habitasse platea dictumst. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec pulvinar leo nec laoreet posuere. Aliquam cursus lectus mauris, in rutrum elit venenatis ut. Mauris consectetur feugiat lectus at vehicula. Donec et risus orci Fusce venenatis leo ante, in porttitor diam gravida ac. In faucibus pulvinar quam, quis ultricies risus fringilla vel. Mauris efficitur, nisl non elementum egestas, eros nulla viverra magna, non blandit lorem metus nec enim. Suspendisse lacinia sollicitudin lectus vitae auctor. Curabitur ullamcorper et felis nec porta. Nulla facilisi. Vivamus euismod gravida commodo. Mauris eu venenatis turpis, et pharetra eros. Suspendisse potenti Aliquam porttitor risus eros, euismod ultrices diam porttitor ac. Vestibulum ultricies enim ac sem euismod, eu consequat velit vulputate. Ut faucibus lorem quis purus efficitur elementum sed vel est. Quisque eleifend arcu sem, sed faucibus quam mattis egestas. Curabitur rutrum, dolor sed vehicula tempor, eros leo convallis nisi, nec egestas odio neque at libero. Nam posuere, purus quis maximus venenatis, leo erat mattis magna, at cursus nibh felis a leo. Quisque gravida consectetur magna, vitae tempus turpis. Maecenas dapibus tincidunt est quis venenatis. Donec volutpat rhoncus luctus. Aliquam ut nisi ornare, maximus ante vestibulum, feugiat urna. Nullam sit amet consequat nulla. Nam sed rhoncus massa. Aenean dignissim placerat lectus, vitae vulputate mi ultrices quis. Sed ullamcorper aliquet suscipit. In id turpis ac odio convallis finibus Nunc faucibus ultricies pellentesque. Nullam varius, metus non consequat aliquet, arcu erat eleifend ante, scelerisque porttitor felis dolor vel purus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eros risus, porta in ante non, accumsan consectetur neque. Suspendisse potenti. Ut nec porttitor metus, a convallis velit. Nulla elit dolor, egestas eu interdum at, lobortis non elit. In id eros ultricies magna maximus aliquam id sit amet nisl. Mauris nec lectus placerat, convallis augue vel, porttitor leo. Phasellus a nunc non augue porta laoreet eget volutpat eros. Donec lacinia nibh sed urna lacinia, sit amet molestie nunc venenatis. Nunc placerat blandit nibh non pretium Vivamus a lectus vulputate, pharetra lectus vel, tincidunt velit. Suspendisse blandit at nulla quis finibus. Maecenas gravida nibh enim, elementum eleifend neque condimentum quis. Vestibulum ultricies massa purus, vel pellentesque nisl pellentesque et. In varius tortor nec diam fermentum, sed volutpat leo egestas. Sed et dictum enim. Aenean ut tristique orci. Praesent at dictum enim Donec sit amet pulvinar turpis. Fusce finibus enim a arcu pharetra varius. Maecenas ex lacus, aliquam quis lorem vel, aliquet molestie odio. Vivamus sollicitudin sodales augue, ac malesuada enim. Cras posuere maximus consectetur. Mauris varius, diam id aliquam auctor, ante risus dapibus mauris, nec vestibulum velit elit porta ex. Donec quis magna vitae purus laoreet maximus. Maecenas dictum facilisis tortor, sed consequat odio vulputate sit amet. Aenean tristique purus et sapien dignissim, ut rhoncus neque vehicula. Praesent sed mi sed nisi blandit feugiat. Cras fermentum augue eu orci lobortis, quis lobortis urna vehicula Maecenas mattis est at condimentum rhoncus. Maecenas nec molestie nunc, non hendrerit ex. Proin finibus fringilla sollicitudin. Suspendisse potenti. Sed nec aliquam arcu, sit amet egestas libero. Suspendisse finibus libero nisi, vel blandit nibh venenatis vel. Integer eu augue et justo tincidunt placerat. Aenean pretium ex vitae felis tincidunt, nec suscipit sem placerat. In dui orci, lobortis ut ante id, varius ullamcorper erat. Sed accumsan vehicula vulputate Quisque varius nibh sed nisi pulvinar aliquam. Vivamus tincidunt lectus convallis ipsum ultricies ullamcorper. Morbi tincidunt, tellus nec bibendum bibendum, dolor elit pharetra lorem, eget lacinia odio nulla vitae nunc. Suspendisse hendrerit justo ut sagittis sodales. Sed laoreet a lorem a fermentum. Ut mollis neque augue, at pharetra enim semper a. Suspendisse ac eleifend enim, non maximus nunc. Proin fermentum at turpis vel auctor. Integer in tristique massa. Interdum et malesuada fames ac ante ipsum primis in faucibus Aliquam rutrum posuere dolor nec malesuada. Phasellus luctus et nisi et cursus. Phasellus placerat mattis lorem, vel eleifend nibh fringilla sit amet. Sed nec volutpat elit. Donec consequat eget sapien vel tincidunt. Duis tincidunt nisi ac vestibulum interdum. Suspendisse non magna congue, rutrum sapien quis, finibus diam. Quisque dolor orci, iaculis ac sollicitudin sed, feugiat in erat Morbi viverra nulla bibendum nibh tempor egestas. Nam laoreet, nulla in congue egestas, dui turpis mattis ipsum, quis fringilla ex tortor ut tortor. Morbi tristique elit sit amet nulla eleifend, vel porttitor sem elementum. Pellentesque vitae facilisis magna. Etiam at mi lacinia, molestie purus sit amet, facilisis ante. Sed nisl arcu, condimentum sit amet vehicula sit amet, tempor a mauris. Donec ut odio ac massa eleifend aliquet a in neque Mauris varius erat urna, eget accumsan lacus tincidunt vel. Cras sit amet neque neque. Integer tempus eu lacus a porta. Vestibulum fringilla semper mi, sit amet aliquet orci scelerisque sed. Nullam fringilla nunc sit amet sagittis gravida. Vestibulum sodales nec quam nec scelerisque. Nunc vel elit quam. Praesent commodo auctor ex, ac iaculis orci ultricies ac. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Duis tincidunt purus nec nunc congue, sit amet dignissim elit gravida. Donec sem lectus, molestie ut scelerisque quis, tincidunt rhoncus enim. Etiam commodo, mauris id viverra placerat, justo urna sollicitudin sapien, id tempor libero odio sit amet nisl. Curabitur vel nisi ut ipsum porttitor rutrum a a turpis. Mauris imperdiet mauris vel tellus lacinia cursus. Nullam tincidunt imperdiet tortor. Integer sed dolor nec risus luctus interdum in quis ante Phasellus tincidunt laoreet tellus sit amet rhoncus. Vestibulum ultrices vulputate nisi vel posuere. Nulla facilisi. Nulla facilisi. Nunc in nunc magna. Donec lobortis enim sit amet mi egestas pharetra. Cras nulla quam, dapibus eget rhoncus non, euismod non massa Phasellus et ipsum diam. Proin gravida semper ante sit amet consectetur. Suspendisse mollis lacinia venenatis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam lacinia magna vel dictum commodo. Pellentesque ac pulvinar ipsum. Nunc tempor justo et suscipit tristique. Sed sed risus ac eros mattis dignissim sed quis odio. Aliquam molestie, ligula eu pellentesque sollicitudin, purus turpis venenatis ipsum, vitae ullamcorper tellus tellus eu ipsum. Donec sed tristique nibh Quisque ut aliquam sem, et tincidunt tellus. Vivamus orci tortor, mollis in posuere eget, dignissim a enim. Maecenas nisl libero, elementum et leo id, fermentum bibendum justo. Donec ac venenatis leo. Vestibulum id iaculis magna, non vehicula felis. Nullam vitae semper nibh. Sed fermentum ex nec porttitor dictum. Curabitur dictum quam metus, a vulputate turpis elementum non. Nullam vel ligula rutrum, eleifend ligula ut, congue est. Nullam finibus ligula quis diam facilisis facilisis. Morbi ultrices ante lectus, ut blandit dolor mollis sit amet. Nullam eu finibus dui. Donec porttitor eros sit amet luctus blandit. Nam congue urna id pulvinar fringilla. Duis fermentum finibus congue Sed mollis bibendum rutrum. Cras hendrerit elit id porttitor cursus. Morbi ut est eget odio accumsan faucibus sed eu erat. Suspendisse ut ligula id velit tincidunt vestibulum ac vel massa. Sed ornare mi at gravida dapibus. Curabitur sollicitudin vestibulum justo. Nam vestibulum cursus consequat Aliquam vestibulum mauris eu est feugiat, consectetur fermentum tellus ullamcorper. Nam auctor facilisis risus eget varius. In convallis velit eget neque suscipit, ac porta est venenatis. In id suscipit orci. Curabitur tincidunt efficitur nisi. Praesent efficitur, lectus non convallis aliquet, lacus mauris eleifend arcu, elementum vestibulum massa risus eu urna. Aenean interdum placerat ligula eget feugiat. Ut commodo est nec ante volutpat facilisis. Nulla facilisi. Sed sed turpis ut est finibus dapibus. Aenean tempor ex sit amet lorem congue scelerisque. Donec lacus ipsum, feugiat quis est iaculis, condimentum laoreet magna. Donec varius nec diam sed convallis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce nec magna purus Integer maximus dui lacus, a suscipit urna condimentum ut. Curabitur pellentesque leo at ex pulvinar blandit. Nunc non est vel nisl semper egestas at et arcu. Mauris non sollicitudin ante, ut varius sem. In eget felis quis tortor maximus rutrum eu in turpis. Etiam gravida massa suscipit purus posuere, ut consectetur nunc efficitur. In nec molestie ex. Aenean vel neque ut nisl tincidunt rhoncus. Nam congue placerat erat, sed mollis leo commodo vel. Quisque vestibulum sagittis rutrum. Fusce suscipit luctus enim, nec faucibus nibh elementum et Nam lacinia nunc quis consectetur consequat. Duis bibendum libero et molestie feugiat. Donec sed turpis laoreet, pellentesque neque ut, pretium magna. Aenean euismod vel ligula vel blandit. Cras vitae arcu posuere, euismod nulla aliquet, fermentum lectus. Donec imperdiet iaculis purus, sit amet faucibus magna iaculis eu. Nam dictum ullamcorper ipsum finibus iaculis Sed in ultricies diam, at pulvinar enim. Cras porta enim vel lacus volutpat, sit amet finibus enim eleifend. Vivamus sed ullamcorper tellus, id porta purus. Etiam ac libero eget nulla tempus rutrum sed aliquam lectus. Donec a diam in massa vestibulum sollicitudin in nec lorem. Nulla scelerisque, magna id scelerisque rhoncus, metus elit faucibus est, mollis dapibus risus nulla ac tellus. Nunc facilisis malesuada neque, varius ullamcorper purus commodo eu. Sed in lobortis magna Cras sed libero ligula. Nam et porttitor augue. Vestibulum a leo sem. Phasellus malesuada purus hendrerit urna vulputate fringilla. Curabitur pellentesque ipsum et mauris luctus, sed scelerisque velit fermentum. Pellentesque mi libero, ornare eget interdum ut, efficitur id lectus. Duis at mauris at urna auctor vestibulum. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras quis malesuada ipsum, sit amet auctor risus. Mauris mi nulla, consequat ut congue in, imperdiet a ipsum Praesent euismod tellus ut eros varius pellentesque. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse at dignissim tortor, et sollicitudin tortor. Pellentesque nec quam sed nisi blandit ultricies ac ac ante. Praesent id dolor a ligula facilisis euismod eu dictum neque. Fusce sit amet laoreet mi. Donec molestie odio gravida molestie varius. Fusce luctus lacus sed suscipit bibendum. Curabitur consequat volutpat ornare. Duis placerat tellus a felis molestie convallis. Vestibulum fermentum nisl sit amet dictum efficitur. Maecenas lectus turpis, bibendum sit amet dictum nec, dictum sed erat. Praesent et dui feugiat, congue nisi ut, convallis arcu Fusce accumsan vel nulla nec pretium. Suspendisse potenti. Suspendisse imperdiet vel libero quis imperdiet. Nullam consequat sodales lacus sit amet interdum. In maximus faucibus urna eget suscipit. Etiam in mollis dui, quis sodales tortor. In porta nisi sit amet finibus hendrerit. Donec dolor felis, lacinia rhoncus ornare a, convallis nec massa. Mauris suscipit, sapien id luctus auctor, risus nisi efficitur dolor, et ornare nunc neque ac metus. Sed id massa purus. Quisque varius justo tellus, a tempor augue lobortis sed Phasellus pulvinar commodo magna a auctor. Curabitur elementum urna et fermentum pulvinar. Donec ut consectetur est, id interdum tellus. Vivamus quis semper tellus. Aenean ornare eu massa vitae feugiat. Sed nec egestas nisi. Suspendisse eleifend neque sit amet quam blandit luctus. Donec fermentum laoreet elit, a lobortis ipsum lobortis quis Integer lobortis egestas pulvinar. Nullam dapibus varius dui ac convallis. Proin venenatis vestibulum diam nec accumsan. Suspendisse ultrices et mi a ullamcorper. Phasellus a diam nunc. Phasellus egestas blandit metus, vel varius massa consectetur sed. Pellentesque a tortor risus. Phasellus sagittis tempus odio, non porttitor velit tincidunt id. In nec porta sem. In tempor lacinia eleifend. Nunc in pretium arcu. Aliquam sit amet nisl in lectus pellentesque consectetur non at neque. Nullam non fermentum leo. Nam bibendum libero et lorem laoreet mattis. Etiam ac vulputate sem. Pellentesque sit amet mauris felis Proin suscipit, nisl consequat luctus vulputate, sem tellus convallis augue, id aliquet est leo vitae enim. Nunc dictum volutpat risus eget imperdiet. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nulla at enim vulputate, aliquam enim id, ornare turpis. Nam lacinia commodo pulvinar. In eu augue scelerisque, maximus ante eu, hendrerit metus. Morbi magna lacus, ultricies a facilisis sit amet, congue sed mi. Praesent non sapien ornare nibh iaculis mattis non et lorem. Nam eu scelerisque elit. Ut ornare magna non cursus mollis. Proin vitae nisi iaculis odio laoreet finibus vitae quis justo. Nunc scelerisque imperdiet augue, vitae tincidunt libero. Aenean semper nec nunc eget fringilla. Praesent eu viverra lectus. Aliquam vitae ornare erat Sed sollicitudin, lacus non tincidunt malesuada, sapien velit convallis ex, sit amet gravida enim orci vel velit. Nulla orci nunc, pulvinar ut metus nec, imperdiet accumsan tortor. Phasellus tempus pharetra leo, nec aliquam massa faucibus et. Integer eu lacus eget justo eleifend fermentum nec et quam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis sit amet ligula enim. Donec quis magna at tellus ullamcorper feugiat. Aliquam venenatis lectus ac ultricies ornare. Nam sed leo nec ipsum cursus finibus quis ut augue Aliquam ullamcorper lacus augue, et ultricies erat pharetra at. Mauris malesuada libero non efficitur pretium. Nam scelerisque eu tellus eget volutpat. Fusce non consequat mi, eu tristique purus. Etiam tincidunt justo sit amet efficitur consequat. Morbi et nisl dui. Donec vulputate augue in ultricies ultricies. Nunc tristique metus lectus, id finibus arcu venenatis ac. Suspendisse mattis magna sit amet velit scelerisque, convallis auctor metus porta. Nunc ac porta erat, nec volutpat ligula. Nulla convallis nisi leo, sit amet volutpat erat finibus blandit. Aliquam ac rutrum ipsum Pellentesque commodo ipsum sed purus tristique, et ultricies nibh tempor. Praesent eu luctus diam. Proin vel vulputate arcu. Suspendisse volutpat nisi turpis, vitae convallis sapien faucibus eu. Nulla aliquet massa vitae ultricies sagittis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempus dolor semper cursus blandit. Phasellus quis tempus ligula. Nunc convallis tellus iaculis odio venenatis, eu condimentum magna pretium. Nunc ultricies tempor velit, ac egestas purus luctus non. Fusce elementum nibh at aliquam aliquet. Proin auctor, tortor non fermentum porta, orci magna suscipit purus, sit amet sagittis turpis nibh quis elit Etiam vitae urna id tellus feugiat tincidunt. Aenean eget nunc varius, lacinia nisl sit amet, finibus magna. Integer ac tortor eget metus gravida pulvinar. Aenean eu nulla a leo porttitor egestas porttitor at ipsum. Donec sed ipsum elementum, ullamcorper orci eget, maximus sapien. Donec nec nunc viverra, mattis massa nec, rutrum ex. Aenean vel erat in nisl vulputate fermentum in ac elit. In non leo id nulla scelerisque tempor nec quis leo. Praesent in erat vel sem ornare vehicula Donec vel tellus faucibus augue sagittis viverra. Nulla maximus ex sed ex ultrices, in blandit libero tempus. Praesent molestie nulla odio, molestie pharetra arcu lobortis a. Vivamus volutpat purus nec massa sodales, eu gravida ipsum suscipit. Cras pretium dui ut neque tempus eleifend. Quisque vel iaculis augue, at semper felis. Etiam interdum ac erat ut feugiat. Maecenas rhoncus justo non orci commodo, in feugiat urna sagittis. In malesuada enim et fringilla sodales. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras rutrum, ipsum ac varius lacinia, erat erat pharetra felis, ut fermentum justo tortor et leo. Integer eget congue nibh, id finibus velit. Duis a neque mauris. Maecenas id risus non erat mattis tempor. Aenean vehicula ex leo, ut gravida elit euismod nec. Quisque molestie viverra lacus, quis bibendum dolor. Phasellus at nisi fermentum, pretium nibh at, placerat lacus. Maecenas quis commodo sapien. Pellentesque vehicula cursus mollis. Nulla id libero gravida, viverra urna hendrerit, varius ipsum. Vestibulum at nisi ullamcorper mauris posuere aliquam. Fusce ac libero ullamcorper, blandit nulla non, egestas libero. Cras ut fermentum nibh, quis aliquet mauris. Nam fermentum augue ac vehicula rhoncus. Curabitur fermentum consectetur euismod. Donec urna ante, ornare quis ipsum a, rutrum tempor odio. Pellentesque sapien augue, congue in aliquet sit amet, sagittis eget libero. Etiam sit amet tellus vitae mi tempus vestibulum. Vivamus turpis mi, eleifend porttitor viverra at, pharetra eu est. Donec condimentum ut neque at faucibus. Aenean sit amet ipsum purus. Mauris et varius lacus. In enim leo, luctus id volutpat ac, interdum sed est. Aliquam porttitor justo quis lorem mollis, ut sagittis felis consectetur. Phasellus placerat nunc orci, sit amet hendrerit arcu scelerisque porttitor. Etiam rutrum mollis nisi in fermentum. Nullam vestibulum quis ex sit amet pretium. Praesent aliquet elit nunc, nec ullamcorper est semper non. Nunc efficitur nec magna sed elementum. Fusce placerat mi eget tortor tristique ultrices. Pellentesque malesuada et dolor quis dignissim. Ut in viverra dui, blandit dignissim lacus. Suspendisse viverra enim quis fermentum aliquet. Quisque eget urna dui. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Duis vitae ipsum ipsum. Sed tortor nulla, ornare in est at, consequat condimentum dui. Nulla laoreet maximus ipsum. Vivamus nisl dui, facilisis id lobortis eget, semper sit amet metus. Nullam vulputate commodo diam, sit amet tincidunt purus euismod at. Aliquam ac condimentum eros. Ut eu est sit amet arcu tempor pulvinar id in mi. Donec euismod quis ipsum vitae volutpat. Phasellus sit amet urna felis. Sed et neque at leo molestie posuere vitae ut odio. Phasellus nec tristique diam, at porta augue. Maecenas et nibh ut lectus pharetra eleifend. Integer blandit sem nulla, a pharetra diam maximus vitae. Nunc massa turpis, commodo nec orci id, vulputate convallis risus. Nunc eleifend consectetur odio, vitae pretium lectus. Nullam vitae fermentum ex. Praesent ut neque a mi volutpat egestas id et sapien. Etiam magna nisi, ullamcorper vel sagittis at, ultrices sit amet est. Mauris rhoncus purus fringilla, sagittis mi in, laoreet mi. Curabitur purus odio, vulputate et ornare quis, pretium in ipsum. Donec orci ligula, maximus enim id, porta fringilla libero. Aliquam nunc velit, pharetra nec dignissim non, vulputate nec lectus. Q.E.D.'
-)
+LONG_STRING_50000: str = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc convallis aliquet egestas. Nam sed interdum neque. Donec semper, risus in pretium venenatis, sapien dolor lobortis quam, vitae viverra justo quam ullamcorper turpis. Phasellus vel dignissim lorem, non tempus lorem. Quisque dictum suscipit sagittis. Cras vel orci eget velit pellentesque bibendum blandit pretium augue. Donec eget leo fringilla turpis tempor venenatis eget et odio. Sed lacinia mauris vel fringilla gravida. Pellentesque commodo consequat dui ut tempus. Morbi vulputate nulla sed dui cursus tempor. Sed dui nisl, pellentesque sit amet risus rhoncus, venenatis tempus ligula. Nulla commodo pretium diam, laoreet porta eros suscipit non. Aliquam congue est scelerisque rhoncus tincidunt. Mauris id risus a felis faucibus congue. Nunc tempor tincidunt dapibus. Praesent accumsan facilisis ultricies. Praesent lectus odio, accumsan sed lacinia vel, dignissim nec nisl. Pellentesque laoreet ornare velit, in mattis massa tempor et. Curabitur tincidunt pharetra faucibus. Duis iaculis quam sed risus viverra tincidunt. Aenean dignissim rhoncus nisl. Donec a sapien erat. Integer porta massa non imperdiet fermentum. Curabitur ultrices dolor non quam commodo varius. Integer fringilla ac nisl gravida gravida. Nulla mollis tortor neque, id hendrerit leo ornare eu. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas lobortis felis quis turpis porta scelerisque. Ut sapien justo, lobortis ut suscipit nec, viverra eu ligula. Sed ornare sapien non augue tempor euismod. Sed convallis nisl quis velit luctus, nec molestie magna tincidunt. Vivamus gravida augue et diam sodales, sed iaculis ante molestie. Suspendisse id velit sed mauris venenatis pharetra accumsan vel augue. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin suscipit auctor lorem nec mollis. Nulla massa nunc, finibus vel tellus sit amet, varius aliquam elit. Suspendisse finibus urna at nibh rutrum dapibus. Maecenas ut eros a nulla eleifend viverra dignissim id purus. Quisque gravida elit at tellus tincidunt iaculis. Donec ac nunc lorem. Vivamus velit quam, gravida in orci sit amet, sodales varius arcu. Etiam egestas consequat pharetra. Morbi vitae tellus vel tellus gravida tincidunt id quis sem. Fusce sed ipsum convallis, aliquam leo ac, volutpat lacus. Morbi in mauris ornare, suscipit felis quis, sodales eros. Morbi porttitor tortor mi, vel bibendum justo hendrerit sed. Donec ut mi interdum, rhoncus dui vel, elementum eros. Morbi eget fringilla arcu. Fusce mattis turpis ac lacus posuere mollis. Nullam nisi leo, semper id elit et, condimentum vehicula diam. Nunc dapibus condimentum massa mollis vehicula. Aenean eleifend eget sapien pulvinar blandit. Morbi tempor lectus odio, nec congue dui egestas ut. Aliquam erat volutpat. Donec a ipsum ipsum. Sed magna massa, convallis id est non, venenatis tincidunt nibh. Aenean ex tellus, finibus quis tortor quis, semper eleifend mi. Fusce ultrices blandit lobortis. Praesent non tincidunt magna. Suspendisse vel turpis vestibulum, placerat dolor et, egestas ex. Maecenas quis accumsan nulla, at rutrum eros. Duis at congue tellus, et dignissim tellus. In sit amet nisi in lorem consectetur vestibulum eget ac metus. Praesent lacinia dolor et dolor vehicula blandit. Aenean placerat nunc in risus auctor, ac consectetur elit blandit. Donec vestibulum molestie dictum. Donec a consequat turpis, et fringilla risus. Morbi congue velit non nisl volutpat malesuada. Etiam ut eros nec risus molestie dignissim non et sapien. Proin vulputate tempus accumsan. Nulla nibh diam, elementum eget mauris sed, rhoncus vestibulum enim. Nam cursus erat sit amet ex porta luctus. Fusce mollis facilisis arcu sed sodales. Quisque quis risus vehicula, interdum arcu in, sagittis mauris. Donec suscipit tempor gravida. Donec pharetra erat ante, non vehicula neque varius eget. Proin eu aliquet lacus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam consequat, nisl eget venenatis euismod, justo felis aliquet nisi, sit amet ornare nibh purus in metus. Fusce quis justo magna. Quisque faucibus enim sit amet elit fringilla, eu pharetra magna pretium. Praesent nibh erat, rhoncus at feugiat vitae, mattis et enim. Aliquam eget dolor leo. Integer vestibulum purus id arcu aliquet, at semper nulla pretium. In ut dui arcu. Nunc vel congue massa. Donec enim est, scelerisque nec pretium rutrum, semper nec sem. Aliquam consectetur ex quis risus venenatis, porta pharetra felis fermentum. Cras turpis ante, molestie eget justo vel, porttitor cursus arcu. Fusce et enim et nisi sagittis tristique quis at nulla. Duis efficitur quis nunc at dignissim. Vestibulum erat neque, finibus a hendrerit eu, vehicula aliquam lacus. Vivamus consectetur ex auctor sapien finibus, ut egestas nisl mattis. Nulla eget dignissim sapien. In odio justo, condimentum rhoncus felis vel, tincidunt commodo nibh. Praesent accumsan libero sed fermentum mollis. Curabitur eget porta velit, ut mollis lorem. Nulla semper mollis fringilla. Aliquam condimentum feugiat quam, at vestibulum tortor vulputate et. Ut congue eu lacus venenatis porttitor. Mauris ultricies porta orci, quis mollis dui egestas ut. Nulla quis volutpat ipsum. Donec quis massa velit. Nulla facilisi. Phasellus vestibulum nunc ante, a finibus nulla vehicula non. Quisque volutpat orci at leo hendrerit, gravida iaculis massa vulputate. Sed at magna nibh. Maecenas sed tempor justo. Cras quis libero non sem viverra placerat. Proin nulla nunc, ullamcorper in congue eu, rhoncus sed mi. Aenean pellentesque nibh id elit auctor, sit amet bibendum erat mattis. In hac habitasse platea dictumst. Integer eu maximus ipsum. Mauris hendrerit lectus purus, nec scelerisque mi iaculis quis. Proin orci risus, feugiat id placerat nec, faucibus eu arcu. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nullam porttitor, quam a scelerisque pellentesque, tellus felis facilisis sem, blandit vehicula sapien quam at purus. Pellentesque lectus ex, iaculis non semper eget, facilisis non risus. Curabitur mattis tortor id metus scelerisque, in congue dolor bibendum. Morbi at blandit felis. Vivamus hendrerit dui nibh, et finibus mi sollicitudin cursus. Sed tempus risus nisi, id aliquam eros scelerisque sed. Quisque eu lacus et urna tristique blandit vitae eleifend arcu. Nunc malesuada in lectus nec aliquet. Vivamus laoreet pretium quam, eu dapibus felis tristique aliquet. Ut malesuada volutpat nisi, non facilisis augue blandit sit amet. Vivamus faucibus nunc eget fermentum semper. Duis commodo vel odio eu tincidunt. Vestibulum hendrerit tempus viverra. Proin pharetra, diam ac commodo fermentum, nibh lacus scelerisque dolor, at euismod lorem ipsum ut augue. Cras id viverra elit. Vivamus mollis nulla quis tellus lacinia tempus. Nulla odio ex, mattis in mollis ac, viverra ac lacus. Donec quis ipsum nisi. Aliquam at tellus nec sem pellentesque accumsan. Fusce accumsan nisi id faucibus varius. Aliquam consectetur consequat metus, eu varius diam sollicitudin ac. Sed tristique placerat ipsum, sed luctus risus semper sed. Vestibulum pulvinar eros in tortor viverra sollicitudin. Duis eu hendrerit magna. Aliquam tristique lorem tortor, in scelerisque nulla fermentum vel. Phasellus ut molestie justo. Integer at felis quis massa hendrerit ullamcorper. Cras ut vestibulum est, eget interdum elit. Morbi iaculis mattis scelerisque. Vivamus tincidunt sed mi eget ultricies. Donec aliquet lacus et mi fringilla malesuada. Nullam sed mauris mauris. Nulla vitae nulla viverra, accumsan dui vitae, vehicula magna. Donec elementum, lacus vitae blandit finibus, est arcu aliquam sapien, nec finibus velit diam et ligula. Duis id leo sit amet quam tincidunt facilisis. Duis mauris ipsum, mattis ut massa sodales, pharetra rhoncus orci. Sed sagittis sodales ex nec dignissim. In venenatis semper tortor sed vestibulum. Vestibulum cursus lacus ut suscipit mattis. Curabitur vitae mi sapien. Mauris lobortis gravida lectus, vel tempor nisi imperdiet nec. Aliquam rhoncus, sapien nec pulvinar molestie, diam ipsum consectetur sem, eu molestie risus tortor id erat. Ut vel laoreet nunc. Donec vel placerat leo, sit amet lacinia leo. Ut aliquet libero arcu, non elementum mauris fringilla ac. Aliquam erat volutpat. Aliquam vestibulum orci felis, a eleifend lectus dignissim quis. Nulla eleifend ipsum magna, nec volutpat mauris egestas non. Ut vestibulum semper cursus. Donec elementum ipsum enim, in eleifend massa dapibus ac. Fusce ac purus nisl. Etiam tempor, lorem malesuada commodo fermentum, orci felis blandit arcu, eget venenatis massa risus eu lectus. Sed quis est ultrices purus lobortis gravida a aliquet velit. Nam ut semper nisi. Curabitur non placerat magna, non volutpat enim. Pellentesque libero nunc, placerat porttitor euismod quis, dictum ac neque. Pellentesque nisl orci, aliquam in tristique sed, rhoncus ultricies leo. Phasellus ultricies, nunc quis facilisis ullamcorper, felis orci rutrum est, sed imperdiet sem tortor iaculis tortor. Nam facilisis mollis semper. Vestibulum mattis semper condimentum. Aenean et varius augue, eget dapibus urna. Phasellus vehicula, justo ac tempor fringilla, lorem libero ornare dolor, quis interdum felis magna pharetra elit. Nam turpis eros, faucibus eu mattis ac, rhoncus quis dolor. Praesent iaculis lectus a nibh tempus volutpat. Fusce imperdiet efficitur ante, eu lobortis enim pellentesque nec. Quisque blandit pulvinar libero, id porttitor tortor ullamcorper eu. Donec pharetra laoreet ultrices. Proin ultrices, nisi ac luctus aliquam, magna enim sagittis ex, non mattis sem risus sit amet massa. Aliquam erat volutpat. Sed tempus metus quis augue egestas pharetra. Nulla eleifend mauris eu mollis pharetra. Pellentesque cursus ac massa quis euismod. Proin mattis nunc ac pharetra molestie. Praesent interdum bibendum leo, sit amet faucibus nibh scelerisque non. Nullam felis odio, finibus nec iaculis ut, tempor at dolor. Donec ultrices dolor quis nunc varius, at pharetra sapien pulvinar. Phasellus eget vulputate urna, sit amet porta est. Curabitur posuere est id orci tincidunt facilisis. Quisque accumsan viverra libero, id interdum libero viverra at. Nullam lectus justo, efficitur non aliquet at, accumsan sit amet lorem. Phasellus mattis consectetur posuere. Integer eleifend felis sed nisl posuere pretium. Nulla libero tellus, semper vel pretium nec, scelerisque ac lacus. Nam tempor cursus orci a eleifend. Aenean posuere commodo finibus. Nulla sagittis molestie ipsum, eget egestas felis interdum a. Ut nunc ex, porta ac commodo vitae, dictum vel velit. Vivamus mauris dui, sollicitudin sed enim vel, volutpat varius felis. Maecenas elementum dictum justo ac accumsan. Fusce vitae suscipit nisl. Donec arcu risus, varius a quam vitae, rutrum auctor erat. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean odio eros, fringilla eget cursus vel, tristique sit amet quam. Mauris vehicula, nulla nec placerat tincidunt, massa quam porta eros, et mollis velit nisl nec lectus. In congue accumsan libero, egestas imperdiet lectus egestas quis. Sed nec massa sit amet lectus elementum congue. Quisque consectetur, sapien vitae rhoncus molestie, dolor sem venenatis erat, posuere accumsan dolor elit tempus ante. In imperdiet, tortor in condimentum tempor, quam mauris condimentum dolor, eget accumsan leo risus vitae erat. Cras lorem tellus, dapibus sed viverra id, aliquam interdum nunc. Sed luctus dictum libero, sit amet aliquet erat accumsan vitae. Nulla dignissim sodales tellus nec sodales. Maecenas iaculis a leo posuere congue. Fusce sed ligula erat. Vivamus vel placerat leo, ac venenatis nisi. Nam quis volutpat metus, laoreet laoreet erat. Vivamus eu est elementum, sodales odio nec, venenatis sem. Morbi non quam nec leo imperdiet egestas vitae ut diam. Aenean efficitur libero et lacus imperdiet, id aliquam ex bibendum. Donec rhoncus, mi vitae convallis tristique, eros risus condimentum justo, id lobortis felis metus in nibh. Donec vestibulum laoreet fringilla. Quisque venenatis tincidunt egestas. Curabitur pulvinar odio ut mauris pellentesque dictum. Fusce suscipit, eros id hendrerit vestibulum, nibh lorem sodales lectus, at suscipit erat tortor non justo. Cras lacinia feugiat elementum. Donec eu convallis leo. Donec ac lectus odio. Nunc semper eget erat commodo accumsan. Fusce feugiat dolor in molestie maximus. Donec efficitur faucibus dolor sit amet vulputate. Suspendisse et aliquet risus, quis commodo dolor. Curabitur pulvinar iaculis ligula, quis lacinia tellus posuere nec. Pellentesque bibendum consectetur sapien mattis dictum. Aliquam rhoncus maximus fringilla. Sed efficitur lobortis molestie. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas ac justo odio. Duis lacinia lacus eget eros efficitur, eget auctor ante mollis. Fusce sodales tellus velit, et tempus lectus mollis at. Praesent sed accumsan ligula. In feugiat nunc vel ultricies egestas. Suspendisse potenti. Integer lorem ante, gravida sed blandit a, sollicitudin eu nibh. Nam hendrerit maximus purus eu fermentum. Sed metus lacus, fermentum et lorem vestibulum, posuere rutrum sapien. Pellentesque non velit nec nunc vestibulum dictum at nec metus. Suspendisse et tristique justo. Aenean laoreet ligula augue, volutpat tincidunt urna faucibus facilisis. Nunc consectetur dolor vitae euismod tincidunt. Quisque interdum dignissim pellentesque. Phasellus sem augue, consequat vitae finibus sed, accumsan ut felis. Mauris accumsan pharetra tortor non ultrices. Integer laoreet enim dui, in viverra nisi lacinia eu. Mauris rhoncus vel leo aliquet blandit. Nullam molestie aliquet pharetra. Etiam tempus nunc vel justo ultrices, a varius lorem mattis. Nunc sagittis ligula volutpat, aliquet ex vestibulum, dapibus eros. Donec dolor metus, iaculis et facilisis quis, blandit pulvinar massa. Nullam mi dolor, placerat eu ultricies eget, suscipit sit amet erat. Sed sodales imperdiet lorem sed aliquet. Donec et nulla orci. Duis maximus blandit odio vel aliquet. Sed mollis blandit dapibus. Fusce vestibulum orci in ante facilisis tempor. Proin quis felis nec quam gravida facilisis. In feugiat ligula ut odio sodales, non rutrum magna dapibus. Suspendisse massa turpis, varius id imperdiet et, lacinia vel nunc. Morbi vestibulum mi sed sapien suscipit mollis. Cras a auctor enim, a elementum tortor. Curabitur quis sapien eget tortor placerat lacinia ut at eros. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam malesuada sapien neque, non bibendum libero ornare vel. Nullam ullamcorper diam nec risus ullamcorper, quis condimentum ipsum maximus. Vivamus faucibus in massa et imperdiet. Phasellus luctus metus eu feugiat hendrerit. Proin nec blandit diam. Maecenas id placerat dolor, vitae gravida nulla. Ut scelerisque venenatis lacus, id consequat mauris gravida nec. Etiam vel lorem lobortis, lobortis enim et, sollicitudin tortor. Sed volutpat purus vitae orci elementum vehicula semper nec urna. Nullam sit amet fermentum elit. Nam eros dolor, aliquet quis sollicitudin sed, pulvinar sit amet justo. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris eget felis varius, porta ligula quis, facilisis diam. In blandit interdum libero ut luctus. Nulla facilisi. Morbi arcu augue, suscipit non gravida ac, fringilla id metus. Nullam mollis turpis ac orci tempus ultricies. Vestibulum sit amet massa quis sem lacinia dapibus a et tortor. Vestibulum lacus ligula, tempus sed semper in, viverra sed arcu. Ut semper condimentum diam. Vestibulum mollis sagittis purus, ac fringilla metus imperdiet a. Etiam vel consequat justo, a bibendum nisi. Cras eu lorem vitae velit lobortis fermentum pulvinar non lacus. Maecenas consectetur eget ligula et laoreet. Cras enim leo, fringilla eget posuere vel, vestibulum eu arcu. Phasellus commodo velit dictum mauris ultrices, eu dignissim libero feugiat. Integer vulputate est in nisi tincidunt, non ultrices elit lobortis. Nunc vel accumsan mauris. Nulla eu felis nunc. Morbi at ultricies odio, ut semper metus. Pellentesque bibendum posuere est ullamcorper sollicitudin. Quisque et orci fermentum, sagittis leo vel, porta quam. Suspendisse lacinia sollicitudin velit eget sagittis. Quisque dignissim, ligula a venenatis elementum, libero dui tempor turpis, vel finibus odio lacus et risus. Integer varius, eros vel consequat ultricies, arcu ipsum condimentum ligula, pretium auctor risus urna eu lorem. Nullam aliquam orci in sagittis malesuada. Aliquam nec vulputate sapien. Pellentesque facilisis erat et mauris auctor, ac tincidunt sapien elementum. Sed cursus sit amet diam eu aliquet. Fusce egestas tempor vulputate. Donec ac mollis justo. Ut nec quam sed purus molestie lobortis. Mauris ultrices sem leo. In sagittis mattis porta. Cras gravida neque porttitor mi imperdiet aliquam. Morbi vel pulvinar augue. Sed ac tortor in nibh convallis lobortis. Vestibulum ultrices lacus in dui pharetra, in mattis est pharetra. Vivamus non diam vitae nulla hendrerit placerat a sit amet dolor. Vivamus sit amet metus dui. Maecenas viverra, tortor ac congue ultrices, justo tortor semper lacus, nec vestibulum lacus mauris in nisi. Sed aliquam nisl nec libero sollicitudin lacinia. Vivamus dignissim ante tellus, quis ultrices massa pharetra id. Nulla efficitur augue turpis, non volutpat lectus faucibus vel. Proin vitae nibh hendrerit, tincidunt enim a, congue ex. In non mattis lacus, sed eleifend augue. Sed at neque ac lacus pulvinar pellentesque. Nulla convallis interdum tortor, eu pulvinar diam placerat non. Vivamus eget nunc velit. Vivamus accumsan erat at lacus congue, quis tristique tellus ultricies. Integer malesuada placerat ante et lacinia. Sed felis sapien, ultrices sit amet metus ac, feugiat interdum lacus. Aenean vel tempus turpis. Vestibulum a mattis mauris, non finibus odio. Praesent non felis odio. Nunc est enim, finibus et ornare vitae, maximus at magna. Phasellus a massa quis nunc sollicitudin vestibulum a vitae urna. Pellentesque hendrerit arcu ut urna viverra, quis pretium dui dapibus. Ut et metus in nulla iaculis varius. Curabitur sit amet enim porta, bibendum lectus non, ultricies orci. Phasellus mollis, justo ac aliquam finibus, arcu felis pellentesque velit, non rutrum nisl nulla in risus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras sed lacinia dolor. Nulla varius condimentum commodo. Praesent in metus at risus pulvinar consequat ac quis lacus. Praesent neque diam, tempus in ipsum at, vestibulum tincidunt velit. In vel erat nibh. Etiam quis fermentum magna. Curabitur finibus, nibh sit amet cursus consequat, tortor orci tempor nunc, ac ullamcorper odio eros nec dui. Fusce aliquet venenatis congue. Cras vel viverra purus. Sed lobortis vehicula tellus. Praesent lectus elit, convallis at sagittis vitae, convallis ut turpis. Praesent sed diam augue. Integer bibendum sagittis arcu, non bibendum tortor mattis ut. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In odio purus, ultricies ut lorem vitae, consectetur semper elit. Duis tristique quam quis sapien pretium, et egestas odio rutrum. Aliquam ullamcorper nulla arcu, ut faucibus dolor vestibulum in. Praesent ac odio porttitor, accumsan nisi eu, finibus odio. Quisque nulla quam, porttitor in justo et, pellentesque mattis enim. Aenean suscipit iaculis lacinia. Sed pharetra dapibus leo commodo auctor. Quisque at turpis scelerisque, bibendum tellus vitae, viverra urna. Integer mauris orci, posuere ac sollicitudin sit amet, commodo eu lectus. Sed vel ornare nisi. Praesent nisl enim, imperdiet suscipit ornare a, volutpat non ante. Phasellus interdum sodales feugiat. Vestibulum vehicula placerat dui. Curabitur venenatis volutpat turpis ac dapibus. Etiam tristique leo eu arcu egestas blandit. Donec porta nibh vitae sapien egestas faucibus. Nunc convallis odio et convallis condimentum. Vivamus et nulla ac lacus commodo molestie. Suspendisse maximus libero euismod, accumsan sapien eu, congue tortor. Pellentesque sit amet ligula nisl. Etiam convallis tortor sapien, et rutrum nisl venenatis quis. Duis dolor orci, porta ut ligula sit amet, congue posuere tellus. Morbi eu ultrices lacus, nec semper felis. Duis lacinia urna nisi, sit amet aliquet felis condimentum ac. Maecenas vitae aliquam ante. Nam vestibulum mauris semper magna eleifend fringilla. Proin varius tempor elit, vitae rutrum orci placerat ut Donec purus nibh, pharetra in sodales id, maximus sed libero. Aliquam ut libero eget magna iaculis dignissim vel a odio. Pellentesque cursus, mauris vitae molestie vulputate, odio massa vestibulum urna, ut maximus urna elit quis enim. Curabitur vulputate, purus ut pharetra pharetra, lectus ex rhoncus turpis, vitae lobortis purus enim et metus. Donec lobortis dolor non porttitor bibendum. Nullam at ligula tincidunt mi tempus venenatis semper sit amet elit. Duis hendrerit dui sed sagittis euismod. Sed bibendum mauris ex Quisque tincidunt neque sed vulputate posuere. Vivamus id ullamcorper sem. Phasellus nec ex nec lectus porta varius ac ut quam. Praesent augue nisl, ornare quis sapien sed, placerat pellentesque nisi. Maecenas ipsum dui, elementum a maximus a, maximus vitae dolor. Vestibulum porta sed nisi et accumsan. Pellentesque et vestibulum nunc, sit amet gravida ipsum. Sed cursus mi in est lacinia, id pretium ipsum rutrum. Nunc lacinia bibendum nulla, id convallis ante luctus a. Quisque tempus, nibh vitae sodales convallis, nulla dui vulputate nunc, ac molestie mauris erat at nunc. Aliquam vel est a sem porta congue. Integer ut tortor quis ipsum efficitur efficitur. Integer hendrerit, sem in placerat varius, nulla ligula malesuada tortor, quis tempor diam erat id risus. Nulla porta mi vel pulvinar lobortis. Pellentesque laoreet neque a pellentesque convallis. Aliquam elementum, mauris eu aliquam ultrices, lacus ligula feugiat purus, eget porttitor lorem dolor at dolor Suspendisse potenti. Ut dictum tortor auctor hendrerit tristique. Phasellus et feugiat lacus. Mauris eu tortor mauris. Praesent eget nibh volutpat leo placerat aliquet. Sed est diam, imperdiet eget condimentum non, imperdiet et nibh. Duis eu tortor sollicitudin velit viverra mattis sit amet at felis. Donec accumsan, lorem sit amet vehicula dapibus, erat felis facilisis nibh, nec facilisis libero tellus vitae ante. Aliquam diam erat, vestibulum et tortor nec, dictum rutrum lectus. Curabitur vitae dapibus arcu. Fusce tempor turpis quam, at elementum nulla dapibus nec. Aliquam eu sollicitudin nisi. Sed interdum est id justo sagittis accumsan. Donec eu mauris non tellus lobortis volutpat sed eu lorem. Donec vehicula lorem nec nibh pharetra, nec hendrerit velit viverra. Cras id interdum lectus, eu gravida nisi Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam elit lorem, ullamcorper nec ligula nec, blandit rutrum dui. Aliquam ut neque sodales, fermentum orci vitae, lobortis felis. Donec vel malesuada risus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vivamus sagittis justo vitae interdum vehicula. Nulla eget rutrum nulla, viverra ornare eros. Suspendisse commodo velit vel nibh egestas consequat. Vivamus ullamcorper, urna ut pharetra gravida, tellus mi venenatis dui, non viverra augue lectus at elit. Morbi mattis interdum porta. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Cras est velit, condimentum at ornare ac, gravida non justo. Donec fermentum dictum purus, vitae vehicula sapien semper at. Fusce maximus ac dolor hendrerit pulvinar. Suspendisse dignissim eu enim eget pretium. Praesent faucibus rutrum quam, vitae congue magna cursus id Vestibulum pellentesque vehicula mi. Aenean vestibulum, dui sed porta porttitor, quam dui lobortis nibh, ut lobortis arcu purus quis libero. Sed faucibus elit eget nunc suscipit, nec porta leo auctor. Ut vel ornare ligula. Nam id nisi in ante feugiat aliquam vitae eu velit. Nulla a congue nisi, id finibus lacus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam semper tempor mauris sed elementum. Ut sagittis est sit amet lacus cursus feugiat Nullam sed tellus lacus. Curabitur imperdiet leo non velit aliquet, ut luctus risus imperdiet. Nam ullamcorper pellentesque lacus id fringilla. Nullam vel magna id ante aliquam gravida. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut gravida fermentum augue sit amet ultrices. Phasellus faucibus libero eros. Etiam lorem lacus, tristique non mauris pretium, tincidunt blandit nisl. Vivamus nec lacinia nisl. Maecenas feugiat orci mollis mauris placerat, dapibus dignissim dui aliquet. Suspendisse potenti. Aenean suscipit, massa a facilisis bibendum, urna dui aliquet neque, ac feugiat massa turpis et felis. Integer scelerisque quis nulla vitae maximus. Curabitur risus sem, congue non diam in, luctus pulvinar eros. Aenean dui dui, commodo eu purus convallis, vehicula pulvinar tortor Nullam nec ultrices magna. Cras commodo nibh sed maximus tristique. Donec at massa aliquam dui tristique consectetur ac nec nulla. Cras in dapibus arcu. Phasellus tellus ex, rhoncus in dignissim sit amet, convallis sed neque. Ut ut lobortis nulla. Vestibulum faucibus mattis volutpat. In a est ex. In commodo diam vitae ante ultricies dignissim. Maecenas sodales nibh eu placerat tempus. Sed luctus ipsum at ante auctor, a ultrices orci imperdiet Integer vitae vehicula erat. Fusce ac felis eget ante hendrerit vulputate sit amet quis metus. Cras in quam quis ligula pretium dignissim. Vivamus et finibus augue, sagittis laoreet mauris. Etiam nec gravida metus. Nulla vulputate nec diam quis sagittis. Donec nec libero eu augue tincidunt eleifend Nunc volutpat, justo ut consectetur finibus, magna nisl vulputate arcu, sed iaculis lectus arcu at arcu. Ut non purus urna. Etiam vel rutrum orci, eu iaculis mauris. Duis lobortis, odio vitae eleifend mollis, arcu ipsum pretium ex, quis finibus tellus augue ut purus. Nullam aliquam placerat metus, id iaculis ante efficitur a. Ut dolor metus, tincidunt tristique congue eget, posuere eget nisi. Nullam ac nisl vitae mi laoreet malesuada nec ut felis. Aenean ac mi dui Donec vitae tempus odio. Suspendisse neque leo, vulputate vel porta quis, efficitur vel nibh. Quisque id risus ipsum. Vivamus interdum bibendum nulla, sit amet sollicitudin neque dignissim quis. Vivamus rhoncus nisi ante, at gravida odio auctor ac. Morbi pulvinar sodales dui, sit amet mattis lorem laoreet semper. Pellentesque at tristique mauris, a ullamcorper sem. Quisque lobortis, nisl eu consectetur tempus, neque nulla maximus diam, ac ultricies purus sem nec nulla. Donec euismod, diam ut tincidunt aliquam, urna leo mattis neque, at pellentesque dui arcu eu tellus. Vestibulum tempus eros eget consequat eleifend Quisque rutrum laoreet sem, a consequat justo tristique vitae. Aenean pulvinar vel dui eget sodales. In hac habitasse platea dictumst. In semper ante nulla, ut laoreet ex auctor sit amet. Curabitur non elit eu nisl elementum elementum. Phasellus convallis lectus quis venenatis porta. Cras id ante nunc. Proin sit amet ante orci. Aenean vel justo ultricies, cursus tortor eu, scelerisque purus Aliquam nec pretium tellus, sit amet lobortis metus. Maecenas sed libero eget massa imperdiet dictum a ac lectus. Duis ullamcorper ullamcorper odio, laoreet molestie orci pharetra sed. Donec non laoreet sem. In porta accumsan leo sit amet faucibus. Nullam interdum tortor elit, nec venenatis dolor interdum ac. Cras felis urna, malesuada a metus id, luctus tincidunt mauris. Nunc sollicitudin, dolor at cursus dignissim, dolor eros convallis massa, a dictum magna nisi vel tellus. Sed sed efficitur sapien, consectetur consectetur augue. Sed tincidunt pulvinar risus pharetra porttitor. Praesent iaculis, elit vitae finibus pulvinar, eros orci maximus diam, eget tempus mauris massa vitae magna Aenean euismod porta justo ac placerat. Praesent suscipit velit et luctus eleifend. Nam mauris dolor, pretium id dolor quis, dignissim sagittis neque. Donec aliquam massa sit amet fermentum suscipit. Pellentesque ut orci dolor. Etiam mattis ex neque, non auctor dui dignissim eu. Fusce risus quam, interdum ultricies felis et, hendrerit vehicula lorem. Duis lectus elit, interdum dictum tincidunt eget, rhoncus sed felis. Quisque ac pulvinar nisl, eget vulputate eros. Donec lacinia varius massa nec euismod. Aliquam lobortis hendrerit turpis, ac placerat urna. Fusce non odio in nulla pellentesque aliquet eget ut orci. Aenean sit amet est justo. Ut sed lorem et urna fermentum bibendum Suspendisse tempor ipsum non venenatis consequat. Morbi in vehicula felis. Ut gravida nec dolor vitae aliquet. Proin vulputate, felis non faucibus vulputate, mi lacus faucibus lacus, at cursus nulla lacus in dui. Ut in semper turpis. Cras euismod vitae leo luctus commodo. Maecenas nulla est, mattis non erat vitae, pellentesque aliquet nisi. Donec a eros auctor, auctor urna eu, placerat lorem. Curabitur mi risus, eleifend sed mollis eget, blandit vitae quam. Aenean fermentum iaculis orci, id commodo enim suscipit ac. Pellentesque suscipit massa at mi mattis feugiat. Suspendisse facilisis mauris et sem mattis eleifend In eu tincidunt quam. In hac habitasse platea dictumst. Cras mattis turpis iaculis ligula fringilla laoreet. Fusce dignissim erat eget ex lacinia facilisis. Quisque dapibus feugiat ornare. Suspendisse ante metus, rhoncus sed vulputate vitae, aliquet nec magna. Ut dictum nunc volutpat risus luctus hendrerit Aliquam ultricies vestibulum vulputate. Balada o vete Rolleovej; Túto vetu - záväznú, no krátku nechal nám pán Rolle na pamiatku. Každému z vás iste cestu skríži (Neubrunn, Vencko: skriptá z analýzy). V tej vete je skrytá vôňa kvetov. Dovoľte mi zblížiť vás s tou vetou. Predpoklady - tie su vskutku malé: spojitosť na celom intervale no a vnútri, vlastnosť to nie nová funkciu f možno derivovať. Na okrajoch potom už len stačí ak sa "f(a)" "f(b)" rovnať ráči. Keď už spĺňa tieto predpoklady, funkcia f máva veľké klady kdesi v (a,b) bod c sa už kľuje f` sa v céčku vynuluje. Snáď stratíme dve-tri slová o tom, ako vetu dokazovať: ak f žije medzi konštantami urobte si, prosím, dôkaz sami. No a ak je nekonštantne pestré celkom iste nadobúda extrém. Zvyšok úvah, nie je ich tak veľa nechame na prácu čitateľa. Je to iste pocta poézie, že pán Rolle oddnes v básňach žije. Zato, prosím, priateľ slovesnosti neuberaj vetám na presnosti. To, čo básnik do obrazov snuje matematik presne sformuluje. Nullam sit amet lorem tincidunt, pharetra sapien a, dignissim eros. In hac habitasse platea dictumst. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec pulvinar leo nec laoreet posuere. Aliquam cursus lectus mauris, in rutrum elit venenatis ut. Mauris consectetur feugiat lectus at vehicula. Donec et risus orci Fusce venenatis leo ante, in porttitor diam gravida ac. In faucibus pulvinar quam, quis ultricies risus fringilla vel. Mauris efficitur, nisl non elementum egestas, eros nulla viverra magna, non blandit lorem metus nec enim. Suspendisse lacinia sollicitudin lectus vitae auctor. Curabitur ullamcorper et felis nec porta. Nulla facilisi. Vivamus euismod gravida commodo. Mauris eu venenatis turpis, et pharetra eros. Suspendisse potenti Aliquam porttitor risus eros, euismod ultrices diam porttitor ac. Vestibulum ultricies enim ac sem euismod, eu consequat velit vulputate. Ut faucibus lorem quis purus efficitur elementum sed vel est. Quisque eleifend arcu sem, sed faucibus quam mattis egestas. Curabitur rutrum, dolor sed vehicula tempor, eros leo convallis nisi, nec egestas odio neque at libero. Nam posuere, purus quis maximus venenatis, leo erat mattis magna, at cursus nibh felis a leo. Quisque gravida consectetur magna, vitae tempus turpis. Maecenas dapibus tincidunt est quis venenatis. Donec volutpat rhoncus luctus. Aliquam ut nisi ornare, maximus ante vestibulum, feugiat urna. Nullam sit amet consequat nulla. Nam sed rhoncus massa. Aenean dignissim placerat lectus, vitae vulputate mi ultrices quis. Sed ullamcorper aliquet suscipit. In id turpis ac odio convallis finibus Nunc faucibus ultricies pellentesque. Nullam varius, metus non consequat aliquet, arcu erat eleifend ante, scelerisque porttitor felis dolor vel purus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eros risus, porta in ante non, accumsan consectetur neque. Suspendisse potenti. Ut nec porttitor metus, a convallis velit. Nulla elit dolor, egestas eu interdum at, lobortis non elit. In id eros ultricies magna maximus aliquam id sit amet nisl. Mauris nec lectus placerat, convallis augue vel, porttitor leo. Phasellus a nunc non augue porta laoreet eget volutpat eros. Donec lacinia nibh sed urna lacinia, sit amet molestie nunc venenatis. Nunc placerat blandit nibh non pretium Vivamus a lectus vulputate, pharetra lectus vel, tincidunt velit. Suspendisse blandit at nulla quis finibus. Maecenas gravida nibh enim, elementum eleifend neque condimentum quis. Vestibulum ultricies massa purus, vel pellentesque nisl pellentesque et. In varius tortor nec diam fermentum, sed volutpat leo egestas. Sed et dictum enim. Aenean ut tristique orci. Praesent at dictum enim Donec sit amet pulvinar turpis. Fusce finibus enim a arcu pharetra varius. Maecenas ex lacus, aliquam quis lorem vel, aliquet molestie odio. Vivamus sollicitudin sodales augue, ac malesuada enim. Cras posuere maximus consectetur. Mauris varius, diam id aliquam auctor, ante risus dapibus mauris, nec vestibulum velit elit porta ex. Donec quis magna vitae purus laoreet maximus. Maecenas dictum facilisis tortor, sed consequat odio vulputate sit amet. Aenean tristique purus et sapien dignissim, ut rhoncus neque vehicula. Praesent sed mi sed nisi blandit feugiat. Cras fermentum augue eu orci lobortis, quis lobortis urna vehicula Maecenas mattis est at condimentum rhoncus. Maecenas nec molestie nunc, non hendrerit ex. Proin finibus fringilla sollicitudin. Suspendisse potenti. Sed nec aliquam arcu, sit amet egestas libero. Suspendisse finibus libero nisi, vel blandit nibh venenatis vel. Integer eu augue et justo tincidunt placerat. Aenean pretium ex vitae felis tincidunt, nec suscipit sem placerat. In dui orci, lobortis ut ante id, varius ullamcorper erat. Sed accumsan vehicula vulputate Quisque varius nibh sed nisi pulvinar aliquam. Vivamus tincidunt lectus convallis ipsum ultricies ullamcorper. Morbi tincidunt, tellus nec bibendum bibendum, dolor elit pharetra lorem, eget lacinia odio nulla vitae nunc. Suspendisse hendrerit justo ut sagittis sodales. Sed laoreet a lorem a fermentum. Ut mollis neque augue, at pharetra enim semper a. Suspendisse ac eleifend enim, non maximus nunc. Proin fermentum at turpis vel auctor. Integer in tristique massa. Interdum et malesuada fames ac ante ipsum primis in faucibus Aliquam rutrum posuere dolor nec malesuada. Phasellus luctus et nisi et cursus. Phasellus placerat mattis lorem, vel eleifend nibh fringilla sit amet. Sed nec volutpat elit. Donec consequat eget sapien vel tincidunt. Duis tincidunt nisi ac vestibulum interdum. Suspendisse non magna congue, rutrum sapien quis, finibus diam. Quisque dolor orci, iaculis ac sollicitudin sed, feugiat in erat Morbi viverra nulla bibendum nibh tempor egestas. Nam laoreet, nulla in congue egestas, dui turpis mattis ipsum, quis fringilla ex tortor ut tortor. Morbi tristique elit sit amet nulla eleifend, vel porttitor sem elementum. Pellentesque vitae facilisis magna. Etiam at mi lacinia, molestie purus sit amet, facilisis ante. Sed nisl arcu, condimentum sit amet vehicula sit amet, tempor a mauris. Donec ut odio ac massa eleifend aliquet a in neque Mauris varius erat urna, eget accumsan lacus tincidunt vel. Cras sit amet neque neque. Integer tempus eu lacus a porta. Vestibulum fringilla semper mi, sit amet aliquet orci scelerisque sed. Nullam fringilla nunc sit amet sagittis gravida. Vestibulum sodales nec quam nec scelerisque. Nunc vel elit quam. Praesent commodo auctor ex, ac iaculis orci ultricies ac. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Duis tincidunt purus nec nunc congue, sit amet dignissim elit gravida. Donec sem lectus, molestie ut scelerisque quis, tincidunt rhoncus enim. Etiam commodo, mauris id viverra placerat, justo urna sollicitudin sapien, id tempor libero odio sit amet nisl. Curabitur vel nisi ut ipsum porttitor rutrum a a turpis. Mauris imperdiet mauris vel tellus lacinia cursus. Nullam tincidunt imperdiet tortor. Integer sed dolor nec risus luctus interdum in quis ante Phasellus tincidunt laoreet tellus sit amet rhoncus. Vestibulum ultrices vulputate nisi vel posuere. Nulla facilisi. Nulla facilisi. Nunc in nunc magna. Donec lobortis enim sit amet mi egestas pharetra. Cras nulla quam, dapibus eget rhoncus non, euismod non massa Phasellus et ipsum diam. Proin gravida semper ante sit amet consectetur. Suspendisse mollis lacinia venenatis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam lacinia magna vel dictum commodo. Pellentesque ac pulvinar ipsum. Nunc tempor justo et suscipit tristique. Sed sed risus ac eros mattis dignissim sed quis odio. Aliquam molestie, ligula eu pellentesque sollicitudin, purus turpis venenatis ipsum, vitae ullamcorper tellus tellus eu ipsum. Donec sed tristique nibh Quisque ut aliquam sem, et tincidunt tellus. Vivamus orci tortor, mollis in posuere eget, dignissim a enim. Maecenas nisl libero, elementum et leo id, fermentum bibendum justo. Donec ac venenatis leo. Vestibulum id iaculis magna, non vehicula felis. Nullam vitae semper nibh. Sed fermentum ex nec porttitor dictum. Curabitur dictum quam metus, a vulputate turpis elementum non. Nullam vel ligula rutrum, eleifend ligula ut, congue est. Nullam finibus ligula quis diam facilisis facilisis. Morbi ultrices ante lectus, ut blandit dolor mollis sit amet. Nullam eu finibus dui. Donec porttitor eros sit amet luctus blandit. Nam congue urna id pulvinar fringilla. Duis fermentum finibus congue Sed mollis bibendum rutrum. Cras hendrerit elit id porttitor cursus. Morbi ut est eget odio accumsan faucibus sed eu erat. Suspendisse ut ligula id velit tincidunt vestibulum ac vel massa. Sed ornare mi at gravida dapibus. Curabitur sollicitudin vestibulum justo. Nam vestibulum cursus consequat Aliquam vestibulum mauris eu est feugiat, consectetur fermentum tellus ullamcorper. Nam auctor facilisis risus eget varius. In convallis velit eget neque suscipit, ac porta est venenatis. In id suscipit orci. Curabitur tincidunt efficitur nisi. Praesent efficitur, lectus non convallis aliquet, lacus mauris eleifend arcu, elementum vestibulum massa risus eu urna. Aenean interdum placerat ligula eget feugiat. Ut commodo est nec ante volutpat facilisis. Nulla facilisi. Sed sed turpis ut est finibus dapibus. Aenean tempor ex sit amet lorem congue scelerisque. Donec lacus ipsum, feugiat quis est iaculis, condimentum laoreet magna. Donec varius nec diam sed convallis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce nec magna purus Integer maximus dui lacus, a suscipit urna condimentum ut. Curabitur pellentesque leo at ex pulvinar blandit. Nunc non est vel nisl semper egestas at et arcu. Mauris non sollicitudin ante, ut varius sem. In eget felis quis tortor maximus rutrum eu in turpis. Etiam gravida massa suscipit purus posuere, ut consectetur nunc efficitur. In nec molestie ex. Aenean vel neque ut nisl tincidunt rhoncus. Nam congue placerat erat, sed mollis leo commodo vel. Quisque vestibulum sagittis rutrum. Fusce suscipit luctus enim, nec faucibus nibh elementum et Nam lacinia nunc quis consectetur consequat. Duis bibendum libero et molestie feugiat. Donec sed turpis laoreet, pellentesque neque ut, pretium magna. Aenean euismod vel ligula vel blandit. Cras vitae arcu posuere, euismod nulla aliquet, fermentum lectus. Donec imperdiet iaculis purus, sit amet faucibus magna iaculis eu. Nam dictum ullamcorper ipsum finibus iaculis Sed in ultricies diam, at pulvinar enim. Cras porta enim vel lacus volutpat, sit amet finibus enim eleifend. Vivamus sed ullamcorper tellus, id porta purus. Etiam ac libero eget nulla tempus rutrum sed aliquam lectus. Donec a diam in massa vestibulum sollicitudin in nec lorem. Nulla scelerisque, magna id scelerisque rhoncus, metus elit faucibus est, mollis dapibus risus nulla ac tellus. Nunc facilisis malesuada neque, varius ullamcorper purus commodo eu. Sed in lobortis magna Cras sed libero ligula. Nam et porttitor augue. Vestibulum a leo sem. Phasellus malesuada purus hendrerit urna vulputate fringilla. Curabitur pellentesque ipsum et mauris luctus, sed scelerisque velit fermentum. Pellentesque mi libero, ornare eget interdum ut, efficitur id lectus. Duis at mauris at urna auctor vestibulum. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras quis malesuada ipsum, sit amet auctor risus. Mauris mi nulla, consequat ut congue in, imperdiet a ipsum Praesent euismod tellus ut eros varius pellentesque. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse at dignissim tortor, et sollicitudin tortor. Pellentesque nec quam sed nisi blandit ultricies ac ac ante. Praesent id dolor a ligula facilisis euismod eu dictum neque. Fusce sit amet laoreet mi. Donec molestie odio gravida molestie varius. Fusce luctus lacus sed suscipit bibendum. Curabitur consequat volutpat ornare. Duis placerat tellus a felis molestie convallis. Vestibulum fermentum nisl sit amet dictum efficitur. Maecenas lectus turpis, bibendum sit amet dictum nec, dictum sed erat. Praesent et dui feugiat, congue nisi ut, convallis arcu Fusce accumsan vel nulla nec pretium. Suspendisse potenti. Suspendisse imperdiet vel libero quis imperdiet. Nullam consequat sodales lacus sit amet interdum. In maximus faucibus urna eget suscipit. Etiam in mollis dui, quis sodales tortor. In porta nisi sit amet finibus hendrerit. Donec dolor felis, lacinia rhoncus ornare a, convallis nec massa. Mauris suscipit, sapien id luctus auctor, risus nisi efficitur dolor, et ornare nunc neque ac metus. Sed id massa purus. Quisque varius justo tellus, a tempor augue lobortis sed Phasellus pulvinar commodo magna a auctor. Curabitur elementum urna et fermentum pulvinar. Donec ut consectetur est, id interdum tellus. Vivamus quis semper tellus. Aenean ornare eu massa vitae feugiat. Sed nec egestas nisi. Suspendisse eleifend neque sit amet quam blandit luctus. Donec fermentum laoreet elit, a lobortis ipsum lobortis quis Integer lobortis egestas pulvinar. Nullam dapibus varius dui ac convallis. Proin venenatis vestibulum diam nec accumsan. Suspendisse ultrices et mi a ullamcorper. Phasellus a diam nunc. Phasellus egestas blandit metus, vel varius massa consectetur sed. Pellentesque a tortor risus. Phasellus sagittis tempus odio, non porttitor velit tincidunt id. In nec porta sem. In tempor lacinia eleifend. Nunc in pretium arcu. Aliquam sit amet nisl in lectus pellentesque consectetur non at neque. Nullam non fermentum leo. Nam bibendum libero et lorem laoreet mattis. Etiam ac vulputate sem. Pellentesque sit amet mauris felis Proin suscipit, nisl consequat luctus vulputate, sem tellus convallis augue, id aliquet est leo vitae enim. Nunc dictum volutpat risus eget imperdiet. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nulla at enim vulputate, aliquam enim id, ornare turpis. Nam lacinia commodo pulvinar. In eu augue scelerisque, maximus ante eu, hendrerit metus. Morbi magna lacus, ultricies a facilisis sit amet, congue sed mi. Praesent non sapien ornare nibh iaculis mattis non et lorem. Nam eu scelerisque elit. Ut ornare magna non cursus mollis. Proin vitae nisi iaculis odio laoreet finibus vitae quis justo. Nunc scelerisque imperdiet augue, vitae tincidunt libero. Aenean semper nec nunc eget fringilla. Praesent eu viverra lectus. Aliquam vitae ornare erat Sed sollicitudin, lacus non tincidunt malesuada, sapien velit convallis ex, sit amet gravida enim orci vel velit. Nulla orci nunc, pulvinar ut metus nec, imperdiet accumsan tortor. Phasellus tempus pharetra leo, nec aliquam massa faucibus et. Integer eu lacus eget justo eleifend fermentum nec et quam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis sit amet ligula enim. Donec quis magna at tellus ullamcorper feugiat. Aliquam venenatis lectus ac ultricies ornare. Nam sed leo nec ipsum cursus finibus quis ut augue Aliquam ullamcorper lacus augue, et ultricies erat pharetra at. Mauris malesuada libero non efficitur pretium. Nam scelerisque eu tellus eget volutpat. Fusce non consequat mi, eu tristique purus. Etiam tincidunt justo sit amet efficitur consequat. Morbi et nisl dui. Donec vulputate augue in ultricies ultricies. Nunc tristique metus lectus, id finibus arcu venenatis ac. Suspendisse mattis magna sit amet velit scelerisque, convallis auctor metus porta. Nunc ac porta erat, nec volutpat ligula. Nulla convallis nisi leo, sit amet volutpat erat finibus blandit. Aliquam ac rutrum ipsum Pellentesque commodo ipsum sed purus tristique, et ultricies nibh tempor. Praesent eu luctus diam. Proin vel vulputate arcu. Suspendisse volutpat nisi turpis, vitae convallis sapien faucibus eu. Nulla aliquet massa vitae ultricies sagittis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempus dolor semper cursus blandit. Phasellus quis tempus ligula. Nunc convallis tellus iaculis odio venenatis, eu condimentum magna pretium. Nunc ultricies tempor velit, ac egestas purus luctus non. Fusce elementum nibh at aliquam aliquet. Proin auctor, tortor non fermentum porta, orci magna suscipit purus, sit amet sagittis turpis nibh quis elit Etiam vitae urna id tellus feugiat tincidunt. Aenean eget nunc varius, lacinia nisl sit amet, finibus magna. Integer ac tortor eget metus gravida pulvinar. Aenean eu nulla a leo porttitor egestas porttitor at ipsum. Donec sed ipsum elementum, ullamcorper orci eget, maximus sapien. Donec nec nunc viverra, mattis massa nec, rutrum ex. Aenean vel erat in nisl vulputate fermentum in ac elit. In non leo id nulla scelerisque tempor nec quis leo. Praesent in erat vel sem ornare vehicula Donec vel tellus faucibus augue sagittis viverra. Nulla maximus ex sed ex ultrices, in blandit libero tempus. Praesent molestie nulla odio, molestie pharetra arcu lobortis a. Vivamus volutpat purus nec massa sodales, eu gravida ipsum suscipit. Cras pretium dui ut neque tempus eleifend. Quisque vel iaculis augue, at semper felis. Etiam interdum ac erat ut feugiat. Maecenas rhoncus justo non orci commodo, in feugiat urna sagittis. In malesuada enim et fringilla sodales. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras rutrum, ipsum ac varius lacinia, erat erat pharetra felis, ut fermentum justo tortor et leo. Integer eget congue nibh, id finibus velit. Duis a neque mauris. Maecenas id risus non erat mattis tempor. Aenean vehicula ex leo, ut gravida elit euismod nec. Quisque molestie viverra lacus, quis bibendum dolor. Phasellus at nisi fermentum, pretium nibh at, placerat lacus. Maecenas quis commodo sapien. Pellentesque vehicula cursus mollis. Nulla id libero gravida, viverra urna hendrerit, varius ipsum. Vestibulum at nisi ullamcorper mauris posuere aliquam. Fusce ac libero ullamcorper, blandit nulla non, egestas libero. Cras ut fermentum nibh, quis aliquet mauris. Nam fermentum augue ac vehicula rhoncus. Curabitur fermentum consectetur euismod. Donec urna ante, ornare quis ipsum a, rutrum tempor odio. Pellentesque sapien augue, congue in aliquet sit amet, sagittis eget libero. Etiam sit amet tellus vitae mi tempus vestibulum. Vivamus turpis mi, eleifend porttitor viverra at, pharetra eu est. Donec condimentum ut neque at faucibus. Aenean sit amet ipsum purus. Mauris et varius lacus. In enim leo, luctus id volutpat ac, interdum sed est. Aliquam porttitor justo quis lorem mollis, ut sagittis felis consectetur. Phasellus placerat nunc orci, sit amet hendrerit arcu scelerisque porttitor. Etiam rutrum mollis nisi in fermentum. Nullam vestibulum quis ex sit amet pretium. Praesent aliquet elit nunc, nec ullamcorper est semper non. Nunc efficitur nec magna sed elementum. Fusce placerat mi eget tortor tristique ultrices. Pellentesque malesuada et dolor quis dignissim. Ut in viverra dui, blandit dignissim lacus. Suspendisse viverra enim quis fermentum aliquet. Quisque eget urna dui. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Duis vitae ipsum ipsum. Sed tortor nulla, ornare in est at, consequat condimentum dui. Nulla laoreet maximus ipsum. Vivamus nisl dui, facilisis id lobortis eget, semper sit amet metus. Nullam vulputate commodo diam, sit amet tincidunt purus euismod at. Aliquam ac condimentum eros. Ut eu est sit amet arcu tempor pulvinar id in mi. Donec euismod quis ipsum vitae volutpat. Phasellus sit amet urna felis. Sed et neque at leo molestie posuere vitae ut odio. Phasellus nec tristique diam, at porta augue. Maecenas et nibh ut lectus pharetra eleifend. Integer blandit sem nulla, a pharetra diam maximus vitae. Nunc massa turpis, commodo nec orci id, vulputate convallis risus. Nunc eleifend consectetur odio, vitae pretium lectus. Nullam vitae fermentum ex. Praesent ut neque a mi volutpat egestas id et sapien. Etiam magna nisi, ullamcorper vel sagittis at, ultrices sit amet est. Mauris rhoncus purus fringilla, sagittis mi in, laoreet mi. Curabitur purus odio, vulputate et ornare quis, pretium in ipsum. Donec orci ligula, maximus enim id, porta fringilla libero. Aliquam nunc velit, pharetra nec dignissim non, vulputate nec lectus. Q.E.D.'
### core/tests/mock_wire_interface.py
@@ -2,7 +2,6 @@
class MockHID:
-
TX_PACKET_LEN = 64
RX_PACKET_LEN = 64
### core/tests/test_apps.bitcoin.approver.py
@@ -21,7 +21,6 @@
class TestApprover(TestCaseWithContext):
-
def setUp(self):
self.coin = coins.by_name("Bitcoin")
self.fee_rate_percent = 0.3
### core/tests/test_apps.bitcoin.authorization.py
@@ -14,7 +14,6 @@
class TestAuthorization(TestCaseWithContext):
-
coin = coins.by_name("Bitcoin")
def setUp(self):
### core/tests/test_apps.bitcoin.keychain.py
@@ -13,7 +13,6 @@
class TestBitcoinKeychain(TestCaseWithContext):
-
if utils.USE_THP:
def setUp(self):
### core/tests/test_apps.bitcoin.zcash.zip243.py
@@ -15,7 +15,6 @@
# test vectors inspired from https://github.com/zcash-hackworks/zcash-test-vectors/blob/master/zip_0243.py
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
class TestZcashZip243(unittest.TestCase):
-
VECTORS = [
{
"expiry": 71895707,
### core/tests/test_apps.cardano.address.py
@@ -2,7 +2,6 @@
from common import * # isort:skip
if not utils.BITCOIN_ONLY:
-
from trezor import wire
from trezor.crypto import bip39, cardano, slip39
from trezor.enums import CardanoAddressType
### core/tests/test_apps.cardano.certificate.py
@@ -2,7 +2,6 @@
from common import * # isort:skip
if not utils.BITCOIN_ONLY:
-
from trezor import wire
from trezor.enums import CardanoCertificateType, CardanoDRepType
from trezor.messages import (
### core/tests/test_apps.cardano.credential.py
@@ -2,7 +2,6 @@
from common import * # isort:skip
if not utils.BITCOIN_ONLY:
-
from trezor.enums import CardanoAddressType
from trezor.messages import (
CardanoAddressParametersType,
### core/tests/test_apps.common.definitions.py
@@ -4,7 +4,6 @@
from trezor import wire
if not utils.BITCOIN_ONLY:
-
from ethereum_common import *
from trezor.enums import DefinitionType
from trezor.messages import EthereumNetworkInfo, EthereumTokenInfo, SolanaTokenInfo
### core/tests/test_apps.common.keychain.py
@@ -17,7 +17,6 @@
class TestKeychain(TestCaseWithContext):
-
if not utils.USE_THP:
def setUp(self):
### core/tests/test_apps.common.payment_request.py
@@ -158,7 +158,6 @@ def _get_coin_swap_request(include_nonce=b"DEBUG NONCE") -> PaymentRequest:
class TestPaymentRequestVerfier(unittest.TestCase):
-
@patch_prod
def test_payment_requests_unsupported_in_prod_without_memos(self):
### core/tests/test_apps.ethereum.clear_signing.py
@@ -4,7 +4,6 @@
import unittest
if not utils.BITCOIN_ONLY:
-
from ethereum_common import *
from trezor.enums import EthereumERC7730FieldFormatterType as FT
from trezor.messages import (
### core/tests/test_apps.ethereum.definitions.py
@@ -7,7 +7,6 @@
from trezor import wire
if not utils.BITCOIN_ONLY:
-
from ethereum_common import *
from trezor.messages import EthereumNetworkInfo, EthereumTokenInfo
### core/tests/test_apps.evolu.check_evolu.py
@@ -4,7 +4,6 @@
@unittest.skipUnless(utils.USE_OPTIGA, "only needed with Optiga")
class TestCheckEvoluCommandsRegistrationRequest(unittest.TestCase):
-
def test_proof_sign_registration_request(self):
from trezorutils import delegated_identity
### core/tests/test_apps.solana.offchain_message.py
@@ -44,7 +44,6 @@
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
class TestMessageV1(unittest.TestCase):
-
def serialize(self, signers=None, message=MSG):
msg = SolanaOffchainMessageV1(
message=message,
### core/tests/test_storage.cache.py
@@ -36,7 +36,6 @@ def get_active_session():
class TestStorageCache(TestCaseWithContext):
-
if utils.USE_THP:
def setUp(self):
### core/tests/test_storage.py
@@ -6,7 +6,6 @@
class TestConfig(unittest.TestCase):
-
def setUp(self):
config.init()
config.wipe()
### core/tests/test_trezor.crypto.aes.py
@@ -5,7 +5,6 @@
class TestCryptoAes(unittest.TestCase):
-
# test vectors from NIST Special Publication 800-38A (Appendix F)
# https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-38a.pdf
### core/tests/test_trezor.crypto.aesgcm.py
@@ -5,7 +5,6 @@
class TestCryptoAes(unittest.TestCase):
-
# test vectors from
# https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/mac/gcmtestvectors.zip
### core/tests/test_trezor.crypto.base32.py
@@ -5,7 +5,6 @@
class TestCryptoBase32(unittest.TestCase):
-
# test vectors from:
# https://tools.ietf.org/html/rfc4648
# https://github.com/emn178/hi-base32/blob/master/tests/test.js
### core/tests/test_trezor.crypto.base58.py
@@ -10,7 +10,6 @@ def digestfunc_graphene(x):
class TestCryptoBase58(unittest.TestCase):
-
# vectors from https://github.com/bitcoin/bitcoin/blob/master/src/test/data/base58_keys_valid.json
vectors = [
(
### core/tests/test_trezor.crypto.chacha20poly1305.py
@@ -9,7 +9,6 @@
class TestCryptoChaCha20Poly1305(unittest.TestCase):
-
vectors = [
# from https://github.com/wg/c20p1305/blob/master/rfc7539_test.c
(
### core/tests/test_trezor.crypto.crc.py
@@ -5,7 +5,6 @@
class TestCryptoCrc(unittest.TestCase):
-
vectors_crc32 = [
("123456789", 0xCBF43926),
(
### core/tests/test_trezor.crypto.curve.curve25519.py
@@ -5,7 +5,6 @@
class TestCryptoCurve25519(unittest.TestCase):
-
vectors = [
(
"38c9d9b17911de26ed812f5cc19c0029e8d016bcbc6078bc9db2af33f1761e4a",
### core/tests/test_trezor.crypto.curve.ed25519.py
@@ -6,7 +6,6 @@
class TestCryptoEd25519(unittest.TestCase):
-
# vectors from https://github.com/torproject/tor/blob/master/src/test/ed25519_vectors.inc
vectors = [
(
### core/tests/test_trezor.crypto.curve.nist256p1.py
@@ -6,7 +6,6 @@
class TestCryptoNist256p1(unittest.TestCase):
-
# vectors from http://point-at-infinity.org/ecc/nisttv
vectors = [
(
### core/tests/test_trezor.crypto.der.py
@@ -5,7 +5,6 @@
class TestCryptoDer(unittest.TestCase):
-
vectors_sig = (
(
(
### core/tests/test_trezor.crypto.hashlib.blake256.py
@@ -5,7 +5,6 @@
class TestCryptoBlake256(unittest.TestCase):
-
# vectors from https://raw.githubusercontent.com/monero-project/monero/master/tests/hash/tests-extra-blake.txt
vectors = [
### core/tests/test_trezor.crypto.hashlib.blake2b.py
@@ -5,7 +5,6 @@
class TestCryptoBlake2b(unittest.TestCase):
-
# vectors from https://raw.githubusercontent.com/BLAKE2/BLAKE2/master/testvectors/blake2b-kat.txt
vectors = [
(
### core/tests/test_trezor.crypto.hashlib.blake2s.py
@@ -5,7 +5,6 @@
class TestCryptoBlake2s(unittest.TestCase):
-
# vectors from https://raw.githubusercontent.com/BLAKE2/BLAKE2/master/testvectors/blake2s-kat.txt
vectors = [
### core/tests/test_trezor.crypto.hashlib.groestl512.py
@@ -5,7 +5,6 @@
class TestCryptoGroestl512(unittest.TestCase):
-
# vectors from www.groestl.info/Groestl.zip #/KAT_MCT/*
vectors = [
(
### core/tests/test_trezor.crypto.hashlib.ripemd160.py
@@ -5,7 +5,6 @@
class TestCryptoRipemd160(unittest.TestCase):
-
# vectors from http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
vectors = [
(b"", "9c1185a5c5e9fc54612808977ee8f548b2258d31"),
### core/tests/test_trezor.crypto.hashlib.sha256.py
@@ -5,7 +5,6 @@
class TestCryptoSha256(unittest.TestCase):
-
# vectors from http://www.di-mgt.com.au/sha_testvectors.html
vectors = [
(b"", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"),
### core/tests/test_trezor.crypto.hashlib.sha3_256.py
@@ -5,7 +5,6 @@
class TestCryptoSha3_256(unittest.TestCase):
-
# vectors from http://www.di-mgt.com.au/sha_testvectors.html
vectors = [
(b"", "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a"),
### core/tests/test_trezor.crypto.hashlib.sha3_512.py
@@ -5,7 +5,6 @@
class TestCryptoSha3_512(unittest.TestCase):
-
# vectors from https://www.di-mgt.com.au/sha_testvectors.html
vectors = [
(
### core/tests/test_trezor.crypto.hashlib.sha512.py
@@ -5,7 +5,6 @@
class TestCryptoSha512(unittest.TestCase):
-
# vectors from http://www.di-mgt.com.au/sha_testvectors.html
vectors = [
(
### core/tests/test_trezor.crypto.hmac.py
@@ -5,7 +5,6 @@
class TestCryptoHmac(unittest.TestCase):
-
# vectors from https://tools.ietf.org/html/rfc4231
def test_digest(self):
### core/tests/test_trezor.crypto.pbkdf2.py
@@ -5,7 +5,6 @@
class TestCryptoPbkdf2(unittest.TestCase):
-
# vectors from https://stackoverflow.com/questions/5130513/pbkdf2-hmac-sha2-test-vectors
def test_pbkdf2_hmac_sha256(self):
### core/tests/test_trezor.crypto.rlp.py
@@ -5,7 +5,6 @@
class TestCryptoRlp(unittest.TestCase):
-
# from https://raw.githubusercontent.com/ethereum/pyrlp/develop/tests/rlptest.json
vectors = [
(b"", "80"),
### core/tests/test_trezor.protobuf.py
@@ -2,7 +2,6 @@
from common import * # isort:skip
if not utils.BITCOIN_ONLY:
-
from trezor import protobuf
from trezor.messages import (
ApplySettings,
### core/tests/test_trezor.ui.display.py
@@ -6,7 +6,6 @@
class TestDisplay(unittest.TestCase):
-
def test_orientation(self):
for o in [0, 90, 180, 270]:
display.orientation(o)
### core/tests/test_trezor.ui.select_menu.py
@@ -26,7 +26,6 @@ def click(layout, x, y):
@unittest.skipUnless(utils.UI_LAYOUT == "BOLT", "Bolt layout only")
class TestSelectMenu(unittest.TestCase):
-
ITEMS = ["Alpha", "Beta"]
def make_menu(self, items=None, cancel="Cancel"):
### core/tests/thp_common.py
@@ -54,7 +54,6 @@ def _encrypt_patch() -> patch:
return patch(Channel, "_encrypt", lambda self, buffer, noise_payload_len: None)
class PatchedChannel:
-
def __init__(self) -> None:
self.inner_channel = context.get_channel_context()
self.original_write = self.inner_channel.write
### core/tests/unittest.py
@@ -229,7 +229,6 @@ def addTest(self, cls):
class TestRunner:
-
def __init__(self):
if __debug__ and DISABLE_LOG:
from trezor.utils import USE_DBG_CONSOLE
### core/tools/analyze-memory-dump.py
@@ -79,7 +79,6 @@ def deref_or_shortval(maybe_ptr: Any) -> Any:
class Item:
-
def __init__(self, item: Any) -> None:
self.item = item
self.backlinks = []
### core/tools/bluez-emu-bridge.py
@@ -19,8 +19,13 @@
from pathlib import Path
import click
-from bluez_emu_bridge import MessageBus # normally lives in dbus_fast.aio
-from bluez_emu_bridge import Adapter1, Device1, GattCharacteristic1, GattService1
+from bluez_emu_bridge import (
+ Adapter1,
+ Device1,
+ GattCharacteristic1,
+ GattService1,
+ MessageBus, # normally lives in dbus_fast.aio
+)
from typing_extensions import Self
from trezorlib._internal.emu_ble import Event
@@ -86,7 +91,6 @@ def close(self) -> None:
class TrezorEmulator:
-
def __init__(
self,
data_transport: asyncio.DatagramTransport,
### core/tools/codegen/gen_font.py
@@ -329,7 +329,6 @@ def to_bytes(self, bpp: int) -> bytes:
class FaceProcessor:
-
def __init__(
self,
name: str,
@@ -409,7 +408,6 @@ def write_files(self) -> None:
def write_foreign_json(self, upper_cased: bool = False) -> None:
for lang, language_chars in all_languages.items():
-
fontdata = {"glyphs": {}, "kernings": []}
for item in language_chars:
@@ -443,7 +441,6 @@ def write_foreign_json(self, upper_cased: bool = False) -> None:
]
for left_char in all_lang_chars:
-
left_c = _normalize(left_char)
if not self._char_supported(left_c):
@@ -455,7 +452,6 @@ def write_foreign_json(self, upper_cased: bool = False) -> None:
continue
for right_char in all_lang_chars:
-
right_c = _normalize(right_char)
if right_c.islower() and upper_cased and right_c != "ß":
right_c = right_c.upper()
@@ -470,7 +466,6 @@ def write_foreign_json(self, upper_cased: bool = False) -> None:
kern_val = self._get_kerning(ord(left_c), ord(right_c))
if kern_val != 0:
-
fontdata["kernings"].append(
(left_char, right_char, kern_val)
)
### core/tools/generate_hsm_keys.py
@@ -22,7 +22,7 @@
def c_bytes(hex_str: str) -> str:
return (
"{"
- + ", ".join(f"0x{hex_str[i:i + 2]}" for i in range(0, len(hex_str), 2))
+ + ", ".join(f"0x{hex_str[i : i + 2]}" for i in range(0, len(hex_str), 2))
+ "}"
)
### core/tools/hid-bridge/udp_interface.py
@@ -5,7 +5,6 @@
class UDPInterface:
-
def __init__(self, destination_port: int) -> None:
self.bind_ip = "127.0.0.1"
self.bind_port = 21423
### core/tools/make_cmakelists.py
@@ -6,7 +6,6 @@ def gen(sources: Iterable[str], dirs: Iterable[str], defs: Iterable[str]) -> Non
target = "CMakeLists.txt"
with open(target, "w") as f:
-
f.write("cmake_minimum_required(VERSION 3.20)\n")
f.write("project(core)\n")
f.write("\n")
### core/tools/size/groups.py
@@ -25,25 +25,21 @@ def _categories_func(row: DataRow) -> str | None:
# Defined inside the function so it can be seen in the function definition
# (which is optionally printed)
CATEGORIES: dict[str, Callable[[DataRow], bool]] = {
- "UI": lambda row: (
- row.source_definition.startswith(
- ("src/trezor/ui/", "embed/upymod/modtrezorui/")
+ "UI": lambda row: row.source_definition.startswith(
+ ("src/trezor/ui/", "embed/upymod/modtrezorui/")
+ ),
+ "Crypto": lambda row: row.source_definition.startswith(
+ (
+ "vendor/trezor-crypto/",
+ "src/trezor/crypto/",
+ "embed/upymod/modtrezorcrypto/",
)
),
- "Crypto": lambda row: (
- row.source_definition.startswith(
- (
- "vendor/trezor-crypto/",
- "src/trezor/crypto/",
- "embed/upymod/modtrezorcrypto/",
- )
- )
- ),
- "Secp256": lambda row: (
- row.source_definition.startswith("vendor/secp256k1-zkp/")
+ "Secp256": lambda row: row.source_definition.startswith(
+ "vendor/secp256k1-zkp/"
),
- "Storage": lambda row: (
- row.source_definition.startswith(("src/storage/", "vendor/trezor-storage/"))
+ "Storage": lambda row: row.source_definition.startswith(
+ ("src/storage/", "vendor/trezor-storage/")
),
"Micropython": lambda row: row.source_definition.startswith(
"vendor/micropython/"
@@ -65,17 +61,15 @@ def _categories_func(row: DataRow) -> str | None:
"Webauthn app": lambda row: row.source_definition.startswith(
"src/apps/webauthn/"
),
- "Altcoin apps": lambda row: (
- row.source_definition.startswith(
- (
- "src/apps/nem/",
- "src/apps/stellar/",
- "src/apps/eos/",
- "src/apps/tezos/",
- "src/apps/tron/",
- "src/apps/ripple/",
- "src/apps/zcash/",
- )
+ "Altcoin apps": lambda row: row.source_definition.startswith(
+ (
+ "src/apps/nem/",
+ "src/apps/stellar/",
+ "src/apps/eos/",
+ "src/apps/tezos/",
+ "src/apps/tron/",
+ "src/apps/ripple/",
+ "src/apps/zcash/",
)
),
"Other apps": lambda row: row.source_definition.startswith("src/apps/"),
### core/tools/trezor_core_tools/bootloader_hashes.py
@@ -105,11 +105,9 @@ def main(check: bool) -> None:
models = [model for model in models if model.is_dir()]
for model in models:
-
path = model / "bootloaders"
if path.is_dir():
-
header_file = path / "bootloader_hashes.h"
patterns = []
### core/tools/trezor_core_tools/lsgen.py
@@ -29,7 +29,6 @@ def main(check: bool) -> None:
models = [model for model in models if model.is_dir()]
for model, split in itertools.product(models, [False, True]):
-
path = get_layout_for_model(model.name, split)
if not path.exists():
continue
### crypto/fuzzer/extract_fuzzer_dictionary.py
@@ -215,7 +215,6 @@ def detect_and_convert_hex(data):
global counter_wycheproof_hex_reconstruction
match_result1 = regex_hex_character_input_complete.search(data)
if match_result1:
-
match_result2 = regex_hex_character_input_inner.search(match_result1.string)
isolated_substring = match_result2.group(0)
if len(isolated_substring) % 2 == 1:
### docs/core/misc/codestyle.md
@@ -57,21 +57,25 @@ at top level. The style for doing that are as follows:
### Tools
-Configurations of specific Python style tools (`isort`, `flake8`, `pylint`) can be found
-in root [`setup.cfg`].
+Configuration of the Python style tools can be found in root [`pyproject.toml`]
+(ruff) and [`setup.cfg`] (flake8, pylint).
[`setup.cfg`]: https://github.com/trezor/trezor-firmware/blob/master/setup.cfg
+[`pyproject.toml`]: https://github.com/trezor/trezor-firmware/blob/master/pyproject.toml
+
+We use [ruff](https://docs.astral.sh/ruff/) to organize imports, to auto-format
+code, and to enforce PEP 585/604 annotation style.
#### Formatting
-We are auto-formatting code with `black` and use the [`black` code
+Code is auto-formatted with `ruff format`, which follows the [`black` code
style](https://black.readthedocs.io/en/stable/the_black_code_style/index.html).
-We use `isort` to organize imports.
+Import sections are organized by ruff's isort rules (`I`).
#### Linting
-We use `flake8` lints, disabling only those that conflict with `black` code style.
+We use `flake8` lints, disabling only those that conflict with the formatter.
We use a select subset of `pylint` checks that are hard-enforced.
### pyproject.toml
@@ -24,9 +24,7 @@ dependencies = [
"fido2>=0.8.0,<0.9",
"python-bitcoinlib>=0.11.0,<0.12",
"typing-extensions>=4.7.1",
- "isort>=5,<6",
"flake8>=7",
- "black>=24.2",
"mako>=1.3.10,<2",
"munch>=4,<5",
"autoflake",
@@ -54,12 +52,12 @@ dependencies = [
"toiftool ; python_version >= '3.8'",
"trezor-pylint-plugin",
"trezor-core-tools",
- "flake8-annotations>=3.1.1,<4",
"pyelftools>=0.32,<0.33",
"pytest-retry>=1.7.0,<2",
"slh-dsa>=0.1.3,<0.2",
"bleak>=1.1.0",
"construct-typing>=0.7.0",
+ "flake8-annotations>=3.1.1,<4",
]
[dependency-groups]
@@ -80,9 +78,32 @@ toiftool = { path = "./python/tools/toiftool", editable = true }
trezor-pylint-plugin = { path = "./tools/trezor-pylint-plugin", editable = true }
trezor-core-tools = { path = "./core/tools", editable = true }
-[tool.isort]
-profile = "black"
-extra_standard_library = [
+# Ruff replaces `isort` and `black` (import sorting, formatting) and enforces
+# the PEP 585/604 annotation style. All other Python style checks are still
+# handled by flake8 / pylint -- see setup.cfg and .pylintrc.
+# The set of files to lint is not configured here -- the Makefiles pass it in,
+# so that ruff covers exactly what every other style tool covers
+# (tools/style.py.include, python/Makefile).
+[tool.ruff]
+target-version = "py310"
+# `python` is a published library that still supports 3.9 (see python/pyproject.toml)
+per-file-target-version = { "python/**/*.py" = "py39" }
+
+[tool.ruff.lint]
+select = [
+ # isort
+ "I",
+ # PEP 585
+ "UP006", # non-pep585-annotation: typing.Tuple -> tuple, typing.Type -> type, ...
+ "UP035", # deprecated-import: typing.Sequence -> collections.abc.Sequence, ...
+
+ # PEP 604 (used in /core only)
+ "UP007", # non-pep604-annotation-union: Union[int, str] -> int | str
+ "UP045", # non-pep604-annotation-optional: Optional[str] -> str | None
+]
+
+[tool.ruff.lint.isort]
+extra-standard-library = [
"buffer_types",
"micropython",
"uctypes",
@@ -95,28 +116,9 @@ extra_standard_library = [
"trezorcrypto",
"vfs",
]
-known_first_party = ["trezorlib", "apps", "coin_info", "marketcap", "ui_tests"]
-known_third_party = ["trezor", "storage"]
-
-# Ruff is used as a PEP 585 linter only; all other Python style checks are
-# handled by flake8 / isort / black / pylint. The set of files to lint is not
-# configured here -- the Makefiles pass it in, so that ruff covers exactly what
-# every other style tool covers (tools/style.py.include, python/Makefile).
-[tool.ruff]
-target-version = "py310"
-# `python` is a published library that still supports 3.9 (see python/pyproject.toml)
-per-file-target-version = { "python/**/*.py" = "py39" }
-
-[tool.ruff.lint]
-select = [
- # PEP 585
- "UP006", # non-pep585-annotation: typing.Tuple -> tuple, typing.Type -> type, ...
- "UP035", # deprecated-import: typing.Sequence -> collections.abc.Sequence, ...
-
- # PEP 604 (used in /core only)
- "UP007", # non-pep604-annotation-union: Union[int, str] -> int | str
- "UP045", # non-pep604-annotation-optional: Optional[str] -> str | None
-]
+# `python` is needed for `from python.src.storage import ...` in storage tests
+known-first-party = ["trezorlib", "apps", "coin_info", "marketcap", "ui_tests", "python"]
+known-third-party = ["trezor", "storage"]
[tool.ruff.lint.per-file-ignores]
# PEP 604 syntax needs Python 3.10 - cannot be enforced e.g. in /python as it still supports Python 3.9.
### python/Makefile
@@ -4,9 +4,6 @@ UV=uv
EXCLUDES=.vscode
STYLE_TARGETS=src tests tools helper-scripts
-# suppress black's warning
-BLACK_FLAGS ?=--fast
-
dist: doc clean
$(UV) build
@@ -41,23 +38,21 @@ git-clean:
git clean -dfx -e $(EXCLUDES)
style:
- black $(BLACK_FLAGS) $(STYLE_TARGETS)
- isort $(STYLE_TARGETS)
- autoflake -i --remove-all-unused-imports -r $(STYLE_TARGETS)
ruff check --fix $(STYLE_TARGETS)
+ ruff format $(STYLE_TARGETS)
+ autoflake -i --remove-all-unused-imports -r $(STYLE_TARGETS)
flake8
make pyright
style_check:
- black --check $(BLACK_FLAGS) $(STYLE_TARGETS)
- isort --check-only $(STYLE_TARGETS)
ruff check $(STYLE_TARGETS)
+ ruff format --check $(STYLE_TARGETS)
flake8
make pyright
style_quick_check:
- black --check $(BLACK_FLAGS) $(STYLE_TARGETS)
- isort --check-only $(STYLE_TARGETS)
+ ruff format --check $(STYLE_TARGETS)
+ ruff check --select I $(STYLE_TARGETS)
.PHONY: all build install clean doc doc_check style style_check git-clean clean-build clean-pyc clean-test
### python/pyproject.toml
@@ -98,9 +98,7 @@ exclude = [
[dependency-groups]
dev = [
"autoflake>=2.3.1",
- "black>=25",
"flake8>=2.3.0",
- "isort>=5.13.2",
"pytest>=8.3.5",
"pytest-random-order>=1.2.0",
"tox>=4.25.0",
### python/setup.cfg
@@ -34,9 +34,6 @@ per-file-ignores =
tests/*:I,A
known-modules = libusb1:[usb1],hidapi:[hid],PyQt5:[PyQt5.QtWidgets,PyQt5.QtGui,PyQt5.QtCore],noiseprotocol:[noise]
-[isort]
-profile = black
-
[mypy]
check_untyped_defs = True
show_error_codes = True
### python/src/trezorlib/_internal/emu_ble.py
@@ -116,7 +116,6 @@ class Command(Struct):
# You should probably use bluez-emu-bridge instead of this transport directly
# as it does not implement any BLE connection management logic.
class EmuBleTransport(Transport):
-
DEFAULT_HOST = "127.0.0.1"
DEFAULT_PORT = 21328
PATH_PREFIX = "emuble"
### python/src/trezorlib/_internal/translations.py
@@ -324,7 +324,6 @@ def from_file(cls, file_path: Path) -> Self:
class KerningTable(BlobTable):
-
@classmethod
def from_dir(cls, model_fonts: dict[str, str], font_dir: Path) -> "KerningTable":
"""Example structure of the font dict:
### python/src/trezorlib/cli/__init__.py
@@ -53,7 +53,6 @@
class ChoiceType(click.Choice):
-
def __init__(self, typemap: dict[str, t.Any], case_sensitive: bool = True) -> None:
super().__init__(list(typemap.keys()))
self.case_sensitive = case_sensitive
### python/src/trezorlib/cli/benchmark.py
@@ -23,7 +23,6 @@
from . import with_session
if TYPE_CHECKING:
-
from ..client import Session
### python/src/trezorlib/cli/device.py
@@ -529,8 +529,7 @@ def format(self, record: logging.LogRecord) -> str:
allowlist = authentication.AllowList(req.json())
except Exception as e:
raise click.ClickException(
- f"Failed to download allow list: {e}"
- "\nUse --offline to skip the check."
+ f"Failed to download allow list: {e}\nUse --offline to skip the check."
) from e
try:
### python/src/trezorlib/cli/firmware.py
@@ -486,8 +486,8 @@ def cli() -> None:
"""Firmware commands."""
-@cli.command()
# fmt: off
+@cli.command()
@click.argument("filename", type=click.File("rb"))
@click.option("-c", "--check-device", is_flag=True, help="Validate device compatibility")
@click.option("--fingerprint", help="Expected firmware fingerprint in hex")
@@ -527,8 +527,8 @@ def verify(
)
-@cli.command()
# fmt: off
+@cli.command()
@click.option("-o", "--output", type=click.File("wb"), help="Output file to save firmware data to")
@click.option("-v", "--version", help="Which version to download")
@click.option("-m", "--model", type=MODEL_CHOICE, help="Which model to download firmware for")
@@ -586,8 +586,8 @@ def download(
click.echo(f"Firmware saved under {output.name}.")
-@cli.command()
# fmt: off
+@cli.command()
@click.option("-f", "--filename", type=click.File("rb"), help="File containing firmware data")
@click.option("-u", "--url", help="Where to get the firmware from - full link")
@click.option("-v", "--version", help="Which version to download")
### python/src/trezorlib/debuglink.py
@@ -55,7 +55,6 @@
Coords = tuple[int, int]
class InputFunc(Protocol):
-
def __call__(
self,
hold_ms: int | None = None,
### python/src/trezorlib/firmware/sanity_struct.py
@@ -54,7 +54,6 @@ def __str__(self) -> str:
class SanityCheckedStruct(Struct):
-
@classmethod
def parse(
cls: type[Self], data: bytes, *, strict: bool = STRICT_SANITY_CHECK_DEFAULT
@@ -104,7 +103,6 @@ def _subcons_sanity_check(self, errors: list[str]) -> bool:
is_ok = True
for name, value in subcon_fields:
-
# Skip private fields
if name[0] == "_":
continue
### python/src/trezorlib/firmware/util.py
@@ -35,7 +35,6 @@ class Unsigned(FirmwareIntegrityError):
class DigestCalculator(Protocol):
-
def update(self, __data: bytes) -> None: ...
def digest(self) -> bytes: ...
### python/src/trezorlib/stellar.py
@@ -45,9 +45,8 @@
]
try:
- from stellar_sdk import AccountMerge
- from stellar_sdk import Address as StellarAddress
from stellar_sdk import (
+ AccountMerge,
AllowTrust,
Asset,
BumpSequence,
@@ -76,6 +75,7 @@
TrustLineEntryFlag,
xdr,
)
+ from stellar_sdk import Address as StellarAddress
HAVE_STELLAR_SDK = True
# Protocol 27 XDR (SOROBAN_CREDENTIALS_ADDRESS_V2 etc.) is only available
### python/src/trezorlib/testing/common.py
@@ -5,7 +5,6 @@
from ..debuglink import LayoutType
if TYPE_CHECKING:
-
from ..debuglink import DebugLink
### python/src/trezorlib/transport/__init__.py
@@ -69,7 +69,6 @@ def enumerate(
@classmethod
def find_by_path(cls, path: str, prefix_search: bool = False) -> tx.Self:
for device in cls.enumerate():
-
if device.get_path() == path:
return device
### python/src/trezorlib/transport/ble.py
@@ -55,7 +55,6 @@
class BleTransport(Transport):
-
ENABLED = BLEAK_IMPORTED
PATH_PREFIX = "ble"
CHUNK_SIZE = 244
### python/src/trezorlib/transport/udp.py
@@ -55,7 +55,6 @@ def _discard_expired(self, now: float) -> None:
class UdpTransport(Transport):
-
DEFAULT_HOST = "127.0.0.1"
DEFAULT_PORT = 21324
PATH_PREFIX = "udp"
### storage/tests/python/tests/test_norcow_qw.py
@@ -228,7 +228,8 @@ def test_norcow_get_item_qw_long():
assert value == b"1231231231231"
assert (
n._dump()[0][:128].hex()
- == consts.NORCOW_MAGIC_AND_VERSION.hex() + "0000000000000000"
+ == consts.NORCOW_MAGIC_AND_VERSION.hex()
+ + "0000000000000000"
"01000d00000000000000000000000000"
"31323331323331323331323331ffffff"
"02000d00000000000000000000000000"
@@ -244,7 +245,8 @@ def test_norcow_get_item_qw_long():
assert value == b"7897897897897"
assert (
n._dump()[0][:128].hex()
- == consts.NORCOW_MAGIC_AND_VERSION.hex() + "0000000000000000"
+ == consts.NORCOW_MAGIC_AND_VERSION.hex()
+ + "0000000000000000"
"01000d00000000000000000000000000"
"31323331323331323331323331ffffff"
"02000d00000000000000000000000000"
@@ -260,7 +262,8 @@ def test_norcow_get_item_qw_long():
assert value == b"7887887887887"
assert (
n._dump()[0][:160].hex()
- == consts.NORCOW_MAGIC_AND_VERSION.hex() + "0000000000000000"
+ == consts.NORCOW_MAGIC_AND_VERSION.hex()
+ + "0000000000000000"
"01000d00000000000000000000000000"
"31323331323331323331323331ffffff"
"02000d00000000000000000000000000"
@@ -278,7 +281,8 @@ def test_norcow_get_item_qw_long():
assert value == b"7877877877877"
assert (
n._dump()[0][:192].hex()
- == consts.NORCOW_MAGIC_AND_VERSION.hex() + "0000000000000000"
+ == consts.NORCOW_MAGIC_AND_VERSION.hex()
+ + "0000000000000000"
"01000d00000000000000000000000000"
"31323331323331323331323331ffffff"
"02000d00000000000000000000000000"
### storage/tests/tests/test_random_upgrade.py
@@ -1,6 +1,6 @@
import hypothesis.strategies as st
-from c0.storage import Storage as StorageC0
from c.storage import Storage as StorageC
+from c0.storage import Storage as StorageC0
from hypothesis import assume, settings
from hypothesis.stateful import Bundle, RuleBasedStateMachine, invariant, rule
### storage/tests/tests/test_upgrade.py
@@ -1,7 +1,7 @@
import pytest
+from c.storage import Storage as StorageC
from c0.storage import Storage as StorageC0
from c3.storage import Storage as StorageC3
-from c.storage import Storage as StorageC
from python.src.norcow import NorcowBitwise
from python.src.storage import Storage as StoragePy
### tests/click_tests/common.py
@@ -189,9 +189,9 @@ def get_category(debug: "DebugLink") -> KeyboardCategory:
category = debug.read_layout().find_unique_value_by_key(
"active_layout", default="", only_type=str
)
- assert (
- category in KeyboardCategory.__members__
- ), f"Unknown layout name from debug: {category}"
+ assert category in KeyboardCategory.__members__, (
+ f"Unknown layout name from debug: {category}"
+ )
return KeyboardCategory[category]
### tests/click_tests/device_menu/common.py
@@ -190,7 +190,6 @@ def pin_content():
def auto_lock_content():
if initialized and has_pin:
-
auto_lock_batt = (
features.auto_lock_delay_battery_ms
or AUTOLOCK_DELAY_BATT_DEFAULT_MS
### tests/click_tests/device_menu/test_notifications.py
@@ -32,7 +32,6 @@
)
if TYPE_CHECKING:
-
from trezorlib.testing.device_handler import BackgroundDeviceHandler
# Trezor Safe 7 only
pytestmark = [pytest.mark.models("eckhart")]
### tests/click_tests/recovery.py
@@ -371,7 +371,6 @@ def cancel_recovery(debug: "DebugLink", recovery_type: str = "dry_run") -> None:
for _ in range(layout.page_count()):
debug.press_right()
elif debug.layout_type in (LayoutType.Delizia, LayoutType.Eckhart):
-
TR.translate(f"recovery__cancel_{recovery_type}")
# go to menu
### tests/click_tests/test_autolock.py
@@ -71,7 +71,9 @@ def set_autolock_delay(device_handler: "BackgroundDeviceHandler", delay_ms: int)
debug.input("1234")
session = device_handler.result()
- device_handler.run_with_provided_session(session, device.apply_settings, auto_lock_delay_ms=delay_ms) # type: ignore
+ device_handler.run_with_provided_session(
+ session, device.apply_settings, auto_lock_delay_ms=delay_ms
+ ) # type: ignore
debug.synchronize_at(TR.auto_lock__title)
assert TR.regexp("auto_lock__change_template").match(
@@ -108,7 +110,9 @@ def test_autolock_interrupts_signing(device_handler: "BackgroundDeviceHandler"):
script_type=messages.OutputScriptType.PAYTOADDRESS,
)
- device_handler.run_with_provided_session(session, btc.sign_tx, "Bitcoin", [inp1], [out1], prev_txes=TX_CACHE_MAINNET) # type: ignore
+ device_handler.run_with_provided_session(
+ session, btc.sign_tx, "Bitcoin", [inp1], [out1], prev_txes=TX_CACHE_MAINNET
+ ) # type: ignore
debug.synchronize_at([TR.words__send, TR.words__address, TR.words__recipient])
assert (
### tests/click_tests/test_passphrase_bde.py
@@ -114,7 +114,9 @@ def test_passphrase_input(
@pytest.mark.setup_client(passphrase=True)
def test_passphrase_input_over_limit(device_handler: "BackgroundDeviceHandler"):
- with prepare_passphrase_dialogue(device_handler, CommonPass.AAA_LIMIT_ADDRESS) as debug: # type: ignore
+ with prepare_passphrase_dialogue(
+ device_handler, CommonPass.AAA_LIMIT_ADDRESS
+ ) as debug: # type: ignore
input_passphrase(debug, CommonPass.AAA_LONGER, check=False)
assert debug.read_layout().passphrase() == CommonPass.AAA_LIMIT
enter_passphrase(debug)
### tests/click_tests/test_passphrase_caesar.py
@@ -211,7 +211,9 @@ def test_passphrase_input(
@pytest.mark.setup_client(passphrase=True)
def test_passphrase_input_over_limit(device_handler: "BackgroundDeviceHandler"):
- with prepare_passphrase_dialogue(device_handler, CommonPass.AAA_LIMIT_ADDRESS) as debug: # type: ignore
+ with prepare_passphrase_dialogue(
+ device_handler, CommonPass.AAA_LIMIT_ADDRESS
+ ) as debug: # type: ignore
# First `len(CommonPass.AAA_LIMIT)` chars
input_passphrase(debug, CommonPass.AAA_LONGER[:-1])
layout = debug.read_layout()
### tests/click_tests/test_pin.py
@@ -103,13 +103,19 @@ def prepare(
# Setup according to the wanted situation
if situation == Situation.PIN_INPUT:
# Any action triggering the PIN dialogue
- device_handler.run_with_session(lambda session: session.client.ping("pin_input", False)) # type: ignore
+ device_handler.run_with_session(
+ lambda session: session.client.ping("pin_input", False)
+ ) # type: ignore
elif situation == Situation.PIN_INPUT_CANCEL:
# Any action triggering the PIN dialogue
- device_handler.run_with_session(device.apply_settings, auto_lock_delay_ms=300_000) # type: ignore
+ device_handler.run_with_session(
+ device.apply_settings, auto_lock_delay_ms=300_000
+ ) # type: ignore
elif situation == Situation.PIN_SETUP:
# Set new PIN
- device_handler.run_with_provided_session(device_handler.client.get_seedless_session(), device.change_pin) # type: ignore
+ device_handler.run_with_provided_session(
+ device_handler.client.get_seedless_session(), device.change_pin
+ ) # type: ignore
pin_turn_on = debug.synchronize_at(
[TR.pin__turn_on, TR.pin__info, TR.pin__title_settings]
)
@@ -129,15 +135,19 @@ def prepare(
raise RuntimeError("Unknown model")
elif situation == Situation.PIN_CHANGE:
# Change PIN
- device_handler.run_with_provided_session(device_handler.client.get_seedless_session(), device.change_pin) # type: ignore
+ device_handler.run_with_provided_session(
+ device_handler.client.get_seedless_session(), device.change_pin
+ ) # type: ignore
_assert_pin_entry(debug)
_input_see_confirm(debug, old_pin)
debug.synchronize_at(TR.pin__change_question)
go_next(debug)
_input_see_confirm(debug, old_pin)
elif situation == Situation.WIPE_CODE_SETUP:
# Set wipe code
- device_handler.run_with_provided_session(device_handler.client.get_seedless_session(), device.change_wipe_code) # type: ignore
+ device_handler.run_with_provided_session(
+ device_handler.client.get_seedless_session(), device.change_wipe_code
+ ) # type: ignore
if old_pin:
_assert_pin_entry(debug)
_input_see_confirm(debug, old_pin)
@@ -197,7 +207,6 @@ def _input_code(debug: "DebugLink", pin: str, check: bool = False) -> None:
def _see_code(debug: "DebugLink") -> None:
"""Navigate to "SHOW" and press it"""
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia, LayoutType.Eckhart):
-
with debug.hold_touch(debug.screen_buttons.pin_passphrase_input()):
layout = debug.read_layout()
if layout.pin():
@@ -454,7 +463,6 @@ def test_show_pin_issue5328(device_handler: "BackgroundDeviceHandler"):
@pytest.mark.setup_client(pin=PIN4)
def test_long_press_digit(device_handler: "BackgroundDeviceHandler"):
with prepare(device_handler) as debug:
-
# Input the PIN except the last digit
_input_code(debug, PIN4[:-1])
### tests/device_tests/evolu/test_sign_registration.py
@@ -15,7 +15,9 @@
def signing_buffer(
private_key: bytes, challenge: bytes, size: int, rotation_index: int | None = None
) -> bytes:
- public_key: VerifyingKey = SigningKey.from_string(private_key, curve=NIST256p).get_verifying_key() # type: ignore
+ public_key: VerifyingKey = SigningKey.from_string(
+ private_key, curve=NIST256p
+ ).get_verifying_key() # type: ignore
components = [
b"EvoluSignRegistrationRequestV2:",
public_key.to_string("uncompressed"),
### tests/device_tests/reset_recovery/test_reset_bip39_t1.py
@@ -22,9 +22,8 @@
from trezorlib import device, messages
from trezorlib.btc import get_public_node
-from trezorlib.debuglink import DebugLink
+from trezorlib.debuglink import DebugLink, TrezorTestContext
from trezorlib.debuglink import DebugSession as Session
-from trezorlib.debuglink import TrezorTestContext
from trezorlib.exceptions import TrezorFailure
from trezorlib.testing.common import BRGeneratorType
from trezorlib.tools import parse_path
### tests/device_tests/test_msg_delayed_ack.py
@@ -102,7 +102,6 @@ def test_setup_no_acks(session: Session):
words = ""
with session.test_ctx as client:
-
setup_success: int = {
LayoutType.Bolt: False,
LayoutType.Caesar: False,
### tests/emulators.py
@@ -139,7 +139,6 @@ def _get_port(worker_id: int) -> int:
class EmulatorWrapper:
-
def __init__(
self,
model: str | None,
### tests/input_flows.py
@@ -18,9 +18,14 @@
from trezorlib import messages
from trezorlib.client import Session
-from trezorlib.debuglink import DebugLink, DebugSession, LayoutContent, LayoutType
+from trezorlib.debuglink import (
+ DebugLink,
+ DebugSession,
+ LayoutContent,
+ LayoutType,
+ multipage_content,
+)
from trezorlib.debuglink import TrezorTestContext as Client
-from trezorlib.debuglink import multipage_content
from trezorlib.exceptions import TrezorFailure
from trezorlib.testing import translations as TR
from trezorlib.testing.common import (
@@ -194,7 +199,6 @@ def input_two_different_pins() -> BRGeneratorType:
class InputFlowCodeChangeFail(InputFlowBase):
-
def __init__(
self, session: DebugSession, current_pin: str, new_pin_1: str, new_pin_2: str
):
@@ -858,7 +862,6 @@ def input_flow_eckhart(self) -> BRGeneratorType:
class InputFlowShowXpubQRCode(InputFlowBase):
-
def __init__(
self, client: Client | DebugSession, passphrase_request_expected: bool = False
):
@@ -2774,7 +2777,6 @@ def input_flow_common(self) -> BRGeneratorType:
class InputFlowBip39RecoveryDryRunInvalid(InputFlowBase):
-
def __init__(self, session: DebugSession):
super().__init__(session)
self.invalid_mnemonic = ["stick"] * 12
@@ -2896,7 +2898,6 @@ def input_flow_common(self) -> BRGeneratorType:
class InputFlowSlip39AdvancedRecoveryThresholdReached(InputFlowBase):
-
def __init__(
self,
session: DebugSession,
@@ -2922,7 +2923,6 @@ def input_flow_common(self) -> BRGeneratorType:
class InputFlowSlip39AdvancedRecoveryShareAlreadyEntered(InputFlowBase):
-
def __init__(
self,
session: DebugSession,
@@ -3085,7 +3085,6 @@ def input_flow_eckhart(self) -> BRGeneratorType:
class InputFlowSlip39BasicRecoveryShareInfoBetweenShares(InputFlowBase):
-
def __init__(self, session: DebugSession, shares: list[str]):
super().__init__(session)
self.first_share = shares[0].split(" ")
@@ -3139,7 +3138,6 @@ def input_flow_common(self) -> BRGeneratorType:
class InputFlowSlip39BasicRecoveryInvalidFirstShare(InputFlowBase):
-
def __init__(self, session: DebugSession):
super().__init__(session)
self.first_invalid = ["slush"] * 20
@@ -3160,7 +3158,6 @@ def input_flow_common(self) -> BRGeneratorType:
class InputFlowSlip39BasicRecoveryInvalidSecondShare(InputFlowBase):
-
def __init__(self, session: DebugSession, shares: list[str]):
super().__init__(session)
self.shares = shares
@@ -3184,7 +3181,6 @@ def input_flow_common(self) -> BRGeneratorType:
class InputFlowSlip39BasicRecoveryWrongNthWord(InputFlowBase):
-
def __init__(self, session: DebugSession, share: list[str], nth_word: int):
super().__init__(session)
self.share = share
@@ -3206,7 +3202,6 @@ def input_flow_common(self) -> BRGeneratorType:
class InputFlowSlip39BasicRecoverySameShare(InputFlowBase):
-
def __init__(self, session: DebugSession, share: list[str]):
super().__init__(session)
self.share = share
@@ -3382,7 +3377,6 @@ def input_flow_eckhart(self) -> BRGeneratorType:
class InputFlowSetBrightness(InputFlowBase):
-
def input_flow_bolt(self):
return self.client.ui.default_input_flow()
### tests/prodtest_tests/__init__.py
@@ -69,7 +69,7 @@ def assert_hexdata(response: ProdtestResponse, num_bytes: int | None = None) ->
except ValueError:
raise AssertionError(f"response is not valid hex data: {args!r}")
if num_bytes is not None:
- assert (
- len(data) == num_bytes
- ), f"expected {num_bytes} bytes of hex data, got {len(data)}: {args!r}"
+ assert len(data) == num_bytes, (
+ f"expected {num_bytes} bytes of hex data, got {len(data)}: {args!r}"
+ )
return data
### tests/prodtest_tests/test_tropic.py
@@ -245,9 +245,9 @@ def test_tropic_lock(tropic_prodtest: TropicProdtest) -> None:
for key in baseline.r_config.keys() | locked.r_config.keys()
if baseline.r_config.get(key) != locked.r_config.get(key)
}
- assert (
- set(r_config_diff) == _LOCK_CHANGED_R_CONFIG_KEYS
- ), f"unexpected r_config changes: {r_config_diff}"
+ assert set(r_config_diff) == _LOCK_CHANGED_R_CONFIG_KEYS, (
+ f"unexpected r_config changes: {r_config_diff}"
+ )
assert locked.i_config == baseline.i_config
### tests/prodtest_tests/test_version.py
@@ -24,17 +24,17 @@
def test_prodtest_version_format(client: ProdtestClient) -> None:
"""prodtest-version should return a version in major.minor.patch.build format."""
resp = client.command_ok(ProdtestCommand(Cmd.PRODTEST_VERSION))
- assert re.fullmatch(
- r"\d+\.\d+\.\d+\.\d+", resp.args
- ), f"Unexpected version format: {resp.args}"
+ assert re.fullmatch(r"\d+\.\d+\.\d+\.\d+", resp.args), (
+ f"Unexpected version format: {resp.args}"
+ )
def test_boardloader_version_format(client: ProdtestClient) -> None:
"""boardloader-version should return a version in major.minor.patch format."""
resp = client.command_ok(ProdtestCommand(Cmd.BOARDLOADER_VERSION))
- assert re.fullmatch(
- r"\d+\.\d+\.\d+", resp.args
- ), f"Unexpected version format: {resp.args}"
+ assert re.fullmatch(r"\d+\.\d+\.\d+", resp.args), (
+ f"Unexpected version format: {resp.args}"
+ )
def test_prodtest_model(client: ProdtestClient) -> None:
### tests/show_results.py
@@ -66,7 +66,6 @@ def do_GET(self) -> None:
def do_POST(self) -> None:
if self.path == "/fixtures.json":
-
length = self.headers.get("content-length")
assert length
field_data = self.rfile.read(int(length))
### tests/ui_tests/reporting/testreport.py
@@ -343,7 +343,6 @@ def failed(result: TestResult) -> Path:
script(type="text/javascript", src="../testreport.js")
with doc:
-
_header(result, "failed")
with div(id="markbox", _class="script-hidden"):
### tools/build_solana_templates.py
@@ -28,8 +28,8 @@ def _silent_call(*args: Any) -> None:
def format(file: Path) -> None:
- _silent_call("isort", file)
- _silent_call("black", file)
+ _silent_call("ruff", "check", "--fix", file)
+ _silent_call("ruff", "format", file)
_silent_call("flake8", file, "--config", ROOT / "setup.cfg")
### tools/github_issues_to_csv.py
@@ -121,13 +121,13 @@ def get_issues(name: str) -> None:
parser = argparse.ArgumentParser(
- description="Write GitHub repository issues " "to CSV file."
+ description="Write GitHub repository issues to CSV file."
)
parser.add_argument(
- "repositories", nargs="+", help="Repository names, " "formatted as 'username/repo'"
+ "repositories", nargs="+", help="Repository names, formatted as 'username/repo'"
)
parser.add_argument(
- "--all", action="store_true", help="Returns both open " "and closed issues."
+ "--all", action="store_true", help="Returns both open and closed issues."
)
args = parser.parse_args()
### uv.lock
@@ -35,15 +35,15 @@ wheels = [
[[package]]
name = "autoflake"
-version = "2.3.1"
+version = "2.3.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pyflakes" },
{ name = "tomli", marker = "python_full_version < '3.11'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/2a/cb/486f912d6171bc5748c311a2984a301f4e2d054833a1da78485866c71522/autoflake-2.3.1.tar.gz", hash = "sha256:c98b75dc5b0a86459c4f01a1d32ac7eb4338ec4317a4469515ff1e687ecd909e", size = 27642, upload-time = "2024-03-13T03:41:28.977Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/c3/0b/70c277eef225133763bf05c02c88df182e57d5c5c0730d3998958096a82e/autoflake-2.3.3.tar.gz", hash = "sha256:c24809541e23999f7a7b0d2faadf15deb0bc04cdde49728a2fd943a0c8055504", size = 16515, upload-time = "2026-02-20T05:01:43.448Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/a2/ee/3fd29bf416eb4f1c5579cf12bf393ae954099258abd7bde03c4f9716ef6b/autoflake-2.3.1-py3-none-any.whl", hash = "sha256:3ae7495db9084b7b32818b4140e6dc4fc280b712fb414f5b8fe57b0a8e85a840", size = 32483, upload-time = "2024-03-13T03:41:26.969Z" },
+ { url = "https://files.pythonhosted.org/packages/da/21/26f1680ec3a598ea31768f9ebcd427e42986d077a005416094b580635532/autoflake-2.3.3-py3-none-any.whl", hash = "sha256:a51a3412aff16135ee5b3ec25922459fef10c1f23ce6d6c4977188df859e8b53", size = 17715, upload-time = "2026-02-20T05:01:42.137Z" },
]
[[package]]
@@ -70,50 +70,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/90/5e/bb77d12046e125cd52b1d85b0d8fdfd750c67942efad0381a3c7ac65f119/binsize-0.1.4-py3-none-any.whl", hash = "sha256:f0069790fe7ff45d2699561f6af7a837af081b5a474d5f6f4371a50359f96118", size = 39973, upload-time = "2025-01-27T10:29:19.162Z" },
]
-[[package]]
-name = "black"
-version = "26.3.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "click" },
- { name = "mypy-extensions" },
- { name = "packaging" },
- { name = "pathspec" },
- { name = "platformdirs" },
- { name = "pytokens" },
- { name = "tomli", marker = "python_full_version < '3.11'" },
- { name = "typing-extensions", marker = "python_full_version < '3.11'" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/e1/c5/61175d618685d42b005847464b8fb4743a67b1b8fdb75e50e5a96c31a27a/black-26.3.1.tar.gz", hash = "sha256:2c50f5063a9641c7eed7795014ba37b0f5fa227f3d408b968936e24bc0566b07", size = 666155, upload-time = "2026-03-12T03:36:03.593Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/32/a8/11170031095655d36ebc6664fe0897866f6023892396900eec0e8fdc4299/black-26.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:86a8b5035fce64f5dcd1b794cf8ec4d31fe458cf6ce3986a30deb434df82a1d2", size = 1866562, upload-time = "2026-03-12T03:39:58.639Z" },
- { url = "https://files.pythonhosted.org/packages/69/ce/9e7548d719c3248c6c2abfd555d11169457cbd584d98d179111338423790/black-26.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5602bdb96d52d2d0672f24f6ffe5218795736dd34807fd0fd55ccd6bf206168b", size = 1703623, upload-time = "2026-03-12T03:40:00.347Z" },
- { url = "https://files.pythonhosted.org/packages/7f/0a/8d17d1a9c06f88d3d030d0b1d4373c1551146e252afe4547ed601c0e697f/black-26.3.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c54a4a82e291a1fee5137371ab488866b7c86a3305af4026bdd4dc78642e1ac", size = 1768388, upload-time = "2026-03-12T03:40:01.765Z" },
- { url = "https://files.pythonhosted.org/packages/52/79/c1ee726e221c863cde5164f925bacf183dfdf0397d4e3f94889439b947b4/black-26.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:6e131579c243c98f35bce64a7e08e87fb2d610544754675d4a0e73a070a5aa3a", size = 1412969, upload-time = "2026-03-12T03:40:03.252Z" },
- { url = "https://files.pythonhosted.org/packages/73/a5/15c01d613f5756f68ed8f6d4ec0a1e24b82b18889fa71affd3d1f7fad058/black-26.3.1-cp310-cp310-win_arm64.whl", hash = "sha256:5ed0ca58586c8d9a487352a96b15272b7fa55d139fc8496b519e78023a8dab0a", size = 1220345, upload-time = "2026-03-12T03:40:04.892Z" },
- { url = "https://files.pythonhosted.org/packages/17/57/5f11c92861f9c92eb9dddf515530bc2d06db843e44bdcf1c83c1427824bc/black-26.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:28ef38aee69e4b12fda8dba75e21f9b4f979b490c8ac0baa7cb505369ac9e1ff", size = 1851987, upload-time = "2026-03-12T03:40:06.248Z" },
- { url = "https://files.pythonhosted.org/packages/54/aa/340a1463660bf6831f9e39646bf774086dbd8ca7fc3cded9d59bbdf4ad0a/black-26.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf9bf162ed91a26f1adba8efda0b573bc6924ec1408a52cc6f82cb73ec2b142c", size = 1689499, upload-time = "2026-03-12T03:40:07.642Z" },
- { url = "https://files.pythonhosted.org/packages/f3/01/b726c93d717d72733da031d2de10b92c9fa4c8d0c67e8a8a372076579279/black-26.3.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:474c27574d6d7037c1bc875a81d9be0a9a4f9ee95e62800dab3cfaadbf75acd5", size = 1754369, upload-time = "2026-03-12T03:40:09.279Z" },
- { url = "https://files.pythonhosted.org/packages/e3/09/61e91881ca291f150cfc9eb7ba19473c2e59df28859a11a88248b5cbbc4d/black-26.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e9d0d86df21f2e1677cc4bd090cd0e446278bcbbe49bf3659c308c3e402843e", size = 1413613, upload-time = "2026-03-12T03:40:10.943Z" },
- { url = "https://files.pythonhosted.org/packages/16/73/544f23891b22e7efe4d8f812371ab85b57f6a01b2fc45e3ba2e52ba985b8/black-26.3.1-cp311-cp311-win_arm64.whl", hash = "sha256:9a5e9f45e5d5e1c5b5c29b3bd4265dcc90e8b92cf4534520896ed77f791f4da5", size = 1219719, upload-time = "2026-03-12T03:40:12.597Z" },
- { url = "https://files.pythonhosted.org/packages/dc/f8/da5eae4fc75e78e6dceb60624e1b9662ab00d6b452996046dfa9b8a6025b/black-26.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e6f89631eb88a7302d416594a32faeee9fb8fb848290da9d0a5f2903519fc1", size = 1895920, upload-time = "2026-03-12T03:40:13.921Z" },
- { url = "https://files.pythonhosted.org/packages/2c/9f/04e6f26534da2e1629b2b48255c264cabf5eedc5141d04516d9d68a24111/black-26.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41cd2012d35b47d589cb8a16faf8a32ef7a336f56356babd9fcf70939ad1897f", size = 1718499, upload-time = "2026-03-12T03:40:15.239Z" },
- { url = "https://files.pythonhosted.org/packages/04/91/a5935b2a63e31b331060c4a9fdb5a6c725840858c599032a6f3aac94055f/black-26.3.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f76ff19ec5297dd8e66eb64deda23631e642c9393ab592826fd4bdc97a4bce7", size = 1794994, upload-time = "2026-03-12T03:40:17.124Z" },
- { url = "https://files.pythonhosted.org/packages/e7/0a/86e462cdd311a3c2a8ece708d22aba17d0b2a0d5348ca34b40cdcbea512e/black-26.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ddb113db38838eb9f043623ba274cfaf7d51d5b0c22ecb30afe58b1bb8322983", size = 1420867, upload-time = "2026-03-12T03:40:18.83Z" },
- { url = "https://files.pythonhosted.org/packages/5b/e5/22515a19cb7eaee3440325a6b0d95d2c0e88dd180cb011b12ae488e031d1/black-26.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:dfdd51fc3e64ea4f35873d1b3fb25326773d55d2329ff8449139ebaad7357efb", size = 1230124, upload-time = "2026-03-12T03:40:20.425Z" },
- { url = "https://files.pythonhosted.org/packages/f5/77/5728052a3c0450c53d9bb3945c4c46b91baa62b2cafab6801411b6271e45/black-26.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:855822d90f884905362f602880ed8b5df1b7e3ee7d0db2502d4388a954cc8c54", size = 1895034, upload-time = "2026-03-12T03:40:21.813Z" },
- { url = "https://files.pythonhosted.org/packages/52/73/7cae55fdfdfbe9d19e9a8d25d145018965fe2079fa908101c3733b0c55a0/black-26.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8a33d657f3276328ce00e4d37fe70361e1ec7614da5d7b6e78de5426cb56332f", size = 1718503, upload-time = "2026-03-12T03:40:23.666Z" },
- { url = "https://files.pythonhosted.org/packages/e1/87/af89ad449e8254fdbc74654e6467e3c9381b61472cc532ee350d28cfdafb/black-26.3.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f1cd08e99d2f9317292a311dfe578fd2a24b15dbce97792f9c4d752275c1fa56", size = 1793557, upload-time = "2026-03-12T03:40:25.497Z" },
- { url = "https://files.pythonhosted.org/packages/43/10/d6c06a791d8124b843bf325ab4ac7d2f5b98731dff84d6064eafd687ded1/black-26.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:c7e72339f841b5a237ff14f7d3880ddd0fc7f98a1199e8c4327f9a4f478c1839", size = 1422766, upload-time = "2026-03-12T03:40:27.14Z" },
- { url = "https://files.pythonhosted.org/packages/59/4f/40a582c015f2d841ac24fed6390bd68f0fc896069ff3a886317959c9daf8/black-26.3.1-cp313-cp313-win_arm64.whl", hash = "sha256:afc622538b430aa4c8c853f7f63bc582b3b8030fd8c80b70fb5fa5b834e575c2", size = 1232140, upload-time = "2026-03-12T03:40:28.882Z" },
- { url = "https://files.pythonhosted.org/packages/d5/da/e36e27c9cebc1311b7579210df6f1c86e50f2d7143ae4fcf8a5017dc8809/black-26.3.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2d6bfaf7fd0993b420bed691f20f9492d53ce9a2bcccea4b797d34e947318a78", size = 1889234, upload-time = "2026-03-12T03:40:30.964Z" },
- { url = "https://files.pythonhosted.org/packages/0e/7b/9871acf393f64a5fa33668c19350ca87177b181f44bb3d0c33b2d534f22c/black-26.3.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f89f2ab047c76a9c03f78d0d66ca519e389519902fa27e7a91117ef7611c0568", size = 1720522, upload-time = "2026-03-12T03:40:32.346Z" },
- { url = "https://files.pythonhosted.org/packages/03/87/e766c7f2e90c07fb7586cc787c9ae6462b1eedab390191f2b7fc7f6170a9/black-26.3.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b07fc0dab849d24a80a29cfab8d8a19187d1c4685d8a5e6385a5ce323c1f015f", size = 1787824, upload-time = "2026-03-12T03:40:33.636Z" },
- { url = "https://files.pythonhosted.org/packages/ac/94/2424338fb2d1875e9e83eed4c8e9c67f6905ec25afd826a911aea2b02535/black-26.3.1-cp314-cp314-win_amd64.whl", hash = "sha256:0126ae5b7c09957da2bdbd91a9ba1207453feada9e9fe51992848658c6c8e01c", size = 1445855, upload-time = "2026-03-12T03:40:35.442Z" },
- { url = "https://files.pythonhosted.org/packages/86/43/0c3338bd928afb8ee7471f1a4eec3bdbe2245ccb4a646092a222e8669840/black-26.3.1-cp314-cp314-win_arm64.whl", hash = "sha256:92c0ec1f2cc149551a2b7b47efc32c866406b6891b0ee4625e95967c8f4acfb1", size = 1258109, upload-time = "2026-03-12T03:40:36.832Z" },
- { url = "https://files.pythonhosted.org/packages/8e/0d/52d98722666d6fc6c3dd4c76df339501d6efd40e0ff95e6186a7b7f0befd/black-26.3.1-py3-none-any.whl", hash = "sha256:2bd5aa94fc267d38bb21a70d7410a89f1a1d318841855f698746f8e7f51acd1b", size = 207542, upload-time = "2026-03-12T03:36:01.668Z" },
-]
-
[[package]]
name = "bleak"
version = "1.1.1"
@@ -1157,15 +1113,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/56/b3/7c69b37f03260a061883bec0e7b05be7117c1b1c85f5212c72c8c2bc3c8c/munch-4.0.0-py2.py3-none-any.whl", hash = "sha256:71033c45db9fb677a0b7eb517a4ce70ae09258490e419b0e7f00d1e386ecb1b4", size = 9950, upload-time = "2023-07-01T09:49:34.472Z" },
]
-[[package]]
-name = "mypy-extensions"
-version = "1.1.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" },
-]
-
[[package]]
name = "nanopb"
version = "0.4.9.1"
@@ -1712,45 +1659,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" },
]
-[[package]]
-name = "pytokens"
-version = "0.4.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/b6/34/b4e015b99031667a7b960f888889c5bd34ef585c85e1cb56a594b92836ac/pytokens-0.4.1.tar.gz", hash = "sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a", size = 23015, upload-time = "2026-01-30T01:03:45.924Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/42/24/f206113e05cb8ef51b3850e7ef88f20da6f4bf932190ceb48bd3da103e10/pytokens-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a44ed93ea23415c54f3face3b65ef2b844d96aeb3455b8a69b3df6beab6acc5", size = 161522, upload-time = "2026-01-30T01:02:50.393Z" },
- { url = "https://files.pythonhosted.org/packages/d4/e9/06a6bf1b90c2ed81a9c7d2544232fe5d2891d1cd480e8a1809ca354a8eb2/pytokens-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:add8bf86b71a5d9fb5b89f023a80b791e04fba57960aa790cc6125f7f1d39dfe", size = 246945, upload-time = "2026-01-30T01:02:52.399Z" },
- { url = "https://files.pythonhosted.org/packages/69/66/f6fb1007a4c3d8b682d5d65b7c1fb33257587a5f782647091e3408abe0b8/pytokens-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:670d286910b531c7b7e3c0b453fd8156f250adb140146d234a82219459b9640c", size = 259525, upload-time = "2026-01-30T01:02:53.737Z" },
- { url = "https://files.pythonhosted.org/packages/04/92/086f89b4d622a18418bac74ab5db7f68cf0c21cf7cc92de6c7b919d76c88/pytokens-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4e691d7f5186bd2842c14813f79f8884bb03f5995f0575272009982c5ac6c0f7", size = 262693, upload-time = "2026-01-30T01:02:54.871Z" },
- { url = "https://files.pythonhosted.org/packages/b4/7b/8b31c347cf94a3f900bdde750b2e9131575a61fdb620d3d3c75832262137/pytokens-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:27b83ad28825978742beef057bfe406ad6ed524b2d28c252c5de7b4a6dd48fa2", size = 103567, upload-time = "2026-01-30T01:02:56.414Z" },
- { url = "https://files.pythonhosted.org/packages/3d/92/790ebe03f07b57e53b10884c329b9a1a308648fc083a6d4a39a10a28c8fc/pytokens-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d70e77c55ae8380c91c0c18dea05951482e263982911fc7410b1ffd1dadd3440", size = 160864, upload-time = "2026-01-30T01:02:57.882Z" },
- { url = "https://files.pythonhosted.org/packages/13/25/a4f555281d975bfdd1eba731450e2fe3a95870274da73fb12c40aeae7625/pytokens-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a58d057208cb9075c144950d789511220b07636dd2e4708d5645d24de666bdc", size = 248565, upload-time = "2026-01-30T01:02:59.912Z" },
- { url = "https://files.pythonhosted.org/packages/17/50/bc0394b4ad5b1601be22fa43652173d47e4c9efbf0044c62e9a59b747c56/pytokens-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b49750419d300e2b5a3813cf229d4e5a4c728dae470bcc89867a9ad6f25a722d", size = 260824, upload-time = "2026-01-30T01:03:01.471Z" },
- { url = "https://files.pythonhosted.org/packages/4e/54/3e04f9d92a4be4fc6c80016bc396b923d2a6933ae94b5f557c939c460ee0/pytokens-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9907d61f15bf7261d7e775bd5d7ee4d2930e04424bab1972591918497623a16", size = 264075, upload-time = "2026-01-30T01:03:04.143Z" },
- { url = "https://files.pythonhosted.org/packages/d1/1b/44b0326cb5470a4375f37988aea5d61b5cc52407143303015ebee94abfd6/pytokens-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:ee44d0f85b803321710f9239f335aafe16553b39106384cef8e6de40cb4ef2f6", size = 103323, upload-time = "2026-01-30T01:03:05.412Z" },
- { url = "https://files.pythonhosted.org/packages/41/5d/e44573011401fb82e9d51e97f1290ceb377800fb4eed650b96f4753b499c/pytokens-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:140709331e846b728475786df8aeb27d24f48cbcf7bcd449f8de75cae7a45083", size = 160663, upload-time = "2026-01-30T01:03:06.473Z" },
- { url = "https://files.pythonhosted.org/packages/f0/e6/5bbc3019f8e6f21d09c41f8b8654536117e5e211a85d89212d59cbdab381/pytokens-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d6c4268598f762bc8e91f5dbf2ab2f61f7b95bdc07953b602db879b3c8c18e1", size = 255626, upload-time = "2026-01-30T01:03:08.177Z" },
- { url = "https://files.pythonhosted.org/packages/bf/3c/2d5297d82286f6f3d92770289fd439956b201c0a4fc7e72efb9b2293758e/pytokens-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24afde1f53d95348b5a0eb19488661147285ca4dd7ed752bbc3e1c6242a304d1", size = 269779, upload-time = "2026-01-30T01:03:09.756Z" },
- { url = "https://files.pythonhosted.org/packages/20/01/7436e9ad693cebda0551203e0bf28f7669976c60ad07d6402098208476de/pytokens-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5ad948d085ed6c16413eb5fec6b3e02fa00dc29a2534f088d3302c47eb59adf9", size = 268076, upload-time = "2026-01-30T01:03:10.957Z" },
- { url = "https://files.pythonhosted.org/packages/2e/df/533c82a3c752ba13ae7ef238b7f8cdd272cf1475f03c63ac6cf3fcfb00b6/pytokens-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:3f901fe783e06e48e8cbdc82d631fca8f118333798193e026a50ce1b3757ea68", size = 103552, upload-time = "2026-01-30T01:03:12.066Z" },
- { url = "https://files.pythonhosted.org/packages/cb/dc/08b1a080372afda3cceb4f3c0a7ba2bde9d6a5241f1edb02a22a019ee147/pytokens-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b", size = 160720, upload-time = "2026-01-30T01:03:13.843Z" },
- { url = "https://files.pythonhosted.org/packages/64/0c/41ea22205da480837a700e395507e6a24425151dfb7ead73343d6e2d7ffe/pytokens-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f", size = 254204, upload-time = "2026-01-30T01:03:14.886Z" },
- { url = "https://files.pythonhosted.org/packages/e0/d2/afe5c7f8607018beb99971489dbb846508f1b8f351fcefc225fcf4b2adc0/pytokens-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1", size = 268423, upload-time = "2026-01-30T01:03:15.936Z" },
- { url = "https://files.pythonhosted.org/packages/68/d4/00ffdbd370410c04e9591da9220a68dc1693ef7499173eb3e30d06e05ed1/pytokens-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4", size = 266859, upload-time = "2026-01-30T01:03:17.458Z" },
- { url = "https://files.pythonhosted.org/packages/a7/c9/c3161313b4ca0c601eeefabd3d3b576edaa9afdefd32da97210700e47652/pytokens-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78", size = 103520, upload-time = "2026-01-30T01:03:18.652Z" },
- { url = "https://files.pythonhosted.org/packages/8f/a7/b470f672e6fc5fee0a01d9e75005a0e617e162381974213a945fcd274843/pytokens-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4a14d5f5fc78ce85e426aa159489e2d5961acf0e47575e08f35584009178e321", size = 160821, upload-time = "2026-01-30T01:03:19.684Z" },
- { url = "https://files.pythonhosted.org/packages/80/98/e83a36fe8d170c911f864bfded690d2542bfcfacb9c649d11a9e6eb9dc41/pytokens-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f50fd18543be72da51dd505e2ed20d2228c74e0464e4262e4899797803d7fa", size = 254263, upload-time = "2026-01-30T01:03:20.834Z" },
- { url = "https://files.pythonhosted.org/packages/0f/95/70d7041273890f9f97a24234c00b746e8da86df462620194cef1d411ddeb/pytokens-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc74c035f9bfca0255c1af77ddd2d6ae8419012805453e4b0e7513e17904545d", size = 268071, upload-time = "2026-01-30T01:03:21.888Z" },
- { url = "https://files.pythonhosted.org/packages/da/79/76e6d09ae19c99404656d7db9c35dfd20f2086f3eb6ecb496b5b31163bad/pytokens-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f66a6bbe741bd431f6d741e617e0f39ec7257ca1f89089593479347cc4d13324", size = 271716, upload-time = "2026-01-30T01:03:23.633Z" },
- { url = "https://files.pythonhosted.org/packages/79/37/482e55fa1602e0a7ff012661d8c946bafdc05e480ea5a32f4f7e336d4aa9/pytokens-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:b35d7e5ad269804f6697727702da3c517bb8a5228afa450ab0fa787732055fc9", size = 104539, upload-time = "2026-01-30T01:03:24.788Z" },
- { url = "https://files.pythonhosted.org/packages/30/e8/20e7db907c23f3d63b0be3b8a4fd1927f6da2395f5bcc7f72242bb963dfe/pytokens-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8fcb9ba3709ff77e77f1c7022ff11d13553f3c30299a9fe246a166903e9091eb", size = 168474, upload-time = "2026-01-30T01:03:26.428Z" },
- { url = "https://files.pythonhosted.org/packages/d6/81/88a95ee9fafdd8f5f3452107748fd04c24930d500b9aba9738f3ade642cc/pytokens-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79fc6b8699564e1f9b521582c35435f1bd32dd06822322ec44afdeba666d8cb3", size = 290473, upload-time = "2026-01-30T01:03:27.415Z" },
- { url = "https://files.pythonhosted.org/packages/cf/35/3aa899645e29b6375b4aed9f8d21df219e7c958c4c186b465e42ee0a06bf/pytokens-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d31b97b3de0f61571a124a00ffe9a81fb9939146c122c11060725bd5aea79975", size = 303485, upload-time = "2026-01-30T01:03:28.558Z" },
- { url = "https://files.pythonhosted.org/packages/52/a0/07907b6ff512674d9b201859f7d212298c44933633c946703a20c25e9d81/pytokens-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:967cf6e3fd4adf7de8fc73cd3043754ae79c36475c1c11d514fc72cf5490094a", size = 306698, upload-time = "2026-01-30T01:03:29.653Z" },
- { url = "https://files.pythonhosted.org/packages/39/2a/cbbf9250020a4a8dd53ba83a46c097b69e5eb49dd14e708f496f548c6612/pytokens-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:584c80c24b078eec1e227079d56dc22ff755e0ba8654d8383b2c549107528918", size = 116287, upload-time = "2026-01-30T01:03:30.912Z" },
- { url = "https://files.pythonhosted.org/packages/c6/78/397db326746f0a342855b81216ae1f0a32965deccfd7c830a2dbc66d2483/pytokens-0.4.1-py3-none-any.whl", hash = "sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de", size = 13729, upload-time = "2026-01-30T01:03:45.029Z" },
-]
-
[[package]]
name = "pywin32-ctypes"
version = "0.2.3"
@@ -2119,9 +2027,7 @@ provides-extras = ["hidapi", "ethereum", "qt-widgets", "extra", "stellar", "ble"
[package.metadata.requires-dev]
dev = [
{ name = "autoflake", specifier = ">=2.3.1" },
- { name = "black", specifier = ">=25" },
{ name = "flake8", specifier = ">=2.3.0" },
- { name = "isort", specifier = ">=5.13.2" },
{ name = "pytest", specifier = ">=8.3.5" },
{ name = "pytest-random-order", specifier = ">=1.2.0" },
{ name = "tox", specifier = ">=4.25.0" },
@@ -2146,7 +2052,6 @@ source = { virtual = "." }
dependencies = [
{ name = "autoflake" },
{ name = "binsize" },
- { name = "black" },
{ name = "bleak" },
{ name = "click" },
{ name = "construct-typing" },
@@ -2164,7 +2069,6 @@ dependencies = [
{ name = "imgtool" },
{ name = "inotify" },
{ name = "intelhex" },
- { name = "isort" },
{ name = "mako" },
{ name = "mnemonic" },
{ name = "munch" },
@@ -2212,7 +2116,6 @@ dev = [
requires-dist = [
{ name = "autoflake" },
{ name = "binsize", specifier = ">=0.1.3,<0.2" },
- { name = "black", specifier = ">=24.2" },
{ name = "bleak", specifier = ">=1.1.0" },
{ name = "click", specifier = ">=8,<9" },
{ name = "construct-typing", specifier = ">=0.7.0" },
@@ -2230,7 +2133,6 @@ requires-dist = [
{ name = "imgtool", specifier = "==2.2.0" },
{ name = "inotify" },
{ name = "intelhex", specifier = "==2.3.0" },
- { name = "isort", specifier = ">=5,<6" },
{ name = "mako", specifier = ">=1.3.10,<2" },
{ name = "mnemonic", specifier = ">=0.21,<0.22" },
{ name = "munch", specifier = ">=4,<5" },Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.