latch 2.39.0.dev27__tar.gz → 2.39.0.dev29__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {latch-2.39.0.dev27/latch.egg-info → latch-2.39.0.dev29}/PKG-INFO +1 -1
- {latch-2.39.0.dev27 → latch-2.39.0.dev29/latch.egg-info}/PKG-INFO +1 -1
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch.egg-info/SOURCES.txt +0 -2
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/build.py +15 -30
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/dag.py +4 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/tasks/conditional.py +5 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/tasks/merge.py +4 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/tasks/operator.py +9 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/tasks/process.py +10 -20
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/workflow.py +2 -1
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/setup.py +1 -1
- latch-2.39.0.dev27/latch_cli/extras/nextflow/tasks/input.py +0 -67
- latch-2.39.0.dev27/latch_cli/extras/nextflow/tasks/output.py +0 -86
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/LICENSE +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/MANIFEST.in +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/README.md +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/account.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/executions.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/functions/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/functions/messages.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/functions/operators.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/functions/secrets.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/_transfer/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/_transfer/download.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/_transfer/manager.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/_transfer/node.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/_transfer/progress.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/_transfer/remote_copy.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/_transfer/throttle.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/_transfer/upload.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/_transfer/utils.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/path.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/type.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/registry/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/registry/project.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/registry/record.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/registry/table.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/registry/types.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/registry/upstream_types/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/registry/upstream_types/types.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/registry/upstream_types/values.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/registry/utils.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/resources/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/resources/conditional.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/resources/launch_plan.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/resources/map_tasks.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/resources/reference_workflow.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/resources/tasks.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/resources/workflow.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/types/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/types/directory.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/types/file.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/types/glob.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/types/json.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/types/metadata.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/types/utils.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/verified/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/verified/deseq2.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/verified/mafft.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/verified/pathway.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/verified/rnaseq.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/verified/trim_galore.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch.egg-info/dependency_links.txt +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch.egg-info/entry_points.txt +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch.egg-info/requires.txt +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch.egg-info/top_level.txt +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/auth/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/auth/csrf.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/auth/oauth2.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/auth/pkce.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/auth/utils.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/centromere/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/centromere/ctx.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/centromere/utils.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/click_utils.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/constants.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/docker_utils/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/exceptions/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/exceptions/cache.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/exceptions/errors.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/exceptions/handler.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/exceptions/traceback.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/common/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/common/config/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/common/config/parser.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/common/config/utils.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/common/serialize.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/common/utils.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/channel.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/config.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/file_persistence.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/serialize.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/tasks/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/tasks/adapters.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/tasks/base.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/tasks/map.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/snakemake/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/snakemake/config.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/snakemake/serialize.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/snakemake/single_task_snakemake.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/snakemake/utils.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/snakemake/workflow.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/main.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/menus.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/cp/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/cp/autocomplete.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/cp/glob.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/cp/main.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/cp/utils.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/execute/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/execute/main.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/execute/utils.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/get.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/get_executions.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/get_params.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/__pycache__/__init__.cpython-310.pyc +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/__pycache__/__init__.cpython-311.pyc +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/__pycache__/__init__.cpython-38.pyc +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/__pycache__/__init__.cpython-39.pyc +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/__pycache__/init.cpython-310.pyc +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/__pycache__/init.cpython-311.pyc +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/__pycache__/init.cpython-38.pyc +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/__pycache__/init.cpython-39.pyc +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/assemble_and_sort/.env +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/assemble_and_sort/LICENSE +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/assemble_and_sort/README.md +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/assemble_and_sort/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/assemble_and_sort/__pycache__/__init__.cpython-310.pyc +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/assemble_and_sort/assemble.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/assemble_and_sort/sort.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/assemble_and_sort/system-requirements.txt +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/common/.dockerignore +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_conda/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_conda/__pycache__/__init__.cpython-310.pyc +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_conda/conda_task.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_conda/environment.yaml +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_docker/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_docker/task.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_nf_integration/Dockerfile +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_nf_integration/latch_metadata/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_nf_integration/latch_metadata/__pycache__/__init__.cpython-311.pyc +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_nf_integration/main.nf +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_nf_integration/workflow.nf +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_nfcore/Dockerfile +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_nfcore/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_nfcore/task.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_r/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_r/__pycache__/__init__.cpython-310.pyc +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_r/environment.R +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_r/r_task.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_snakemake/.latch/latch_entrypoint +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_snakemake/Dockerfile +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_snakemake/Snakefile +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_snakemake/config.yaml +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_snakemake/environment.yaml +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_snakemake/latch_metadata.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_snakemake/scripts/plot-quals.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_snakemake/version +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/init.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/template/LICENSE +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/template/README.md +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/template/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/template/__pycache__/__init__.cpython-310.pyc +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/template/task.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/launch.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/local_dev.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/local_dev_old.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/login.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/ls.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/mkdir.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/move.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/preview.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/register/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/register/constants.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/register/register.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/register/utils.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/rm.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/stop_pod.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/sync.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/test_data/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/test_data/ls.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/test_data/remove.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/test_data/upload.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/test_data/utils.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/workspace.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/tinyrequests.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/tui/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/utils/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/utils/path.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/utils/workflow.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/workflow_config.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/pyproject.toml +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/setup.cfg +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/tests/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/tests/cp/__init__.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/tests/fixtures.py +0 -0
- {latch-2.39.0.dev27 → latch-2.39.0.dev29}/tests/test_ls.py +0 -0
|
@@ -97,11 +97,9 @@ latch_cli/extras/nextflow/tasks/__init__.py
|
|
|
97
97
|
latch_cli/extras/nextflow/tasks/adapters.py
|
|
98
98
|
latch_cli/extras/nextflow/tasks/base.py
|
|
99
99
|
latch_cli/extras/nextflow/tasks/conditional.py
|
|
100
|
-
latch_cli/extras/nextflow/tasks/input.py
|
|
101
100
|
latch_cli/extras/nextflow/tasks/map.py
|
|
102
101
|
latch_cli/extras/nextflow/tasks/merge.py
|
|
103
102
|
latch_cli/extras/nextflow/tasks/operator.py
|
|
104
|
-
latch_cli/extras/nextflow/tasks/output.py
|
|
105
103
|
latch_cli/extras/nextflow/tasks/process.py
|
|
106
104
|
latch_cli/extras/snakemake/__init__.py
|
|
107
105
|
latch_cli/extras/snakemake/config.py
|
|
@@ -33,7 +33,6 @@ from .tasks.adapters import (
|
|
|
33
33
|
NextflowProcessPreAdapterTask,
|
|
34
34
|
)
|
|
35
35
|
from .tasks.conditional import NextflowConditionalTask
|
|
36
|
-
from .tasks.input import NextflowInputTask
|
|
37
36
|
from .tasks.map import MapContainerTask
|
|
38
37
|
from .tasks.merge import NextflowMergeTask
|
|
39
38
|
from .tasks.operator import NextflowOperatorTask
|
|
@@ -165,7 +164,8 @@ def build_from_nextflow_dag(
|
|
|
165
164
|
name=identifier_from_str(vertex.label),
|
|
166
165
|
statement=vertex.statement,
|
|
167
166
|
ret=vertex.ret,
|
|
168
|
-
|
|
167
|
+
script_path=Path(vertex.subWorkflowPath),
|
|
168
|
+
calling_subwf_name=vertex.subWorkflowName,
|
|
169
169
|
process_name=vertex.label,
|
|
170
170
|
unaliased=vertex.unaliased,
|
|
171
171
|
execution_profile=execution_profile,
|
|
@@ -223,43 +223,24 @@ def build_from_nextflow_dag(
|
|
|
223
223
|
|
|
224
224
|
elif vertex.type in VertexType.Conditional:
|
|
225
225
|
conditional_task = NextflowConditionalTask(
|
|
226
|
-
task_inputs,
|
|
227
|
-
vertex.id,
|
|
228
|
-
f"conditional_{vertex.label}",
|
|
229
|
-
vertex.statement,
|
|
230
|
-
vertex.ret,
|
|
231
|
-
branches,
|
|
232
|
-
wf,
|
|
233
|
-
)
|
|
234
|
-
wf.nextflow_tasks.append(conditional_task)
|
|
235
|
-
|
|
236
|
-
node = Node(
|
|
237
|
-
id=node_name,
|
|
238
|
-
metadata=conditional_task.construct_node_metadata(),
|
|
239
|
-
bindings=task_bindings,
|
|
240
|
-
upstream_nodes=upstream_nodes,
|
|
241
|
-
flyte_entity=conditional_task,
|
|
242
|
-
)
|
|
243
|
-
|
|
244
|
-
node_map[vertex.id] = node
|
|
245
|
-
|
|
246
|
-
elif vertex.type == VertexType.Input:
|
|
247
|
-
input_task = NextflowInputTask(
|
|
248
226
|
inputs=task_inputs,
|
|
249
|
-
outputs=task_outputs,
|
|
250
|
-
name=vertex.label,
|
|
251
227
|
id=vertex.id,
|
|
228
|
+
name=f"conditional_{vertex.label}",
|
|
229
|
+
statement=vertex.statement,
|
|
230
|
+
ret=vertex.ret,
|
|
252
231
|
branches=branches,
|
|
232
|
+
script_path=Path(vertex.subWorkflowPath),
|
|
233
|
+
calling_subwf_name=vertex.subWorkflowName,
|
|
253
234
|
wf=wf,
|
|
254
235
|
)
|
|
255
|
-
wf.nextflow_tasks.append(
|
|
236
|
+
wf.nextflow_tasks.append(conditional_task)
|
|
256
237
|
|
|
257
238
|
node = Node(
|
|
258
239
|
id=node_name,
|
|
259
|
-
metadata=
|
|
240
|
+
metadata=conditional_task.construct_node_metadata(),
|
|
260
241
|
bindings=task_bindings,
|
|
261
242
|
upstream_nodes=upstream_nodes,
|
|
262
|
-
flyte_entity=
|
|
243
|
+
flyte_entity=conditional_task,
|
|
263
244
|
)
|
|
264
245
|
|
|
265
246
|
node_map[vertex.id] = node
|
|
@@ -272,6 +253,8 @@ def build_from_nextflow_dag(
|
|
|
272
253
|
id=vertex.id,
|
|
273
254
|
branches=branches,
|
|
274
255
|
sources=merge_sources,
|
|
256
|
+
script_path=Path(vertex.subWorkflowPath),
|
|
257
|
+
calling_subwf_name=vertex.subWorkflowName,
|
|
275
258
|
wf=wf,
|
|
276
259
|
)
|
|
277
260
|
|
|
@@ -296,6 +279,8 @@ def build_from_nextflow_dag(
|
|
|
296
279
|
statement=vertex.statement,
|
|
297
280
|
ret=vertex.ret,
|
|
298
281
|
branches=branches,
|
|
282
|
+
script_path=Path(vertex.subWorkflowPath),
|
|
283
|
+
calling_subwf_name=vertex.subWorkflowName,
|
|
299
284
|
wf=wf,
|
|
300
285
|
)
|
|
301
286
|
wf.nextflow_tasks.append(operator_task)
|
|
@@ -461,7 +446,7 @@ def build_nf_wf(
|
|
|
461
446
|
|
|
462
447
|
raise click.exceptions.Exit(0)
|
|
463
448
|
|
|
464
|
-
wf = NextflowWorkflow(nf_script, version, main_dag)
|
|
449
|
+
wf = NextflowWorkflow(pkg_root, nf_script, version, main_dag)
|
|
465
450
|
|
|
466
451
|
build_from_nextflow_dag(wf, execution_profile=execution_profile)
|
|
467
452
|
|
|
@@ -36,6 +36,8 @@ class Vertex:
|
|
|
36
36
|
outputNames: List[str] = field(hash=False)
|
|
37
37
|
module: str
|
|
38
38
|
unaliased: str
|
|
39
|
+
subWorkflowName: str
|
|
40
|
+
subWorkflowPath: str
|
|
39
41
|
|
|
40
42
|
|
|
41
43
|
@dataclass(frozen=True)
|
|
@@ -55,6 +57,8 @@ class _VertexContentJson(TypedDict):
|
|
|
55
57
|
outputNames: List[str]
|
|
56
58
|
module: str
|
|
57
59
|
unaliased: str
|
|
60
|
+
subWorkflowName: str
|
|
61
|
+
subWorkflowPath: str
|
|
58
62
|
|
|
59
63
|
|
|
60
64
|
class _VertexJson(TypedDict):
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from pathlib import Path
|
|
1
2
|
from typing import Dict, List, Mapping, Optional, Type
|
|
2
3
|
|
|
3
4
|
from latch.types.metadata import ParameterType
|
|
@@ -17,6 +18,8 @@ class NextflowConditionalTask(NextflowOperatorTask):
|
|
|
17
18
|
statement: str,
|
|
18
19
|
ret: List[str],
|
|
19
20
|
branches: Dict[str, bool],
|
|
21
|
+
script_path: Path,
|
|
22
|
+
calling_subwf_name: str,
|
|
20
23
|
wf: NextflowWorkflow,
|
|
21
24
|
):
|
|
22
25
|
super().__init__(
|
|
@@ -27,6 +30,8 @@ class NextflowConditionalTask(NextflowOperatorTask):
|
|
|
27
30
|
statement,
|
|
28
31
|
ret,
|
|
29
32
|
branches,
|
|
33
|
+
script_path,
|
|
34
|
+
calling_subwf_name,
|
|
30
35
|
wf,
|
|
31
36
|
)
|
|
32
37
|
|
|
@@ -18,6 +18,8 @@ class NextflowMergeTask(NextflowOperatorTask):
|
|
|
18
18
|
name: str,
|
|
19
19
|
branches: Dict[str, bool],
|
|
20
20
|
sources: Dict[str, List[str]],
|
|
21
|
+
script_path: Path,
|
|
22
|
+
calling_subwf_name: str,
|
|
21
23
|
wf: NextflowWorkflow,
|
|
22
24
|
):
|
|
23
25
|
super().__init__(
|
|
@@ -28,6 +30,8 @@ class NextflowMergeTask(NextflowOperatorTask):
|
|
|
28
30
|
"",
|
|
29
31
|
[],
|
|
30
32
|
branches,
|
|
33
|
+
script_path,
|
|
34
|
+
calling_subwf_name,
|
|
31
35
|
wf,
|
|
32
36
|
)
|
|
33
37
|
|
|
@@ -21,10 +21,14 @@ class NextflowOperatorTask(NextflowBaseTask):
|
|
|
21
21
|
statement: str,
|
|
22
22
|
ret: List[str],
|
|
23
23
|
branches: Dict[str, bool],
|
|
24
|
+
script_path: Path,
|
|
25
|
+
calling_subwf_name: str,
|
|
24
26
|
wf: NextflowWorkflow,
|
|
25
27
|
):
|
|
26
28
|
self.statement = statement
|
|
27
29
|
self.ret = ret
|
|
30
|
+
self.script_path = script_path
|
|
31
|
+
self.calling_subwf_name = calling_subwf_name
|
|
28
32
|
|
|
29
33
|
super().__init__(inputs, outputs, id, name, branches, wf, NFTaskType.Operator)
|
|
30
34
|
|
|
@@ -171,6 +175,11 @@ class NextflowOperatorTask(NextflowBaseTask):
|
|
|
171
175
|
download_str = rf"""download_files(channel_vals, LatchDir({repr(self.wf.output_directory.remote_path)}))"""
|
|
172
176
|
upload_str = rf"""upload_files({{k: json.loads(v) for k, v in out_channels.items()}}, LatchDir({repr(self.wf.output_directory.remote_path)}))"""
|
|
173
177
|
|
|
178
|
+
if self.script_path.resolve() != self.wf.nf_script.resolve():
|
|
179
|
+
stem = self.script_path.resolve().relative_to(self.wf.pkg_root.resolve())
|
|
180
|
+
run_task_entrypoint[2] = str(Path("/root") / stem)
|
|
181
|
+
run_task_entrypoint.extend(["-entry", self.calling_subwf_name])
|
|
182
|
+
|
|
174
183
|
code_block += reindent(
|
|
175
184
|
rf"""
|
|
176
185
|
channel_vals = [{", ".join([f"json.loads({x})" for x in self.channel_inputs])}]
|
|
@@ -21,14 +21,15 @@ class NextflowProcessTask(NextflowBaseTask):
|
|
|
21
21
|
name: str,
|
|
22
22
|
statement: str,
|
|
23
23
|
ret: List[str],
|
|
24
|
-
|
|
24
|
+
script_path: Path,
|
|
25
|
+
calling_subwf_name: str,
|
|
25
26
|
process_name: str,
|
|
26
27
|
unaliased: str,
|
|
27
28
|
execution_profile: Optional[str],
|
|
28
29
|
wf: NextflowWorkflow,
|
|
29
30
|
):
|
|
30
31
|
super().__init__(
|
|
31
|
-
inputs, outputs, id, name, {}, wf, NFTaskType.Process, cpu=16, memory=
|
|
32
|
+
inputs, outputs, id, name, {}, wf, NFTaskType.Process, cpu=16, memory=48
|
|
32
33
|
)
|
|
33
34
|
|
|
34
35
|
self.wf_inputs = {}
|
|
@@ -50,7 +51,8 @@ class NextflowProcessTask(NextflowBaseTask):
|
|
|
50
51
|
|
|
51
52
|
self.statement = statement
|
|
52
53
|
self.ret = ret
|
|
53
|
-
self.
|
|
54
|
+
self.script_path = script_path
|
|
55
|
+
self.calling_subwf_name = calling_subwf_name
|
|
54
56
|
self.process_name = process_name
|
|
55
57
|
self.unaliased = unaliased
|
|
56
58
|
self.execution_profile = execution_profile
|
|
@@ -152,19 +154,10 @@ class NextflowProcessTask(NextflowBaseTask):
|
|
|
152
154
|
1,
|
|
153
155
|
)
|
|
154
156
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
self.import_path.resolve().relative_to(
|
|
160
|
-
self.wf.nf_script.parent.resolve()
|
|
161
|
-
)
|
|
162
|
-
)
|
|
163
|
-
include_meta["path"] = f"./{stem}"
|
|
164
|
-
include_meta["alias"] = self.process_name
|
|
165
|
-
include_meta["name"] = self.unaliased
|
|
166
|
-
|
|
167
|
-
include_str = json.dumps(include_meta)
|
|
157
|
+
if self.script_path.resolve() != self.wf.nf_script.resolve():
|
|
158
|
+
stem = self.script_path.resolve().relative_to(self.wf.pkg_root.resolve())
|
|
159
|
+
run_task_entrypoint[2] = str(Path("/root") / stem)
|
|
160
|
+
run_task_entrypoint.extend(["-entry", self.calling_subwf_name])
|
|
168
161
|
|
|
169
162
|
code_block += reindent(
|
|
170
163
|
rf"""
|
|
@@ -178,7 +171,6 @@ class NextflowProcessTask(NextflowBaseTask):
|
|
|
178
171
|
[{','.join([f"str({x})" if x.startswith("wf_") else repr(x) for x in run_task_entrypoint])}],
|
|
179
172
|
env={{
|
|
180
173
|
**os.environ,
|
|
181
|
-
"LATCH_INCLUDE_META": {repr(include_str)},
|
|
182
174
|
"LATCH_EXPRESSION": {repr(self.statement)},
|
|
183
175
|
"LATCH_RETURN": {repr(json.dumps(self.ret))},
|
|
184
176
|
"LATCH_PARAM_VALS": json.dumps(channel_vals),
|
|
@@ -188,9 +180,7 @@ class NextflowProcessTask(NextflowBaseTask):
|
|
|
188
180
|
except subprocess.CalledProcessError:
|
|
189
181
|
log = Path("/root/.nextflow.log").read_text()
|
|
190
182
|
print("\n\n\n\n\n" + log)
|
|
191
|
-
|
|
192
|
-
import time
|
|
193
|
-
time.sleep(10000)
|
|
183
|
+
raise
|
|
194
184
|
|
|
195
185
|
out_channels = {{}}
|
|
196
186
|
files = [Path(f) for f in glob.glob(".latch/task-outputs/*.json")]
|
|
@@ -42,7 +42,7 @@ def _get_flags_to_params(key: str, t: Type, flags: Dict[str, str]):
|
|
|
42
42
|
|
|
43
43
|
|
|
44
44
|
class NextflowWorkflow(WorkflowBase, ClassStorageTaskResolver):
|
|
45
|
-
def __init__(self, nf_script: Path, version: str, dag: DAG):
|
|
45
|
+
def __init__(self, pkg_root: Path, nf_script: Path, version: str, dag: DAG):
|
|
46
46
|
assert metadata._nextflow_metadata is not None
|
|
47
47
|
assert metadata._nextflow_metadata.output_directory is not None
|
|
48
48
|
|
|
@@ -91,6 +91,7 @@ class NextflowWorkflow(WorkflowBase, ClassStorageTaskResolver):
|
|
|
91
91
|
|
|
92
92
|
self.nextflow_tasks: List[NextflowBaseTask] = []
|
|
93
93
|
|
|
94
|
+
self.pkg_root = pkg_root
|
|
94
95
|
self.nf_script = nf_script
|
|
95
96
|
self.version = version
|
|
96
97
|
self.dag = dag
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
from typing import Dict, List, Mapping, Type
|
|
3
|
-
|
|
4
|
-
from latch.types.metadata import ParameterType
|
|
5
|
-
|
|
6
|
-
from ....extras.common.utils import reindent
|
|
7
|
-
from ..workflow import NextflowWorkflow
|
|
8
|
-
from .operator import NextflowOperatorTask
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class NextflowInputTask(NextflowOperatorTask):
|
|
12
|
-
def __init__(
|
|
13
|
-
self,
|
|
14
|
-
inputs: Mapping[str, Type[ParameterType]],
|
|
15
|
-
outputs: Mapping[str, Type[ParameterType]],
|
|
16
|
-
id: str,
|
|
17
|
-
name: str,
|
|
18
|
-
branches: Dict[str, bool],
|
|
19
|
-
wf: NextflowWorkflow,
|
|
20
|
-
):
|
|
21
|
-
super().__init__(inputs, outputs, id, name, "", [], branches, wf)
|
|
22
|
-
|
|
23
|
-
assert len(self.channel_inputs) == 1, (
|
|
24
|
-
self.channel_inputs,
|
|
25
|
-
self.conditional_inputs,
|
|
26
|
-
self.wf_inputs,
|
|
27
|
-
)
|
|
28
|
-
|
|
29
|
-
def get_fn_return_stmt(self):
|
|
30
|
-
results: List[str] = []
|
|
31
|
-
for out_name in self._python_outputs.keys():
|
|
32
|
-
results.append(reindent(rf"{out_name}=res", 2).rstrip())
|
|
33
|
-
|
|
34
|
-
return_str = ",\n".join(results)
|
|
35
|
-
|
|
36
|
-
return reindent(
|
|
37
|
-
rf"""
|
|
38
|
-
return Res{self.name}(
|
|
39
|
-
__return_str__
|
|
40
|
-
)
|
|
41
|
-
""",
|
|
42
|
-
0,
|
|
43
|
-
).replace("__return_str__", return_str)
|
|
44
|
-
|
|
45
|
-
def get_fn_code(self, nf_script_path_in_container: Path):
|
|
46
|
-
code_block = self.get_fn_interface()
|
|
47
|
-
code_block += self.get_fn_conditions()
|
|
48
|
-
|
|
49
|
-
channel_input = self.channel_inputs.popitem()[0]
|
|
50
|
-
|
|
51
|
-
code_block += reindent(
|
|
52
|
-
rf"""
|
|
53
|
-
res = {channel_input}
|
|
54
|
-
else:
|
|
55
|
-
print("TASK SKIPPED")
|
|
56
|
-
try:
|
|
57
|
-
_override_task_status(status="SKIPPED")
|
|
58
|
-
except Exception as e:
|
|
59
|
-
print(f"Failed to override task status: {{e}}")
|
|
60
|
-
res = None
|
|
61
|
-
|
|
62
|
-
""",
|
|
63
|
-
1,
|
|
64
|
-
)
|
|
65
|
-
|
|
66
|
-
code_block += self.get_fn_return_stmt()
|
|
67
|
-
return code_block
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import json
|
|
2
|
-
from pathlib import Path
|
|
3
|
-
from typing import Dict, List, Mapping, Type
|
|
4
|
-
|
|
5
|
-
from latch.types.metadata import ParameterType
|
|
6
|
-
|
|
7
|
-
from ....extras.common.utils import reindent
|
|
8
|
-
from ..workflow import NextflowWorkflow
|
|
9
|
-
from .operator import NextflowOperatorTask
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class NextflowOutputTask(NextflowOperatorTask):
|
|
13
|
-
def __init__(
|
|
14
|
-
self,
|
|
15
|
-
inputs: Mapping[str, Type[ParameterType]],
|
|
16
|
-
outputs: Mapping[str, Type[ParameterType]],
|
|
17
|
-
id: str,
|
|
18
|
-
name: str,
|
|
19
|
-
statement: str,
|
|
20
|
-
ret: List[str],
|
|
21
|
-
branches: Dict[str, bool],
|
|
22
|
-
wf: NextflowWorkflow,
|
|
23
|
-
):
|
|
24
|
-
super().__init__(
|
|
25
|
-
inputs,
|
|
26
|
-
outputs,
|
|
27
|
-
id,
|
|
28
|
-
name,
|
|
29
|
-
statement,
|
|
30
|
-
ret,
|
|
31
|
-
branches,
|
|
32
|
-
wf,
|
|
33
|
-
)
|
|
34
|
-
|
|
35
|
-
def get_fn_return_stmt(self):
|
|
36
|
-
assert len(self._python_outputs) == len(
|
|
37
|
-
self.channel_inputs
|
|
38
|
-
), f"{self.name, self._python_outputs, self.channel_inputs}"
|
|
39
|
-
|
|
40
|
-
results: List[str] = []
|
|
41
|
-
for out_name, param_name in zip(
|
|
42
|
-
self._python_outputs.keys(), self.channel_inputs.keys()
|
|
43
|
-
):
|
|
44
|
-
results.append(
|
|
45
|
-
reindent(rf"{out_name}=({param_name} if cond else None)", 2).rstrip()
|
|
46
|
-
)
|
|
47
|
-
|
|
48
|
-
return_str = ",\n".join(results)
|
|
49
|
-
|
|
50
|
-
return reindent(
|
|
51
|
-
rf"""
|
|
52
|
-
return Res{self.name}(
|
|
53
|
-
__return_str__
|
|
54
|
-
)
|
|
55
|
-
""",
|
|
56
|
-
0,
|
|
57
|
-
).replace("__return_str__", return_str)
|
|
58
|
-
|
|
59
|
-
def get_fn_conditions(self):
|
|
60
|
-
res: List[str] = []
|
|
61
|
-
for k in self.conditional_inputs.keys():
|
|
62
|
-
res.append(f"({k} == {self.branches[k]})")
|
|
63
|
-
for k in self.channel_inputs.keys():
|
|
64
|
-
res.append(f"({k} is not None)")
|
|
65
|
-
|
|
66
|
-
if len(res) == 0:
|
|
67
|
-
return reindent(
|
|
68
|
-
f"""\
|
|
69
|
-
cond = True
|
|
70
|
-
""",
|
|
71
|
-
1,
|
|
72
|
-
)
|
|
73
|
-
|
|
74
|
-
return reindent(
|
|
75
|
-
f"""\
|
|
76
|
-
cond = ({' and '.join(res)})
|
|
77
|
-
""",
|
|
78
|
-
1,
|
|
79
|
-
)
|
|
80
|
-
|
|
81
|
-
def get_fn_code(self, nf_script_path_in_container: Path):
|
|
82
|
-
code_block = self.get_fn_interface()
|
|
83
|
-
code_block += self.get_fn_conditions()
|
|
84
|
-
code_block += self.get_fn_return_stmt()
|
|
85
|
-
|
|
86
|
-
return code_block
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|