summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.zuul.yaml75
-rw-r--r--Dockerfile4
-rw-r--r--TESTING.rst32
-rw-r--r--bindep.txt3
-rw-r--r--doc/requirements.txt5
-rw-r--r--doc/source/admin.rst1
-rw-r--r--doc/source/authentication.rst1
-rw-r--r--doc/source/client.rst276
-rw-r--r--doc/source/concepts.rst8
-rw-r--r--doc/source/conf.py2
-rw-r--r--doc/source/config/job.rst139
-rw-r--r--doc/source/config/nodeset.rst56
-rw-r--r--doc/source/config/pipeline.rst13
-rw-r--r--doc/source/config/project.rst14
-rw-r--r--doc/source/config/queue.rst53
-rw-r--r--doc/source/config/semaphore.rst4
-rw-r--r--doc/source/configuration.rst199
-rw-r--r--doc/source/developer/ansible.rst93
-rw-r--r--doc/source/developer/index.rst1
-rw-r--r--doc/source/developer/metrics.rst74
-rw-r--r--doc/source/developer/model-changelog.rst49
-rw-r--r--doc/source/developer/specs/index.rst10
-rw-r--r--doc/source/developer/specs/nodepool-in-zuul.rst743
-rw-r--r--doc/source/developer/specs/tracing.rst323
-rw-r--r--doc/source/developer/zookeeper.rst24
-rw-r--r--doc/source/drivers/gerrit.rst18
-rw-r--r--doc/source/drivers/github.rst31
-rw-r--r--doc/source/drivers/mqtt.rst6
-rw-r--r--doc/source/drivers/timer.rst29
-rw-r--r--doc/source/examples/docker-compose.yaml2
-rw-r--r--doc/source/examples/keycloak/docker-compose.yaml18
-rw-r--r--doc/source/examples/keycloak/etc_zuul/zuul.conf2
-rw-r--r--doc/source/examples/keycloak/keycloak/zuul-demo-data.json4083
-rw-r--r--doc/source/gating.rst22
-rw-r--r--doc/source/glossary.rst17
-rw-r--r--doc/source/howtos/nodepool_static.rst32
-rw-r--r--doc/source/howtos/openid-with-keycloak.rst19
-rw-r--r--doc/source/howtos/openid-with-microsoft.rst84
-rw-r--r--doc/source/installation.rst14
-rw-r--r--doc/source/job-content.rst24
-rw-r--r--doc/source/monitoring.rst61
-rw-r--r--doc/source/tenants.rst111
-rw-r--r--doc/source/tracing.rst23
-rw-r--r--doc/source/tutorials/keycloak.rst11
-rw-r--r--doc/source/tutorials/quick-start.rst2
-rw-r--r--playbooks/tutorial/admin.yaml25
-rw-r--r--playbooks/tutorial/quick-start.yaml2
-rw-r--r--playbooks/zuul-stream/2.7-container.yaml21
-rw-r--r--playbooks/zuul-stream/create-inventory.yaml38
-rw-r--r--playbooks/zuul-stream/fixtures/Dockerfile.py2724
-rw-r--r--playbooks/zuul-stream/fixtures/library/zuul_fail.py (renamed from zuul/ansible/base/action/network.py)22
-rw-r--r--playbooks/zuul-stream/fixtures/test-stream-failure.yaml12
-rw-r--r--playbooks/zuul-stream/fixtures/test-stream.yaml37
-rw-r--r--playbooks/zuul-stream/functional.yaml121
-rw-r--r--playbooks/zuul-stream/post-ara.yaml11
-rw-r--r--playbooks/zuul-stream/post.yaml12
-rw-r--r--playbooks/zuul-stream/pre.yaml32
-rw-r--r--playbooks/zuul-stream/templates/ansible.cfg.j24
-rw-r--r--playbooks/zuul-stream/validate.yaml29
-rw-r--r--releasenotes/notes/520-windows-7737f20c23b0afee.yaml7
-rw-r--r--releasenotes/notes/add-buildset-statusurl.yaml5
-rw-r--r--releasenotes/notes/always-dynamic-dce165ca8b6e212f.yaml10
-rw-r--r--releasenotes/notes/ansible-2-removed-482fa9e5b944b7d4.yaml6
-rw-r--r--releasenotes/notes/ansible-5-0c9d6626294579e0.yaml32
-rw-r--r--releasenotes/notes/ansible-6-f939b4d160b41ec3.yaml6
-rw-r--r--releasenotes/notes/ansible-plugin-security-90ecd81635e12179.yaml31
-rw-r--r--releasenotes/notes/change-queue-project-790553bd212b50eb.yaml2
-rw-r--r--releasenotes/notes/cherry-pick-merges-9c78fd914b682671.yaml7
-rw-r--r--releasenotes/notes/config-error-reporter-34887223d91544d1.yaml6
-rw-r--r--releasenotes/notes/deduplicate-ac171d3206eb43b3.yaml6
-rw-r--r--releasenotes/notes/dependency-validation-000f63204da83b4a.yaml12
-rw-r--r--releasenotes/notes/deprecate-ansible-2-4c22db35d3c6c765.yaml5
-rw-r--r--releasenotes/notes/deps-by-topic-a0e5733e5406a610.yaml6
-rw-r--r--releasenotes/notes/dequeue-on-missing-reqs-897210de746b3585.yaml6
-rw-r--r--releasenotes/notes/gearmanectomy-ecec32b3764eafc1.yaml2
-rw-r--r--releasenotes/notes/gerrit-ssh-server-a183363bac9d7ff8.yaml6
-rw-r--r--releasenotes/notes/gerrit-submit-whole-topic-5fef75db6ca450e8.yaml20
-rw-r--r--releasenotes/notes/global-semaphores-719828567158982a.yaml5
-rw-r--r--releasenotes/notes/implied-branch-exact-match-74cd3f227a2f6361.yaml10
-rw-r--r--releasenotes/notes/include-branches-493b6bb04414341b.yaml9
-rw-r--r--releasenotes/notes/merge-conflict-rename-2-1e60065f196e48af.yaml6
-rw-r--r--releasenotes/notes/mqtt-include-returned-data-c5836db472907c42.yaml6
-rw-r--r--releasenotes/notes/ms-login-5be892f3c151bfe7.yaml5
-rw-r--r--releasenotes/notes/network-vars-60fd922781da7b92.yaml6
-rw-r--r--releasenotes/notes/no-jobs-ec2aa5200d91044b.yaml6
-rw-r--r--releasenotes/notes/no-jobs2-fe2df7e33aa07acd.yaml5
-rw-r--r--releasenotes/notes/nodeset-alternatives-7cc39a69ac4f1481.yaml7
-rw-r--r--releasenotes/notes/pipeline-queue-removal-475caa7091f7e43f.yaml6
-rw-r--r--releasenotes/notes/project-regex-update-dcc183d923a6acdd.yaml8
-rw-r--r--releasenotes/notes/promote-check-f1ecf4826245c43d.yaml11
-rw-r--r--releasenotes/notes/prune-database-eca38464b9606254.yaml21
-rw-r--r--releasenotes/notes/remove-ara-f64d6d2408dde1e5.yaml5
-rw-r--r--releasenotes/notes/repo_cache-5524b183a8bc3e6a.yaml8
-rw-r--r--releasenotes/notes/submitted-together-query-f2a04313193dd101.yaml5
-rw-r--r--releasenotes/notes/timer-jitter-3d3df10d0e75f892.yaml7
-rw-r--r--releasenotes/notes/total-resource-usage-stats-5d6ce932e1f249d2.yaml25
-rw-r--r--releasenotes/notes/unrestricted-ansible-6ae00e3aa1b1d3c6.yaml19
-rw-r--r--releasenotes/notes/wait-for-init-934370422b22b442.yaml8
-rw-r--r--releasenotes/notes/wip-trigger-ad601ff3da30b845.yaml5
-rw-r--r--releasenotes/notes/zuul-admin-cli-53f52cff1aad986c.yaml7
-rw-r--r--releasenotes/notes/zuul-return-retry-814467d82ea467dc.yaml12
-rw-r--r--requirements.txt3
-rw-r--r--setup.cfg13
-rw-r--r--tests/base.py367
-rw-r--r--tests/fakegithub.py1
-rw-r--r--tests/fakegitlab.py9
-rw-r--r--tests/fixtures/bwrap-mounts/archive.tarbin10240 -> 0 bytes
-rw-r--r--tests/fixtures/bwrap-mounts/assemble/one1
-rw-r--r--tests/fixtures/bwrap-mounts/assemble/two1
-rw-r--r--tests/fixtures/bwrap-mounts/file1
-rw-r--r--tests/fixtures/bwrap-mounts/patch7
-rw-r--r--tests/fixtures/bwrap-mounts/patch-dest/readme.txt1
-rw-r--r--tests/fixtures/bwrap-mounts/script.sh3
-rw-r--r--tests/fixtures/bwrap-mounts/vars.yaml3
-rw-r--r--tests/fixtures/bwrap-mounts/vars/one.yaml3
-rw-r--r--tests/fixtures/bwrap-mounts/vars/two.yaml3
-rw-r--r--tests/fixtures/config/ansible-callbacks/git/common-config/playbooks/callback.yaml6
-rw-r--r--tests/fixtures/config/ansible-callbacks/git/common-config/playbooks/callback_plugins/test_callback.py15
-rw-r--r--tests/fixtures/config/ansible-callbacks/main.yaml1
-rw-r--r--tests/fixtures/config/ansible-callbacks/main5.yaml7
-rw-r--r--tests/fixtures/config/ansible-callbacks/main6.yaml7
-rw-r--r--tests/fixtures/config/ansible-json-string-results/git/org_project/playbooks/json-results-strings.yaml18
-rw-r--r--tests/fixtures/config/ansible-json-string-results/git/org_project/playbooks/library/return_strings.py (renamed from tests/fixtures/config/ansible/git/org_plugin-project/playbooks/roles/test-local-override/library/file.py)21
-rw-r--r--tests/fixtures/config/ansible-json-string-results/git/org_project/zuul.yaml (renamed from tests/fixtures/config/speculative-plugins/git/common-config/zuul.yaml)10
-rw-r--r--tests/fixtures/config/ansible-json-string-results/main.yaml6
-rw-r--r--tests/fixtures/config/ansible-versions/git/common-config/zuul.yaml25
-rw-r--r--tests/fixtures/config/ansible/git/common-config/playbooks/bubblewrap.yaml12
-rw-r--r--tests/fixtures/config/ansible/git/common-config/zuul.yaml6
-rw-r--r--tests/fixtures/config/ansible/git/org_ansible/playbooks/hello-ansible.yaml4
-rw-r--r--tests/fixtures/config/ansible/git/org_plugin-project/playbooks/block_local_override.yaml3
-rw-r--r--tests/fixtures/config/ansible/git/org_plugin-project/playbooks/cartesian.yaml5
-rw-r--r--tests/fixtures/config/ansible/git/org_plugin-project/playbooks/consul_kv.yaml5
-rw-r--r--tests/fixtures/config/ansible/git/org_plugin-project/playbooks/credstash.yaml5
-rw-r--r--tests/fixtures/config/ansible/git/org_plugin-project/playbooks/csvfile_bad.yaml5
-rw-r--r--tests/fixtures/config/ansible/git/org_plugin-project/playbooks/csvfile_good.yaml5
-rw-r--r--tests/fixtures/config/ansible/git/org_plugin-project/playbooks/file_local_bad.yaml6
-rw-r--r--tests/fixtures/config/ansible/git/org_plugin-project/playbooks/file_local_good.yaml6
-rw-r--r--tests/fixtures/config/ansible/git/org_plugin-project/playbooks/fileglob_local_bad.yaml5
-rw-r--r--tests/fixtures/config/ansible/git/org_plugin-project/playbooks/fileglob_local_good.yaml5
-rw-r--r--tests/fixtures/config/ansible/git/org_plugin-project/playbooks/find_local_bad.yaml5
-rw-r--r--tests/fixtures/config/ansible/git/org_plugin-project/playbooks/find_local_good.yaml5
-rw-r--r--tests/fixtures/config/ansible/git/org_plugin-project/playbooks/passwd.yaml5
-rw-r--r--tests/fixtures/config/ansible/git/org_plugin-project/playbooks/password_create_bad.yaml5
-rw-r--r--tests/fixtures/config/ansible/git/org_plugin-project/playbooks/password_create_good.yaml5
-rw-r--r--tests/fixtures/config/ansible/git/org_plugin-project/playbooks/password_null_good.yaml5
-rw-r--r--tests/fixtures/config/ansible/git/org_plugin-project/playbooks/password_read_bad.yaml5
-rw-r--r--tests/fixtures/config/ansible/git/org_plugin-project/playbooks/password_read_good.yaml10
-rw-r--r--tests/fixtures/config/ansible/git/org_plugin-project/playbooks/roles/test-local-override/tasks/main.yaml4
-rw-r--r--tests/fixtures/config/ansible/git/org_plugin-project/playbooks/test.csv1
-rw-r--r--tests/fixtures/config/ansible/git/org_plugin-project/playbooks/uri_bad_path.yaml6
-rw-r--r--tests/fixtures/config/ansible/git/org_plugin-project/playbooks/uri_bad_scheme.yaml5
-rw-r--r--tests/fixtures/config/ansible/git/org_plugin-project/playbooks/zuul_return.yaml6
-rw-r--r--tests/fixtures/config/ansible/git/org_project/.zuul.yaml1
-rw-r--r--tests/fixtures/config/ansible/main.yaml2
-rw-r--r--tests/fixtures/config/ansible/main5.yaml11
-rw-r--r--tests/fixtures/config/ansible/main6.yaml11
-rw-r--r--tests/fixtures/config/authorization/rules-templating/git/common-config/zuul.yaml6
-rw-r--r--tests/fixtures/config/authorization/single-tenant/git/common-config/zuul.yaml6
-rw-r--r--tests/fixtures/config/change-queues/git/common-config/zuul.d/config.yaml2
-rw-r--r--tests/fixtures/config/change-queues/git/org_project/.zuul.yaml2
-rw-r--r--tests/fixtures/config/change-queues/git/org_project3/zuul.d/project.yaml2
-rw-r--r--tests/fixtures/config/circular-dependencies/git/common-config/zuul.yaml1
-rw-r--r--tests/fixtures/config/cross-source-pagure/git/common-config-gerrit/zuul.yaml4
-rw-r--r--tests/fixtures/config/cross-source-pagure/git/github_common-config/zuul.yaml4
-rw-r--r--tests/fixtures/config/cross-source/git/common-config/zuul.yaml4
-rw-r--r--tests/fixtures/config/data-return/git/common-config/playbooks/pass.yaml2
-rw-r--r--tests/fixtures/config/data-return/git/common-config/playbooks/skip-retry-return.yaml7
-rw-r--r--tests/fixtures/config/data-return/git/common-config/zuul.yaml11
-rw-r--r--tests/fixtures/config/data-return/git/org_project-skip-retry/README (renamed from tests/fixtures/config/ansible/git/org_plugin-project/README)0
-rw-r--r--tests/fixtures/config/data-return/main.yaml1
-rwxr-xr-xtests/fixtures/config/duplicate-pipeline/git/common-config/zuul.yaml3
-rw-r--r--tests/fixtures/config/dynamic-only-project/dynamic.yaml10
-rw-r--r--tests/fixtures/config/dynamic-only-project/exclude.yaml10
-rw-r--r--tests/fixtures/config/dynamic-only-project/git/common-config/playbooks/run.yaml1
-rw-r--r--tests/fixtures/config/dynamic-only-project/git/common-config/zuul.yaml67
-rw-r--r--tests/fixtures/config/dynamic-only-project/git/org_project/README (renamed from tests/fixtures/config/speculative-plugins/git/org_project/README)0
-rw-r--r--tests/fixtures/config/dynamic-only-project/git/org_project/zuul.yaml17
-rw-r--r--tests/fixtures/config/dynamic-only-project/include.yaml11
-rw-r--r--tests/fixtures/config/empty-config/git/common-config/README (renamed from tests/fixtures/bwrap-mounts/dir/file)0
-rw-r--r--tests/fixtures/config/empty-config/git/common-config/new-zuul.yaml52
-rw-r--r--tests/fixtures/config/empty-config/git/common-config/playbooks/run.yaml2
-rw-r--r--tests/fixtures/config/empty-config/git/org_project/README1
-rw-r--r--tests/fixtures/config/empty-config/main.yaml8
-rw-r--r--tests/fixtures/config/executor-facts/git/org_project/playbooks/datetime-fact.yaml5
-rw-r--r--tests/fixtures/config/executor-facts/main.yaml1
-rw-r--r--tests/fixtures/config/executor-facts/main5.yaml9
-rw-r--r--tests/fixtures/config/executor-facts/main6.yaml9
-rw-r--r--tests/fixtures/config/global-semaphores-config/broken.yaml10
-rw-r--r--tests/fixtures/config/global-semaphores-config/git/common-config/playbooks/run.yaml1
-rw-r--r--tests/fixtures/config/global-semaphores-config/git/common-config/zuul.yaml52
-rw-r--r--tests/fixtures/config/global-semaphores-config/git/org_project1/README1
-rw-r--r--tests/fixtures/config/global-semaphores-config/git/org_project1/zuul.yaml19
-rw-r--r--tests/fixtures/config/global-semaphores-config/git/org_project2/README1
-rw-r--r--tests/fixtures/config/global-semaphores-config/git/org_project2/zuul.yaml14
-rw-r--r--tests/fixtures/config/global-semaphores-config/git/org_project3/README1
-rw-r--r--tests/fixtures/config/global-semaphores-config/git/org_project3/zuul.yaml20
-rw-r--r--tests/fixtures/config/global-semaphores-config/main.yaml34
-rw-r--r--tests/fixtures/config/global-semaphores/git/common-config/playbooks/run.yaml1
-rw-r--r--tests/fixtures/config/global-semaphores/git/common-config/zuul.yaml44
-rw-r--r--tests/fixtures/config/global-semaphores/git/org_project1/README1
-rw-r--r--tests/fixtures/config/global-semaphores/git/org_project1/zuul.yaml (renamed from tests/fixtures/config/speculative-plugins/git/org_project/zuul.yaml)2
-rw-r--r--tests/fixtures/config/global-semaphores/git/org_project2/README1
-rw-r--r--tests/fixtures/config/global-semaphores/git/org_project2/zuul.yaml4
-rw-r--r--tests/fixtures/config/global-semaphores/main.yaml25
-rw-r--r--tests/fixtures/config/in-repo-dir/git/org_project2/.extra.yaml2
-rw-r--r--tests/fixtures/config/in-repo-dir/git/org_project2/.zuul.yaml6
-rw-r--r--tests/fixtures/config/in-repo-dir/git/org_project2/README1
-rw-r--r--tests/fixtures/config/in-repo-dir/git/org_project2/extra.d/jobs-private.yaml2
-rw-r--r--tests/fixtures/config/in-repo-dir/main.yaml4
-rw-r--r--tests/fixtures/config/inventory/git/common-config/playbooks/network.yaml9
-rw-r--r--tests/fixtures/config/inventory/git/common-config/zuul.yaml28
-rw-r--r--tests/fixtures/config/inventory/git/org_project/.zuul.yaml3
-rw-r--r--tests/fixtures/config/inventory/git/org_project2/.zuul.yaml3
-rw-r--r--tests/fixtures/config/inventory/git/org_project3/.zuul.yaml5
-rw-r--r--tests/fixtures/config/mqtt-driver/git/common-config/zuul.d/config.yaml4
-rw-r--r--tests/fixtures/config/openstack/git/project-config/zuul.yaml8
-rw-r--r--tests/fixtures/config/provides-requires-pause/git/org_project1/zuul.yaml2
-rw-r--r--tests/fixtures/config/provides-requires-pause/git/org_project2/zuul.yaml2
-rw-r--r--tests/fixtures/config/remote-action-modules/git/common-config/roles/common-copy/files/common-file1
-rw-r--r--tests/fixtures/config/remote-action-modules/git/common-config/roles/common-copy/tasks/main.yaml9
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-bad-dir-with-symlink.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-bad-symlink.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-bad.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-delegate.yaml3
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-good.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-localhost.yaml11
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-bad-dir-with-symlink.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-bad-symlink.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-bad.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-delegate.yaml3
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-good.yaml5
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-localhost.yaml11
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad-dir-symlink.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad-dir-with-double-symlink.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad-dir-with-symlink.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad-dir.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad-symlink.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-good-dir.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-good.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/known-hosts-bad.yaml8
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/known-hosts-delegate.yaml7
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/known-hosts-good.yaml6
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/known-hosts-localhost.yaml6
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/patch-bad-symlink.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/patch-bad.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/patch-delegate.yaml3
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/patch-good.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/patch-localhost.yaml11
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/raw-delegate.yaml3
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/raw-good.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/raw-localhost.yaml11
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test-delegate/files/dir/resolv.conf1
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test-delegate/tasks/assemble-delegate.yaml14
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test-delegate/tasks/main.yaml22
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test-localhost/files/dir/resolv.conf1
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test-localhost/tasks/main.yaml13
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test/files/dir-symlink/one1
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test/files/dir/resolv.conf1
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test/files/symlink1
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test/tasks/main.yaml10
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test-delegate/files/file0
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test-delegate/tasks/copy-delegate.yaml13
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test-delegate/tasks/main.yaml27
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test-localhost/files/file0
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test-localhost/tasks/main.yaml12
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test/files/dir-symlink/symlink1
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test/files/file0
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test/files/symlink1
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test/tasks/main.yaml9
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevars-test/tasks/main.yaml2
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevars-test/vars/symlink.yaml1
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevars-test/vars/vars.yaml0
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/tasks/main.yaml3
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir-double-symlink/double-symlink-sidekick1
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir-double-symlink/one.yaml3
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir-symlink/one.yaml3
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir-symlink/two.yaml1
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir/sub/recursive-link1
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir/vars.yaml0
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/double-symlink-sidekick/vars.yaml1
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/symlink1
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-delegate/files/patch7
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-delegate/files/readme.txt1
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-delegate/tasks/main.yaml41
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-delegate/tasks/patch-delegate.yaml29
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-localhost/files/patch7
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-localhost/files/readme.txt1
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-localhost/tasks/main.yaml27
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test/files/patch7
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test/files/readme.txt1
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test/files/symlink1
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test/tasks/main.yaml15
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/raw-test-delegate/tasks/main.yaml5
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/raw-test-delegate/tasks/script-delegate.yaml11
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/raw-test-localhost/tasks/main.yaml10
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test-delegate/files/script.sh3
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test-delegate/tasks/main.yaml5
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test-delegate/tasks/script-delegate.yaml11
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test-localhost/files/script.sh3
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test-localhost/tasks/main.yaml10
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test/files/archive.tarbin3072 -> 0 bytes
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test/files/one1
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test/files/script.sh3
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test/files/symlink1
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test/tasks/main.yaml2
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test-delegate/tasks/main.yaml21
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test-delegate/tasks/template-delegate.yaml13
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test-delegate/templates/template0
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test-localhost/tasks/main.yaml12
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test-localhost/templates/template0
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test/tasks/main.yaml9
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test/templates/symlink1
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test/templates/template0
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test-delegate/files/archive.tarbin10240 -> 0 bytes
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test-delegate/tasks/main.yaml21
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test-delegate/tasks/unarchive-delegate.yaml13
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test-localhost/files/archive.tarbin10240 -> 0 bytes
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test-localhost/tasks/main.yaml12
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test/files/archive.tarbin10240 -> 0 bytes
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test/files/symlink1
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test/tasks/main.yaml9
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/script-bad-symlink.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/script-bad.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/script-delegate.yaml3
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/script-good.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/script-localhost.yaml11
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/shell-delegate.yaml12
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/shell-localhost.yaml10
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-bad-pull.yaml12
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-bad-push.yaml12
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-delegate-good.yaml59
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-good.yaml57
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-rsh-bad.yaml8
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-rsh-env-bad.yaml8
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/template-bad-symlink.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/template-bad.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/template-delegate.yaml3
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/template-good.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/template-localhost.yaml11
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/unarchive-bad-symlink.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/unarchive-bad.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/unarchive-delegate.yaml3
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/unarchive-good.yaml4
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/unarchive-localhost.yaml11
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/uri-bad-dest.yaml6
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/uri-bad-src.yaml7
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/uri-bad-url.yaml14
-rw-r--r--tests/fixtures/config/remote-action-modules/git/org_project/playbooks/uri-good.yaml16
-rw-r--r--tests/fixtures/config/remote-zuul-stream/git/common-config/playbooks/command-localhost.yaml7
-rw-r--r--tests/fixtures/config/remote-zuul-stream/git/common-config/zuul.yaml4
-rw-r--r--tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/command.yaml41
-rwxr-xr-xtests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/library/broken_module_exception.py2
-rwxr-xr-xtests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/library/broken_module_no_result.py2
-rw-r--r--tests/fixtures/config/remote-zuul-stream/git/org_project/roles/echo-role/tasks/main.yaml2
-rw-r--r--tests/fixtures/config/remote-zuul-stream/git/org_project/roles/include-echo-role/tasks/main.yaml3
-rw-r--r--tests/fixtures/config/requirements/state/git/common-config/zuul.yaml23
-rw-r--r--tests/fixtures/config/requirements/state/git/wip-project/README1
-rw-r--r--tests/fixtures/config/requirements/state/main.yaml1
-rw-r--r--tests/fixtures/config/single-tenant/git/common-config/zuul.yaml6
-rw-r--r--tests/fixtures/config/single-tenant/git/org_project3/README1
-rw-r--r--tests/fixtures/config/single-tenant/git/org_project3/zuul.yaml25
-rw-r--r--tests/fixtures/config/single-tenant/main-model-upgrade.yaml (renamed from tests/fixtures/config/speculative-plugins/main.yaml)2
-rw-r--r--tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-bare-role/bare-role/filter_plugins/main.py14
-rw-r--r--tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-bare-role/bare-role/tasks/main.yaml3
-rw-r--r--tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-bare-role/test.yaml4
-rw-r--r--tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-playbook-symlink/filter_plugins1
-rw-r--r--tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-playbook-symlink/test.yaml5
-rw-r--r--tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-playbook/filter_plugins/main.py14
-rw-r--r--tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-playbook/test.yaml5
-rw-r--r--tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-role/roles/local-role/filter_plugins/main.py14
-rw-r--r--tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-role/roles/local-role/tasks/main.yaml3
-rw-r--r--tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-role/test.yaml4
-rw-r--r--tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-shared-bare-role/test.yaml4
-rw-r--r--tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-shared-role/test.yaml4
-rw-r--r--tests/fixtures/config/speculative-plugins/git/org_project2/roles/shared-role/filter_plugins/main.py14
-rw-r--r--tests/fixtures/config/speculative-plugins/git/org_project2/roles/shared-role/tasks/main.yaml3
-rw-r--r--tests/fixtures/config/speculative-plugins/git/org_project3/filter_plugins/main.py14
-rw-r--r--tests/fixtures/config/speculative-plugins/git/org_project3/tasks/main.yaml3
-rw-r--r--tests/fixtures/config/speculative-plugins/git/org_projectrole/playbooks/filter-plugin-repo-role/test.yaml4
-rw-r--r--tests/fixtures/config/speculative-plugins/git/org_projectrole/roles/project-role/filter_plugins/main.py14
-rw-r--r--tests/fixtures/config/speculative-plugins/git/org_projectrole/roles/project-role/tasks/main.yaml3
-rw-r--r--tests/fixtures/config/sql-driver/git/common-config/zuul.yaml2
-rw-r--r--tests/fixtures/config/streamer/git/common-config/playbooks/python27.yaml12
-rw-r--r--tests/fixtures/config/tenant-parser/exclude-branches.yaml12
-rw-r--r--tests/fixtures/config/tenant-parser/extra.yaml3
-rw-r--r--tests/fixtures/config/tenant-parser/git/org_project6/.zuul.yaml (renamed from tests/fixtures/config/ansible/git/org_plugin-project/.zuul.yaml)0
-rw-r--r--tests/fixtures/config/tenant-parser/git/org_project6/other/extra.d/extra.yaml9
-rw-r--r--tests/fixtures/config/tenant-parser/git/org_project6/playbooks/common.yaml2
-rw-r--r--tests/fixtures/config/tenant-parser/include-branches.yaml12
-rw-r--r--tests/fixtures/config/two-tenant/exclude-all.yaml20
-rw-r--r--tests/fixtures/layout.yaml233
-rw-r--r--tests/fixtures/layouts/circular-deps-node-failure.yaml62
-rw-r--r--tests/fixtures/layouts/crd-github.yaml4
-rw-r--r--tests/fixtures/layouts/crd-gitlab.yaml6
-rw-r--r--tests/fixtures/layouts/crd-pagure.yaml4
-rw-r--r--tests/fixtures/layouts/deps-by-topic.yaml70
-rw-r--r--tests/fixtures/layouts/files-github.yaml7
-rw-r--r--tests/fixtures/layouts/files-gitlab.yaml31
-rw-r--r--tests/fixtures/layouts/files-pagure.yaml7
-rw-r--r--tests/fixtures/layouts/freeze-job-failure.yaml32
-rw-r--r--tests/fixtures/layouts/job-dedup-auto-shared.yaml65
-rw-r--r--tests/fixtures/layouts/job-dedup-auto-unshared.yaml62
-rw-r--r--tests/fixtures/layouts/job-dedup-auto.yaml61
-rw-r--r--tests/fixtures/layouts/job-dedup-empty-nodeset.yaml61
-rw-r--r--tests/fixtures/layouts/job-dedup-false.yaml67
-rw-r--r--tests/fixtures/layouts/job-dedup-noop.yaml55
-rw-r--r--tests/fixtures/layouts/job-dedup-parent-data.yaml81
-rw-r--r--tests/fixtures/layouts/job-dedup-retry-child.yaml65
-rw-r--r--tests/fixtures/layouts/job-dedup-retry.yaml66
-rw-r--r--tests/fixtures/layouts/job-dedup-semaphore-first.yaml71
-rw-r--r--tests/fixtures/layouts/job-dedup-semaphore.yaml70
-rw-r--r--tests/fixtures/layouts/job-dedup-true.yaml63
-rw-r--r--tests/fixtures/layouts/merge-failure.yaml4
-rw-r--r--tests/fixtures/layouts/merging-gitlab-squash-merge.yaml28
-rw-r--r--tests/fixtures/layouts/no-jobs-reporting.yaml44
-rw-r--r--tests/fixtures/layouts/nodeset-alternatives.yaml14
-rw-r--r--tests/fixtures/layouts/nodeset-fallback.yaml66
-rw-r--r--tests/fixtures/layouts/not-skip-when-reenqueue.yaml47
-rw-r--r--tests/fixtures/layouts/provides-requires-two-jobs.yaml4
-rw-r--r--tests/fixtures/layouts/provides-requires.yaml4
-rw-r--r--tests/fixtures/layouts/regex-queue.yaml2
-rw-r--r--tests/fixtures/layouts/regex-template-queue.yaml2
-rw-r--r--tests/fixtures/layouts/repo-checkout-four-project.yaml8
-rw-r--r--tests/fixtures/layouts/repo-checkout-six-project.yaml12
-rw-r--r--tests/fixtures/layouts/repo-checkout-two-project.yaml4
-rw-r--r--tests/fixtures/layouts/serial.yaml4
-rw-r--r--tests/fixtures/layouts/sos-circular.yaml1
-rw-r--r--tests/fixtures/layouts/special-characters-job.yaml2
-rw-r--r--tests/fixtures/layouts/submitted-together-per-branch.yaml70
-rw-r--r--tests/fixtures/layouts/template-queue.yaml2
-rw-r--r--tests/fixtures/layouts/three-projects.yaml6
-rw-r--r--tests/fixtures/layouts/timer-freeze-job-failure.yaml26
-rw-r--r--tests/fixtures/layouts/trigger-sequence.yaml75
-rw-r--r--tests/fixtures/layouts/two-projects-integrated.yaml19
-rw-r--r--tests/fixtures/zuul-default-ansible-version.conf3
-rw-r--r--tests/fixtures/zuul-gerrit-github.conf1
-rw-r--r--tests/fixtures/zuul-gerrit-ssh.conf38
-rw-r--r--tests/fixtures/zuul-tracing.conf42
-rw-r--r--tests/otlp_fixture.py58
-rw-r--r--tests/remote/test_remote_action_modules.py154
-rw-r--r--tests/remote/test_remote_zuul_json.py8
-rw-r--r--tests/remote/test_remote_zuul_stream.py113
-rw-r--r--tests/unit/test_circular_dependencies.py909
-rw-r--r--tests/unit/test_client.py155
-rw-r--r--tests/unit/test_configloader.py208
-rw-r--r--tests/unit/test_connection.py174
-rw-r--r--tests/unit/test_cross_crd.py4
-rw-r--r--tests/unit/test_database.py44
-rw-r--r--tests/unit/test_executor.py42
-rw-r--r--tests/unit/test_gerrit.py218
-rw-r--r--tests/unit/test_gerrit_crd.py8
-rw-r--r--tests/unit/test_gerrit_legacy_crd.py8
-rw-r--r--tests/unit/test_github_driver.py240
-rw-r--r--tests/unit/test_gitlab_driver.py52
-rw-r--r--tests/unit/test_global_semaphores.py169
-rw-r--r--tests/unit/test_inventory.py50
-rw-r--r--tests/unit/test_merger_repo.py47
-rw-r--r--tests/unit/test_model.py20
-rw-r--r--tests/unit/test_model_upgrade.py251
-rw-r--r--tests/unit/test_pagure_driver.py30
-rw-r--r--tests/unit/test_reporting.py58
-rw-r--r--tests/unit/test_requirements.py12
-rw-r--r--tests/unit/test_scheduler.py410
-rw-r--r--tests/unit/test_sos.py85
-rw-r--r--tests/unit/test_streaming.py5
-rw-r--r--tests/unit/test_tracing.py199
-rw-r--r--tests/unit/test_v3.py626
-rw-r--r--tests/unit/test_web.py530
-rw-r--r--tests/unit/test_zk.py111
-rw-r--r--tests/zuul_client/test_zuulclient.py89
-rw-r--r--tools/deprecated-queues.py61
-rw-r--r--tools/docker-compose.yaml5
-rwxr-xr-xtools/github-debugging.py26
-rwxr-xr-xtools/test-logs.sh10
-rwxr-xr-xtools/test-setup-docker.sh26
-rwxr-xr-xtools/test-setup.sh4
-rw-r--r--tox.ini9
-rw-r--r--web/package.json5
-rw-r--r--web/public/openapi.yaml8
-rw-r--r--web/src/App.jsx5
-rw-r--r--web/src/App.test.jsx4
-rw-r--r--web/src/actions/auth.js2
-rw-r--r--web/src/actions/freezejob.js84
-rw-r--r--web/src/actions/jobgraph.js83
-rw-r--r--web/src/actions/pipelines.js62
-rw-r--r--web/src/api.js20
-rw-r--r--web/src/containers/auth/Auth.jsx5
-rw-r--r--web/src/containers/build/Artifact.jsx13
-rw-r--r--web/src/containers/build/Build.jsx2
-rw-r--r--web/src/containers/build/BuildOutput.jsx27
-rw-r--r--web/src/containers/build/Buildset.jsx18
-rw-r--r--web/src/containers/build/Console.jsx418
-rw-r--r--web/src/containers/freezejob/FreezeJobToolbar.jsx200
-rw-r--r--web/src/containers/job/JobVariant.jsx13
-rw-r--r--web/src/containers/jobgraph/JobGraph.jsx78
-rw-r--r--web/src/containers/jobgraph/JobGraphDisplay.jsx145
-rw-r--r--web/src/containers/jobgraph/JobGraphToolbar.jsx145
-rw-r--r--web/src/containers/jobs/Jobs.jsx2
-rw-r--r--web/src/containers/logfile/LogFile.jsx5
-rw-r--r--web/src/containers/project/Project.jsx79
-rw-r--r--web/src/containers/project/ProjectVariant.jsx106
-rw-r--r--web/src/containers/status/Change.jsx28
-rw-r--r--web/src/containers/status/ChangePanel.jsx49
-rw-r--r--web/src/containers/status/ChangePanel.test.jsx28
-rw-r--r--web/src/images/logo.svg23
-rw-r--r--web/src/index.css158
-rw-r--r--web/src/pages/FreezeJob.jsx149
-rw-r--r--web/src/pages/Project.jsx99
-rw-r--r--web/src/reducers/auth.js1
-rw-r--r--web/src/reducers/freezejob.js55
-rw-r--r--web/src/reducers/index.js6
-rw-r--r--web/src/reducers/initialState.js2
-rw-r--r--web/src/reducers/jobgraph.js55
-rw-r--r--web/src/reducers/pipelines.js45
-rw-r--r--web/src/routes.js5
-rw-r--r--web/yarn.lock29373
l---------zuul/ansible/2.7/actiontrusted/__init__.py1
l---------zuul/ansible/2.7/actiontrusted/command.py1
l---------zuul/ansible/2.7/actiontrusted/command.pyi1
l---------zuul/ansible/2.8/action/add_host.py1
l---------zuul/ansible/2.8/action/add_host.pyi1
l---------zuul/ansible/2.8/action/aireos.py1
l---------zuul/ansible/2.8/action/aireos.pyi1
l---------zuul/ansible/2.8/action/aireos_config.py1
l---------zuul/ansible/2.8/action/aireos_config.pyi1
l---------zuul/ansible/2.8/action/aruba.py1
l---------zuul/ansible/2.8/action/aruba.pyi1
l---------zuul/ansible/2.8/action/aruba_config.py1
l---------zuul/ansible/2.8/action/aruba_config.pyi1
l---------zuul/ansible/2.8/action/asa.py1
l---------zuul/ansible/2.8/action/asa.pyi1
l---------zuul/ansible/2.8/action/asa_config.py1
l---------zuul/ansible/2.8/action/asa_config.pyi1
l---------zuul/ansible/2.8/action/asa_template.py1
l---------zuul/ansible/2.8/action/asa_template.pyi1
l---------zuul/ansible/2.8/action/assemble.py1
l---------zuul/ansible/2.8/action/assemble.pyi1
l---------zuul/ansible/2.8/action/aws_s3.py1
l---------zuul/ansible/2.8/action/aws_s3.pyi1
l---------zuul/ansible/2.8/action/ce.py1
l---------zuul/ansible/2.8/action/ce.pyi1
l---------zuul/ansible/2.8/action/ce_config.py1
l---------zuul/ansible/2.8/action/ce_config.pyi1
l---------zuul/ansible/2.8/action/ce_template.py1
l---------zuul/ansible/2.8/action/ce_template.pyi1
l---------zuul/ansible/2.8/action/copy.py1
l---------zuul/ansible/2.8/action/copy.pyi1
l---------zuul/ansible/2.8/action/dellos10_config.py1
l---------zuul/ansible/2.8/action/dellos10_config.pyi1
l---------zuul/ansible/2.8/action/dellos6_config.py1
l---------zuul/ansible/2.8/action/dellos6_config.pyi1
l---------zuul/ansible/2.8/action/dellos9_config.py1
l---------zuul/ansible/2.8/action/dellos9_config.pyi1
l---------zuul/ansible/2.8/action/eos_config.py1
l---------zuul/ansible/2.8/action/eos_config.pyi1
l---------zuul/ansible/2.8/action/eos_template.py1
l---------zuul/ansible/2.8/action/eos_template.pyi1
l---------zuul/ansible/2.8/action/fetch.py1
l---------zuul/ansible/2.8/action/fetch.pyi1
l---------zuul/ansible/2.8/action/fortios_config.py1
l---------zuul/ansible/2.8/action/fortios_config.pyi1
l---------zuul/ansible/2.8/action/include_vars.py1
l---------zuul/ansible/2.8/action/include_vars.pyi1
l---------zuul/ansible/2.8/action/ios_config.py1
l---------zuul/ansible/2.8/action/ios_config.pyi1
l---------zuul/ansible/2.8/action/ios_template.py1
l---------zuul/ansible/2.8/action/ios_template.pyi1
l---------zuul/ansible/2.8/action/iosxr_config.py1
l---------zuul/ansible/2.8/action/iosxr_config.pyi1
l---------zuul/ansible/2.8/action/iosxr_template.py1
l---------zuul/ansible/2.8/action/iosxr_template.pyi1
l---------zuul/ansible/2.8/action/junos_config.py1
l---------zuul/ansible/2.8/action/junos_config.pyi1
l---------zuul/ansible/2.8/action/junos_template.py1
l---------zuul/ansible/2.8/action/junos_template.pyi1
l---------zuul/ansible/2.8/action/net_banner.py1
l---------zuul/ansible/2.8/action/net_banner.pyi1
l---------zuul/ansible/2.8/action/net_base.py1
l---------zuul/ansible/2.8/action/net_base.pyi1
l---------zuul/ansible/2.8/action/net_config.py1
l---------zuul/ansible/2.8/action/net_config.pyi1
l---------zuul/ansible/2.8/action/net_get.py1
l---------zuul/ansible/2.8/action/net_get.pyi1
l---------zuul/ansible/2.8/action/net_interface.py1
l---------zuul/ansible/2.8/action/net_interface.pyi1
l---------zuul/ansible/2.8/action/net_l2_interface.py1
l---------zuul/ansible/2.8/action/net_l2_interface.pyi1
l---------zuul/ansible/2.8/action/net_l3_interface.py1
l---------zuul/ansible/2.8/action/net_l3_interface.pyi1
l---------zuul/ansible/2.8/action/net_linkagg.py1
l---------zuul/ansible/2.8/action/net_linkagg.pyi1
l---------zuul/ansible/2.8/action/net_lldp.py1
l---------zuul/ansible/2.8/action/net_lldp.pyi1
l---------zuul/ansible/2.8/action/net_lldp_interface.py1
l---------zuul/ansible/2.8/action/net_lldp_interface.pyi1
l---------zuul/ansible/2.8/action/net_logging.py1
l---------zuul/ansible/2.8/action/net_logging.pyi1
l---------zuul/ansible/2.8/action/net_ping.py1
l---------zuul/ansible/2.8/action/net_ping.pyi1
l---------zuul/ansible/2.8/action/net_static_route.py1
l---------zuul/ansible/2.8/action/net_static_route.pyi1
l---------zuul/ansible/2.8/action/net_system.py1
l---------zuul/ansible/2.8/action/net_system.pyi1
l---------zuul/ansible/2.8/action/net_template.py1
l---------zuul/ansible/2.8/action/net_template.pyi1
l---------zuul/ansible/2.8/action/net_user.py1
l---------zuul/ansible/2.8/action/net_user.pyi1
l---------zuul/ansible/2.8/action/net_vlan.py1
l---------zuul/ansible/2.8/action/net_vlan.pyi1
l---------zuul/ansible/2.8/action/net_vrf.py1
l---------zuul/ansible/2.8/action/net_vrf.pyi1
l---------zuul/ansible/2.8/action/netconf_config.py1
l---------zuul/ansible/2.8/action/netconf_config.pyi1
l---------zuul/ansible/2.8/action/network.py1
l---------zuul/ansible/2.8/action/network.pyi1
l---------zuul/ansible/2.8/action/normal.py1
l---------zuul/ansible/2.8/action/normal.pyi1
l---------zuul/ansible/2.8/action/nxos_config.py1
l---------zuul/ansible/2.8/action/nxos_config.pyi1
l---------zuul/ansible/2.8/action/nxos_template.py1
l---------zuul/ansible/2.8/action/nxos_template.pyi1
l---------zuul/ansible/2.8/action/ops_config.py1
l---------zuul/ansible/2.8/action/ops_config.pyi1
l---------zuul/ansible/2.8/action/ops_template.py1
l---------zuul/ansible/2.8/action/ops_template.pyi1
l---------zuul/ansible/2.8/action/patch.py1
l---------zuul/ansible/2.8/action/patch.pyi1
l---------zuul/ansible/2.8/action/raw.py1
l---------zuul/ansible/2.8/action/raw.pyi1
l---------zuul/ansible/2.8/action/script.py1
l---------zuul/ansible/2.8/action/script.pyi1
l---------zuul/ansible/2.8/action/sros_config.py1
l---------zuul/ansible/2.8/action/sros_config.pyi1
l---------zuul/ansible/2.8/action/synchronize.py1
l---------zuul/ansible/2.8/action/synchronize.pyi1
l---------zuul/ansible/2.8/action/template.py1
l---------zuul/ansible/2.8/action/template.pyi1
l---------zuul/ansible/2.8/action/unarchive.py1
l---------zuul/ansible/2.8/action/unarchive.pyi1
l---------zuul/ansible/2.8/action/uri.py1
l---------zuul/ansible/2.8/action/uri.pyi1
l---------zuul/ansible/2.8/action/vyos_config.py1
l---------zuul/ansible/2.8/action/vyos_config.pyi1
l---------zuul/ansible/2.8/action/win_copy.py1
l---------zuul/ansible/2.8/action/win_copy.pyi1
l---------zuul/ansible/2.8/action/win_template.py1
l---------zuul/ansible/2.8/action/win_template.pyi1
l---------zuul/ansible/2.8/actiongeneral/__init__.py1
l---------zuul/ansible/2.8/actiongeneral/zuul_return.py1
l---------zuul/ansible/2.8/actiontrusted/__init__.py1
l---------zuul/ansible/2.8/actiontrusted/command.py1
l---------zuul/ansible/2.8/actiontrusted/command.pyi1
l---------zuul/ansible/2.8/lookup/__init__.py1
l---------zuul/ansible/2.8/lookup/_banned.py1
l---------zuul/ansible/2.8/lookup/_banned.pyi1
l---------zuul/ansible/2.8/lookup/chef_databag.py1
l---------zuul/ansible/2.8/lookup/chef_databag.pyi1
l---------zuul/ansible/2.8/lookup/consul_kv.py1
l---------zuul/ansible/2.8/lookup/consul_kv.pyi1
l---------zuul/ansible/2.8/lookup/credstash.py1
l---------zuul/ansible/2.8/lookup/credstash.pyi1
l---------zuul/ansible/2.8/lookup/csvfile.py1
l---------zuul/ansible/2.8/lookup/csvfile.pyi1
l---------zuul/ansible/2.8/lookup/cyberarkpassword.py1
l---------zuul/ansible/2.8/lookup/cyberarkpassword.pyi1
l---------zuul/ansible/2.8/lookup/dig.py1
l---------zuul/ansible/2.8/lookup/dig.pyi1
l---------zuul/ansible/2.8/lookup/dnstxt.py1
l---------zuul/ansible/2.8/lookup/dnstxt.pyi1
l---------zuul/ansible/2.8/lookup/env.py1
l---------zuul/ansible/2.8/lookup/env.pyi1
l---------zuul/ansible/2.8/lookup/etcd.py1
l---------zuul/ansible/2.8/lookup/etcd.pyi1
l---------zuul/ansible/2.8/lookup/file.py1
l---------zuul/ansible/2.8/lookup/file.pyi1
l---------zuul/ansible/2.8/lookup/fileglob.py1
l---------zuul/ansible/2.8/lookup/fileglob.pyi1
l---------zuul/ansible/2.8/lookup/filetree.py1
l---------zuul/ansible/2.8/lookup/filetree.pyi1
l---------zuul/ansible/2.8/lookup/first_found.py1
l---------zuul/ansible/2.8/lookup/first_found.pyi1
l---------zuul/ansible/2.8/lookup/hashi_vault.py1
l---------zuul/ansible/2.8/lookup/hashi_vault.pyi1
l---------zuul/ansible/2.8/lookup/hiera.py1
l---------zuul/ansible/2.8/lookup/hiera.pyi1
l---------zuul/ansible/2.8/lookup/ini.py1
l---------zuul/ansible/2.8/lookup/ini.pyi1
l---------zuul/ansible/2.8/lookup/keyring.py1
l---------zuul/ansible/2.8/lookup/keyring.pyi1
l---------zuul/ansible/2.8/lookup/lastpass.py1
l---------zuul/ansible/2.8/lookup/lastpass.pyi1
l---------zuul/ansible/2.8/lookup/lines.py1
l---------zuul/ansible/2.8/lookup/lines.pyi1
l---------zuul/ansible/2.8/lookup/mongodb.py1
l---------zuul/ansible/2.8/lookup/mongodb.pyi1
l---------zuul/ansible/2.8/lookup/password.py1
l---------zuul/ansible/2.8/lookup/password.pyi1
l---------zuul/ansible/2.8/lookup/passwordstore.py1
l---------zuul/ansible/2.8/lookup/passwordstore.pyi1
l---------zuul/ansible/2.8/lookup/pipe.py1
l---------zuul/ansible/2.8/lookup/pipe.pyi1
l---------zuul/ansible/2.8/lookup/redis_kv.py1
l---------zuul/ansible/2.8/lookup/redis_kv.pyi1
l---------zuul/ansible/2.8/lookup/shelvefile.py1
l---------zuul/ansible/2.8/lookup/shelvefile.pyi1
l---------zuul/ansible/2.8/lookup/template.py1
l---------zuul/ansible/2.8/lookup/template.pyi1
l---------zuul/ansible/2.8/lookup/url.py1
l---------zuul/ansible/2.8/lookup/url.pyi1
l---------zuul/ansible/2.9/action/add_host.py1
l---------zuul/ansible/2.9/action/add_host.pyi1
l---------zuul/ansible/2.9/action/aireos.py1
l---------zuul/ansible/2.9/action/aireos.pyi1
l---------zuul/ansible/2.9/action/aireos_config.py1
l---------zuul/ansible/2.9/action/aireos_config.pyi1
l---------zuul/ansible/2.9/action/aruba.py1
l---------zuul/ansible/2.9/action/aruba.pyi1
l---------zuul/ansible/2.9/action/aruba_config.py1
l---------zuul/ansible/2.9/action/aruba_config.pyi1
l---------zuul/ansible/2.9/action/asa.py1
l---------zuul/ansible/2.9/action/asa.pyi1
l---------zuul/ansible/2.9/action/asa_config.py1
l---------zuul/ansible/2.9/action/asa_config.pyi1
l---------zuul/ansible/2.9/action/asa_template.py1
l---------zuul/ansible/2.9/action/asa_template.pyi1
l---------zuul/ansible/2.9/action/assemble.py1
l---------zuul/ansible/2.9/action/assemble.pyi1
l---------zuul/ansible/2.9/action/aws_s3.py1
l---------zuul/ansible/2.9/action/aws_s3.pyi1
l---------zuul/ansible/2.9/action/ce.py1
l---------zuul/ansible/2.9/action/ce.pyi1
l---------zuul/ansible/2.9/action/ce_config.py1
l---------zuul/ansible/2.9/action/ce_config.pyi1
l---------zuul/ansible/2.9/action/ce_template.py1
l---------zuul/ansible/2.9/action/ce_template.pyi1
l---------zuul/ansible/2.9/action/command.py1
l---------zuul/ansible/2.9/action/command.pyi1
l---------zuul/ansible/2.9/action/copy.py1
l---------zuul/ansible/2.9/action/copy.pyi1
l---------zuul/ansible/2.9/action/dellos10_config.py1
l---------zuul/ansible/2.9/action/dellos10_config.pyi1
l---------zuul/ansible/2.9/action/dellos6_config.py1
l---------zuul/ansible/2.9/action/dellos6_config.pyi1
l---------zuul/ansible/2.9/action/dellos9_config.py1
l---------zuul/ansible/2.9/action/dellos9_config.pyi1
l---------zuul/ansible/2.9/action/eos_config.py1
l---------zuul/ansible/2.9/action/eos_config.pyi1
l---------zuul/ansible/2.9/action/eos_template.py1
l---------zuul/ansible/2.9/action/eos_template.pyi1
l---------zuul/ansible/2.9/action/fetch.py1
l---------zuul/ansible/2.9/action/fetch.pyi1
l---------zuul/ansible/2.9/action/fortios_config.py1
l---------zuul/ansible/2.9/action/fortios_config.pyi1
l---------zuul/ansible/2.9/action/include_vars.py1
l---------zuul/ansible/2.9/action/include_vars.pyi1
l---------zuul/ansible/2.9/action/ios_config.py1
l---------zuul/ansible/2.9/action/ios_config.pyi1
l---------zuul/ansible/2.9/action/ios_template.py1
l---------zuul/ansible/2.9/action/ios_template.pyi1
l---------zuul/ansible/2.9/action/iosxr_config.py1
l---------zuul/ansible/2.9/action/iosxr_config.pyi1
l---------zuul/ansible/2.9/action/iosxr_template.py1
l---------zuul/ansible/2.9/action/iosxr_template.pyi1
l---------zuul/ansible/2.9/action/junos_config.py1
l---------zuul/ansible/2.9/action/junos_config.pyi1
l---------zuul/ansible/2.9/action/junos_template.py1
l---------zuul/ansible/2.9/action/junos_template.pyi1
l---------zuul/ansible/2.9/action/net_banner.py1
l---------zuul/ansible/2.9/action/net_banner.pyi1
l---------zuul/ansible/2.9/action/net_base.py1
l---------zuul/ansible/2.9/action/net_base.pyi1
l---------zuul/ansible/2.9/action/net_config.py1
l---------zuul/ansible/2.9/action/net_config.pyi1
l---------zuul/ansible/2.9/action/net_get.py1
l---------zuul/ansible/2.9/action/net_get.pyi1
l---------zuul/ansible/2.9/action/net_interface.py1
l---------zuul/ansible/2.9/action/net_interface.pyi1
l---------zuul/ansible/2.9/action/net_l2_interface.py1
l---------zuul/ansible/2.9/action/net_l2_interface.pyi1
l---------zuul/ansible/2.9/action/net_l3_interface.py1
l---------zuul/ansible/2.9/action/net_l3_interface.pyi1
l---------zuul/ansible/2.9/action/net_linkagg.py1
l---------zuul/ansible/2.9/action/net_linkagg.pyi1
l---------zuul/ansible/2.9/action/net_lldp.py1
l---------zuul/ansible/2.9/action/net_lldp.pyi1
l---------zuul/ansible/2.9/action/net_lldp_interface.py1
l---------zuul/ansible/2.9/action/net_lldp_interface.pyi1
l---------zuul/ansible/2.9/action/net_logging.py1
l---------zuul/ansible/2.9/action/net_logging.pyi1
l---------zuul/ansible/2.9/action/net_ping.py1
l---------zuul/ansible/2.9/action/net_ping.pyi1
l---------zuul/ansible/2.9/action/net_static_route.py1
l---------zuul/ansible/2.9/action/net_static_route.pyi1
l---------zuul/ansible/2.9/action/net_system.py1
l---------zuul/ansible/2.9/action/net_system.pyi1
l---------zuul/ansible/2.9/action/net_template.py1
l---------zuul/ansible/2.9/action/net_template.pyi1
l---------zuul/ansible/2.9/action/net_user.py1
l---------zuul/ansible/2.9/action/net_user.pyi1
l---------zuul/ansible/2.9/action/net_vlan.py1
l---------zuul/ansible/2.9/action/net_vlan.pyi1
l---------zuul/ansible/2.9/action/net_vrf.py1
l---------zuul/ansible/2.9/action/net_vrf.pyi1
l---------zuul/ansible/2.9/action/netconf_config.py1
l---------zuul/ansible/2.9/action/netconf_config.pyi1
l---------zuul/ansible/2.9/action/network.py1
l---------zuul/ansible/2.9/action/network.pyi1
l---------zuul/ansible/2.9/action/normal.py1
l---------zuul/ansible/2.9/action/normal.pyi1
l---------zuul/ansible/2.9/action/nxos_config.py1
l---------zuul/ansible/2.9/action/nxos_config.pyi1
l---------zuul/ansible/2.9/action/nxos_template.py1
l---------zuul/ansible/2.9/action/nxos_template.pyi1
l---------zuul/ansible/2.9/action/ops_config.py1
l---------zuul/ansible/2.9/action/ops_config.pyi1
l---------zuul/ansible/2.9/action/ops_template.py1
l---------zuul/ansible/2.9/action/ops_template.pyi1
l---------zuul/ansible/2.9/action/patch.py1
l---------zuul/ansible/2.9/action/patch.pyi1
l---------zuul/ansible/2.9/action/raw.py1
l---------zuul/ansible/2.9/action/raw.pyi1
l---------zuul/ansible/2.9/action/script.py1
l---------zuul/ansible/2.9/action/script.pyi1
l---------zuul/ansible/2.9/action/sros_config.py1
l---------zuul/ansible/2.9/action/sros_config.pyi1
l---------zuul/ansible/2.9/action/synchronize.py1
l---------zuul/ansible/2.9/action/synchronize.pyi1
l---------zuul/ansible/2.9/action/template.py1
l---------zuul/ansible/2.9/action/template.pyi1
l---------zuul/ansible/2.9/action/unarchive.py1
l---------zuul/ansible/2.9/action/unarchive.pyi1
l---------zuul/ansible/2.9/action/uri.py1
l---------zuul/ansible/2.9/action/uri.pyi1
l---------zuul/ansible/2.9/action/vyos_config.py1
l---------zuul/ansible/2.9/action/vyos_config.pyi1
l---------zuul/ansible/2.9/action/win_copy.py1
l---------zuul/ansible/2.9/action/win_copy.pyi1
l---------zuul/ansible/2.9/action/win_template.py1
l---------zuul/ansible/2.9/action/win_template.pyi1
l---------zuul/ansible/2.9/actiongeneral/__init__.py1
l---------zuul/ansible/2.9/actiongeneral/zuul_return.py1
l---------zuul/ansible/2.9/actiontrusted/__init__.py1
l---------zuul/ansible/2.9/actiontrusted/command.py1
l---------zuul/ansible/2.9/actiontrusted/command.pyi1
l---------zuul/ansible/2.9/lookup/__init__.py1
l---------zuul/ansible/2.9/lookup/_banned.py1
l---------zuul/ansible/2.9/lookup/_banned.pyi1
l---------zuul/ansible/2.9/lookup/chef_databag.py1
l---------zuul/ansible/2.9/lookup/chef_databag.pyi1
l---------zuul/ansible/2.9/lookup/consul_kv.py1
l---------zuul/ansible/2.9/lookup/consul_kv.pyi1
l---------zuul/ansible/2.9/lookup/credstash.py1
l---------zuul/ansible/2.9/lookup/credstash.pyi1
l---------zuul/ansible/2.9/lookup/csvfile.py1
l---------zuul/ansible/2.9/lookup/csvfile.pyi1
l---------zuul/ansible/2.9/lookup/cyberarkpassword.py1
l---------zuul/ansible/2.9/lookup/cyberarkpassword.pyi1
l---------zuul/ansible/2.9/lookup/dig.py1
l---------zuul/ansible/2.9/lookup/dig.pyi1
l---------zuul/ansible/2.9/lookup/dnstxt.py1
l---------zuul/ansible/2.9/lookup/dnstxt.pyi1
l---------zuul/ansible/2.9/lookup/env.py1
l---------zuul/ansible/2.9/lookup/env.pyi1
l---------zuul/ansible/2.9/lookup/etcd.py1
l---------zuul/ansible/2.9/lookup/etcd.pyi1
l---------zuul/ansible/2.9/lookup/file.py1
l---------zuul/ansible/2.9/lookup/file.pyi1
l---------zuul/ansible/2.9/lookup/fileglob.py1
l---------zuul/ansible/2.9/lookup/fileglob.pyi1
l---------zuul/ansible/2.9/lookup/filetree.py1
l---------zuul/ansible/2.9/lookup/filetree.pyi1
l---------zuul/ansible/2.9/lookup/first_found.py1
l---------zuul/ansible/2.9/lookup/first_found.pyi1
l---------zuul/ansible/2.9/lookup/hashi_vault.py1
l---------zuul/ansible/2.9/lookup/hashi_vault.pyi1
l---------zuul/ansible/2.9/lookup/hiera.py1
l---------zuul/ansible/2.9/lookup/hiera.pyi1
l---------zuul/ansible/2.9/lookup/ini.py1
l---------zuul/ansible/2.9/lookup/ini.pyi1
l---------zuul/ansible/2.9/lookup/keyring.py1
l---------zuul/ansible/2.9/lookup/keyring.pyi1
l---------zuul/ansible/2.9/lookup/lastpass.py1
l---------zuul/ansible/2.9/lookup/lastpass.pyi1
l---------zuul/ansible/2.9/lookup/lines.py1
l---------zuul/ansible/2.9/lookup/lines.pyi1
l---------zuul/ansible/2.9/lookup/mongodb.py1
l---------zuul/ansible/2.9/lookup/mongodb.pyi1
l---------zuul/ansible/2.9/lookup/password.py1
l---------zuul/ansible/2.9/lookup/password.pyi1
l---------zuul/ansible/2.9/lookup/passwordstore.py1
l---------zuul/ansible/2.9/lookup/passwordstore.pyi1
l---------zuul/ansible/2.9/lookup/pipe.py1
l---------zuul/ansible/2.9/lookup/pipe.pyi1
l---------zuul/ansible/2.9/lookup/redis_kv.py1
l---------zuul/ansible/2.9/lookup/redis_kv.pyi1
l---------zuul/ansible/2.9/lookup/shelvefile.py1
l---------zuul/ansible/2.9/lookup/shelvefile.pyi1
l---------zuul/ansible/2.9/lookup/template.py1
l---------zuul/ansible/2.9/lookup/template.pyi1
l---------zuul/ansible/2.9/lookup/url.py1
l---------zuul/ansible/2.9/lookup/url.pyi1
l---------zuul/ansible/5/action/__init__.py (renamed from zuul/ansible/2.8/action/__init__.py)0
l---------zuul/ansible/5/action/command.py (renamed from zuul/ansible/2.7/action/command.py)0
l---------zuul/ansible/5/action/command.pyi (renamed from zuul/ansible/2.7/action/command.pyi)0
l---------zuul/ansible/5/action/zuul_return.py1
l---------zuul/ansible/5/callback/__init__.py (renamed from zuul/ansible/2.8/callback/__init__.py)0
l---------zuul/ansible/5/callback/zuul_json.py (renamed from zuul/ansible/2.8/callback/zuul_json.py)0
l---------zuul/ansible/5/callback/zuul_stream.py (renamed from zuul/ansible/2.8/callback/zuul_stream.py)0
l---------zuul/ansible/5/callback/zuul_unreachable.py (renamed from zuul/ansible/2.8/callback/zuul_unreachable.py)0
l---------zuul/ansible/5/filter/__init__.py (renamed from zuul/ansible/2.8/filter/__init__.py)0
l---------zuul/ansible/5/filter/zuul_filters.py (renamed from zuul/ansible/2.8/filter/zuul_filters.py)0
l---------zuul/ansible/5/library/__init__.py (renamed from zuul/ansible/2.8/library/__init__.py)0
l---------zuul/ansible/5/library/command.py (renamed from zuul/ansible/2.8/library/command.py)0
l---------zuul/ansible/5/library/zuul_console.py (renamed from zuul/ansible/2.8/library/zuul_console.py)0
l---------zuul/ansible/5/logconfig.py (renamed from zuul/ansible/2.8/logconfig.py)0
l---------zuul/ansible/5/paths.py (renamed from zuul/ansible/2.8/paths.py)0
l---------zuul/ansible/6/action/__init__.py (renamed from zuul/ansible/2.9/action/__init__.py)0
l---------zuul/ansible/6/action/command.py (renamed from zuul/ansible/2.8/action/command.py)0
l---------zuul/ansible/6/action/command.pyi (renamed from zuul/ansible/2.8/action/command.pyi)0
l---------zuul/ansible/6/action/zuul_return.py1
l---------zuul/ansible/6/callback/__init__.py (renamed from zuul/ansible/2.9/callback/__init__.py)0
l---------zuul/ansible/6/callback/zuul_json.py (renamed from zuul/ansible/2.9/callback/zuul_json.py)0
l---------zuul/ansible/6/callback/zuul_stream.py (renamed from zuul/ansible/2.9/callback/zuul_stream.py)0
l---------zuul/ansible/6/callback/zuul_unreachable.py (renamed from zuul/ansible/2.9/callback/zuul_unreachable.py)0
l---------zuul/ansible/6/filter/__init__.py (renamed from zuul/ansible/2.9/filter/__init__.py)0
l---------zuul/ansible/6/filter/zuul_filters.py (renamed from zuul/ansible/2.9/filter/zuul_filters.py)0
l---------zuul/ansible/6/library/__init__.py (renamed from zuul/ansible/2.9/library/__init__.py)0
l---------zuul/ansible/6/library/command.py (renamed from zuul/ansible/2.9/library/command.py)0
l---------zuul/ansible/6/library/zuul_console.py (renamed from zuul/ansible/2.9/library/zuul_console.py)0
l---------zuul/ansible/6/logconfig.py (renamed from zuul/ansible/2.9/logconfig.py)0
l---------zuul/ansible/6/paths.py (renamed from zuul/ansible/2.9/paths.py)0
-rw-r--r--zuul/ansible/base/action/add_host.py48
-rw-r--r--zuul/ansible/base/action/add_host.pyi0
l---------zuul/ansible/base/action/aireos.py1
-rw-r--r--zuul/ansible/base/action/aireos.pyi0
l---------zuul/ansible/base/action/aireos_config.py1
-rw-r--r--zuul/ansible/base/action/aireos_config.pyi0
l---------zuul/ansible/base/action/aruba.py1
-rw-r--r--zuul/ansible/base/action/aruba.pyi0
l---------zuul/ansible/base/action/aruba_config.py1
-rw-r--r--zuul/ansible/base/action/aruba_config.pyi0
l---------zuul/ansible/base/action/asa.py1
-rw-r--r--zuul/ansible/base/action/asa.pyi0
l---------zuul/ansible/base/action/asa_config.py1
-rw-r--r--zuul/ansible/base/action/asa_config.pyi0
l---------zuul/ansible/base/action/asa_template.py1
-rw-r--r--zuul/ansible/base/action/asa_template.pyi0
-rw-r--r--zuul/ansible/base/action/assemble.py35
-rw-r--r--zuul/ansible/base/action/assemble.pyi0
-rw-r--r--zuul/ansible/base/action/aws_s3.py35
-rw-r--r--zuul/ansible/base/action/aws_s3.pyi0
l---------zuul/ansible/base/action/ce.py1
-rw-r--r--zuul/ansible/base/action/ce.pyi0
l---------zuul/ansible/base/action/ce_config.py1
-rw-r--r--zuul/ansible/base/action/ce_config.pyi0
l---------zuul/ansible/base/action/ce_template.py1
-rw-r--r--zuul/ansible/base/action/ce_template.pyi0
-rw-r--r--zuul/ansible/base/action/command.py28
-rw-r--r--zuul/ansible/base/action/copy.py35
-rw-r--r--zuul/ansible/base/action/copy.pyi0
l---------zuul/ansible/base/action/dellos10_config.py1
-rw-r--r--zuul/ansible/base/action/dellos10_config.pyi0
l---------zuul/ansible/base/action/dellos6_config.py1
-rw-r--r--zuul/ansible/base/action/dellos6_config.pyi0
l---------zuul/ansible/base/action/dellos9_config.py1
-rw-r--r--zuul/ansible/base/action/dellos9_config.pyi0
l---------zuul/ansible/base/action/eos_config.py1
-rw-r--r--zuul/ansible/base/action/eos_config.pyi0
l---------zuul/ansible/base/action/eos_template.py1
-rw-r--r--zuul/ansible/base/action/eos_template.pyi0
-rw-r--r--zuul/ansible/base/action/fetch.py31
-rw-r--r--zuul/ansible/base/action/fetch.pyi0
l---------zuul/ansible/base/action/fortios_config.py1
-rw-r--r--zuul/ansible/base/action/fortios_config.pyi0
-rw-r--r--zuul/ansible/base/action/include_vars.py40
-rw-r--r--zuul/ansible/base/action/include_vars.pyi0
l---------zuul/ansible/base/action/ios_config.py1
-rw-r--r--zuul/ansible/base/action/ios_config.pyi0
l---------zuul/ansible/base/action/ios_template.py1
-rw-r--r--zuul/ansible/base/action/ios_template.pyi0
l---------zuul/ansible/base/action/iosxr_config.py1
-rw-r--r--zuul/ansible/base/action/iosxr_config.pyi0
l---------zuul/ansible/base/action/iosxr_template.py1
-rw-r--r--zuul/ansible/base/action/iosxr_template.pyi0
l---------zuul/ansible/base/action/junos_config.py1
-rw-r--r--zuul/ansible/base/action/junos_config.pyi0
l---------zuul/ansible/base/action/junos_template.py1
-rw-r--r--zuul/ansible/base/action/junos_template.pyi0
l---------zuul/ansible/base/action/net_banner.py1
-rw-r--r--zuul/ansible/base/action/net_banner.pyi0
l---------zuul/ansible/base/action/net_base.py1
-rw-r--r--zuul/ansible/base/action/net_base.pyi0
l---------zuul/ansible/base/action/net_config.py1
-rw-r--r--zuul/ansible/base/action/net_config.pyi0
-rw-r--r--zuul/ansible/base/action/net_get.py31
-rw-r--r--zuul/ansible/base/action/net_get.pyi0
l---------zuul/ansible/base/action/net_interface.py1
-rw-r--r--zuul/ansible/base/action/net_interface.pyi0
l---------zuul/ansible/base/action/net_l2_interface.py1
-rw-r--r--zuul/ansible/base/action/net_l2_interface.pyi0
l---------zuul/ansible/base/action/net_l3_interface.py1
-rw-r--r--zuul/ansible/base/action/net_l3_interface.pyi0
l---------zuul/ansible/base/action/net_linkagg.py1
-rw-r--r--zuul/ansible/base/action/net_linkagg.pyi0
l---------zuul/ansible/base/action/net_lldp.py1
-rw-r--r--zuul/ansible/base/action/net_lldp.pyi0
l---------zuul/ansible/base/action/net_lldp_interface.py1
-rw-r--r--zuul/ansible/base/action/net_lldp_interface.pyi0
l---------zuul/ansible/base/action/net_logging.py1
-rw-r--r--zuul/ansible/base/action/net_logging.pyi0
l---------zuul/ansible/base/action/net_ping.py1
-rw-r--r--zuul/ansible/base/action/net_ping.pyi0
l---------zuul/ansible/base/action/net_static_route.py1
-rw-r--r--zuul/ansible/base/action/net_static_route.pyi0
l---------zuul/ansible/base/action/net_system.py1
-rw-r--r--zuul/ansible/base/action/net_system.pyi0
l---------zuul/ansible/base/action/net_template.py1
-rw-r--r--zuul/ansible/base/action/net_template.pyi0
l---------zuul/ansible/base/action/net_user.py1
-rw-r--r--zuul/ansible/base/action/net_user.pyi0
l---------zuul/ansible/base/action/net_vlan.py1
-rw-r--r--zuul/ansible/base/action/net_vlan.pyi0
l---------zuul/ansible/base/action/net_vrf.py1
-rw-r--r--zuul/ansible/base/action/net_vrf.pyi0
l---------zuul/ansible/base/action/netconf_config.py1
-rw-r--r--zuul/ansible/base/action/netconf_config.pyi0
-rw-r--r--zuul/ansible/base/action/network.pyi0
-rw-r--r--zuul/ansible/base/action/normal.py117
-rw-r--r--zuul/ansible/base/action/normal.pyi0
l---------zuul/ansible/base/action/nxos_config.py1
-rw-r--r--zuul/ansible/base/action/nxos_config.pyi0
l---------zuul/ansible/base/action/nxos_template.py1
-rw-r--r--zuul/ansible/base/action/nxos_template.pyi0
l---------zuul/ansible/base/action/ops_config.py1
-rw-r--r--zuul/ansible/base/action/ops_config.pyi0
l---------zuul/ansible/base/action/ops_template.py1
-rw-r--r--zuul/ansible/base/action/ops_template.pyi0
-rw-r--r--zuul/ansible/base/action/patch.py43
-rw-r--r--zuul/ansible/base/action/patch.pyi0
-rw-r--r--zuul/ansible/base/action/raw.py32
-rw-r--r--zuul/ansible/base/action/raw.pyi0
-rw-r--r--zuul/ansible/base/action/script.py36
-rw-r--r--zuul/ansible/base/action/script.pyi0
l---------zuul/ansible/base/action/sros_config.py1
-rw-r--r--zuul/ansible/base/action/sros_config.pyi0
-rw-r--r--zuul/ansible/base/action/synchronize.py75
-rw-r--r--zuul/ansible/base/action/synchronize.pyi0
-rw-r--r--zuul/ansible/base/action/template.py31
-rw-r--r--zuul/ansible/base/action/template.pyi0
-rw-r--r--zuul/ansible/base/action/unarchive.py36
-rw-r--r--zuul/ansible/base/action/unarchive.pyi0
-rw-r--r--zuul/ansible/base/action/uri.py49
-rw-r--r--zuul/ansible/base/action/uri.pyi0
l---------zuul/ansible/base/action/vyos_config.py1
-rw-r--r--zuul/ansible/base/action/vyos_config.pyi0
-rw-r--r--zuul/ansible/base/action/win_copy.py31
-rw-r--r--zuul/ansible/base/action/win_copy.pyi0
-rw-r--r--zuul/ansible/base/action/win_template.py31
-rw-r--r--zuul/ansible/base/action/win_template.pyi0
-rw-r--r--zuul/ansible/base/action/zuul_return.py (renamed from zuul/ansible/base/actiongeneral/zuul_return.py)9
-rw-r--r--zuul/ansible/base/actiongeneral/__init__.py0
-rw-r--r--zuul/ansible/base/actiontrusted/__init__.py0
-rw-r--r--zuul/ansible/base/actiontrusted/command.py29
-rw-r--r--zuul/ansible/base/actiontrusted/command.pyi0
-rw-r--r--zuul/ansible/base/callback/zuul_json.py61
-rw-r--r--zuul/ansible/base/callback/zuul_stream.py214
-rwxr-xr-xzuul/ansible/base/library/command.py600
-rwxr-xr-xzuul/ansible/base/library/zuul_console.py50
-rw-r--r--zuul/ansible/base/lookup/__init__.py0
-rw-r--r--zuul/ansible/base/lookup/_banned.py25
-rw-r--r--zuul/ansible/base/lookup/_banned.pyi0
l---------zuul/ansible/base/lookup/chef_databag.py1
-rw-r--r--zuul/ansible/base/lookup/chef_databag.pyi0
l---------zuul/ansible/base/lookup/consul_kv.py1
-rw-r--r--zuul/ansible/base/lookup/consul_kv.pyi0
l---------zuul/ansible/base/lookup/credstash.py1
-rw-r--r--zuul/ansible/base/lookup/credstash.pyi0
-rw-r--r--zuul/ansible/base/lookup/csvfile.py44
-rw-r--r--zuul/ansible/base/lookup/csvfile.pyi0
l---------zuul/ansible/base/lookup/cyberarkpassword.py1
-rw-r--r--zuul/ansible/base/lookup/cyberarkpassword.pyi0
l---------zuul/ansible/base/lookup/dig.py1
-rw-r--r--zuul/ansible/base/lookup/dig.pyi0
l---------zuul/ansible/base/lookup/dnstxt.py1
-rw-r--r--zuul/ansible/base/lookup/dnstxt.pyi0
l---------zuul/ansible/base/lookup/env.py1
-rw-r--r--zuul/ansible/base/lookup/env.pyi0
l---------zuul/ansible/base/lookup/etcd.py1
-rw-r--r--zuul/ansible/base/lookup/etcd.pyi0
-rw-r--r--zuul/ansible/base/lookup/file.py28
-rw-r--r--zuul/ansible/base/lookup/file.pyi0
-rw-r--r--zuul/ansible/base/lookup/fileglob.py45
-rw-r--r--zuul/ansible/base/lookup/fileglob.pyi0
-rw-r--r--zuul/ansible/base/lookup/filetree.py32
-rw-r--r--zuul/ansible/base/lookup/filetree.pyi0
-rw-r--r--zuul/ansible/base/lookup/first_found.py201
-rw-r--r--zuul/ansible/base/lookup/first_found.pyi0
l---------zuul/ansible/base/lookup/hashi_vault.py1
-rw-r--r--zuul/ansible/base/lookup/hashi_vault.pyi0
l---------zuul/ansible/base/lookup/hiera.py1
-rw-r--r--zuul/ansible/base/lookup/hiera.pyi0
-rw-r--r--zuul/ansible/base/lookup/ini.py31
-rw-r--r--zuul/ansible/base/lookup/ini.pyi0
l---------zuul/ansible/base/lookup/keyring.py1
-rw-r--r--zuul/ansible/base/lookup/keyring.pyi0
l---------zuul/ansible/base/lookup/lastpass.py1
-rw-r--r--zuul/ansible/base/lookup/lastpass.pyi0
l---------zuul/ansible/base/lookup/lines.py1
-rw-r--r--zuul/ansible/base/lookup/lines.pyi0
l---------zuul/ansible/base/lookup/mongodb.py1
-rw-r--r--zuul/ansible/base/lookup/mongodb.pyi0
-rw-r--r--zuul/ansible/base/lookup/password.py30
-rw-r--r--zuul/ansible/base/lookup/password.pyi0
l---------zuul/ansible/base/lookup/passwordstore.py1
-rw-r--r--zuul/ansible/base/lookup/passwordstore.pyi0
l---------zuul/ansible/base/lookup/pipe.py1
-rw-r--r--zuul/ansible/base/lookup/pipe.pyi0
l---------zuul/ansible/base/lookup/redis_kv.py1
-rw-r--r--zuul/ansible/base/lookup/redis_kv.pyi0
l---------zuul/ansible/base/lookup/shelvefile.py1
-rw-r--r--zuul/ansible/base/lookup/shelvefile.pyi0
-rw-r--r--zuul/ansible/base/lookup/template.py27
-rw-r--r--zuul/ansible/base/lookup/template.pyi0
l---------zuul/ansible/base/lookup/url.py1
-rw-r--r--zuul/ansible/base/lookup/url.pyi0
-rw-r--r--zuul/ansible/paths.py151
-rw-r--r--zuul/change_matcher.py27
-rwxr-xr-xzuul/cmd/client.py111
-rwxr-xr-xzuul/cmd/executor.py17
-rw-r--r--zuul/cmd/fingergw.py32
-rwxr-xr-xzuul/cmd/merger.py20
-rwxr-xr-xzuul/cmd/scheduler.py23
-rw-r--r--zuul/configloader.py524
-rw-r--r--zuul/connection/__init__.py51
-rw-r--r--zuul/driver/auth/jwt.py43
-rw-r--r--zuul/driver/bubblewrap/__init__.py17
-rw-r--r--zuul/driver/elasticsearch/connection.py3
-rw-r--r--zuul/driver/elasticsearch/reporter.py4
-rw-r--r--zuul/driver/gerrit/auth.py7
-rw-r--r--zuul/driver/gerrit/gerritconnection.py294
-rw-r--r--zuul/driver/gerrit/gerritmodel.py46
-rw-r--r--zuul/driver/gerrit/gerritreporter.py33
-rw-r--r--zuul/driver/gerrit/gerritsource.py32
-rw-r--r--zuul/driver/gerrit/gerrittrigger.py3
-rw-r--r--zuul/driver/github/githubconnection.py123
-rw-r--r--zuul/driver/github/githubmodel.py6
-rw-r--r--zuul/driver/github/githubreporter.py43
-rw-r--r--zuul/driver/github/githubsource.py4
-rw-r--r--zuul/driver/gitlab/gitlabconnection.py4
-rw-r--r--zuul/driver/gitlab/gitlabreporter.py17
-rw-r--r--zuul/driver/mqtt/mqttreporter.py15
-rw-r--r--zuul/driver/pagure/pagurereporter.py30
-rw-r--r--zuul/driver/smtp/smtpreporter.py6
-rw-r--r--zuul/driver/sql/alembic/versions/c7467b642498_buildset_updated.py47
-rw-r--r--zuul/driver/sql/sqlconnection.py17
-rw-r--r--zuul/driver/sql/sqlreporter.py180
-rw-r--r--zuul/driver/timer/__init__.py106
-rw-r--r--zuul/exceptions.py4
-rw-r--r--zuul/executor/server.py159
-rw-r--r--zuul/lib/ansible-config.conf16
-rw-r--r--zuul/lib/ansible.py18
-rw-r--r--zuul/lib/auth.py14
-rw-r--r--zuul/lib/encryption.py16
-rw-r--r--zuul/lib/fingergw.py4
-rw-r--r--zuul/lib/tracing.py291
-rw-r--r--zuul/manager/__init__.py485
-rw-r--r--zuul/manager/dependent.py67
-rw-r--r--zuul/manager/independent.py32
-rw-r--r--zuul/manager/shared.py14
-rw-r--r--zuul/merger/client.py5
-rw-r--r--zuul/merger/merger.py93
-rw-r--r--zuul/merger/server.py9
-rw-r--r--zuul/model.py861
-rw-r--r--zuul/model_api.py17
-rw-r--r--zuul/nodepool.py64
-rw-r--r--zuul/reporter/__init__.py53
-rw-r--r--zuul/scheduler.py289
-rw-r--r--zuul/source/__init__.py23
-rwxr-xr-xzuul/web/__init__.py203
-rw-r--r--zuul/zk/__init__.py9
-rw-r--r--zuul/zk/blob_store.py201
-rw-r--r--zuul/zk/branch_cache.py77
-rw-r--r--zuul/zk/components.py16
-rw-r--r--zuul/zk/event_queues.py44
-rw-r--r--zuul/zk/job_request_queue.py11
-rw-r--r--zuul/zk/layout.py69
-rw-r--r--zuul/zk/nodepool.py18
-rw-r--r--zuul/zk/semaphore.py81
-rw-r--r--zuul/zk/zkobject.py18
1190 files changed, 33630 insertions, 23038 deletions
diff --git a/.zuul.yaml b/.zuul.yaml
index 3ec608934..06c167e9b 100644
--- a/.zuul.yaml
+++ b/.zuul.yaml
@@ -1,3 +1,6 @@
+- queue:
+ name: zuul
+
- nodeset:
name: zuul-functional-temp-master
nodes:
@@ -6,11 +9,11 @@
# need their python versions updated when these labels change to
# a platform that uses a different python version.
- name: controller
- label: ubuntu-focal
+ label: ubuntu-jammy
- name: node1
- label: ubuntu-focal
+ label: ubuntu-jammy
- name: node2
- label: ubuntu-focal
+ label: ubuntu-jammy
groups:
- name: node
nodes:
@@ -25,33 +28,29 @@
run: playbooks/zuul-stream/functional.yaml
post-run:
- playbooks/zuul-stream/post.yaml
- - playbooks/zuul-stream/post-ara.yaml
files:
- zuul/ansible/.*
- zuul/lib/ansible*
- playbooks/zuul-stream/.*
- job:
- name: zuul-stream-functional-2.8
+ name: zuul-stream-functional-5
parent: zuul-stream-functional
- # Force executor to use same Ansible version as "controller" node so
- # that the inventory.yaml file will be correct for that version.
- ansible-version: 2.8
vars:
- zuul_ansible_version: 2.8
+ zuul_ansible_version: 5
- job:
- name: zuul-stream-functional-2.9
+ name: zuul-stream-functional-6
parent: zuul-stream-functional
vars:
- zuul_ansible_version: 2.9
+ zuul_ansible_version: 6
- job:
name: zuul-tox
description: |
Zuul unit tests with ZooKeeper running
parent: tox
- nodeset: ubuntu-focal
+ nodeset: ubuntu-jammy
pre-run: playbooks/zuul-tox/pre.yaml
post-run: playbooks/zuul-tox/post-system-logs.yaml
vars:
@@ -68,6 +67,7 @@
- job:
name: zuul-tox-remote
parent: tox
+ nodeset: ubuntu-jammy
timeout: 2700 # 45 minutes
pre-run: playbooks/zuul-tox/pre.yaml
post-run: playbooks/zuul-tox/post-system-logs.yaml
@@ -94,25 +94,25 @@
tox_envlist: zuul_client
- job:
- name: zuul-tox-py36
+ name: zuul-tox-py310
parent: zuul-tox
- timeout: 5400 # 90 minutes
+ timeout: 7200 # 120 minutes
vars:
- tox_envlist: py36
- python_version: 3.6
- nodeset: ubuntu-bionic
+ tox_envlist: py310
+ python_version: "3.10"
- job:
name: zuul-tox-py38
parent: zuul-tox
- timeout: 5400 # 90 minutes
+ timeout: 7200 # 120 minutes
vars:
tox_envlist: py38
- python_version: 3.8
+ python_version: "3.8"
+ nodeset: ubuntu-focal
- job:
- name: zuul-tox-py38-multi-scheduler
- parent: zuul-tox-py38
+ name: zuul-tox-py310-multi-scheduler
+ parent: zuul-tox-py310
voting: false
vars:
tox_environment:
@@ -131,6 +131,7 @@
zuul_work_dir: "{{ zuul.project.src_dir }}/web"
create_tarball_directory: build
run: playbooks/dashboard/run.yaml
+ nodeset: ubuntu-jammy
- job:
name: zuul-build-dashboard-openstack-whitelabel
@@ -179,6 +180,7 @@
post-run: playbooks/tutorial/post.yaml
required-projects:
- zuul/zuul
+ nodeset: ubuntu-jammy
# Image building jobs
- secret:
@@ -204,8 +206,8 @@
allowed-projects: zuul/zuul
timeout: 2700 # 45 minutes
requires:
- - python-builder-3.8-bullseye-container-image
- - python-base-3.8-bullseye-container-image
+ - python-builder-3.10-bullseye-container-image
+ - python-base-3.10-bullseye-container-image
provides: zuul-container-image
vars: &zuul_image_vars
docker_images:
@@ -243,8 +245,8 @@
description: Build Docker images and upload to Docker Hub.
allowed-projects: zuul/zuul
requires:
- - python-builder-3.8-bullseye-container-image
- - python-base-3.8-bullseye-container-image
+ - python-builder-3.10-bullseye-container-image
+ - python-base-3.10-bullseye-container-image
provides: zuul-container-image
secrets:
name: docker_credentials
@@ -269,13 +271,16 @@
name: zuul-build-python-release
parent: build-python-release
pre-run: playbooks/release/pre.yaml
+ nodeset: ubuntu-jammy
- job:
name: zuul-release-python
parent: opendev-release-python
pre-run: playbooks/release/pre.yaml
+ nodeset: ubuntu-jammy
- project:
+ queue: zuul
vars:
node_version: 16
release_python: python3
@@ -286,22 +291,25 @@
- tox-linters:
vars:
tox_install_bindep: false
- - zuul-tox-py36
+ nodeset: ubuntu-jammy
- zuul-tox-py38
- - zuul-tox-py38-multi-scheduler
+ - zuul-tox-py310
+ - zuul-tox-py310-multi-scheduler
- zuul-build-dashboard-openstack-whitelabel
- zuul-build-dashboard-software-factory
- zuul-build-dashboard-opendev
- nodejs-run-lint:
vars:
zuul_work_dir: "{{ zuul.project.src_dir }}/web"
+ nodeset: ubuntu-jammy
- nodejs-run-test:
vars:
zuul_work_dir: "{{ zuul.project.src_dir }}/web"
files:
- web/.*
- - zuul-stream-functional-2.8
- - zuul-stream-functional-2.9
+ nodeset: ubuntu-jammy
+ - zuul-stream-functional-5
+ - zuul-stream-functional-6
- zuul-tox-remote
- zuul-quick-start:
requires: nodepool-container-image
@@ -315,19 +323,22 @@
- tox-linters:
vars:
tox_install_bindep: false
- - zuul-tox-py36
+ nodeset: ubuntu-jammy
- zuul-tox-py38
+ - zuul-tox-py310
- zuul-build-dashboard
- nodejs-run-lint:
vars:
zuul_work_dir: "{{ zuul.project.src_dir }}/web"
+ nodeset: ubuntu-jammy
- nodejs-run-test:
vars:
zuul_work_dir: "{{ zuul.project.src_dir }}/web"
files:
- web/.*
- - zuul-stream-functional-2.8
- - zuul-stream-functional-2.9
+ nodeset: ubuntu-jammy
+ - zuul-stream-functional-5
+ - zuul-stream-functional-6
- zuul-tox-remote
- zuul-quick-start:
requires: nodepool-container-image
diff --git a/Dockerfile b/Dockerfile
index d65a9746c..c6cc17651 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -19,7 +19,7 @@ COPY web /tmp/src
# Explicitly run the Javascript build
RUN cd /tmp/src && yarn install -d && yarn build
-FROM docker.io/opendevorg/python-builder:3.8-bullseye as builder
+FROM docker.io/opendevorg/python-builder:3.10-bullseye as builder
ENV DEBIAN_FRONTEND=noninteractive
# Optional location of Zuul API endpoint.
@@ -48,7 +48,7 @@ RUN /output/install-from-bindep \
&& echo $OPENSHIFT_SHA /tmp/openshift-install/openshift-client.tgz | sha256sum --check \
&& tar xvfz openshift-client.tgz --strip-components=1 -C /tmp/openshift-install
-FROM docker.io/opendevorg/python-base:3.8-bullseye as zuul
+FROM docker.io/opendevorg/python-base:3.10-bullseye as zuul
ENV DEBIAN_FRONTEND=noninteractive
COPY --from=builder /output/ /output
diff --git a/TESTING.rst b/TESTING.rst
index 6c4c8c0d8..fe9af66f6 100644
--- a/TESTING.rst
+++ b/TESTING.rst
@@ -1,34 +1,30 @@
-===========================
-Testing Your OpenStack Code
-===========================
+============
+Testing Zuul
+============
------------
A Quickstart
------------
-This is designed to be enough information for you to run your first tests.
-Detailed information on testing can be found here: https://wiki.openstack.org/wiki/Testing
+This is designed to be enough information for you to run your first tests on
+an Ubuntu 20.04 (or later) host.
*Install pip*::
- [apt-get | yum] install python-pip
+ sudo apt-get install python3-pip
More information on pip here: http://www.pip-installer.org/en/latest/
-*Use pip to install tox and tox-docker*::
+*Use pip to install tox*::
- pip install tox tox-docker
+ pip install tox
-As of zuul v3, a running zookeeper is required to execute tests. Using the
-``-docker`` suffixed commands will ensure this is started automatically by tox,
-but if you do not wish to use this:
+A running zookeeper is required to execute tests, but it also needs to be
+configured for TLS and a certificate authority set up to handle socket
+authentication. Because of these complexities, it's recommended to use a
+helper script to set up these dependencies, as well as a database servers::
-*Install zookeeper*::
-
- [apt-get | yum] install zookeeperd
-
-*Start zookeeper*::
-
- service zookeeper start
+ sudo apt-get install docker-compose # or podman-compose if preferred
+ ROOTCMD=sudo tools/test-setup-docker.sh
.. note:: Installing and bulding javascript is not required, but tests that
depend on the javascript assets having been built will be skipped
diff --git a/bindep.txt b/bindep.txt
index a16328e0f..2e9c5e696 100644
--- a/bindep.txt
+++ b/bindep.txt
@@ -25,8 +25,9 @@ libssl1.1 [platform:debian platform:ubuntu-bionic]
libssl1.0.0 [platform:ubuntu-xenial]
libffi-dev [compile test platform:dpkg platform:apk]
libffi [platform:apk]
+libffi8 [platform:ubuntu-jammy]
libffi7 [platform:ubuntu-focal platform:debian-bullseye]
-libffi6 [platform:dpkg !platform:ubuntu-focal !platform:debian-bullseye]
+libffi6 [platform:dpkg !platform:ubuntu-focal !platform:ubuntu-jammy !platform:debian-bullseye]
libffi-devel [compile test platform:rpm]
libyaml-0-2 [platform:dpkg platform:suse]
libyaml [platform:redhat]
diff --git a/doc/requirements.txt b/doc/requirements.txt
index 965e03665..2489898ae 100644
--- a/doc/requirements.txt
+++ b/doc/requirements.txt
@@ -1,8 +1,5 @@
ansible
-# NOTE(ianw) 2021-07-13: <4.1.0 until related issue in
-# sphixcontrib-httpdomain fixed
-# https://github.com/sphinx-contrib/httpdomain/pull/51
-sphinx>=1.8,<4.1.0
+sphinx>=1.8
sphinxcontrib-blockdiag>=1.1.0
sphinxcontrib-programoutput
sphinx-autodoc-typehints
diff --git a/doc/source/admin.rst b/doc/source/admin.rst
index e9c210d3b..c7e2431f5 100644
--- a/doc/source/admin.rst
+++ b/doc/source/admin.rst
@@ -12,5 +12,6 @@ Service Administration
operation
authentication
monitoring
+ tracing
client
troubleshooting
diff --git a/doc/source/authentication.rst b/doc/source/authentication.rst
index ed80c81cf..e1746d65b 100644
--- a/doc/source/authentication.rst
+++ b/doc/source/authentication.rst
@@ -153,4 +153,5 @@ authentication in Zuul and Zuul's Web UI.
howtos/openid-with-google
howtos/openid-with-keycloak
+ howtos/openid-with-microsoft
tutorials/keycloak
diff --git a/doc/source/client.rst b/doc/source/client.rst
index 98eb517fa..cde18bfff 100644
--- a/doc/source/client.rst
+++ b/doc/source/client.rst
@@ -1,11 +1,12 @@
-:title: Zuul Client
+:title: Zuul Admin Client
-Zuul Client
-===========
+Zuul Admin Client
+=================
Zuul includes a simple command line client that may be used to affect Zuul's
-behavior while running. It must be run on a host with access to Zuul's web
-server.
+behavior while running.
+
+.. note:: For operations related to normal workflow like enqueue, dequeue, autohold and promote, the `zuul-client` CLI should be used instead.
Configuration
-------------
@@ -13,76 +14,177 @@ Configuration
The client uses the same zuul.conf file as the server, and will look
for it in the same locations if not specified on the command line.
-The ``webclient`` section is required.
-
-It is also possible to run the client without a configuration file, by using the
-``--zuul-url`` option to specify the base URL of the Zuul web server.
-
-.. note:: Not all commands are available through the REST API.
-
Usage
-----
The general options that apply to all subcommands are:
-.. program-output:: zuul --help
+.. program-output:: zuul-admin --help
The following subcommands are supported:
+tenant-conf-check
+^^^^^^^^^^^^^^^^^
+
+.. program-output:: zuul-admin tenant-conf-check --help
+
+Example::
+
+ zuul-admin tenant-conf-check
+
+This command validates the tenant configuration schema. It exits '-1' in
+case of errors detected.
+
+create-auth-token
+^^^^^^^^^^^^^^^^^
+
+.. note:: This command is only available if an authenticator is configured in
+ ``zuul.conf``. Furthermore the authenticator's configuration must
+ include a signing secret.
+
+.. program-output:: zuul-admin create-auth-token --help
+
+Example::
+
+ zuul-admin create-auth-token --auth-config zuul-operator --user alice --tenant tenantA --expires-in 1800
+
+The return value is the value of the ``Authorization`` header the user must set
+when querying a protected endpoint on Zuul's REST API.
+
+Example::
+
+ bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwOi8vbWFuYWdlc2Yuc2ZyZG90ZXN0aW5zdGFuY2Uub3JnIiwienV1bC50ZW5hbnRzIjp7ImxvY2FsIjoiKiJ9LCJleHAiOjE1Mzc0MTcxOTguMzc3NTQ0fQ.DLbKx1J84wV4Vm7sv3zw9Bw9-WuIka7WkPQxGDAHz7s
+
+export-keys
+^^^^^^^^^^^
+
+.. program-output:: zuul-admin export-keys --help
+
+Example::
+
+ zuul-admin export-keys /var/backup/zuul-keys.json
+
+import-keys
+^^^^^^^^^^^
+
+.. program-output:: zuul-admin import-keys --help
+
+Example::
+
+ zuul-admin import-keys /var/backup/zuul-keys.json
+
+copy-keys
+^^^^^^^^^
+
+.. program-output:: zuul-admin copy-keys --help
+
+Example::
+
+ zuul-admin copy-keys gerrit old_project gerrit new_project
+
+delete-keys
+^^^^^^^^^^^
+
+.. program-output:: zuul-admin delete-keys --help
+
+Example::
+
+ zuul-admin delete-keys gerrit old_project
+
+delete-state
+^^^^^^^^^^^^
+
+.. program-output:: zuul-admin delete-state --help
+
+Example::
+
+ zuul-admin delete-state
+
+delete-pipeline-state
+^^^^^^^^^^^^^^^^^^^^^
+
+.. program-output:: zuul-admin delete-pipeline-state --help
+
+Example::
+
+ zuul-admin delete-pipeline-state tenant pipeline
+
+prune-database
+^^^^^^^^^^^^^^
+
+.. program-output:: zuul-admin prune-database --help
+
+Example::
+
+ zuul-admin prune-database --older-than 180d
+
+Deprecated commands
+-------------------
+
+The following commands are deprecated in the zuul-admin CLI, and thus may not be entirely supported in Zuul's current version.
+They will be removed in a future release of Zuul. They can still be performed via the `zuul-client` CLI.
+Please refer to `zuul-client's documentation <https://zuul-ci.org/docs/zuul-client/>`__
+for more details.
+
+In order to run these commands, the ``webclient`` section is required in the configuration file.
+
+It is also possible to run the client without a configuration file, by using the
+``--zuul-url`` option to specify the base URL of the Zuul web server.
+
Autohold
^^^^^^^^
-.. program-output:: zuul autohold --help
+.. program-output:: zuul-admin autohold --help
Example::
- zuul autohold --tenant openstack --project example_project --job example_job --reason "reason text" --count 1
+ zuul-admin autohold --tenant openstack --project example_project --job example_job --reason "reason text" --count 1
Autohold Delete
^^^^^^^^^^^^^^^
-.. program-output:: zuul autohold-delete --help
+.. program-output:: zuul-admin autohold-delete --help
Example::
- zuul autohold-delete --id 0000000123
+ zuul-admin autohold-delete --id 0000000123
Autohold Info
^^^^^^^^^^^^^
-.. program-output:: zuul autohold-info --help
+.. program-output:: zuul-admin autohold-info --help
Example::
- zuul autohold-info --id 0000000123
+ zuul-admin autohold-info --id 0000000123
Autohold List
^^^^^^^^^^^^^
-.. program-output:: zuul autohold-list --help
+.. program-output:: zuul-admin autohold-list --help
Example::
- zuul autohold-list --tenant openstack
+ zuul-admin autohold-list --tenant openstack
Dequeue
^^^^^^^
-.. program-output:: zuul dequeue --help
+.. program-output:: zuul-admin dequeue --help
Examples::
- zuul dequeue --tenant openstack --pipeline check --project example_project --change 5,1
- zuul dequeue --tenant openstack --pipeline periodic --project example_project --ref refs/heads/master
+ zuul-admin dequeue --tenant openstack --pipeline check --project example_project --change 5,1
+ zuul-admin dequeue --tenant openstack --pipeline periodic --project example_project --ref refs/heads/master
Enqueue
^^^^^^^
-.. program-output:: zuul enqueue --help
+.. program-output:: zuul-admin enqueue --help
Example::
- zuul enqueue --tenant openstack --trigger gerrit --pipeline check --project example_project --change 12345,1
+ zuul-admin enqueue --tenant openstack --trigger gerrit --pipeline check --project example_project --change 12345,1
Note that the format of change id is <number>,<patchset>.
Enqueue-ref
^^^^^^^^^^^
-.. program-output:: zuul enqueue-ref --help
+.. program-output:: zuul-admin enqueue-ref --help
This command is provided to manually simulate a trigger from an
external source. It can be useful for testing or replaying a trigger
@@ -106,7 +208,7 @@ the jobs, pass the failed tag as the ``ref`` argument and set
``newrev`` to the change associated with the tag in the project
repository (i.e. what you see from ``git show X.Y.Z``)::
- zuul enqueue-ref --tenant openstack --trigger gerrit --pipeline release --project openstack/example_project --ref refs/tags/X.Y.Z --newrev abc123..
+ zuul-admin enqueue-ref --tenant openstack --trigger gerrit --pipeline release --project openstack/example_project --ref refs/tags/X.Y.Z --newrev abc123..
The command can also be used asynchronosly trigger a job in a
``periodic`` pipeline that would usually be run at a specific time by
@@ -114,7 +216,7 @@ the ``timer`` driver. For example, the following command would
trigger the ``periodic`` jobs against the current ``master`` branch
top-of-tree for a project::
- zuul enqueue-ref --tenant openstack --trigger timer --pipeline periodic --project openstack/example_project --ref refs/heads/master
+ zuul-admin enqueue-ref --tenant openstack --trigger timer --pipeline periodic --project openstack/example_project --ref refs/heads/master
Another common pipeline is a ``post`` queue listening for ``gerrit``
merge results. Triggering here is slightly more complicated as you
@@ -128,7 +230,7 @@ current ``HEAD`` and the prior change, then enqueue the event::
NEW_REF=$(git rev-parse HEAD)
OLD_REF=$(git rev-parse HEAD~1)
- zuul enqueue-ref --tenant openstack --trigger gerrit --pipeline post --project openstack/example_project --ref refs/heads/master --newrev $NEW_REF --oldrev $OLD_REF
+ zuul-admin enqueue-ref --tenant openstack --trigger gerrit --pipeline post --project openstack/example_project --ref refs/heads/master --newrev $NEW_REF --oldrev $OLD_REF
Note that zero values for ``oldrev`` and ``newrev`` can indicate
branch creation and deletion; the source code is the best reference
@@ -138,109 +240,29 @@ for these more advanced operations.
Promote
^^^^^^^
-.. program-output:: zuul promote --help
+.. program-output:: zuul-admin promote --help
Example::
- zuul promote --tenant openstack --pipeline gate --changes 12345,1 13336,3
+ zuul-admin promote --tenant openstack --pipeline gate --changes 12345,1 13336,3
Note that the format of changes id is <number>,<patchset>.
-The promote action is used to reorder the change queue in a pipeline, by putting
-the provided changes at the top of the queue; therefore this action makes the
-most sense when performed against a dependent pipeline.
-
-The most common use case for the promote action is the need to merge an urgent
-fix when the gate pipeline has already several patches queued ahead. This is
-especially needed if there is concern that one or more changes ahead in the queue
-may fail, thus increasing the time to land for the fix; or concern that the fix
-may not pass validation if applied on top of the current patch queue in the gate.
-
-If the queue of a dependent pipeline is targeted by the promote, all the ongoing
-jobs in that queue will be canceled and restarted on top of the promoted changes.
-
-tenant-conf-check
-^^^^^^^^^^^^^^^^^
-
-.. program-output:: zuul tenant-conf-check --help
-
-Example::
-
- zuul tenant-conf-check
-
-This command validates the tenant configuration schema. It exits '-1' in
-case of errors detected.
-
-create-auth-token
-^^^^^^^^^^^^^^^^^
-
-.. note:: This command is only available if an authenticator is configured in
- ``zuul.conf``. Furthermore the authenticator's configuration must
- include a signing secret.
-
-.. program-output:: zuul create-auth-token --help
-
-Example::
-
- zuul create-auth-token --auth-config zuul-operator --user alice --tenant tenantA --expires-in 1800
-
-The return value is the value of the ``Authorization`` header the user must set
-when querying a protected endpoint on Zuul's REST API.
-
-Example::
-
- bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwOi8vbWFuYWdlc2Yuc2ZyZG90ZXN0aW5zdGFuY2Uub3JnIiwienV1bC50ZW5hbnRzIjp7ImxvY2FsIjoiKiJ9LCJleHAiOjE1Mzc0MTcxOTguMzc3NTQ0fQ.DLbKx1J84wV4Vm7sv3zw9Bw9-WuIka7WkPQxGDAHz7s
-
-export-keys
-^^^^^^^^^^^
-
-.. program-output:: zuul export-keys --help
-
-Example::
-
- zuul export-keys /var/backup/zuul-keys.json
-
-import-keys
-^^^^^^^^^^^
-
-.. program-output:: zuul import-keys --help
-
-Example::
-
- zuul import-keys /var/backup/zuul-keys.json
-
-copy-keys
-^^^^^^^^^
-
-.. program-output:: zuul copy-keys --help
-
-Example::
+The promote action is used to reorder the changes in a pipeline, by
+putting the provided changes at the top of the queue.
- zuul copy-keys gerrit old_project gerrit new_project
+The most common use case for the promote action is the need to merge
+an urgent fix when the gate pipeline has several patches queued
+ahead. This is especially needed if there is concern that one or more
+changes ahead in the queue may fail, thus increasing the time to land
+for the fix; or concern that the fix may not pass validation if
+applied on top of the current patch queue in the gate.
-delete-keys
-^^^^^^^^^^^
-
-.. program-output:: zuul delete-keys --help
-
-Example::
-
- zuul delete-keys gerrit old_project
-
-delete-state
-^^^^^^^^^^^^
-
-.. program-output:: zuul delete-state --help
-
-Example::
-
- zuul delete-state
-
-delete-pipeline-state
-^^^^^^^^^^^^^^^^^^^^^
-
-.. program-output:: zuul delete-pipeline-state --help
-
-Example::
+Any items in a dependent pipeline which have had items ahead of them
+changed will have their jobs canceled and restarted based on the new
+ordering.
- zuul delete-pipeline-state tenant pipeline
+If items in independent pipelines are promoted, no jobs will be
+restarted, but their change queues within the pipeline will be
+re-ordered so that they will be processed first and their node request
+priorities will increase.
diff --git a/doc/source/concepts.rst b/doc/source/concepts.rst
index 7bf47e581..92384dbf6 100644
--- a/doc/source/concepts.rst
+++ b/doc/source/concepts.rst
@@ -53,8 +53,12 @@ substantially different than the git repo state of the change itself
since the repo may have merged other changes since the change was
originally authored). Items in a pipeline may depend on other items,
and if they do, all of their dependent changes will be included in the
-git repo state that Zuul prepares. For more detail on this process,
-see :ref:`project_gating` and :ref:`dependencies`.
+git repo state that Zuul prepares. Jobs may also specify that they
+require additional git repos, and if so, the repo state (as of the
+time when the item was enqueued in the pipeline) for those repos will
+also be included. For more detail on this process, see
+:ref:`project_gating`, :ref:`dependencies`, and
+:ref:`global_repo_state`.
The configuration for nearly everything described above is held in
files inside of the git repos upon which Zuul operates. Zuul's
diff --git a/doc/source/conf.py b/doc/source/conf.py
index fb6849e0e..355a3ed41 100644
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -75,8 +75,8 @@ html_theme = "sphinx_rtd_theme"
html_baseurl = f'https://zuul-ci.org{doc_root}/latest'
if version.is_release:
- version = version.release_string
current_version = version.release_string
+ version = version.release_string
versions = [('latest', f'{doc_root}/latest/')]
else:
# Uncomment this if we want to use the in-development version
diff --git a/doc/source/config/job.rst b/doc/source/config/job.rst
index 326487aa2..87806727f 100644
--- a/doc/source/config/job.rst
+++ b/doc/source/config/job.rst
@@ -18,7 +18,10 @@ starting with very basic jobs which describe characteristics that all
jobs on the system should have, progressing through stages of
specialization before arriving at a particular job. A job may inherit
from any other job in any project (however, if the other job is marked
-as :attr:`job.final`, jobs may not inherit from it).
+as :attr:`job.final`, jobs may not inherit from it). Generally,
+attributes on child jobs will override (or completely replace)
+attributes on the parent, however some attributes are combined. See
+the documentation for individual attributes for these exceptions.
A job with no parent is called a *base job* and may only be defined in
a :term:`config-project`. Every other job must have a parent, and so
@@ -58,6 +61,7 @@ be:
* child playbook
* child post-run playbook
* parent post-run playbook
+* parent cleanup-run playbook
Further inheritance would nest even deeper.
@@ -146,6 +150,11 @@ Here is an example of two job definitions:
To indicate a job is not intended to be run directly, but
instead must be inherited from, set this attribute to ``true``.
+ Once this is set to ``true`` in a job it cannot be reset to
+ ``false`` within the same job by other variants; however jobs
+ which inherit from it can (and by default do) reset it to
+ ``false``.
+
.. warning::
It is possible to circumvent the use of `abstract` in an
@@ -162,6 +171,11 @@ Here is an example of two job definitions:
*must* also be ``abstract``; a configuration error will be
raised if not.
+ Once this is set to ``true`` in a job it cannot be reset to
+ ``false`` within the same job by other variants; however jobs
+ which inherit from it can (and by default do) reset it to
+ ``false``.
+
For example, you may define a base abstract job `foo` and create
two abstract jobs that inherit from `foo` called
`foo-production` and `foo-development`. If it would be an error
@@ -205,14 +219,14 @@ Here is an example of two job definitions:
.. attr:: semaphores
- The name of a :ref:`semaphore` (or list of them) which should be
- acquired and released when the job begins and ends. If the
- semaphore is at maximum capacity, then Zuul will wait until it
- can be acquired before starting the job. The format is either a
- string, a dictionary, or a list of either of those in the case
- of multiple semaphores. If it's a string it references a
- semaphore using the default value for
- :attr:`job.semaphores.resources-first`.
+ The name of a :ref:`semaphore` (or list of them) or
+ :ref:`global_semaphore` which should be acquired and released
+ when the job begins and ends. If the semaphore is at maximum
+ capacity, then Zuul will wait until it can be acquired before
+ starting the job. The format is either a string, a dictionary,
+ or a list of either of those in the case of multiple
+ semaphores. If it's a string it references a semaphore using the
+ default value for :attr:`job.semaphores.resources-first`.
If multiple semaphores are requested, the job will not start
until all have been acquired, and Zuul will wait until all are
@@ -258,6 +272,10 @@ Here is an example of two job definitions:
by this job which may be used by other jobs for other changes
using the :attr:`job.requires` attribute.
+ When inheriting jobs or applying variants, the list of
+ `provides` is extended (`provides` specified in a job definition
+ are added to any supplied by their parents).
+
.. attr:: requires
A list of free-form strings which identify resources which may
@@ -277,6 +295,10 @@ Here is an example of two job definitions:
returned by the `provides` jobs will be made available to the
`requires` job.
+ When inheriting jobs or applying variants, the list of
+ `requires` is extended (`requires` specified in a job definition
+ are added to any supplied by their parents).
+
For example, a job which produces a builder container image in
one project that is then consumed by a container image build job
in another project might look like this:
@@ -375,11 +397,10 @@ Here is an example of two job definitions:
If a job has an empty (or no) :ref:`nodeset` definition, it will
still run and is able to perform limited actions within the Zuul
- executor sandbox (e.g. copying files or triggering APIs). Note
- so-called "executor-only" jobs run with an empty inventory, and
- hence Ansible's *implicit localhost*. This means an
- executor-only playbook must be written to match ``localhost``
- directly; i.e.
+ executor sandbox. Note so-called "executor-only" jobs run with
+ an empty inventory, and hence Ansible's *implicit localhost*.
+ This means an executor-only playbook must be written to match
+ ``localhost`` directly; i.e.
.. code-block:: yaml
@@ -489,6 +510,10 @@ Here is an example of two job definitions:
even when the job is canceled. Cleanup results are not taken into
account.
+ When a job inherits from a parent, the child's cleanup-run
+ playbooks are run before the parent's. See :ref:`job` for more
+ information.
+
.. attr:: run
The name of a playbook or list of playbooks for this job. If it
@@ -540,15 +565,18 @@ Here is an example of two job definitions:
appear on the job -- roles earlier in the list will take
precedence over those which follow.
- In the case of job inheritance or variance, the roles used for
- each of the playbooks run by the job will be only those which
- were defined along with that playbook. If a child job inherits
- from a parent which defines a pre and post playbook, then the
- pre and post playbooks it inherits from the parent job will run
- only with the roles that were defined on the parent. If the
- child adds its own pre and post playbooks, then any roles added
- by the child will be available to the child's playbooks. This
- is so that a job which inherits from a parent does not
+ This attribute is not overridden on inheritance or variance;
+ instead roles are added with each new job or variant. In the
+ case of job inheritance or variance, the roles used for each of
+ the playbooks run by the job will be only those which were
+ cumulatively defined up to that point in the inheritance
+ hierarchy where that playbook was added. If a child job
+ inherits from a parent which defines a pre and post playbook,
+ then the pre and post playbooks it inherits from the parent job
+ will run only with the roles that were defined on the parent.
+ If the child adds its own pre and post playbooks, then any roles
+ added by the child will be available to the child's playbooks.
+ This is so that a job which inherits from a parent does not
inadvertently alter the behavior of the parent's playbooks by
the addition of conflicting roles. Roles added by a child will
appear before those it inherits from its parent.
@@ -626,9 +654,15 @@ Here is an example of two job definitions:
A list of other projects which are used by this job. Any Zuul
projects specified here will also be checked out by Zuul into
the working directory for the job. Speculative merging and
- cross-repo dependencies will be honored.
+ cross-repo dependencies will be honored. If there is not a
+ change for the project ahead in the pipeline, its repo state as
+ of the time the item was enqueued will be frozen and used for
+ all jobs for a given change (see :ref:`global_repo_state`).
- This attribute is a union of all applicable parents and variants.
+ This attribute is not overridden by inheritance; instead it is
+ the union of all applicable parents and variants (i.e., jobs can
+ expand but not reduce the set of required projects when they
+ inherit).
The format for this attribute is either a list of strings or
dictionaries. Strings are interpreted as project names,
@@ -778,6 +812,11 @@ Here is an example of two job definitions:
any project's pipeline. Apply caution when doing so as other
projects may be able to expose the source project's secrets.
+ This attribute is not overridden by inheritance; instead it is
+ the intersection of all applicable parents and variants (i.e.,
+ jobs can reduce but not expand the set of allowed projects when
+ they inherit).
+
.. warning::
It is possible to circumvent the use of `allowed-projects` in
@@ -907,6 +946,44 @@ Here is an example of two job definitions:
self-testing without requiring that the file matchers include
the Zuul configuration file defining the job.
+ .. attr:: deduplicate
+ :default: auto
+
+ In the case of a dependency cycle where multiple changes within
+ the cycle run the same job, this setting indicates whether Zuul
+ should attempt to deduplicate the job. If it is deduplicated,
+ then the job will only run for one queue item within the cycle
+ and other items which run the same job will use the results of
+ that build.
+
+ This setting determins whether Zuul will consider deduplication.
+ If it is set to ``false``, Zuul will never attempt to
+ deduplicate the job. If it is set to ``auto`` (the default),
+ then Zuul will compare the job with other jobs of other queue
+ items in the dependency cycle, and if they are equivalent and
+ meet certain project criteria, it will deduplicate them.
+
+ The project criteria that Zuul considers under the ``auto``
+ setting are either:
+
+ * The job must specify :attr:`job.required-projects`.
+ * Or the queue items must be for the same project.
+
+ This is because of the following heuristic: if a job specifies
+ :attr:`job.required-projects`, it is most likely to be one which
+ operates in the same way regardless of which project the change
+ under test belongs to, therefore the result of the same job
+ running on two queue items in the same dependency cycle should
+ be the same. If a job does not specify
+ :attr:`job.required-projects` and runs with two different
+ projects under test, the outcome is likely different for those
+ two items.
+
+ If this is not true for a job (e.g., the job ignores the project
+ under test and interacts only with external resources)
+ :attr:`job.deduplicate` may be set to ``true`` to ignore the
+ heuristic and deduplicate anyway.
+
.. attr:: workspace-scheme
:default: golang
@@ -939,3 +1016,15 @@ Here is an example of two job definitions:
Note, however, that this scheme may produce collisions with
`component` and `component/component`.
+
+ .. value:: unique
+
+ This writes the repository into a directory based on the
+ organization name and the ``urllib.parse.quote_plus`` formatted
+ project name. For example::
+
+ src/example.com/organization/organization%2Fproject
+
+
+ This scheme will produce unique workspace paths for every repository
+ and won't cause collisions.
diff --git a/doc/source/config/nodeset.rst b/doc/source/config/nodeset.rst
index 84c413c9b..7c1ebbbd2 100644
--- a/doc/source/config/nodeset.rst
+++ b/doc/source/config/nodeset.rst
@@ -40,6 +40,39 @@ branch will not immediately produce a configuration error.
nodes:
- web
+Nodesets may also be used to express that Zuul should use the first of
+multiple alternative node configurations to run a job. When a Nodeset
+specifies a list of :attr:`nodeset.alternatives`, Zuul will request the
+first Nodeset in the series, and if allocation fails for any reason,
+Zuul will re-attempt the request with the subsequent Nodeset and so
+on. The first Nodeset which is sucessfully supplied by Nodepool will
+be used to run the job. An example of such a configuration follows.
+
+.. code-block:: yaml
+
+ - nodeset:
+ name: fast-nodeset
+ nodes:
+ - label: fast-label
+ name: controller
+
+ - nodeset:
+ name: slow-nodeset
+ nodes:
+ - label: slow-label
+ name: controller
+
+ - nodeset:
+ name: fast-or-slow
+ alternatives:
+ - fast-nodeset
+ - slow-nodeset
+
+In the above example, a job that requested the `fast-or-slow` nodeset
+would receive `fast-label` nodes if a provider was able to supply
+them, otherwise it would receive `slow-label` nodes. A Nodeset may
+specify nodes and groups, or alternative nodesets, but not both.
+
.. attr:: nodeset
A Nodeset requires two attributes:
@@ -54,7 +87,8 @@ branch will not immediately produce a configuration error.
definition, this attribute should be omitted.
.. attr:: nodes
- :required:
+
+ This attribute is required unless `alteranatives` is supplied.
A list of node definitions, each of which has the following format:
@@ -89,3 +123,23 @@ branch will not immediately produce a configuration error.
The nodes that shall be part of the group. This is specified as a list
of strings.
+ .. attr:: alternatives
+ :type: list
+
+ A list of alternative nodesets for which requests should be
+ attempted in series. The first request which succeeds will be
+ used for the job.
+
+ The items in the list may be either strings, in which case they
+ refer to other Nodesets within the layout, or they may be a
+ dictionary which is a nested anonymous Nodeset definition. The
+ two types (strings or nested definitions) may be mixed.
+
+ An alternative Nodeset definition may in turn refer to other
+ alternative nodeset definitions. In this case, the tree of
+ definitions will be flattened in a breadth-first manner to
+ create the ordered list of alternatives.
+
+ A Nodeset which specifies alternatives may not also specify
+ nodes or groups (this attribute is exclusive with
+ :attr:`nodeset.nodes` and :attr:`nodeset.groups`.
diff --git a/doc/source/config/pipeline.rst b/doc/source/config/pipeline.rst
index f1c294775..f4d7cce69 100644
--- a/doc/source/config/pipeline.rst
+++ b/doc/source/config/pipeline.rst
@@ -332,9 +332,16 @@ success, the pipeline reports back to Gerrit with ``Verified`` vote of
.. attr:: merge-conflict
These reporters describe what Zuul should do if it is unable to
- merge in the patchset. If no merge-conflict reporters are listed
- then the ``failure`` reporters will be used to notify of
- unsuccessful merges.
+ merge the patchset into the current state of the target
+ branch. If no merge-conflict reporters are listed then the
+ ``failure`` reporters will be used.
+
+ .. attr:: config-error
+
+ These reporters describe what Zuul should do if it encounters a
+ configuration error while trying to enqueue the item. If no
+ config-error reporters are listed then the ``failure`` reporters
+ will be used.
.. attr:: enqueue
diff --git a/doc/source/config/project.rst b/doc/source/config/project.rst
index af5053295..1aa570f41 100644
--- a/doc/source/config/project.rst
+++ b/doc/source/config/project.rst
@@ -166,10 +166,6 @@ pipeline.
stanza; it may appear in secondary instances or even in a
:ref:`project-template` definition.
- Pipeline managers other than `dependent` do not use this
- attribute, however, it may still be used if
- :attr:`scheduler.relative_priority` is enabled.
-
.. note:: This attribute is not evaluated speculatively and
its setting shall be merged to be effective.
@@ -191,16 +187,6 @@ pipeline.
:attr:`job` definition. Any attributes set on the job here
will override previous versions of the job.
- .. attr:: queue
-
- This is the same as :attr:`project.queue` but on per pipeline
- level for backwards compatibility reasons. If :attr:`project.queue`
- is defined this setting is ignored.
-
- .. note:: It is deprecated to define the queue in the pipeline
- configuration. Configure it on :attr:`project.queue`
- instead.
-
.. attr:: debug
If this is set to `true`, Zuul will include debugging
diff --git a/doc/source/config/queue.rst b/doc/source/config/queue.rst
index bc24bb4fb..bf7a2c433 100644
--- a/doc/source/config/queue.rst
+++ b/doc/source/config/queue.rst
@@ -46,33 +46,60 @@ Here is an example ``queue`` configuration.
.. attr:: allow-circular-dependencies
:default: false
- Define if Zuul is allowed to process circular dependencies between
- changes for this queue. All projects that are part of a dependency cycle
- must share the same change queue.
+ Determines whether Zuul is allowed to process circular
+ dependencies between changes for this queue. All projects that
+ are part of a dependency cycle must share the same change queue.
- In case Zuul detects a dependency cycle it will make sure that every
- change also includes all other changes that are part of the cycle.
- However each change will still be a normal item in the queue with its own
- jobs.
+ If Zuul detects a dependency cycle it will ensure that every
+ change also includes all other changes that are part of the
+ cycle. However each change will still be a normal item in the
+ queue with its own jobs.
Reporting of success will be postponed until all items in the cycle
- succeeded. In case of a failure in any of those items the whole cycle
+ succeed. In the case of a failure in any of those items the whole cycle
will be dequeued.
- An error message will be posted to all items of the cycle in case some
+ An error message will be posted to all items of the cycle if some
items fail to report (e.g. merge failure when some items were already
merged). In this case the target branch(es) might be in a broken state.
In general, circular dependencies are considered to be an
antipattern since they add extra constraints to continuous
deployment systems. Additionally, due to the lack of atomicity
- in merge operations in code review systems, it may be possible
- for only part of a cycle to be merged. In that case, manual
- interventions (such as reverting a commit, or bypassing gating to
- force-merge the remaining commits) may be required.
+ in merge operations in code review systems (this includes
+ Gerrit, even with submitWholeTopic set), it may be possible for
+ only part of a cycle to be merged. In that case, manual
+ interventions (such as reverting a commit, or bypassing gating
+ to force-merge the remaining commits) may be required.
.. warning:: If the remote system is able to merge the first but
unable to merge the second or later change in a
dependency cycle, then the gating system for a
project may be broken and may require an
intervention to correct.
+
+ .. attr:: dependencies-by-topic
+ :default: false
+
+ Determines whether Zuul should query the code review system for
+ changes under the same topic and treat those as a set of
+ circular dependencies.
+
+ Note that the Gerrit code review system supports a setting
+ called ``change.submitWholeTopic``, which, when set, will cause
+ all changes under the same topic to be merged simultaneously.
+ Zuul automatically observes this setting and treats all changes
+ to be submitted together as circular dependencies. If this
+ setting is enabled in gerrit, do not enable
+ ``dependencies-by-topic`` in associated Zuul queues.
+
+ Because ``change.submitWholeTopic`` is applied system-wide in
+ Gerrit, some Zuul users may wish to emulate the behavior for
+ some projects without enabling it for all of Gerrit. In this
+ case, setting ``dependencies-by-topic`` will cause Zuul to
+ approxiamate the Gerrit behavior only for changes enqueued into
+ queues where this is set.
+
+ This setting requires :attr:`queue.allow-circular-dependencies`
+ to also be set. All of the caveats noted there continue to
+ apply.
diff --git a/doc/source/config/semaphore.rst b/doc/source/config/semaphore.rst
index 74440ae79..91bfc9a4d 100644
--- a/doc/source/config/semaphore.rst
+++ b/doc/source/config/semaphore.rst
@@ -15,6 +15,10 @@ project as long as the value is the same. This is to aid in branch
maintenance, so that creating a new branch based on an existing branch
will not immediately produce a configuration error.
+Zuul also supports global semaphores (see :ref:`global_semaphore`)
+which may only be created by the Zuul administrator, but can be used
+to coordinate resources across multiple tenants.
+
Semaphores are never subject to dynamic reconfiguration. If the value
of a semaphore is changed, it will take effect only when the change
where it is updated is merged. However, Zuul will attempt to validate
diff --git a/doc/source/configuration.rst b/doc/source/configuration.rst
index 0e9c79f55..ced3ad781 100644
--- a/doc/source/configuration.rst
+++ b/doc/source/configuration.rst
@@ -61,6 +61,81 @@ Statsd
If present, this will be prefixed to all of the keys before
transmitting to the statsd server.
+Tracing
+~~~~~~~
+
+.. attr:: tracing
+
+ Information about the optional OpenTelemetry tracing configuration.
+ See :ref:`tracing` for more information.
+
+ .. attr:: enabled
+ :required:
+
+ To enable tracing, set this value to ``true``. This is the only
+ required parameter in order to export to a collector running
+ locally.
+
+ .. attr:: protocol
+ :default: grpc
+
+ The OTLP wire protocol to use.
+
+ .. value:: grpc
+
+ Use gRPC (the default).
+
+ .. value:: http/protobuf
+
+ Use HTTP with protobuf encoding.
+
+ .. attr:: endpoint
+
+ The endpoint to use. The default is protocol specific, but
+ defaults to localhost in all cases.
+
+ .. attr:: service_name
+ :default: zuul
+
+ The service name may be specified here. Multiple Zuul
+ installations should use different values.
+
+ .. attr:: tls_cert
+
+ The path to the PEM encoded certificate file. Used only by
+ :value:`tracing.protocol.grpc`.
+
+ .. attr:: tls_key
+
+ The path to the PEM encoded key file. Used only by
+ :value:`tracing.protocol.grpc`.
+
+ .. attr:: tls_ca
+
+ The path to the PEM encoded CA certificate file. Used only by
+ :value:`tracing.protocol.grpc`.
+
+ .. attr:: certificate_file
+
+ The path to the PEM encoded certificate file used to verify the
+ endpoint. Used only by :value:`tracing.protocol.http/protobuf`.
+
+ .. attr:: insecure
+
+ Whether to allow an insecure connection. Used only by
+ :value:`tracing.protocol.grpc`.
+
+ .. attr:: timeout
+ :default: 10000
+
+ The timeout for outgoing data in milliseconds.
+
+ .. attr:: compression
+
+ The compression algorithm to use. Available values depend on
+ the protocol and endpoint. The only universally supported value
+ is ``gzip``.
+
ZooKeeper
~~~~~~~~~
@@ -355,6 +430,16 @@ The following section of ``zuul.conf`` is used by the merger:
Path to PID lock file for the merger process.
+ .. attr:: prometheus_port
+
+ Set a TCP port to start the prometheus metrics client.
+
+ .. attr:: prometheus_addr
+ :default: 0.0.0.0
+
+ The IPv4 addr to listen for prometheus metrics poll.
+ To use IPv6, python>3.8 is required `issue24209 <https://bugs.python.org/issue24209>`_.
+
.. _executor:
Executor
@@ -390,38 +475,55 @@ playbook is in a config project, the executor runs the playbook in the
*trusted* execution context, otherwise, it is run in the *untrusted*
execution context.
-Both execution contexts use `bubblewrap`_ [#nullwrap]_ to create a namespace to
+Both execution contexts use `bubblewrap`_ to create a namespace to
ensure that playbook executions are isolated and are unable to access
files outside of a restricted environment. The administrator may
configure additional local directories on the executor to be made
available to the restricted environment.
-The trusted execution context has access to all Ansible features,
-including the ability to load custom Ansible modules. Needless to
-say, extra scrutiny should be given to code that runs in a trusted
-context as it could be used to compromise other jobs running on the
-executor, or the executor itself, especially if the administrator has
-granted additional access through bubblewrap, or a method of escaping
-the restricted environment created by bubblewrap is found.
-
-Playbooks run in the untrusted execution context are not permitted to
-load additional Ansible modules or access files outside of the
-restricted environment prepared for them by the executor. In addition
-to the bubblewrap environment applied to both execution contexts, in
-the untrusted context some standard Ansible modules are replaced with
-versions which prohibit some actions, including attempts to access
-files outside of the restricted execution context. These redundant
-protections are made as part of a defense-in-depth strategy.
-
.. _bubblewrap: https://github.com/projectatomic/bubblewrap
-.. _zuul-discuss: http://lists.zuul-ci.org/cgi-bin/mailman/listinfo/zuul-discuss
-
-.. [#nullwrap] `bubblewrap` is integral to securely operating Zuul.
- If it is difficult for you to use it in your environment, we
- encourage you to let us know via the `zuul-discuss`_ mailing
- list.
-
+.. _executor_security:
+
+Security Considerations
+~~~~~~~~~~~~~~~~~~~~~~~
+
+Bubblewrap restricts access to files outside of the build environment
+in both execution contexts. Operators may allow either read-only or
+read-write access to additional paths in either the `trusted` context
+or both contexts with additional options described below. Be careful
+when adding additional paths, and consider that any `trusted` or
+`untrusted` (as appropriate) playbook will have access to these paths.
+
+If executors are configured to use WinRM certificates, these must be
+made available to the bubblewrap environment in order for Ansible to
+use them. This invariably makes them accessible to any playbook in
+that execution context. Operators may want to consider only supplying
+WinRM credentials to trusted playbooks and installing per-build
+certificates in a pre-playbook; or using Ansible's experimental SSH
+support instead of WinRM.
+
+Local code execution is permitted on the executor, so if a
+vulnerability in bubblewrap or the kernel allows for an escape from
+the restricted environment, users may be able to escalate their
+privileges and obtain access to any data or secrets available to the
+executor.
+
+Playbooks which run on the executor will have the same network access
+as the executor itself. This should be kept in mind when considering
+IP-based network access control within an organization. Zuul's
+internal communication is via ZooKeeper which is authenticated and
+secured by TLS certificates, so as long as these certificates are not
+made available to jobs, users should not be able to access or disrupt
+Zuul's internal communications. However, statsd is an unauthenticated
+protocol, so a malicious user could emit false statsd information.
+
+If the Zuul executor is running in a cloud environment with a network
+metadata service, users may be able to access that service. If it
+supplies credentials, they may be able to obtain those credentials and
+access cloud resources. Operators should ensure that in these
+environments, the executors are configured with appropriately
+restricted IAM profiles.
Configuration
~~~~~~~~~~~~~
@@ -710,6 +812,16 @@ The following sections of ``zuul.conf`` are used by the executor:
Abort all running jobs and exit as soon as possible.
+ .. attr:: prometheus_port
+
+ Set a TCP port to start the prometheus metrics client.
+
+ .. attr:: prometheus_addr
+ :default: 0.0.0.0
+
+ The IPv4 addr to listen for prometheus metrics poll.
+ To use IPv6, python>3.8 is required `issue24209 <https://bugs.python.org/issue24209>`_.
+
.. attr:: keystore
@@ -730,6 +842,16 @@ The following sections of ``zuul.conf`` are used by the executor:
Value to pass to `git config user.name
<https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup>`_.
+ .. attr:: prometheus_port
+
+ Set a TCP port to start the prometheus metrics client.
+
+ .. attr:: prometheus_addr
+ :default: 0.0.0.0
+
+ The IPv4 addr to listen for prometheus metrics poll.
+ To use IPv6, python>3.8 is required `issue24209 <https://bugs.python.org/issue24209>`_.
+
.. attr:: ansible_callback "<name>"
To whitelist ansible callback ``<name>``. Any attributes found is this section
@@ -778,6 +900,11 @@ sections of ``zuul.conf`` are used by the web server:
.. attr:: web
+ .. attr:: command_socket
+ :default: /var/lib/zuul/web.socket
+
+ Path to command socket file for the web process.
+
.. attr:: listen_address
:default: 127.0.0.1
@@ -994,6 +1121,28 @@ authentication on Zuul's web user interface.
The well-known configuration of the Identity Provider should provide this URL
under the key "jwks_uri", therefore this attribute is usually not necessary.
+Some providers may not conform to the JWT specification and further
+configuration may be necessary. In these cases, the following
+additional values may be used:
+
+.. attr:: authority
+ :default: issuer_id
+
+ If the authority in the token response is not the same as the
+ issuer_id in the request, it may be explicitly set here.
+
+.. attr:: audience
+ :default: client_id
+
+ If the audience in the token response is not the same as the
+ issuer_id in the request, it may be explicitly set here.
+
+.. attr:: load_user_info
+ :default: true
+
+ If the web UI should skip accessing the "UserInfo" endpoint and
+ instead rely only on the information returned in the token, set
+ this to ``false``.
Client
------
diff --git a/doc/source/developer/ansible.rst b/doc/source/developer/ansible.rst
index 6e588ed0f..c3135debe 100644
--- a/doc/source/developer/ansible.rst
+++ b/doc/source/developer/ansible.rst
@@ -2,44 +2,14 @@ Ansible Integration
===================
Zuul contains Ansible modules and plugins to control the execution of Ansible
-Job content. These break down into two basic categories.
+Job content.
-* Restricted Execution on Executors
-* Build Log Support
+Zuul provides realtime build log streaming to end users so that users
+can watch long-running jobs in progress.
-Restricted Execution
+Streaming job output
--------------------
-Zuul runs ``ansible-playbook`` on executors to run job content on nodes. While
-the intent is that content is run on the remote nodes, Ansible is a flexible
-system that allows delegating actions to ``localhost``, and also reading and
-writing files. These actions can be desirable and necessary for actions such
-as fetching log files or build artifacts, but could also be used as a vector
-to attack the executor.
-
-For that reason Zuul implements a set of Ansible action plugins and lookup
-plugins that override and intercept task execution during untrusted playbook
-execution to ensure local actions are not executed or that for operations that
-are desirable to allow locally that they only interact with files in the zuul
-work directory.
-
-.. autoclass:: zuul.ansible.base.action.normal.ActionModule
- :members:
-
-Build Log Support
------------------
-
-Zuul provides realtime build log streaming to end users so that users can
-watch long-running jobs in progress. As jobs may be written that execute a
-shell script that could run for a long time, additional effort is expended
-to stream stdout and stderr of shell tasks as they happen rather than waiting
-for the command to finish.
-
-Zuul contains a modified version of the :ansible:module:`command`
-that starts a log streaming daemon on the build node.
-
-.. automodule:: zuul.ansible.base.library.command
-
All jobs run with the :py:mod:`zuul.ansible.base.callback.zuul_stream` callback
plugin enabled, which writes the build log to a file so that the
:py:class:`zuul.lib.log_streamer.LogStreamer` can provide the data on demand
@@ -57,10 +27,55 @@ exposes that log stream over a websocket connection as part of
In addition to real-time streaming, Zuul also installs another callback module,
:py:mod:`zuul.ansible.base.callback.zuul_json.CallbackModule` that collects all
of the information about a given run into a json file which is written to the
-work dir so that it can be published along with build logs. Since the streaming
-log is by necessity a single text stream, choices have to be made for
-readability about what data is shown and what is not shown. The json log file
-is intended to allow for a richer more interactive set of data to be displayed
-to the user.
+work dir so that it can be published along with build logs.
.. autoclass:: zuul.ansible.base.callback.zuul_json.CallbackModule
+
+Since the streaming log is by necessity a single text stream, choices
+have to be made for readability about what data is shown and what is
+not shown. The json log file is intended to allow for a richer more
+interactive set of data to be displayed to the user.
+
+.. _zuul_console_streaming:
+
+Capturing live command output
+-----------------------------
+
+As jobs may execute long-running shell scripts or other commands,
+additional effort is expended to stream ``stdout`` and ``stderr`` of
+shell tasks as they happen rather than waiting for the command to
+finish.
+
+The global job configuration should run the ``zuul_console`` task as a
+very early prerequisite step.
+
+.. automodule:: zuul.ansible.base.library.zuul_console
+
+This will start a daemon that listens on TCP port 19885 on the testing
+node. This daemon can be queried to stream back the output of shell
+tasks as described below.
+
+Zuul contains a modified version of Ansible's
+:ansible:module:`command` module that overrides the default
+implementation.
+
+.. automodule:: zuul.ansible.base.library.command
+
+This library will capture the output of the running
+command and write it to a temporary file on the host the command is
+running on. These files are named in the format
+``/tmp/console-<uuid>-<task_id>-<host>.log``
+
+The ``zuul_stream`` callback mentioned above will send a request to
+the remote ``zuul_console`` daemon, providing the uuid and task id of
+the task it is currently processing. The ``zuul_console`` daemon will
+then read the logfile from disk and stream the data back as it
+appears, which ``zuul_stream`` will then present as described above.
+
+The ``zuul_stream`` callback will indicate to the ``zuul_console``
+daemon when it has finished reading the task, which prompts the remote
+side to remove the temporary streaming output files. In some cases,
+aborting the Ansible process may not give the ``zuul_stream`` callback
+the chance to send this notice, leaking the temporary files. If nodes
+are ephemeral this makes little difference, but these files may be
+visible on static nodes.
diff --git a/doc/source/developer/index.rst b/doc/source/developer/index.rst
index 52266a175..b45c75640 100644
--- a/doc/source/developer/index.rst
+++ b/doc/source/developer/index.rst
@@ -14,6 +14,7 @@ Zuul, though advanced users may find it interesting.
drivers
triggers
testing
+ metrics
docs
ansible
javascript
diff --git a/doc/source/developer/metrics.rst b/doc/source/developer/metrics.rst
new file mode 100644
index 000000000..913a591ba
--- /dev/null
+++ b/doc/source/developer/metrics.rst
@@ -0,0 +1,74 @@
+:title: Metrics
+
+Metrics
+=======
+
+Event Overview
+--------------
+
+The following table illustrates the event and pipeline processing
+sequence as it relates to some of the metrics described in
+:ref:`statsd`. This is intended as general guidance only and is not
+an exhaustive list.
+
++----------------------------------------+------+------+------+--------------------------------------+
+| Event | Metrics | Attribute |
++========================================+======+======+======+======================================+
+| Event generated by source | | | | event.timestamp |
++----------------------------------------+------+ + +--------------------------------------+
+| Enqueued into driver queue | | | | |
++----------------------------------------+------+ + +--------------------------------------+
+| Enqueued into tenant trigger queue | | | | event.arrived_at_scheduler_timestamp |
++----------------------------------------+ + [8] + +--------------------------------------+
+| Forwarded to matching pipelines | [1] | | | |
++----------------------------------------+ + + +--------------------------------------+
+| Changes enqueued ahead | | | | |
++----------------------------------------+ + + +--------------------------------------+
+| Change enqueued | | | | item.enqueue_time |
++----------------------------------------+------+------+ +--------------------------------------+
+| Changes enqueued behind | | | | |
++----------------------------------------+------+------+ +--------------------------------------+
+| Set item configuration | | | | build_set.configured_time |
++----------------------------------------+------+------+ +--------------------------------------+
+| Request files changed (if needed) | | | | |
++----------------------------------------+ +------+ +--------------------------------------+
+| Request merge | [2] | | | |
++----------------------------------------+ +------+ +--------------------------------------+
+| Wait for merge (and files if needed) | | | [9] | |
++----------------------------------------+------+------+ +--------------------------------------+
+| Generate dynamic layout (if needed) | [3] | | | |
++----------------------------------------+------+------+ +--------------------------------------+
+| Freeze job graph | [4] | | | |
++----------------------------------------+------+------+ +--------------------------------------+
+| Request global repo state (if needed) | | | | build_set.repo_state_request_time |
++----------------------------------------+ [5] +------+ +--------------------------------------+
+| Wait for global repo state (if needed) | | | | |
++----------------------------------------+------+------+ +--------------------------------------+
+| Deduplicate jobs | | | | |
++----------------------------------------+------+------+ +--------------------------------------+
+| Acquire semaphore (non-resources-first)| | | | |
++----------------------------------------+------+------+ +--------------------------------------+
+| Request nodes | | | | request.created_time |
++----------------------------------------+ [6] +------+ +--------------------------------------+
+| Wait for nodes | | | | |
++----------------------------------------+------+------+ +--------------------------------------+
+| Acquire semaphore (resources-first) | | | | |
++----------------------------------------+------+------+ +--------------------------------------+
+| Enqueue build request | | | | build.execute_time |
++----------------------------------------+ [7] +------+ +--------------------------------------+
+| Executor starts job | | | | build.start_time |
++----------------------------------------+------+------+------+--------------------------------------+
+
+====== =============================
+Metric Name
+====== =============================
+1 event_enqueue_processing_time
+2 merge_request_time
+3 layout_generation_time
+4 job_freeze_time
+5 repo_state_time
+6 node_request_time
+7 job_wait_time
+8 event_enqueue_time
+9 event_job_time
+====== =============================
diff --git a/doc/source/developer/model-changelog.rst b/doc/source/developer/model-changelog.rst
index 3a471fd55..d27ec8351 100644
--- a/doc/source/developer/model-changelog.rst
+++ b/doc/source/developer/model-changelog.rst
@@ -6,7 +6,7 @@ increases here.
When making a model change:
-* Increment the value of ``MODEL_API`` in ``model.py``.
+* Increment the value of ``MODEL_API`` in ``model_api.py``.
* Update code to use the new API by default and add
backwards-compatibility handling for older versions. This makes it
easier to clean up backwards-compatibility handling in the future.
@@ -46,3 +46,50 @@ Version 3
:Description: Add a new `SupercedeEvent` and use that for dequeuing of
superceded items from other pipelines. This only affects the
schedulers.
+
+Version 4
+---------
+
+:Prior Zuul version: 5.1.0
+:Description: Adds QueueItem.dequeued_missing_requirements and sets it to True
+ if a change no longer meets merge requirements in dependent
+ pipelines. This only affects schedulers.
+
+Version 5
+---------
+
+:Prior Zuul version: 5.1.0
+:Description: Changes the result data attributes on Build from
+ ResultData to JobData instances and uses the
+ inline/offloading paradigm from FrozenJob. This affects
+ schedulers and executors.
+
+Version 6
+---------
+
+:Prior Zuul version: 5.2.0
+:Description: Stores the complete layout min_ltimes in /zuul/layout-data.
+ This only affects schedulers.
+
+Version 7
+---------
+
+:Prior Zuul version: 5.2.2
+:Description: Adds the blob store and stores large secrets in it.
+ Playbook secret references are now either an integer
+ index into the job secret list, or a dict with a blob
+ store key. This affects schedulers and executors.
+
+Version 8
+---------
+
+:Prior Zuul version: 6.0.0
+:Description: Deduplicates jobs in dependency cycles. Affects
+ schedulers only.
+
+Version 9
+---------
+
+:Prior Zuul version: 6.3.0
+:Description: Adds nodeset_alternatives and nodeset_index to frozen job.
+ Removes nodset from frozen job. Affects schedulers and executors.
diff --git a/doc/source/developer/specs/index.rst b/doc/source/developer/specs/index.rst
index d96df0c26..a75084429 100644
--- a/doc/source/developer/specs/index.rst
+++ b/doc/source/developer/specs/index.rst
@@ -16,10 +16,12 @@ documentation instead.
.. toctree::
:maxdepth: 1
- tenant-scoped-admin-web-API
- kubernetes-operator
circular-dependencies
- zuul-runner
+ community-matrix
enhanced-regional-executors
+ kubernetes-operator
+ nodepool-in-zuul
tenant-resource-quota
- community-matrix
+ tenant-scoped-admin-web-API
+ tracing
+ zuul-runner
diff --git a/doc/source/developer/specs/nodepool-in-zuul.rst b/doc/source/developer/specs/nodepool-in-zuul.rst
new file mode 100644
index 000000000..10a3ad7dc
--- /dev/null
+++ b/doc/source/developer/specs/nodepool-in-zuul.rst
@@ -0,0 +1,743 @@
+Nodepool in Zuul
+================
+
+.. warning:: This is not authoritative documentation. These features
+ are not currently available in Zuul. They may change significantly
+ before final implementation, or may never be fully completed.
+
+The following specification describes a plan to move Nodepool's
+functionality into Zuul and end development of Nodepool as a separate
+application. This will allow for more node and image related features
+as well as simpler maintenance and deployment.
+
+Introduction
+------------
+
+Nodepool exists as a distinct application from Zuul largely due to
+historical circumstances: it was originally a process for launching
+nodes, attaching them to Jenkins, detaching them from Jenkins and
+deleting them. Once Zuul grew its own execution engine, Nodepool
+could have been adopted into Zuul at that point, but the existing
+loose API meant it was easy to maintain them separately and combining
+them wasn't particularly advantageous.
+
+However, now we find ourselves with a very robust framework in Zuul
+for dealing with ZooKeeper, multiple components, web services and REST
+APIs. All of these are lagging behind in Nodepool, and it is time to
+address that one way or another. We could of course upgrade
+Nodepool's infrastructure to match Zuul's, or even separate out these
+frameworks into third-party libraries. However, there are other
+reasons to consider tighter coupling between Zuul and Nodepool, and
+these tilt the scales in favor of moving Nodepool functionality into
+Zuul.
+
+Designing Nodepool as part of Zuul would allow for more features
+related to Zuul's multi-tenancy. Zuul is quite good at
+fault-tolerance as well as scaling, so designing Nodepool around that
+could allow for better cooperation between node launchers. Finally,
+as part of Zuul, Nodepool's image lifecycle can be more easily
+integrated with Zuul-based workflow.
+
+There are two Nodepool components: nodepool-builder and
+nodepool-launcher. We will address the functionality of each in the
+following sections on Image Management and Node Management.
+
+This spec contemplates a new Zuul component to handle image and node
+management: zuul-launcher. Much of the Nodepool configuration will
+become Zuul configuration as well. That is detailed in its own
+section, but for now, it's enough to know that the Zuul system as a
+whole will know what images and node labels are present in the
+configuration.
+
+Image Management
+----------------
+
+Part of nodepool-builder's functionality is important to have as a
+long-running daemon, and part of what it does would make more sense as
+a Zuul job. By moving the actual image build into a Zuul job, we can
+make the activity more visible to users of the system. It will be
+easier for users to test changes to image builds (inasmuch as they can
+propose a change and a check job can run on that change to see if the
+image builds sucessfully). Build history and logs will be visible in
+the usual way in the Zuul web interface.
+
+A frequently requested feature is the ability to verify images before
+putting them into service. This is not practical with the current
+implementation of Nodepool because of the loose coupling with Zuul.
+However, once we are able to include Zuul jobs in the workflow of
+image builds, it is easier to incorporate Zuul jobs to validate those
+images as well. This spec includes a mechanism for that.
+
+The parts of nodepool-builder that makes sense as a long-running
+daemon are the parts dealing with image lifecycles. Uploading builds
+to cloud providers, keeping track of image builds and uploads,
+deciding when those images should enter or leave service, and deleting
+them are all better done with state management and long-running
+processes (we should know -- early versions of Nodepool attempted to
+do all of that with Jenkins jobs with limited success).
+
+The sections below describe how we will implement image management in
+Zuul.
+
+First, a reminder that using custom images is optional with Zuul.
+Many Zuul systems will be able to operate using only stock cloud
+provider images. One of the strengths of nodepool-builder is that it
+can build an image for Zuul without relying on any particular cloud
+provider images. A Zuul system whose operator wants to use custom
+images will need to bootstrap that process, and under the proposed
+system where images are build in Zuul jobs, that would need to be done
+using a stock cloud image. In other words, to bootstrap a system such
+as OpenDev from scratch, the operators would need to use a stock cloud
+image to run the job to build the custom image. Once a custom image
+is available, further image builds could be run on either the stock
+cloud image or the custom image. That decision is left to the
+operator and involves consideration of fault tolerance and disaster
+recovery scenarios.
+
+To build a custom image, an operator will define a fairly typical Zuul
+job for each image they would like to produce. For example, a system
+may have one job to build a debian-stable image, a second job for
+debian-unstable, a third job for ubuntu-focal, a fourth job for
+ubuntu-jammy. Zuul's job inheritance system could be very useful here
+to deal with many variations of a similar process.
+
+Currently nodepool-builder will build an image under three
+circumstances: 1) the image (or the image in a particular format) is
+missing; 2) a user has directly requested a build; 3) on an automatic
+interval (typically daily). To map this into Zuul, we will use Zuul's
+existing pipeline functionality, but we will add a new trigger for
+case #1. Case #2 can be handled by a manual Zuul enqueue command, and
+case #3 by a periodic pipeline trigger.
+
+Since Zuul knows what images are configured and what their current
+states are, it will be able to emit trigger events when it detects
+that a new image (or image format) has been added to its
+configuration. In these cases, the `zuul` driver in Zuul will enqueue
+an `image-build` trigger event on startup or reconfiguration for every
+missing image. The event will include the image name. Pipelines will
+be configured to trigger on `image-build` events as well as on a timer
+trigger.
+
+Jobs will include an extra attribute to indicate they build a
+particular image. This serves two purposes; first, in the case of an
+`image-build` trigger event, it will act as a matcher so that only
+jobs matching the image that needs building are run. Second, it will
+allow Zuul to determine which formats are needed for that image (based
+on which providers are configured to use it) and include that
+information as job data.
+
+The job will be responsible for building the image and uploading the
+result to some storage system. The URLs for each image format built
+should be returned to Zuul as artifacts.
+
+Finally, the `zuul` driver reporter will accept parameters which will
+tell it to search the result data for these artifact URLs and update
+the internal image state accordingly.
+
+An example configuration for a simple single-stage image build:
+
+.. code-block:: yaml
+
+ - pipeline:
+ name: image
+ trigger:
+ zuul:
+ events:
+ - image-build
+ timer:
+ time: 0 0 * * *
+ success:
+ zuul:
+ image-built: true
+ image-validated: true
+
+ - job:
+ name: build-debian-unstable-image
+ image-build-name: debian-unstable
+
+This job would run whenever Zuul determines it needs a new
+debian-unstable image or daily at midnight. Once the job completes,
+because of the ``image-built: true`` report, it will look for artifact
+data like this:
+
+.. code-block:: yaml
+
+ artifacts:
+ - name: raw image
+ url: https://storage.example.com/new_image.raw
+ metadata:
+ type: zuul_image
+ image_name: debian-unstable
+ format: raw
+ - name: qcow2 image
+ url: https://storage.example.com/new_image.qcow2
+ metadata:
+ type: zuul_image
+ image_name: debian-unstable
+ format: qcow2
+
+Zuul will update internal records in ZooKeeper for the image to record
+the storage URLs. The zuul-launcher process will then start
+background processes to download the images from the storage system
+and upload them to the configured providers (much as nodepool-builder
+does now with files on disk). As a special case, it may detect that
+the image files are stored in a location that a provider can access
+directly for import and may be able to import directly from the
+storage location rather than downloading locally first.
+
+To handle image validation, a flag will be stored for each image
+upload indicating whether it has been validated. The example above
+specifies ``image-validated: true`` and therefore Zuul will put the
+image into service as soon as all image uploads are complete.
+However, if it were false, then Zuul would emit an `image-validate`
+event after each upload is complete. A second pipeline can be
+configured to perform image validation. It can run any number of
+jobs, and since Zuul has complete knowledge of image states, it will
+supply nodes using the new image upload (which is not yet in service
+for normal jobs). An example of this might look like:
+
+.. code-block:: yaml
+
+ - pipeline:
+ name: image-validate
+ trigger:
+ zuul:
+ events:
+ - image-validate
+ success:
+ zuul:
+ image-validated: true
+
+ - job:
+ name: validate-debian-unstable-image
+ image-build-name: debian-unstable
+ nodeset:
+ nodes:
+ - name: node
+ label: debian
+
+The label should specify the same image that is being validated. Its
+node request will be made with extra specifications so that it is
+fulfilled with a node built from the image under test. This process
+may repeat for each of the providers using that image (normal pipeline
+queue deduplication rules may need a special case to allow this).
+Once the validation jobs pass, the entry in ZooKeeper will be updated
+and the image will go into regular service.
+
+A more specific process definition follows:
+
+After a buildset reports with ``image-built: true``, Zuul will scan
+result data and for each artifact it finds, it will create an entry in
+ZooKeeper at `/zuul/images/<image_name>/<sequence>`. Zuul will know
+not to emit any more `image-build` events for that image at this
+point.
+
+For every provider using that image, Zuul will create an entry in
+ZooKeeper at
+`/zuul/image-uploads/<image_name>/<image_number>/provider/<provider_name>`.
+It will set the remote image ID to null and the `image-validated` flag
+to whatever was specified in the reporter.
+
+Whenever zuul-launcher observes a new `image-upload` record without an
+ID, it will:
+
+* Lock the whole image
+* Lock each upload it can handle
+* Unlocks the image while retaining the upload locks
+* Downloads artifact (if needed) and uploads images to provider
+* If upload requires validation, it enqueues an `image-validate` zuul driver trigger event
+* Unlocks upload
+
+The locking sequence is so that a single launcher can perform multiple
+uploads from a single artifact download if it has the opportunity.
+
+Once more than two builds of an image are in service, the oldest is
+deleted. The image ZooKeeper record set to the `deleting` state.
+Zuul-launcher will delete the uploads from the providers. The `zuul`
+driver emits an `image-delete` event with item data for the image
+artifact. This will trigger an image-delete job that can delete the
+artifact from the cloud storage.
+
+All of these pipeline definitions should typically be in a single
+tenant (but need not be), but the images they build are potentially
+available to each tenant that includes the image definition
+configuration object (see the Configuration section below). Any repo
+in a tenant with an image build pipeline will be able to cause images
+to be built and uploaded to providers.
+
+Snapshot Images
+~~~~~~~~~~~~~~~
+
+Nodepool does not currently support snapshot images, but the spec for
+the current version of Nodepool does contemplate the possibility of a
+snapshot based nodepool-builder process. Likewise, this spec does not
+require us to support snapshot image builds, but in case we want to
+add support in the future, we should have a plan for it.
+
+The image build job in Zuul could, instead of running
+diskimage-builder, act on the remote node to prepare it for a
+snapshot. A special job attribute could indicate that it is a
+snapshot image job, and instead of having the zuul-launcher component
+delete the node at the end of the job, it could snapshot the node and
+record that information in ZooKeeper. Unlike an image-build job, an
+image-snapshot job would need to run in each provider (similar to how
+it is proposed that an image-validate job will run in each provider).
+An image-delete job would not be required.
+
+
+Node Management
+---------------
+
+The techniques we have developed for cooperative processing in Zuul
+can be applied to the node lifecycle. This is a good time to make a
+significant change to the nodepool protocol. We can achieve several
+long-standing goals:
+
+* Scaling and fault-tolerance: rather than having a 1:N relationship
+ of provider:nodepool-launcher, we can have multiple zuul-launcher
+ processes, each of which is capable of handling any number of
+ providers.
+
+* More intentional request fulfillment: almost no intelligence goes
+ into selecting which provider will fulfill a given node request; by
+ assigning providers intentionally, we can more efficiently utilize
+ providers.
+
+* Fulfilling node requests from multiple providers: by designing
+ zuul-launcher for cooperative work, we can have nodesets that
+ request nodes which are fulfilled by different providers. Generally
+ we should favor the same provider for a set of nodes (since they may
+ need to communicate over a LAN), but if that is not feasible,
+ allowing multiple providers to fulfill a request will permit
+ nodesets with diverse node types (e.g., VM + static, or VM +
+ container).
+
+Each zuul-launcher process will execute a number of processing loops
+in series; first a global request processing loop, and then a
+processing loop for each provider. Each one will involve obtaining a
+ZooKeeper lock so that only one zuul-launcher process will perform
+each function at a time.
+
+Zuul-launcher will need to know about every connection in the system
+so that it may have a fuul copy of the configuration, but operators
+may wish to localize launchers to specific clouds. To support this,
+zuul-launcher will take an optional command-line argument to indicate
+on which connections it should operate.
+
+Currently a node request as a whole may be declined by providers. We
+will make that more granular and store information about each node in
+the request (in other words, individual nodes may be declined by
+providers).
+
+All drivers for providers should implement the state machine
+interface. Any state machine information currently storen in memory
+in nodepool-launcher will need to move to ZooKeeper so that other
+launchers can resume state machine processing.
+
+The individual provider loop will:
+
+* Lock a provider in ZooKeeper (`/zuul/provider/<name>`)
+* Iterate over every node assigned to that provider in a `building` state
+
+ * Drive the state machine
+ * If success, update request
+ * If failure, determine if it's a temporary or permanent failure
+ and update the request accordingly
+ * If quota available, unpause provider (if paused)
+
+The global queue process will:
+
+* Lock the global queue
+* Iterate over every pending node request, and every node within that request
+
+ * If all providers have failed the request, clear all temp failures
+ * If all providers have permanently failed the request, return error
+ * Identify providers capable of fulfilling the request
+ * Assign nodes to any provider with sufficient quota
+ * If no providers with sufficient quota, assign it to first (highest
+ priority) provider that can fulfill it later and pause that
+ provider
+
+Configuration
+-------------
+
+The configuration currently handled by Nodepool will be refactored and
+added to Zuul's configuration syntax. It will be loaded directly from
+git repos like most Zuul configuration, however it will be
+non-speculative (like pipelines and semaphores -- changes must merge
+before they take effect).
+
+Information about connecting to a cloud will be added to ``zuul.conf``
+as a ``connection`` entry. The rate limit setting will be moved to
+the connection configuration. Providers will then reference these
+connections by name.
+
+Because providers and images reference global (i.e., outside tenant
+scope) concepts, ZooKeeper paths for data related to those should
+include the canonical name of the repo where these objects are
+defined. For example, a `debian-unstable` image in the
+`opendev/images` repo should be stored at
+``/zuul/zuul-images/opendev.org%2fopendev%2fimages/``. This avoids
+collisions if different tenants contain different image objects with
+the same name.
+
+The actual Zuul config objects will be tenant scoped. Image
+definitions which should be available to a tenant should be included
+in that tenant's config. Again using the OpenDev example, the
+hypothetical `opendev/images` repository should be included in every
+OpenDev tenant so all of those images are available.
+
+Within a tenant, image names must be unique (otherwise it is a tenant
+configuration error, similar to a job name collision).
+
+The diskimage-builder related configuration items will no longer be
+necessary since they will be encoded in Zuul jobs. This will reduce
+the complexity of the configuration significantly.
+
+The provider configuration will change as we take the opportunity to
+make it more "Zuul-like". Instead of a top-level dictionary, we will
+use lists. We will standardize on attributes used across drivers
+where possible, as well as attributes which may be located at
+different levels of the configuration.
+
+The goals of this reorganization are:
+
+* Allow projects to manage their own image lifecycle (if permitted by
+ site administrators).
+* Manage access control to labels, images and flavors via standard
+ Zuul mechanisms (whether an item appears within a tenant).
+* Reduce repetition and boilerplate for systems with many clouds,
+ labels, or images.
+
+The new configuration objects are:
+
+Image
+ This represents any kind of image (A Zuul image built by a job
+ described above, or a cloud image). By using one object to
+ represent both, we open the possibility of having a label in one
+ provider use a cloud image and in another provider use a Zuul image
+ (because the label will reference the image by short-name which may
+ resolve to a different image object in different tenants). A given
+ image object will specify what type it is, and any relevant
+ information about it (such as the username to use, etc).
+
+Flavor
+ This is a new abstraction layer to reference instance types across
+ different cloud providers. Much like labels today, these probably
+ won't have much information associated with them other than to
+ reserve a name for other objects to reference. For example, a site
+ could define a `small` and a `large` flavor. These would later be
+ mapped to specific instance types on clouds.
+
+Label
+ Unlike the current Nodepool ``label`` definitions, these labels will
+ also specify the image and flavor to use. These reference the two
+ objects above, which means that labels themselves contain the
+ high-level definition of what will be provided (e.g., a `large
+ ubuntu` node) while the specific mapping of what `large` and
+ `ubuntu` mean are left to the more specific configuration levels.
+
+Section
+ This looks a lot like the current ``provider`` configuration in
+ Nodepool (but also a little bit like a ``pool``). Several parts of
+ the Nodepool configuration (such as separating out availability
+ zones from providers into pools) were added as an afterthought, and
+ we can take the opportunity to address that here.
+
+ A ``section`` is part of a cloud. It might be a region (if a cloud
+ has regions). It might be one or more availability zones within a
+ region. A lot of the specifics about images, flavors, subnets,
+ etc., will be specified here. Because a cloud may have many
+ sections, we will implement inheritance among sections.
+
+Provider
+ This is mostly a mapping of labels to sections and is similar to a
+ provider pool in the current Nodepool configuration. It exists as a
+ separate object so that site administrators can restrict ``section``
+ definitions to central repos and allow tenant administrators to
+ control their own image and labels by allowing certain projects to
+ define providers.
+
+ It mostly consists of a list of labels, but may also include images.
+
+When launching a node, relevant attributes may come from several
+sources (the pool, image, flavor, or provider). Not all attributes
+make sense in all locations, but where we can support them in multiple
+locations, the order of application (later items override earlier
+ones) will be:
+
+* ``image`` stanza
+* ``flavor`` stanza
+* ``label`` stanza
+* ``section`` stanza (top level)
+* ``image`` within ``section``
+* ``flavor`` within ``section``
+* ``provider`` stanza (top level)
+* ``label`` within ``provider``
+
+This reflects that the configuration is built upwards from general and
+simple objects toward more specific objects image, flavor, label,
+section, provider. Generally speaking, inherited scalar values will
+override, dicts will merge, lists will concatenate.
+
+An example configuration follows. First, some configuration which may
+appear in a central project and shared among multiple tenants:
+
+.. code-block:: yaml
+
+ # Images, flavors, and labels are the building blocks of the
+ # configuration.
+
+ - image:
+ name: centos-7
+ type: zuul
+ # Any other image-related info such as:
+ # username: ...
+ # python-path: ...
+ # shell-type: ...
+ # A default that can be overridden by a provider:
+ # config-drive: true
+
+ - image:
+ name: ubuntu
+ type: cloud
+
+ - flavor:
+ name: large
+
+ - label:
+ name: centos-7
+ min-ready: 1
+ flavor: large
+ image: centos-7
+
+ - label:
+ name: ubuntu
+ flavor: small
+ image: ubuntu
+
+ # A section for each cloud+region+az
+
+ - section:
+ name: rax-base
+ abstract: true
+ connection: rackspace
+ boot-timeout: 120
+ launch-timeout: 600
+ key-name: infra-root-keys-2020-05-13
+ # The launcher will apply the minimum of the quota reported by the
+ # driver (if available) or the values here.
+ quota:
+ instances: 2000
+ subnet: some-subnet
+ tags:
+ section-info: foo
+ # We attach both kinds of images to providers in order to provide
+ # image-specific info (like config-drive) or username.
+ images:
+ - name: centos-7
+ config-drive: true
+ # This is a Zuul image
+ - name: ubuntu
+ # This is a cloud image, so the specific cloud image name is required
+ image-name: ibm-ubuntu-20-04-3-minimal-amd64-1
+ # Other information may be provided
+ # username ...
+ # python-path: ...
+ # shell-type: ...
+ flavors:
+ - name: small
+ cloud-flavor: "Performance 8G"
+ - name: large
+ cloud-flavor: "Performance 16G"
+
+ - section:
+ name: rax-dfw
+ parent: rax-base
+ region: 'DFW'
+ availability-zones: ["a", "b"]
+
+ # A provider to indicate what labels are available to a tenant from
+ # a section.
+
+ - provider:
+ name: rax-dfw-main
+ section: rax-dfw
+ labels:
+ - name: centos-7
+ - name: ubuntu
+ key-name: infra-root-keys-2020-05-13
+ tags:
+ provider-info: bar
+
+The following configuration might appear in a repo that is only used
+in a single tenant:
+
+.. code-block:: yaml
+
+ - image:
+ name: devstack
+ type: zuul
+
+ - label:
+ name: devstack
+
+ - provider:
+ name: rax-dfw-devstack
+ section: rax-dfw
+ # The images can be attached to the provider just as a section.
+ image:
+ - name: devstack
+ config-drive: true
+ labels:
+ - name: devstack
+
+Here is a potential static node configuration:
+
+.. code-block:: yaml
+
+ - label:
+ name: big-static-node
+
+ - section:
+ name: static-nodes
+ connection: null
+ nodes:
+ - name: static.example.com
+ labels:
+ - big-static-node
+ host-key: ...
+ username: zuul
+
+ - provider:
+ name: static-provider
+ section: static-nodes
+ labels:
+ - big-static-node
+
+Each of the the above stanzas may only appear once in a tenant for a
+given name (like pipelines or semaphores, they are singleton objects).
+If they appear in more than one branch of a project, the definitions
+must be identical; otherwise, or if they appear in more than one repo,
+the second definition is an error. These are meant to be used in
+unbranched repos. Whatever tenants they appear in will be permitted
+to access those respective resources.
+
+The purpose of the ``provider`` stanza is to associate labels, images,
+and sections. Much of the configuration related to launching an
+instance (including the availability of zuul or cloud images) may be
+supplied in the ``provider`` stanza and will apply to any labels
+within. The ``section`` stanza also allows configuration of the same
+information except for the labels themselves. The ``section``
+supplies default values and the ``provider`` can override them or add
+any missing values. Images are additive -- any images that appear in
+a ``provider`` will augment those that appear in a ``section``.
+
+The result is a modular scheme for configuration, where a single
+``section`` instance can be used to set as much information as
+possible that applies globally to a provider. A simple configuration
+may then have a single ``provider`` instance to attach labels to that
+section. A more complex installation may define a "standard" pool
+that is present in every tenant, and then tenant-specific pools as
+well. These pools will all attach to the same section.
+
+References to sections, images and labels will be internally converted
+to canonical repo names to avoid ambiguity. Under the current
+Nodepool system, labels are truly a global object, but under this
+proposal, a label short name in one tenant may be different than one
+in another. Therefore the node request will internally specify the
+canonical label name instead of the short name. Users will never use
+canonical names, only short names.
+
+For static nodes, there is some repitition to labels: first labels
+must be associated with the individual nodes defined on the section,
+then the labels must appear again on a provider. This allows an
+operator to define a collection of static nodes centrally on a
+section, then include tenant-specific sets of labels in a provider.
+For the simple case where all static node labels in a section should
+be available in a provider, we could consider adding a flag to the
+provider to allow that (e.g., ``include-all-node-labels: true``).
+Static nodes themselves are configured on a section with a ``null``
+connection (since there is no cloud provider associated with static
+nodes). In this case, the additional ``nodes`` section attribute
+becomes available.
+
+Upgrade Process
+---------------
+
+Most users of diskimages will need to create new jobs to build these
+images. This proposal also includes significant changes to the node
+allocation system which come with operational risks.
+
+To make the transition as minimally disruptive as possible, we will
+support both systems in Zuul, and allow for selection of one system or
+the other on a per-label and per-tenant basis.
+
+By default, if a nodeset specifies a label that is not defined by a
+``label`` object in the tenant, Zuul will use the old system and place
+a ZooKeeper request in ``/nodepool``. If a matching ``label`` is
+available in the tenant, The request will use the new system and be
+sent to ``/zuul/node-requests``. Once a tenant has completely
+converted, a configuration flag may be set in the tenant configuration
+and that will allow Zuul to treat nodesets that reference unknown
+labels as configuration errors. A later version of Zuul will remove
+the backwards compatability and make this the standard behavior.
+
+Because each of the systems will have unique metadata, they will not
+recognize each others nodes, and it will appear to each that another
+system is using part of their quota. Nodepool is already designed to
+handle this case (at least, handle it as well as possible).
+
+Library Requirements
+--------------------
+
+The new zuul-launcher component will need most of Nodepool's current
+dependencies, which will entail adding many third-party cloud provider
+interfaces. As of writing, this uses another 420M of disk space.
+Since our primary method of distribution at this point is container
+images, if the additional space is a concern, we could restrict the
+installation of these dependencies to only the zuul-launcher image.
+
+Diskimage-Builder Testing
+-------------------------
+
+The diskimage-builder project team has come to rely on Nodepool in its
+testing process. It uses Nodepool to upload images to a devstack
+cloud, launch nodes from those instances, and verify that they
+function. To aid in continuity of testing in the diskimage-builder
+project, we will extract the OpenStack image upload and node launching
+code into a simple Python script that can be used in diskimage-builder
+test jobs in place of Nodepool.
+
+Work Items
+----------
+
+* In existing Nodepool convert the following drivers to statemachine:
+ gce, kubernetes, openshift, openshift, openstack (openstack is the
+ only one likely to require substantial effort, the others should be
+ trivial)
+* Replace Nodepool with an image upload script in diskimage-builder
+ test jobs
+* Add roles to zuul-jobs to build images using diskimage-builder
+* Implement node-related config items in Zuul config and Layout
+* Create zuul-launcher executable/component
+* Add image-name item data
+* Add image-build-name attribute to jobs
+ * Including job matcher based on item image-name
+ * Include image format information based on global config
+* Add zuul driver pipeline trigger/reporter
+* Add image lifecycle manager to zuul-launcher
+ * Emit image-build events
+ * Emit image-validate events
+ * Emit image-delete events
+* Add Nodepool driver code to Zuul
+* Update zuul-launcher to perform image uploads and deletion
+* Implement node launch global request handler
+* Implement node launch provider handlers
+* Update Zuul nodepool interface to handle both Nodepool and
+ zuul-launcher node request queues
+* Add tenant feature flag to switch between them
+* Release a minor version of Zuul with support for both
+* Remove Nodepool support from Zuul
+* Release a major version of Zuul with only zuul-launcher support
+* Retire Nodepool
diff --git a/doc/source/developer/specs/tracing.rst b/doc/source/developer/specs/tracing.rst
new file mode 100644
index 000000000..5e0e9e4d1
--- /dev/null
+++ b/doc/source/developer/specs/tracing.rst
@@ -0,0 +1,323 @@
+Tracing
+=======
+
+.. warning:: This is not authoritative documentation. These features
+ are not currently available in Zuul. They may change significantly
+ before final implementation, or may never be fully completed.
+
+It can be difficult for a user to understand what steps were involved
+between a trigger event (such as a patchset upload or recheck comment)
+and a buildset report. If it took an unusually long time it can be
+difficult to determine why. At present, an operator would need to
+examine logs to determine what steps were involved and the sources of
+any potential delays. Even experienced operators and developers can
+take quite some time to first collect and then analyze logs to answer
+these questions.
+
+Sometimes these answers may point to routine system operation (such as
+a delay caused by many gate resets, or preparing a large number of
+repositories). Other times they may point to deficiencies in the
+system (insufficient mergers) or bugs in the code.
+
+Being able to visualize the activities of a Zuul system can help
+operators (and potentially users) triage and diagnose issues more
+quickly and accurately. Even if examining logs is ultimately required
+in order to fully diagnose an issue, being able to narrow down the
+scope using analsys tools can greatly simplify the process.
+
+Proposed Solution
+-----------------
+
+Implementing distributed tracing in Zuul can help improve the
+observability of the system and aid operators and potentially users in
+understanding the sequence of events.
+
+By exporting information about the processing Zuul performs using the
+OpenTelemetry API, information about Zuul operations can be collected
+in any of several tools for analysis.
+
+OpenTelemetry is an Open Source protocol for exchanging observability
+data, an SDK implementing that protocol, as well as an implementation
+of a collector for distributing information to multiple backends.
+
+It supports three kinds of observability data: `traces`, `metrics`,
+and `logs`. Since Zuul already has support for metrics and logs, this
+specification proposes that we use only the support in OpenTelemtry
+for `traces`.
+
+Usage Scenarios
+~~~~~~~~~~~~~~~
+
+Usage of OpenTelemetry should be entirely optional and supplementary
+for any Zuul deployment. Log messages alone should continue to be
+sufficient to analyze any potential problem.
+
+Should a deployer wish to use OpenTelemetry tracing data, a very
+simple deployment for smaller sites may be constructed by running only
+Jaeger. Jaeger is a service that can receive, store, and display
+tracing information. The project distributes an all-in-one container
+image which can store data in local filesystem storage.
+
+https://www.jaegertracing.io/
+
+Larger sites may wish to run multiple collectors and feed data to
+larger, distributed storage backends (such as Cassandra,
+Elasticsearch, etc).
+
+Suitability to Zuul
+~~~~~~~~~~~~~~~~~~~
+
+OpenTelemetry tracing, at a high level, is designed to record
+information about events, their timing, and their relation to other
+events. At first this seems like a natural fit for Zuul, which reacts
+to events, processes events, and generates more events. However,
+OpenTelemetry's bias toward small and simple web applications is
+evident throughout its documentation and the SDK implementation.
+
+ Traces give us the big picture of what happens when a request is
+ made by user or an application.
+
+Zuul is not driven by user or application requests, and a system
+designed to record several millisecond-long events which make up the
+internal response to a user request of a web app is not necessarily
+the obvious right choice for recording sequences and combinations of
+events which frequently take hours (and sometimes days) to play out
+across multiple systems.
+
+Fortunately, the concepts and protocol implementation of OpenTelemtry
+are sufficiently well-designed for the general case to be able to
+accomodate a system like Zuul, even if the SDK makes incompatible
+assumptions that make integration difficult. There are some
+challenges to implementation, but because the concepts appear to be
+well matched, we should proceed with using the OpenTelemetry protocol
+and SDK.
+
+Spans
+~~~~~
+
+The key tracing concepts in OpenTelemety are `traces` and `spans`.
+From a data model perspective, the unit of data storage is a `span`.
+A trace itself is really just a unique ID that is common to multiple
+spans.
+
+Spans can relate to other spans as either children or links. A trace
+is generally considered to have a single 'root' span, and within the
+time period represented by that span, it may have any number of child
+spans (which may further have their own child spans).
+
+OpenTelemetry anticipates that a span on one system may spawn a child
+span on another system and includes facilities for transferring enough
+information about the parent span to a child system that the child
+system alone can emit traces for its span and any children that it
+spawns in turn.
+
+For a concrete example in Zuul, we might have a Zuul scheduler start a
+span for a buildset, and then a merger might emit a child span for
+performing the initial merge, and an executor might emit a child span
+for executing a build.
+
+Spans can relate to other spans (including spans in other traces), so
+sequences of events can be chained together without necessitating that
+they all be part of the same span or trace.
+
+Because Zuul processes series of events which may stretch for long
+periods of time, we should specify what events and actions should
+correspond to spans and traces. Spans can have arbitrary metadat
+associated with them, so we will be able to search by event or job
+ids.
+
+The following sections describe traces and their child spans.
+
+Event Ingestion
++++++++++++++++
+
+A trace will begin when Zuul receives an event and end when that event
+has been enqueued into scheduler queues (or discarded). A driver
+completing processing of an event is a definitive point in time so it
+is easy to know when to close the root span for that event's trace
+(whereas if we kept the trace open to include scheduler processing, we
+would need to know when the last trigger event spawned by the
+connection event was complete).
+
+This may include processing in internal queues by a given driver, and
+these processing steps/queues should appear as their own child spans.
+The spans should include event IDs (and potentially other information
+about the event such as change or pull request numbers) as metadata.
+
+Tenant Event Processing
++++++++++++++++++++++++
+
+A trace will begin when a scheduler begins processing a tenant event
+and ends when it has forwarded the event to all pipelines within a
+tenant. It will link to the event ingestion trace as a follow-on
+span.
+
+Queue Item
+++++++++++
+
+A trace will begin when an item is enqueued and end when it is
+dequeued. This will be quite a long trace (hours or days). It is
+expected to be the primary benefit of this telemetry effort as it will
+show the entire lifetime of a queue item. It will link to the tenant
+event processing trace as a follow-on span.
+
+Within the root span, there will be a span for each buildset (so that
+if a gate reset happens and a new buildset is created, users will see
+a series of buildset spans). Within a buildset, there will be spans
+for all of the major processing steps, such as merge operations,
+layout calculating, freezing the job graph, and freezing jobs. Each
+build will also merit a span (retried builds will get their own spans
+as well), and within a job span, there will be child spans for git
+repo prep, job setup, individual playbooks, and cleanup.
+
+SDK Challenges
+~~~~~~~~~~~~~~
+
+As a high-level concept, the idea of spans for each of these
+operations makes sense. In practice, the SDK makes implementation
+challenging.
+
+The OpenTelemtry SDK makes no provision for beginning a span on one
+system and ending it on another, so the fact that one Zuul scheduler
+might start a buildset span while another ends it is problematic.
+
+Fortunately, the OpenTelemetry API only reports spans when they end,
+not when they start. This means that we don't need to coordinate a
+"start" API call on one scheduler with an "end" API call on another.
+We can simply emit the trace with its root span at the end. However,
+any child spans emitted during that time need to know the trace ID
+they should use, which means that we at least need to store a trace ID
+and start timestamp on our starting scheduler for use by any child
+spans as well as the "end span" API call.
+
+The SDK does not support creating a span with a specific trace ID or
+start timestamp (most timestamps are automatic), but it has
+well-defined interfaces for spans and we can subclass the
+implementation to allow us to specify trace IDs and timestamps. With
+this approach, we can "virtually" start a span on one host, store its
+information in ZooKeeper with whatever long-lived object it is
+associated with (such as a QueueItem) and then make it concrete on
+another host when we end it.
+
+Alternatives
+++++++++++++
+
+This section describes some alternative ideas for dealing with the
+SDK's mismatch with Zuul concepts as well as why they weren't
+selected.
+
+* Multiple root spans with the same trace ID
+
+ Jaeger handles this relatively well, and the timeline view appears
+ as expected (multiple events with whitespace between them). The
+ graph view in Jaeger may have some trouble displaying this.
+
+ It is not clear that OpenTelemetry anticipates having multiple
+ "root" spans, so it may be best to avoid this in order to avoid
+ potential problems with other tools.
+
+* Child spans without a parent
+
+ If we emit spans that specify a parent which does not exist, Jaeger
+ will display these traces but show a warning that the parent is
+ invalid. This may occur naturally while the system is operating
+ (builds complete while a buildset is running), but should be
+ eventually corrected once an item is dequeued. In case of a serious
+ error, we may never close a parent span, which would cause this to
+ persist. We should accept that this may happen, but try to avoid it
+ happening intentionally.
+
+Links
+~~~~~
+
+Links between spans are fairly primitive in Jaeger. While the
+OpenTelemetry API includes attributes for links (so that when we link
+a queue item to an event, we could specify that it was a forwarded
+event), Jaeger does not store or render them. Instead, we are only
+left with a reference to a ``< span in another trace >`` with a
+reference type of ``FOLLOWS_FROM``. Clicking on that link will
+immediately navigate to the other trace where metadata about the trace
+will be visible, but before clicking on it, users will have little
+idea of what awaits on the other side.
+
+For this reason, we should use span links sparingly so that when they
+are encountered, users are likely to intuit what they are for and are
+not overwhelmed by multiple indistinguishable links.
+
+Events and Exceptions
+~~~~~~~~~~~~~~~~~~~~~
+
+OpenTelemetry allows events to be added to spans. Events have their
+own timestamp and attributes. These can be used to add additional
+context to spans (representing single points in time rather than
+events with duration that should be child spans). Examples might
+include receiving a request to cancel a job or dequeue an item.
+
+Events should not be used as an alternative to logs, nor should all
+log messages be copied as events. Events should be used sparingly to
+avoid overwhelming the tracing storage with data and the user with
+information.
+
+Exceptions may also be included in spans. This happens automatically
+and by default when using the context managers supplied by the SDK.
+Because many spans in Zuul will be unable to use the SDK context
+managers and any exception information would need to be explicitly
+handled and stored in ZooKeeper, we will disable inclusion of
+exception information in spans. This will provide a more consistent
+experience (so that users don't see the absence of an exception in
+tracing information to indicate the absence of an error in logs) and
+reduce the cost of supporting traces (extra storage in ZooKeeper and
+in the telemetry storage).
+
+If we decide that exception information is worth including in the
+future, this decision will be easy to revisit and reverse.
+
+Sensitive Information
+~~~~~~~~~~~~~~~~~~~~~
+
+No sensitive information (secrets, passwords, job variables, etc)
+should be included in tracing output. All output should be suitable
+for an audience of Zuul users (that is, if someone has access to the
+Zuul dashboard, then tracing data should not have any more sensitive
+information than they already have access to). For public-facing Zuul
+systems (such as OpenDev), the information should be suitable for
+public use.
+
+Protobuf and gRPC
+~~~~~~~~~~~~~~~~~
+
+The most efficient and straightforward method of transmitting data
+from Zuul to a collector (including Jaeger) is using OTLP with gRPC
+(OpenTelemetry Protocol + gRPC Remote Procedure Calls). Because
+Protobuf applications include automatically generated code, we may
+encounter the occasional version inconsistency. We may need to
+navigate package requirements more than normal due to this (especially
+if we have multiple packages that depend on protobuf).
+
+For a contemporary example, the OpenTelemetry project is in the
+process of pinning to an older version of protobuf:
+
+https://github.com/open-telemetry/opentelemetry-python/issues/2717
+
+There is an HTTP+JSON exporter as well, so in the case that something
+goes very wrong with protobuf+gRPC, that may be available as a fallback.
+
+Work Items
+----------
+
+* Add OpenTelemetry SDK and support for configuring an exporter to
+ zuul.conf
+* Implement SDK subclasses to support opening and closing spans on
+ different hosts
+* Instrument event processing in each driver
+* Instrument event processing in scheduler
+* Instrument queue items and related spans
+* Document a simple Jaeger setup as a quickstart add-on (similar to
+ authz)
+* Optional: work with OpenDev to run a public Jaeger server for
+ OpenDev
+
+The last item is not required for this specification (and not our
+choice as Zuul developers to make) but it would be nice if there were
+one available so that all Zuul users and developers have a reference
+implementation available for community collaboration.
diff --git a/doc/source/developer/zookeeper.rst b/doc/source/developer/zookeeper.rst
index bcdb395f0..ee77f815f 100644
--- a/doc/source/developer/zookeeper.rst
+++ b/doc/source/developer/zookeeper.rst
@@ -149,6 +149,18 @@ This is a reference for object layout in Zookeeper.
These are sharded JSON blobs of the change data.
+.. path:: zuul/cache/blob/data
+
+ Data for the blob store. These nodes are identified by a
+ sha256sum of the secret content.
+
+ These are sharded blobs of data.
+
+.. path:: zuul/cache/blob/lock
+
+ Side-channel lock directory for the blob store. The store locks
+ by key id under this znode when writing.
+
.. path:: zuul/cleanup
This node holds locks for the cleanup routines to make sure that
@@ -300,6 +312,11 @@ This is a reference for object layout in Zookeeper.
needed for a component to determine if its in-memory layout is out
of date and update it if so.
+.. path:: zuul/layout-data/<layout uuid>
+
+ Additional information about the layout. This is sharded data for
+ each layout UUID.
+
.. path:: zuul/locks
Holds various types of locks so that multiple components can coordinate.
@@ -397,6 +414,13 @@ This is a reference for object layout in Zookeeper.
An election to decide which scheduler will report system-wide stats
(such as total node requests).
+.. path:: zuul/global-semaphores/<semaphore>
+ :type: SemaphoreHandler
+
+ Represents a global semaphore (shared by multiple tenants).
+ Information about which builds hold the semaphore is stored in the
+ znode data.
+
.. path:: zuul/semaphores/<tenant>/<semaphore>
:type: SemaphoreHandler
diff --git a/doc/source/drivers/gerrit.rst b/doc/source/drivers/gerrit.rst
index 48908b74b..7d052f946 100644
--- a/doc/source/drivers/gerrit.rst
+++ b/doc/source/drivers/gerrit.rst
@@ -25,6 +25,13 @@ want Zuul to report on. For instance, you may want to grant
or values may be added to Gerrit. Zuul is very flexible and can take
advantage of those.
+If ``change.submitWholeTopic`` is configured in Gerrit, Zuul will
+honor this by enqueing changes with the same topic as circular
+dependencies. However, it is still necessary to enable circular
+dependency support in any pipeline queues where such changes may
+appear. See :attr:`queue.allow-circular-dependencies` for information
+on how to configure this.
+
Connection Configuration
------------------------
@@ -44,6 +51,12 @@ The supported options in ``zuul.conf`` connections are:
Fully qualified domain name of Gerrit server.
+ .. attr:: ssh_server
+
+ If SSH access to the Gerrit server should be via a different
+ hostname than web access, set this value to the hostname to use
+ for SSH connections.
+
.. attr:: canonical_hostname
The canonical hostname associated with the git repos on the
@@ -343,6 +356,11 @@ order to be enqueued into the pipeline.
A boolean value (``true`` or ``false``) that indicates whether the
change must be the current patchset in order to be enqueued.
+ .. attr:: wip
+
+ A boolean value (``true`` or ``false``) that indicates whether the
+ change must be wip or not wip in order to be enqueued.
+
.. attr:: status
A string value that corresponds with the status of the change
diff --git a/doc/source/drivers/github.rst b/doc/source/drivers/github.rst
index 42a56bf2a..9ca7a1f38 100644
--- a/doc/source/drivers/github.rst
+++ b/doc/source/drivers/github.rst
@@ -182,6 +182,37 @@ The supported options in ``zuul.conf`` connections are:
Enable or disable GitHub rate limit logging. If rate limiting is disabled
in GitHub Enterprise this can save some network round trip times.
+ .. attr:: repo_cache
+
+ To configure Zuul to use a GitHub Enterprise `repository cache
+ <https://docs.github.com/en/enterprise-server@3.3/admin/enterprise-management/caching-repositories/about-repository-caching>`_
+ set this value to the hostname of the cache (e.g.,
+ ``europe-ci.github.example.com``). Zuul will fetch commits as
+ well as determine the global repo state of repositories used in
+ jobs from this host.
+
+ This setting is incompatible with :attr:`<github
+ connection>.sshkey`.
+
+ Because the repository cache may be several minutes behind the
+ canonical site, enabling this setting automatically sets the
+ default :attr:`<github connection>.repo_retry_timeout` to 600
+ seconds. That setting may still be overidden to specify a
+ different value.
+
+ .. attr:: repo_retry_timeout
+
+ This setting is only used if :attr:`<github
+ connection>.repo_cache` is set. It specifies the amount of time
+ in seconds that Zuul mergers and executors should spend
+ attempting to fetch git commits which are not available from the
+ GitHub repository cache host.
+
+ When :attr:`<github connection>.repo_cache` is set, this value
+ defaults to 600 seconds, but it can be overridden. Zuul retries
+ git fetches every 30 seconds, and this value will be rounded up
+ to the next highest multiple of 30 seconds.
+
Trigger Configuration
---------------------
GitHub webhook events can be configured as triggers.
diff --git a/doc/source/drivers/mqtt.rst b/doc/source/drivers/mqtt.rst
index 10cd4c8a2..81969ae8b 100644
--- a/doc/source/drivers/mqtt.rst
+++ b/doc/source/drivers/mqtt.rst
@@ -316,3 +316,9 @@ reporter. Each pipeline must provide a topic name. For example:
The quality of service level to use, it can be 0, 1 or 2. Read more in this
`guide <https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels>`_
+
+ .. attr:: include-returned-data
+ :default: false
+
+ If set to ``true``, Zuul will include any data returned from the
+ job via :ref:`return_values`.
diff --git a/doc/source/drivers/timer.rst b/doc/source/drivers/timer.rst
index ff50b10ba..57de1573d 100644
--- a/doc/source/drivers/timer.rst
+++ b/doc/source/drivers/timer.rst
@@ -14,9 +14,12 @@ Timers don't require a special connection or driver. Instead they can
simply be used by listing ``timer`` as the trigger.
This trigger will run based on a cron-style time specification. It
-will enqueue an event into its pipeline for every project defined in
-the configuration. Any job associated with the pipeline will run in
-response to that event.
+will enqueue an event into its pipeline for every project and branch
+defined in the configuration. Any job associated with the pipeline
+will run in response to that event.
+
+Zuul implements the timer using `apscheduler`_, Please check the
+`apscheduler documentation`_ for more information about the syntax.
.. attr:: pipeline.trigger.timer
@@ -27,9 +30,17 @@ response to that event.
The time specification in cron syntax. Only the 5 part syntax
is supported, not the symbolic names. Example: ``0 0 * * *``
- runs at midnight. The first weekday is Monday.
- An optional 6th part specifies seconds. The optional 7th part
- specifies a jitter in seconds. This advances or delays the
- trigger randomly, limited by the specified value.
- Example ``0 0 * * * * 60`` runs at midnight with a +/- 60
- seconds jitter.
+ runs at midnight.
+ An optional 6th part specifies seconds. The optional 7th part specifies
+ a jitter in seconds. This delays the trigger randomly, limited by
+ the specified value. Example ``0 0 * * * * 60`` runs at
+ midnight or randomly up to 60 seconds later. The jitter is
+ applied individually to each project-branch combination.
+
+ .. warning::
+ Be aware the day-of-week value differs from from cron.
+ The first weekday is Monday (0), and the last is Sunday (6).
+
+
+.. _apscheduler: https://apscheduler.readthedocs.io/
+.. _apscheduler documentation: https://apscheduler.readthedocs.io/en/3.x/modules/triggers/cron.html#module-apscheduler.triggers.cron
diff --git a/doc/source/examples/docker-compose.yaml b/doc/source/examples/docker-compose.yaml
index ee0093b3c..af5c970de 100644
--- a/doc/source/examples/docker-compose.yaml
+++ b/doc/source/examples/docker-compose.yaml
@@ -26,7 +26,7 @@ services:
- "../../../tools/:/var/zuul-tools/:z"
# NOTE(pabelanger): Be sure to update this line each time we change the
# default version of ansible for Zuul.
- command: "/usr/local/lib/zuul/ansible/2.9/bin/ansible-playbook /var/playbooks/setup.yaml"
+ command: "/usr/local/lib/zuul/ansible/5/bin/ansible-playbook /var/playbooks/setup.yaml"
networks:
- zuul
zk:
diff --git a/doc/source/examples/keycloak/docker-compose.yaml b/doc/source/examples/keycloak/docker-compose.yaml
index 917c50231..9e70fec5f 100644
--- a/doc/source/examples/keycloak/docker-compose.yaml
+++ b/doc/source/examples/keycloak/docker-compose.yaml
@@ -7,21 +7,19 @@ version: '2.1'
services:
keycloak:
- image: docker.io/jboss/keycloak
+ image: quay.io/keycloak/keycloak:18.0
environment:
- - KEYCLOAK_USER=admin
- - KEYCLOAK_PASSWORD=kcadmin
+ - KEYCLOAK_ADMIN=admin
+ - KEYCLOAK_ADMIN_PASSWORD=kcadmin
- DB_VENDOR=h2
- - KEYCLOAK_IMPORT=/var/keycloak_import/zuul-demo-data.json
- - JAVA_OPTS_APPEND="-Djboss.socket.binding.port-offset=2"
+ - KC_HTTP_PORT=8082
ports:
- "8082:8082"
volumes:
- - "./keycloak/:/var/keycloak_import/:z"
- entrypoint: |
- /bin/sh -c '\
- /opt/jboss/tools/docker-entrypoint.sh -b 0.0.0.0'
- command: []
+ - "./keycloak/:/opt/keycloak/data/import/:z"
+ command:
+ - start-dev
+ - --import-realm
networks:
- zuul
diff --git a/doc/source/examples/keycloak/etc_zuul/zuul.conf b/doc/source/examples/keycloak/etc_zuul/zuul.conf
index 35cabe807..f2401cc90 100644
--- a/doc/source/examples/keycloak/etc_zuul/zuul.conf
+++ b/doc/source/examples/keycloak/etc_zuul/zuul.conf
@@ -14,7 +14,7 @@ tenant_config=/etc/zuul/main.yaml
default=true
driver=OpenIDConnect
realm=zuul-demo
-issuer_id=http://keycloak:8082/auth/realms/zuul-demo
+issuer_id=http://keycloak:8082/realms/zuul-demo
client_id=zuul
[connection "gerrit"]
diff --git a/doc/source/examples/keycloak/keycloak/zuul-demo-data.json b/doc/source/examples/keycloak/keycloak/zuul-demo-data.json
index 448267eed..194814e1b 100644
--- a/doc/source/examples/keycloak/keycloak/zuul-demo-data.json
+++ b/doc/source/examples/keycloak/keycloak/zuul-demo-data.json
@@ -1,2224 +1,1927 @@
{
- "id": "zuul-demo",
- "realm": "zuul-demo",
- "notBefore": 0,
- "revokeRefreshToken": false,
- "refreshTokenMaxReuse": 0,
- "accessTokenLifespan": 300,
- "accessTokenLifespanForImplicitFlow": 900,
- "ssoSessionIdleTimeout": 1800,
- "ssoSessionMaxLifespan": 36000,
- "ssoSessionIdleTimeoutRememberMe": 0,
- "ssoSessionMaxLifespanRememberMe": 0,
- "offlineSessionIdleTimeout": 2592000,
- "offlineSessionMaxLifespanEnabled": false,
- "offlineSessionMaxLifespan": 5184000,
- "clientSessionIdleTimeout": 0,
- "clientSessionMaxLifespan": 0,
- "clientOfflineSessionIdleTimeout": 0,
- "clientOfflineSessionMaxLifespan": 0,
- "accessCodeLifespan": 60,
- "accessCodeLifespanUserAction": 300,
- "accessCodeLifespanLogin": 1800,
- "actionTokenGeneratedByAdminLifespan": 43200,
- "actionTokenGeneratedByUserLifespan": 300,
- "enabled": true,
- "sslRequired": "external",
- "registrationAllowed": true,
- "registrationEmailAsUsername": false,
- "rememberMe": false,
- "verifyEmail": false,
- "loginWithEmailAllowed": true,
- "duplicateEmailsAllowed": false,
- "resetPasswordAllowed": false,
- "editUsernameAllowed": false,
- "bruteForceProtected": false,
- "permanentLockout": false,
- "maxFailureWaitSeconds": 900,
- "minimumQuickLoginWaitSeconds": 60,
- "waitIncrementSeconds": 60,
- "quickLoginCheckMilliSeconds": 1000,
- "maxDeltaTimeSeconds": 43200,
- "failureFactor": 30,
- "roles": {
- "realm": [
- {
- "id": "b295f2e1-c823-4f30-84b4-c534676c3ded",
- "name": "uma_authorization",
- "composite": false,
- "clientRole": false,
- "containerId": "zuul-demo",
- "attributes": {}
- },
- {
- "id": "047a5001-b3fe-452a-8fd3-985d82f7df31",
- "name": "offline_access",
- "description": "${role_offline-access}",
- "composite": false,
- "clientRole": false,
- "containerId": "zuul-demo",
- "attributes": {}
- }
- ],
- "client": {
- "realm-management": [
- {
- "id": "7e18128e-7a99-4403-8107-5a90ac0b952c",
- "name": "view-identity-providers",
- "description": "${role_view-identity-providers}",
- "composite": false,
- "clientRole": true,
- "containerId": "63ae0908-5213-436d-b3d6-5a611eb24216",
- "attributes": {}
- },
- {
- "id": "95f5f229-415e-48ba-8bfc-ff0a750f119e",
- "name": "view-users",
- "description": "${role_view-users}",
- "composite": true,
- "composites": {
- "client": {
- "realm-management": [
- "query-groups",
- "query-users"
- ]
- }
- },
- "clientRole": true,
- "containerId": "63ae0908-5213-436d-b3d6-5a611eb24216",
- "attributes": {}
- },
- {
- "id": "7cffdbb0-ced3-4fb0-98de-6b1d8506dbe4",
- "name": "manage-identity-providers",
- "description": "${role_manage-identity-providers}",
- "composite": false,
- "clientRole": true,
- "containerId": "63ae0908-5213-436d-b3d6-5a611eb24216",
- "attributes": {}
- },
- {
- "id": "08729d50-a31e-42fd-ad81-120cdee3b1b9",
- "name": "query-clients",
- "description": "${role_query-clients}",
- "composite": false,
- "clientRole": true,
- "containerId": "63ae0908-5213-436d-b3d6-5a611eb24216",
- "attributes": {}
- },
- {
- "id": "69ffc663-32cb-4f4e-a9af-669bd23b4edc",
- "name": "query-groups",
- "description": "${role_query-groups}",
- "composite": false,
- "clientRole": true,
- "containerId": "63ae0908-5213-436d-b3d6-5a611eb24216",
- "attributes": {}
- },
- {
- "id": "2a9f4d72-35bb-4072-b8aa-3fe7f1ab7f26",
- "name": "view-clients",
- "description": "${role_view-clients}",
- "composite": true,
- "composites": {
- "client": {
- "realm-management": [
- "query-clients"
- ]
- }
- },
- "clientRole": true,
- "containerId": "63ae0908-5213-436d-b3d6-5a611eb24216",
- "attributes": {}
- },
- {
- "id": "16c74fae-7feb-446d-9d42-08b31583ddf5",
- "name": "manage-events",
- "description": "${role_manage-events}",
- "composite": false,
- "clientRole": true,
- "containerId": "63ae0908-5213-436d-b3d6-5a611eb24216",
- "attributes": {}
- },
- {
- "id": "30cc0071-f914-446a-9aa3-a3372d9f45c0",
- "name": "manage-authorization",
- "description": "${role_manage-authorization}",
- "composite": false,
- "clientRole": true,
- "containerId": "63ae0908-5213-436d-b3d6-5a611eb24216",
- "attributes": {}
- },
- {
- "id": "d3d32a6d-f1da-410f-8c52-62d1b2ac7abc",
- "name": "query-realms",
- "description": "${role_query-realms}",
- "composite": false,
- "clientRole": true,
- "containerId": "63ae0908-5213-436d-b3d6-5a611eb24216",
- "attributes": {}
- },
- {
- "id": "1f7afd46-36a8-46e8-abc1-8949836ec532",
- "name": "view-authorization",
- "description": "${role_view-authorization}",
- "composite": false,
- "clientRole": true,
- "containerId": "63ae0908-5213-436d-b3d6-5a611eb24216",
- "attributes": {}
- },
- {
- "id": "6384baeb-1ec0-4e69-a5c2-7b632c3bfda5",
- "name": "impersonation",
- "description": "${role_impersonation}",
- "composite": false,
- "clientRole": true,
- "containerId": "63ae0908-5213-436d-b3d6-5a611eb24216",
- "attributes": {}
- },
- {
- "id": "eefc7ff0-e2f2-4381-b034-c96d0bae3769",
- "name": "realm-admin",
- "description": "${role_realm-admin}",
- "composite": true,
- "composites": {
- "client": {
- "realm-management": [
- "view-identity-providers",
- "view-users",
- "manage-identity-providers",
- "query-clients",
- "query-groups",
- "view-clients",
- "manage-events",
- "view-authorization",
- "manage-authorization",
- "query-realms",
- "impersonation",
- "create-client",
- "manage-clients",
- "manage-users",
- "manage-realm",
- "view-events",
- "view-realm",
- "query-users"
- ]
- }
- },
- "clientRole": true,
- "containerId": "63ae0908-5213-436d-b3d6-5a611eb24216",
- "attributes": {}
- },
- {
- "id": "1c104476-dc65-4df5-9f0e-3f9086a75813",
- "name": "create-client",
- "description": "${role_create-client}",
- "composite": false,
- "clientRole": true,
- "containerId": "63ae0908-5213-436d-b3d6-5a611eb24216",
- "attributes": {}
- },
- {
- "id": "f0893b2a-770e-4b21-a430-1a9974ecc01a",
- "name": "manage-clients",
- "description": "${role_manage-clients}",
- "composite": false,
- "clientRole": true,
- "containerId": "63ae0908-5213-436d-b3d6-5a611eb24216",
- "attributes": {}
- },
- {
- "id": "dfddee2e-682a-47ea-924c-59699f338e0c",
- "name": "manage-users",
- "description": "${role_manage-users}",
- "composite": false,
- "clientRole": true,
- "containerId": "63ae0908-5213-436d-b3d6-5a611eb24216",
- "attributes": {}
- },
- {
- "id": "a8198df9-d3cd-460f-a48f-ccede56e08a9",
- "name": "manage-realm",
- "description": "${role_manage-realm}",
- "composite": false,
- "clientRole": true,
- "containerId": "63ae0908-5213-436d-b3d6-5a611eb24216",
- "attributes": {}
- },
- {
- "id": "657b4b26-98c5-4963-a353-db26453f5dd2",
- "name": "view-events",
- "description": "${role_view-events}",
- "composite": false,
- "clientRole": true,
- "containerId": "63ae0908-5213-436d-b3d6-5a611eb24216",
- "attributes": {}
- },
- {
- "id": "693093ae-6004-48be-bb22-8804f61af1c0",
- "name": "view-realm",
- "description": "${role_view-realm}",
- "composite": false,
- "clientRole": true,
- "containerId": "63ae0908-5213-436d-b3d6-5a611eb24216",
- "attributes": {}
- },
- {
- "id": "418abb16-fdc3-402e-8125-52800990445b",
- "name": "query-users",
- "description": "${role_query-users}",
- "composite": false,
- "clientRole": true,
- "containerId": "63ae0908-5213-436d-b3d6-5a611eb24216",
- "attributes": {}
- }
- ],
- "security-admin-console": [],
- "admin-cli": [],
- "account-console": [],
- "zuul": [],
- "broker": [],
- "account": [
- {
- "id": "b839cd34-f23d-4c14-8060-ed635e708b87",
- "name": "view-consent",
- "description": "${role_view-consent}",
- "composite": false,
- "clientRole": true,
- "containerId": "6fd2abe1-4aeb-4834-8a9e-e3f499d64a03",
- "attributes": {}
- },
- {
- "id": "a98bcb3b-1584-45ab-afa8-e431ddfed5e7",
- "name": "view-applications",
- "description": "${role_view-applications}",
- "composite": false,
- "clientRole": true,
- "containerId": "6fd2abe1-4aeb-4834-8a9e-e3f499d64a03",
- "attributes": {}
- },
- {
- "id": "471d721c-872c-4004-bb76-e6399f5e1fd0",
- "name": "delete-account",
- "description": "${role_delete-account}",
- "composite": false,
- "clientRole": true,
- "containerId": "6fd2abe1-4aeb-4834-8a9e-e3f499d64a03",
- "attributes": {}
- },
- {
- "id": "e5a0f953-bdcb-4136-bfbf-0c311797e57f",
- "name": "manage-account",
- "composite": false,
- "clientRole": true,
- "containerId": "6fd2abe1-4aeb-4834-8a9e-e3f499d64a03",
- "attributes": {}
- },
- {
- "id": "c8726cd0-6447-4131-9731-717897ff167a",
- "name": "manage-consent",
- "description": "${role_manage-consent}",
- "composite": true,
- "composites": {
- "client": {
- "account": [
- "view-consent"
- ]
- }
- },
- "clientRole": true,
- "containerId": "6fd2abe1-4aeb-4834-8a9e-e3f499d64a03",
- "attributes": {}
- },
- {
- "id": "eb6c2340-cecf-4095-bdc7-d14f38a9aee6",
- "name": "view-profile",
- "composite": false,
- "clientRole": true,
- "containerId": "6fd2abe1-4aeb-4834-8a9e-e3f499d64a03",
- "attributes": {}
- }
- ],
- }
- },
- "groups": [
- {
- "id": "d372cb0e-f3c8-40be-8527-73775d1f7e47",
- "name": "example-tenant-admin",
- "path": "/example-tenant-admin",
- "attributes": {},
- "realmRoles": [],
- "clientRoles": {},
- "subGroups": []
- }
- ],
- "defaultRoles": [
- "uma_authorization",
- "offline_access"
- ],
- "requiredCredentials": [
- "password"
- ],
- "otpPolicyType": "totp",
- "otpPolicyAlgorithm": "HmacSHA1",
- "otpPolicyInitialCounter": 0,
- "otpPolicyDigits": 6,
- "otpPolicyLookAheadWindow": 1,
- "otpPolicyPeriod": 30,
- "otpSupportedApplications": [
- "FreeOTP",
- "Google Authenticator"
- ],
- "webAuthnPolicyRpEntityName": "keycloak",
- "webAuthnPolicySignatureAlgorithms": [
- "ES256"
- ],
- "webAuthnPolicyRpId": "",
- "webAuthnPolicyAttestationConveyancePreference": "not specified",
- "webAuthnPolicyAuthenticatorAttachment": "not specified",
- "webAuthnPolicyRequireResidentKey": "not specified",
- "webAuthnPolicyUserVerificationRequirement": "not specified",
- "webAuthnPolicyCreateTimeout": 0,
- "webAuthnPolicyAvoidSameAuthenticatorRegister": false,
- "webAuthnPolicyAcceptableAaguids": [],
- "webAuthnPolicyPasswordlessRpEntityName": "keycloak",
- "webAuthnPolicyPasswordlessSignatureAlgorithms": [
- "ES256"
- ],
- "webAuthnPolicyPasswordlessRpId": "",
- "webAuthnPolicyPasswordlessAttestationConveyancePreference": "not specified",
- "webAuthnPolicyPasswordlessAuthenticatorAttachment": "not specified",
- "webAuthnPolicyPasswordlessRequireResidentKey": "not specified",
- "webAuthnPolicyPasswordlessUserVerificationRequirement": "not specified",
- "webAuthnPolicyPasswordlessCreateTimeout": 0,
- "webAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister": false,
- "webAuthnPolicyPasswordlessAcceptableAaguids": [],
- "users": [
- {
- "id": "3defcf9c-a89d-496e-9769-526bc65b6db6",
- "createdTimestamp": 1609929909934,
- "username": "admin",
- "enabled": true,
- "totp": false,
- "emailVerified": false,
- "firstName": "Zuul",
- "lastName": "Administrator",
- "email": "admin@example.com",
- "credentials": [
- {
- "id": "1a05a791-be4d-4060-ae6b-e117c6c8de70",
- "type": "password",
- "createdDate": 1609929922393,
- "secretData": "{\"value\":\"BtE429Fzy8ygtLLD+eEHHY5DzJr3pzDf5wBwR8ZD4HFRPPn6NldxGTy+0AEJBGAQt+dZ0eEqVV8edytNR8PwMw==\",\"salt\":\"jL8euyHG4ZQy2BUMY/LpIg==\",\"additionalParameters\":{}}",
- "credentialData": "{\"hashIterations\":27500,\"algorithm\":\"pbkdf2-sha256\",\"additionalParameters\":{}}"
+ "id" : "zuul-demo",
+ "realm" : "zuul-demo",
+ "notBefore" : 0,
+ "defaultSignatureAlgorithm" : "RS256",
+ "revokeRefreshToken" : false,
+ "refreshTokenMaxReuse" : 0,
+ "accessTokenLifespan" : 300,
+ "accessTokenLifespanForImplicitFlow" : 900,
+ "ssoSessionIdleTimeout" : 1800,
+ "ssoSessionMaxLifespan" : 36000,
+ "ssoSessionIdleTimeoutRememberMe" : 0,
+ "ssoSessionMaxLifespanRememberMe" : 0,
+ "offlineSessionIdleTimeout" : 2592000,
+ "offlineSessionMaxLifespanEnabled" : false,
+ "offlineSessionMaxLifespan" : 5184000,
+ "clientSessionIdleTimeout" : 0,
+ "clientSessionMaxLifespan" : 0,
+ "clientOfflineSessionIdleTimeout" : 0,
+ "clientOfflineSessionMaxLifespan" : 0,
+ "accessCodeLifespan" : 60,
+ "accessCodeLifespanUserAction" : 300,
+ "accessCodeLifespanLogin" : 1800,
+ "actionTokenGeneratedByAdminLifespan" : 43200,
+ "actionTokenGeneratedByUserLifespan" : 300,
+ "oauth2DeviceCodeLifespan" : 600,
+ "oauth2DevicePollingInterval" : 5,
+ "enabled" : true,
+ "sslRequired" : "external",
+ "registrationAllowed" : false,
+ "registrationEmailAsUsername" : false,
+ "rememberMe" : false,
+ "verifyEmail" : false,
+ "loginWithEmailAllowed" : true,
+ "duplicateEmailsAllowed" : false,
+ "resetPasswordAllowed" : false,
+ "editUsernameAllowed" : false,
+ "bruteForceProtected" : false,
+ "permanentLockout" : false,
+ "maxFailureWaitSeconds" : 900,
+ "minimumQuickLoginWaitSeconds" : 60,
+ "waitIncrementSeconds" : 60,
+ "quickLoginCheckMilliSeconds" : 1000,
+ "maxDeltaTimeSeconds" : 43200,
+ "failureFactor" : 30,
+ "roles" : {
+ "realm" : [ {
+ "id" : "56408c69-b6fb-4845-be59-db262fe21dea",
+ "name" : "offline_access",
+ "description" : "${role_offline-access}",
+ "composite" : false,
+ "clientRole" : false,
+ "containerId" : "zuul-demo",
+ "attributes" : { }
+ }, {
+ "id" : "156d7b5b-65fb-4c89-b3d8-c2f82e9ecdd4",
+ "name" : "default-roles-zuul-demo",
+ "description" : "${role_default-roles}",
+ "composite" : true,
+ "composites" : {
+ "realm" : [ "offline_access", "uma_authorization" ],
+ "client" : {
+ "account" : [ "view-profile", "manage-account" ]
}
- ],
- "disableableCredentialTypes": [],
- "requiredActions": [],
- "realmRoles": [
- "uma_authorization",
- "offline_access"
- ],
- "clientRoles": {
- "account": [
- "manage-account",
- "view-profile"
- ]
- },
- "notBefore": 0,
- "groups": []
- },
- {
- "id": "091fbeb0-ac10-47eb-a113-88fbb0a7988f",
- "createdTimestamp": 1609929807691,
- "username": "user1",
- "enabled": true,
- "totp": false,
- "emailVerified": false,
- "firstName": "User",
- "lastName": "One",
- "email": "user1@example.com",
- "credentials": [
- {
- "id": "caec7277-9620-4232-b07f-10076ae32e17",
- "type": "password",
- "createdDate": 1609929824753,
- "secretData": "{\"value\":\"XbD+O1HUVhvqMg2xP36il/haxbzS65GjV2YYwqJWGfJuztQCn2G5ArmeWcqMxEd6BEBnPjZCjM3tpaBSFluLvg==\",\"salt\":\"8dXWJvuUtbqZuBw3ZUL4zA==\",\"additionalParameters\":{}}",
- "credentialData": "{\"hashIterations\":27500,\"algorithm\":\"pbkdf2-sha256\",\"additionalParameters\":{}}"
- }
- ],
- "disableableCredentialTypes": [],
- "requiredActions": [],
- "realmRoles": [
- "uma_authorization",
- "offline_access"
- ],
- "clientRoles": {
- "account": [
- "manage-account",
- "view-profile"
- ]
- },
- "notBefore": 0,
- "groups": [
- "/example-tenant-admin"
- ]
- },
- {
- "id": "633cbfcd-43d9-4588-9c74-7af4ea007dda",
- "createdTimestamp": 1609929870956,
- "username": "user2",
- "enabled": true,
- "totp": false,
- "emailVerified": false,
- "firstName": "User",
- "lastName": "Two",
- "email": "user2@example.com",
- "credentials": [
- {
- "id": "1975173e-f07c-4223-9bf6-fa44dcd27cf0",
- "type": "password",
- "createdDate": 1609929881586,
- "secretData": "{\"value\":\"SZ0ESXObiHfCOo4m9afbnpNaZ52H0k0VVuHe2PecmUZ4FxpAXbCsUimNNsz5VVRdqhAqWJi2AcExCoKFSJzeug==\",\"salt\":\"+pc2TGNg/CjypsBPjH0YJg==\",\"additionalParameters\":{}}",
- "credentialData": "{\"hashIterations\":27500,\"algorithm\":\"pbkdf2-sha256\",\"additionalParameters\":{}}"
- }
- ],
- "disableableCredentialTypes": [],
- "requiredActions": [],
- "realmRoles": [
- "uma_authorization",
- "offline_access"
- ],
- "clientRoles": {
- "account": [
- "manage-account",
- "view-profile"
- ]
- },
- "notBefore": 0,
- "groups": []
- }
- ],
- "scopeMappings": [
- {
- "clientScope": "offline_access",
- "roles": [
- "offline_access"
- ]
- }
- ],
- "clientScopeMappings": {
- "account": [
- {
- "client": "account-console",
- "roles": [
- "manage-account"
- ]
- }
- ]
- },
- "clients": [
- {
- "id": "6fd2abe1-4aeb-4834-8a9e-e3f499d64a03",
- "clientId": "account",
- "name": "${client_account}",
- "rootUrl": "${authBaseUrl}",
- "baseUrl": "/realms/zuul-demo/account/",
- "surrogateAuthRequired": false,
- "enabled": true,
- "alwaysDisplayInConsole": false,
- "clientAuthenticatorType": "client-secret",
- "secret": "**********",
- "defaultRoles": [
- "manage-account",
- "view-profile"
- ],
- "redirectUris": [
- "/realms/zuul-demo/account/*"
- ],
- "webOrigins": [],
- "notBefore": 0,
- "bearerOnly": false,
- "consentRequired": false,
- "standardFlowEnabled": true,
- "implicitFlowEnabled": false,
- "directAccessGrantsEnabled": false,
- "serviceAccountsEnabled": false,
- "publicClient": false,
- "frontchannelLogout": false,
- "protocol": "openid-connect",
- "attributes": {},
- "authenticationFlowBindingOverrides": {},
- "fullScopeAllowed": false,
- "nodeReRegistrationTimeout": 0,
- "defaultClientScopes": [
- "web-origins",
- "role_list",
- "profile",
- "roles",
- "email"
- ],
- "optionalClientScopes": [
- "address",
- "phone",
- "offline_access",
- "microprofile-jwt"
- ]
- },
- {
- "id": "1958e9b1-c3ce-4bec-89bd-3b0050a4dacf",
- "clientId": "account-console",
- "name": "${client_account-console}",
- "rootUrl": "${authBaseUrl}",
- "baseUrl": "/realms/zuul-demo/account/",
- "surrogateAuthRequired": false,
- "enabled": true,
- "alwaysDisplayInConsole": false,
- "clientAuthenticatorType": "client-secret",
- "secret": "e555a236-3a76-4ac9-a55a-48f81a00535f",
- "redirectUris": [
- "/realms/zuul-demo/account/*"
- ],
- "webOrigins": [],
- "notBefore": 0,
- "bearerOnly": false,
- "consentRequired": false,
- "standardFlowEnabled": true,
- "implicitFlowEnabled": false,
- "directAccessGrantsEnabled": false,
- "serviceAccountsEnabled": false,
- "publicClient": true,
- "frontchannelLogout": false,
- "protocol": "openid-connect",
- "attributes": {
- "pkce.code.challenge.method": "S256"
- },
- "authenticationFlowBindingOverrides": {},
- "fullScopeAllowed": false,
- "nodeReRegistrationTimeout": 0,
- "protocolMappers": [
- {
- "id": "5a075254-4849-43dc-b036-53c606571988",
- "name": "audience resolve",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-audience-resolve-mapper",
- "consentRequired": false,
- "config": {}
- }
- ],
- "defaultClientScopes": [
- "web-origins",
- "role_list",
- "profile",
- "roles",
- "email"
- ],
- "optionalClientScopes": [
- "address",
- "phone",
- "offline_access",
- "microprofile-jwt"
- ]
- },
- {
- "id": "3e59f406-d6b9-45bd-b072-ef1650233625",
- "clientId": "admin-cli",
- "name": "${client_admin-cli}",
- "surrogateAuthRequired": false,
- "enabled": true,
- "alwaysDisplayInConsole": false,
- "clientAuthenticatorType": "client-secret",
- "secret": "**********",
- "redirectUris": [],
- "webOrigins": [],
- "notBefore": 0,
- "bearerOnly": false,
- "consentRequired": false,
- "standardFlowEnabled": false,
- "implicitFlowEnabled": false,
- "directAccessGrantsEnabled": true,
- "serviceAccountsEnabled": false,
- "publicClient": true,
- "frontchannelLogout": false,
- "protocol": "openid-connect",
- "attributes": {},
- "authenticationFlowBindingOverrides": {},
- "fullScopeAllowed": false,
- "nodeReRegistrationTimeout": 0,
- "defaultClientScopes": [
- "web-origins",
- "role_list",
- "profile",
- "roles",
- "email"
- ],
- "optionalClientScopes": [
- "address",
- "phone",
- "offline_access",
- "microprofile-jwt"
- ]
- },
- {
- "id": "b607307d-dde7-4563-9e70-a7fa9223c229",
- "clientId": "broker",
- "name": "${client_broker}",
- "surrogateAuthRequired": false,
- "enabled": true,
- "alwaysDisplayInConsole": false,
- "clientAuthenticatorType": "client-secret",
- "secret": "**********",
- "redirectUris": [],
- "webOrigins": [],
- "notBefore": 0,
- "bearerOnly": false,
- "consentRequired": false,
- "standardFlowEnabled": true,
- "implicitFlowEnabled": false,
- "directAccessGrantsEnabled": false,
- "serviceAccountsEnabled": false,
- "publicClient": false,
- "frontchannelLogout": false,
- "protocol": "openid-connect",
- "attributes": {},
- "authenticationFlowBindingOverrides": {},
- "fullScopeAllowed": false,
- "nodeReRegistrationTimeout": 0,
- "defaultClientScopes": [
- "web-origins",
- "role_list",
- "profile",
- "roles",
- "email"
- ],
- "optionalClientScopes": [
- "address",
- "phone",
- "offline_access",
- "microprofile-jwt"
- ]
- },
- {
- "id": "63ae0908-5213-436d-b3d6-5a611eb24216",
- "clientId": "realm-management",
- "name": "${client_realm-management}",
- "surrogateAuthRequired": false,
- "enabled": true,
- "alwaysDisplayInConsole": false,
- "clientAuthenticatorType": "client-secret",
- "secret": "**********",
- "redirectUris": [],
- "webOrigins": [],
- "notBefore": 0,
- "bearerOnly": true,
- "consentRequired": false,
- "standardFlowEnabled": true,
- "implicitFlowEnabled": false,
- "directAccessGrantsEnabled": false,
- "serviceAccountsEnabled": false,
- "publicClient": false,
- "frontchannelLogout": false,
- "protocol": "openid-connect",
- "attributes": {},
- "authenticationFlowBindingOverrides": {},
- "fullScopeAllowed": false,
- "nodeReRegistrationTimeout": 0,
- "defaultClientScopes": [
- "web-origins",
- "role_list",
- "profile",
- "roles",
- "email"
- ],
- "optionalClientScopes": [
- "address",
- "phone",
- "offline_access",
- "microprofile-jwt"
- ]
- },
- {
- "id": "26cb8208-4182-478b-903e-6abe9b555680",
- "clientId": "security-admin-console",
- "name": "${client_security-admin-console}",
- "rootUrl": "${authAdminUrl}",
- "baseUrl": "/admin/zuul-demo/console/",
- "surrogateAuthRequired": false,
- "enabled": true,
- "alwaysDisplayInConsole": false,
- "clientAuthenticatorType": "client-secret",
- "secret": "**********",
- "redirectUris": [
- "/admin/zuul-demo/console/*"
- ],
- "webOrigins": [
- "+"
- ],
- "notBefore": 0,
- "bearerOnly": false,
- "consentRequired": false,
- "standardFlowEnabled": true,
- "implicitFlowEnabled": false,
- "directAccessGrantsEnabled": false,
- "serviceAccountsEnabled": false,
- "publicClient": true,
- "frontchannelLogout": false,
- "protocol": "openid-connect",
- "attributes": {
- "pkce.code.challenge.method": "S256"
- },
- "authenticationFlowBindingOverrides": {},
- "fullScopeAllowed": false,
- "nodeReRegistrationTimeout": 0,
- "protocolMappers": [
- {
- "id": "9077bfa3-32f2-4690-a1f4-fdb2726a6ef2",
- "name": "locale",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "locale",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "locale",
- "jsonType.label": "String"
- }
- }
- ],
- "defaultClientScopes": [
- "web-origins",
- "role_list",
- "profile",
- "roles",
- "email"
- ],
- "optionalClientScopes": [
- "address",
- "phone",
- "offline_access",
- "microprofile-jwt"
- ]
- },
- {
- "id": "118b61cd-e410-414a-a4ee-64e5722725b7",
- "clientId": "zuul",
- "description": "zuul oauth client",
- "rootUrl": "http://localhost:9000",
- "adminUrl": "http://localhost:9000",
- "surrogateAuthRequired": false,
- "enabled": true,
- "alwaysDisplayInConsole": false,
- "clientAuthenticatorType": "client-secret",
- "secret": "**********",
- "redirectUris": [
- "http://127.0.0.1:9000/*",
- "http://localhost:9000/*",
- "http://127.0.0.1:3000/*",
- "http://localhost:3000/*"
- ],
- "webOrigins": [
- "http://localhost:9000",
- "http://localhost:3000"
- ],
- "notBefore": 0,
- "bearerOnly": false,
- "consentRequired": false,
- "standardFlowEnabled": true,
- "implicitFlowEnabled": true,
- "directAccessGrantsEnabled": false,
- "serviceAccountsEnabled": false,
- "publicClient": true,
- "frontchannelLogout": false,
- "protocol": "openid-connect",
- "attributes": {
- "saml.assertion.signature": "false",
- "saml.force.post.binding": "false",
- "saml.multivalued.roles": "false",
- "saml.encrypt": "false",
- "saml.server.signature": "false",
- "saml.server.signature.keyinfo.ext": "false",
- "exclude.session.state.from.auth.response": "true",
- "saml_force_name_id_format": "false",
- "saml.client.signature": "false",
- "tls.client.certificate.bound.access.tokens": "false",
- "saml.authnstatement": "false",
- "display.on.consent.screen": "false",
- "saml.onetimeuse.condition": "false"
- },
- "authenticationFlowBindingOverrides": {},
- "fullScopeAllowed": true,
- "nodeReRegistrationTimeout": -1,
- "protocolMappers": [
- {
- "id": "2389430c-5b5e-4185-a116-a89fe9b2cbe0",
- "name": "groups",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-group-membership-mapper",
- "consentRequired": false,
- "config": {
- "full.path": "false",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "groups",
- "userinfo.token.claim": "true"
- }
- }
- ],
- "defaultClientScopes": [
- "web-origins",
- "role_list",
- "profile",
- "roles",
- "email",
- "zuul_audience"
- ],
- "optionalClientScopes": [
- "address",
- "phone",
- "offline_access",
- "microprofile-jwt"
- ]
- }
- ],
- "clientScopes": [
- {
- "id": "a8ff8d15-7e18-46a7-afe9-cb4b51317f21",
- "name": "address",
- "description": "OpenID Connect built-in scope: address",
- "protocol": "openid-connect",
- "attributes": {
- "include.in.token.scope": "true",
- "display.on.consent.screen": "true",
- "consent.screen.text": "${addressScopeConsentText}"
- },
- "protocolMappers": [
- {
- "id": "2fb91b25-bf0f-4d30-8c32-8da4d6e2e14a",
- "name": "address",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-address-mapper",
- "consentRequired": false,
- "config": {
- "user.attribute.formatted": "formatted",
- "user.attribute.country": "country",
- "user.attribute.postal_code": "postal_code",
- "userinfo.token.claim": "true",
- "user.attribute.street": "street",
- "id.token.claim": "true",
- "user.attribute.region": "region",
- "access.token.claim": "true",
- "user.attribute.locality": "locality"
- }
- }
- ]
- },
- {
- "id": "2491f163-0678-4222-974b-42851cb8bbea",
- "name": "email",
- "description": "OpenID Connect built-in scope: email",
- "protocol": "openid-connect",
- "attributes": {
- "include.in.token.scope": "true",
- "display.on.consent.screen": "true",
- "consent.screen.text": "${emailScopeConsentText}"
},
- "protocolMappers": [
- {
- "id": "247ada79-fd01-4e62-9231-46e09f2de990",
- "name": "email",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-property-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "email",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "email",
- "jsonType.label": "String"
+ "clientRole" : false,
+ "containerId" : "zuul-demo",
+ "attributes" : { }
+ }, {
+ "id" : "a52bd4e0-3f93-4eaf-9792-b5a2b4f564b1",
+ "name" : "uma_authorization",
+ "description" : "${role_uma_authorization}",
+ "composite" : false,
+ "clientRole" : false,
+ "containerId" : "zuul-demo",
+ "attributes" : { }
+ } ],
+ "client" : {
+ "realm-management" : [ {
+ "id" : "76b84ff6-843c-4fbc-903e-56f82324726a",
+ "name" : "query-groups",
+ "description" : "${role_query-groups}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "a9986aaf-a807-43db-b27e-bfcb4a6ed680",
+ "attributes" : { }
+ }, {
+ "id" : "e95f28d5-0a2c-42e5-ac27-ba8c1e49ca9e",
+ "name" : "manage-users",
+ "description" : "${role_manage-users}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "a9986aaf-a807-43db-b27e-bfcb4a6ed680",
+ "attributes" : { }
+ }, {
+ "id" : "c57c009d-8cda-40a2-9f94-9faec21684d1",
+ "name" : "view-clients",
+ "description" : "${role_view-clients}",
+ "composite" : true,
+ "composites" : {
+ "client" : {
+ "realm-management" : [ "query-clients" ]
}
},
- {
- "id": "6a89efdc-4a19-4059-943f-fbf4b0c80fbc",
- "name": "email verified",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-property-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "emailVerified",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "email_verified",
- "jsonType.label": "boolean"
- }
- }
- ]
- },
- {
- "id": "77dc1544-6890-4714-acb5-bce0d34c15d5",
- "name": "microprofile-jwt",
- "description": "Microprofile - JWT built-in scope",
- "protocol": "openid-connect",
- "attributes": {
- "include.in.token.scope": "true",
- "display.on.consent.screen": "false"
- },
- "protocolMappers": [
- {
- "id": "f1cc4b3b-6f0d-4564-b157-8e7790764643",
- "name": "groups",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-realm-role-mapper",
- "consentRequired": false,
- "config": {
- "multivalued": "true",
- "userinfo.token.claim": "true",
- "user.attribute": "foo",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "groups",
- "jsonType.label": "String"
- }
- },
- {
- "id": "e9382111-9f81-455b-805a-9252c4c3db24",
- "name": "upn",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-property-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "username",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "upn",
- "jsonType.label": "String"
- }
- }
- ]
- },
- {
- "id": "7652d555-2c47-4312-85bb-b33e3f6d53ac",
- "name": "offline_access",
- "description": "OpenID Connect built-in scope: offline_access",
- "protocol": "openid-connect",
- "attributes": {
- "consent.screen.text": "${offlineAccessScopeConsentText}",
- "display.on.consent.screen": "true"
- }
- },
- {
- "id": "e0d29ae8-b246-4d7c-bb0e-9b1f3b2fb95c",
- "name": "phone",
- "description": "OpenID Connect built-in scope: phone",
- "protocol": "openid-connect",
- "attributes": {
- "include.in.token.scope": "true",
- "display.on.consent.screen": "true",
- "consent.screen.text": "${phoneScopeConsentText}"
- },
- "protocolMappers": [
- {
- "id": "b68bd653-6780-4cd7-a588-31073e2cc88b",
- "name": "phone number verified",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "phoneNumberVerified",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "phone_number_verified",
- "jsonType.label": "boolean"
- }
- },
- {
- "id": "08a83a89-6029-4c5d-9fe1-3aaaed3a1579",
- "name": "phone number",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "phoneNumber",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "phone_number",
- "jsonType.label": "String"
- }
- }
- ]
- },
- {
- "id": "2890097c-f60f-4690-a964-005272790b26",
- "name": "profile",
- "description": "OpenID Connect built-in scope: profile",
- "protocol": "openid-connect",
- "attributes": {
- "include.in.token.scope": "true",
- "display.on.consent.screen": "true",
- "consent.screen.text": "${profileScopeConsentText}"
- },
- "protocolMappers": [
- {
- "id": "c7fa5831-9380-42d8-929a-a31e89b0dca5",
- "name": "given name",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-property-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "firstName",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "given_name",
- "jsonType.label": "String"
- }
- },
- {
- "id": "fcb6f43b-0dfd-42c4-8f96-2b25078be8cf",
- "name": "middle name",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "middleName",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "middle_name",
- "jsonType.label": "String"
- }
- },
- {
- "id": "15cc1330-fc07-4852-bd72-746ea7c70fc1",
- "name": "locale",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "locale",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "locale",
- "jsonType.label": "String"
- }
- },
- {
- "id": "59e8530c-0630-46e3-b1db-629bd8bafa78",
- "name": "birthdate",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "birthdate",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "birthdate",
- "jsonType.label": "String"
- }
- },
- {
- "id": "42a077a7-5a55-4838-b952-33f049fb5fc3",
- "name": "family name",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-property-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "lastName",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "family_name",
- "jsonType.label": "String"
- }
- },
- {
- "id": "bdc4888d-48ae-4d56-b1cd-d256c50d9b64",
- "name": "nickname",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "nickname",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "nickname",
- "jsonType.label": "String"
- }
- },
- {
- "id": "97fb10c8-ff6e-4ccc-a25a-cfae87e783ef",
- "name": "profile",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "profile",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "profile",
- "jsonType.label": "String"
+ "clientRole" : true,
+ "containerId" : "a9986aaf-a807-43db-b27e-bfcb4a6ed680",
+ "attributes" : { }
+ }, {
+ "id" : "8eee1534-e312-4469-803e-ef89a2c4e02b",
+ "name" : "manage-identity-providers",
+ "description" : "${role_manage-identity-providers}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "a9986aaf-a807-43db-b27e-bfcb4a6ed680",
+ "attributes" : { }
+ }, {
+ "id" : "f9b1241a-c8ba-4842-841c-7c9f6126d13e",
+ "name" : "realm-admin",
+ "description" : "${role_realm-admin}",
+ "composite" : true,
+ "composites" : {
+ "client" : {
+ "realm-management" : [ "query-groups", "view-clients", "manage-users", "view-identity-providers", "manage-identity-providers", "manage-clients", "query-realms", "manage-realm", "view-events", "create-client", "query-clients", "view-users", "view-realm", "manage-authorization", "impersonation", "query-users", "manage-events", "view-authorization" ]
}
},
- {
- "id": "adb8eb09-943b-4e6f-a7ee-bc531a55e359",
- "name": "gender",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "gender",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "gender",
- "jsonType.label": "String"
+ "clientRole" : true,
+ "containerId" : "a9986aaf-a807-43db-b27e-bfcb4a6ed680",
+ "attributes" : { }
+ }, {
+ "id" : "12782ab5-4041-4c49-962a-08d0560fd5ed",
+ "name" : "view-identity-providers",
+ "description" : "${role_view-identity-providers}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "a9986aaf-a807-43db-b27e-bfcb4a6ed680",
+ "attributes" : { }
+ }, {
+ "id" : "1d33026a-2968-4b14-931a-4d855bb82bbc",
+ "name" : "manage-clients",
+ "description" : "${role_manage-clients}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "a9986aaf-a807-43db-b27e-bfcb4a6ed680",
+ "attributes" : { }
+ }, {
+ "id" : "74152341-86df-4741-ad3d-2a4cc4037137",
+ "name" : "manage-realm",
+ "description" : "${role_manage-realm}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "a9986aaf-a807-43db-b27e-bfcb4a6ed680",
+ "attributes" : { }
+ }, {
+ "id" : "56ac5037-efe9-4b66-a8c9-41d6c573227a",
+ "name" : "query-realms",
+ "description" : "${role_query-realms}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "a9986aaf-a807-43db-b27e-bfcb4a6ed680",
+ "attributes" : { }
+ }, {
+ "id" : "9a648218-df86-4203-bc91-29825d91f802",
+ "name" : "view-events",
+ "description" : "${role_view-events}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "a9986aaf-a807-43db-b27e-bfcb4a6ed680",
+ "attributes" : { }
+ }, {
+ "id" : "e6b054ff-8f2b-43e2-8d4a-f7003b893203",
+ "name" : "create-client",
+ "description" : "${role_create-client}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "a9986aaf-a807-43db-b27e-bfcb4a6ed680",
+ "attributes" : { }
+ }, {
+ "id" : "3201e1fc-57b4-4531-a142-adda7c9a132a",
+ "name" : "query-clients",
+ "description" : "${role_query-clients}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "a9986aaf-a807-43db-b27e-bfcb4a6ed680",
+ "attributes" : { }
+ }, {
+ "id" : "e5e6855e-215a-4741-970c-269d201a7e9c",
+ "name" : "view-realm",
+ "description" : "${role_view-realm}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "a9986aaf-a807-43db-b27e-bfcb4a6ed680",
+ "attributes" : { }
+ }, {
+ "id" : "c7599b5a-5374-4867-a6f1-5f4608da8196",
+ "name" : "view-users",
+ "description" : "${role_view-users}",
+ "composite" : true,
+ "composites" : {
+ "client" : {
+ "realm-management" : [ "query-groups", "query-users" ]
}
},
- {
- "id": "c2260f1f-eb68-4186-b86c-74c23a450151",
- "name": "zoneinfo",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "zoneinfo",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "zoneinfo",
- "jsonType.label": "String"
+ "clientRole" : true,
+ "containerId" : "a9986aaf-a807-43db-b27e-bfcb4a6ed680",
+ "attributes" : { }
+ }, {
+ "id" : "36aecf8f-3265-41c1-b585-307005ee02af",
+ "name" : "manage-authorization",
+ "description" : "${role_manage-authorization}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "a9986aaf-a807-43db-b27e-bfcb4a6ed680",
+ "attributes" : { }
+ }, {
+ "id" : "775ac110-9dc8-4dd5-93e7-45b61e9dd29a",
+ "name" : "impersonation",
+ "description" : "${role_impersonation}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "a9986aaf-a807-43db-b27e-bfcb4a6ed680",
+ "attributes" : { }
+ }, {
+ "id" : "f00e65f4-2e53-4684-9eb4-b55c1c0ef4a3",
+ "name" : "query-users",
+ "description" : "${role_query-users}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "a9986aaf-a807-43db-b27e-bfcb4a6ed680",
+ "attributes" : { }
+ }, {
+ "id" : "888e5d3f-1cb5-48f6-b3de-90acad8472f1",
+ "name" : "manage-events",
+ "description" : "${role_manage-events}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "a9986aaf-a807-43db-b27e-bfcb4a6ed680",
+ "attributes" : { }
+ }, {
+ "id" : "125b0c77-45a3-4772-ab9d-cf45803cb3ef",
+ "name" : "view-authorization",
+ "description" : "${role_view-authorization}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "a9986aaf-a807-43db-b27e-bfcb4a6ed680",
+ "attributes" : { }
+ } ],
+ "security-admin-console" : [ ],
+ "admin-cli" : [ ],
+ "account-console" : [ ],
+ "zuul" : [ ],
+ "broker" : [ {
+ "id" : "ec4aeaa2-8d80-47b3-a863-928f93b0157f",
+ "name" : "read-token",
+ "description" : "${role_read-token}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "1f0c06e8-299d-4818-aada-4c59e326cbf8",
+ "attributes" : { }
+ } ],
+ "account" : [ {
+ "id" : "2c559af2-6553-42bd-a98b-de61ba35901a",
+ "name" : "view-applications",
+ "description" : "${role_view-applications}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "38f83427-736e-4570-9f68-25a8b53f0b51",
+ "attributes" : { }
+ }, {
+ "id" : "976602d1-7350-4204-b8a1-00fd5349c7a6",
+ "name" : "view-consent",
+ "description" : "${role_view-consent}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "38f83427-736e-4570-9f68-25a8b53f0b51",
+ "attributes" : { }
+ }, {
+ "id" : "edfc8de7-a5b8-4e33-8ca8-c577c40bb3e2",
+ "name" : "view-profile",
+ "description" : "${role_view-profile}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "38f83427-736e-4570-9f68-25a8b53f0b51",
+ "attributes" : { }
+ }, {
+ "id" : "307ea046-f4ae-4cd4-b170-7f583682537b",
+ "name" : "delete-account",
+ "description" : "${role_delete-account}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "38f83427-736e-4570-9f68-25a8b53f0b51",
+ "attributes" : { }
+ }, {
+ "id" : "0b943331-83af-4fac-b7c9-0ac6f4b73384",
+ "name" : "manage-account",
+ "description" : "${role_manage-account}",
+ "composite" : true,
+ "composites" : {
+ "client" : {
+ "account" : [ "manage-account-links" ]
}
},
- {
- "id": "e618b191-1c20-466d-a412-9b59a221d587",
- "name": "updated at",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "updatedAt",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "updated_at",
- "jsonType.label": "String"
+ "clientRole" : true,
+ "containerId" : "38f83427-736e-4570-9f68-25a8b53f0b51",
+ "attributes" : { }
+ }, {
+ "id" : "4b64f538-1336-44eb-ba18-c26859d7291a",
+ "name" : "manage-account-links",
+ "description" : "${role_manage-account-links}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "38f83427-736e-4570-9f68-25a8b53f0b51",
+ "attributes" : { }
+ }, {
+ "id" : "12a120c6-1df6-47f6-b0ff-a3196cef8885",
+ "name" : "manage-consent",
+ "description" : "${role_manage-consent}",
+ "composite" : true,
+ "composites" : {
+ "client" : {
+ "account" : [ "view-consent" ]
}
},
- {
- "id": "bf72e820-32b2-41ff-a812-7349dbc97dc1",
- "name": "website",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "website",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "website",
- "jsonType.label": "String"
- }
- },
- {
- "id": "00ec085d-5cdc-4009-968a-bc03843e0418",
- "name": "username",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-property-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "username",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "preferred_username",
- "jsonType.label": "String"
- }
- },
- {
- "id": "e7f8706d-04b2-4ceb-97e0-d6c50f268653",
- "name": "picture",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "picture",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "picture",
- "jsonType.label": "String"
- }
- },
- {
- "id": "dc881508-6029-4af0-9ab4-bc84613d0bfe",
- "name": "full name",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-full-name-mapper",
- "consentRequired": false,
- "config": {
- "id.token.claim": "true",
- "access.token.claim": "true",
- "userinfo.token.claim": "true"
- }
- }
- ]
- },
- {
- "id": "a45a99e9-3413-4dbe-a1bf-da76d82c6887",
- "name": "role_list",
- "description": "SAML role list",
- "protocol": "saml",
- "attributes": {
- "consent.screen.text": "${samlRoleListScopeConsentText}",
- "display.on.consent.screen": "true"
- },
- "protocolMappers": [
- {
- "id": "8fdf3fb9-4eeb-4e14-986e-7c9711838ca5",
- "name": "role list",
- "protocol": "saml",
- "protocolMapper": "saml-role-list-mapper",
- "consentRequired": false,
- "config": {
- "single": "false",
- "attribute.nameformat": "Basic",
- "attribute.name": "Role"
- }
- }
- ]
- },
- {
- "id": "cf8edb74-1db4-4cc0-89fa-ec2a9ef19565",
- "name": "roles",
- "description": "OpenID Connect scope for add user roles to the access token",
- "protocol": "openid-connect",
- "attributes": {
- "include.in.token.scope": "false",
- "display.on.consent.screen": "true",
- "consent.screen.text": "${rolesScopeConsentText}"
- },
- "protocolMappers": [
- {
- "id": "67629d5f-39aa-4521-b936-91964357e630",
- "name": "audience resolve",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-audience-resolve-mapper",
- "consentRequired": false,
- "config": {}
- },
- {
- "id": "75458c67-6f8c-4646-a851-c3a5f6c9c6e1",
- "name": "client roles",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-client-role-mapper",
- "consentRequired": false,
- "config": {
- "user.attribute": "foo",
- "access.token.claim": "true",
- "claim.name": "resource_access.${client_id}.roles",
- "jsonType.label": "String",
- "multivalued": "true"
- }
- },
- {
- "id": "059aa66a-7d91-4116-8b4e-51f5ab57424c",
- "name": "realm roles",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-realm-role-mapper",
- "consentRequired": false,
- "config": {
- "user.attribute": "foo",
- "access.token.claim": "true",
- "claim.name": "realm_access.roles",
- "jsonType.label": "String",
- "multivalued": "true"
- }
- }
- ]
- },
- {
- "id": "2637f0c2-5d96-4057-a032-ce8f11477048",
- "name": "web-origins",
- "description": "OpenID Connect scope for add allowed web origins to the access token",
- "protocol": "openid-connect",
- "attributes": {
- "include.in.token.scope": "false",
- "display.on.consent.screen": "false",
- "consent.screen.text": ""
- },
- "protocolMappers": [
- {
- "id": "33cbf353-644c-4801-91c1-b6ca677f65d2",
- "name": "allowed web origins",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-allowed-origins-mapper",
- "consentRequired": false,
- "config": {}
- }
- ]
- },
- {
- "id": "ace09ede-6cf1-4e36-9557-91beb58ce557",
- "name": "zuul_audience",
- "description": "fix audience claim for Zuul",
- "protocol": "openid-connect",
- "attributes": {
- "include.in.token.scope": "true",
- "display.on.consent.screen": "true"
- },
- "protocolMappers": [
- {
- "id": "9a1029e7-f142-4ff1-ba47-50ca6bb24073",
- "name": "zuul_audience_mapper",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-audience-mapper",
- "consentRequired": false,
- "config": {
- "included.client.audience": "zuul",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "userinfo.token.claim": "true"
- }
- }
- ]
+ "clientRole" : true,
+ "containerId" : "38f83427-736e-4570-9f68-25a8b53f0b51",
+ "attributes" : { }
+ } ]
}
- ],
- "defaultDefaultClientScopes": [
- "email",
- "web-origins",
- "profile",
- "role_list",
- "roles"
- ],
- "defaultOptionalClientScopes": [
- "offline_access",
- "microprofile-jwt",
- "address",
- "phone"
- ],
- "browserSecurityHeaders": {
- "contentSecurityPolicyReportOnly": "",
- "xContentTypeOptions": "nosniff",
- "xRobotsTag": "none",
- "xFrameOptions": "SAMEORIGIN",
- "contentSecurityPolicy": "frame-src 'self'; frame-ancestors 'self'; object-src 'none';",
- "xXSSProtection": "1; mode=block",
- "strictTransportSecurity": "max-age=31536000; includeSubDomains"
},
- "smtpServer": {},
- "eventsEnabled": false,
- "eventsListeners": [
- "jboss-logging"
- ],
- "enabledEventTypes": [],
- "adminEventsEnabled": false,
- "adminEventsDetailsEnabled": false,
- "identityProviders": [],
- "identityProviderMappers": [],
- "components": {
- "org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy": [
- {
- "id": "909674c7-fb40-458b-af37-8372300725b1",
- "name": "Max Clients Limit",
- "providerId": "max-clients",
- "subType": "anonymous",
- "subComponents": {},
- "config": {
- "max-clients": [
- "200"
- ]
- }
- },
- {
- "id": "b350d08d-4298-4d76-bd94-e120b1aadd28",
- "name": "Allowed Client Scopes",
- "providerId": "allowed-client-templates",
- "subType": "anonymous",
- "subComponents": {},
- "config": {
- "allow-default-scopes": [
- "true"
- ]
- }
- },
- {
- "id": "4c1d186e-250d-497b-ac28-b7dffd021c19",
- "name": "Allowed Protocol Mapper Types",
- "providerId": "allowed-protocol-mappers",
- "subType": "anonymous",
- "subComponents": {},
- "config": {
- "allowed-protocol-mapper-types": [
- "oidc-address-mapper",
- "oidc-sha256-pairwise-sub-mapper",
- "saml-user-attribute-mapper",
- "oidc-full-name-mapper",
- "oidc-usermodel-attribute-mapper",
- "saml-user-property-mapper",
- "oidc-usermodel-property-mapper",
- "saml-role-list-mapper"
- ]
- }
- },
- {
- "id": "74a38dd7-41bf-414e-9858-f4f287c8caf3",
- "name": "Full Scope Disabled",
- "providerId": "scope",
- "subType": "anonymous",
- "subComponents": {},
- "config": {}
- },
- {
- "id": "19082549-290b-4e93-bd77-6ce5cc386b63",
- "name": "Allowed Protocol Mapper Types",
- "providerId": "allowed-protocol-mappers",
- "subType": "authenticated",
- "subComponents": {},
- "config": {
- "allowed-protocol-mapper-types": [
- "saml-user-property-mapper",
- "oidc-usermodel-attribute-mapper",
- "oidc-address-mapper",
- "oidc-usermodel-property-mapper",
- "saml-role-list-mapper",
- "saml-user-attribute-mapper",
- "oidc-full-name-mapper",
- "oidc-sha256-pairwise-sub-mapper"
- ]
- }
- },
- {
- "id": "62c50eea-fc15-40f1-a3c0-9923dcb8a8c7",
- "name": "Trusted Hosts",
- "providerId": "trusted-hosts",
- "subType": "anonymous",
- "subComponents": {},
- "config": {
- "host-sending-registration-request-must-match": [
- "true"
- ],
- "client-uris-must-match": [
- "true"
- ]
- }
- },
- {
- "id": "21095085-2c9b-45ea-99d3-9ce962ab2020",
- "name": "Allowed Client Scopes",
- "providerId": "allowed-client-templates",
- "subType": "authenticated",
- "subComponents": {},
- "config": {
- "allow-default-scopes": [
- "true"
- ]
- }
- },
- {
- "id": "36577457-a002-4b44-8029-9a599f2395a5",
- "name": "Consent Required",
- "providerId": "consent-required",
- "subType": "anonymous",
- "subComponents": {},
- "config": {}
- }
- ],
- "org.keycloak.keys.KeyProvider": [
- {
- "id": "0a6a397a-6eb1-46ab-8c6d-a3d4ea47f085",
- "name": "rsa-generated",
- "providerId": "rsa-generated",
- "subComponents": {},
- "config": {
- "privateKey": [
- "MIIEpQIBAAKCAQEA3q7PYMrX38XUpUScjbEn/4oyv5AI5TsyoFEPhgCFHzGEkeXWop3PNhh3OgFpz2Tn6qEqs9vRWi/8VDVC73lOZJWn70qfCDlr9Acmm1eKhrWkyHH6ONyg7qPj/PSsjapSsto5rVp1tdaOfObgWaLvg9dsOmbF+P6vUT6ggUD1p73KHySdDKiKHUTbaxaOVgDVTzeptDRg2iFaz+E0ETBsFKcJgXuPVd4IlxaXogDFLTKo6j2ITtnU8hw4wlqY3pkLI5OHP9EKmkV94fzmfYIoMxv4vLkwWRdz24hB459OCeDH0su25+JNnA0WA5SPRTUepeAsuZIFletYw2Mq/BFN5QIDAQABAoIBAQCX9e043VOxtjwlyAuZueJUxUdaaH1ZiStEMe0JAgPWRKF2OsVc1ZpZDRsXr204hWCqQe91K7XS+NoV0P7rkvmHNIWUi3S5VQ4xSkvzSCsVQJHB493gvdbo41iq/4Fdb3Td7oPbo9aeD1vPKnLBWKpgazrFI+tHvu1+4OEBM4YwP9KPXK4QOlxKFjzwGIeSgyMd3KnHbC6b9C8rlrf7b9Uj4UPVpGtNuPqTJyOeBTHh8CNJzYWYN0BPHk8DCMPaFkMXx42gSLsAAVOO1Kczby31Ac2IUIVDn/Z5kBmgxd6BWoVDSh1NpAlAYhK2A+LNUzveetE60CC80k387/N0JdlFAoGBAPr1v/e3rlD2pS3YA8UNQTcJjTJAvAuUw9kPXxYQd6G3UtuGwYNRw9DgZSA2E3eojzs6hLuS4W0mIVkmGwa/6SXD5TVbdaWbGO8C+x/Kxz0doRoM2AhA64uMy6zUNMwqIjroNuVn9vj8n5lMND4qqhMifYYuv9CQvyYOlXOSaFZTAoGBAOMnriWZQJqnLcd9zjr3DLxbrp/XCSLVvYRRVEleLkB+tahIFMNez50JHdTJb/TctDRfAFlZT2o0XI+FrHSqFI81UZes/cH2uqaIo+CgwRS4WY7f+Sp/ao6y+WZl2+Ip+Ao/QwjOvQ6u2jL+rCmZrPzoKoQHJaT+7WlHV2zZh9PnAoGBAOfquyCdakX/6N3YxoMPoLjP5uAN2rmJHQQ2pFSrmyKjW7rraWGF6kPZWxrNXmgyKUs+5PLC5fgMSL0t7cPrDfaMdgE9KBeGoSAfzRqwNjdQblS4kdvuwr4PuxlYcgJK3Z86gaC21xF5w7PTLGRW4R0VvpKGGVUQrtTonUxUfH9pAoGBALezd1pgvaZUXOlgDFATSvFpE6egN3s8b696Nje/Ophd4HrfECuPmUbeAIn8/dWARxuzWIzpdRfmkJRg/j667TWDYSDQfcdGyVu0VRNr7bnb/FFXQCHmOT597sOozFHyru1ai9OrnakqLrveyUw7Q3KkLv3m6cKth0IEt+cHZJkxAoGAHIGs8zI/Bp2U4Z4yHedyQ/tGF8Vk+ZehIsaHhOGEp3Cps4af5LBA5bstkArFsz+NJ7oDrxVBMUUNNypyUX4UF6EDcyZ+2vwBeill9fZqKR7BBBdC2AS6mT52gcCbFqBiGMHd+tYQj0tYnsann5e2a0ssqdXTYUn9YJO6iWh8EGY="
- ],
- "certificate": [
- "MIICoTCCAYkCBgF210UjOTANBgkqhkiG9w0BAQsFADAUMRIwEAYDVQQDDAl6dXVsLWRlbW8wHhcNMjEwMTA2MTAzNTAxWhcNMzEwMTA2MTAzNjQxWjAUMRIwEAYDVQQDDAl6dXVsLWRlbW8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDers9gytffxdSlRJyNsSf/ijK/kAjlOzKgUQ+GAIUfMYSR5dainc82GHc6AWnPZOfqoSqz29FaL/xUNULveU5klafvSp8IOWv0ByabV4qGtaTIcfo43KDuo+P89KyNqlKy2jmtWnW11o585uBZou+D12w6ZsX4/q9RPqCBQPWnvcofJJ0MqIodRNtrFo5WANVPN6m0NGDaIVrP4TQRMGwUpwmBe49V3giXFpeiAMUtMqjqPYhO2dTyHDjCWpjemQsjk4c/0QqaRX3h/OZ9gigzG/i8uTBZF3PbiEHjn04J4MfSy7bn4k2cDRYDlI9FNR6l4Cy5kgWV61jDYyr8EU3lAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAEFDFCBBNEtzOuAs46BRNBzGO2QCvLXsBASKSDFTsv2AMaFJIlc9l5U16wMcrZMTvsPY5MQxuaZvIDyAQH7NaxuRW7siZFBMRtwPmSrPHb/XqGh5OO4lXLX+Vpnx/JuMt9dOgyr9hTIYZ2UCFYxdC7ht21XSlRU6dZfEO8lTu+XEPQil42sZ/aB2efKfgWHieNvzTx3RLfG9lbsP4Dhg7FX+rGDz3Ql8PCl0Puai4pDwMjvvpZcZBjEzonw9pQ1rlSyGx0DLSJxMPMlQ33auVwLYD3MYIrgJplnScA0aKelOYJrnbSFMOlb/DwKxQNvM77banJQGq5Lpn617r2FmHNk="
- ],
- "priority": [
- "100"
- ]
- }
- },
- {
- "id": "78880d4c-8ff2-4619-82b4-02a8fbd4a624",
- "name": "hmac-generated",
- "providerId": "hmac-generated",
- "subComponents": {},
- "config": {
- "kid": [
- "a23a2cdc-8d85-4754-b885-fc14a9e1a7bc"
- ],
- "secret": [
- "k5rhshjW9QaQvYnfC4nZUzQRkLZHKJlW524t125u63s9nza8ptFhPkLl7C3AGYSS6vD3tKSfOvkGuxubsRIJKg"
- ],
- "priority": [
- "100"
- ],
- "algorithm": [
- "HS256"
- ]
- }
- },
- {
- "id": "96281deb-af4d-49f8-a35c-10993007c7df",
- "name": "aes-generated",
- "providerId": "aes-generated",
- "subComponents": {},
- "config": {
- "kid": [
- "074f1951-9f97-40ff-8f0a-4219353d6f3d"
- ],
- "secret": [
- "Csz6nXZD0tf117pBKkJ7qw"
- ],
- "priority": [
- "100"
- ]
- }
- }
- ]
+ "groups" : [ {
+ "id" : "33a7bf20-adbe-47d9-b18c-77aa9ae9f045",
+ "name" : "example-tenant-admin",
+ "path" : "/example-tenant-admin",
+ "attributes" : { },
+ "realmRoles" : [ ],
+ "clientRoles" : { },
+ "subGroups" : [ ]
+ } ],
+ "defaultRole" : {
+ "id" : "156d7b5b-65fb-4c89-b3d8-c2f82e9ecdd4",
+ "name" : "default-roles-zuul-demo",
+ "description" : "${role_default-roles}",
+ "composite" : true,
+ "clientRole" : false,
+ "containerId" : "zuul-demo"
},
- "internationalizationEnabled": false,
- "supportedLocales": [],
- "authenticationFlows": [
- {
- "id": "3e95c1d5-2e16-40ad-89d3-cc13bd514fee",
- "alias": "Account verification options",
- "description": "Method with which to verity the existing account",
- "providerId": "basic-flow",
- "topLevel": false,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "idp-email-verification",
- "requirement": "ALTERNATIVE",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "requirement": "ALTERNATIVE",
- "priority": 20,
- "flowAlias": "Verify Existing Account by Re-authentication",
- "userSetupAllowed": false,
- "autheticatorFlow": true
- }
- ]
- },
- {
- "id": "7143f715-1076-4c59-a039-34c5ec30d7e8",
- "alias": "Authentication Options",
- "description": "Authentication options.",
- "providerId": "basic-flow",
- "topLevel": false,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "basic-auth",
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "basic-auth-otp",
- "requirement": "DISABLED",
- "priority": 20,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "auth-spnego",
- "requirement": "DISABLED",
- "priority": 30,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- }
- ]
- },
- {
- "id": "e3804922-4ffa-4e53-aa28-e982730f96a5",
- "alias": "Browser - Conditional OTP",
- "description": "Flow to determine if the OTP is required for the authentication",
- "providerId": "basic-flow",
- "topLevel": false,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "conditional-user-configured",
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "auth-otp-form",
- "requirement": "REQUIRED",
- "priority": 20,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- }
- ]
- },
- {
- "id": "e5ba2a92-70f1-4559-b31a-968363222c72",
- "alias": "Direct Grant - Conditional OTP",
- "description": "Flow to determine if the OTP is required for the authentication",
- "providerId": "basic-flow",
- "topLevel": false,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "conditional-user-configured",
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "direct-grant-validate-otp",
- "requirement": "REQUIRED",
- "priority": 20,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- }
- ]
- },
- {
- "id": "617c8570-c7aa-4b4a-8b52-3bb94dc7ba04",
- "alias": "First broker login - Conditional OTP",
- "description": "Flow to determine if the OTP is required for the authentication",
- "providerId": "basic-flow",
- "topLevel": false,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "conditional-user-configured",
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "auth-otp-form",
- "requirement": "REQUIRED",
- "priority": 20,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- }
- ]
- },
- {
- "id": "7bf3d19b-f551-4c1f-9188-850923a403b1",
- "alias": "Handle Existing Account",
- "description": "Handle what to do if there is existing account with same email/username like authenticated identity provider",
- "providerId": "basic-flow",
- "topLevel": false,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "idp-confirm-link",
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "requirement": "REQUIRED",
- "priority": 20,
- "flowAlias": "Account verification options",
- "userSetupAllowed": false,
- "autheticatorFlow": true
- }
- ]
- },
- {
- "id": "ff1dd822-547c-4e25-8c9e-5b7a3dd30504",
- "alias": "Reset - Conditional OTP",
- "description": "Flow to determine if the OTP should be reset or not. Set to REQUIRED to force.",
- "providerId": "basic-flow",
- "topLevel": false,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "conditional-user-configured",
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "reset-otp",
- "requirement": "REQUIRED",
- "priority": 20,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- }
- ]
- },
- {
- "id": "3b586469-9250-4bbf-9af0-f3ad81ce2eaa",
- "alias": "User creation or linking",
- "description": "Flow for the existing/non-existing user alternatives",
- "providerId": "basic-flow",
- "topLevel": false,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticatorConfig": "create unique user config",
- "authenticator": "idp-create-user-if-unique",
- "requirement": "ALTERNATIVE",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "requirement": "ALTERNATIVE",
- "priority": 20,
- "flowAlias": "Handle Existing Account",
- "userSetupAllowed": false,
- "autheticatorFlow": true
- }
- ]
- },
- {
- "id": "80831f25-c4ab-4ad8-ad6c-f1d7b570d919",
- "alias": "Verify Existing Account by Re-authentication",
- "description": "Reauthentication of existing account",
- "providerId": "basic-flow",
- "topLevel": false,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "idp-username-password-form",
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "requirement": "CONDITIONAL",
- "priority": 20,
- "flowAlias": "First broker login - Conditional OTP",
- "userSetupAllowed": false,
- "autheticatorFlow": true
- }
- ]
- },
- {
- "id": "dec78792-6cf8-4752-9833-18c1386423df",
- "alias": "browser",
- "description": "browser based authentication",
- "providerId": "basic-flow",
- "topLevel": true,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "auth-cookie",
- "requirement": "ALTERNATIVE",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "auth-spnego",
- "requirement": "DISABLED",
- "priority": 20,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "identity-provider-redirector",
- "requirement": "ALTERNATIVE",
- "priority": 25,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "requirement": "ALTERNATIVE",
- "priority": 30,
- "flowAlias": "forms",
- "userSetupAllowed": false,
- "autheticatorFlow": true
- }
- ]
- },
- {
- "id": "14c06286-51e3-4abc-af50-8554c57c9f8f",
- "alias": "clients",
- "description": "Base authentication for clients",
- "providerId": "client-flow",
- "topLevel": true,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "client-secret",
- "requirement": "ALTERNATIVE",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "client-jwt",
- "requirement": "ALTERNATIVE",
- "priority": 20,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "client-secret-jwt",
- "requirement": "ALTERNATIVE",
- "priority": 30,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "client-x509",
- "requirement": "ALTERNATIVE",
- "priority": 40,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- }
- ]
+ "requiredCredentials" : [ "password" ],
+ "otpPolicyType" : "totp",
+ "otpPolicyAlgorithm" : "HmacSHA1",
+ "otpPolicyInitialCounter" : 0,
+ "otpPolicyDigits" : 6,
+ "otpPolicyLookAheadWindow" : 1,
+ "otpPolicyPeriod" : 30,
+ "otpSupportedApplications" : [ "FreeOTP", "Google Authenticator" ],
+ "webAuthnPolicyRpEntityName" : "keycloak",
+ "webAuthnPolicySignatureAlgorithms" : [ "ES256" ],
+ "webAuthnPolicyRpId" : "",
+ "webAuthnPolicyAttestationConveyancePreference" : "not specified",
+ "webAuthnPolicyAuthenticatorAttachment" : "not specified",
+ "webAuthnPolicyRequireResidentKey" : "not specified",
+ "webAuthnPolicyUserVerificationRequirement" : "not specified",
+ "webAuthnPolicyCreateTimeout" : 0,
+ "webAuthnPolicyAvoidSameAuthenticatorRegister" : false,
+ "webAuthnPolicyAcceptableAaguids" : [ ],
+ "webAuthnPolicyPasswordlessRpEntityName" : "keycloak",
+ "webAuthnPolicyPasswordlessSignatureAlgorithms" : [ "ES256" ],
+ "webAuthnPolicyPasswordlessRpId" : "",
+ "webAuthnPolicyPasswordlessAttestationConveyancePreference" : "not specified",
+ "webAuthnPolicyPasswordlessAuthenticatorAttachment" : "not specified",
+ "webAuthnPolicyPasswordlessRequireResidentKey" : "not specified",
+ "webAuthnPolicyPasswordlessUserVerificationRequirement" : "not specified",
+ "webAuthnPolicyPasswordlessCreateTimeout" : 0,
+ "webAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister" : false,
+ "webAuthnPolicyPasswordlessAcceptableAaguids" : [ ],
+ "users" : [ {
+ "id" : "b19092bd-b767-4175-9d9a-e8749b15012b",
+ "createdTimestamp" : 1658485873780,
+ "username" : "admin",
+ "enabled" : true,
+ "totp" : false,
+ "emailVerified" : false,
+ "firstName" : "Zuul",
+ "lastName" : "Administrator",
+ "email" : "admin@example.com",
+ "credentials" : [ {
+ "id" : "77e16b56-2d90-43f9-8064-ec1330dc9d60",
+ "type" : "password",
+ "createdDate" : 1658485888588,
+ "secretData" : "{\"value\":\"3mxFAhY4UWLcnbooTrxgKZEH3dp5H78VlxVPU0KRFveg6YtIm+onPncXU8qx3PYDcfZjCbKuPghhFSJhaXxVnw==\",\"salt\":\"PomCTIfrYWl4leXhqAkUsQ==\",\"additionalParameters\":{}}",
+ "credentialData" : "{\"hashIterations\":27500,\"algorithm\":\"pbkdf2-sha256\",\"additionalParameters\":{}}"
+ } ],
+ "disableableCredentialTypes" : [ ],
+ "requiredActions" : [ ],
+ "realmRoles" : [ "default-roles-zuul-demo" ],
+ "notBefore" : 0,
+ "groups" : [ ]
+ }, {
+ "id" : "2c3b0f44-0488-42fe-acac-2d5e483b9806",
+ "createdTimestamp" : 1658485982882,
+ "username" : "user1",
+ "enabled" : true,
+ "totp" : false,
+ "emailVerified" : false,
+ "firstName" : "User",
+ "lastName" : "One",
+ "email" : "user1@example.com",
+ "credentials" : [ {
+ "id" : "52b67f84-8383-4684-8d45-ab9838ebda07",
+ "type" : "password",
+ "createdDate" : 1658485994760,
+ "secretData" : "{\"value\":\"RII4dJdPibGBeya28QKmZaZkumVXj0GltwHlUdv7w7IR7X+1JtlPke2Z7UfZYeb09CkHSj4xk3EaCMaQl4uUoA==\",\"salt\":\"C68vc47R5kfemCeGAbOKIQ==\",\"additionalParameters\":{}}",
+ "credentialData" : "{\"hashIterations\":27500,\"algorithm\":\"pbkdf2-sha256\",\"additionalParameters\":{}}"
+ } ],
+ "disableableCredentialTypes" : [ ],
+ "requiredActions" : [ ],
+ "realmRoles" : [ "default-roles-zuul-demo" ],
+ "notBefore" : 0,
+ "groups" : [ "/example-tenant-admin" ]
+ }, {
+ "id" : "832d027d-5ef8-4968-b950-e57944dde6d6",
+ "createdTimestamp" : 1658486020309,
+ "username" : "user2",
+ "enabled" : true,
+ "totp" : false,
+ "emailVerified" : false,
+ "firstName" : "User",
+ "lastName" : "Two",
+ "email" : "user2@example.com",
+ "credentials" : [ {
+ "id" : "304178ea-219a-4495-bca1-76361e841ce0",
+ "type" : "password",
+ "createdDate" : 1658486030056,
+ "secretData" : "{\"value\":\"uDqEwwwGuxSMttycSI+YMRkRxHGozlWxGJ4h2YZ21CXNSpx3BN/i4xAJ47nhhZzDoZKYPVqiTpWXFgVpaYb2jA==\",\"salt\":\"ADhTsq7HIlBEZ0KmurA9/Q==\",\"additionalParameters\":{}}",
+ "credentialData" : "{\"hashIterations\":27500,\"algorithm\":\"pbkdf2-sha256\",\"additionalParameters\":{}}"
+ } ],
+ "disableableCredentialTypes" : [ ],
+ "requiredActions" : [ ],
+ "realmRoles" : [ "default-roles-zuul-demo" ],
+ "notBefore" : 0,
+ "groups" : [ ]
+ } ],
+ "scopeMappings" : [ {
+ "clientScope" : "offline_access",
+ "roles" : [ "offline_access" ]
+ } ],
+ "clientScopeMappings" : {
+ "account" : [ {
+ "client" : "account-console",
+ "roles" : [ "manage-account" ]
+ } ]
+ },
+ "clients" : [ {
+ "id" : "38f83427-736e-4570-9f68-25a8b53f0b51",
+ "clientId" : "account",
+ "name" : "${client_account}",
+ "rootUrl" : "${authBaseUrl}",
+ "baseUrl" : "/realms/zuul-demo/account/",
+ "surrogateAuthRequired" : false,
+ "enabled" : true,
+ "alwaysDisplayInConsole" : false,
+ "clientAuthenticatorType" : "client-secret",
+ "redirectUris" : [ "/realms/zuul-demo/account/*" ],
+ "webOrigins" : [ ],
+ "notBefore" : 0,
+ "bearerOnly" : false,
+ "consentRequired" : false,
+ "standardFlowEnabled" : true,
+ "implicitFlowEnabled" : false,
+ "directAccessGrantsEnabled" : false,
+ "serviceAccountsEnabled" : false,
+ "publicClient" : true,
+ "frontchannelLogout" : false,
+ "protocol" : "openid-connect",
+ "attributes" : { },
+ "authenticationFlowBindingOverrides" : { },
+ "fullScopeAllowed" : false,
+ "nodeReRegistrationTimeout" : 0,
+ "defaultClientScopes" : [ "web-origins", "acr", "roles", "profile", "email" ],
+ "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ]
+ }, {
+ "id" : "a124c422-d35d-4ad9-bb85-4df87ae56fb3",
+ "clientId" : "account-console",
+ "name" : "${client_account-console}",
+ "rootUrl" : "${authBaseUrl}",
+ "baseUrl" : "/realms/zuul-demo/account/",
+ "surrogateAuthRequired" : false,
+ "enabled" : true,
+ "alwaysDisplayInConsole" : false,
+ "clientAuthenticatorType" : "client-secret",
+ "redirectUris" : [ "/realms/zuul-demo/account/*" ],
+ "webOrigins" : [ ],
+ "notBefore" : 0,
+ "bearerOnly" : false,
+ "consentRequired" : false,
+ "standardFlowEnabled" : true,
+ "implicitFlowEnabled" : false,
+ "directAccessGrantsEnabled" : false,
+ "serviceAccountsEnabled" : false,
+ "publicClient" : true,
+ "frontchannelLogout" : false,
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "pkce.code.challenge.method" : "S256"
},
- {
- "id": "54d29594-0183-486f-abb2-c1998d4e45c5",
- "alias": "direct grant",
- "description": "OpenID Connect Resource Owner Grant",
- "providerId": "basic-flow",
- "topLevel": true,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "direct-grant-validate-username",
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "direct-grant-validate-password",
- "requirement": "REQUIRED",
- "priority": 20,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "requirement": "CONDITIONAL",
- "priority": 30,
- "flowAlias": "Direct Grant - Conditional OTP",
- "userSetupAllowed": false,
- "autheticatorFlow": true
- }
- ]
+ "authenticationFlowBindingOverrides" : { },
+ "fullScopeAllowed" : false,
+ "nodeReRegistrationTimeout" : 0,
+ "protocolMappers" : [ {
+ "id" : "849fdec6-5827-4e3e-b9bb-25fe91a8c3af",
+ "name" : "audience resolve",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-audience-resolve-mapper",
+ "consentRequired" : false,
+ "config" : { }
+ } ],
+ "defaultClientScopes" : [ "web-origins", "acr", "roles", "profile", "email" ],
+ "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ]
+ }, {
+ "id" : "24514749-6257-4d58-bc00-e68592d4f8ee",
+ "clientId" : "admin-cli",
+ "name" : "${client_admin-cli}",
+ "surrogateAuthRequired" : false,
+ "enabled" : true,
+ "alwaysDisplayInConsole" : false,
+ "clientAuthenticatorType" : "client-secret",
+ "redirectUris" : [ ],
+ "webOrigins" : [ ],
+ "notBefore" : 0,
+ "bearerOnly" : false,
+ "consentRequired" : false,
+ "standardFlowEnabled" : false,
+ "implicitFlowEnabled" : false,
+ "directAccessGrantsEnabled" : true,
+ "serviceAccountsEnabled" : false,
+ "publicClient" : true,
+ "frontchannelLogout" : false,
+ "protocol" : "openid-connect",
+ "attributes" : { },
+ "authenticationFlowBindingOverrides" : { },
+ "fullScopeAllowed" : false,
+ "nodeReRegistrationTimeout" : 0,
+ "defaultClientScopes" : [ "web-origins", "acr", "roles", "profile", "email" ],
+ "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ]
+ }, {
+ "id" : "1f0c06e8-299d-4818-aada-4c59e326cbf8",
+ "clientId" : "broker",
+ "name" : "${client_broker}",
+ "surrogateAuthRequired" : false,
+ "enabled" : true,
+ "alwaysDisplayInConsole" : false,
+ "clientAuthenticatorType" : "client-secret",
+ "redirectUris" : [ ],
+ "webOrigins" : [ ],
+ "notBefore" : 0,
+ "bearerOnly" : true,
+ "consentRequired" : false,
+ "standardFlowEnabled" : true,
+ "implicitFlowEnabled" : false,
+ "directAccessGrantsEnabled" : false,
+ "serviceAccountsEnabled" : false,
+ "publicClient" : false,
+ "frontchannelLogout" : false,
+ "protocol" : "openid-connect",
+ "attributes" : { },
+ "authenticationFlowBindingOverrides" : { },
+ "fullScopeAllowed" : false,
+ "nodeReRegistrationTimeout" : 0,
+ "defaultClientScopes" : [ "web-origins", "acr", "roles", "profile", "email" ],
+ "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ]
+ }, {
+ "id" : "a9986aaf-a807-43db-b27e-bfcb4a6ed680",
+ "clientId" : "realm-management",
+ "name" : "${client_realm-management}",
+ "surrogateAuthRequired" : false,
+ "enabled" : true,
+ "alwaysDisplayInConsole" : false,
+ "clientAuthenticatorType" : "client-secret",
+ "redirectUris" : [ ],
+ "webOrigins" : [ ],
+ "notBefore" : 0,
+ "bearerOnly" : true,
+ "consentRequired" : false,
+ "standardFlowEnabled" : true,
+ "implicitFlowEnabled" : false,
+ "directAccessGrantsEnabled" : false,
+ "serviceAccountsEnabled" : false,
+ "publicClient" : false,
+ "frontchannelLogout" : false,
+ "protocol" : "openid-connect",
+ "attributes" : { },
+ "authenticationFlowBindingOverrides" : { },
+ "fullScopeAllowed" : false,
+ "nodeReRegistrationTimeout" : 0,
+ "defaultClientScopes" : [ "web-origins", "acr", "roles", "profile", "email" ],
+ "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ]
+ }, {
+ "id" : "952f56db-5191-41fd-ac39-572ba28d9ee5",
+ "clientId" : "security-admin-console",
+ "name" : "${client_security-admin-console}",
+ "rootUrl" : "${authAdminUrl}",
+ "baseUrl" : "/admin/zuul-demo/console/",
+ "surrogateAuthRequired" : false,
+ "enabled" : true,
+ "alwaysDisplayInConsole" : false,
+ "clientAuthenticatorType" : "client-secret",
+ "redirectUris" : [ "/admin/zuul-demo/console/*" ],
+ "webOrigins" : [ "+" ],
+ "notBefore" : 0,
+ "bearerOnly" : false,
+ "consentRequired" : false,
+ "standardFlowEnabled" : true,
+ "implicitFlowEnabled" : false,
+ "directAccessGrantsEnabled" : false,
+ "serviceAccountsEnabled" : false,
+ "publicClient" : true,
+ "frontchannelLogout" : false,
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "pkce.code.challenge.method" : "S256"
},
- {
- "id": "e6734c68-8029-4b27-bf56-7eccb2202903",
- "alias": "docker auth",
- "description": "Used by Docker clients to authenticate against the IDP",
- "providerId": "basic-flow",
- "topLevel": true,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "docker-http-basic-authenticator",
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- }
- ]
+ "authenticationFlowBindingOverrides" : { },
+ "fullScopeAllowed" : false,
+ "nodeReRegistrationTimeout" : 0,
+ "protocolMappers" : [ {
+ "id" : "661a797e-0734-46b8-8c4b-17b1a58cf05a",
+ "name" : "locale",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "locale",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "locale",
+ "jsonType.label" : "String"
+ }
+ } ],
+ "defaultClientScopes" : [ "web-origins", "acr", "roles", "profile", "email" ],
+ "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ]
+ }, {
+ "id" : "99377c87-2fb8-4d8b-a628-6281350e7e9b",
+ "clientId" : "zuul",
+ "rootUrl" : "http://localhost:9000",
+ "adminUrl" : "http://localhost:9000",
+ "surrogateAuthRequired" : false,
+ "enabled" : true,
+ "alwaysDisplayInConsole" : false,
+ "clientAuthenticatorType" : "client-secret",
+ "redirectUris" : [ "http://localhost:3000/*", "http://localhost:9000/*" ],
+ "webOrigins" : [ "*" ],
+ "notBefore" : 0,
+ "bearerOnly" : false,
+ "consentRequired" : false,
+ "standardFlowEnabled" : true,
+ "implicitFlowEnabled" : true,
+ "directAccessGrantsEnabled" : true,
+ "serviceAccountsEnabled" : false,
+ "publicClient" : true,
+ "frontchannelLogout" : false,
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "saml.force.post.binding" : "false",
+ "saml.multivalued.roles" : "false",
+ "frontchannel.logout.session.required" : "false",
+ "oauth2.device.authorization.grant.enabled" : "false",
+ "backchannel.logout.revoke.offline.tokens" : "false",
+ "saml.server.signature.keyinfo.ext" : "false",
+ "use.refresh.tokens" : "true",
+ "oidc.ciba.grant.enabled" : "false",
+ "backchannel.logout.session.required" : "true",
+ "client_credentials.use_refresh_token" : "false",
+ "require.pushed.authorization.requests" : "false",
+ "saml.client.signature" : "false",
+ "saml.allow.ecp.flow" : "false",
+ "id.token.as.detached.signature" : "false",
+ "saml.assertion.signature" : "false",
+ "saml.encrypt" : "false",
+ "saml.server.signature" : "false",
+ "exclude.session.state.from.auth.response" : "false",
+ "saml.artifact.binding" : "false",
+ "saml_force_name_id_format" : "false",
+ "acr.loa.map" : "{}",
+ "tls.client.certificate.bound.access.tokens" : "false",
+ "saml.authnstatement" : "false",
+ "display.on.consent.screen" : "false",
+ "token.response.type.bearer.lower-case" : "false",
+ "saml.onetimeuse.condition" : "false"
},
- {
- "id": "0e26f9c0-bc34-4d38-b3fe-472580bff946",
- "alias": "first broker login",
- "description": "Actions taken after first broker login with identity provider account, which is not yet linked to any Keycloak account",
- "providerId": "basic-flow",
- "topLevel": true,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticatorConfig": "review profile config",
- "authenticator": "idp-review-profile",
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "requirement": "REQUIRED",
- "priority": 20,
- "flowAlias": "User creation or linking",
- "userSetupAllowed": false,
- "autheticatorFlow": true
- }
- ]
+ "authenticationFlowBindingOverrides" : { },
+ "fullScopeAllowed" : true,
+ "nodeReRegistrationTimeout" : -1,
+ "protocolMappers" : [ {
+ "id" : "ab67e3ef-562f-4cfa-96ad-02d9e29ed483",
+ "name" : "groups",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-realm-role-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "multivalued" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "foo",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "groups",
+ "jsonType.label" : "String"
+ }
+ } ],
+ "defaultClientScopes" : [ "web-origins", "acr", "roles", "profile", "zuul_aud", "email" ],
+ "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ]
+ } ],
+ "clientScopes" : [ {
+ "id" : "f9da357f-356a-45a7-8ad8-b0e47413c30e",
+ "name" : "web-origins",
+ "description" : "OpenID Connect scope for add allowed web origins to the access token",
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "include.in.token.scope" : "false",
+ "display.on.consent.screen" : "false",
+ "consent.screen.text" : ""
},
- {
- "id": "6f56d749-5f06-4e2a-a043-cd4103383899",
- "alias": "forms",
- "description": "Username, password, otp and other auth forms.",
- "providerId": "basic-flow",
- "topLevel": false,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "auth-username-password-form",
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "requirement": "CONDITIONAL",
- "priority": 20,
- "flowAlias": "Browser - Conditional OTP",
- "userSetupAllowed": false,
- "autheticatorFlow": true
- }
- ]
+ "protocolMappers" : [ {
+ "id" : "2f31c90f-8237-4a54-b852-a2df857c6fc8",
+ "name" : "allowed web origins",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-allowed-origins-mapper",
+ "consentRequired" : false,
+ "config" : { }
+ } ]
+ }, {
+ "id" : "554bde36-edad-4c3b-a2f8-1461ad4181c8",
+ "name" : "role_list",
+ "description" : "SAML role list",
+ "protocol" : "saml",
+ "attributes" : {
+ "consent.screen.text" : "${samlRoleListScopeConsentText}",
+ "display.on.consent.screen" : "true"
},
- {
- "id": "4a95b320-312e-468a-978e-215747302385",
- "alias": "http challenge",
- "description": "An authentication flow based on challenge-response HTTP Authentication Schemes",
- "providerId": "basic-flow",
- "topLevel": true,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "no-cookie-redirect",
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "requirement": "REQUIRED",
- "priority": 20,
- "flowAlias": "Authentication Options",
- "userSetupAllowed": false,
- "autheticatorFlow": true
- }
- ]
+ "protocolMappers" : [ {
+ "id" : "ab8dfb24-9c7e-4018-bafe-ef3fc2dd10c6",
+ "name" : "role list",
+ "protocol" : "saml",
+ "protocolMapper" : "saml-role-list-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "single" : "false",
+ "attribute.nameformat" : "Basic",
+ "attribute.name" : "Role"
+ }
+ } ]
+ }, {
+ "id" : "c68d1141-1188-4adb-9c88-033ea1bff03a",
+ "name" : "address",
+ "description" : "OpenID Connect built-in scope: address",
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "include.in.token.scope" : "true",
+ "display.on.consent.screen" : "true",
+ "consent.screen.text" : "${addressScopeConsentText}"
},
- {
- "id": "17678e79-9819-47f8-bbfe-3b68efb92f3d",
- "alias": "registration",
- "description": "registration flow",
- "providerId": "basic-flow",
- "topLevel": true,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "registration-page-form",
- "requirement": "REQUIRED",
- "priority": 10,
- "flowAlias": "registration form",
- "userSetupAllowed": false,
- "autheticatorFlow": true
- }
- ]
+ "protocolMappers" : [ {
+ "id" : "e97f7b55-12d6-40cb-9e60-b0cee354ae8f",
+ "name" : "address",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-address-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "user.attribute.formatted" : "formatted",
+ "user.attribute.country" : "country",
+ "user.attribute.postal_code" : "postal_code",
+ "userinfo.token.claim" : "true",
+ "user.attribute.street" : "street",
+ "id.token.claim" : "true",
+ "user.attribute.region" : "region",
+ "access.token.claim" : "true",
+ "user.attribute.locality" : "locality"
+ }
+ } ]
+ }, {
+ "id" : "18ceed25-cdb0-4911-8419-b8228d5947a2",
+ "name" : "zuul_aud",
+ "description" : "zuul audience mapper",
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "include.in.token.scope" : "true",
+ "display.on.consent.screen" : "true"
},
- {
- "id": "7c23bfaa-420a-4975-a547-254bb0873457",
- "alias": "registration form",
- "description": "registration form",
- "providerId": "form-flow",
- "topLevel": false,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "registration-user-creation",
- "requirement": "REQUIRED",
- "priority": 20,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "registration-profile-action",
- "requirement": "REQUIRED",
- "priority": 40,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "registration-password-action",
- "requirement": "REQUIRED",
- "priority": 50,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "registration-recaptcha-action",
- "requirement": "DISABLED",
- "priority": 60,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- }
- ]
+ "protocolMappers" : [ {
+ "id" : "e54ce7f5-fb11-425f-ad3a-628db83c1ef2",
+ "name" : "zuul_aud_mapper",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-audience-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "included.client.audience" : "zuul",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "userinfo.token.claim" : "true"
+ }
+ } ]
+ }, {
+ "id" : "1f3ab062-a2bd-4929-9a49-434fa94b7f55",
+ "name" : "microprofile-jwt",
+ "description" : "Microprofile - JWT built-in scope",
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "include.in.token.scope" : "true",
+ "display.on.consent.screen" : "false"
},
- {
- "id": "ef21d1d8-4afd-4baf-a44d-34d657f673a4",
- "alias": "reset credentials",
- "description": "Reset credentials for a user if they forgot their password or something",
- "providerId": "basic-flow",
- "topLevel": true,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "reset-credentials-choose-user",
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "reset-credential-email",
- "requirement": "REQUIRED",
- "priority": 20,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "reset-password",
- "requirement": "REQUIRED",
- "priority": 30,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "requirement": "CONDITIONAL",
- "priority": 40,
- "flowAlias": "Reset - Conditional OTP",
- "userSetupAllowed": false,
- "autheticatorFlow": true
- }
- ]
+ "protocolMappers" : [ {
+ "id" : "80212ba7-8894-4b23-b73c-b29fb6157c41",
+ "name" : "groups",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-realm-role-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "multivalued" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "foo",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "groups",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "1abd1cea-5b14-41ef-b865-bb81af679932",
+ "name" : "upn",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-property-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "username",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "upn",
+ "jsonType.label" : "String"
+ }
+ } ]
+ }, {
+ "id" : "220b27ee-6e55-49c0-86a7-e2f915166bc7",
+ "name" : "phone",
+ "description" : "OpenID Connect built-in scope: phone",
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "include.in.token.scope" : "true",
+ "display.on.consent.screen" : "true",
+ "consent.screen.text" : "${phoneScopeConsentText}"
},
- {
- "id": "21fea2f5-c4e3-46af-a573-54f36aa25b4b",
- "alias": "saml ecp",
- "description": "SAML ECP Profile Authentication Flow",
- "providerId": "basic-flow",
- "topLevel": true,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "http-basic-authenticator",
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- }
- ]
- }
- ],
- "authenticatorConfig": [
- {
- "id": "d093ee16-2996-4916-ba26-827877401a45",
- "alias": "create unique user config",
- "config": {
- "require.password.update.after.registration": "false"
+ "protocolMappers" : [ {
+ "id" : "82f49e59-01d9-4435-9d57-8b51ba068f95",
+ "name" : "phone number",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "phoneNumber",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "phone_number",
+ "jsonType.label" : "String"
}
+ }, {
+ "id" : "4b7d2541-a139-4f35-8b0a-7f786abf8e25",
+ "name" : "phone number verified",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "phoneNumberVerified",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "phone_number_verified",
+ "jsonType.label" : "boolean"
+ }
+ } ]
+ }, {
+ "id" : "f862a715-e18d-491f-ad37-0c77253e1519",
+ "name" : "email",
+ "description" : "OpenID Connect built-in scope: email",
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "include.in.token.scope" : "true",
+ "display.on.consent.screen" : "true",
+ "consent.screen.text" : "${emailScopeConsentText}"
},
- {
- "id": "9cf393f2-4659-473a-a1d8-2318e107fcfe",
- "alias": "review profile config",
- "config": {
- "update.profile.on.first.login": "missing"
+ "protocolMappers" : [ {
+ "id" : "195a1039-aeca-4e57-888b-1a1e802fa64d",
+ "name" : "email",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-property-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "email",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "email",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "4ccb27c0-2574-48b7-92bd-ec246306a944",
+ "name" : "email verified",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-property-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "emailVerified",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "email_verified",
+ "jsonType.label" : "boolean"
}
+ } ]
+ }, {
+ "id" : "a03e0161-18f1-4d82-8482-4c6b1b6803bf",
+ "name" : "offline_access",
+ "description" : "OpenID Connect built-in scope: offline_access",
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "consent.screen.text" : "${offlineAccessScopeConsentText}",
+ "display.on.consent.screen" : "true"
}
- ],
- "requiredActions": [
- {
- "alias": "CONFIGURE_TOTP",
- "name": "Configure OTP",
- "providerId": "CONFIGURE_TOTP",
- "enabled": true,
- "defaultAction": false,
- "priority": 10,
- "config": {}
- },
- {
- "alias": "terms_and_conditions",
- "name": "Terms and Conditions",
- "providerId": "terms_and_conditions",
- "enabled": false,
- "defaultAction": false,
- "priority": 20,
- "config": {}
- },
- {
- "alias": "UPDATE_PASSWORD",
- "name": "Update Password",
- "providerId": "UPDATE_PASSWORD",
- "enabled": true,
- "defaultAction": false,
- "priority": 30,
- "config": {}
+ }, {
+ "id" : "3bc63b52-838d-48bc-b0b6-b0805901c4b0",
+ "name" : "roles",
+ "description" : "OpenID Connect scope for add user roles to the access token",
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "include.in.token.scope" : "false",
+ "display.on.consent.screen" : "true",
+ "consent.screen.text" : "${rolesScopeConsentText}"
},
- {
- "alias": "UPDATE_PROFILE",
- "name": "Update Profile",
- "providerId": "UPDATE_PROFILE",
- "enabled": true,
- "defaultAction": false,
- "priority": 40,
- "config": {}
- },
- {
- "alias": "VERIFY_EMAIL",
- "name": "Verify Email",
- "providerId": "VERIFY_EMAIL",
- "enabled": true,
- "defaultAction": false,
- "priority": 50,
- "config": {}
+ "protocolMappers" : [ {
+ "id" : "f654cdcf-ad35-483d-bc9a-36e27cf2d459",
+ "name" : "client roles",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-client-role-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "user.attribute" : "foo",
+ "access.token.claim" : "true",
+ "claim.name" : "resource_access.${client_id}.roles",
+ "jsonType.label" : "String",
+ "multivalued" : "true"
+ }
+ }, {
+ "id" : "f6b687b6-94d6-4cfd-b167-eac16d07d1ff",
+ "name" : "audience resolve",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-audience-resolve-mapper",
+ "consentRequired" : false,
+ "config" : { }
+ }, {
+ "id" : "f59d4345-6702-43ca-82d9-dc2d60c9b66e",
+ "name" : "realm roles",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-realm-role-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "user.attribute" : "foo",
+ "access.token.claim" : "true",
+ "claim.name" : "realm_access.roles",
+ "jsonType.label" : "String",
+ "multivalued" : "true"
+ }
+ } ]
+ }, {
+ "id" : "6cdcdd5e-8a80-4366-b38f-49005db03f27",
+ "name" : "acr",
+ "description" : "OpenID Connect scope for add acr (authentication context class reference) to the token",
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "include.in.token.scope" : "false",
+ "display.on.consent.screen" : "false"
},
- {
- "alias": "delete_account",
- "name": "Delete Account",
- "providerId": "delete_account",
- "enabled": false,
- "defaultAction": false,
- "priority": 60,
- "config": {}
+ "protocolMappers" : [ {
+ "id" : "941b04f7-0f19-49b5-a11b-0790dcf83e3a",
+ "name" : "acr loa level",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-acr-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "userinfo.token.claim" : "true"
+ }
+ } ]
+ }, {
+ "id" : "197b457a-28ff-48c2-a879-be4eceeeaed6",
+ "name" : "profile",
+ "description" : "OpenID Connect built-in scope: profile",
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "include.in.token.scope" : "true",
+ "display.on.consent.screen" : "true",
+ "consent.screen.text" : "${profileScopeConsentText}"
},
- {
- "alias": "update_user_locale",
- "name": "Update User Locale",
- "providerId": "update_user_locale",
- "enabled": true,
- "defaultAction": false,
- "priority": 1000,
- "config": {}
+ "protocolMappers" : [ {
+ "id" : "8247fb9a-2a89-4491-ae97-9a3ef846a32d",
+ "name" : "family name",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-property-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "lastName",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "family_name",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "7b71b659-4929-454d-a2f1-9e84c3ebd970",
+ "name" : "middle name",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "middleName",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "middle_name",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "58bbcd2b-77a8-4a98-b51e-b9802b0d300c",
+ "name" : "zoneinfo",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "zoneinfo",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "zoneinfo",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "2bdf1469-3ce1-408d-a6db-616a687efd20",
+ "name" : "picture",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "picture",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "picture",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "ee34f510-aa37-47f0-81b6-eee4d0bd2073",
+ "name" : "given name",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-property-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "firstName",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "given_name",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "a7e5ad5f-afe7-4e10-833a-db4ca4502083",
+ "name" : "nickname",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "nickname",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "nickname",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "6731543a-4fd5-4064-8cd6-438d59f07d98",
+ "name" : "birthdate",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "birthdate",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "birthdate",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "dfbc8ef9-be5e-476b-a4cb-8a4130b00ad7",
+ "name" : "website",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "website",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "website",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "3c2b96fc-fcff-4847-b7a5-6c915adad250",
+ "name" : "updated at",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "updatedAt",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "updated_at",
+ "jsonType.label" : "long"
+ }
+ }, {
+ "id" : "6487b361-8548-4131-9636-f5e6c1db962d",
+ "name" : "gender",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "gender",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "gender",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "4e93de0c-7f96-499e-8014-fc260fd82960",
+ "name" : "full name",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-full-name-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "userinfo.token.claim" : "true"
+ }
+ }, {
+ "id" : "7e202343-ae40-4149-985b-3f4cbf9b1588",
+ "name" : "username",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-property-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "username",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "preferred_username",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "e9175df7-260b-4fe7-8655-db30ccc9c424",
+ "name" : "locale",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "locale",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "locale",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "59663d46-72dd-4ea6-b106-7a264d01ebcb",
+ "name" : "profile",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "profile",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "profile",
+ "jsonType.label" : "String"
+ }
+ } ]
+ } ],
+ "defaultDefaultClientScopes" : [ "profile", "roles", "role_list", "acr", "email", "web-origins" ],
+ "defaultOptionalClientScopes" : [ "microprofile-jwt", "phone", "offline_access", "address" ],
+ "browserSecurityHeaders" : {
+ "contentSecurityPolicyReportOnly" : "",
+ "xContentTypeOptions" : "nosniff",
+ "xRobotsTag" : "none",
+ "xFrameOptions" : "SAMEORIGIN",
+ "contentSecurityPolicy" : "frame-src 'self'; frame-ancestors 'self'; object-src 'none';",
+ "xXSSProtection" : "1; mode=block",
+ "strictTransportSecurity" : "max-age=31536000; includeSubDomains"
+ },
+ "smtpServer" : { },
+ "eventsEnabled" : false,
+ "eventsListeners" : [ "jboss-logging" ],
+ "enabledEventTypes" : [ ],
+ "adminEventsEnabled" : false,
+ "adminEventsDetailsEnabled" : false,
+ "identityProviders" : [ ],
+ "identityProviderMappers" : [ ],
+ "components" : {
+ "org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy" : [ {
+ "id" : "c6df0a44-af38-4795-8990-ffc359a2b62b",
+ "name" : "Consent Required",
+ "providerId" : "consent-required",
+ "subType" : "anonymous",
+ "subComponents" : { },
+ "config" : { }
+ }, {
+ "id" : "fa50952d-682b-4bf3-936c-2e35abfd810a",
+ "name" : "Allowed Client Scopes",
+ "providerId" : "allowed-client-templates",
+ "subType" : "authenticated",
+ "subComponents" : { },
+ "config" : {
+ "allow-default-scopes" : [ "true" ]
+ }
+ }, {
+ "id" : "adb59412-5ad2-4531-bcde-cdd3048e8698",
+ "name" : "Max Clients Limit",
+ "providerId" : "max-clients",
+ "subType" : "anonymous",
+ "subComponents" : { },
+ "config" : {
+ "max-clients" : [ "200" ]
+ }
+ }, {
+ "id" : "270f6a69-5b86-4a4b-b54c-1900ea3d325d",
+ "name" : "Allowed Protocol Mapper Types",
+ "providerId" : "allowed-protocol-mappers",
+ "subType" : "anonymous",
+ "subComponents" : { },
+ "config" : {
+ "allowed-protocol-mapper-types" : [ "oidc-sha256-pairwise-sub-mapper", "oidc-full-name-mapper", "saml-user-attribute-mapper", "oidc-usermodel-property-mapper", "saml-role-list-mapper", "oidc-address-mapper", "saml-user-property-mapper", "oidc-usermodel-attribute-mapper" ]
+ }
+ }, {
+ "id" : "a107bb7f-7b95-4c80-bf36-0793913507b9",
+ "name" : "Trusted Hosts",
+ "providerId" : "trusted-hosts",
+ "subType" : "anonymous",
+ "subComponents" : { },
+ "config" : {
+ "host-sending-registration-request-must-match" : [ "true" ],
+ "client-uris-must-match" : [ "true" ]
+ }
+ }, {
+ "id" : "5e3c37e6-455a-4cab-9058-59d7ba1e6a91",
+ "name" : "Full Scope Disabled",
+ "providerId" : "scope",
+ "subType" : "anonymous",
+ "subComponents" : { },
+ "config" : { }
+ }, {
+ "id" : "829ff854-352f-453e-ae71-b3ed893167e5",
+ "name" : "Allowed Protocol Mapper Types",
+ "providerId" : "allowed-protocol-mappers",
+ "subType" : "authenticated",
+ "subComponents" : { },
+ "config" : {
+ "allowed-protocol-mapper-types" : [ "saml-role-list-mapper", "saml-user-property-mapper", "oidc-full-name-mapper", "oidc-address-mapper", "oidc-usermodel-property-mapper", "oidc-usermodel-attribute-mapper", "saml-user-attribute-mapper", "oidc-sha256-pairwise-sub-mapper" ]
+ }
+ }, {
+ "id" : "eb1f66db-d2a2-435f-958d-f385db20740e",
+ "name" : "Allowed Client Scopes",
+ "providerId" : "allowed-client-templates",
+ "subType" : "anonymous",
+ "subComponents" : { },
+ "config" : {
+ "allow-default-scopes" : [ "true" ]
+ }
+ } ],
+ "org.keycloak.keys.KeyProvider" : [ {
+ "id" : "34336282-9f58-471a-9794-440b180296aa",
+ "name" : "rsa-generated",
+ "providerId" : "rsa-generated",
+ "subComponents" : { },
+ "config" : {
+ "privateKey" : [ "MIIEowIBAAKCAQEA0fI5OZ/LCxI/TNxVpWi9q6EeaOv/yshrPOFevhg5eJ52G2uzvv7XWN4FNWMg3ln97qmZPm6PvB6utCSM776WZ5O3t1zy6KXc5LKRSF9WW/RdoLlrIAvo9R2XRpdClfc4906Dl8q8NlxC6klVkP5OwTzuH9fh36qf2BAb39F6AhosY8lfWiE7+QpF7CEvYkZTdp02PtqbV2R7DMjzhPs3aLLbJybu9BVfsdNbHdsk6owauJMtvJhIvcigk5azUk6leVp27010zv+DuWVtbMhzX+qnYy4+SnkyfKPPX1lYtQzw6pDTJuWTjcpSKgZ/68xKyVQWzNqsrSZyGWXEtmsTvwIDAQABAoIBABZMpRliyJ0/bevLB2nPSz4cme9JCd1PFlzcD0Ufq5MNObxF30ytItB0nJcEFWyooFkmOHmyIqA3nhTSQQoB81XDEeNvAvoFDAZalSXbwn934C3/I8q+mRrX7sZ3sIHfRXS3KTEJPp6DhDQAYA9Lg6/wudY2Bu7L37iCVYOba1snnUFaqSGzBqkx68SisYUpjj9LpBHwgoAO4UwTzijN6UUS0MwpxJ1Y10A3c5v3XfzAYTm9FhzT5TyrO6NgXCQIbfC5tbTdSPXbsrYiNucmqlqB/Ym/f1KSM8peBQSFt8h0yjjeVRYe2/oVfiWeDeBHdYZCCpY20RJtSKjScOcwFNkCgYEA8G3xS8DfTZonCx4mR/SU+9Yjx8KU+g/erRHhwUHATY0zV+usz/ZTBz7wfVSBLQ7MDzpbpjOVF0CjFeNgI3kS4ju0smEylwZ8ghlDa578ITArV5Wb9uECdu86ZzNzugeoGx5pZYEkqEvO1MfS3tecX8h02eCwvUCZ26WJTDu1ev0CgYEA34rmzlXqDyrBENvwKNvfL/NfTpQ6lLfAAirRov8UvKjtcRo131PDIfGzsFDMrN3640rKyY1HOiW2SDYK0NrLOmPxzitcXxVjBtqcI879qAQeMWYLdFA3R7kJE1hn8aNoC+hzjpUYjaoBXZFqQrw+HvEl0UTRErhn2FCpnnuhHGsCgYB4zqVp7PXHJmfr3DBcA3dAuy6rVwhIReUbjVqkIoef8A0WZmMk855wi52HPAjUPRUnqakXb9/AGUhY3TEXYeStLFb1MoWbATVaoZsQ3ofNnUiJ77C4cgMtA7OS23WQyfwb9EH9MNDch4rbu7QnKKt4LV8Zgx8LWQR2K007stzTeQKBgEv7ZqBTy48ENUOJvoPk2GPwEUEgWRkbrAQQkdkZYu8NbEe5ZP5X9kefZDhV/nvzp8eCMJN5lfBJyT+aPurms5VRS2uMiYU4O8SkodX6EXX+kFSyHsqWSXPzjQYqUoprxH3nsP+R5hqg4n3vY3LzkRnrVbNf9MCsNX/tSvo3g3epAoGBAM50hFFzEo6V+Tk+grZfGI47vTmQ0w+oTtImHsu6kD8fMbfP/+eq28n5BnI7yBK0kmP5Z2pOByHQfc0Dn90O7J1kwaxi4URwNUIFmWfofL11fRFtRHALH/U/LiFprkDwnmjp8qt8MutlyElcpyuDCKFWidq8lx4CfqnINzFfdWh7" ],
+ "keyUse" : [ "SIG" ],
+ "certificate" : [ "MIICoTCCAYkCBgGCJXQ9oDANBgkqhkiG9w0BAQsFADAUMRIwEAYDVQQDDAl6dXVsLWRlbW8wHhcNMjIwNzIyMTAyNzMxWhcNMzIwNzIyMTAyOTExWjAUMRIwEAYDVQQDDAl6dXVsLWRlbW8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDR8jk5n8sLEj9M3FWlaL2roR5o6//KyGs84V6+GDl4nnYba7O+/tdY3gU1YyDeWf3uqZk+bo+8Hq60JIzvvpZnk7e3XPLopdzkspFIX1Zb9F2guWsgC+j1HZdGl0KV9zj3ToOXyrw2XELqSVWQ/k7BPO4f1+Hfqp/YEBvf0XoCGixjyV9aITv5CkXsIS9iRlN2nTY+2ptXZHsMyPOE+zdostsnJu70FV+x01sd2yTqjBq4ky28mEi9yKCTlrNSTqV5WnbvTXTO/4O5ZW1syHNf6qdjLj5KeTJ8o89fWVi1DPDqkNMm5ZONylIqBn/rzErJVBbM2qytJnIZZcS2axO/AgMBAAEwDQYJKoZIhvcNAQELBQADggEBAKYr1dxc8eMlgaZWXvd4vbP1ugbqUswt3kgBbrrFmzfzocU1/Hd0f5YW5ziq1oBqB2Ke6ByTt5h7M4q5ss+w6Gb3bLyNV9wmP1SQO0JBk0TvRo7CId68SZwAPNH4Bmo5z9efhdvvDevnM79bKw65D/xu3t4YPUAOHfd+idVQkk38DWdmKSFz/4VZ2luNrQFBQS0KW39K30BaR/65xGRlefNKVqYBFYDb4u9QUfiD6Q4jckXPCMEKgOD4oGlUmHnmTufoRzH9W0jqOy5856gHgXD7+lJtvRjj+alHJ4on7ABk+yPSgEuI3WCVSITGd0KW5gaB8YjyhG7NAV4rKXpPv20=" ],
+ "priority" : [ "100" ]
+ }
+ }, {
+ "id" : "558fe888-18c5-48e2-9c45-a072532315f7",
+ "name" : "hmac-generated",
+ "providerId" : "hmac-generated",
+ "subComponents" : { },
+ "config" : {
+ "kid" : [ "bed016a0-d455-4ef2-827a-e5deb8569f3e" ],
+ "secret" : [ "0Aph42iALP396xPal2boz2dTNi9j8gculw6H_g6ohYO1vdJdwjBUsH-GD-GCBQk49Rtxa1yNZDWrr1f-2inGfw" ],
+ "priority" : [ "100" ],
+ "algorithm" : [ "HS256" ]
+ }
+ }, {
+ "id" : "67d8a3df-b709-4726-a929-e592530f7889",
+ "name" : "rsa-enc-generated",
+ "providerId" : "rsa-enc-generated",
+ "subComponents" : { },
+ "config" : {
+ "privateKey" : [ "MIIEpAIBAAKCAQEAjXU8U4JzDj2z5+L/kAuBZGayBnqwbsRaafkQcDf2OztpEaqPZt9KbQtK7x9eev4VkXepRl6FhNgfqTfwlLWd9CQZl5dXgKXC/9kZo4WhNiKfRpFdfcFZTULKJWROgPddx8pz3tw9yU4wZDrAA5wGo6qC9v7QMu4A/ARTpGjl5gRnEFDswM9OuHGqd7oAxCskn0XPVbOVcAbs2KPB7jNopyuGsUpox3uxv79sAjEMY64Y/Da9lkBZBpCkh8v3hZtGAQTvGf4VZLx8e00U1BrKomuJuBMvaCBrnyFHGGpVxF/f4oFBcVVceJOxIamuW7ZEpWP3uLMqZhs5N02jKEHsMwIDAQABAoIBADxYhRHDFr4+iF8mMYwLvHlObifhcx7t2PxYajDVTs/Z+mq07lQecauvI5p7MV0aw6y49Ze1fxQ69tbDrHhkOiwKsng+8e9Jx7RJs2xU938Wqgf6v32EXEpfcckdz3epD3LJ5UBviFQ2bOJ1RbDEgPiVJyWjcsInUngwiFYdAeZr2oWbdTovPI5bvJFi2uAjbqgMXz4FyVrQshZFpSHNVEeuRowjfmnMVjRD2KFNG4rvF7Cs6yp4/NZ0z4FtyRp+Nw0n7tb1uri2/RSPeSt0pXKRbVtiIVd6NwX4e403SSK2orF01WWSVBbw7BnDZBgwtiY38QkYy9PJp1KlwDGC8bECgYEA2gW//RAIA6+vWktD2ru4LYPZ0237W5C8nWRrGZG+jqlSQIxW5t14NTCte/Mlz1Ixyolj0n4Vqe3p3PYp5kgrpQ/2WcS4St3LQgr+apLO8LNLQpn2/CfbAYRq5MfOyXvC0fTyC39t0Zx/rz4CPbl9NEjRLYGW0+G+EkDeSD3VGM8CgYEAphlA5mi2PJttOL2nWovOhh6ZUM0spg+eSU9qDcQtmBwdhnApvv68viIDvJ/1Yhjg1xEndBUkxm6wppWrIKOJzWlrpqYxgMaesVBPIBeGjhs8CpEadCzFjBeHzLeckf9Tg5uOq/zud8i2O/2gdsW+O/mgXebPFaDKarNJ/RFBx10CgYAbqjceaXZa4WQi1QIbM06/l8eAKKiIieklH6TnbbL8b0fcoPI2AUxLk42v+L6HfCqNRLnB7/XXxjSysRnH+shu/YOJCIlKFrLAAp0d8NsJd/bI0Liibnw/yQm3VhNLRcUG10oPY3AP9QfOuNOX+X2FsOe6GoOFB1QTBOAv0ojDyQKBgQChViJOLCPnlululfl64BYI/KvbapAV9VHAz9yp5oaLG7QqI8TI+tMGtC+BBrbpRFURUl5KSUdhX59DEFoa5/8wgVfJleC7vzHh9aoF+BQA8L9PXEaf1eVFAI4t8aOpxKKwUWcx9AsGWvV4LBGzjLwNsZlt3IYF8hrrrZ8Oq7aDGQKBgQDMDce7sMLGSI2rZcPmn15DqBxKr9fmtHH1/DGGvXlYNcI2UvzI5Lq7bOK4uu87NnHoKhSjd9EsENmFc0iYxf1F9r+3BGtYYLOWClLBhM7GXiQeGFKFGpXso7I2HVZUMpUDJaTmlmF3xlAb+VchOHvfCyFvTO4xMm7wnemDQ/ZJ+g==" ],
+ "keySize" : [ "2048" ],
+ "keyUse" : [ "ENC" ],
+ "certificate" : [ "MIICoTCCAYkCBgGCJXQ99zANBgkqhkiG9w0BAQsFADAUMRIwEAYDVQQDDAl6dXVsLWRlbW8wHhcNMjIwNzIyMTAyNzMxWhcNMzIwNzIyMTAyOTExWjAUMRIwEAYDVQQDDAl6dXVsLWRlbW8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCNdTxTgnMOPbPn4v+QC4FkZrIGerBuxFpp+RBwN/Y7O2kRqo9m30ptC0rvH156/hWRd6lGXoWE2B+pN/CUtZ30JBmXl1eApcL/2RmjhaE2Ip9GkV19wVlNQsolZE6A913HynPe3D3JTjBkOsADnAajqoL2/tAy7gD8BFOkaOXmBGcQUOzAz064cap3ugDEKySfRc9Vs5VwBuzYo8HuM2inK4axSmjHe7G/v2wCMQxjrhj8Nr2WQFkGkKSHy/eFm0YBBO8Z/hVkvHx7TRTUGsqia4m4Ey9oIGufIUcYalXEX9/igUFxVVx4k7Ehqa5btkSlY/e4sypmGzk3TaMoQewzAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAFIjuy2Aac1Y5jggKdRwZ8Xlg8S4B7RxmvNg15G8DX1m1PaAcb6aZ6lwDp78aEMxlpihn/G5mJ2MEmFL9Y95lJlCXlB0pHSGf4+vKJ6ZgZ9IUdP6tKyLsnCY+wR2Ag4444Upwd4yJGj3QBAArrdIezTOpEoPUn51j8KDJUXJXRkeJFE4Kgl5S3TmCGwvpCJQYfLjj9Lw60Evepi9fjaTjQxp16aDNHDvB/d+7VnJoZnj2ruU/N93FUaUgv4W2AAjcJj+9le8MGTIWLXezhCOgdDYRBMxTiBAwV+BbktXdQZiDvYyJp8tCxp0w9K3WNRgEX+2jS94+yYWMxKVVlHmtWA=" ],
+ "active" : [ "false" ],
+ "priority" : [ "100" ],
+ "enabled" : [ "false" ],
+ "algorithm" : [ "RSA-OAEP" ]
+ }
+ }, {
+ "id" : "18071daa-3312-45d7-9687-80f4b713b351",
+ "name" : "aes-generated",
+ "providerId" : "aes-generated",
+ "subComponents" : { },
+ "config" : {
+ "kid" : [ "ebdbe2a3-cac0-4ceb-a691-349f9a857a4a" ],
+ "secret" : [ "G77Dlvi7V6exa6LZZjv0Aw" ],
+ "priority" : [ "100" ]
+ }
+ } ]
+ },
+ "internationalizationEnabled" : false,
+ "supportedLocales" : [ ],
+ "authenticationFlows" : [ {
+ "id" : "905f0ff4-552b-41cd-a293-54615e1cca5e",
+ "alias" : "Account verification options",
+ "description" : "Method with which to verity the existing account",
+ "providerId" : "basic-flow",
+ "topLevel" : false,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "idp-email-verification",
+ "authenticatorFlow" : false,
+ "requirement" : "ALTERNATIVE",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticatorFlow" : true,
+ "requirement" : "ALTERNATIVE",
+ "priority" : 20,
+ "autheticatorFlow" : true,
+ "flowAlias" : "Verify Existing Account by Re-authentication",
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "56aefed5-e44b-418b-9acf-5c8ad5a99b38",
+ "alias" : "Authentication Options",
+ "description" : "Authentication options.",
+ "providerId" : "basic-flow",
+ "topLevel" : false,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "basic-auth",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "basic-auth-otp",
+ "authenticatorFlow" : false,
+ "requirement" : "DISABLED",
+ "priority" : 20,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "auth-spnego",
+ "authenticatorFlow" : false,
+ "requirement" : "DISABLED",
+ "priority" : 30,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "ee2217ce-1a43-45da-9e42-53e967301b68",
+ "alias" : "Browser - Conditional OTP",
+ "description" : "Flow to determine if the OTP is required for the authentication",
+ "providerId" : "basic-flow",
+ "topLevel" : false,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "conditional-user-configured",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "auth-otp-form",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 20,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "a2675999-6a95-4eda-b46b-b6c23f897bb7",
+ "alias" : "Direct Grant - Conditional OTP",
+ "description" : "Flow to determine if the OTP is required for the authentication",
+ "providerId" : "basic-flow",
+ "topLevel" : false,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "conditional-user-configured",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "direct-grant-validate-otp",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 20,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "7088d6ca-06a0-48bb-a2bb-dc0ecd21bae2",
+ "alias" : "First broker login - Conditional OTP",
+ "description" : "Flow to determine if the OTP is required for the authentication",
+ "providerId" : "basic-flow",
+ "topLevel" : false,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "conditional-user-configured",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "auth-otp-form",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 20,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "d5a6c5aa-aa28-4d8a-b5a1-2d0df85a9979",
+ "alias" : "Handle Existing Account",
+ "description" : "Handle what to do if there is existing account with same email/username like authenticated identity provider",
+ "providerId" : "basic-flow",
+ "topLevel" : false,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "idp-confirm-link",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticatorFlow" : true,
+ "requirement" : "REQUIRED",
+ "priority" : 20,
+ "autheticatorFlow" : true,
+ "flowAlias" : "Account verification options",
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "940b59eb-3977-4354-8ad0-a60a513a91ca",
+ "alias" : "Reset - Conditional OTP",
+ "description" : "Flow to determine if the OTP should be reset or not. Set to REQUIRED to force.",
+ "providerId" : "basic-flow",
+ "topLevel" : false,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "conditional-user-configured",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "reset-otp",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 20,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "653228d9-a3a7-41b1-b6c1-eaea8b2f4e87",
+ "alias" : "User creation or linking",
+ "description" : "Flow for the existing/non-existing user alternatives",
+ "providerId" : "basic-flow",
+ "topLevel" : false,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticatorConfig" : "create unique user config",
+ "authenticator" : "idp-create-user-if-unique",
+ "authenticatorFlow" : false,
+ "requirement" : "ALTERNATIVE",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticatorFlow" : true,
+ "requirement" : "ALTERNATIVE",
+ "priority" : 20,
+ "autheticatorFlow" : true,
+ "flowAlias" : "Handle Existing Account",
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "9c6a2dff-b711-4bbd-8606-d8939ba4d9ca",
+ "alias" : "Verify Existing Account by Re-authentication",
+ "description" : "Reauthentication of existing account",
+ "providerId" : "basic-flow",
+ "topLevel" : false,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "idp-username-password-form",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticatorFlow" : true,
+ "requirement" : "CONDITIONAL",
+ "priority" : 20,
+ "autheticatorFlow" : true,
+ "flowAlias" : "First broker login - Conditional OTP",
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "5c564dc9-1ea5-4977-ad52-eb6a1213b88e",
+ "alias" : "browser",
+ "description" : "browser based authentication",
+ "providerId" : "basic-flow",
+ "topLevel" : true,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "auth-cookie",
+ "authenticatorFlow" : false,
+ "requirement" : "ALTERNATIVE",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "auth-spnego",
+ "authenticatorFlow" : false,
+ "requirement" : "DISABLED",
+ "priority" : 20,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "identity-provider-redirector",
+ "authenticatorFlow" : false,
+ "requirement" : "ALTERNATIVE",
+ "priority" : 25,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticatorFlow" : true,
+ "requirement" : "ALTERNATIVE",
+ "priority" : 30,
+ "autheticatorFlow" : true,
+ "flowAlias" : "forms",
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "28f28120-2107-4cd5-a2bf-a139653db782",
+ "alias" : "clients",
+ "description" : "Base authentication for clients",
+ "providerId" : "client-flow",
+ "topLevel" : true,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "client-secret",
+ "authenticatorFlow" : false,
+ "requirement" : "ALTERNATIVE",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "client-jwt",
+ "authenticatorFlow" : false,
+ "requirement" : "ALTERNATIVE",
+ "priority" : 20,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "client-secret-jwt",
+ "authenticatorFlow" : false,
+ "requirement" : "ALTERNATIVE",
+ "priority" : 30,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "client-x509",
+ "authenticatorFlow" : false,
+ "requirement" : "ALTERNATIVE",
+ "priority" : 40,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "c7ccf556-1270-4adb-8c9a-d50d0370acda",
+ "alias" : "direct grant",
+ "description" : "OpenID Connect Resource Owner Grant",
+ "providerId" : "basic-flow",
+ "topLevel" : true,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "direct-grant-validate-username",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "direct-grant-validate-password",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 20,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticatorFlow" : true,
+ "requirement" : "CONDITIONAL",
+ "priority" : 30,
+ "autheticatorFlow" : true,
+ "flowAlias" : "Direct Grant - Conditional OTP",
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "2dd78821-8a10-4701-8131-22f02eeca193",
+ "alias" : "docker auth",
+ "description" : "Used by Docker clients to authenticate against the IDP",
+ "providerId" : "basic-flow",
+ "topLevel" : true,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "docker-http-basic-authenticator",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "3d5aad69-76b9-4859-8500-9ded3a096e22",
+ "alias" : "first broker login",
+ "description" : "Actions taken after first broker login with identity provider account, which is not yet linked to any Keycloak account",
+ "providerId" : "basic-flow",
+ "topLevel" : true,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticatorConfig" : "review profile config",
+ "authenticator" : "idp-review-profile",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticatorFlow" : true,
+ "requirement" : "REQUIRED",
+ "priority" : 20,
+ "autheticatorFlow" : true,
+ "flowAlias" : "User creation or linking",
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "ffd3082c-2a68-425c-a248-95fc076b211c",
+ "alias" : "forms",
+ "description" : "Username, password, otp and other auth forms.",
+ "providerId" : "basic-flow",
+ "topLevel" : false,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "auth-username-password-form",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticatorFlow" : true,
+ "requirement" : "CONDITIONAL",
+ "priority" : 20,
+ "autheticatorFlow" : true,
+ "flowAlias" : "Browser - Conditional OTP",
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "1fcb0e73-4ec2-4605-9e49-cc7588a6c818",
+ "alias" : "http challenge",
+ "description" : "An authentication flow based on challenge-response HTTP Authentication Schemes",
+ "providerId" : "basic-flow",
+ "topLevel" : true,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "no-cookie-redirect",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticatorFlow" : true,
+ "requirement" : "REQUIRED",
+ "priority" : 20,
+ "autheticatorFlow" : true,
+ "flowAlias" : "Authentication Options",
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "39102862-55f7-4134-be4f-918b2cbfa169",
+ "alias" : "registration",
+ "description" : "registration flow",
+ "providerId" : "basic-flow",
+ "topLevel" : true,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "registration-page-form",
+ "authenticatorFlow" : true,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : true,
+ "flowAlias" : "registration form",
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "27a49f8e-4a94-4818-991e-eefddf680431",
+ "alias" : "registration form",
+ "description" : "registration form",
+ "providerId" : "form-flow",
+ "topLevel" : false,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "registration-user-creation",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 20,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "registration-profile-action",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 40,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "registration-password-action",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 50,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "registration-recaptcha-action",
+ "authenticatorFlow" : false,
+ "requirement" : "DISABLED",
+ "priority" : 60,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "c3056f11-5d2d-4e77-9a17-94168854f540",
+ "alias" : "reset credentials",
+ "description" : "Reset credentials for a user if they forgot their password or something",
+ "providerId" : "basic-flow",
+ "topLevel" : true,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "reset-credentials-choose-user",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "reset-credential-email",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 20,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "reset-password",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 30,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticatorFlow" : true,
+ "requirement" : "CONDITIONAL",
+ "priority" : 40,
+ "autheticatorFlow" : true,
+ "flowAlias" : "Reset - Conditional OTP",
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "a91298df-ebf0-4c98-8587-6c680a2c4ccd",
+ "alias" : "saml ecp",
+ "description" : "SAML ECP Profile Authentication Flow",
+ "providerId" : "basic-flow",
+ "topLevel" : true,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "http-basic-authenticator",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ } ]
+ } ],
+ "authenticatorConfig" : [ {
+ "id" : "e1a83662-2baf-4955-bf07-6c3d50bc1196",
+ "alias" : "create unique user config",
+ "config" : {
+ "require.password.update.after.registration" : "false"
+ }
+ }, {
+ "id" : "d683f0f4-7685-40e1-9521-5761fdd9e111",
+ "alias" : "review profile config",
+ "config" : {
+ "update.profile.on.first.login" : "missing"
}
- ],
- "browserFlow": "browser",
- "registrationFlow": "registration",
- "directGrantFlow": "direct grant",
- "resetCredentialsFlow": "reset credentials",
- "clientAuthenticationFlow": "clients",
- "dockerAuthenticationFlow": "docker auth",
- "attributes": {
- "clientOfflineSessionMaxLifespan": "0",
- "clientSessionIdleTimeout": "0",
- "clientSessionMaxLifespan": "0",
- "clientOfflineSessionIdleTimeout": "0"
+ } ],
+ "requiredActions" : [ {
+ "alias" : "CONFIGURE_TOTP",
+ "name" : "Configure OTP",
+ "providerId" : "CONFIGURE_TOTP",
+ "enabled" : true,
+ "defaultAction" : false,
+ "priority" : 10,
+ "config" : { }
+ }, {
+ "alias" : "terms_and_conditions",
+ "name" : "Terms and Conditions",
+ "providerId" : "terms_and_conditions",
+ "enabled" : false,
+ "defaultAction" : false,
+ "priority" : 20,
+ "config" : { }
+ }, {
+ "alias" : "UPDATE_PASSWORD",
+ "name" : "Update Password",
+ "providerId" : "UPDATE_PASSWORD",
+ "enabled" : true,
+ "defaultAction" : false,
+ "priority" : 30,
+ "config" : { }
+ }, {
+ "alias" : "UPDATE_PROFILE",
+ "name" : "Update Profile",
+ "providerId" : "UPDATE_PROFILE",
+ "enabled" : true,
+ "defaultAction" : false,
+ "priority" : 40,
+ "config" : { }
+ }, {
+ "alias" : "VERIFY_EMAIL",
+ "name" : "Verify Email",
+ "providerId" : "VERIFY_EMAIL",
+ "enabled" : true,
+ "defaultAction" : false,
+ "priority" : 50,
+ "config" : { }
+ }, {
+ "alias" : "delete_account",
+ "name" : "Delete Account",
+ "providerId" : "delete_account",
+ "enabled" : false,
+ "defaultAction" : false,
+ "priority" : 60,
+ "config" : { }
+ }, {
+ "alias" : "update_user_locale",
+ "name" : "Update User Locale",
+ "providerId" : "update_user_locale",
+ "enabled" : true,
+ "defaultAction" : false,
+ "priority" : 1000,
+ "config" : { }
+ } ],
+ "browserFlow" : "browser",
+ "registrationFlow" : "registration",
+ "directGrantFlow" : "direct grant",
+ "resetCredentialsFlow" : "reset credentials",
+ "clientAuthenticationFlow" : "clients",
+ "dockerAuthenticationFlow" : "docker auth",
+ "attributes" : {
+ "cibaBackchannelTokenDeliveryMode" : "poll",
+ "cibaExpiresIn" : "120",
+ "cibaAuthRequestedUserHint" : "login_hint",
+ "oauth2DeviceCodeLifespan" : "600",
+ "clientOfflineSessionMaxLifespan" : "0",
+ "oauth2DevicePollingInterval" : "5",
+ "clientSessionIdleTimeout" : "0",
+ "parRequestUriLifespan" : "60",
+ "clientSessionMaxLifespan" : "0",
+ "clientOfflineSessionIdleTimeout" : "0",
+ "cibaInterval" : "5"
+ },
+ "keycloakVersion" : "18.0.2",
+ "userManagedAccessAllowed" : false,
+ "clientProfiles" : {
+ "profiles" : [ ]
},
- "keycloakVersion": "12.0.1",
- "userManagedAccessAllowed": false
-}
+ "clientPolicies" : {
+ "policies" : [ ]
+ }
+} \ No newline at end of file
diff --git a/doc/source/gating.rst b/doc/source/gating.rst
index e6b4fed47..325313b54 100644
--- a/doc/source/gating.rst
+++ b/doc/source/gating.rst
@@ -405,7 +405,21 @@ change in project C.
Cycles
~~~~~~
-If a cycle is created by use of cross-project dependencies, Zuul will
-abort its work very early. There will be no message in Gerrit and no
-changes that are part of the cycle will be enqueued into any pipeline.
-This is to protect Zuul from infinite loops.
+Zuul supports cycles that are created by use of cross-project dependencies.
+However this feature is opt-in and can be configured on the queue.
+See :attr:`queue.allow-circular-dependencies` for information on how to
+configure this.
+
+.. _global_repo_state:
+
+Global Repo State
+~~~~~~~~~~~~~~~~~
+
+If a git repository is used by at least one job for a queue item, then
+Zuul will freeze the repo state (i.e., branch heads and tags) and use
+that same state for every job run for that queue item. Not every job
+will get a git repo checkout of every repo, but for any repo that is
+checked out, it will have the same state. Because of this, authors
+can be sure that jobs running on the same queue item have a consistent
+view of all involved git repos, even if one job starts running much
+later than another.
diff --git a/doc/source/glossary.rst b/doc/source/glossary.rst
index 0d618203e..dc20ac7f7 100644
--- a/doc/source/glossary.rst
+++ b/doc/source/glossary.rst
@@ -357,23 +357,14 @@ Glossary
trusted execution context
Playbooks defined in a :term:`config-project` run in the
- *trusted* execution context. The trusted execution context has
- access to all Ansible features, including the ability to load
- custom Ansible modules.
+ *trusted* execution context. The trusted execution context may
+ have access to extra directories within the bubblewrap container
+ if the operator has configured these.
untrusted execution context
Playbooks defined in an :term:`untrusted-project` run in the
- *untrusted* execution context. Playbooks run in the untrusted
- execution context are not permitted to load additional Ansible
- modules or access files outside of the restricted environment
- prepared for them by the executor. In addition to the
- bubblewrap environment applied to both execution contexts, in
- the untrusted context some standard Ansible modules are replaced
- with versions which prohibit some actions, including attempts to
- access files outside of the restricted execution context. These
- redundant protections are made as part of a defense-in-depth
- strategy.
+ *untrusted* execution context.
untrusted-project
diff --git a/doc/source/howtos/nodepool_static.rst b/doc/source/howtos/nodepool_static.rst
index ff2d35d6a..c10672e7b 100644
--- a/doc/source/howtos/nodepool_static.rst
+++ b/doc/source/howtos/nodepool_static.rst
@@ -15,9 +15,9 @@ the following requirements:
* Must be reachable by Zuul executors and have SSH access enabled.
* Must have a user that Zuul can use for SSH.
-* Must have Python 2 installed for Ansible.
-* Must be reachable by Zuul executors over TCP port 19885 (console log
- streaming).
+* Must have an Ansible supported Python installed
+* Must be reachable by Zuul executors over TCP port 19885 for console
+ log streaming. See :ref:`nodepool_console_streaming`
When setting up your nodepool.yaml file, you will need the host keys
for each node for the ``host-key`` value. This can be obtained with
@@ -40,7 +40,7 @@ nodes. Place this file in ``/etc/nodepool/nodepool.yaml``:
- host: localhost
labels:
- - name: ubuntu-xenial
+ - name: ubuntu-jammy
providers:
- name: static-vms
@@ -49,14 +49,34 @@ nodes. Place this file in ``/etc/nodepool/nodepool.yaml``:
- name: main
nodes:
- name: 192.168.1.10
- labels: ubuntu-xenial
+ labels: ubuntu-jammy
host-key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGXqY02bdYqg1BcIf2x08zs60rS6XhlBSQ4qE47o5gb"
username: zuul
- name: 192.168.1.11
- labels: ubuntu-xenial
+ labels: ubuntu-jammy
host-key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGXqY02bdYqg1BcIf2x08zs60rS6XhlBSQ5sE47o5gc"
username: zuul
EOF"
Make sure that ``username``, ``host-key``, IP addresses and label names are
customized for your environment.
+
+.. _nodepool_console_streaming:
+
+Log streaming
+-------------
+
+The log streaming service enables Zuul to show the live status of
+long-running ``shell`` or ``command`` tasks. The server side is setup
+by the ``zuul_console:`` task built-in to Zuul's Ansible installation.
+The executor requires the ability to communicate with the job nodes on
+port 19885 for this to work.
+
+The log streaming service may leave files on the static node in the
+format ``/tmp/console-<uuid>-<task_id>-<host>.log`` if jobs are
+interrupted. These may be safely removed after a short period of
+inactivity with a command such as
+
+.. code-block:: shell
+
+ find /tmp -maxdepth 1 -name 'console-*-*-<host>.log' -mtime +2 -delete
diff --git a/doc/source/howtos/openid-with-keycloak.rst b/doc/source/howtos/openid-with-keycloak.rst
index e80376801..7fb258fea 100644
--- a/doc/source/howtos/openid-with-keycloak.rst
+++ b/doc/source/howtos/openid-with-keycloak.rst
@@ -10,7 +10,7 @@ Prerequisites
* The Zuul instance must be able to query Keycloak over HTTPS.
* Authenticating users must be able to reach Keycloak's web UI.
* Have a realm set up in Keycloak.
- `Instructions on how to do so can be found here <https://www.keycloak.org/docs/latest/getting_started/index.html#creating-a-realm-and-user>`_ .
+ `Instructions on how to do so can be found here <https://www.keycloak.org/docs/latest/server_admin/#configuring-realms>`_ .
By convention, we will assume the Keycloak server's FQDN is ``keycloak``, and
Zuul's Web UI's base URL is ``https://zuul/``. We will use the realm ``my_realm``.
@@ -73,6 +73,19 @@ Finally, go back to the clients list and pick the ``zuul`` client again. Click
on ``Client Scopes``, and add the ``zuul_aud`` scope to the ``Assigned Default
Client Scopes``.
+Configuring JWT signing algorithms
+..................................
+
+.. note::
+
+ Skip this step if you are using a keycloak version prior to 18.0.
+
+Due to current limitations with the pyJWT library, Zuul does not support every default
+signing algorithm used by Keycloak.
+
+Go to `my_realm->Settings->Keys`, then choose `rsa-enc-generated` (this should be mapped
+to "RSA-OAEP") if available. Then set `enabled` to false and save your changes.
+
(Optional) Set up a social identity provider
............................................
@@ -81,7 +94,7 @@ Keycloak can delegate authentication to predefined social networks. Follow
If you don't set up authentication delegation, make sure to create at least one
user in your realm, or allow self-registration. See Keycloak's documentation section
-on `user management <https://www.keycloak.org/docs/latest/server_admin/index.html#user-management>`_
+on `user management <https://www.keycloak.org/docs/latest/server_admin/index.html#assembly-managing-users_server_administration_guide>`_
for more details on how to do so.
Setting up Zuul
@@ -107,4 +120,4 @@ Further Reading
---------------
This How-To is based on `Keycloak's documentation <https://www.keycloak.org/documentation.html>`_,
-specifically `the documentation about clients <https://www.keycloak.org/docs/latest/server_admin/#_clients>`_.
+specifically `the documentation about clients <https://www.keycloak.org/docs/latest/server_admin/#assembly-managing-clients_server_administration_guide>`_.
diff --git a/doc/source/howtos/openid-with-microsoft.rst b/doc/source/howtos/openid-with-microsoft.rst
new file mode 100644
index 000000000..bf2992d46
--- /dev/null
+++ b/doc/source/howtos/openid-with-microsoft.rst
@@ -0,0 +1,84 @@
+Configuring Microsoft Authentication
+====================================
+
+This document explains how to configure Zuul in order to enable
+authentication with Microsoft Login.
+
+Prerequisites
+-------------
+
+* The Zuul instance must be able to query Microsoft's OAUTH API servers. This
+ simply generally means that the Zuul instance must be able to send and
+ receive HTTPS data to and from the Internet.
+* You must have an Active Directory instance in Azure and the ability
+ to create an App Registration.
+
+By convention, we will assume Zuul's Web UI's base URL is
+``https://zuul.example.com/``.
+
+Creating the App Registration
+-----------------------------
+
+Navigate to the Active Directory instance in Azure and select `App
+registrations` under ``Manage``. Select ``New registration``. This
+will open a dialog to register an application.
+
+Enter a name of your choosing (e.g., ``Zuul``), and select which
+account types should have access. Under ``Redirect URI`` select
+``Single-page application(SPA)`` and enter
+``https://zuul.example.com/auth_callback`` as the redirect URI. Press
+the ``Register`` button.
+
+You should now be at the overview of the Zuul App registration. This
+page displays several values which will be used later. Record the
+``Application (client) ID`` and ``Directory (tenant) ID``. When we need
+to construct values including these later, we will refer to them with
+all caps (e.g., ``CLIENT_ID`` and ``TENANT_ID`` respectively).
+
+Select ``Authentication`` under ``Manage``. You should see a
+``Single-page application`` section with the redirect URI previously
+configured during registration; if not, correct that now.
+
+Under ``Implicit grant and hybrid flows`` select both ``Access
+tokens`` and ``ID tokens``, then Save.
+
+Back at the Zuul App Registration menu, select ``Expose an API``, then
+press ``Set`` and then press ``Save`` to accept the default
+Application ID URI (it should look like ``api://CLIENT_ID``).
+
+Press ``Add a scope`` and enter ``zuul`` as the scope name. Enter
+``Access zuul`` for both the ``Admin consent display name`` and
+``Admin consent description``. Leave ``Who can consent`` set to
+``Admins only``, then press ``Add scope``.
+
+Optional: Include Groups Claim
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+In order to include group information in the token sent to Zuul,
+select ``Token configuration`` under ``Manage`` and then ``Add groups
+claim``.
+
+
+Setting up Zuul
+---------------
+
+Edit the ``/etc/zuul/zuul.conf`` to add the microsoft authenticator:
+
+.. code-block:: ini
+
+ [auth microsoft]
+ default=true
+ driver=OpenIDConnect
+ realm=zuul.example.com
+ authority=https://login.microsoftonline.com/TENANT_ID/v2.0
+ issuer_id=https://sts.windows.net/TENANT_ID/
+ client_id=CLIENT_ID
+ scope=openid profile api://CLIENT_ID/zuul
+ audience=api://CLIENT_ID
+ load_user_info=false
+
+Restart Zuul services (scheduler, web).
+
+Head to your tenant's status page. If all went well, you should see a
+`Sign in` button in the upper right corner of the
+page. Congratulations!
diff --git a/doc/source/installation.rst b/doc/source/installation.rst
index a9a526f13..17665ca76 100644
--- a/doc/source/installation.rst
+++ b/doc/source/installation.rst
@@ -10,11 +10,15 @@ Nodepool
~~~~~~~~
In order to run all but the simplest jobs, Zuul uses a companion
-program, Nodepool, to supply the nodes (whether dynamic cloud
-instances or static hardware) used by jobs. Before starting Zuul,
-ensure you have Nodepool installed and any images you require built.
-Zuul only makes one requirement of these nodes: that it be able to log
-in given a username and ssh private key.
+program `Nodepool <https://opendev.org/zuul/nodepool>`__ to supply the
+nodes (whether dynamic cloud instances or static hardware) used by
+jobs. Before starting Zuul, ensure you have Nodepool installed and
+any images you require built.
+
+Zuul must be able to log into the nodes provisioned by Nodepool with a
+given username and SSH private key. Executors should also be able to
+talk to nodes on TCP port 19885 for log streaming; see
+:ref:`nodepool_console_streaming`.
ZooKeeper
~~~~~~~~~
diff --git a/doc/source/job-content.rst b/doc/source/job-content.rst
index 48b8abbb8..75044cf1c 100644
--- a/doc/source/job-content.rst
+++ b/doc/source/job-content.rst
@@ -332,6 +332,11 @@ of item.
connectivity issues then previous attempts may have been cancelled,
and this value will be greater than 1.
+ .. var:: ansible_version
+
+ The version of the Ansible community package release used for executing
+ the job.
+
.. var:: project
The item's project. This is a data structure with the following
@@ -588,6 +593,10 @@ of item.
The target branch of the change (without the `refs/heads/` prefix).
+ .. var:: bundle_id
+
+ The id of the bundle if the change is in a circular dependency cycle.
+
.. var:: change
The identifier for the change.
@@ -1088,6 +1097,21 @@ For example:
pause: true
registry_ip_address: "{{ hostvars[groups.all[0]].ansible_host }}"
+Skipping retries
+~~~~~~~~~~~~~~~~
+
+It's possible to skip the retry caused by a failure in ``pre-run``
+by setting **zuul.retry** to ``false``.
+
+For example the following would skip retrying the build:
+
+.. code-block:: yaml
+
+ tasks:
+ - zuul_return:
+ data:
+ zuul:
+ retry: false
.. _build_status:
diff --git a/doc/source/monitoring.rst b/doc/source/monitoring.rst
index e185b82ad..1cb61ee01 100644
--- a/doc/source/monitoring.rst
+++ b/doc/source/monitoring.rst
@@ -110,7 +110,27 @@ These metrics are emitted by the Zuul :ref:`scheduler`:
operation(s). This will always include a request to a Zuul
merger to speculatively merge the change, but it may also
include a second request submitted in parallel to identify
- the files altered by the change.
+ the files altered by the change. Includes
+ :stat:`zuul.tenant.<tenant>.pipeline.<pipeline>.merger_merge_op_time`
+ and
+ :stat:`zuul.tenant.<tenant>.pipeline.<pipeline>.merger_files_changes_op_time`.
+
+ .. stat:: merger_merge_op_time
+ :type: timer
+
+ The amount of time the merger spent performing a merge
+ operation. This does not include any of the round-trip time
+ from the scheduler to the merger, or any other merge
+ operations.
+
+ .. stat:: merger_files_changes_op_time
+ :type: timer
+
+ The amount of time the merger spent performing a files-changes
+ operation to detect changed files (this is sometimes
+ performed if the source does not provide this information).
+ This does not include any of the round-trip time from the
+ scheduler to the merger, or any other merge operations.
.. stat:: layout_generation_time
:type: timer
@@ -128,7 +148,17 @@ These metrics are emitted by the Zuul :ref:`scheduler`:
The amount of time waiting for a secondary Zuul merger
operation to collect additional information about the repo
- state of required projects.
+ state of required projects. Includes
+ :stat:`zuul.tenant.<tenant>.pipeline.<pipeline>.merger_repo_state_op_time`.
+
+ .. stat:: merger_repo_state_op_time
+ :type: timer
+
+ The amount of time the merger spent performing a repo state
+ operation to collect additional information about the repo
+ state of required projects. This does not include any of the
+ round-trip time from the scheduler to the merger, or any
+ other merge operations.
.. stat:: node_request_time
:type: timer
@@ -506,10 +536,14 @@ These metrics are emitted by the Zuul :ref:`scheduler`:
reported as ``unknown``. This relates to
``zuul.nodepool.current_requests``.
- .. stat:: resources
+.. stat:: zuul.nodepool.resources
+
+ Holds metrics about resource usage by tenant or project if resources
+ of nodes are reported by nodepool.
- Holds metrics about resource usage by tenant or project if resources
- of nodes are reported by nodepool.
+ .. stat:: in_use
+
+ Holds metrics about resources currently in use by a build.
.. stat:: tenant
@@ -519,7 +553,7 @@ These metrics are emitted by the Zuul :ref:`scheduler`:
:type: counter, gauge
Counter with the summed usage by tenant as <resource> seconds and
- gauge with the currently used resources by tenant.
+ gauge with the currently in use resources by tenant.
.. stat:: project
@@ -531,6 +565,21 @@ These metrics are emitted by the Zuul :ref:`scheduler`:
Counter with the summed usage by project as <resource> seconds and
gauge with the currently used resources by project.
+ .. stat:: total
+
+ Holds metrics about resources allocated in total. This includes
+ resources that are currently in use, allocated but not yet in use, and
+ scheduled to be deleted.
+
+ .. stat:: tenant
+
+ Holds resource usage metrics by tenant.
+
+ .. stat:: <tenant>.<resource>
+ :type: gauge
+
+ Gauge with the currently used resources by tenant.
+
.. stat:: zuul.mergers
diff --git a/doc/source/tenants.rst b/doc/source/tenants.rst
index 7835eef46..fbbb458a5 100644
--- a/doc/source/tenants.rst
+++ b/doc/source/tenants.rst
@@ -211,6 +211,66 @@ configuration. Some examples of tenant definitions are:
exclude-unprotected-branches. This currently only affects
GitHub and GitLab projects.
+ .. attr:: include-branches
+
+ A list of regexes matching branches which should be
+ processed. If omitted, all branches are included.
+ Operates after *exclude-unprotected-branches* and so may
+ be used to further reduce the set of branches (but not
+ increase it).
+
+ It has priority over *exclude-branches*.
+
+ .. attr:: exclude-branches
+
+ A list of regexes matching branches which should be
+ processed. If omitted, all branches are included.
+ Operates after *exclude-unprotected-branches* and so may
+ be used to further reduce the set of branches (but not
+ increase it).
+
+ It will not exclude a branch which already matched
+ *include-branches*.
+
+ .. attr:: always-dynamic-branches
+
+ A list of regular expressions matching branches which
+ should be treated as if every change newly proposes
+ dynamic Zuul configuration. In other words, the only time
+ Zuul will realize any configuration related to these
+ branches is during the time it is running jobs for a
+ proposed change.
+
+ This is potentially useful for situations with large
+ numbers of rarely used feature branches, but comes at the
+ cost of a significant reduction in Zuul features for these
+ branches.
+
+ Every regular expression listed here will also implicitly
+ be included in *exclude-branches*, therefore Zuul will not
+ load any static in-repo configuration from this branch.
+ These branches will not be available for use in overriding
+ checkouts of repos, nor will they be included in the git
+ repos that Zuul prepares for *required-projects* (unless
+ there is a change in the dependency tree for this branch).
+
+ In particular, this means that the only jobs which can be
+ specified for these branches are pre-merge and gating jobs
+ (such as :term:`check` and :term:`gate`). No post-merge
+ or periodic jobs will run for these branches.
+
+ Using this setting also incurs additional processing for
+ each change submitted for these branches as Zuul must
+ recalculate the configuration layout it uses for such a
+ change as if it included a change to a ``zuul.yaml`` file,
+ even if the change does not alter the configuration).
+
+ With all these caveats in mind, this can be useful for
+ repos with large numbers of rarely used branches as it
+ allows Zuul to omit their configuration in most
+ circumstances and only calculate the configuration of a
+ single additional branch when it is used.
+
.. attr:: extra-config-paths
Normally Zuul loads in-repo configuration from the first
@@ -363,6 +423,57 @@ configuration. Some examples of tenant definitions are:
to add finer filtering to admin rules, for example filtering by the ``iss``
claim (generally equal to the issuer ID).
+ .. attr:: semaphores
+
+ A list of names of :attr:`global-semaphore` objects to allow
+ jobs in this tenant to access.
+
+.. _global_semaphore:
+
+Global Semaphore
+----------------
+
+Semaphores are normally defined in in-repo configuration (see
+:ref:`semaphore`), however to support use-cases where semaphores are
+used to represent constrained global resources that may be used by
+multiple Zuul tenants, semaphores may be defined within the main
+tenant configuration file.
+
+In order for a job to use a global semaphore, the semaphore must first
+be defined in the tenant configuration file with
+:attr:`global-semaphore` and then added to each tenant which should
+have access to it with :attr:`tenant.semaphores`. Once that is done,
+Zuul jobs may use that semaphore in the same way they would use a
+normal tenant-scoped semaphore.
+
+If any tenant which is granted access to a global semaphore also has a
+tenant-scoped semaphore defined with the same name, that definition
+will be treated as a configuration error and subsequently ignored in
+favor of the global semaphore.
+
+An example definition looks similar to the normal semaphore object:
+
+.. code-block:: yaml
+
+ - global-semaphore:
+ name: global-semaphore-foo
+ max: 5
+
+.. attr:: global-semaphore
+
+ The following attributes are available:
+
+ .. attr:: name
+ :required:
+
+ The name of the semaphore, referenced by jobs.
+
+ .. attr:: max
+ :default: 1
+
+ The maximum number of running jobs which can use this semaphore.
+
+
.. _admin_rule_definition:
Access Rule
diff --git a/doc/source/tracing.rst b/doc/source/tracing.rst
new file mode 100644
index 000000000..e973a77dd
--- /dev/null
+++ b/doc/source/tracing.rst
@@ -0,0 +1,23 @@
+:title: Tracing
+
+.. _tracing:
+
+Tracing
+=======
+
+Zuul includes support for distributed `tracing`_ as described by the
+OpenTelemetry project. This allows operators (and potentially users)
+to visualize the progress of events and queue items through the
+various Zuul components as an aid to debugging.
+
+OpenTelemetry defines several observability signals such as traces,
+metrics, and logs. Zuul uses other systems for metrics and logs; only
+traces are exported via OpenTelemetry.
+
+Zuul supports the OpenTelemetry Protocol (OTLP) for exporting traces.
+Many observability systems support receiving traces via OTLP
+(including Jaeger tracing).
+
+Related configuration is in the :attr:`tracing` section of ``zuul.conf``.
+
+_`distributed tracing`: https://opentelemetry.io/docs/concepts/observability-primer/#distributed-traces
diff --git a/doc/source/tutorials/keycloak.rst b/doc/source/tutorials/keycloak.rst
index a6c011eed..896f35479 100644
--- a/doc/source/tutorials/keycloak.rst
+++ b/doc/source/tutorials/keycloak.rst
@@ -28,6 +28,15 @@ to `/etc/hosts`. Make sure you have a line that looks like this:
127.0.0.1 localhost keycloak
+If you are using podman, you need to add the following option in $HOME/.config/containers/containers.conf:
+
+.. code-block::
+
+ [containers]
+ no_hosts=true
+
+This way your /etc/hosts settings will not interfere with podman's networking.
+
Restart Zuul Containers
-----------------------
@@ -37,7 +46,7 @@ that we can update Zuul's configuration to add authentication.
.. code-block:: shell
cd zuul/doc/source/examples
- sudo -E docker-compose -p zuul-tutorial down
+ sudo -E docker-compose -p zuul-tutorial stop
Restart the containers with a new Zuul configuration.
diff --git a/doc/source/tutorials/quick-start.rst b/doc/source/tutorials/quick-start.rst
index eb613b4a9..5e57cece5 100644
--- a/doc/source/tutorials/quick-start.rst
+++ b/doc/source/tutorials/quick-start.rst
@@ -225,7 +225,7 @@ reviewer approves the change in Gerrit. It will run test jobs again
(in case other changes have merged since the change in question was
uploaded) and if these final tests pass, will automatically merge the
change. To configure these pipelines, copy the following file into
-`zuul.d/pipelines.yaml`:
+``zuul.d/pipelines.yaml``:
.. literalinclude:: /examples/zuul-config/zuul.d/pipelines.yaml
:language: yaml
diff --git a/playbooks/tutorial/admin.yaml b/playbooks/tutorial/admin.yaml
index 9b36069e7..92d2b6d1f 100644
--- a/playbooks/tutorial/admin.yaml
+++ b/playbooks/tutorial/admin.yaml
@@ -2,13 +2,13 @@
- name: Run docker-compose down
when: not local
shell:
- cmd: docker-compose -p zuul-tutorial down
+ cmd: docker-compose -p zuul-tutorial stop
chdir: src/opendev.org/zuul/zuul/doc/source/examples
- name: Run docker-compose down
when: local
shell:
- cmd: docker-compose -p zuul-tutorial down
+ cmd: docker-compose -p zuul-tutorial stop
chdir: ../../doc/source/examples
# Restart with the new config
@@ -55,3 +55,24 @@
until: result.status == 200 and result.json["zuul_version"] is defined
changed_when: false
+- name: Verify Keycloak authentication is available
+ uri:
+ url: http://localhost:9000/api/tenant/example-tenant/info
+ method: GET
+ return_content: true
+ status_code: 200
+ body_format: json
+ register: result
+ failed_when: result.json["info"]["capabilities"]["auth"]["realms"]["zuul-demo"]["authority"] != "http://keycloak:8082/realms/zuul-demo"
+ changed_when: false
+
+- name: Verify that old builds are available
+ uri:
+ url: "http://localhost:9000/api/tenant/example-tenant/builds"
+ method: GET
+ return_content: true
+ status_code: 200
+ body_format: json
+ register: result
+ failed_when: "result.json | length < 4"
+ changed_when: false
diff --git a/playbooks/tutorial/quick-start.yaml b/playbooks/tutorial/quick-start.yaml
index 8f114f16f..872b0e689 100644
--- a/playbooks/tutorial/quick-start.yaml
+++ b/playbooks/tutorial/quick-start.yaml
@@ -84,7 +84,7 @@
- name: Find the build URL with regex
set_fact:
- build_url: "{{ result_json | to_json | from_json | json_query(json_query_log_url) | regex_search('(http://[^ ]*)') }}"
+ build_url: "{{ result_json | to_json | from_json | json_query(json_query_log_url) | regex_search('-.*(http://[^ ]*)') | regex_search('(http://[^ ]*)') }}"
vars:
json_query_log_url: "messages[?contains(@.message, 'http://')].message | [1]"
diff --git a/playbooks/zuul-stream/2.7-container.yaml b/playbooks/zuul-stream/2.7-container.yaml
new file mode 100644
index 000000000..76998a01d
--- /dev/null
+++ b/playbooks/zuul-stream/2.7-container.yaml
@@ -0,0 +1,21 @@
+- name: Install docker
+ include_role:
+ name: ensure-docker
+
+- name: Build 2.7 container environment
+ shell: |
+ pushd {{ ansible_user_dir }}/src/opendev.org/zuul/zuul/playbooks/zuul-stream/fixtures/
+ cat ~/.ssh/id_rsa.pub > authorized_keys
+ docker build -f Dockerfile.py27 -t zuul_python27 .
+ args:
+ executable: /bin/bash
+
+- name: Run 2.7 container
+ shell: |
+ docker run -d -p 2022:22 -p 19887:19887 zuul_python27
+ docker ps
+
+- name: Accept host keys
+ shell: |
+ ssh-keyscan -p 2022 localhost >> ~/.ssh/known_hosts
+ ssh-keyscan -p 2022 127.0.0.2 >> ~/.ssh/known_hosts
diff --git a/playbooks/zuul-stream/create-inventory.yaml b/playbooks/zuul-stream/create-inventory.yaml
new file mode 100644
index 000000000..c2be02749
--- /dev/null
+++ b/playbooks/zuul-stream/create-inventory.yaml
@@ -0,0 +1,38 @@
+- name: Copy inventory
+ copy:
+ src: "{{ zuul.executor.log_root }}/zuul-info/inventory.yaml"
+ dest: "{{ ansible_user_dir }}/inventory.yaml"
+
+- name: Slurp inventory
+ slurp:
+ path: "{{ ansible_user_dir }}/inventory.yaml"
+ register: _inventory_yaml
+
+- name: Extract inventory
+ set_fact:
+ _new_inventory: "{{ _inventory_yaml['content'] | b64decode | from_yaml }}"
+
+- name: Setup new facts
+ set_fact:
+ _docker_inventory:
+ all:
+ children:
+ node:
+ hosts:
+ node3: null
+ hosts:
+ node3:
+ ansible_connection: ssh
+ ansible_host: 127.0.0.2
+ ansible_port: 2022
+ ansible_user: root
+ ansible_python_interpreter: /usr/local/bin/python2.7
+
+- name: Merge all facts
+ set_fact:
+ _new_inventory: '{{ _new_inventory | combine(_docker_inventory, recursive=True) }}'
+
+- name: Write out inventory
+ copy:
+ content: '{{ _new_inventory | to_nice_yaml }}'
+ dest: '{{ ansible_user_dir }}/inventory.yaml'
diff --git a/playbooks/zuul-stream/fixtures/Dockerfile.py27 b/playbooks/zuul-stream/fixtures/Dockerfile.py27
new file mode 100644
index 000000000..a30157b18
--- /dev/null
+++ b/playbooks/zuul-stream/fixtures/Dockerfile.py27
@@ -0,0 +1,24 @@
+FROM python:2.7.18-buster AS buster-2.7-ssh
+
+ENV DEBIAN_FRONTEND noninteractive
+
+RUN apt-get update \
+ && apt-get install -y dumb-init openssh-server \
+ && apt-get clean \
+ && rm -rf /var/lib/apt/lists/*
+
+RUN mkdir /var/run/sshd && chmod 0755 /var/run/sshd
+
+# This may or not be required to allow logins by preventing pam_loginuid
+# trying to write out audit level things that may not work in a container
+RUN sed -ri 's/session(\s+)required(\s+)pam_loginuid.so/session\1optional\2pam_loginuid.so/' /etc/pam.d/sshd
+
+RUN ssh-keygen -A -v
+
+RUN ssh-keygen -t ed25519 -f /root/.ssh/id_ed25519
+
+COPY authorized_keys /root/.ssh/authorized_keys
+RUN chmod 0600 /root/.ssh/authorized_keys
+
+ENTRYPOINT ["/usr/bin/dumb-init", "--"]
+CMD ["/usr/sbin/sshd", "-D", "-o", "ListenAddress=0.0.0.0" ]
diff --git a/zuul/ansible/base/action/network.py b/playbooks/zuul-stream/fixtures/library/zuul_fail.py
index 41fc56033..4f5b776d2 100644
--- a/zuul/ansible/base/action/network.py
+++ b/playbooks/zuul-stream/fixtures/library/zuul_fail.py
@@ -1,4 +1,6 @@
-# Copyright 2016 Red Hat, Inc.
+#!/usr/bin/python
+
+# Copyright: (c) 2022, Acme Gating LLC
#
# This module is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -13,13 +15,21 @@
# You should have received a copy of the GNU General Public License
# along with this software. If not, see <http://www.gnu.org/licenses/>.
+from ansible.module_utils.basic import AnsibleModule
+
+
+def run_module():
+ module = AnsibleModule(
+ argument_spec=dict(key=dict(type='str', required=True)),
+ supports_check_mode=True
+ )
-from zuul.ansible import paths
-network = paths._import_ansible_action_plugin("network")
+ raise Exception("Test module failure exception " + module.params['key'])
-class ActionModule(network.ActionModule):
+def main():
+ run_module()
- def run(self, tmp=None, task_vars=None):
- return dict(failed=True, msg='Use of network modules is prohibited')
+if __name__ == '__main__':
+ main()
diff --git a/playbooks/zuul-stream/fixtures/test-stream-failure.yaml b/playbooks/zuul-stream/fixtures/test-stream-failure.yaml
index 3e7b27a7f..febae1b2a 100644
--- a/playbooks/zuul-stream/fixtures/test-stream-failure.yaml
+++ b/playbooks/zuul-stream/fixtures/test-stream-failure.yaml
@@ -4,18 +4,16 @@
- block:
- - name: Run a shell task with an ansible python exception
- command: echo foo
- args:
- chdir: /failure-shelltask/somewhere/that/does/not/exist
+ - name: Run a task with an ansible python exception
+ zuul_fail:
+ key: fail-task
always:
- name: Loop with items on an ansible python exception
- command: "echo {{ item }}"
+ zuul_fail:
+ key: fail-loop
with_items:
- item1
- item2
- item3
- args:
- chdir: /failure-itemloop/somewhere/that/does/not/exist
diff --git a/playbooks/zuul-stream/fixtures/test-stream.yaml b/playbooks/zuul-stream/fixtures/test-stream.yaml
index 413fdee60..0326ae54e 100644
--- a/playbooks/zuul-stream/fixtures/test-stream.yaml
+++ b/playbooks/zuul-stream/fixtures/test-stream.yaml
@@ -1,3 +1,16 @@
+- name: Start zuul stream daemon
+ hosts: node
+ tasks:
+
+ # NOTE : when new_console is set, this playbook runs with
+ # ZUUL_CONSOLE_PORT=19887 so that we test with the zuul_console
+ # from the Zuul checkout, and not the one started by test
+ # infrastructure.
+ - name: Start zuul_console on non-default port
+ zuul_console:
+ port: 19887
+ when: new_console | default(false)
+
- name: Run some commands to show that logging works
hosts: node
tasks:
@@ -35,21 +48,31 @@
- name: complex2
- name: complex3
- - name: Run a shell task with an ansible python exception
- command: echo foo
- args:
- chdir: /shelltask/somewhere/that/does/not/exist
+ - name: Run a task with an ansible python exception
+ zuul_fail:
+ key: task
failed_when: false
- name: Loop with items on an ansible python exception
- command: "echo {{ item }}"
+ zuul_fail:
+ key: loop
with_items:
- item1
- item2
- item3
- args:
- chdir: /itemloop/somewhere/that/does/not/exist
failed_when: false
- name: Print binary data
command: echo -e '\x80abc'
+
+ - name: Find any console log files
+ find:
+ paths: /tmp
+ patterns: 'console-*.log'
+ register: _tmp_files
+
+ # We check this list in zuul-stream/functional.yaml to make sure
+ # we're cleaning up console log files.
+ - name: Dump tmp files
+ debug:
+ var: _tmp_files
diff --git a/playbooks/zuul-stream/functional.yaml b/playbooks/zuul-stream/functional.yaml
index 65a07322a..63e13e3f5 100644
--- a/playbooks/zuul-stream/functional.yaml
+++ b/playbooks/zuul-stream/functional.yaml
@@ -5,75 +5,110 @@
# This value is used by Ansible to find the zuul.ansible code
# that Zuul's ansible plugins consume. It must be updated when
# the python version of the platform is changed.
- python_path: "/usr/local/lib/python3.8/dist-packages"
+ python_path: "/usr/local/lib/python3.10/dist-packages"
- - name: Run ansible that should succeed
+ - name: Run ansible that should succeed against testing console
command: >
/usr/lib/zuul/ansible/{{ zuul_ansible_version }}/bin/ansible-playbook
+ -e "new_console=true"
src/opendev.org/zuul/zuul/playbooks/zuul-stream/fixtures/test-stream.yaml
environment:
+ # Setup by test-stream.yaml so we start a new zuul_console
+ # from this checkout.
+ ZUUL_CONSOLE_PORT: 19887
ZUUL_JOB_LOG_CONFIG: "{{ ansible_user_dir}}/logging.json"
ZUUL_JOBDIR: "{{ ansible_user_dir}}"
- ARA_LOG_CONFIG: "{{ ansible_user_dir}}/logging.json"
PYTHONPATH: "{{ python_path }}"
+ register: _success_output
- - name: Run ansible playbook that should fail
+ - name: Save raw output to file
+ copy:
+ content: '{{ _success_output.stdout }}'
+ dest: 'console-job-output-success-19887.txt'
+
+ - name: Save output
+ shell: |
+ mv job-output.txt job-output-success-19887.txt
+ mv job-output.json job-output-success-19887.json
+
+ # Streamer puts out a line like
+ # [node1] Starting to log 916b2084-4bbb-80e5-248e-000000000016-1-node1 for task TASK: Print binary data
+ # One of the tasks in job-output shows find: results;
+ # the console file for this task should not be there.
+ - name: Validate temporary files removed
+ shell: |
+ for f in $(grep 'Starting to log' console-job-output-success-19887.txt | awk '{print $5}'); do
+ echo "Checking ${f}"
+ if grep -q '"path": "/tmp/console-'${f}'.log"' job-output-success-19887.txt; then
+ echo "*** /tmp/${f}.log still exists"
+ exit 1
+ fi
+ done
+
+ # NOTE(ianw) 2022-07 : we deliberatly have this second step to run
+ # against the console setup by the infrastructure executor in the
+ # job pre playbooks as a backwards compatability sanity check.
+ # The py27 container job (node3) is not running an existing
+ # console streamer, so that will not output anything -- limit this
+ # out.
+ - name: Run ansible that should succeed against extant console
command: >
/usr/lib/zuul/ansible/{{ zuul_ansible_version }}/bin/ansible-playbook
- src/opendev.org/zuul/zuul/playbooks/zuul-stream/fixtures/test-stream-failure.yaml
- register: failed_results
- failed_when: "failed_results.rc != 2"
+ -e "new_console=false" --limit="node1,node2"
+ src/opendev.org/zuul/zuul/playbooks/zuul-stream/fixtures/test-stream.yaml
environment:
ZUUL_JOB_LOG_CONFIG: "{{ ansible_user_dir}}/logging.json"
ZUUL_JOBDIR: "{{ ansible_user_dir}}"
- ARA_LOG_CONFIG: "{{ ansible_user_dir}}/logging.json"
PYTHONPATH: "{{ python_path }}"
+ register: _success_output
- - name: Validate output - setupvar
- shell: |
- egrep "^.*\| node1 \|\s+\"setupvar\": {" job-output.txt
- egrep "^.*\| node2 \|\s+\"setupvar\": {" job-output.txt
+ - name: Save raw output to file
+ copy:
+ content: '{{ _success_output.stdout }}'
+ dest: 'console-job-output-success-19885.txt'
- - name: Validate output - shell task
+ - name: Save output
shell: |
- egrep "^.*\| node1 \| 1: lo:" job-output.txt
- egrep "^.*\| node2 \| 1: lo:" job-output.txt
+ mv job-output.txt job-output-success-19885.txt
+ mv job-output.json job-output-success-19885.json
- - name: Validate output - loop with items
- shell: |
- egrep "^.+\| node1 \| ok: Item: item1" job-output.txt
- egrep "^.+\| node1 \| ok: Item: item2" job-output.txt
- egrep "^.+\| node1 \| ok: Item: item3" job-output.txt
- egrep "^.+\| node2 \| ok: Item: item1" job-output.txt
- egrep "^.+\| node2 \| ok: Item: item2" job-output.txt
- egrep "^.+\| node2 \| ok: Item: item3" job-output.txt
+ - name: Validate outputs
+ include_tasks: validate.yaml
+ loop:
+ - { node: 'node1', filename: 'job-output-success-19887.txt' }
+ - { node: 'node2', filename: 'job-output-success-19887.txt' }
+ - { node: 'node1', filename: 'job-output-success-19885.txt' }
+ - { node: 'node2', filename: 'job-output-success-19885.txt' }
+ # node3 only listen on 19887
+ - { node: 'node3', filename: 'job-output-success-19887.txt' }
- - name: Validate output - loop with complex items
- shell: |
- egrep "^.+\| node1 \| ok: Item: Runtime" job-output.txt
- egrep "^.+\| node2 \| ok: Item: Runtime" job-output.txt
+ # failure case
- - name: Validate output - shell task with exception
- shell: |
- egrep "^.+\| node1 \| (OSError|FileNotFoundError).+\/shelltask\/" job-output.txt
- egrep "^.+\| node2 \| (OSError|FileNotFoundError).+\/shelltask\/" job-output.txt
+ - name: Run ansible playbook that should fail
+ command: >
+ /usr/lib/zuul/ansible/{{ zuul_ansible_version }}/bin/ansible-playbook
+ src/opendev.org/zuul/zuul/playbooks/zuul-stream/fixtures/test-stream-failure.yaml
+ register: failed_results
+ failed_when: "failed_results.rc != 2"
+ environment:
+ ZUUL_CONSOLE_PORT: 19887
+ ZUUL_JOB_LOG_CONFIG: "{{ ansible_user_dir}}/logging.json"
+ ZUUL_JOBDIR: "{{ ansible_user_dir}}"
+ PYTHONPATH: "{{ python_path }}"
- - name: Validate output - item loop with exception
+ - name: Save output
shell: |
- egrep "^.+\| node1 \| (OSError|FileNotFoundError).+\/itemloop\/" job-output.txt
- egrep "^.+\| node2 \| (OSError|FileNotFoundError).+\/itemloop\/" job-output.txt
+ mv job-output.txt job-output-failure.txt
+ mv job-output.json job-output-failure.json
- name: Validate output - failure shell task with exception
shell: |
- egrep "^.+\| node1 \| (OSError|FileNotFoundError).+\/failure-shelltask\/" job-output.txt
- egrep "^.+\| node2 \| (OSError|FileNotFoundError).+\/failure-shelltask\/" job-output.txt
+ egrep "^.+\| node1 \| Exception: Test module failure exception fail-task" job-output-failure.txt
+ egrep "^.+\| node2 \| Exception: Test module failure exception fail-task" job-output-failure.txt
+ egrep "^.+\| node3 \| Exception: Test module failure exception fail-task" job-output-failure.txt
- name: Validate output - failure item loop with exception
shell: |
- egrep "^.+\| node1 \| (OSError|FileNotFoundError).+\/failure-itemloop\/" job-output.txt
- egrep "^.+\| node2 \| (OSError|FileNotFoundError).+\/failure-itemloop\/" job-output.txt
-
- - name: Validate output - binary data
- shell: |
- egrep "^.*\| node1 \| \\\\x80abc" job-output.txt
- egrep "^.*\| node2 \| \\\\x80abc" job-output.txt
+ egrep "^.+\| node1 \| Exception: Test module failure exception fail-loop" job-output-failure.txt
+ egrep "^.+\| node2 \| Exception: Test module failure exception fail-loop" job-output-failure.txt
+ egrep "^.+\| node3 \| Exception: Test module failure exception fail-loop" job-output-failure.txt
diff --git a/playbooks/zuul-stream/post-ara.yaml b/playbooks/zuul-stream/post-ara.yaml
deleted file mode 100644
index aa523c337..000000000
--- a/playbooks/zuul-stream/post-ara.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-- hosts: controller
- tasks:
-
- - name: Generate ARA html
- command: /usr/lib/zuul/ansible/{{ zuul_ansible_version }}/bin/ara generate html ara-output
-
- - name: Fetch ARA files
- synchronize:
- src: "{{ ansible_user_dir }}/ara-output"
- dest: "{{ zuul.executor.log_root }}/stream-files"
- mode: pull
diff --git a/playbooks/zuul-stream/post.yaml b/playbooks/zuul-stream/post.yaml
index 2c717a82e..4beb8d1f9 100644
--- a/playbooks/zuul-stream/post.yaml
+++ b/playbooks/zuul-stream/post.yaml
@@ -10,9 +10,6 @@
state: directory
delegate_to: localhost
- - name: Rename job-output.txt
- command: mv job-output.txt stream-job-output.txt
-
- name: Fetch files
synchronize:
src: "{{ ansible_user_dir }}/{{ item }}"
@@ -21,5 +18,10 @@
with_items:
- logging.json
- ansible.cfg
- - stream-job-output.txt
- - job-output.json
+ - console-job-output-success-19887.txt
+ - job-output-success-19887.txt
+ - job-output-success-19887.json
+ - job-output-success-19885.txt
+ - job-output-success-19885.json
+ - job-output-failure.txt
+ - job-output-failure.json
diff --git a/playbooks/zuul-stream/pre.yaml b/playbooks/zuul-stream/pre.yaml
index 63cad9d04..9753fab85 100644
--- a/playbooks/zuul-stream/pre.yaml
+++ b/playbooks/zuul-stream/pre.yaml
@@ -9,20 +9,38 @@
post_tasks:
- - name: Install software
+ - name: Setup 2.7 container environment
+ include_tasks: 2.7-container.yaml
+
+ - name: Setup inventory
+ include_tasks: create-inventory.yaml
+
+ - name: Install pip
shell: |+
python3 -m pip install --upgrade pip setuptools wheel
- python3 -m pip install src/opendev.org/zuul/zuul
+ become: yes
+
+ - name: Build wheel
+ shell:
+ chdir: src/opendev.org/zuul/zuul
+ cmd: |+
+ python3 setup.py bdist_wheel
+
+ - name: Install software
+ shell: |+
+ python3 -m pip install src/opendev.org/zuul/zuul/dist/*.whl
become: yes
- name: Install managed ansible versions
command: /usr/local/bin/zuul-manage-ansible -v
become: yes
-
- - name: Copy inventory
- copy:
- src: "{{ zuul.executor.log_root }}/zuul-info/inventory.yaml"
- dest: "{{ ansible_user_dir }}/inventory.yaml"
+ environment:
+ # This appears to be necessary because without it the virtualenvs
+ # that virtualenv creates are not actually virtualenvs. They are just
+ # aliases for the root python installation instead. Then we try to
+ # install multiple ansible versions to the root (via multiple fake
+ # venvs) and the installation fails due to conflicts.
+ SETUPTOOLS_USE_DISTUTILS: stdlib
- name: Copy ansible.cfg
template:
diff --git a/playbooks/zuul-stream/templates/ansible.cfg.j2 b/playbooks/zuul-stream/templates/ansible.cfg.j2
index 36c6e84e9..3638d2699 100644
--- a/playbooks/zuul-stream/templates/ansible.cfg.j2
+++ b/playbooks/zuul-stream/templates/ansible.cfg.j2
@@ -3,8 +3,8 @@ inventory = {{ ansible_user_dir }}/inventory.yaml
gathering = smart
gather_subset = !all
lookup_plugins = {{ ansible_user_dir }}/src/opendev.org/zuul/zuul/zuul/ansible/{{ zuul_ansible_version }}/lookup
-action_plugins = {{ ansible_user_dir }}/src/opendev.org/zuul/zuul/zuul/ansible/{{ zuul_ansible_version }}/actiongeneral:{{ ansible_user_dir }}/src/opendev.org/zuul/zuul/zuul/ansible/{{ zuul_ansible_version }}/action
-callback_plugins = {{ ansible_user_dir }}/src/opendev.org/zuul/zuul/zuul/ansible/{{ zuul_ansible_version }}/callback:/usr/lib/zuul/ansible/{{ zuul_ansible_version }}/lib/python3.8/site-packages/ara/plugins/callbacks
+action_plugins = {{ ansible_user_dir }}/src/opendev.org/zuul/zuul/zuul/ansible/{{ zuul_ansible_version }}/action
+callback_plugins = {{ ansible_user_dir }}/src/opendev.org/zuul/zuul/zuul/ansible/{{ zuul_ansible_version }}/callback
stdout_callback = zuul_stream
library = {{ ansible_user_dir }}/src/opendev.org/zuul/zuul/zuul/ansible/{{ zuul_ansible_version }}/library
retry_files_enabled = False
diff --git a/playbooks/zuul-stream/validate.yaml b/playbooks/zuul-stream/validate.yaml
new file mode 100644
index 000000000..81c613406
--- /dev/null
+++ b/playbooks/zuul-stream/validate.yaml
@@ -0,0 +1,29 @@
+- name: Validate output - setupvar
+ shell: |
+ egrep "^.*\| {{ item.node }} \|\s+\"setupvar\": {" {{ item.filename }}
+
+- name: Validate output - shell task
+ shell: |
+ egrep "^.*\| {{ item.node }} \| 1: lo:" {{ item.filename }}
+
+- name: Validate output - loop with items
+ shell: |
+ egrep "^.+\| {{ item.node }} \| ok: Item: item1" {{ item.filename }}
+ egrep "^.+\| {{ item.node }} \| ok: Item: item2" {{ item.filename }}
+ egrep "^.+\| {{ item.node }} \| ok: Item: item3" {{ item.filename }}
+
+- name: Validate output - loop with complex items
+ shell: |
+ egrep "^.+\| {{ item.node }} \| ok: Item: Runtime" {{ item.filename }}
+
+- name: Validate output - failed shell task
+ shell: |
+ egrep "^.+\| {{ item.node }} \| Exception: Test module failure exception task" {{ item.filename }}
+
+- name: Validate output - item loop with exception
+ shell: |
+ egrep "^.+\| {{ item.node }} \| Exception: Test module failure exception loop" {{ item.filename }}
+
+- name: Validate output - binary data
+ shell: |
+ egrep "^.*\| {{ item.node }} \| \\\\x80abc" {{ item.filename }}
diff --git a/releasenotes/notes/520-windows-7737f20c23b0afee.yaml b/releasenotes/notes/520-windows-7737f20c23b0afee.yaml
new file mode 100644
index 000000000..2a50111a3
--- /dev/null
+++ b/releasenotes/notes/520-windows-7737f20c23b0afee.yaml
@@ -0,0 +1,7 @@
+---
+fixes:
+ - |
+ An issue introduced in Zuul version 5.2.0 which could cause jobs
+ running on Windows nodes to fail with the error `Could not find
+ imported module support code for 'Ansible.ModuleUtils.Legacy'"`
+ has been corrected.
diff --git a/releasenotes/notes/add-buildset-statusurl.yaml b/releasenotes/notes/add-buildset-statusurl.yaml
new file mode 100644
index 000000000..e69b701d1
--- /dev/null
+++ b/releasenotes/notes/add-buildset-statusurl.yaml
@@ -0,0 +1,5 @@
+---
+features:
+ - |
+ Added build set url to Zuul comment. This provide a quick way
+ for user to reach the build set page from Gerrit. \ No newline at end of file
diff --git a/releasenotes/notes/always-dynamic-dce165ca8b6e212f.yaml b/releasenotes/notes/always-dynamic-dce165ca8b6e212f.yaml
new file mode 100644
index 000000000..0d0fe8226
--- /dev/null
+++ b/releasenotes/notes/always-dynamic-dce165ca8b6e212f.yaml
@@ -0,0 +1,10 @@
+---
+features:
+ - |
+ Added a new
+ :attr:`tenant.untrusted-projects.<project>.always-dynamic-branches`
+ tenant project configuration option. This may be used to specify
+ branches from which Zuul should never load static configuration
+ and instead treat every change as if it newly proposed dynamic
+ configuration. This is potentially useful for large numbers of
+ rarely-used feature branches.
diff --git a/releasenotes/notes/ansible-2-removed-482fa9e5b944b7d4.yaml b/releasenotes/notes/ansible-2-removed-482fa9e5b944b7d4.yaml
new file mode 100644
index 000000000..26c1e59ee
--- /dev/null
+++ b/releasenotes/notes/ansible-2-removed-482fa9e5b944b7d4.yaml
@@ -0,0 +1,6 @@
+---
+upgrade:
+ - |
+ Support for Ansible versions 2.8 and 2.9 has been removed.
+ Migrate any existing jobs which rely on these versions to Ansible
+ version 5 or 6 before upgrading.
diff --git a/releasenotes/notes/ansible-5-0c9d6626294579e0.yaml b/releasenotes/notes/ansible-5-0c9d6626294579e0.yaml
new file mode 100644
index 000000000..6c57af601
--- /dev/null
+++ b/releasenotes/notes/ansible-5-0c9d6626294579e0.yaml
@@ -0,0 +1,32 @@
+---
+features:
+ - |
+ Ansible version 5 is now available. The default Ansible version
+ is still 2.9, but version 5 may be selected by using
+ :attr:`job.ansible-version`.
+
+upgrade:
+ - |
+ This is the first version of Ansible added to Zuul since the
+ Ansible project began releasing the `Ansible community` package.
+ Zuul includes the Ansible community package since it includes a
+ wide selection of useful modules, many of which were included by
+ default in previous versions of Ansible.
+
+ Only the major version of Ansible community is specified
+ (e.g. ``ansible-version: 5``). This corresponds to a single minor
+ release of Ansible core (e.g., Ansible community 5 corresponds to
+ Ansible core 2.12). Ansible releases minor versions of the
+ community package which may contain updates to the included
+ Ansible collections as well as micro version updates of Ansible
+ core (e.g. Ansible community 5.6 includes ansible-core 2.12.4).
+
+ Zuul does not specify the minor version of Ansible community,
+ therefore the latest available micro-version will be installed at
+ build-time. If you need more control over the version of Ansible
+ used, see the help text for ``zuul-manage-ansible``.
+
+ - |
+ Python 3.8 or newer is required to run Zuul. This change was necessary
+ to support Ansible 5 and newer as Ansible's minimum python requirement
+ is 3.8.
diff --git a/releasenotes/notes/ansible-6-f939b4d160b41ec3.yaml b/releasenotes/notes/ansible-6-f939b4d160b41ec3.yaml
new file mode 100644
index 000000000..c1bb9d534
--- /dev/null
+++ b/releasenotes/notes/ansible-6-f939b4d160b41ec3.yaml
@@ -0,0 +1,6 @@
+---
+features:
+ - |
+ Ansible version 6 is now available. The default Ansible version
+ is still 5, but version 6 may be selected by using
+ :attr:`job.ansible-version`.
diff --git a/releasenotes/notes/ansible-plugin-security-90ecd81635e12179.yaml b/releasenotes/notes/ansible-plugin-security-90ecd81635e12179.yaml
new file mode 100644
index 000000000..4c22ebcf1
--- /dev/null
+++ b/releasenotes/notes/ansible-plugin-security-90ecd81635e12179.yaml
@@ -0,0 +1,31 @@
+---
+security:
+ - |
+ A vulnerability which allowed the execution of untrusted code on
+ the executor was fixed.
+
+ Zuul restricts the Ansible modules and plugins which can be used
+ in the `untrusted` security context (i.e., untrusted projects).
+ It also prohibits running programs on the Zuul executor in the
+ untrusted security context.
+
+ Ansible 2.8 and later versions support referencing builtin modules
+ using the `ansible.builtin.<name>` alias. Playbooks which use
+ this mechanism can bypass Zuul's security restrictions and run
+ arbitrary local code or otherwise restricted modules.
+
+ Zuul's use of bubblewrap means that any commands executed via this
+ vulnerability would still be contained within the restricted
+ environment, meaning that they can not access files outside of the
+ build directory or continue running longer than the playbook. But
+ they may have been able to access files within the build directory
+ but outside of the `work/` directory, as well as potentially
+ exploit any kernel or hypervisor privilege escalation
+ vulnerabilities.
+
+ The Zuul team now considers the restricted Ansible environment to
+ be ineffective as a security mechanism and is developing plans to
+ remove the restrictions and rely entirely on bubblewrap in the
+ future. These changes will occur in a future release of Zuul
+ (likely 6.0.0) and will be preceded by more details about the
+ change.
diff --git a/releasenotes/notes/change-queue-project-790553bd212b50eb.yaml b/releasenotes/notes/change-queue-project-790553bd212b50eb.yaml
index a68db6f17..a88048242 100644
--- a/releasenotes/notes/change-queue-project-790553bd212b50eb.yaml
+++ b/releasenotes/notes/change-queue-project-790553bd212b50eb.yaml
@@ -2,5 +2,5 @@
deprecations:
- |
Shared ``queues`` should be configured per project now instead per
- pipeline. Specifying :attr:`project.<pipeline>.queue` is deprecated
+ pipeline. Specifying `project.<pipeline>.queue` is deprecated
and will be removed in a future release.
diff --git a/releasenotes/notes/cherry-pick-merges-9c78fd914b682671.yaml b/releasenotes/notes/cherry-pick-merges-9c78fd914b682671.yaml
new file mode 100644
index 000000000..d5f1d14c5
--- /dev/null
+++ b/releasenotes/notes/cherry-pick-merges-9c78fd914b682671.yaml
@@ -0,0 +1,7 @@
+---
+features:
+ - |
+ The `cherry-pick` merger mode can now handle merges between branches by
+ performing a `git merge` instead of `git cherry-pick` if the change has
+ multiple parents. Previously, this would fail because git doesn't allow
+ a merge to be cherry-picked.
diff --git a/releasenotes/notes/config-error-reporter-34887223d91544d1.yaml b/releasenotes/notes/config-error-reporter-34887223d91544d1.yaml
new file mode 100644
index 000000000..51690f2fa
--- /dev/null
+++ b/releasenotes/notes/config-error-reporter-34887223d91544d1.yaml
@@ -0,0 +1,6 @@
+---
+features:
+ - |
+ A new :attr:`pipeline.config-error` pipeline reporter is available
+ for customizing reporter actions related to Zuul configuration
+ errors.
diff --git a/releasenotes/notes/deduplicate-ac171d3206eb43b3.yaml b/releasenotes/notes/deduplicate-ac171d3206eb43b3.yaml
new file mode 100644
index 000000000..d55ed8fcd
--- /dev/null
+++ b/releasenotes/notes/deduplicate-ac171d3206eb43b3.yaml
@@ -0,0 +1,6 @@
+---
+features:
+ - |
+ If identical jobs are run for multiple changes in a dependency
+ cycle, Zuul may now deduplicate them under certain circumstances.
+ See :attr:`job.deduplicate` for details.
diff --git a/releasenotes/notes/dependency-validation-000f63204da83b4a.yaml b/releasenotes/notes/dependency-validation-000f63204da83b4a.yaml
new file mode 100644
index 000000000..0f88a06fa
--- /dev/null
+++ b/releasenotes/notes/dependency-validation-000f63204da83b4a.yaml
@@ -0,0 +1,12 @@
+---
+fixes:
+ - |
+ Zuul now treats job dependencies that reference undefined jobs as
+ a configuration error. Previously a job which depended on another
+ job which did not exist would pass initial syntax validation and
+ only cause a failure in freezing the job graph when Zuul attempted
+ to run the job. Now incorrect or missing job dependencies are
+ detected during configuration. This means that new config errors
+ may be prevented from merging. It also means that existing
+ erroneous job or project configurations will be regarded as
+ configuration errors at startup.
diff --git a/releasenotes/notes/deprecate-ansible-2-4c22db35d3c6c765.yaml b/releasenotes/notes/deprecate-ansible-2-4c22db35d3c6c765.yaml
new file mode 100644
index 000000000..09a0a128c
--- /dev/null
+++ b/releasenotes/notes/deprecate-ansible-2-4c22db35d3c6c765.yaml
@@ -0,0 +1,5 @@
+---
+upgrade:
+ - |
+ Ansible versions 2.8 and 2.9 are now deprecated in Zuul since they
+ are both unmaintaned. Ansible 5 is now the default version in Zuul.
diff --git a/releasenotes/notes/deps-by-topic-a0e5733e5406a610.yaml b/releasenotes/notes/deps-by-topic-a0e5733e5406a610.yaml
new file mode 100644
index 000000000..6fe3daf60
--- /dev/null
+++ b/releasenotes/notes/deps-by-topic-a0e5733e5406a610.yaml
@@ -0,0 +1,6 @@
+---
+features:
+ - |
+ The :attr:`queue.dependencies-by-topic` setting is added for Zuul
+ users who wish to emulate the Gerrit ``submitWholeTopic`` behavior
+ for some projects without enabling it site-wide in Gerrit.
diff --git a/releasenotes/notes/dequeue-on-missing-reqs-897210de746b3585.yaml b/releasenotes/notes/dequeue-on-missing-reqs-897210de746b3585.yaml
new file mode 100644
index 000000000..93e2e7f61
--- /dev/null
+++ b/releasenotes/notes/dequeue-on-missing-reqs-897210de746b3585.yaml
@@ -0,0 +1,6 @@
+---
+features:
+ - |
+ Changes in dependent queues are now automatically dequeued if they
+ no longer meet the mergability requirements set by the upstream
+ code review system.
diff --git a/releasenotes/notes/gearmanectomy-ecec32b3764eafc1.yaml b/releasenotes/notes/gearmanectomy-ecec32b3764eafc1.yaml
index 7985d030b..f5aaa617b 100644
--- a/releasenotes/notes/gearmanectomy-ecec32b3764eafc1.yaml
+++ b/releasenotes/notes/gearmanectomy-ecec32b3764eafc1.yaml
@@ -8,4 +8,4 @@ upgrade:
Commands such as `zuul enqueue` which were previously executed via
Gearman may still be used by creating an authentication token and
- adding a `web` section to zuul.conf.
+ adding a `webclient` section to zuul.conf.
diff --git a/releasenotes/notes/gerrit-ssh-server-a183363bac9d7ff8.yaml b/releasenotes/notes/gerrit-ssh-server-a183363bac9d7ff8.yaml
new file mode 100644
index 000000000..9e14364e5
--- /dev/null
+++ b/releasenotes/notes/gerrit-ssh-server-a183363bac9d7ff8.yaml
@@ -0,0 +1,6 @@
+---
+features:
+ - |
+ The new `ssh_server` option for gerrit connections may be used to specify
+ a hostname to use for SSH connections while the normal `server` option
+ specifies the hostname to use for HTTP connections.
diff --git a/releasenotes/notes/gerrit-submit-whole-topic-5fef75db6ca450e8.yaml b/releasenotes/notes/gerrit-submit-whole-topic-5fef75db6ca450e8.yaml
new file mode 100644
index 000000000..c78d1bef8
--- /dev/null
+++ b/releasenotes/notes/gerrit-submit-whole-topic-5fef75db6ca450e8.yaml
@@ -0,0 +1,20 @@
+---
+features:
+ - |
+ Zuul now matches Gerrit's behavior when
+ ``change.submitWholeTopic`` is set in Gerrit.
+
+ When this setting is enabled in Gerrit and a change is submitted
+ (merged), all changes with the same topic are submitted
+ simultaneously. Zuul will now query for changes which are set to
+ be submitted together by Gerrit when enqueing them and treat them
+ as if they are a set of circular dependencies.
+
+ If the projects are not part of pipeline queues which are
+ configured to allow circular dependencies, then Zuul will report
+ failure on enqueue. Be sure that the submitWholeTopic setting in
+ Gerrit and the allow-circular-dependencies setting in Zuul match.
+
+ This functionality requires an HTTP connection to Gerrit. If only
+ an SSH connection is available, then changes submitted together
+ will be ignored.
diff --git a/releasenotes/notes/global-semaphores-719828567158982a.yaml b/releasenotes/notes/global-semaphores-719828567158982a.yaml
new file mode 100644
index 000000000..2d68fb1dc
--- /dev/null
+++ b/releasenotes/notes/global-semaphores-719828567158982a.yaml
@@ -0,0 +1,5 @@
+---
+features:
+ - |
+ Support for global (cross-tenant) semaphores has been added. See
+ :ref:`global_semaphore`.
diff --git a/releasenotes/notes/implied-branch-exact-match-74cd3f227a2f6361.yaml b/releasenotes/notes/implied-branch-exact-match-74cd3f227a2f6361.yaml
new file mode 100644
index 000000000..caca449fb
--- /dev/null
+++ b/releasenotes/notes/implied-branch-exact-match-74cd3f227a2f6361.yaml
@@ -0,0 +1,10 @@
+---
+fixes:
+ - |
+ Projects and jobs on branches whose names have special characters
+ in regular expressions could fail to match changes as intended.
+ Implied branch matchers automatically generated from branch names
+ are now treated as requiring exact matches. Any user-specified
+ branch matcher (including in :attr:`job.branches` and
+ :attr:`pragma.implied-branches`) are still treated as regular
+ expressions.
diff --git a/releasenotes/notes/include-branches-493b6bb04414341b.yaml b/releasenotes/notes/include-branches-493b6bb04414341b.yaml
new file mode 100644
index 000000000..1121c991b
--- /dev/null
+++ b/releasenotes/notes/include-branches-493b6bb04414341b.yaml
@@ -0,0 +1,9 @@
+---
+features:
+ - |
+ Added new tenant project configuration options
+ attr:`tenant.untrusted-projects.<project>.include-branches` and
+ attr:`tenant.untrusted-projects.<project>.exclude-branches`.
+ Similar to *exclude-unprotected-branches*, these may be used to
+ reduce the set of branches from which Zuul will load
+ configuration.
diff --git a/releasenotes/notes/merge-conflict-rename-2-1e60065f196e48af.yaml b/releasenotes/notes/merge-conflict-rename-2-1e60065f196e48af.yaml
new file mode 100644
index 000000000..962c1702e
--- /dev/null
+++ b/releasenotes/notes/merge-conflict-rename-2-1e60065f196e48af.yaml
@@ -0,0 +1,6 @@
+upgrade:
+ - |
+ The previously deprecated ``merge-failure`` and
+ ``merge-failure-message`` pipeline configuration options have been
+ removed. Use ``merge-conflict`` and ``merge-conflict-message``
+ respectively instead.
diff --git a/releasenotes/notes/mqtt-include-returned-data-c5836db472907c42.yaml b/releasenotes/notes/mqtt-include-returned-data-c5836db472907c42.yaml
new file mode 100644
index 000000000..2acb9433a
--- /dev/null
+++ b/releasenotes/notes/mqtt-include-returned-data-c5836db472907c42.yaml
@@ -0,0 +1,6 @@
+---
+features:
+ - |
+ The MQTT driver now supports including data returned from a job in
+ its reports. See
+ :attr:`pipeline.<reporter>.<mqtt>.include-returned-data`.
diff --git a/releasenotes/notes/ms-login-5be892f3c151bfe7.yaml b/releasenotes/notes/ms-login-5be892f3c151bfe7.yaml
new file mode 100644
index 000000000..363264d6f
--- /dev/null
+++ b/releasenotes/notes/ms-login-5be892f3c151bfe7.yaml
@@ -0,0 +1,5 @@
+---
+features:
+ - |
+ The ability to configure Microsoft Login as an OpenID Connect
+ authentication provider has been added.
diff --git a/releasenotes/notes/network-vars-60fd922781da7b92.yaml b/releasenotes/notes/network-vars-60fd922781da7b92.yaml
new file mode 100644
index 000000000..79724eff6
--- /dev/null
+++ b/releasenotes/notes/network-vars-60fd922781da7b92.yaml
@@ -0,0 +1,6 @@
+---
+fixes:
+ - |
+ Nodepool host variables are now available even for unreachable
+ hosts. This is useful for network appliances which start the job
+ in an unreachable state.
diff --git a/releasenotes/notes/no-jobs-ec2aa5200d91044b.yaml b/releasenotes/notes/no-jobs-ec2aa5200d91044b.yaml
new file mode 100644
index 000000000..55bec7443
--- /dev/null
+++ b/releasenotes/notes/no-jobs-ec2aa5200d91044b.yaml
@@ -0,0 +1,6 @@
+---
+fixes:
+ - |
+ A change in 5.2.3 began reporting NO_JOBS results to the database
+ which was unintentional. This has been corrected and they are no
+ longer recorded in the database.
diff --git a/releasenotes/notes/no-jobs2-fe2df7e33aa07acd.yaml b/releasenotes/notes/no-jobs2-fe2df7e33aa07acd.yaml
new file mode 100644
index 000000000..585945a43
--- /dev/null
+++ b/releasenotes/notes/no-jobs2-fe2df7e33aa07acd.yaml
@@ -0,0 +1,5 @@
+---
+fixes:
+ - |
+ Further instances of reporting NO_JOBS results to the database
+ when not necessary have been corrected.
diff --git a/releasenotes/notes/nodeset-alternatives-7cc39a69ac4f1481.yaml b/releasenotes/notes/nodeset-alternatives-7cc39a69ac4f1481.yaml
new file mode 100644
index 000000000..e4dc4274b
--- /dev/null
+++ b/releasenotes/notes/nodeset-alternatives-7cc39a69ac4f1481.yaml
@@ -0,0 +1,7 @@
+---
+features:
+ - |
+ Nodesets may now express an ordered list of alternatives so that
+ if Nodepool is unable to fulfill a request for certain labels, one
+ or more alternative Nodesets may be attempted instead. See
+ :attr:`nodeset.alternatives` for details.
diff --git a/releasenotes/notes/pipeline-queue-removal-475caa7091f7e43f.yaml b/releasenotes/notes/pipeline-queue-removal-475caa7091f7e43f.yaml
new file mode 100644
index 000000000..4d25d159b
--- /dev/null
+++ b/releasenotes/notes/pipeline-queue-removal-475caa7091f7e43f.yaml
@@ -0,0 +1,6 @@
+---
+upgrade:
+ - |
+ The deprecated syntax of specifying project change queues on
+ pipeline configurations has been removed. Specify queues using
+ the project stanza now. See :attr:`queue` for more information.
diff --git a/releasenotes/notes/project-regex-update-dcc183d923a6acdd.yaml b/releasenotes/notes/project-regex-update-dcc183d923a6acdd.yaml
new file mode 100644
index 000000000..87c0e3fb1
--- /dev/null
+++ b/releasenotes/notes/project-regex-update-dcc183d923a6acdd.yaml
@@ -0,0 +1,8 @@
+---
+fixes:
+ - |
+ Project name regex handling has been updated to return all possible
+ matches. Previously if there were collisions with short names it was an
+ error. The point of the regex system is to simplify configuration and
+ apply configs to all projects that match. Collisions don't impact this
+ behavior so we don't need to raise an error in these cases.
diff --git a/releasenotes/notes/promote-check-f1ecf4826245c43d.yaml b/releasenotes/notes/promote-check-f1ecf4826245c43d.yaml
new file mode 100644
index 000000000..a32dba62e
--- /dev/null
+++ b/releasenotes/notes/promote-check-f1ecf4826245c43d.yaml
@@ -0,0 +1,11 @@
+---
+features:
+ - |
+ The promote administrative action now functions with all pipeline
+ managers. Previously it would only have an impact on dependent
+ pipelines, but it will now re-order change queues as well as
+ changes within any type of pipeline.
+upgrade:
+ - |
+ The promote administrative action will no longer restart jobs for
+ changes which have not been re-ordered within their change queue.
diff --git a/releasenotes/notes/prune-database-eca38464b9606254.yaml b/releasenotes/notes/prune-database-eca38464b9606254.yaml
new file mode 100644
index 000000000..85322c185
--- /dev/null
+++ b/releasenotes/notes/prune-database-eca38464b9606254.yaml
@@ -0,0 +1,21 @@
+---
+features:
+ - |
+ A new command, ``prune-database`` has been added to `zuul-admin`
+ in order to remove database entries older than a certain age.
+upgrade:
+ - |
+ A SQL schema migration is added in order to add an ``updated``
+ column to the buildset table which will be used by the
+ `prune-database` command to determine which buildsets to delete.
+ The migration will attempt to use the most recent timestamp
+ associated with the buildset when initializing this column,
+ however, if no timestamps are available, it will initialize it to
+ 1970-01-01. Since this is considerably before Zuul's birthdate,
+ this means that any buildsets without timestamp information will
+ be pruned the first time `prune-database` is run. It is expected
+ that buildsets with no timestamps, even very recent ones, are
+ typically uninteresting and therefore this should not cause a
+ hardship. If this is not the case for your installation, you may
+ want to inspect the database and change the ``updated`` column to
+ a more recent value in these cases.
diff --git a/releasenotes/notes/remove-ara-f64d6d2408dde1e5.yaml b/releasenotes/notes/remove-ara-f64d6d2408dde1e5.yaml
new file mode 100644
index 000000000..58ba939e5
--- /dev/null
+++ b/releasenotes/notes/remove-ara-f64d6d2408dde1e5.yaml
@@ -0,0 +1,5 @@
+---
+upgrade:
+ - |
+ The built-in support for the ARA Ansible callback plugin has been
+ removed.
diff --git a/releasenotes/notes/repo_cache-5524b183a8bc3e6a.yaml b/releasenotes/notes/repo_cache-5524b183a8bc3e6a.yaml
new file mode 100644
index 000000000..e3cbd737e
--- /dev/null
+++ b/releasenotes/notes/repo_cache-5524b183a8bc3e6a.yaml
@@ -0,0 +1,8 @@
+---
+features:
+ - |
+ The GitHub driver now has support for using a GitHub Enterprise
+ `repository cache
+ <https://docs.github.com/en/enterprise-server@3.3/admin/enterprise-management/caching-repositories/about-repository-caching>`_.
+ See :attr:`<github connection>.repo_cache` for information on how
+ to configure it.
diff --git a/releasenotes/notes/submitted-together-query-f2a04313193dd101.yaml b/releasenotes/notes/submitted-together-query-f2a04313193dd101.yaml
new file mode 100644
index 000000000..4cad1389f
--- /dev/null
+++ b/releasenotes/notes/submitted-together-query-f2a04313193dd101.yaml
@@ -0,0 +1,5 @@
+---
+fixes:
+ - |
+ Fixed an issue in the Gerrit driver introduced in 5.2.0 which
+ could cause infinite loops while querying changes.
diff --git a/releasenotes/notes/timer-jitter-3d3df10d0e75f892.yaml b/releasenotes/notes/timer-jitter-3d3df10d0e75f892.yaml
new file mode 100644
index 000000000..d209f4a87
--- /dev/null
+++ b/releasenotes/notes/timer-jitter-3d3df10d0e75f892.yaml
@@ -0,0 +1,7 @@
+---
+features:
+ - |
+ Pipeline timer triggers with jitter now apply the jitter to each
+ project-branch individually (instead of to the pipeline as a
+ whole). This can reduce the thundering herd effect on external
+ systems for periodic pipelines with many similar jobs.
diff --git a/releasenotes/notes/total-resource-usage-stats-5d6ce932e1f249d2.yaml b/releasenotes/notes/total-resource-usage-stats-5d6ce932e1f249d2.yaml
new file mode 100644
index 000000000..05a0097cf
--- /dev/null
+++ b/releasenotes/notes/total-resource-usage-stats-5d6ce932e1f249d2.yaml
@@ -0,0 +1,25 @@
+---
+features:
+ - |
+ Zuul now reports total resource usage statistics.
+
+ The following statistic is emitted:
+
+ `zuul.nodepool.resources.total.tenant.{tenant}.{resource}`
+
+ Gauge with the currently used resources by tenant in total, i.e., all nodes
+ belonging to a tenant, regardles of their state.
+
+upgrade:
+ - |
+ Zuul now reports total and in-use resource usage statics separately.
+
+ To distinquish those, the following statistics have been renamed:
+
+ - `zuul.nodepool.resources.tenant.{tenant}.{resource}`
+ `->`
+ `zuul.nodepool.resources.in_use.tenant.{tenant}.{resource}`
+
+ - `zuul.nodepool.resources.project.{project}.{resource}`:
+ `->`
+ `zuul.nodepool.resources.in_use.project.{tenant}.{resource}`
diff --git a/releasenotes/notes/unrestricted-ansible-6ae00e3aa1b1d3c6.yaml b/releasenotes/notes/unrestricted-ansible-6ae00e3aa1b1d3c6.yaml
new file mode 100644
index 000000000..36dcf4d07
--- /dev/null
+++ b/releasenotes/notes/unrestricted-ansible-6ae00e3aa1b1d3c6.yaml
@@ -0,0 +1,19 @@
+---
+upgrade:
+ - |
+ The restricted Ansible environment used for untrusted playbooks
+ has been relaxed.
+
+ Zuul previously attempted to restrict the actions of playbooks
+ running in the untrusted execution context on the executor so that
+ users would not be able to load custom Ansible plugins, execute
+ code on the executor, or use certain functions of built-in Ansible
+ modules. This was done in an attempt to improve the security of
+ the Zuul executor. However, the approach has proved laborious,
+ prone to error, and increasingly incompatible with newer versions
+ of Ansible.
+
+ Therefore it has been removed, and now playbooks within both the
+ trusted and untrusted execution contexts have access to the full
+ suite of Ansible modules. See the :ref:`executor_security`
+ section for information on caveats relating to executor security.
diff --git a/releasenotes/notes/wait-for-init-934370422b22b442.yaml b/releasenotes/notes/wait-for-init-934370422b22b442.yaml
new file mode 100644
index 000000000..9033131f1
--- /dev/null
+++ b/releasenotes/notes/wait-for-init-934370422b22b442.yaml
@@ -0,0 +1,8 @@
+---
+features:
+ - |
+ The scheduler now accepts an argument `--wait-for-init` which will
+ cause it to wait until all tenants have been initialized before it
+ begins processing pipelines. This may help large systems with
+ excess scheduler capacity perform a rolling restart of schedulers
+ more quickly.
diff --git a/releasenotes/notes/wip-trigger-ad601ff3da30b845.yaml b/releasenotes/notes/wip-trigger-ad601ff3da30b845.yaml
new file mode 100644
index 000000000..f53f7fc6f
--- /dev/null
+++ b/releasenotes/notes/wip-trigger-ad601ff3da30b845.yaml
@@ -0,0 +1,5 @@
+---
+features:
+ - |
+ Pipelines can now trigger on ``wip-state-changed`` and filter events on the
+ wip state of a change with :attr:`pipeline.require.<gerrit source>.wip`.
diff --git a/releasenotes/notes/zuul-admin-cli-53f52cff1aad986c.yaml b/releasenotes/notes/zuul-admin-cli-53f52cff1aad986c.yaml
new file mode 100644
index 000000000..03c237ed6
--- /dev/null
+++ b/releasenotes/notes/zuul-admin-cli-53f52cff1aad986c.yaml
@@ -0,0 +1,7 @@
+---
+deprecations:
+ - |
+ The zuul CLI is renamed `zuul-admin`. The `zuul` command will remain usable until a future version,
+ then will be phased out. Likewise, tenant-scoped, workflow affecting commands such as autohold,
+ enqueue, dequeue, promote are deprecated from the zuul-admin CLI and will be phased out in a
+ future version. They can still be performed via the `zuul-client` CLI.
diff --git a/releasenotes/notes/zuul-return-retry-814467d82ea467dc.yaml b/releasenotes/notes/zuul-return-retry-814467d82ea467dc.yaml
new file mode 100644
index 000000000..62b90bb11
--- /dev/null
+++ b/releasenotes/notes/zuul-return-retry-814467d82ea467dc.yaml
@@ -0,0 +1,12 @@
+---
+features:
+ - |
+ It is now possible for jobs to skip retries caused by failures in
+ 'pre-run' by returning `retry: false`:
+
+ .. code-block:: yaml
+
+ - zuul_return:
+ data:
+ zuul:
+ retry: false
diff --git a/requirements.txt b/requirements.txt
index 578f73cf7..408dcbbbd 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -37,3 +37,6 @@ cheroot!=8.1.*,!=8.2.*,!=8.3.0 # https://github.com/cherrypy/cheroot/issues/263
elasticsearch<8.0.0
PyMySQL
psycopg2-binary
+opentelemetry-sdk
+opentelemetry-exporter-otlp-proto-grpc
+opentelemetry-exporter-otlp-proto-http
diff --git a/setup.cfg b/setup.cfg
index 86e3f7e9f..74905bf6c 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,12 +1,12 @@
[metadata]
name = zuul
summary = A Project Gating System
-description-file =
+description_file =
README.rst
author = Zuul Team
-author-email = zuul-discuss@lists.zuul-ci.org
-home-page = https://zuul-ci.org/
-python-requires = >=3.6
+author_email = zuul-discuss@lists.zuul-ci.org
+home_page = https://zuul-ci.org/
+python_requires = >=3.8
classifier =
Intended Audience :: Information Technology
Intended Audience :: System Administrators
@@ -14,9 +14,9 @@ classifier =
Operating System :: POSIX :: Linux
Programming Language :: Python
Programming Language :: Python :: 3
- Programming Language :: Python :: 3.6
- Programming Language :: Python :: 3.7
Programming Language :: Python :: 3.8
+ Programming Language :: Python :: 3.9
+ Programming Language :: Python :: 3.10
[pbr]
warnerrors = True
@@ -30,6 +30,7 @@ console_scripts =
zuul-scheduler = zuul.cmd.scheduler:main
zuul-merger = zuul.cmd.merger:main
zuul = zuul.cmd.client:main
+ zuul-admin = zuul.cmd.client:main
zuul-executor = zuul.cmd.executor:main
zuul-bwrap = zuul.driver.bubblewrap:main
zuul-web = zuul.cmd.web:main
diff --git a/tests/base.py b/tests/base.py
index fc30c0882..b85bce504 100644
--- a/tests/base.py
+++ b/tests/base.py
@@ -125,6 +125,8 @@ from zuul.lib.logutil import get_annotated_logger
import tests.fakegithub
import tests.fakegitlab
+from tests.otlp_fixture import OTLPFixture
+import opentelemetry.sdk.trace.export
FIXTURE_DIR = os.path.join(os.path.dirname(__file__), 'fixtures')
@@ -333,11 +335,9 @@ class GitlabDriverMock(GitlabDriver):
class TestConnectionRegistry(ConnectionRegistry):
- def __init__(self, changes: Dict[str, Dict[str, Change]],
- config: ConfigParser, additional_event_queues,
- upstream_root: str, poller_events,
- git_url_with_auth: bool,
- add_cleanup: Callable[[Callable[[], None]], None]):
+ def __init__(self, changes, config, additional_event_queues,
+ upstream_root, poller_events, git_url_with_auth,
+ add_cleanup):
self.connections = OrderedDict()
self.drivers = {}
@@ -383,7 +383,8 @@ class FakeGerritChange(object):
def __init__(self, gerrit, number, project, branch, subject,
status='NEW', upstream_root=None, files={},
- parent=None, merge_parents=None, merge_files=None):
+ parent=None, merge_parents=None, merge_files=None,
+ topic=None):
self.gerrit = gerrit
self.source = gerrit
self.reported = 0
@@ -421,6 +422,8 @@ class FakeGerritChange(object):
'submitRecords': [],
'url': '%s/%s' % (self.gerrit.baseurl.rstrip('/'), number)}
+ if topic:
+ self.data['topic'] = topic
self.upstream_root = upstream_root
if merge_parents:
self.addMergePatchset(parents=merge_parents,
@@ -491,7 +494,8 @@ class FakeGerritChange(object):
repo.git.clean('-x', '-f', '-d')
repo.index.merge_tree(parents[1])
- r = repo.index.commit(msg)
+ parent_commits = [repo.commit(p) for p in parents]
+ r = repo.index.commit(msg, parent_commits=parent_commits)
repo.head.reference = 'master'
repo.head.reset(working_tree=True)
@@ -730,11 +734,13 @@ class FakeGerritChange(object):
'username': 'owner_jane'},
'project': self.project,
'subject': self.subject,
- 'topic': 'master',
'url': 'https://hostname/459'},
'comment': message,
'patchSet': self.patchsets[-1],
'type': 'comment-added'}
+ if 'topic' in self.data:
+ event['change']['topic'] = self.data['topic']
+
self.data['submitRecords'] = self.getSubmitRecords()
return json.loads(json.dumps(event))
@@ -810,8 +816,9 @@ class FakeGerritChange(object):
d['isCurrentPatchSet'] = False
return json.loads(json.dumps(self.data))
- def queryHTTP(self):
- self.queried += 1
+ def queryHTTP(self, internal=False):
+ if not internal:
+ self.queried += 1
labels = {}
for cat in self.categories:
labels[cat] = {}
@@ -883,6 +890,8 @@ class FakeGerritChange(object):
}
if 'parents' in self.data:
data['parents'] = self.data['parents']
+ if 'topic' in self.data:
+ data['topic'] = self.data['topic']
return json.loads(json.dumps(data))
def queryRevisionHTTP(self, revision):
@@ -957,6 +966,7 @@ class GerritWebServer(object):
class Server(http.server.SimpleHTTPRequestHandler):
log = logging.getLogger("zuul.test.FakeGerritConnection")
review_re = re.compile('/a/changes/(.*?)/revisions/(.*?)/review')
+ together_re = re.compile('/a/changes/(.*?)/submitted_together')
submit_re = re.compile('/a/changes/(.*?)/submit')
pending_checks_re = re.compile(
r'/a/plugins/checks/checks\.pending/\?'
@@ -1005,6 +1015,9 @@ class GerritWebServer(object):
m = self.files_re.match(path)
if m:
return self.get_files(m.group(1), m.group(2))
+ m = self.together_re.match(path)
+ if m:
+ return self.get_submitted_together(m.group(1))
m = self.change_search_re.match(path)
if m:
return self.get_changes(m.group(1))
@@ -1020,10 +1033,19 @@ class GerritWebServer(object):
self.send_response(500)
self.end_headers()
+ def _403(self, msg):
+ self.send_response(403)
+ self.end_headers()
+ self.wfile.write(msg.encode('utf8'))
+
def _404(self):
self.send_response(404)
self.end_headers()
+ def _409(self):
+ self.send_response(409)
+ self.end_headers()
+
def _get_change(self, change_id):
change_id = urllib.parse.unquote(change_id)
project, branch, change = change_id.split('~')
@@ -1049,7 +1071,7 @@ class GerritWebServer(object):
tag = data.get('tag', None)
fake_gerrit._test_handle_review(
int(change.data['number']), message, False, labels,
- comments, tag=tag)
+ True, False, comments, tag=tag)
self.send_response(200)
self.end_headers()
@@ -1058,10 +1080,32 @@ class GerritWebServer(object):
if not change:
return self._404()
+ if not fake_gerrit._fake_submit_permission:
+ return self._403('submit not permitted')
+
+ candidate = self._get_change(change_id)
+ sr = candidate.getSubmitRecords()
+ if sr[0]['status'] != 'OK':
+ # One of the changes in this topic isn't
+ # ready to merge
+ return self._409()
+ changes_to_merge = set(change.data['number'])
+ if fake_gerrit._fake_submit_whole_topic:
+ results = fake_gerrit._test_get_submitted_together(change)
+ for record in results:
+ candidate = self._get_change(record['id'])
+ sr = candidate.getSubmitRecords()
+ if sr[0]['status'] != 'OK':
+ # One of the changes in this topic isn't
+ # ready to merge
+ return self._409()
+ changes_to_merge.add(candidate.data['number'])
message = None
labels = {}
- fake_gerrit._test_handle_review(
- int(change.data['number']), message, True, labels)
+ for change_number in changes_to_merge:
+ fake_gerrit._test_handle_review(
+ int(change_number), message, True, labels,
+ False, True)
self.send_response(200)
self.end_headers()
@@ -1132,6 +1176,15 @@ class GerritWebServer(object):
self.send_data(data)
self.end_headers()
+ def get_submitted_together(self, number):
+ change = fake_gerrit.changes.get(int(number))
+ if not change:
+ return self._404()
+
+ results = fake_gerrit._test_get_submitted_together(change)
+ self.send_data(results)
+ self.end_headers()
+
def get_changes(self, query):
self.log.debug("simpleQueryHTTP: %s", query)
query = urllib.parse.unquote(query)
@@ -1262,6 +1315,9 @@ class FakeGerritConnection(gerritconnection.GerritConnection):
self.fake_checkers = []
self._poller_event = poller_event
self._ref_watcher_event = ref_watcher_event
+ self._fake_submit_whole_topic = False
+ self._fake_submit_permission = True
+ self.submit_retry_backoff = 0
def onStop(self):
super().onStop()
@@ -1273,14 +1329,15 @@ class FakeGerritConnection(gerritconnection.GerritConnection):
def addFakeChange(self, project, branch, subject, status='NEW',
files=None, parent=None, merge_parents=None,
- merge_files=None):
+ merge_files=None, topic=None):
"""Add a change to the fake Gerrit."""
self.change_number += 1
c = FakeGerritChange(self, self.change_number, project, branch,
subject, upstream_root=self.upstream_root,
status=status, files=files, parent=parent,
merge_parents=merge_parents,
- merge_files=merge_files)
+ merge_files=merge_files,
+ topic=topic)
self.changes[self.change_number] = c
return c
@@ -1345,16 +1402,33 @@ class FakeGerritConnection(gerritconnection.GerritConnection):
return event
def review(self, item, message, submit, labels, checks_api, file_comments,
- zuul_event_id=None):
+ phase1, phase2, zuul_event_id=None):
if self.web_server:
return super(FakeGerritConnection, self).review(
item, message, submit, labels, checks_api, file_comments,
- zuul_event_id)
+ phase1, phase2, zuul_event_id)
self._test_handle_review(int(item.change.number), message, submit,
- labels)
+ labels, phase1, phase2)
+
+ def _test_get_submitted_together(self, change):
+ topic = change.data.get('topic')
+ if not self._fake_submit_whole_topic:
+ topic = None
+ if topic:
+ results = self._simpleQuery(f'topic:{topic}', http=True)
+ else:
+ results = [change.queryHTTP(internal=True)]
+ for dep in change.data.get('dependsOn', []):
+ dep_change = self.changes.get(int(dep['number']))
+ r = dep_change.queryHTTP(internal=True)
+ if r not in results:
+ results.append(r)
+ if len(results) == 1:
+ return []
+ return results
def _test_handle_review(self, change_number, message, submit, labels,
- file_comments=None, tag=None):
+ phase1, phase2, file_comments=None, tag=None):
# Handle a review action from a test
change = self.changes[change_number]
@@ -1368,24 +1442,25 @@ class FakeGerritConnection(gerritconnection.GerritConnection):
# happens they can add their own verified event into the queue.
# Nevertheless, we can update change with the new review in gerrit.
- for cat in labels:
- change.addApproval(cat, labels[cat], username=self.user,
- tag=tag)
-
- if message:
- change.messages.append(message)
-
- if file_comments:
- for filename, commentlist in file_comments.items():
- for comment in commentlist:
- change.addComment(filename, comment['line'],
- comment['message'], 'Zuul',
- 'zuul@example.com', self.user,
- comment.get('range'))
- if submit:
+ if phase1:
+ for cat in labels:
+ change.addApproval(cat, labels[cat], username=self.user,
+ tag=tag)
+
+ if message:
+ change.messages.append(message)
+
+ if file_comments:
+ for filename, commentlist in file_comments.items():
+ for comment in commentlist:
+ change.addComment(filename, comment['line'],
+ comment['message'], 'Zuul',
+ 'zuul@example.com', self.user,
+ comment.get('range'))
+ if message:
+ change.setReported()
+ if submit and phase2:
change.setMerged()
- if message:
- change.setReported()
def queryChangeSSH(self, number, event=None):
self.log.debug("Query change SSH: %s", number)
@@ -1431,6 +1506,10 @@ class FakeGerritConnection(gerritconnection.GerritConnection):
queryMethod(change) for change in self.changes.values()
if change.data["lastUpdated"] >= cut_off_time
]
+ elif query.startswith('topic:'):
+ topic = query[len('topic:'):].strip()
+ l = [queryMethod(change) for change in self.changes.values()
+ if topic in change.data.get('topic', '')]
else:
# Query all open changes
l = [queryMethod(change) for change in self.changes.values()]
@@ -1642,9 +1721,9 @@ class FakePagurePullRequest(object):
return PagureChangeReference.create(
repo, self.getPRReference(), 'refs/tags/init')
- def addCommit(self, files={}):
+ def addCommit(self, files={}, delete_files=None):
"""Adds a commit on top of the actual PR head."""
- self._addCommitInPR(files=files)
+ self._addCommitInPR(files=files, delete_files=delete_files)
self._updateTimeStamp()
def forcePush(self, files={}):
@@ -1652,7 +1731,7 @@ class FakePagurePullRequest(object):
self._addCommitInPR(files=files, reset=True)
self._updateTimeStamp()
- def _addCommitInPR(self, files={}, reset=False):
+ def _addCommitInPR(self, files={}, delete_files=None, reset=False):
repo = self._getRepo()
ref = repo.references[self.getPRReference()]
if reset:
@@ -1664,7 +1743,7 @@ class FakePagurePullRequest(object):
if files:
self.files = files
- else:
+ elif not delete_files:
fn = '%s-%s' % (self.branch.replace('/', '_'), self.number)
self.files = {fn: "test %s %s\n" % (self.branch, self.number)}
msg = self.subject + '-' + str(self.number_of_commits)
@@ -1674,6 +1753,13 @@ class FakePagurePullRequest(object):
f.write(content)
repo.index.add([fn])
+ if delete_files:
+ for fn in delete_files:
+ if fn in self.files:
+ del self.files[fn]
+ fn = os.path.join(repo.working_dir, fn)
+ repo.index.remove([fn])
+
self.commit_stop = repo.index.commit(msg).hexsha
if not self.commit_start:
self.commit_start = self.commit_stop
@@ -1950,11 +2036,12 @@ class FakeGitlabConnection(gitlabconnection.GitlabConnection):
return super(FakeGitlabConnection, self).getGitUrl(project)
def openFakeMergeRequest(self, project,
- branch, title, description='', files=[]):
+ branch, title, description='', files=[],
+ base_sha=None):
self.mr_number += 1
merge_request = FakeGitlabMergeRequest(
self, self.mr_number, project, branch, title, self.upstream_root,
- files=files, description=description)
+ files=files, description=description, base_sha=base_sha)
self.merge_requests.setdefault(
project, {})[str(self.mr_number)] = merge_request
return merge_request
@@ -2040,7 +2127,8 @@ class FakeGitlabMergeRequest(object):
log = logging.getLogger("zuul.test.FakeGitlabMergeRequest")
def __init__(self, gitlab, number, project, branch,
- subject, upstream_root, files=[], description=''):
+ subject, upstream_root, files=[], description='',
+ base_sha=None):
self.gitlab = gitlab
self.source = gitlab
self.number = number
@@ -2057,22 +2145,25 @@ class FakeGitlabMergeRequest(object):
self.state = 'opened'
self.is_merged = False
self.merge_status = 'can_be_merged'
+ self.squash_merge = None
self.labels = []
self.notes = []
self.url = "https://%s/%s/merge_requests/%s" % (
self.gitlab.server, self.project, self.number)
+ self.base_sha = base_sha
self.approved = False
- self.mr_ref = self._createMRRef()
+ self.mr_ref = self._createMRRef(base_sha=base_sha)
self._addCommitInMR(files=files)
def _getRepo(self):
repo_path = os.path.join(self.upstream_root, self.project)
return git.Repo(repo_path)
- def _createMRRef(self):
+ def _createMRRef(self, base_sha=None):
+ base_sha = base_sha or 'refs/tags/init'
repo = self._getRepo()
return GitlabChangeReference.create(
- repo, self.getMRReference(), 'refs/tags/init')
+ repo, self.getMRReference(), base_sha)
def getMRReference(self):
return '%s/head' % self.number
@@ -2085,17 +2176,18 @@ class FakeGitlabMergeRequest(object):
}
)
- def addCommit(self, files=[]):
- self._addCommitInMR(files=files)
+ def addCommit(self, files=[], delete_files=None):
+ self._addCommitInMR(files=files, delete_files=delete_files)
self._updateTimeStamp()
def closeMergeRequest(self):
self.state = 'closed'
self._updateTimeStamp()
- def mergeMergeRequest(self):
+ def mergeMergeRequest(self, squash=None):
self.state = 'merged'
self.is_merged = True
+ self.squash_merge = squash
self._updateTimeStamp()
self.merged_at = self.updated_at
@@ -2104,7 +2196,7 @@ class FakeGitlabMergeRequest(object):
self._updateTimeStamp()
self.merged_at = None
- def _addCommitInMR(self, files=[], reset=False):
+ def _addCommitInMR(self, files=[], delete_files=None, reset=False):
repo = self._getRepo()
ref = repo.references[self.getMRReference()]
if reset:
@@ -2116,7 +2208,7 @@ class FakeGitlabMergeRequest(object):
if files:
self.files = files
- else:
+ elif not delete_files:
fn = '%s-%s' % (self.branch.replace('/', '_'), self.number)
self.files = {fn: "test %s %s\n" % (self.branch, self.number)}
msg = self.subject + '-' + str(self.number_of_commits)
@@ -2126,6 +2218,13 @@ class FakeGitlabMergeRequest(object):
f.write(content)
repo.index.add([fn])
+ if delete_files:
+ for fn in delete_files:
+ if fn in self.files:
+ del self.files[fn]
+ fn = os.path.join(repo.working_dir, fn)
+ repo.index.remove([fn])
+
self.sha = repo.index.commit(msg).hexsha
repo.create_head(self.getMRReference(), self.sha, force=True)
@@ -2273,13 +2372,14 @@ class FakeGithubPullRequest(object):
self.merge_message = None
self.state = 'open'
self.url = 'https://%s/%s/pull/%s' % (github.server, project, number)
- self._createPRRef(base_sha=base_sha)
+ self.base_sha = base_sha
+ self.pr_ref = self._createPRRef(base_sha=base_sha)
self._addCommitToRepo(files=files)
self._updateTimeStamp()
- def addCommit(self, files=None):
+ def addCommit(self, files=None, delete_files=None):
"""Adds a commit on top of the actual PR head."""
- self._addCommitToRepo(files=files)
+ self._addCommitToRepo(files=files, delete_files=delete_files)
self._updateTimeStamp()
def forcePush(self, files=None):
@@ -2445,10 +2545,10 @@ class FakeGithubPullRequest(object):
def _createPRRef(self, base_sha=None):
base_sha = base_sha or 'refs/tags/init'
repo = self._getRepo()
- GithubChangeReference.create(
+ return GithubChangeReference.create(
repo, self.getPRReference(), base_sha)
- def _addCommitToRepo(self, files=None, reset=False):
+ def _addCommitToRepo(self, files=None, delete_files=None, reset=False):
repo = self._getRepo()
ref = repo.references[self.getPRReference()]
if reset:
@@ -2468,11 +2568,11 @@ class FakeGithubPullRequest(object):
normalized_files[fn] = content
else:
normalized_files[tests.fakegithub.FakeFile(fn)] = content
- self.files = normalized_files
- else:
+ self.files.update(normalized_files)
+ elif not delete_files:
fn = '%s-%s' % (self.branch.replace('/', '_'), self.number)
content = f"test {self.branch} {self.number}\n"
- self.files = {tests.fakegithub.FakeFile(fn): content}
+ self.files.update({tests.fakegithub.FakeFile(fn): content})
msg = self.subject + '-' + str(self.number_of_commits)
for fake_file, content in self.files.items():
@@ -2481,8 +2581,16 @@ class FakeGithubPullRequest(object):
f.write(content)
repo.index.add([fn])
+ if delete_files:
+ for fn in delete_files:
+ if fn in self.files:
+ del self.files[fn]
+ fn = os.path.join(repo.working_dir, fn)
+ repo.index.remove([fn])
+
self.head_sha = repo.index.commit(msg).hexsha
repo.create_head(self.getPRReference(), self.head_sha, force=True)
+ self.pr_ref.set_commit(self.head_sha)
# Create an empty set of statuses for the given sha,
# each sha on a PR may have a status set on it
self.statuses[self.head_sha] = []
@@ -2843,6 +2951,17 @@ class FakeGithubConnection(githubconnection.GithubConnection):
}
return (name, data)
+ def getBranchProtectionRuleEvent(self, project, action):
+ name = 'branch_protection_rule'
+ data = {
+ 'action': action,
+ 'rule': {},
+ 'repository': {
+ 'full_name': project,
+ }
+ }
+ return (name, data)
+
def emitEvent(self, event, use_zuulweb=False):
"""Emulates sending the GitHub webhook event to the connection."""
name, data = event
@@ -2876,6 +2995,8 @@ class FakeGithubConnection(githubconnection.GithubConnection):
prefix = 'file://x-access-token:%s@' % auth_token
else:
prefix = ''
+ if self.repo_cache:
+ return prefix + os.path.join(self.repo_cache, str(project))
return prefix + os.path.join(self.upstream_root, str(project))
def real_getGitUrl(self, project):
@@ -2982,6 +3103,8 @@ class FakeBuild(object):
self.paused = False
self.aborted = False
self.requeue = False
+ self.should_fail = False
+ self.should_retry = False
self.created = time.time()
self.changes = None
items = self.parameters['zuul']['items']
@@ -3043,6 +3166,8 @@ class FakeBuild(object):
result = (RecordingAnsibleJob.RESULT_NORMAL, 0) # Success
if self.shouldFail():
result = (RecordingAnsibleJob.RESULT_NORMAL, 1) # Failure
+ if self.shouldRetry():
+ result = (RecordingAnsibleJob.RESULT_NORMAL, None)
if self.aborted:
result = (RecordingAnsibleJob.RESULT_ABORTED, None)
if self.requeue:
@@ -3051,12 +3176,27 @@ class FakeBuild(object):
return result
def shouldFail(self):
+ if self.should_fail:
+ return True
changes = self.executor_server.fail_tests.get(self.name, [])
for change in changes:
if self.hasChanges(change):
return True
return False
+ def shouldRetry(self):
+ if self.should_retry:
+ return True
+ entries = self.executor_server.retry_tests.get(self.name, [])
+ for entry in entries:
+ if self.hasChanges(entry['change']):
+ if entry['retries'] is None:
+ return True
+ if entry['retries']:
+ entry['retries'] = entry['retries'] - 1
+ return True
+ return False
+
def writeReturnData(self):
changes = self.executor_server.return_data.get(self.name, {})
data = changes.get(self.change)
@@ -3402,6 +3542,7 @@ class RecordingExecutorServer(zuul.executor.server.ExecutorServer):
self.running_builds = []
self.build_history = []
self.fail_tests = {}
+ self.retry_tests = {}
self.return_data = {}
self.job_builds = {}
@@ -3418,6 +3559,19 @@ class RecordingExecutorServer(zuul.executor.server.ExecutorServer):
l.append(change)
self.fail_tests[name] = l
+ def retryJob(self, name, change, retries=None):
+ """Instruct the executor to report matching builds as retries.
+
+ :arg str name: The name of the job to fail.
+ :arg Change change: The :py:class:`~tests.base.FakeChange`
+ instance which should cause the job to fail. This job
+ will also fail for changes depending on this change.
+
+ """
+ self.retry_tests.setdefault(name, []).append(
+ dict(change=change,
+ retries=retries))
+
def returnData(self, name, change, data):
"""Instruct the executor to return data for this build.
@@ -3526,7 +3680,7 @@ class FakeSMTP(object):
class FakeNodepool(object):
REQUEST_ROOT = '/nodepool/requests'
NODE_ROOT = '/nodepool/nodes'
- LAUNCHER_ROOT = '/nodepool/launchers'
+ COMPONENT_ROOT = '/nodepool/components'
log = logging.getLogger("zuul.test.FakeNodepool")
@@ -3558,6 +3712,7 @@ class FakeNodepool(object):
self.python_path = 'auto'
self.shell_type = None
self.connection_port = None
+ self.history = []
def stop(self):
self._running = False
@@ -3589,10 +3744,11 @@ class FakeNodepool(object):
self.fulfillRequest(req)
def registerLauncher(self, labels=["label1"], id="FakeLauncher"):
- path = os.path.join(self.LAUNCHER_ROOT, id)
+ path = os.path.join(self.COMPONENT_ROOT, 'pool', id)
data = {'id': id, 'supported_labels': labels}
self.client.create(
- path, json.dumps(data).encode('utf8'), makepath=True)
+ path, json.dumps(data).encode('utf8'),
+ ephemeral=True, makepath=True, sequence=True)
def getNodeRequests(self):
try:
@@ -3636,7 +3792,7 @@ class FakeNodepool(object):
nodes.append(data)
return nodes
- def makeNode(self, request_id, node_type):
+ def makeNode(self, request_id, node_type, request):
now = time.time()
path = '/nodepool/nodes/'
remote_ip = os.environ.get('ZUUL_REMOTE_IPV4', '127.0.0.1')
@@ -3695,6 +3851,8 @@ class FakeNodepool(object):
if 'fedora-pod' in node_type:
data['connection_type'] = 'kubectl'
data['connection_port']['pod'] = 'fedora-abcdefg'
+ data['tenant_name'] = request['tenant_name']
+ data['requestor'] = request['requestor']
data = json.dumps(data).encode('utf8')
path = self.client.create(path, data,
@@ -3714,6 +3872,7 @@ class FakeNodepool(object):
if request['state'] != 'requested':
return
request = request.copy()
+ self.history.append(request)
oid = request['_oid']
del request['_oid']
@@ -3723,7 +3882,7 @@ class FakeNodepool(object):
request['state'] = 'fulfilled'
nodes = request.get('nodes', [])
for node in request['node_types']:
- nodeid = self.makeNode(oid, node)
+ nodeid = self.makeNode(oid, node, request)
nodes.append(nodeid)
request['nodes'] = nodes
@@ -4271,11 +4430,12 @@ class SchedulerTestApp:
def __init__(self, log, config, changes, additional_event_queues,
upstream_root, poller_events,
git_url_with_auth, add_cleanup, validate_tenants,
- instance_id):
+ wait_for_init, instance_id):
self.log = log
self.config = config
self.changes = changes
self.validate_tenants = validate_tenants
+ self.wait_for_init = wait_for_init
# Register connections from the config using fakes
self.connections = TestConnectionRegistry(
@@ -4289,7 +4449,8 @@ class SchedulerTestApp:
)
self.connections.configure(self.config)
- self.sched = TestScheduler(self.config, self.connections, self)
+ self.sched = TestScheduler(self.config, self.connections, self,
+ wait_for_init)
self.sched.log = logging.getLogger(f"zuul.Scheduler-{instance_id}")
self.sched._stats_interval = 1
@@ -4311,9 +4472,16 @@ class SchedulerTestApp:
else:
self.sched.validateTenants(self.config, validate_tenants)
- def fullReconfigure(self):
+ def fullReconfigure(self, command_socket=False):
try:
- self.sched.reconfigure(self.config)
+ if command_socket:
+ command_socket = self.sched.config.get(
+ 'scheduler', 'command_socket')
+ with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
+ s.connect(command_socket)
+ s.sendall('full-reconfigure\n'.encode('utf8'))
+ else:
+ self.sched.reconfigure(self.config)
except Exception:
self.log.exception("Reconfiguration failed:")
@@ -4330,21 +4498,30 @@ class SchedulerTestApp:
except Exception:
self.log.exception("Reconfiguration failed:")
- def tenantReconfigure(self, tenants):
+ def tenantReconfigure(self, tenants, command_socket=False):
try:
- self.sched.reconfigure(self.config, smart=False, tenants=tenants)
+ if command_socket:
+ command_socket = self.sched.config.get(
+ 'scheduler', 'command_socket')
+ args = json.dumps(tenants)
+ with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
+ s.connect(command_socket)
+ s.sendall(f'tenant-reconfigure {args}\n'.
+ encode('utf8'))
+ else:
+ self.sched.reconfigure(
+ self.config, smart=False, tenants=tenants)
except Exception:
self.log.exception("Reconfiguration failed:")
class SchedulerTestManager:
- def __init__(self, validate_tenants):
+ def __init__(self, validate_tenants, wait_for_init):
self.instances = []
- self.validate_tenants = validate_tenants
def create(self, log, config, changes, additional_event_queues,
- upstream_root, poller_events,
- git_url_with_auth, add_cleanup, validate_tenants):
+ upstream_root, poller_events, git_url_with_auth,
+ add_cleanup, validate_tenants, wait_for_init):
# Since the config contains a regex we cannot use copy.deepcopy()
# as this will raise an exception with Python <3.7
config_data = StringIO()
@@ -4365,7 +4542,7 @@ class SchedulerTestManager:
additional_event_queues, upstream_root,
poller_events,
git_url_with_auth, add_cleanup,
- validate_tenants, instance_id)
+ validate_tenants, wait_for_init, instance_id)
self.instances.append(app)
return app
@@ -4468,6 +4645,7 @@ class ZuulTestCase(BaseTestCase):
git_url_with_auth: bool = False
log_console_port: int = 19885
validate_tenants = None
+ wait_for_init = None
scheduler_count = SCHEDULER_COUNT
def __getattr__(self, name):
@@ -4632,7 +4810,8 @@ class ZuulTestCase(BaseTestCase):
self.history = self.executor_server.build_history
self.builds = self.executor_server.running_builds
- self.scheds = SchedulerTestManager(self.validate_tenants)
+ self.scheds = SchedulerTestManager(self.validate_tenants,
+ self.wait_for_init)
for _ in range(self.scheduler_count):
self.createScheduler()
@@ -4651,7 +4830,7 @@ class ZuulTestCase(BaseTestCase):
self.log, self.config, self.changes,
self.additional_event_queues, self.upstream_root,
self.poller_events, self.git_url_with_auth,
- self.addCleanup, self.validate_tenants)
+ self.addCleanup, self.validate_tenants, self.wait_for_init)
def createZKContext(self, lock=None):
if lock is None:
@@ -4744,6 +4923,15 @@ class ZuulTestCase(BaseTestCase):
if 'database' in config.sections():
_setup_fixture(config, 'database')
+ if 'tracing' in config.sections():
+ self.otlp = OTLPFixture()
+ self.useFixture(self.otlp)
+ self.useFixture(fixtures.MonkeyPatch(
+ 'zuul.lib.tracing.Tracing.processor_class',
+ opentelemetry.sdk.trace.export.SimpleSpanProcessor))
+ config.set('tracing', 'endpoint',
+ f'http://localhost:{self.otlp.port}')
+
if not self.setupSimpleLayout(config):
tenant_config = None
for cfg_attr in ('tenant_config', 'tenant_config_script'):
@@ -5030,6 +5218,7 @@ class ZuulTestCase(BaseTestCase):
and not t.name.startswith('Dummy-')
and not t.name.startswith('pydevd.')
and not t.name.startswith('ptvsd.')
+ and not t.name.startswith('OTLPFixture_')
]
if len(threads) > 1:
thread_map = dict(map(lambda x: (x.ident, x.name),
@@ -5090,8 +5279,9 @@ class ZuulTestCase(BaseTestCase):
repo.head.reset(working_tree=True)
repo.delete_head(repo.heads[branch], force=True)
- def create_commit(self, project, files=None, head='master',
- message='Creating a fake commit', **kwargs):
+ def create_commit(self, project, files=None, delete_files=None,
+ head='master', message='Creating a fake commit',
+ **kwargs):
path = os.path.join(self.upstream_root, project)
repo = git.Repo(path)
repo.head.reference = repo.heads[head]
@@ -5103,6 +5293,12 @@ class ZuulTestCase(BaseTestCase):
with open(file_name, 'a') as f:
f.write(content)
repo.index.add([file_name])
+
+ delete_files = delete_files or []
+ for name in delete_files:
+ file_name = os.path.join(path, name)
+ repo.index.remove([file_name])
+
commit = repo.index.commit(message, **kwargs)
return commit.hexsha
@@ -5603,6 +5799,19 @@ class ZuulTestCase(BaseTestCase):
raise StatException("Key %s found in reported stats: %s" %
(key, value))
+ def assertRegexInList(self, regex, items):
+ r = re.compile(regex)
+ for x in items:
+ if r.search(x):
+ return
+ raise Exception("Regex '%s' not in %s" % (regex, items))
+
+ def assertRegexNotInList(self, regex, items):
+ r = re.compile(regex)
+ for x in items:
+ if r.search(x):
+ raise Exception("Regex '%s' in %s" % (regex, items))
+
def assertBuilds(self, builds):
"""Assert that the running builds are as described.
diff --git a/tests/fakegithub.py b/tests/fakegithub.py
index ad8c48542..47cefd08d 100644
--- a/tests/fakegithub.py
+++ b/tests/fakegithub.py
@@ -541,6 +541,7 @@ class FakePull(object):
'full_name': pr.project
},
'ref': pr.branch,
+ 'sha': pr.base_sha,
},
'user': {
'login': 'octocat'
diff --git a/tests/fakegitlab.py b/tests/fakegitlab.py
index 69b1faaa2..c4706b3b1 100644
--- a/tests/fakegitlab.py
+++ b/tests/fakegitlab.py
@@ -163,8 +163,8 @@ class GitlabWebServer(object):
'merged_at': mr.merged_at.strftime('%Y-%m-%dT%H:%M:%S.%fZ')
if mr.merged_at else mr.merged_at,
'diff_refs': {
- 'base_sha': 'c380d3acebd181f13629a25d2e2acca46ffe1e00',
- 'head_sha': '2be7ddb704c7b6b83732fdd5b9f09d5a397b5f8f',
+ 'base_sha': mr.base_sha,
+ 'head_sha': mr.sha,
'start_sha': 'c380d3acebd181f13629a25d2e2acca46ffe1e00'
},
'merge_status': mr.merge_status,
@@ -233,7 +233,10 @@ class GitlabWebServer(object):
def put_mr_merge(self, data, project, mr):
mr = self._get_mr(project, mr)
- mr.mergeMergeRequest()
+ squash = None
+ if data and isinstance(data, dict):
+ squash = data.get('squash')
+ mr.mergeMergeRequest(squash)
self.send_data({'state': 'merged'})
def put_mr_update(self, data, project, mr):
diff --git a/tests/fixtures/bwrap-mounts/archive.tar b/tests/fixtures/bwrap-mounts/archive.tar
deleted file mode 100644
index 0c6f83acd..000000000
--- a/tests/fixtures/bwrap-mounts/archive.tar
+++ /dev/null
Binary files differ
diff --git a/tests/fixtures/bwrap-mounts/assemble/one b/tests/fixtures/bwrap-mounts/assemble/one
deleted file mode 100644
index 5626abf0f..000000000
--- a/tests/fixtures/bwrap-mounts/assemble/one
+++ /dev/null
@@ -1 +0,0 @@
-one
diff --git a/tests/fixtures/bwrap-mounts/assemble/two b/tests/fixtures/bwrap-mounts/assemble/two
deleted file mode 100644
index f719efd43..000000000
--- a/tests/fixtures/bwrap-mounts/assemble/two
+++ /dev/null
@@ -1 +0,0 @@
-two
diff --git a/tests/fixtures/bwrap-mounts/file b/tests/fixtures/bwrap-mounts/file
deleted file mode 100644
index f73f3093f..000000000
--- a/tests/fixtures/bwrap-mounts/file
+++ /dev/null
@@ -1 +0,0 @@
-file
diff --git a/tests/fixtures/bwrap-mounts/patch b/tests/fixtures/bwrap-mounts/patch
deleted file mode 100644
index aa2c60eb0..000000000
--- a/tests/fixtures/bwrap-mounts/patch
+++ /dev/null
@@ -1,7 +0,0 @@
-diff --git a/readme.txt b/readme.txt
-index 24308cb..b07f0ed 100644
---- a/readme.txt
-+++ b/readme.txt
-@@ -1 +1 @@
--This is a readme
-+This is a README
diff --git a/tests/fixtures/bwrap-mounts/patch-dest/readme.txt b/tests/fixtures/bwrap-mounts/patch-dest/readme.txt
deleted file mode 100644
index 24308cb38..000000000
--- a/tests/fixtures/bwrap-mounts/patch-dest/readme.txt
+++ /dev/null
@@ -1 +0,0 @@
-This is a readme
diff --git a/tests/fixtures/bwrap-mounts/script.sh b/tests/fixtures/bwrap-mounts/script.sh
deleted file mode 100644
index 6baacbc54..000000000
--- a/tests/fixtures/bwrap-mounts/script.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-echo one
diff --git a/tests/fixtures/bwrap-mounts/vars.yaml b/tests/fixtures/bwrap-mounts/vars.yaml
deleted file mode 100644
index 87d3493d0..000000000
--- a/tests/fixtures/bwrap-mounts/vars.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
----
-
-some_var: one
diff --git a/tests/fixtures/bwrap-mounts/vars/one.yaml b/tests/fixtures/bwrap-mounts/vars/one.yaml
deleted file mode 100644
index 09189d3c2..000000000
--- a/tests/fixtures/bwrap-mounts/vars/one.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
----
-
-first_var: one
diff --git a/tests/fixtures/bwrap-mounts/vars/two.yaml b/tests/fixtures/bwrap-mounts/vars/two.yaml
deleted file mode 100644
index 9a19df18c..000000000
--- a/tests/fixtures/bwrap-mounts/vars/two.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
----
-
-second_var: two
diff --git a/tests/fixtures/config/ansible-callbacks/git/common-config/playbooks/callback.yaml b/tests/fixtures/config/ansible-callbacks/git/common-config/playbooks/callback.yaml
index 50bbbbfc5..13ddac988 100644
--- a/tests/fixtures/config/ansible-callbacks/git/common-config/playbooks/callback.yaml
+++ b/tests/fixtures/config/ansible-callbacks/git/common-config/playbooks/callback.yaml
@@ -1,4 +1,8 @@
- hosts: localhost
- gather_facts: smart
+ gather_facts: false
tasks:
- command: echo test
+
+ - name: Echo ansible version.
+ debug:
+ msg: Ansible version={{ ansible_version.major }}.{{ ansible_version.minor }}
diff --git a/tests/fixtures/config/ansible-callbacks/git/common-config/playbooks/callback_plugins/test_callback.py b/tests/fixtures/config/ansible-callbacks/git/common-config/playbooks/callback_plugins/test_callback.py
index 39ff7cd49..2597370bc 100644
--- a/tests/fixtures/config/ansible-callbacks/git/common-config/playbooks/callback_plugins/test_callback.py
+++ b/tests/fixtures/config/ansible-callbacks/git/common-config/playbooks/callback_plugins/test_callback.py
@@ -15,17 +15,20 @@ DOCUMENTATION = '''
class CallbackModule(CallbackBase):
- CALLBACK_VERSION = 1.0
+ """
+ test callback
+ """
+ CALLBACK_VERSION = 2.0
CALLBACK_NEEDS_WHITELIST = True
+ # aggregate means we can be loaded and not be the stdout plugin
+ CALLBACK_TYPE = 'aggregate'
+ CALLBACK_NAME = 'test_callback'
def __init__(self):
super(CallbackModule, self).__init__()
- def set_options(self, task_keys=None, var_options=None, direct=None):
- super(CallbackModule, self).set_options(task_keys=task_keys,
- var_options=var_options,
- direct=direct)
-
+ def set_options(self, *args, **kw):
+ super(CallbackModule, self).set_options(*args, **kw)
self.file_name = self.get_option('file_name')
def v2_on_any(self, *args, **kwargs):
diff --git a/tests/fixtures/config/ansible-callbacks/main.yaml b/tests/fixtures/config/ansible-callbacks/main.yaml
index 9d01f542f..1e5247e4a 100644
--- a/tests/fixtures/config/ansible-callbacks/main.yaml
+++ b/tests/fixtures/config/ansible-callbacks/main.yaml
@@ -1,5 +1,6 @@
- tenant:
name: tenant-one
+ default-ansible-version: SETME
source:
gerrit:
config-projects:
diff --git a/tests/fixtures/config/ansible-callbacks/main5.yaml b/tests/fixtures/config/ansible-callbacks/main5.yaml
new file mode 100644
index 000000000..5efc12339
--- /dev/null
+++ b/tests/fixtures/config/ansible-callbacks/main5.yaml
@@ -0,0 +1,7 @@
+- tenant:
+ name: tenant-one
+ default-ansible-version: '5'
+ source:
+ gerrit:
+ config-projects:
+ - common-config
diff --git a/tests/fixtures/config/ansible-callbacks/main6.yaml b/tests/fixtures/config/ansible-callbacks/main6.yaml
new file mode 100644
index 000000000..2467362bb
--- /dev/null
+++ b/tests/fixtures/config/ansible-callbacks/main6.yaml
@@ -0,0 +1,7 @@
+- tenant:
+ name: tenant-one
+ default-ansible-version: '6'
+ source:
+ gerrit:
+ config-projects:
+ - common-config
diff --git a/tests/fixtures/config/ansible-json-string-results/git/org_project/playbooks/json-results-strings.yaml b/tests/fixtures/config/ansible-json-string-results/git/org_project/playbooks/json-results-strings.yaml
new file mode 100644
index 000000000..c3aa1c686
--- /dev/null
+++ b/tests/fixtures/config/ansible-json-string-results/git/org_project/playbooks/json-results-strings.yaml
@@ -0,0 +1,18 @@
+- hosts: localhost
+ gather_facts: no
+ tasks:
+
+ - name: Ensure we handle string returns properly
+ return_strings:
+ an_arg: 'if you see this string, it is working'
+
+
+ - name: Ensure this never shows up
+ return_strings:
+ an_arg: 'this is a secret string'
+ no_log: '{{ item }}'
+ # If any loop iteration is no_log, they all are; see
+ # https://github.com/ansible/ansible/commit/bda074d34e46ee9862a48ed067ad42260d3f92ab
+ loop:
+ - true
+ - false
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/roles/test-local-override/library/file.py b/tests/fixtures/config/ansible-json-string-results/git/org_project/playbooks/library/return_strings.py
index 63478f707..3cc085fd0 100644
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/roles/test-local-override/library/file.py
+++ b/tests/fixtures/config/ansible-json-string-results/git/org_project/playbooks/library/return_strings.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2017 Red Hat
+# Copyright (c) 2022 Red Hat
#
# This module is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -16,16 +16,25 @@
# This file, by existing, should be found instead of ansible's built in
# file module.
+from ansible.module_utils.basic import * # noqa
+from ansible.module_utils.basic import AnsibleModule
+
def main():
module = AnsibleModule(
argument_spec=dict(
- path=dict(required=False, type='str'),
- state=dict(required=False, type='dict'),
+ an_arg=dict(required=True, type='str'),
)
)
- module.exit_json(changed=False)
+ results = [
+ 'this is a string',
+ module.params['an_arg'],
+ 'a final string'
+ ]
-from ansible.module_utils.basic import * # noqa
-from ansible.module_utils.basic import AnsibleModule
+ module.exit_json(msg="A plugin message", results=results)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/tests/fixtures/config/speculative-plugins/git/common-config/zuul.yaml b/tests/fixtures/config/ansible-json-string-results/git/org_project/zuul.yaml
index a07342e2e..8a17a3ba8 100644
--- a/tests/fixtures/config/speculative-plugins/git/common-config/zuul.yaml
+++ b/tests/fixtures/config/ansible-json-string-results/git/org_project/zuul.yaml
@@ -15,3 +15,13 @@
- job:
name: base
parent: null
+
+- job:
+ name: json-results-strings
+ attempts: 1
+ run: playbooks/json-results-strings.yaml
+
+- project:
+ check:
+ jobs:
+ - json-results-strings
diff --git a/tests/fixtures/config/ansible-json-string-results/main.yaml b/tests/fixtures/config/ansible-json-string-results/main.yaml
new file mode 100644
index 000000000..73787886f
--- /dev/null
+++ b/tests/fixtures/config/ansible-json-string-results/main.yaml
@@ -0,0 +1,6 @@
+- tenant:
+ name: tenant-one
+ source:
+ gerrit:
+ config-projects:
+ - org/project
diff --git a/tests/fixtures/config/ansible-versions/git/common-config/zuul.yaml b/tests/fixtures/config/ansible-versions/git/common-config/zuul.yaml
index 8cef613a4..497053c90 100644
--- a/tests/fixtures/config/ansible-versions/git/common-config/zuul.yaml
+++ b/tests/fixtures/config/ansible-versions/git/common-config/zuul.yaml
@@ -25,7 +25,7 @@
parent: ansible-version
vars:
test_ansible_version_major: 2
- test_ansible_version_minor: 9
+ test_ansible_version_minor: 12
# This job is used by a test case specifying a different ansible version in
# zuul.conf
@@ -34,37 +34,36 @@
parent: ansible-version
vars:
test_ansible_version_major: 2
- test_ansible_version_minor: 8
+ test_ansible_version_minor: 13
- job:
- name: ansible-28
+ name: ansible-5
parent: ansible-version
- ansible-version: 2.8
+ ansible-version: 5
vars:
test_ansible_version_major: 2
- test_ansible_version_minor: 8
+ test_ansible_version_minor: 12
- job:
- name: ansible-29
+ name: ansible-6
parent: ansible-version
- ansible-version: 2.9
+ ansible-version: 6
vars:
test_ansible_version_major: 2
- test_ansible_version_minor: 9
-
+ test_ansible_version_minor: 13
- project:
name: common-config
check:
jobs:
- ansible-default
- - ansible-28
- - ansible-29
+ - ansible-5
+ - ansible-6
- project:
name: org/project
check:
jobs:
- ansible-default-zuul-conf
- - ansible-28
- - ansible-29
+ - ansible-5
+ - ansible-6
diff --git a/tests/fixtures/config/ansible/git/common-config/playbooks/bubblewrap.yaml b/tests/fixtures/config/ansible/git/common-config/playbooks/bubblewrap.yaml
new file mode 100644
index 000000000..298bb03cd
--- /dev/null
+++ b/tests/fixtures/config/ansible/git/common-config/playbooks/bubblewrap.yaml
@@ -0,0 +1,12 @@
+- hosts: localhost
+ tasks:
+ - name: Verify that we are unable to write to a ro mount
+ shell: "cp {{ zuul.executor.inventory_file }} /bin/bubblewrap-test-failure"
+ ignore_errors: true
+ register: cp_result
+ - assert:
+ that:
+ - cp_result.rc == 1
+ - "'Read-only file system' in cp_result.stdout"
+ - name: Verify that we are able to write to a rw mount
+ shell: "cp {{ zuul.executor.inventory_file }} {{ zuul.executor.work_root }}/bubblewrap-test-success"
diff --git a/tests/fixtures/config/ansible/git/common-config/zuul.yaml b/tests/fixtures/config/ansible/git/common-config/zuul.yaml
index 78f5f30fd..55102978e 100644
--- a/tests/fixtures/config/ansible/git/common-config/zuul.yaml
+++ b/tests/fixtures/config/ansible/git/common-config/zuul.yaml
@@ -239,3 +239,9 @@
name: failpost
run: playbooks/post-broken.yaml
post-run: playbooks/post-broken.yaml
+
+- job:
+ name: bubblewrap
+ run: playbooks/bubblewrap.yaml
+ nodeset:
+ nodes: []
diff --git a/tests/fixtures/config/ansible/git/org_ansible/playbooks/hello-ansible.yaml b/tests/fixtures/config/ansible/git/org_ansible/playbooks/hello-ansible.yaml
index 17ddc1661..d0458c710 100644
--- a/tests/fixtures/config/ansible/git/org_ansible/playbooks/hello-ansible.yaml
+++ b/tests/fixtures/config/ansible/git/org_ansible/playbooks/hello-ansible.yaml
@@ -3,3 +3,7 @@
- name: hello
debug:
msg: hello ansible
+
+ - name: Echo ansible version.
+ debug:
+ msg: Ansible version={{ ansible_version.major }}.{{ ansible_version.minor }}
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/block_local_override.yaml b/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/block_local_override.yaml
deleted file mode 100644
index 58613add0..000000000
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/block_local_override.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-- hosts: localhost
- roles:
- - test-local-override
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/cartesian.yaml b/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/cartesian.yaml
deleted file mode 100644
index a2e92a281..000000000
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/cartesian.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-- hosts: all
- vars:
- value: "{{ lookup('cartesian', [1, 2], [3, 4]) }}"
- tasks:
- - debug: msg="value is {{ value }}"
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/consul_kv.yaml b/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/consul_kv.yaml
deleted file mode 100644
index 8cfee2e00..000000000
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/consul_kv.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-- hosts: all
- tasks:
- - debug: msg='key contains {{item}}'
- with_consul_kv:
- - 'key/to/retrieve'
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/credstash.yaml b/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/credstash.yaml
deleted file mode 100644
index 1a592815a..000000000
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/credstash.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-- hosts: all
- tasks:
- - debug: msg='key contains {{item}}'
- with_credstash:
- - 'key'
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/csvfile_bad.yaml b/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/csvfile_bad.yaml
deleted file mode 100644
index 66e1d84fd..000000000
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/csvfile_bad.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-- hosts: all
- vars:
- value: "{{ lookup('csvfile', 'a file=/etc/passwd') }}"
- tasks:
- - debug: msg="value is {{ value }}"
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/csvfile_good.yaml b/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/csvfile_good.yaml
deleted file mode 100644
index 74ef51ea6..000000000
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/csvfile_good.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-- hosts: all
- vars:
- value: "{{ lookup('csvfile', 'a file=test.csv delimiter=,') }}"
- tasks:
- - debug: msg="value is {{ value }}"
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/file_local_bad.yaml b/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/file_local_bad.yaml
deleted file mode 100644
index b567dfe2f..000000000
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/file_local_bad.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-- hosts: localhost
- tasks:
- - name: Try to verify a file in a bad location
- file:
- dest: /tmp/unreadable
- state: absent
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/file_local_good.yaml b/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/file_local_good.yaml
deleted file mode 100644
index 29b543122..000000000
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/file_local_good.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-- hosts: localhost
- tasks:
- - name: Try to verify a file in an ok location
- file:
- dest: non-existent
- state: absent
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/fileglob_local_bad.yaml b/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/fileglob_local_bad.yaml
deleted file mode 100644
index b938c60dc..000000000
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/fileglob_local_bad.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-- hosts: localhost
- tasks:
- - name: fileglob in a bad location
- debug:
- msg: '{{ lookup("fileglob", "/tmp/*") }}'
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/fileglob_local_good.yaml b/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/fileglob_local_good.yaml
deleted file mode 100644
index 5fa9e304a..000000000
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/fileglob_local_good.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-- hosts: localhost
- tasks:
- - name: fileglob in a good location
- debug:
- msg: '{{ lookup("fileglob", zuul.executor.work_root + "/*") }}'
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/find_local_bad.yaml b/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/find_local_bad.yaml
deleted file mode 100644
index c6eb4d723..000000000
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/find_local_bad.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-- hosts: localhost
- tasks:
- - name: Find in a bad location
- find:
- paths: '/tmp/'
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/find_local_good.yaml b/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/find_local_good.yaml
deleted file mode 100644
index 2e9af5b90..000000000
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/find_local_good.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-- hosts: localhost
- tasks:
- - name: Find in a good location
- find:
- paths: '{{ zuul.executor.work_root }}'
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/passwd.yaml b/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/passwd.yaml
deleted file mode 100644
index cc7480221..000000000
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/passwd.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-- hosts: all
- vars:
- value: "{{ lookup('file', '/etc/passwd') }}"
- tasks:
- - debug: msg="value is {{ value }}"
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/password_create_bad.yaml b/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/password_create_bad.yaml
deleted file mode 100644
index a346fdae9..000000000
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/password_create_bad.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-- hosts: all
- vars:
- value: "{{ lookup('password', '/etc/passwd') }}"
- tasks:
- - debug: msg="value is {{ value }}"
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/password_create_good.yaml b/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/password_create_good.yaml
deleted file mode 100644
index 5aa95d247..000000000
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/password_create_good.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-- hosts: all
- vars:
- value: "{{ lookup('password', '{{ zuul.executor.work_root }}/test.newpassword') }}"
- tasks:
- - debug: msg="value is {{ value }}"
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/password_null_good.yaml b/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/password_null_good.yaml
deleted file mode 100644
index 8f42c1cf7..000000000
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/password_null_good.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-- hosts: all
- vars:
- value: "{{ lookup('password', '/dev/null') }}"
- tasks:
- - debug: msg="value is {{ value }}"
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/password_read_bad.yaml b/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/password_read_bad.yaml
deleted file mode 100644
index a346fdae9..000000000
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/password_read_bad.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-- hosts: all
- vars:
- value: "{{ lookup('password', '/etc/passwd') }}"
- tasks:
- - debug: msg="value is {{ value }}"
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/password_read_good.yaml b/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/password_read_good.yaml
deleted file mode 100644
index b40c46575..000000000
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/password_read_good.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-- hosts: all
- tasks:
- - copy:
- content: 'an_example_password'
- dest: "{{zuul.executor.work_root}}/test.password"
-- hosts: all
- vars:
- value: "{{ lookup('password', '{{zuul.executor.work_root}}/test.password') }}"
- tasks:
- - debug: msg="value is {{ value }}"
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/roles/test-local-override/tasks/main.yaml b/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/roles/test-local-override/tasks/main.yaml
deleted file mode 100644
index a06608b0e..000000000
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/roles/test-local-override/tasks/main.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- name: Attempt to use local version of file.py
- file:
- path: some-file.out
- state: touch
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/test.csv b/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/test.csv
deleted file mode 100644
index b2ffb0252..000000000
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/test.csv
+++ /dev/null
@@ -1 +0,0 @@
-a,b,c
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/uri_bad_path.yaml b/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/uri_bad_path.yaml
deleted file mode 100644
index 7130704da..000000000
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/uri_bad_path.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-- hosts: localhost
- tasks:
- - uri:
- method: GET
- url: https://example.com
- dest: /tmp/example.out
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/uri_bad_scheme.yaml b/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/uri_bad_scheme.yaml
deleted file mode 100644
index 5d717936e..000000000
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/uri_bad_scheme.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-- hosts: localhost
- tasks:
- - uri:
- method: GET
- url: file:///etc/passwd
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/zuul_return.yaml b/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/zuul_return.yaml
deleted file mode 100644
index 47645b722..000000000
--- a/tests/fixtures/config/ansible/git/org_plugin-project/playbooks/zuul_return.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-- hosts: localhost
- tasks:
- - name: Execute zuul_return
- zuul_return:
- data:
- foo: bar
diff --git a/tests/fixtures/config/ansible/git/org_project/.zuul.yaml b/tests/fixtures/config/ansible/git/org_project/.zuul.yaml
index 2a974c36d..86d55e1cd 100644
--- a/tests/fixtures/config/ansible/git/org_project/.zuul.yaml
+++ b/tests/fixtures/config/ansible/git/org_project/.zuul.yaml
@@ -34,3 +34,4 @@
- multiple-child-no-run
- multiple-run
- multiple-run-failure
+ - bubblewrap
diff --git a/tests/fixtures/config/ansible/main.yaml b/tests/fixtures/config/ansible/main.yaml
index f7d459c85..473bb5ef8 100644
--- a/tests/fixtures/config/ansible/main.yaml
+++ b/tests/fixtures/config/ansible/main.yaml
@@ -1,11 +1,11 @@
- tenant:
name: tenant-one
+ default-ansible-version: SETME
source:
gerrit:
config-projects:
- common-config
untrusted-projects:
- org/project
- - org/plugin-project
- bare-role
- org/ansible
diff --git a/tests/fixtures/config/ansible/main5.yaml b/tests/fixtures/config/ansible/main5.yaml
new file mode 100644
index 000000000..b2364e80b
--- /dev/null
+++ b/tests/fixtures/config/ansible/main5.yaml
@@ -0,0 +1,11 @@
+- tenant:
+ name: tenant-one
+ default-ansible-version: '5'
+ source:
+ gerrit:
+ config-projects:
+ - common-config
+ untrusted-projects:
+ - org/project
+ - bare-role
+ - org/ansible
diff --git a/tests/fixtures/config/ansible/main6.yaml b/tests/fixtures/config/ansible/main6.yaml
new file mode 100644
index 000000000..7db6af6da
--- /dev/null
+++ b/tests/fixtures/config/ansible/main6.yaml
@@ -0,0 +1,11 @@
+- tenant:
+ name: tenant-one
+ default-ansible-version: '6'
+ source:
+ gerrit:
+ config-projects:
+ - common-config
+ untrusted-projects:
+ - org/project
+ - bare-role
+ - org/ansible
diff --git a/tests/fixtures/config/authorization/rules-templating/git/common-config/zuul.yaml b/tests/fixtures/config/authorization/rules-templating/git/common-config/zuul.yaml
index 750d578ec..b4ca647e0 100644
--- a/tests/fixtures/config/authorization/rules-templating/git/common-config/zuul.yaml
+++ b/tests/fixtures/config/authorization/rules-templating/git/common-config/zuul.yaml
@@ -126,6 +126,7 @@
- project:
name: org/project1
+ queue: integrated
check:
jobs:
- project-merge
@@ -136,7 +137,6 @@
- project1-project2-integration:
dependencies: project-merge
gate:
- queue: integrated
jobs:
- project-merge
- project-test1:
@@ -148,6 +148,7 @@
- project:
name: org/project2
+ queue: integrated
check:
jobs:
- project-merge
@@ -158,7 +159,6 @@
- project1-project2-integration:
dependencies: project-merge
gate:
- queue: integrated
jobs:
- project-merge
- project-test1:
@@ -170,6 +170,7 @@
- project:
name: common-config
+ queue: integrated
check:
jobs:
- project-merge
@@ -180,7 +181,6 @@
- project1-project2-integration:
dependencies: project-merge
gate:
- queue: integrated
jobs:
- project-merge
- project-test1:
diff --git a/tests/fixtures/config/authorization/single-tenant/git/common-config/zuul.yaml b/tests/fixtures/config/authorization/single-tenant/git/common-config/zuul.yaml
index 750d578ec..b4ca647e0 100644
--- a/tests/fixtures/config/authorization/single-tenant/git/common-config/zuul.yaml
+++ b/tests/fixtures/config/authorization/single-tenant/git/common-config/zuul.yaml
@@ -126,6 +126,7 @@
- project:
name: org/project1
+ queue: integrated
check:
jobs:
- project-merge
@@ -136,7 +137,6 @@
- project1-project2-integration:
dependencies: project-merge
gate:
- queue: integrated
jobs:
- project-merge
- project-test1:
@@ -148,6 +148,7 @@
- project:
name: org/project2
+ queue: integrated
check:
jobs:
- project-merge
@@ -158,7 +159,6 @@
- project1-project2-integration:
dependencies: project-merge
gate:
- queue: integrated
jobs:
- project-merge
- project-test1:
@@ -170,6 +170,7 @@
- project:
name: common-config
+ queue: integrated
check:
jobs:
- project-merge
@@ -180,7 +181,6 @@
- project1-project2-integration:
dependencies: project-merge
gate:
- queue: integrated
jobs:
- project-merge
- project-test1:
diff --git a/tests/fixtures/config/change-queues/git/common-config/zuul.d/config.yaml b/tests/fixtures/config/change-queues/git/common-config/zuul.d/config.yaml
index 0fe373866..e548b52b6 100644
--- a/tests/fixtures/config/change-queues/git/common-config/zuul.d/config.yaml
+++ b/tests/fixtures/config/change-queues/git/common-config/zuul.d/config.yaml
@@ -29,8 +29,8 @@
- project:
name: org/project2
+ queue: integrated
gate:
- queue: integrated
jobs:
- project-test
diff --git a/tests/fixtures/config/change-queues/git/org_project/.zuul.yaml b/tests/fixtures/config/change-queues/git/org_project/.zuul.yaml
index b62c7ee67..765982d8f 100644
--- a/tests/fixtures/config/change-queues/git/org_project/.zuul.yaml
+++ b/tests/fixtures/config/change-queues/git/org_project/.zuul.yaml
@@ -4,7 +4,7 @@
per-branch: false
- project:
+ queue: integrated
gate:
- queue: integrated
jobs:
- project-test
diff --git a/tests/fixtures/config/change-queues/git/org_project3/zuul.d/project.yaml b/tests/fixtures/config/change-queues/git/org_project3/zuul.d/project.yaml
index e1a297bd5..f80c5c571 100644
--- a/tests/fixtures/config/change-queues/git/org_project3/zuul.d/project.yaml
+++ b/tests/fixtures/config/change-queues/git/org_project3/zuul.d/project.yaml
@@ -1,5 +1,5 @@
- project:
+ queue: integrated-untrusted
gate:
- queue: integrated-untrusted
jobs:
- project-test
diff --git a/tests/fixtures/config/circular-dependencies/git/common-config/zuul.yaml b/tests/fixtures/config/circular-dependencies/git/common-config/zuul.yaml
index 855e61007..44f26411c 100644
--- a/tests/fixtures/config/circular-dependencies/git/common-config/zuul.yaml
+++ b/tests/fixtures/config/circular-dependencies/git/common-config/zuul.yaml
@@ -67,6 +67,7 @@
name: base
parent: null
run: playbooks/run.yaml
+ deduplicate: false
required-projects:
- common-config
- org/project
diff --git a/tests/fixtures/config/cross-source-pagure/git/common-config-gerrit/zuul.yaml b/tests/fixtures/config/cross-source-pagure/git/common-config-gerrit/zuul.yaml
index 57566f260..5d8f8c7a7 100644
--- a/tests/fixtures/config/cross-source-pagure/git/common-config-gerrit/zuul.yaml
+++ b/tests/fixtures/config/cross-source-pagure/git/common-config-gerrit/zuul.yaml
@@ -94,6 +94,7 @@
- project:
name: gerrit/project1
+ queue: integrated
check:
jobs:
- project-merge
@@ -104,7 +105,6 @@
- project1-project2-integration:
dependencies: project-merge
gate:
- queue: integrated
jobs:
- project-merge
- project-test1:
@@ -116,6 +116,7 @@
- project:
name: pagure/project2
+ queue: integrated
check:
jobs:
- project-merge
@@ -126,7 +127,6 @@
- project1-project2-integration:
dependencies: project-merge
gate:
- queue: integrated
jobs:
- project-merge
- project-test1:
diff --git a/tests/fixtures/config/cross-source-pagure/git/github_common-config/zuul.yaml b/tests/fixtures/config/cross-source-pagure/git/github_common-config/zuul.yaml
index f7bbd4784..575020246 100644
--- a/tests/fixtures/config/cross-source-pagure/git/github_common-config/zuul.yaml
+++ b/tests/fixtures/config/cross-source-pagure/git/github_common-config/zuul.yaml
@@ -92,6 +92,7 @@
- project:
name: github/project1
+ queue: integrated
check:
jobs:
- project-merge
@@ -102,7 +103,6 @@
- project1-project2-integration:
dependencies: project-merge
gate:
- queue: integrated
jobs:
- project-merge
- project-test1:
@@ -114,6 +114,7 @@
- project:
name: pagure/project2
+ queue: integrated
check:
jobs:
- project-merge
@@ -124,7 +125,6 @@
- project1-project2-integration:
dependencies: project-merge
gate:
- queue: integrated
jobs:
- project-merge
- project-test1:
diff --git a/tests/fixtures/config/cross-source/git/common-config/zuul.yaml b/tests/fixtures/config/cross-source/git/common-config/zuul.yaml
index abdc34afa..47ce3caea 100644
--- a/tests/fixtures/config/cross-source/git/common-config/zuul.yaml
+++ b/tests/fixtures/config/cross-source/git/common-config/zuul.yaml
@@ -125,6 +125,7 @@
- project:
name: gerrit/project1
+ queue: integrated
check:
jobs:
- project-merge
@@ -135,7 +136,6 @@
- project1-project2-integration:
dependencies: project-merge
gate:
- queue: integrated
jobs:
- project-merge
- project-test1:
@@ -147,6 +147,7 @@
- project:
name: github/project2
+ queue: integrated
check:
jobs:
- project-merge
@@ -157,7 +158,6 @@
- project1-project2-integration:
dependencies: project-merge
gate:
- queue: integrated
jobs:
- project-merge
- project-test1:
diff --git a/tests/fixtures/config/data-return/git/common-config/playbooks/pass.yaml b/tests/fixtures/config/data-return/git/common-config/playbooks/pass.yaml
new file mode 100644
index 000000000..4ed83372b
--- /dev/null
+++ b/tests/fixtures/config/data-return/git/common-config/playbooks/pass.yaml
@@ -0,0 +1,2 @@
+- hosts: localhost
+ tasks: []
diff --git a/tests/fixtures/config/data-return/git/common-config/playbooks/skip-retry-return.yaml b/tests/fixtures/config/data-return/git/common-config/playbooks/skip-retry-return.yaml
new file mode 100644
index 000000000..62ca57de2
--- /dev/null
+++ b/tests/fixtures/config/data-return/git/common-config/playbooks/skip-retry-return.yaml
@@ -0,0 +1,7 @@
+- hosts: localhost
+ tasks:
+ - zuul_return:
+ data:
+ zuul:
+ retry: false
+ failed_when: true
diff --git a/tests/fixtures/config/data-return/git/common-config/zuul.yaml b/tests/fixtures/config/data-return/git/common-config/zuul.yaml
index 05a53c558..7c4688db8 100644
--- a/tests/fixtures/config/data-return/git/common-config/zuul.yaml
+++ b/tests/fixtures/config/data-return/git/common-config/zuul.yaml
@@ -120,6 +120,11 @@
parent: several-zuul-return-parent
run: playbooks/several-zuul-return-child.yaml
+- job:
+ name: skip-retry-return
+ pre-run: playbooks/skip-retry-return.yaml
+ run: playbooks/pass.yaml
+
- project:
name: org/project
check:
@@ -224,3 +229,9 @@
soft: true
- name: data-return-c
soft: true
+
+- project:
+ name: org/project-skip-retry
+ check:
+ jobs:
+ - skip-retry-return
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/README b/tests/fixtures/config/data-return/git/org_project-skip-retry/README
index 9daeafb98..9daeafb98 100644
--- a/tests/fixtures/config/ansible/git/org_plugin-project/README
+++ b/tests/fixtures/config/data-return/git/org_project-skip-retry/README
diff --git a/tests/fixtures/config/data-return/main.yaml b/tests/fixtures/config/data-return/main.yaml
index 9c0a7b2c8..b1a3a2114 100644
--- a/tests/fixtures/config/data-return/main.yaml
+++ b/tests/fixtures/config/data-return/main.yaml
@@ -14,3 +14,4 @@
- org/project6
- org/project7
- org/project-soft
+ - org/project-skip-retry
diff --git a/tests/fixtures/config/duplicate-pipeline/git/common-config/zuul.yaml b/tests/fixtures/config/duplicate-pipeline/git/common-config/zuul.yaml
index dbd63c517..c822736ad 100755
--- a/tests/fixtures/config/duplicate-pipeline/git/common-config/zuul.yaml
+++ b/tests/fixtures/config/duplicate-pipeline/git/common-config/zuul.yaml
@@ -36,11 +36,10 @@
- project:
name: org/project
+ queue: integrated
dup1:
- queue: integrated
jobs:
- project-test1
dup2:
- queue: integrated
jobs:
- project-test1
diff --git a/tests/fixtures/config/dynamic-only-project/dynamic.yaml b/tests/fixtures/config/dynamic-only-project/dynamic.yaml
new file mode 100644
index 000000000..d11451181
--- /dev/null
+++ b/tests/fixtures/config/dynamic-only-project/dynamic.yaml
@@ -0,0 +1,10 @@
+- tenant:
+ name: tenant-one
+ source:
+ gerrit:
+ config-projects:
+ - common-config
+ untrusted-projects:
+ - org/project:
+ always-dynamic-branches:
+ - "^feature/.*"
diff --git a/tests/fixtures/config/dynamic-only-project/exclude.yaml b/tests/fixtures/config/dynamic-only-project/exclude.yaml
new file mode 100644
index 000000000..58a0b03f1
--- /dev/null
+++ b/tests/fixtures/config/dynamic-only-project/exclude.yaml
@@ -0,0 +1,10 @@
+- tenant:
+ name: tenant-one
+ source:
+ gerrit:
+ config-projects:
+ - common-config
+ untrusted-projects:
+ - org/project:
+ exclude-branches:
+ - "^feature/.*"
diff --git a/tests/fixtures/config/dynamic-only-project/git/common-config/playbooks/run.yaml b/tests/fixtures/config/dynamic-only-project/git/common-config/playbooks/run.yaml
new file mode 100644
index 000000000..ed97d539c
--- /dev/null
+++ b/tests/fixtures/config/dynamic-only-project/git/common-config/playbooks/run.yaml
@@ -0,0 +1 @@
+---
diff --git a/tests/fixtures/config/dynamic-only-project/git/common-config/zuul.yaml b/tests/fixtures/config/dynamic-only-project/git/common-config/zuul.yaml
new file mode 100644
index 000000000..331abc54e
--- /dev/null
+++ b/tests/fixtures/config/dynamic-only-project/git/common-config/zuul.yaml
@@ -0,0 +1,67 @@
+- pipeline:
+ name: check
+ manager: independent
+ trigger:
+ gerrit:
+ - event: patchset-created
+ - event: comment-added
+ comment: '^(Patch Set [0-9]+:\n\n)?(?i:recheck)$'
+ success:
+ gerrit:
+ Verified: 1
+ failure:
+ gerrit:
+ Verified: -1
+
+- pipeline:
+ name: gate
+ manager: dependent
+ success-message: Build succeeded (gate).
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - Approved: 1
+ success:
+ gerrit:
+ Verified: 2
+ submit: true
+ failure:
+ gerrit:
+ Verified: -2
+ start:
+ gerrit:
+ Verified: 0
+ precedence: high
+
+- pipeline:
+ name: post
+ manager: independent
+ trigger:
+ gerrit:
+ - event: ref-updated
+ ref: ^(?!refs/).*$
+ precedence: low
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/run.yaml
+
+- job:
+ name: central-test
+
+- job:
+ name: central-post
+
+- project:
+ name: "^org/project.*"
+ check:
+ jobs:
+ - central-test
+ gate:
+ jobs:
+ - central-test
+ post:
+ jobs:
+ - central-post
diff --git a/tests/fixtures/config/speculative-plugins/git/org_project/README b/tests/fixtures/config/dynamic-only-project/git/org_project/README
index 9daeafb98..9daeafb98 100644
--- a/tests/fixtures/config/speculative-plugins/git/org_project/README
+++ b/tests/fixtures/config/dynamic-only-project/git/org_project/README
diff --git a/tests/fixtures/config/dynamic-only-project/git/org_project/zuul.yaml b/tests/fixtures/config/dynamic-only-project/git/org_project/zuul.yaml
new file mode 100644
index 000000000..9712c0828
--- /dev/null
+++ b/tests/fixtures/config/dynamic-only-project/git/org_project/zuul.yaml
@@ -0,0 +1,17 @@
+- job:
+ name: project-test
+
+# Note: this job is not expected to run
+- job:
+ name: project-post
+
+- project:
+ check:
+ jobs:
+ - project-test
+ gate:
+ jobs:
+ - project-test
+ post:
+ jobs:
+ - project-post
diff --git a/tests/fixtures/config/dynamic-only-project/include.yaml b/tests/fixtures/config/dynamic-only-project/include.yaml
new file mode 100644
index 000000000..315eccc54
--- /dev/null
+++ b/tests/fixtures/config/dynamic-only-project/include.yaml
@@ -0,0 +1,11 @@
+- tenant:
+ name: tenant-one
+ source:
+ gerrit:
+ config-projects:
+ - common-config
+ untrusted-projects:
+ - org/project:
+ include-branches:
+ - master
+ - stable
diff --git a/tests/fixtures/bwrap-mounts/dir/file b/tests/fixtures/config/empty-config/git/common-config/README
index 9daeafb98..9daeafb98 100644
--- a/tests/fixtures/bwrap-mounts/dir/file
+++ b/tests/fixtures/config/empty-config/git/common-config/README
diff --git a/tests/fixtures/config/empty-config/git/common-config/new-zuul.yaml b/tests/fixtures/config/empty-config/git/common-config/new-zuul.yaml
new file mode 100644
index 000000000..eecb481ef
--- /dev/null
+++ b/tests/fixtures/config/empty-config/git/common-config/new-zuul.yaml
@@ -0,0 +1,52 @@
+- pipeline:
+ name: check
+ manager: independent
+ trigger:
+ gerrit:
+ - event: patchset-created
+ - event: comment-added
+ comment: '^(Patch Set [0-9]+:\n\n)?(?i:recheck)$'
+ success:
+ gerrit:
+ Verified: 1
+ failure:
+ gerrit:
+ Verified: -1
+
+- pipeline:
+ name: gate
+ manager: dependent
+ success-message: Build succeeded (gate).
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - Approved: 1
+ success:
+ gerrit:
+ Verified: 2
+ submit: true
+ failure:
+ gerrit:
+ Verified: -2
+ start:
+ gerrit:
+ Verified: 0
+ precedence: high
+
+- job:
+ name: base
+ parent: null
+
+- job:
+ name: test
+ run: playbooks/run.yaml
+
+- project:
+ name: common-config
+ check:
+ jobs:
+ - test
+ gate:
+ jobs:
+ - test
diff --git a/tests/fixtures/config/empty-config/git/common-config/playbooks/run.yaml b/tests/fixtures/config/empty-config/git/common-config/playbooks/run.yaml
new file mode 100644
index 000000000..f679dceae
--- /dev/null
+++ b/tests/fixtures/config/empty-config/git/common-config/playbooks/run.yaml
@@ -0,0 +1,2 @@
+- hosts: all
+ tasks: []
diff --git a/tests/fixtures/config/empty-config/git/org_project/README b/tests/fixtures/config/empty-config/git/org_project/README
new file mode 100644
index 000000000..9daeafb98
--- /dev/null
+++ b/tests/fixtures/config/empty-config/git/org_project/README
@@ -0,0 +1 @@
+test
diff --git a/tests/fixtures/config/empty-config/main.yaml b/tests/fixtures/config/empty-config/main.yaml
new file mode 100644
index 000000000..208e274b1
--- /dev/null
+++ b/tests/fixtures/config/empty-config/main.yaml
@@ -0,0 +1,8 @@
+- tenant:
+ name: tenant-one
+ source:
+ gerrit:
+ config-projects:
+ - common-config
+ untrusted-projects:
+ - org/project
diff --git a/tests/fixtures/config/executor-facts/git/org_project/playbooks/datetime-fact.yaml b/tests/fixtures/config/executor-facts/git/org_project/playbooks/datetime-fact.yaml
index 300dfa5f0..53819aa00 100644
--- a/tests/fixtures/config/executor-facts/git/org_project/playbooks/datetime-fact.yaml
+++ b/tests/fixtures/config/executor-facts/git/org_project/playbooks/datetime-fact.yaml
@@ -1,5 +1,5 @@
- hosts: localhost
- gather_facts: smart
+ gather_facts: no
tasks:
- debug:
var: date_time
@@ -9,3 +9,6 @@
var: ansible_date_time
- assert:
that: ansible_date_time is not defined
+ - name: Echo ansible version
+ debug:
+ msg: Ansible version={{ ansible_version.major }}.{{ ansible_version.minor }}
diff --git a/tests/fixtures/config/executor-facts/main.yaml b/tests/fixtures/config/executor-facts/main.yaml
index 208e274b1..37c9dd4fc 100644
--- a/tests/fixtures/config/executor-facts/main.yaml
+++ b/tests/fixtures/config/executor-facts/main.yaml
@@ -1,5 +1,6 @@
- tenant:
name: tenant-one
+ default-ansible-version: SETME
source:
gerrit:
config-projects:
diff --git a/tests/fixtures/config/executor-facts/main5.yaml b/tests/fixtures/config/executor-facts/main5.yaml
new file mode 100644
index 000000000..55d9d10c0
--- /dev/null
+++ b/tests/fixtures/config/executor-facts/main5.yaml
@@ -0,0 +1,9 @@
+- tenant:
+ name: tenant-one
+ default-ansible-version: '5'
+ source:
+ gerrit:
+ config-projects:
+ - common-config
+ untrusted-projects:
+ - org/project
diff --git a/tests/fixtures/config/executor-facts/main6.yaml b/tests/fixtures/config/executor-facts/main6.yaml
new file mode 100644
index 000000000..792f13402
--- /dev/null
+++ b/tests/fixtures/config/executor-facts/main6.yaml
@@ -0,0 +1,9 @@
+- tenant:
+ name: tenant-one
+ default-ansible-version: '6'
+ source:
+ gerrit:
+ config-projects:
+ - common-config
+ untrusted-projects:
+ - org/project
diff --git a/tests/fixtures/config/global-semaphores-config/broken.yaml b/tests/fixtures/config/global-semaphores-config/broken.yaml
new file mode 100644
index 000000000..f85494370
--- /dev/null
+++ b/tests/fixtures/config/global-semaphores-config/broken.yaml
@@ -0,0 +1,10 @@
+- tenant:
+ name: tenant-two
+ semaphores:
+ - global-semaphore
+ source:
+ gerrit:
+ config-projects:
+ - common-config
+ untrusted-projects:
+ - org/project2
diff --git a/tests/fixtures/config/global-semaphores-config/git/common-config/playbooks/run.yaml b/tests/fixtures/config/global-semaphores-config/git/common-config/playbooks/run.yaml
new file mode 100644
index 000000000..ed97d539c
--- /dev/null
+++ b/tests/fixtures/config/global-semaphores-config/git/common-config/playbooks/run.yaml
@@ -0,0 +1 @@
+---
diff --git a/tests/fixtures/config/global-semaphores-config/git/common-config/zuul.yaml b/tests/fixtures/config/global-semaphores-config/git/common-config/zuul.yaml
new file mode 100644
index 000000000..9dba55571
--- /dev/null
+++ b/tests/fixtures/config/global-semaphores-config/git/common-config/zuul.yaml
@@ -0,0 +1,52 @@
+- pipeline:
+ name: check
+ manager: independent
+ trigger:
+ gerrit:
+ - event: patchset-created
+ - event: comment-added
+ comment: '^(Patch Set [0-9]+:\n\n)?(?i:recheck)$'
+ success:
+ gerrit:
+ Verified: 1
+ failure:
+ gerrit:
+ Verified: -1
+
+- pipeline:
+ name: gate
+ manager: dependent
+ success-message: Build succeeded (gate).
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - Approved: 1
+ success:
+ gerrit:
+ Verified: 2
+ submit: true
+ failure:
+ gerrit:
+ Verified: -2
+ start:
+ gerrit:
+ Verified: 0
+ precedence: high
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/run.yaml
+
+- semaphore:
+ name: common-semaphore
+ max: 10
+
+- job:
+ name: test-global-semaphore
+ semaphores: global-semaphore
+
+- job:
+ name: test-common-semaphore
+ semaphores: common-semaphore
diff --git a/tests/fixtures/config/global-semaphores-config/git/org_project1/README b/tests/fixtures/config/global-semaphores-config/git/org_project1/README
new file mode 100644
index 000000000..9daeafb98
--- /dev/null
+++ b/tests/fixtures/config/global-semaphores-config/git/org_project1/README
@@ -0,0 +1 @@
+test
diff --git a/tests/fixtures/config/global-semaphores-config/git/org_project1/zuul.yaml b/tests/fixtures/config/global-semaphores-config/git/org_project1/zuul.yaml
new file mode 100644
index 000000000..a4d823b1b
--- /dev/null
+++ b/tests/fixtures/config/global-semaphores-config/git/org_project1/zuul.yaml
@@ -0,0 +1,19 @@
+# Not actually the global semaphore -- this will be overridden
+- semaphore:
+ name: global-semaphore
+ max: 2
+
+- semaphore:
+ name: project1-semaphore
+ max: 11
+
+- job:
+ name: test-project1-semaphore
+ semaphores: project1-semaphore
+
+- project:
+ check:
+ jobs:
+ - test-global-semaphore
+ - test-common-semaphore
+ - test-project1-semaphore
diff --git a/tests/fixtures/config/global-semaphores-config/git/org_project2/README b/tests/fixtures/config/global-semaphores-config/git/org_project2/README
new file mode 100644
index 000000000..9daeafb98
--- /dev/null
+++ b/tests/fixtures/config/global-semaphores-config/git/org_project2/README
@@ -0,0 +1 @@
+test
diff --git a/tests/fixtures/config/global-semaphores-config/git/org_project2/zuul.yaml b/tests/fixtures/config/global-semaphores-config/git/org_project2/zuul.yaml
new file mode 100644
index 000000000..a0cdb39b9
--- /dev/null
+++ b/tests/fixtures/config/global-semaphores-config/git/org_project2/zuul.yaml
@@ -0,0 +1,14 @@
+- semaphore:
+ name: project2-semaphore
+ max: 12
+
+- job:
+ name: test-project2-semaphore
+ semaphores: project2-semaphore
+
+- project:
+ check:
+ jobs:
+ - test-global-semaphore
+ - test-common-semaphore
+ - test-project2-semaphore
diff --git a/tests/fixtures/config/global-semaphores-config/git/org_project3/README b/tests/fixtures/config/global-semaphores-config/git/org_project3/README
new file mode 100644
index 000000000..9daeafb98
--- /dev/null
+++ b/tests/fixtures/config/global-semaphores-config/git/org_project3/README
@@ -0,0 +1 @@
+test
diff --git a/tests/fixtures/config/global-semaphores-config/git/org_project3/zuul.yaml b/tests/fixtures/config/global-semaphores-config/git/org_project3/zuul.yaml
new file mode 100644
index 000000000..44a60a004
--- /dev/null
+++ b/tests/fixtures/config/global-semaphores-config/git/org_project3/zuul.yaml
@@ -0,0 +1,20 @@
+# Not actually the global semaphore -- this tenant doesn't have it, so
+# this semaphore will be used.
+- semaphore:
+ name: global-semaphore
+ max: 999
+
+- semaphore:
+ name: project3-semaphore
+ max: 13
+
+- job:
+ name: test-project3-semaphore
+ semaphores: project3-semaphore
+
+- project:
+ check:
+ jobs:
+ - test-global-semaphore
+ - test-common-semaphore
+ - test-project3-semaphore
diff --git a/tests/fixtures/config/global-semaphores-config/main.yaml b/tests/fixtures/config/global-semaphores-config/main.yaml
new file mode 100644
index 000000000..8cb74bc18
--- /dev/null
+++ b/tests/fixtures/config/global-semaphores-config/main.yaml
@@ -0,0 +1,34 @@
+- global-semaphore:
+ name: global-semaphore
+ max: 100
+
+- tenant:
+ name: tenant-one
+ semaphores:
+ - global-semaphore
+ source:
+ gerrit:
+ config-projects:
+ - common-config
+ untrusted-projects:
+ - org/project1
+
+- tenant:
+ name: tenant-two
+ semaphores:
+ - global-semaphore
+ source:
+ gerrit:
+ config-projects:
+ - common-config
+ untrusted-projects:
+ - org/project2
+
+- tenant:
+ name: tenant-three
+ source:
+ gerrit:
+ config-projects:
+ - common-config
+ untrusted-projects:
+ - org/project3
diff --git a/tests/fixtures/config/global-semaphores/git/common-config/playbooks/run.yaml b/tests/fixtures/config/global-semaphores/git/common-config/playbooks/run.yaml
new file mode 100644
index 000000000..ed97d539c
--- /dev/null
+++ b/tests/fixtures/config/global-semaphores/git/common-config/playbooks/run.yaml
@@ -0,0 +1 @@
+---
diff --git a/tests/fixtures/config/global-semaphores/git/common-config/zuul.yaml b/tests/fixtures/config/global-semaphores/git/common-config/zuul.yaml
new file mode 100644
index 000000000..48b9e9c92
--- /dev/null
+++ b/tests/fixtures/config/global-semaphores/git/common-config/zuul.yaml
@@ -0,0 +1,44 @@
+- pipeline:
+ name: check
+ manager: independent
+ trigger:
+ gerrit:
+ - event: patchset-created
+ - event: comment-added
+ comment: '^(Patch Set [0-9]+:\n\n)?(?i:recheck)$'
+ success:
+ gerrit:
+ Verified: 1
+ failure:
+ gerrit:
+ Verified: -1
+
+- pipeline:
+ name: gate
+ manager: dependent
+ success-message: Build succeeded (gate).
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - Approved: 1
+ success:
+ gerrit:
+ Verified: 2
+ submit: true
+ failure:
+ gerrit:
+ Verified: -2
+ start:
+ gerrit:
+ Verified: 0
+ precedence: high
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/run.yaml
+
+- job:
+ name: test-global-semaphore
+ semaphores: global-semaphore
diff --git a/tests/fixtures/config/global-semaphores/git/org_project1/README b/tests/fixtures/config/global-semaphores/git/org_project1/README
new file mode 100644
index 000000000..9daeafb98
--- /dev/null
+++ b/tests/fixtures/config/global-semaphores/git/org_project1/README
@@ -0,0 +1 @@
+test
diff --git a/tests/fixtures/config/speculative-plugins/git/org_project/zuul.yaml b/tests/fixtures/config/global-semaphores/git/org_project1/zuul.yaml
index 2a5dca97f..a05bdb237 100644
--- a/tests/fixtures/config/speculative-plugins/git/org_project/zuul.yaml
+++ b/tests/fixtures/config/global-semaphores/git/org_project1/zuul.yaml
@@ -1,4 +1,4 @@
- project:
check:
jobs:
- - noop
+ - test-global-semaphore
diff --git a/tests/fixtures/config/global-semaphores/git/org_project2/README b/tests/fixtures/config/global-semaphores/git/org_project2/README
new file mode 100644
index 000000000..9daeafb98
--- /dev/null
+++ b/tests/fixtures/config/global-semaphores/git/org_project2/README
@@ -0,0 +1 @@
+test
diff --git a/tests/fixtures/config/global-semaphores/git/org_project2/zuul.yaml b/tests/fixtures/config/global-semaphores/git/org_project2/zuul.yaml
new file mode 100644
index 000000000..a05bdb237
--- /dev/null
+++ b/tests/fixtures/config/global-semaphores/git/org_project2/zuul.yaml
@@ -0,0 +1,4 @@
+- project:
+ check:
+ jobs:
+ - test-global-semaphore
diff --git a/tests/fixtures/config/global-semaphores/main.yaml b/tests/fixtures/config/global-semaphores/main.yaml
new file mode 100644
index 000000000..719e3e12d
--- /dev/null
+++ b/tests/fixtures/config/global-semaphores/main.yaml
@@ -0,0 +1,25 @@
+- global-semaphore:
+ name: global-semaphore
+ max: 1
+
+- tenant:
+ name: tenant-one
+ semaphores:
+ - global-semaphore
+ source:
+ gerrit:
+ config-projects:
+ - common-config
+ untrusted-projects:
+ - org/project1
+
+- tenant:
+ name: tenant-two
+ semaphores:
+ - global-semaphore
+ source:
+ gerrit:
+ config-projects:
+ - common-config
+ untrusted-projects:
+ - org/project2
diff --git a/tests/fixtures/config/in-repo-dir/git/org_project2/.extra.yaml b/tests/fixtures/config/in-repo-dir/git/org_project2/.extra.yaml
new file mode 100644
index 000000000..8f9f230e4
--- /dev/null
+++ b/tests/fixtures/config/in-repo-dir/git/org_project2/.extra.yaml
@@ -0,0 +1,2 @@
+- job:
+ name: project2-private-extra-file
diff --git a/tests/fixtures/config/in-repo-dir/git/org_project2/.zuul.yaml b/tests/fixtures/config/in-repo-dir/git/org_project2/.zuul.yaml
new file mode 100644
index 000000000..b86588e42
--- /dev/null
+++ b/tests/fixtures/config/in-repo-dir/git/org_project2/.zuul.yaml
@@ -0,0 +1,6 @@
+- project:
+ name: org/project2
+ check:
+ jobs:
+ - project2-private-extra-file
+ - project2-private-extra-dir
diff --git a/tests/fixtures/config/in-repo-dir/git/org_project2/README b/tests/fixtures/config/in-repo-dir/git/org_project2/README
new file mode 100644
index 000000000..9daeafb98
--- /dev/null
+++ b/tests/fixtures/config/in-repo-dir/git/org_project2/README
@@ -0,0 +1 @@
+test
diff --git a/tests/fixtures/config/in-repo-dir/git/org_project2/extra.d/jobs-private.yaml b/tests/fixtures/config/in-repo-dir/git/org_project2/extra.d/jobs-private.yaml
new file mode 100644
index 000000000..b54002121
--- /dev/null
+++ b/tests/fixtures/config/in-repo-dir/git/org_project2/extra.d/jobs-private.yaml
@@ -0,0 +1,2 @@
+- job:
+ name: project2-private-extra-dir
diff --git a/tests/fixtures/config/in-repo-dir/main.yaml b/tests/fixtures/config/in-repo-dir/main.yaml
index 405543295..bf1679769 100644
--- a/tests/fixtures/config/in-repo-dir/main.yaml
+++ b/tests/fixtures/config/in-repo-dir/main.yaml
@@ -8,6 +8,10 @@
- org/project
- org/project1:
exclude: project
+ - org/project2:
+ extra-config-paths:
+ - .extra.yaml
+ - extra.d/
- tenant:
name: tenant-two
diff --git a/tests/fixtures/config/inventory/git/common-config/playbooks/network.yaml b/tests/fixtures/config/inventory/git/common-config/playbooks/network.yaml
new file mode 100644
index 000000000..913234d94
--- /dev/null
+++ b/tests/fixtures/config/inventory/git/common-config/playbooks/network.yaml
@@ -0,0 +1,9 @@
+- hosts: controller
+ tasks:
+ # This verifies that even though we don't have other frozen vars
+ # (since we can't connect to it), we do still have the nodepool
+ # hostvars for the appliance.
+ - name: Use the nodepool hostvars for the appliance
+ debug:
+ msg: "ssh admin@{{ hostvars[item].nodepool.public_ipv4 }}"
+ with_inventory_hostnames: appliance
diff --git a/tests/fixtures/config/inventory/git/common-config/zuul.yaml b/tests/fixtures/config/inventory/git/common-config/zuul.yaml
index 95a95a195..97ee54fb9 100644
--- a/tests/fixtures/config/inventory/git/common-config/zuul.yaml
+++ b/tests/fixtures/config/inventory/git/common-config/zuul.yaml
@@ -93,6 +93,7 @@
- job:
name: jinja2-message
+ files: jinja.txt
nodeset:
nodes:
- name: ubuntu-xenial
@@ -100,10 +101,33 @@
run: playbooks/jinja2-message.yaml
- job:
- name: ansible-version28-inventory
+ name: network
+ files: network.txt
+ nodeset:
+ nodes:
+ - name: controller
+ label: ubuntu-xenial
+ - name: appliance
+ label: network
+ host-vars:
+ appliance:
+ ansible_network_os: foo
+ run: playbooks/network.yaml
+
+- job:
+ name: ansible-version5-inventory
+ nodeset:
+ nodes:
+ - name: ubuntu-xenial
+ label: ubuntu-xenial
+ ansible-version: '5'
+ run: playbooks/ansible-version.yaml
+
+- job:
+ name: ansible-version6-inventory
nodeset:
nodes:
- name: ubuntu-xenial
label: ubuntu-xenial
- ansible-version: '2.8'
+ ansible-version: '6'
run: playbooks/ansible-version.yaml
diff --git a/tests/fixtures/config/inventory/git/org_project/.zuul.yaml b/tests/fixtures/config/inventory/git/org_project/.zuul.yaml
index fd615518d..78f65ea83 100644
--- a/tests/fixtures/config/inventory/git/org_project/.zuul.yaml
+++ b/tests/fixtures/config/inventory/git/org_project/.zuul.yaml
@@ -7,4 +7,5 @@
- executor-only-inventory
- group-inventory
- hostvars-inventory
- - ansible-version28-inventory
+ - ansible-version5-inventory
+ - ansible-version6-inventory
diff --git a/tests/fixtures/config/inventory/git/org_project2/.zuul.yaml b/tests/fixtures/config/inventory/git/org_project2/.zuul.yaml
index 759e0abbb..9fb22fcc9 100644
--- a/tests/fixtures/config/inventory/git/org_project2/.zuul.yaml
+++ b/tests/fixtures/config/inventory/git/org_project2/.zuul.yaml
@@ -2,5 +2,4 @@
check:
jobs:
- jinja2-message
-
-
+ - network
diff --git a/tests/fixtures/config/inventory/git/org_project3/.zuul.yaml b/tests/fixtures/config/inventory/git/org_project3/.zuul.yaml
index 6cf9faf88..0f11335da 100644
--- a/tests/fixtures/config/inventory/git/org_project3/.zuul.yaml
+++ b/tests/fixtures/config/inventory/git/org_project3/.zuul.yaml
@@ -2,8 +2,3 @@
check:
jobs:
- single-inventory
- - single-inventory-list
- - executor-only-inventory
- - group-inventory
- - hostvars-inventory
- - ansible-version28-inventory
diff --git a/tests/fixtures/config/mqtt-driver/git/common-config/zuul.d/config.yaml b/tests/fixtures/config/mqtt-driver/git/common-config/zuul.d/config.yaml
index c842e9424..1cee46f5c 100644
--- a/tests/fixtures/config/mqtt-driver/git/common-config/zuul.d/config.yaml
+++ b/tests/fixtures/config/mqtt-driver/git/common-config/zuul.d/config.yaml
@@ -7,11 +7,15 @@
start:
mqtt:
topic: "{tenant}/zuul_start/{pipeline}/{project}/{branch}"
+ # This doesn't make sense here -- there should be no return
+ # data yet, which is why we include it in this test.
+ include-returned-data: True
success:
gerrit:
Verified: 1
mqtt:
topic: "{tenant}/zuul_buildset/{pipeline}/{project}/{branch}"
+ include-returned-data: True
failure:
gerrit:
Verified: -1
diff --git a/tests/fixtures/config/openstack/git/project-config/zuul.yaml b/tests/fixtures/config/openstack/git/project-config/zuul.yaml
index 93bdb1132..4f06a1feb 100644
--- a/tests/fixtures/config/openstack/git/project-config/zuul.yaml
+++ b/tests/fixtures/config/openstack/git/project-config/zuul.yaml
@@ -80,20 +80,20 @@
- project:
name: openstack/nova
+ queue: integrated
templates:
- python-jobs
check:
jobs:
- dsvm
- gate:
- queue: integrated
+ gate: {}
- project:
name: openstack/keystone
+ queue: integrated
templates:
- python-jobs
check:
jobs:
- dsvm
- gate:
- queue: integrated
+ gate: {}
diff --git a/tests/fixtures/config/provides-requires-pause/git/org_project1/zuul.yaml b/tests/fixtures/config/provides-requires-pause/git/org_project1/zuul.yaml
index 412fe2c18..fb8a6eea0 100644
--- a/tests/fixtures/config/provides-requires-pause/git/org_project1/zuul.yaml
+++ b/tests/fixtures/config/provides-requires-pause/git/org_project1/zuul.yaml
@@ -11,6 +11,7 @@
run: playbooks/image-user.yaml
- project:
+ queue: integrated
check:
jobs:
- image-builder
@@ -18,7 +19,6 @@
dependencies:
- image-builder
gate:
- queue: integrated
jobs:
- image-builder
- image-user:
diff --git a/tests/fixtures/config/provides-requires-pause/git/org_project2/zuul.yaml b/tests/fixtures/config/provides-requires-pause/git/org_project2/zuul.yaml
index e9e6b5867..7f8de1178 100644
--- a/tests/fixtures/config/provides-requires-pause/git/org_project2/zuul.yaml
+++ b/tests/fixtures/config/provides-requires-pause/git/org_project2/zuul.yaml
@@ -1,8 +1,8 @@
- project:
+ queue: integrated
check:
jobs:
- image-user
gate:
- queue: integrated
jobs:
- image-user
diff --git a/tests/fixtures/config/remote-action-modules/git/common-config/roles/common-copy/files/common-file b/tests/fixtures/config/remote-action-modules/git/common-config/roles/common-copy/files/common-file
deleted file mode 100644
index f73f3093f..000000000
--- a/tests/fixtures/config/remote-action-modules/git/common-config/roles/common-copy/files/common-file
+++ /dev/null
@@ -1 +0,0 @@
-file
diff --git a/tests/fixtures/config/remote-action-modules/git/common-config/roles/common-copy/tasks/main.yaml b/tests/fixtures/config/remote-action-modules/git/common-config/roles/common-copy/tasks/main.yaml
deleted file mode 100644
index 34b5cd99b..000000000
--- a/tests/fixtures/config/remote-action-modules/git/common-config/roles/common-copy/tasks/main.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-- name: Create a destination directory for copied files
- tempfile:
- state: directory
- register: destdir
-
-- name: Common copy
- copy:
- src: common-file
- dest: "{{destdir.path}}/common-file"
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-bad-dir-with-symlink.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-bad-dir-with-symlink.yaml
deleted file mode 100644
index 855151532..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-bad-dir-with-symlink.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: assemble-test
- src_file: dir-symlink
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-bad-symlink.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-bad-symlink.yaml
deleted file mode 100644
index 597aa4086..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-bad-symlink.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: assemble-test
- src_file: symlink
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-bad.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-bad.yaml
deleted file mode 100644
index 9c659f1b7..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-bad.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: assemble-test
- src_file: /opt/assemble
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-delegate.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-delegate.yaml
deleted file mode 100644
index 2a8859f8f..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-delegate.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-- hosts: all
- roles:
- - assemble-test-delegate
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-good.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-good.yaml
deleted file mode 100644
index 96213f025..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-good.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: assemble-test
- src_file: dir
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-localhost.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-localhost.yaml
deleted file mode 100644
index 082a75155..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/assemble-localhost.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-- hosts: localhost
- roles:
- - assemble-test-localhost
-
-- hosts: 127.0.0.1
- roles:
- - assemble-test-localhost
-
-- hosts: "::1"
- roles:
- - assemble-test-localhost
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-bad-dir-with-symlink.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-bad-dir-with-symlink.yaml
deleted file mode 100644
index 5a7172b1b..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-bad-dir-with-symlink.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: copy-test
- src_file: dir-symlink
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-bad-symlink.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-bad-symlink.yaml
deleted file mode 100644
index d53845a20..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-bad-symlink.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: copy-test
- src_file: symlink
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-bad.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-bad.yaml
deleted file mode 100644
index d36e0cf26..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-bad.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: copy-test
- src_file: /opt/file
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-delegate.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-delegate.yaml
deleted file mode 100644
index 2241bd872..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-delegate.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-- hosts: all
- roles:
- - copy-test-delegate
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-good.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-good.yaml
deleted file mode 100644
index 2277705e8..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-good.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-- hosts: all
- roles:
- - common-copy
- - role: copy-test
- src_file: file
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-localhost.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-localhost.yaml
deleted file mode 100644
index 3093687be..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/copy-localhost.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-- hosts: localhost
- roles:
- - copy-test-localhost
-
-- hosts: 127.0.0.1
- roles:
- - copy-test-localhost
-
-- hosts: "::1"
- roles:
- - copy-test-localhost
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad-dir-symlink.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad-dir-symlink.yaml
deleted file mode 100644
index b41038156..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad-dir-symlink.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: includevarsdir-test
- src_file: symlink
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad-dir-with-double-symlink.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad-dir-with-double-symlink.yaml
deleted file mode 100644
index 7127af01c..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad-dir-with-double-symlink.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: includevarsdir-test
- src_file: dir-double-symlink
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad-dir-with-symlink.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad-dir-with-symlink.yaml
deleted file mode 100644
index d771a8fe0..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad-dir-with-symlink.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: includevarsdir-test
- src_file: dir-symlink
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad-dir.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad-dir.yaml
deleted file mode 100644
index b79618ce6..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad-dir.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: includevarsdir-test
- src_file: /opt/vars
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad-symlink.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad-symlink.yaml
deleted file mode 100644
index b2a663ab0..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad-symlink.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: includevars-test
- src_file: symlink.yaml
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad.yaml
deleted file mode 100644
index 5e8e99f97..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-bad.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: includevars-test
- src_file: /opt/vars.yaml
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-good-dir.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-good-dir.yaml
deleted file mode 100644
index 84bb4070e..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-good-dir.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: includevarsdir-test
- src_file: dir
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-good.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-good.yaml
deleted file mode 100644
index 8addb1263..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/includevars-good.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: includevars-test
- src_file: vars.yaml
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/known-hosts-bad.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/known-hosts-bad.yaml
deleted file mode 100644
index f355983fc..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/known-hosts-bad.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-- hosts: all
- tasks:
- - name: Add fake known_hosts entry
- delegate_to: localhost
- known_hosts:
- name: fake
- path: /root/.ssh/known_hosts
- key: fake ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOOaqWfpmnMiCYaLUq0ugyQ6OUIvtPzkOqLTG03HXxU9
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/known-hosts-delegate.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/known-hosts-delegate.yaml
deleted file mode 100644
index 14cc21bd4..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/known-hosts-delegate.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-- hosts: all
- tasks:
- - name: Add fake known_hosts entry
- delegate_to: localhost
- known_hosts:
- name: fake
- key: fake ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOOaqWfpmnMiCYaLUq0ugyQ6OUIvtPzkOqLTG03HXxU9
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/known-hosts-good.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/known-hosts-good.yaml
deleted file mode 100644
index a2f425ee4..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/known-hosts-good.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-- hosts: all
- tasks:
- - name: Add fake known_hosts entry
- known_hosts:
- name: fake
- key: fake ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOOaqWfpmnMiCYaLUq0ugyQ6OUIvtPzkOqLTG03HXxU9
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/known-hosts-localhost.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/known-hosts-localhost.yaml
deleted file mode 100644
index 1875f36cb..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/known-hosts-localhost.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-- hosts: localhost
- tasks:
- - name: Add fake known_hosts entry
- known_hosts:
- name: fake
- key: fake ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOOaqWfpmnMiCYaLUq0ugyQ6OUIvtPzkOqLTG03HXxU9
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/patch-bad-symlink.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/patch-bad-symlink.yaml
deleted file mode 100644
index 956ae7b5b..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/patch-bad-symlink.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: patch-test
- src_file: symlink
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/patch-bad.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/patch-bad.yaml
deleted file mode 100644
index de4a6fd66..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/patch-bad.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: patch-test
- src_file: /opt/patch
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/patch-delegate.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/patch-delegate.yaml
deleted file mode 100644
index ed563025f..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/patch-delegate.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-- hosts: all
- roles:
- - patch-test-delegate
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/patch-good.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/patch-good.yaml
deleted file mode 100644
index fcf0c8144..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/patch-good.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: patch-test
- src_file: patch
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/patch-localhost.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/patch-localhost.yaml
deleted file mode 100644
index 15a24c742..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/patch-localhost.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-- hosts: localhost
- roles:
- - patch-test-localhost
-
-- hosts: 127.0.0.1
- roles:
- - patch-test-localhost
-
-- hosts: "::1"
- roles:
- - patch-test-localhost
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/raw-delegate.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/raw-delegate.yaml
deleted file mode 100644
index 0768287e9..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/raw-delegate.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-- hosts: all
- roles:
- - raw-test-delegate
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/raw-good.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/raw-good.yaml
deleted file mode 100644
index fc7b30121..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/raw-good.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- tasks:
- - name: Some raw command
- raw: echo 123
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/raw-localhost.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/raw-localhost.yaml
deleted file mode 100644
index 8c2970229..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/raw-localhost.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-- hosts: localhost
- roles:
- - raw-test-localhost
-
-- hosts: 127.0.0.1
- roles:
- - raw-test-localhost
-
-- hosts: "::1"
- roles:
- - raw-test-localhost
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test-delegate/files/dir/resolv.conf b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test-delegate/files/dir/resolv.conf
deleted file mode 100644
index 5626abf0f..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test-delegate/files/dir/resolv.conf
+++ /dev/null
@@ -1 +0,0 @@
-one
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test-delegate/tasks/assemble-delegate.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test-delegate/tasks/assemble-delegate.yaml
deleted file mode 100644
index 015982660..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test-delegate/tasks/assemble-delegate.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
-- name: Assemble
- assemble:
- src: dir
- dest: /opt/assemble-dest
- remote_src: no
- delegate_to: "{{ item }}"
- ignore_errors: true
- register: result
-
-- assert:
- that:
- - "result.failed == true"
- - "'Accessing files from outside the working dir' in result.msg"
- msg: Assemble must fail due to accessing files outside the working dir
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test-delegate/tasks/main.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test-delegate/tasks/main.yaml
deleted file mode 100644
index 57c186b06..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test-delegate/tasks/main.yaml
+++ /dev/null
@@ -1,22 +0,0 @@
-- include: assemble-delegate.yaml
- with_items:
- - ::1
- - 127.0.0.1
- - localhost
-
-- name: Define target dir
- set_fact:
- targetdir: "{{ zuul.executor.work_root }}/assemble-target"
-
-- name: Create target dir
- file:
- state: directory
- path: "{{ targetdir }}"
- delegate_to: localhost
-
-- name: Assemble to safe local path
- assemble:
- src: dir
- dest: "{{ targetdir }}/assemble-dest.conf"
- remote_src: no
- delegate_to: localhost
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test-localhost/files/dir/resolv.conf b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test-localhost/files/dir/resolv.conf
deleted file mode 100644
index 5626abf0f..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test-localhost/files/dir/resolv.conf
+++ /dev/null
@@ -1 +0,0 @@
-one
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test-localhost/tasks/main.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test-localhost/tasks/main.yaml
deleted file mode 100644
index afe156f46..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test-localhost/tasks/main.yaml
+++ /dev/null
@@ -1,13 +0,0 @@
-- name: Assemble
- assemble:
- src: dir
- dest: /opt/assemble-dest
- remote_src: no
- ignore_errors: true
- register: result
-
-- assert:
- that:
- - "result.failed == true"
- - "'Accessing files from outside the working dir' in result.msg"
- msg: Assemble must fail due to accessing files outside the working dir
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test/files/dir-symlink/one b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test/files/dir-symlink/one
deleted file mode 100644
index 33e34a832..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test/files/dir-symlink/one
+++ /dev/null
@@ -1 +0,0 @@
-symlink: /opt/file
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test/files/dir/resolv.conf b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test/files/dir/resolv.conf
deleted file mode 100644
index 5626abf0f..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test/files/dir/resolv.conf
+++ /dev/null
@@ -1 +0,0 @@
-one
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test/files/symlink b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test/files/symlink
deleted file mode 100644
index 2b1ef2c45..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test/files/symlink
+++ /dev/null
@@ -1 +0,0 @@
-symlink: /opt/assemble
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test/tasks/main.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test/tasks/main.yaml
deleted file mode 100644
index fce6df52c..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/assemble-test/tasks/main.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-- name: Create a destination directory for copied files
- tempfile:
- state: directory
- register: destdir
-
-- name: Assemble
- assemble:
- src: "{{src_file}}"
- dest: "{{destdir.path}}/copy"
- remote_src: no
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test-delegate/files/file b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test-delegate/files/file
deleted file mode 100644
index e69de29bb..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test-delegate/files/file
+++ /dev/null
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test-delegate/tasks/copy-delegate.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test-delegate/tasks/copy-delegate.yaml
deleted file mode 100644
index 831bcd374..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test-delegate/tasks/copy-delegate.yaml
+++ /dev/null
@@ -1,13 +0,0 @@
-- name: Copy
- copy:
- src: file
- dest: /opt/copy-dest
- delegate_to: "{{ item }}"
- register: result
- ignore_errors: true
-
-- assert:
- that:
- - "result.failed == true"
- - "'Accessing files from outside the working dir' in result.msg"
- msg: Copy must fail due to accessing files outside the working dir
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test-delegate/tasks/main.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test-delegate/tasks/main.yaml
deleted file mode 100644
index 116ed2b64..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test-delegate/tasks/main.yaml
+++ /dev/null
@@ -1,27 +0,0 @@
-- include: copy-delegate.yaml
- with_items:
- - ::1
- - 127.0.0.1
- - localhost
-
-- name: Define target dir
- set_fact:
- targetdir: "{{ zuul.executor.work_root }}/copy-target"
-
-- name: Create target dir
- file:
- state: directory
- path: "{{ targetdir }}"
- delegate_to: localhost
-
-- name: Copy file into safe path
- copy:
- src: file
- dest: "{{ targetdir }}/dest-file"
- delegate_to: localhost
-
-- name: Copy file into safe directory
- copy:
- src: file
- dest: "{{ targetdir }}/dest-dir/"
- delegate_to: localhost
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test-localhost/files/file b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test-localhost/files/file
deleted file mode 100644
index e69de29bb..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test-localhost/files/file
+++ /dev/null
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test-localhost/tasks/main.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test-localhost/tasks/main.yaml
deleted file mode 100644
index 23b7cbefb..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test-localhost/tasks/main.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-- name: Copy
- copy:
- src: file
- dest: /opt/copy-dest
- register: result
- ignore_errors: true
-
-- assert:
- that:
- - "result.failed == true"
- - "'Accessing files from outside the working dir' in result.msg"
- msg: Copy must fail due to accessing files outside the working dir
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test/files/dir-symlink/symlink b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test/files/dir-symlink/symlink
deleted file mode 100644
index b21f8f817..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test/files/dir-symlink/symlink
+++ /dev/null
@@ -1 +0,0 @@
-symlink: /opt/dir
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test/files/file b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test/files/file
deleted file mode 100644
index e69de29bb..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test/files/file
+++ /dev/null
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test/files/symlink b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test/files/symlink
deleted file mode 100644
index 33e34a832..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test/files/symlink
+++ /dev/null
@@ -1 +0,0 @@
-symlink: /opt/file
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test/tasks/main.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test/tasks/main.yaml
deleted file mode 100644
index c654e4e61..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/copy-test/tasks/main.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-- name: Create a destination directory for copied files
- tempfile:
- state: directory
- register: destdir
-
-- name: Copy
- copy:
- src: "{{src_file}}"
- dest: "{{destdir.path}}/copy"
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevars-test/tasks/main.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevars-test/tasks/main.yaml
deleted file mode 100644
index fcef1ff2e..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevars-test/tasks/main.yaml
+++ /dev/null
@@ -1,2 +0,0 @@
-- name: Include vars
- include_vars: "{{src_file}}"
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevars-test/vars/symlink.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevars-test/vars/symlink.yaml
deleted file mode 100644
index a0b14fc6a..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevars-test/vars/symlink.yaml
+++ /dev/null
@@ -1 +0,0 @@
-symlink: /opt/vars.yaml
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevars-test/vars/vars.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevars-test/vars/vars.yaml
deleted file mode 100644
index e69de29bb..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevars-test/vars/vars.yaml
+++ /dev/null
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/tasks/main.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/tasks/main.yaml
deleted file mode 100644
index 6768290a4..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/tasks/main.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-- name: Include vars
- include_vars:
- dir: "{{src_file}}"
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir-double-symlink/double-symlink-sidekick b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir-double-symlink/double-symlink-sidekick
deleted file mode 100644
index 62583effa..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir-double-symlink/double-symlink-sidekick
+++ /dev/null
@@ -1 +0,0 @@
-symlink: ../double-symlink-sidekick
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir-double-symlink/one.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir-double-symlink/one.yaml
deleted file mode 100644
index 09189d3c2..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir-double-symlink/one.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
----
-
-first_var: one
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir-symlink/one.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir-symlink/one.yaml
deleted file mode 100644
index 09189d3c2..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir-symlink/one.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
----
-
-first_var: one
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir-symlink/two.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir-symlink/two.yaml
deleted file mode 100644
index a0b14fc6a..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir-symlink/two.yaml
+++ /dev/null
@@ -1 +0,0 @@
-symlink: /opt/vars.yaml
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir/sub/recursive-link b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir/sub/recursive-link
deleted file mode 100644
index 477759422..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir/sub/recursive-link
+++ /dev/null
@@ -1 +0,0 @@
-symlink: ..
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir/vars.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir/vars.yaml
deleted file mode 100644
index e69de29bb..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/dir/vars.yaml
+++ /dev/null
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/double-symlink-sidekick/vars.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/double-symlink-sidekick/vars.yaml
deleted file mode 100644
index a0b14fc6a..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/double-symlink-sidekick/vars.yaml
+++ /dev/null
@@ -1 +0,0 @@
-symlink: /opt/vars.yaml
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/symlink b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/symlink
deleted file mode 100644
index 5ec4b036d..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/includevarsdir-test/vars/symlink
+++ /dev/null
@@ -1 +0,0 @@
-symlink: /opt/vars
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-delegate/files/patch b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-delegate/files/patch
deleted file mode 100644
index aa2c60eb0..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-delegate/files/patch
+++ /dev/null
@@ -1,7 +0,0 @@
-diff --git a/readme.txt b/readme.txt
-index 24308cb..b07f0ed 100644
---- a/readme.txt
-+++ b/readme.txt
-@@ -1 +1 @@
--This is a readme
-+This is a README
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-delegate/files/readme.txt b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-delegate/files/readme.txt
deleted file mode 100644
index 24308cb38..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-delegate/files/readme.txt
+++ /dev/null
@@ -1 +0,0 @@
-This is a readme
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-delegate/tasks/main.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-delegate/tasks/main.yaml
deleted file mode 100644
index 759743f94..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-delegate/tasks/main.yaml
+++ /dev/null
@@ -1,41 +0,0 @@
-- include: patch-delegate.yaml
- with_items:
- - ::1
- - 127.0.0.1
- - localhost
-
-- name: Define target dir
- set_fact:
- targetdir: "{{ zuul.executor.work_root }}/patch-target"
-
-- name: Create target dir
- file:
- state: directory
- path: "{{ targetdir }}"
- delegate_to: localhost
-
-- name: Copy readme
- copy:
- src: readme.txt
- dest: "{{ targetdir }}/readme.txt"
- delegate_to: localhost
-
-- name: Patch in safe path using basedir
- patch:
- src: "patch"
- basedir: "{{ targetdir }}"
- strip: 1
- delegate_to: localhost
-
-- name: Copy readme again
- copy:
- src: readme.txt
- dest: "{{ targetdir }}/readme.txt"
- delegate_to: localhost
-
-- name: Patch in safe path using dest
- patch:
- src: "patch"
- dest: "{{ targetdir }}/readme.txt"
- strip: 1
- delegate_to: localhost
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-delegate/tasks/patch-delegate.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-delegate/tasks/patch-delegate.yaml
deleted file mode 100644
index 44ebca3ca..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-delegate/tasks/patch-delegate.yaml
+++ /dev/null
@@ -1,29 +0,0 @@
-- name: Patch with basedir
- patch:
- src: patch
- basedir: "/opt/patch-dest"
- strip: 1
- delegate_to: "{{ item }}"
- register: result
- ignore_errors: true
-
-- assert:
- that:
- - "result.failed == true"
- - "'Accessing files from outside the working dir' in result.msg"
- msg: Patch must fail due to accessing files outside the working dir
-
-- name: Patch with dest
- patch:
- src: patch
- dest: "/opt/patch-dest/readme"
- strip: 1
- delegate_to: "{{ item }}"
- register: result
- ignore_errors: true
-
-- assert:
- that:
- - "result.failed == true"
- - "'Accessing files from outside the working dir' in result.msg"
- msg: Patch must fail due to accessing files outside the working dir
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-localhost/files/patch b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-localhost/files/patch
deleted file mode 100644
index aa2c60eb0..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-localhost/files/patch
+++ /dev/null
@@ -1,7 +0,0 @@
-diff --git a/readme.txt b/readme.txt
-index 24308cb..b07f0ed 100644
---- a/readme.txt
-+++ b/readme.txt
-@@ -1 +1 @@
--This is a readme
-+This is a README
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-localhost/files/readme.txt b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-localhost/files/readme.txt
deleted file mode 100644
index 24308cb38..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-localhost/files/readme.txt
+++ /dev/null
@@ -1 +0,0 @@
-This is a readme
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-localhost/tasks/main.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-localhost/tasks/main.yaml
deleted file mode 100644
index 30c4c23e6..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test-localhost/tasks/main.yaml
+++ /dev/null
@@ -1,27 +0,0 @@
-- name: Patch with basedir
- patch:
- src: patch
- basedir: "/opt/patch-dest"
- strip: 1
- register: result
- ignore_errors: true
-
-- assert:
- that:
- - "result.failed == true"
- - "'Accessing files from outside the working dir' in result.msg"
- msg: Patch must fail due to accessing files outside the working dir
-
-- name: Patch with dest
- patch:
- src: patch
- dest: "/opt/patch-dest/readme"
- strip: 1
- register: result
- ignore_errors: true
-
-- assert:
- that:
- - "result.failed == true"
- - "'Accessing files from outside the working dir' in result.msg"
- msg: Patch must fail due to accessing files outside the working dir
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test/files/patch b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test/files/patch
deleted file mode 100644
index aa2c60eb0..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test/files/patch
+++ /dev/null
@@ -1,7 +0,0 @@
-diff --git a/readme.txt b/readme.txt
-index 24308cb..b07f0ed 100644
---- a/readme.txt
-+++ b/readme.txt
-@@ -1 +1 @@
--This is a readme
-+This is a README
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test/files/readme.txt b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test/files/readme.txt
deleted file mode 100644
index 24308cb38..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test/files/readme.txt
+++ /dev/null
@@ -1 +0,0 @@
-This is a readme
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test/files/symlink b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test/files/symlink
deleted file mode 100644
index 159669522..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test/files/symlink
+++ /dev/null
@@ -1 +0,0 @@
-symlink: /opt/patch
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test/tasks/main.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test/tasks/main.yaml
deleted file mode 100644
index c1c4ccba8..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/patch-test/tasks/main.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
-- name: Create a destination directory for copied files
- tempfile:
- state: directory
- register: destdir
-
-- name: Copy readme
- copy:
- src: readme.txt
- dest: "{{destdir.path}}/readme.txt"
-
-- name: Patch
- patch:
- src: "{{src_file}}"
- basedir: "{{destdir.path}}"
- strip: 1
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/raw-test-delegate/tasks/main.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/raw-test-delegate/tasks/main.yaml
deleted file mode 100644
index ccdf9a422..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/raw-test-delegate/tasks/main.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-- include: script-delegate.yaml
- with_items:
- - ::1
- - 127.0.0.1
- - localhost
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/raw-test-delegate/tasks/script-delegate.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/raw-test-delegate/tasks/script-delegate.yaml
deleted file mode 100644
index 339c1b724..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/raw-test-delegate/tasks/script-delegate.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-- name: Raw
- raw: echo 123
- delegate_to: "{{ item }}"
- register: result
- ignore_errors: true
-
-- assert:
- that:
- - "result.failed == true"
- - "'Executing local code is prohibited' in result.msg"
- msg: Raw must fail due to local code execution restriction
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/raw-test-localhost/tasks/main.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/raw-test-localhost/tasks/main.yaml
deleted file mode 100644
index 5b0f8c68d..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/raw-test-localhost/tasks/main.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-- name: Raw
- raw: echo 123
- register: result
- ignore_errors: true
-
-- assert:
- that:
- - "result.failed == true"
- - "'Executing local code is prohibited' in result.msg"
- msg: Script must fail due to local code execution restriction
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test-delegate/files/script.sh b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test-delegate/files/script.sh
deleted file mode 100644
index 6baacbc54..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test-delegate/files/script.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-echo one
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test-delegate/tasks/main.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test-delegate/tasks/main.yaml
deleted file mode 100644
index ccdf9a422..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test-delegate/tasks/main.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-- include: script-delegate.yaml
- with_items:
- - ::1
- - 127.0.0.1
- - localhost
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test-delegate/tasks/script-delegate.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test-delegate/tasks/script-delegate.yaml
deleted file mode 100644
index c67d104a1..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test-delegate/tasks/script-delegate.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-- name: Script
- script: script.sh
- delegate_to: "{{ item }}"
- register: result
- ignore_errors: true
-
-- assert:
- that:
- - "result.failed == true"
- - "'Executing local code is prohibited' in result.msg"
- msg: Script must fail due to local code execution restriction
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test-localhost/files/script.sh b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test-localhost/files/script.sh
deleted file mode 100644
index 6baacbc54..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test-localhost/files/script.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-echo one
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test-localhost/tasks/main.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test-localhost/tasks/main.yaml
deleted file mode 100644
index 301980f9f..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test-localhost/tasks/main.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-- name: Script
- script: script.sh
- register: result
- ignore_errors: true
-
-- assert:
- that:
- - "result.failed == true"
- - "'Executing local code is prohibited' in result.msg"
- msg: Script must fail due to local code execution restriction
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test/files/archive.tar b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test/files/archive.tar
deleted file mode 100644
index f5fad529a..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test/files/archive.tar
+++ /dev/null
Binary files differ
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test/files/one b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test/files/one
deleted file mode 100644
index 5626abf0f..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test/files/one
+++ /dev/null
@@ -1 +0,0 @@
-one
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test/files/script.sh b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test/files/script.sh
deleted file mode 100644
index 6baacbc54..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test/files/script.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-echo one
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test/files/symlink b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test/files/symlink
deleted file mode 100644
index 8bc5f4406..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test/files/symlink
+++ /dev/null
@@ -1 +0,0 @@
-symlink: /opt/script.sh
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test/tasks/main.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test/tasks/main.yaml
deleted file mode 100644
index 74fe56152..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/script-test/tasks/main.yaml
+++ /dev/null
@@ -1,2 +0,0 @@
-- name: Script
- script: "{{src_file}}"
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test-delegate/tasks/main.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test-delegate/tasks/main.yaml
deleted file mode 100644
index 5ac1f7790..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test-delegate/tasks/main.yaml
+++ /dev/null
@@ -1,21 +0,0 @@
-- include: template-delegate.yaml
- with_items:
- - ::1
- - 127.0.0.1
- - localhost
-
-- name: Define target dir
- set_fact:
- targetdir: "{{ zuul.executor.work_root }}/template-target"
-
-- name: Create target dir
- file:
- state: directory
- path: "{{ targetdir }}"
- delegate_to: localhost
-
-- name: Template into safe path
- template:
- src: template
- dest: "{{ targetdir }}/dest-file"
- delegate_to: localhost
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test-delegate/tasks/template-delegate.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test-delegate/tasks/template-delegate.yaml
deleted file mode 100644
index 506dced39..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test-delegate/tasks/template-delegate.yaml
+++ /dev/null
@@ -1,13 +0,0 @@
-- name: Template
- copy:
- src: template
- dest: /opt/copy-dest
- delegate_to: "{{ item }}"
- register: result
- ignore_errors: true
-
-- assert:
- that:
- - "result.failed == true"
- - "'Accessing files from outside the working dir' in result.msg"
- msg: Template must fail due to accessing files outside the working dir
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test-delegate/templates/template b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test-delegate/templates/template
deleted file mode 100644
index e69de29bb..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test-delegate/templates/template
+++ /dev/null
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test-localhost/tasks/main.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test-localhost/tasks/main.yaml
deleted file mode 100644
index 678e2b636..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test-localhost/tasks/main.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-- name: Template
- copy:
- src: template
- dest: /opt/copy-dest
- register: result
- ignore_errors: true
-
-- assert:
- that:
- - "result.failed == true"
- - "'Accessing files from outside the working dir' in result.msg"
- msg: Template must fail due to accessing files outside the working dir
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test-localhost/templates/template b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test-localhost/templates/template
deleted file mode 100644
index e69de29bb..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test-localhost/templates/template
+++ /dev/null
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test/tasks/main.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test/tasks/main.yaml
deleted file mode 100644
index d4c794b59..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test/tasks/main.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-- name: Create a destination directory for copied files
- tempfile:
- state: directory
- register: destdir
-
-- name: Copy
- template:
- src: "{{src_file}}"
- dest: "{{destdir.path}}/template"
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test/templates/symlink b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test/templates/symlink
deleted file mode 100644
index 33e34a832..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test/templates/symlink
+++ /dev/null
@@ -1 +0,0 @@
-symlink: /opt/file
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test/templates/template b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test/templates/template
deleted file mode 100644
index e69de29bb..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/template-test/templates/template
+++ /dev/null
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test-delegate/files/archive.tar b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test-delegate/files/archive.tar
deleted file mode 100644
index 0c6f83acd..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test-delegate/files/archive.tar
+++ /dev/null
Binary files differ
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test-delegate/tasks/main.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test-delegate/tasks/main.yaml
deleted file mode 100644
index 715484643..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test-delegate/tasks/main.yaml
+++ /dev/null
@@ -1,21 +0,0 @@
-- include: unarchive-delegate.yaml
- with_items:
- - ::1
- - 127.0.0.1
- - localhost
-
-- name: Define target dir
- set_fact:
- targetdir: "{{ zuul.executor.work_root }}/unarchive-target"
-
-- name: Create target dir
- file:
- state: directory
- path: "{{ targetdir }}"
- delegate_to: localhost
-
-- name: Unarchive
- copy:
- src: archive.tar
- dest: "{{ targetdir }}"
- delegate_to: localhost
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test-delegate/tasks/unarchive-delegate.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test-delegate/tasks/unarchive-delegate.yaml
deleted file mode 100644
index ca5070772..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test-delegate/tasks/unarchive-delegate.yaml
+++ /dev/null
@@ -1,13 +0,0 @@
-- name: Unarchive
- copy:
- src: archive.tar
- dest: /opt/unarchive-dest
- delegate_to: "{{ item }}"
- register: result
- ignore_errors: true
-
-- assert:
- that:
- - "result.failed == true"
- - "'Accessing files from outside the working dir' in result.msg"
- msg: Unarchive must fail due to accessing files outside the working dir
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test-localhost/files/archive.tar b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test-localhost/files/archive.tar
deleted file mode 100644
index 0c6f83acd..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test-localhost/files/archive.tar
+++ /dev/null
Binary files differ
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test-localhost/tasks/main.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test-localhost/tasks/main.yaml
deleted file mode 100644
index 1a04ee194..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test-localhost/tasks/main.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-- name: Unarchive
- copy:
- src: archive.tar
- dest: /opt/unarchive-dest
- register: result
- ignore_errors: true
-
-- assert:
- that:
- - "result.failed == true"
- - "'Accessing files from outside the working dir' in result.msg"
- msg: Unarchive must fail due to accessing files outside the working dir
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test/files/archive.tar b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test/files/archive.tar
deleted file mode 100644
index 0c6f83acd..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test/files/archive.tar
+++ /dev/null
Binary files differ
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test/files/symlink b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test/files/symlink
deleted file mode 100644
index 1b179b22c..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test/files/symlink
+++ /dev/null
@@ -1 +0,0 @@
-symlink: /opt/archive.tar
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test/tasks/main.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test/tasks/main.yaml
deleted file mode 100644
index 3ecfdd524..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/roles/unarchive-test/tasks/main.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-- name: Create a destination directory for copied files
- tempfile:
- state: directory
- register: destdir
-
-- name: Unarchive
- copy:
- src: "{{src_file}}"
- dest: "{{destdir.path}}"
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/script-bad-symlink.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/script-bad-symlink.yaml
deleted file mode 100644
index 92c15bffb..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/script-bad-symlink.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: script-test
- src_file: symlink
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/script-bad.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/script-bad.yaml
deleted file mode 100644
index e124c7ccc..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/script-bad.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: script-test
- src_file: /opt/script.sh
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/script-delegate.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/script-delegate.yaml
deleted file mode 100644
index a8353c713..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/script-delegate.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-- hosts: all
- roles:
- - script-test-delegate
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/script-good.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/script-good.yaml
deleted file mode 100644
index 5d8e3901c..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/script-good.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: script-test
- src_file: script.sh
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/script-localhost.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/script-localhost.yaml
deleted file mode 100644
index 8f72399a4..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/script-localhost.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-- hosts: localhost
- roles:
- - script-test-localhost
-
-- hosts: 127.0.0.1
- roles:
- - script-test-localhost
-
-- hosts: "::1"
- roles:
- - script-test-localhost
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/shell-delegate.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/shell-delegate.yaml
deleted file mode 100644
index 7cb81e3b7..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/shell-delegate.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-- hosts: all
- tasks:
- - name: Normal shell
- delegate_to: localhost
- shell: echo 123
-
- - name: Shell with executable
- delegate_to: localhost
- shell: |
- echo 123
- args:
- executable: /bin/bash
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/shell-localhost.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/shell-localhost.yaml
deleted file mode 100644
index 35f7253f1..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/shell-localhost.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-- hosts: localhost
- tasks:
- - name: Normal shell
- shell: echo 123
-
- - name: Shell with executable
- shell: |
- echo 123
- args:
- executable: /bin/bash
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-bad-pull.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-bad-pull.yaml
deleted file mode 100644
index 603a4da9d..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-bad-pull.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-- hosts: all
- tasks:
- - name: Execute common-copy role
- include_role:
- name: common-copy
-
- - name: Test pull mode
- synchronize:
- dest: "/tmp"
- mode: pull
- src: "{{ destdir.path }}/"
- verify_host: true
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-bad-push.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-bad-push.yaml
deleted file mode 100644
index f9d9080a8..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-bad-push.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-- hosts: all
- tasks:
- - name: Execute common-copy role
- include_role:
- name: common-copy
-
- - name: Test push mode
- synchronize:
- dest: "{{ destdir.path }}/"
- mode: push
- src: "/tmp"
- verify_host: true
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-delegate-good.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-delegate-good.yaml
deleted file mode 100644
index 595ef2a72..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-delegate-good.yaml
+++ /dev/null
@@ -1,59 +0,0 @@
-- hosts: all
- tasks:
- - name: Execute common-copy role
- include_role:
- name: common-copy
-
- - name: create temporary build directory
- tempfile:
- path: /tmp
- state: directory
- register: _tmpdir
-
- - name: Ensure controller pull directory
- file:
- path: "{{ _tmpdir.path }}/pull"
- state: directory
-
- - name: Test pull mode
- synchronize:
- dest: "{{ _tmpdir.path }}/pull/"
- mode: pull
- src: "{{ destdir.path }}/"
- verify_host: true
- delegate_to: "{{ inventory_hostname }}"
-
- - name: Validate pull
- stat:
- path: "{{ _tmpdir.path }}/pull/common-file"
- register: _pull
-
- - name: Assert pull
- assert:
- that:
- - _pull.stat.exists
- - _pull.stat.isreg
-
- - name: Ensure controller push directory
- file:
- path: "{{ _tmpdir.path }}/push"
- state: directory
-
- - name: Test push mode
- synchronize:
- dest: "{{ _tmpdir.path }}/push/"
- mode: push
- src: "{{ destdir.path }}/"
- verify_host: true
- delegate_to: "{{ inventory_hostname }}"
-
- - name: Validate push
- stat:
- path: "{{ _tmpdir.path }}/push/common-file"
- register: _push
-
- - name: Assert push
- assert:
- that:
- - _push.stat.exists
- - _push.stat.isreg
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-good.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-good.yaml
deleted file mode 100644
index 05bb3e616..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-good.yaml
+++ /dev/null
@@ -1,57 +0,0 @@
-- hosts: all
- tasks:
- - name: Execute common-copy role
- include_role:
- name: common-copy
-
- - name: Ensure executor push directory
- file:
- path: "{{ zuul.executor.log_root }}/push"
- state: directory
- delegate_to: localhost
-
- - name: Test pull mode
- synchronize:
- dest: "{{ zuul.executor.log_root }}/push"
- mode: pull
- src: "{{ destdir.path }}/"
- verify_host: true
- environment:
- OK: "we can use custom env"
-
- - name: Validate push
- stat:
- path: "{{ zuul.executor.log_root }}/push/common-file"
- register: _push
- delegate_to: localhost
-
- - name: Assert push
- assert:
- that:
- - _push.stat.exists
- - _push.stat.isreg
-
- - name: Ensure controller pull directory
- file:
- path: "{{ destdir.path }}/pull"
- state: directory
-
- - name: Test push mode
- synchronize:
- dest: "{{ destdir.path }}/pull/"
- mode: push
- src: "{{ zuul.executor.log_root }}/push"
- rsync_opts:
- - "--safe-links"
- verify_host: true
-
- - name: Validate pull
- stat:
- path: "{{ destdir.path }}/pull/push/common-file"
- register: _pull
-
- - name: Assert pull
- assert:
- that:
- - _pull.stat.exists
- - _pull.stat.isreg
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-rsh-bad.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-rsh-bad.yaml
deleted file mode 100644
index e14c6e3fb..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-rsh-bad.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-- hosts: all
- tasks:
- - synchronize:
- rsync_opts:
- - "--rsh={{ zuul.executor.log_root }}/oops"
- src: "/proc/cmdline"
- dest: "{{ zuul.executor.log_root }}/noop"
- mode: pull
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-rsh-env-bad.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-rsh-env-bad.yaml
deleted file mode 100644
index d051e002b..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/synchronize-rsh-env-bad.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-- hosts: all
- tasks:
- - synchronize:
- src: "/proc/cmdline"
- dest: "{{ zuul.executor.log_root }}/noop"
- mode: pull
- environment:
- RSYNC_RSH: "{{ zuul.executor.log_root }}/oops"
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/template-bad-symlink.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/template-bad-symlink.yaml
deleted file mode 100644
index b353b8c80..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/template-bad-symlink.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: template-test
- src_file: symlink
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/template-bad.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/template-bad.yaml
deleted file mode 100644
index 3a1738ec4..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/template-bad.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: template-test
- src_file: /opt/file
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/template-delegate.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/template-delegate.yaml
deleted file mode 100644
index f13b05c76..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/template-delegate.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-- hosts: all
- roles:
- - template-test-delegate
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/template-good.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/template-good.yaml
deleted file mode 100644
index 1417a71c8..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/template-good.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: template-test
- src_file: template
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/template-localhost.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/template-localhost.yaml
deleted file mode 100644
index 72622ea39..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/template-localhost.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-- hosts: localhost
- roles:
- - template-test-localhost
-
-- hosts: 127.0.0.1
- roles:
- - template-test-localhost
-
-- hosts: "::1"
- roles:
- - template-test-localhost
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/unarchive-bad-symlink.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/unarchive-bad-symlink.yaml
deleted file mode 100644
index 2f910747d..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/unarchive-bad-symlink.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: unarchive-test
- src_file: symlink
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/unarchive-bad.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/unarchive-bad.yaml
deleted file mode 100644
index ecd8dadca..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/unarchive-bad.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: unarchive-test
- src_file: /opt/archive.tar
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/unarchive-delegate.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/unarchive-delegate.yaml
deleted file mode 100644
index 5cbb07348..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/unarchive-delegate.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-- hosts: all
- roles:
- - unarchive-test-delegate
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/unarchive-good.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/unarchive-good.yaml
deleted file mode 100644
index 6fab4341e..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/unarchive-good.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - role: unarchive-test
- src_file: archive.tar
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/unarchive-localhost.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/unarchive-localhost.yaml
deleted file mode 100644
index 6406aaa11..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/unarchive-localhost.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-- hosts: localhost
- roles:
- - unarchive-test-localhost
-
-- hosts: 127.0.0.1
- roles:
- - unarchive-test-localhost
-
-- hosts: "::1"
- roles:
- - unarchive-test-localhost
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/uri-bad-dest.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/uri-bad-dest.yaml
deleted file mode 100644
index 6c151842a..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/uri-bad-dest.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-- hosts: localhost
- tasks:
- - name: Request with bad src
- uri:
- url: https://zuul.opendev.org
- dest: /etc/zuul-uri-output-testing
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/uri-bad-src.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/uri-bad-src.yaml
deleted file mode 100644
index 9a9460c9b..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/uri-bad-src.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-- hosts: localhost
- tasks:
- - name: Request with bad src
- uri:
- url: https://zuul.opendev.org
- method: POST
- src: /etc/resolv.conf
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/uri-bad-url.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/uri-bad-url.yaml
deleted file mode 100644
index 222f1925a..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/uri-bad-url.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
-- hosts: localhost
- tasks:
- - name: Request with bad url scheme
- uri:
- url: "file:///etc/resolv.conf"
- dest: "{{ zuul.executor.log_root }}/resolv.conf"
- - name: stat file that shouldnt exist
- stat:
- path: "{{ zuul.executor.log_root }}/resolv.conf"
- register: test_stat
- - name: Debug the stat
- debug:
- msg: "resolv.conf exists when it shouldn't"
- when: test_stat.stat.exists
diff --git a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/uri-good.yaml b/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/uri-good.yaml
deleted file mode 100644
index 0416cef4e..000000000
--- a/tests/fixtures/config/remote-action-modules/git/org_project/playbooks/uri-good.yaml
+++ /dev/null
@@ -1,16 +0,0 @@
-- hosts: localhost
- tasks:
- - name: Safe uri request from localhost
- uri:
- # We don't seem to have working ssl cert chains in
- # the test bwrap context. Use http to workaround that
- # and don't follow the redirect to https.
- url: http://zuul.opendev.org
- follow_redirects: none
- return_content: yes
- status_code:
- - 301
- - 302
- - 303
- - 307
- - 308
diff --git a/tests/fixtures/config/remote-zuul-stream/git/common-config/playbooks/command-localhost.yaml b/tests/fixtures/config/remote-zuul-stream/git/common-config/playbooks/command-localhost.yaml
deleted file mode 100644
index 629f3398c..000000000
--- a/tests/fixtures/config/remote-zuul-stream/git/common-config/playbooks/command-localhost.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-- hosts: localhost
- tasks:
- - name: Local shell task with python exception
- command: echo foo
- args:
- chdir: /local-shelltask/somewhere/that/does/not/exist
- failed_when: false
diff --git a/tests/fixtures/config/remote-zuul-stream/git/common-config/zuul.yaml b/tests/fixtures/config/remote-zuul-stream/git/common-config/zuul.yaml
index f9ad5fcfe..a07342e2e 100644
--- a/tests/fixtures/config/remote-zuul-stream/git/common-config/zuul.yaml
+++ b/tests/fixtures/config/remote-zuul-stream/git/common-config/zuul.yaml
@@ -15,7 +15,3 @@
- job:
name: base
parent: null
-
-- job:
- name: command-localhost
- run: playbooks/command-localhost.yaml
diff --git a/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/command.yaml b/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/command.yaml
index ea772d607..539db80b7 100644
--- a/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/command.yaml
+++ b/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/command.yaml
@@ -90,10 +90,41 @@
- failed_in_loop2
ignore_errors: True
-- hosts: all
+# Try transitive includes two different ways
+- hosts: compute1
tasks:
- - name: Remote shell task with python exception
- command: echo foo
- args:
- chdir: /remote-shelltask/somewhere/that/does/not/exist
+ - include_role:
+ name: include-echo-role
+ vars:
+ item: transitive-one
+ - include_role:
+ name: include-echo-role
+ vars:
+ item: transitive-two
+
+- hosts: compute1
+ roles:
+ - role: include-echo-role
+ item: transitive-three
+ - role: include-echo-role
+ item: transitive-four
+
+- hosts: compute1
+ tasks:
+ - name: Command Not Found
+ command: command-not-found
failed_when: false
+
+- hosts: compute1
+ tasks:
+
+ - name: Debug raw variable in msg
+ debug:
+ msg: '{{ ansible_version }}'
+
+ - name: Debug raw variable in a loop
+ debug:
+ msg: '{{ ansible_version }}'
+ loop:
+ - 1
+ - 2
diff --git a/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/library/broken_module_exception.py b/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/library/broken_module_exception.py
index 6cfa0a3d0..7933f15a8 100755
--- a/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/library/broken_module_exception.py
+++ b/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/library/broken_module_exception.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
def main():
diff --git a/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/library/broken_module_no_result.py b/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/library/broken_module_no_result.py
index 065509d0d..0bdced5eb 100755
--- a/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/library/broken_module_no_result.py
+++ b/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/library/broken_module_no_result.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
def main():
diff --git a/tests/fixtures/config/remote-zuul-stream/git/org_project/roles/echo-role/tasks/main.yaml b/tests/fixtures/config/remote-zuul-stream/git/org_project/roles/echo-role/tasks/main.yaml
new file mode 100644
index 000000000..500329797
--- /dev/null
+++ b/tests/fixtures/config/remote-zuul-stream/git/org_project/roles/echo-role/tasks/main.yaml
@@ -0,0 +1,2 @@
+- name: Echo message
+ command: "echo {{item}}"
diff --git a/tests/fixtures/config/remote-zuul-stream/git/org_project/roles/include-echo-role/tasks/main.yaml b/tests/fixtures/config/remote-zuul-stream/git/org_project/roles/include-echo-role/tasks/main.yaml
new file mode 100644
index 000000000..79eade799
--- /dev/null
+++ b/tests/fixtures/config/remote-zuul-stream/git/org_project/roles/include-echo-role/tasks/main.yaml
@@ -0,0 +1,3 @@
+- name: Include echo role
+ include_role:
+ name: echo-role
diff --git a/tests/fixtures/config/requirements/state/git/common-config/zuul.yaml b/tests/fixtures/config/requirements/state/git/common-config/zuul.yaml
index 9f018c97f..74811ab1a 100644
--- a/tests/fixtures/config/requirements/state/git/common-config/zuul.yaml
+++ b/tests/fixtures/config/requirements/state/git/common-config/zuul.yaml
@@ -49,6 +49,23 @@
gerrit:
Verified: -1
+- pipeline:
+ name: wip-check
+ manager: independent
+ require:
+ gerrit:
+ wip: false
+ trigger:
+ gerrit:
+ - event: patchset-created
+ - event: comment-added
+ success:
+ gerrit:
+ Verified: 1
+ failure:
+ gerrit:
+ Verified: -1
+
- job:
name: base
parent: null
@@ -74,3 +91,9 @@
status-check:
jobs:
- project-job
+
+- project:
+ name: wip-project
+ wip-check:
+ jobs:
+ - project-job
diff --git a/tests/fixtures/config/requirements/state/git/wip-project/README b/tests/fixtures/config/requirements/state/git/wip-project/README
new file mode 100644
index 000000000..9daeafb98
--- /dev/null
+++ b/tests/fixtures/config/requirements/state/git/wip-project/README
@@ -0,0 +1 @@
+test
diff --git a/tests/fixtures/config/requirements/state/main.yaml b/tests/fixtures/config/requirements/state/main.yaml
index 99756fbf4..1ec703868 100644
--- a/tests/fixtures/config/requirements/state/main.yaml
+++ b/tests/fixtures/config/requirements/state/main.yaml
@@ -8,3 +8,4 @@
- current-project
- open-project
- status-project
+ - wip-project
diff --git a/tests/fixtures/config/single-tenant/git/common-config/zuul.yaml b/tests/fixtures/config/single-tenant/git/common-config/zuul.yaml
index b29f5a654..cbc523a8b 100644
--- a/tests/fixtures/config/single-tenant/git/common-config/zuul.yaml
+++ b/tests/fixtures/config/single-tenant/git/common-config/zuul.yaml
@@ -148,8 +148,6 @@
- project1-project2-integration:
dependencies: project-merge
gate:
- # This will be overridden on project level
- queue: integrated-overridden
jobs:
- project-merge
- project-test1:
@@ -164,6 +162,7 @@
- project:
name: org/project2
+ queue: integrated
check:
jobs:
- project-merge
@@ -174,7 +173,6 @@
- project1-project2-integration:
dependencies: project-merge
gate:
- queue: integrated
jobs:
- project-merge
- project-test1:
@@ -186,6 +184,7 @@
- project:
name: common-config
+ queue: integrated
check:
jobs:
- project-merge
@@ -196,7 +195,6 @@
- project1-project2-integration:
dependencies: project-merge
gate:
- queue: integrated
jobs:
- project-merge
- project-test1:
diff --git a/tests/fixtures/config/single-tenant/git/org_project3/README b/tests/fixtures/config/single-tenant/git/org_project3/README
new file mode 100644
index 000000000..9daeafb98
--- /dev/null
+++ b/tests/fixtures/config/single-tenant/git/org_project3/README
@@ -0,0 +1 @@
+test
diff --git a/tests/fixtures/config/single-tenant/git/org_project3/zuul.yaml b/tests/fixtures/config/single-tenant/git/org_project3/zuul.yaml
new file mode 100644
index 000000000..a588b7aa2
--- /dev/null
+++ b/tests/fixtures/config/single-tenant/git/org_project3/zuul.yaml
@@ -0,0 +1,25 @@
+- project:
+ queue: integrated
+ check:
+ jobs:
+ - project-merge
+ - project-test1:
+ dependencies: project-merge
+ - project-test2:
+ dependencies: project-merge
+ - project1-project2-integration:
+ dependencies:
+ - project-test1
+ - project-test2
+ gate:
+ jobs:
+ - project-merge
+ - project-test1:
+ dependencies: project-merge
+ - project-test2:
+ dependencies: project-merge
+ - project1-project2-integration:
+ dependencies:
+ - project-merge
+ - project-test1
+ - project-test2
diff --git a/tests/fixtures/config/speculative-plugins/main.yaml b/tests/fixtures/config/single-tenant/main-model-upgrade.yaml
index 4b16676e4..919921e91 100644
--- a/tests/fixtures/config/speculative-plugins/main.yaml
+++ b/tests/fixtures/config/single-tenant/main-model-upgrade.yaml
@@ -6,6 +6,6 @@
- common-config
untrusted-projects:
- org/project
+ - org/project1
- org/project2
- org/project3
- - org/projectrole
diff --git a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-bare-role/bare-role/filter_plugins/main.py b/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-bare-role/bare-role/filter_plugins/main.py
deleted file mode 100644
index 1b81dc8d6..000000000
--- a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-bare-role/bare-role/filter_plugins/main.py
+++ /dev/null
@@ -1,14 +0,0 @@
-import subprocess
-
-
-def my_cool_test(string):
- shell_output = subprocess.check_output(['hostname'])
- return 'hostname: %s' % shell_output.decode('utf-8')
-
-
-class FilterModule(object):
-
- def filters(self):
- return {
- 'my_cool_test': my_cool_test
- }
diff --git a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-bare-role/bare-role/tasks/main.yaml b/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-bare-role/bare-role/tasks/main.yaml
deleted file mode 100644
index 2e49d416e..000000000
--- a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-bare-role/bare-role/tasks/main.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-- name: Test filter plugin
- debug:
- msg: "{{ 'ignore me' | my_cool_test }}"
diff --git a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-bare-role/test.yaml b/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-bare-role/test.yaml
deleted file mode 100644
index f25bb560d..000000000
--- a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-bare-role/test.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - bare-role
-
diff --git a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-playbook-symlink/filter_plugins b/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-playbook-symlink/filter_plugins
deleted file mode 100644
index 56b0433cc..000000000
--- a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-playbook-symlink/filter_plugins
+++ /dev/null
@@ -1 +0,0 @@
-symlink: ../filter-plugin-playbook/filter_plugins
diff --git a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-playbook-symlink/test.yaml b/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-playbook-symlink/test.yaml
deleted file mode 100644
index e190da0d9..000000000
--- a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-playbook-symlink/test.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-- hosts: all
- tasks:
- - name: Test filter plugin
- debug:
- msg: "{{ 'ignore me' | my_cool_test }}"
diff --git a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-playbook/filter_plugins/main.py b/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-playbook/filter_plugins/main.py
deleted file mode 100644
index 1b81dc8d6..000000000
--- a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-playbook/filter_plugins/main.py
+++ /dev/null
@@ -1,14 +0,0 @@
-import subprocess
-
-
-def my_cool_test(string):
- shell_output = subprocess.check_output(['hostname'])
- return 'hostname: %s' % shell_output.decode('utf-8')
-
-
-class FilterModule(object):
-
- def filters(self):
- return {
- 'my_cool_test': my_cool_test
- }
diff --git a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-playbook/test.yaml b/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-playbook/test.yaml
deleted file mode 100644
index e190da0d9..000000000
--- a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-playbook/test.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-- hosts: all
- tasks:
- - name: Test filter plugin
- debug:
- msg: "{{ 'ignore me' | my_cool_test }}"
diff --git a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-role/roles/local-role/filter_plugins/main.py b/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-role/roles/local-role/filter_plugins/main.py
deleted file mode 100644
index 1b81dc8d6..000000000
--- a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-role/roles/local-role/filter_plugins/main.py
+++ /dev/null
@@ -1,14 +0,0 @@
-import subprocess
-
-
-def my_cool_test(string):
- shell_output = subprocess.check_output(['hostname'])
- return 'hostname: %s' % shell_output.decode('utf-8')
-
-
-class FilterModule(object):
-
- def filters(self):
- return {
- 'my_cool_test': my_cool_test
- }
diff --git a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-role/roles/local-role/tasks/main.yaml b/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-role/roles/local-role/tasks/main.yaml
deleted file mode 100644
index 2e49d416e..000000000
--- a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-role/roles/local-role/tasks/main.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-- name: Test filter plugin
- debug:
- msg: "{{ 'ignore me' | my_cool_test }}"
diff --git a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-role/test.yaml b/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-role/test.yaml
deleted file mode 100644
index f31611a7d..000000000
--- a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-role/test.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - local-role
-
diff --git a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-shared-bare-role/test.yaml b/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-shared-bare-role/test.yaml
deleted file mode 100644
index 32e72c865..000000000
--- a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-shared-bare-role/test.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - shared-bare-role
-
diff --git a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-shared-role/test.yaml b/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-shared-role/test.yaml
deleted file mode 100644
index d9557f6a7..000000000
--- a/tests/fixtures/config/speculative-plugins/git/org_project/playbooks/filter-plugin-shared-role/test.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - shared-role
-
diff --git a/tests/fixtures/config/speculative-plugins/git/org_project2/roles/shared-role/filter_plugins/main.py b/tests/fixtures/config/speculative-plugins/git/org_project2/roles/shared-role/filter_plugins/main.py
deleted file mode 100644
index 1b81dc8d6..000000000
--- a/tests/fixtures/config/speculative-plugins/git/org_project2/roles/shared-role/filter_plugins/main.py
+++ /dev/null
@@ -1,14 +0,0 @@
-import subprocess
-
-
-def my_cool_test(string):
- shell_output = subprocess.check_output(['hostname'])
- return 'hostname: %s' % shell_output.decode('utf-8')
-
-
-class FilterModule(object):
-
- def filters(self):
- return {
- 'my_cool_test': my_cool_test
- }
diff --git a/tests/fixtures/config/speculative-plugins/git/org_project2/roles/shared-role/tasks/main.yaml b/tests/fixtures/config/speculative-plugins/git/org_project2/roles/shared-role/tasks/main.yaml
deleted file mode 100644
index 2e49d416e..000000000
--- a/tests/fixtures/config/speculative-plugins/git/org_project2/roles/shared-role/tasks/main.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-- name: Test filter plugin
- debug:
- msg: "{{ 'ignore me' | my_cool_test }}"
diff --git a/tests/fixtures/config/speculative-plugins/git/org_project3/filter_plugins/main.py b/tests/fixtures/config/speculative-plugins/git/org_project3/filter_plugins/main.py
deleted file mode 100644
index 1b81dc8d6..000000000
--- a/tests/fixtures/config/speculative-plugins/git/org_project3/filter_plugins/main.py
+++ /dev/null
@@ -1,14 +0,0 @@
-import subprocess
-
-
-def my_cool_test(string):
- shell_output = subprocess.check_output(['hostname'])
- return 'hostname: %s' % shell_output.decode('utf-8')
-
-
-class FilterModule(object):
-
- def filters(self):
- return {
- 'my_cool_test': my_cool_test
- }
diff --git a/tests/fixtures/config/speculative-plugins/git/org_project3/tasks/main.yaml b/tests/fixtures/config/speculative-plugins/git/org_project3/tasks/main.yaml
deleted file mode 100644
index 2e49d416e..000000000
--- a/tests/fixtures/config/speculative-plugins/git/org_project3/tasks/main.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-- name: Test filter plugin
- debug:
- msg: "{{ 'ignore me' | my_cool_test }}"
diff --git a/tests/fixtures/config/speculative-plugins/git/org_projectrole/playbooks/filter-plugin-repo-role/test.yaml b/tests/fixtures/config/speculative-plugins/git/org_projectrole/playbooks/filter-plugin-repo-role/test.yaml
deleted file mode 100644
index d680d3bcc..000000000
--- a/tests/fixtures/config/speculative-plugins/git/org_projectrole/playbooks/filter-plugin-repo-role/test.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-- hosts: all
- roles:
- - project-role
-
diff --git a/tests/fixtures/config/speculative-plugins/git/org_projectrole/roles/project-role/filter_plugins/main.py b/tests/fixtures/config/speculative-plugins/git/org_projectrole/roles/project-role/filter_plugins/main.py
deleted file mode 100644
index 1b81dc8d6..000000000
--- a/tests/fixtures/config/speculative-plugins/git/org_projectrole/roles/project-role/filter_plugins/main.py
+++ /dev/null
@@ -1,14 +0,0 @@
-import subprocess
-
-
-def my_cool_test(string):
- shell_output = subprocess.check_output(['hostname'])
- return 'hostname: %s' % shell_output.decode('utf-8')
-
-
-class FilterModule(object):
-
- def filters(self):
- return {
- 'my_cool_test': my_cool_test
- }
diff --git a/tests/fixtures/config/speculative-plugins/git/org_projectrole/roles/project-role/tasks/main.yaml b/tests/fixtures/config/speculative-plugins/git/org_projectrole/roles/project-role/tasks/main.yaml
deleted file mode 100644
index 2e49d416e..000000000
--- a/tests/fixtures/config/speculative-plugins/git/org_projectrole/roles/project-role/tasks/main.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-- name: Test filter plugin
- debug:
- msg: "{{ 'ignore me' | my_cool_test }}"
diff --git a/tests/fixtures/config/sql-driver/git/common-config/zuul.yaml b/tests/fixtures/config/sql-driver/git/common-config/zuul.yaml
index 57d50ca43..6192249c6 100644
--- a/tests/fixtures/config/sql-driver/git/common-config/zuul.yaml
+++ b/tests/fixtures/config/sql-driver/git/common-config/zuul.yaml
@@ -105,6 +105,7 @@
- project:
name: org/project1
+ queue: integrated
check:
jobs:
- project-merge
@@ -113,7 +114,6 @@
- project-test2:
dependencies: project-merge
gate:
- queue: integrated
jobs:
- project-merge
- project-test1:
diff --git a/tests/fixtures/config/streamer/git/common-config/playbooks/python27.yaml b/tests/fixtures/config/streamer/git/common-config/playbooks/python27.yaml
index 8485b04ce..397439f61 100644
--- a/tests/fixtures/config/streamer/git/common-config/playbooks/python27.yaml
+++ b/tests/fixtures/config/streamer/git/common-config/playbooks/python27.yaml
@@ -11,6 +11,18 @@
Debug Test Token String
Message
+ # Logging of loops is special so we do a simple one iteration
+ # loop and check that we log things properly
+ - name: Override ansible_loop_var
+ set_fact:
+ _testing_fact: "{{ other_loop_var }}"
+ with_random_choice:
+ - "one"
+ - "two"
+ - "three"
+ loop_control:
+ loop_var: "other_loop_var"
+
# Do not finish until test creates the flag file
- wait_for:
state: present
diff --git a/tests/fixtures/config/tenant-parser/exclude-branches.yaml b/tests/fixtures/config/tenant-parser/exclude-branches.yaml
new file mode 100644
index 000000000..1efbae38f
--- /dev/null
+++ b/tests/fixtures/config/tenant-parser/exclude-branches.yaml
@@ -0,0 +1,12 @@
+- tenant:
+ name: tenant-one
+ source:
+ gerrit:
+ config-projects:
+ - common-config
+ untrusted-projects:
+ - org/project1:
+ exclude-branches:
+ - master
+ - baz
+ - org/project2
diff --git a/tests/fixtures/config/tenant-parser/extra.yaml b/tests/fixtures/config/tenant-parser/extra.yaml
index 3a5f6b004..efa3fbc9b 100644
--- a/tests/fixtures/config/tenant-parser/extra.yaml
+++ b/tests/fixtures/config/tenant-parser/extra.yaml
@@ -20,3 +20,6 @@
extra-config-paths:
- extra.yaml
- extra.d/
+ - org/project6:
+ extra-config-paths:
+ - other/extra.d/
diff --git a/tests/fixtures/config/ansible/git/org_plugin-project/.zuul.yaml b/tests/fixtures/config/tenant-parser/git/org_project6/.zuul.yaml
index e69de29bb..e69de29bb 100644
--- a/tests/fixtures/config/ansible/git/org_plugin-project/.zuul.yaml
+++ b/tests/fixtures/config/tenant-parser/git/org_project6/.zuul.yaml
diff --git a/tests/fixtures/config/tenant-parser/git/org_project6/other/extra.d/extra.yaml b/tests/fixtures/config/tenant-parser/git/org_project6/other/extra.d/extra.yaml
new file mode 100644
index 000000000..c6645f4b9
--- /dev/null
+++ b/tests/fixtures/config/tenant-parser/git/org_project6/other/extra.d/extra.yaml
@@ -0,0 +1,9 @@
+- job:
+ name: project6-extra-dir
+ run: playbooks/common.yaml
+
+- project:
+ check:
+ jobs:
+ - project6-extra-dir
+
diff --git a/tests/fixtures/config/tenant-parser/git/org_project6/playbooks/common.yaml b/tests/fixtures/config/tenant-parser/git/org_project6/playbooks/common.yaml
new file mode 100644
index 000000000..f679dceae
--- /dev/null
+++ b/tests/fixtures/config/tenant-parser/git/org_project6/playbooks/common.yaml
@@ -0,0 +1,2 @@
+- hosts: all
+ tasks: []
diff --git a/tests/fixtures/config/tenant-parser/include-branches.yaml b/tests/fixtures/config/tenant-parser/include-branches.yaml
new file mode 100644
index 000000000..382926488
--- /dev/null
+++ b/tests/fixtures/config/tenant-parser/include-branches.yaml
@@ -0,0 +1,12 @@
+- tenant:
+ name: tenant-one
+ source:
+ gerrit:
+ config-projects:
+ - common-config
+ untrusted-projects:
+ - org/project1:
+ include-branches:
+ - foo
+ - bar
+ - org/project2
diff --git a/tests/fixtures/config/two-tenant/exclude-all.yaml b/tests/fixtures/config/two-tenant/exclude-all.yaml
new file mode 100644
index 000000000..60938c366
--- /dev/null
+++ b/tests/fixtures/config/two-tenant/exclude-all.yaml
@@ -0,0 +1,20 @@
+- tenant:
+ name: tenant-one
+ source:
+ gerrit:
+ config-projects:
+ - common-config
+ untrusted-projects:
+ - org/project1
+ - org/project2:
+ include: []
+
+- tenant:
+ name: tenant-two
+ source:
+ gerrit:
+ config-projects:
+ - common-config
+ untrusted-projects:
+ - org/project1
+ - org/project2
diff --git a/tests/fixtures/layout.yaml b/tests/fixtures/layout.yaml
deleted file mode 100644
index cd8ce1906..000000000
--- a/tests/fixtures/layout.yaml
+++ /dev/null
@@ -1,233 +0,0 @@
-includes:
- - python-file: custom_functions.py
-
-pipelines:
- - name: check
- manager: independent
- source:
- gerrit
- trigger:
- gerrit:
- - event: patchset-created
- success:
- gerrit:
- Verified: 1
- failure:
- gerrit:
- Verified: -1
-
- - name: post
- manager: independent
- source:
- gerrit
- trigger:
- gerrit:
- - event: ref-updated
- ref: ^(?!refs/).*$
-
- - name: gate
- manager: dependent
- failure-message: Build failed. For information on how to proceed, see http://wiki.example.org/Test_Failures
- source:
- gerrit
- trigger:
- gerrit:
- - event: comment-added
- approval:
- - Approved: 1
- success:
- gerrit:
- Verified: 2
- submit: true
- failure:
- gerrit:
- Verified: -2
- start:
- gerrit:
- Verified: 0
- precedence: high
-
- - name: unused
- manager: independent
- dequeue-on-new-patchset: false
- source:
- gerrit
- trigger:
- gerrit:
- - event: comment-added
- approval:
- - Approved: 1
-
- - name: dup1
- manager: independent
- source:
- gerrit
- trigger:
- gerrit:
- - event: change-restored
- success:
- gerrit:
- Verified: 1
- failure:
- gerrit:
- Verified: -1
-
- - name: dup2
- manager: independent
- source:
- gerrit
- trigger:
- gerrit:
- - event: change-restored
- success:
- gerrit:
- Verified: 1
- failure:
- gerrit:
- Verified: -1
-
- - name: conflict
- manager: dependent
- failure-message: Build failed. For information on how to proceed, see http://wiki.example.org/Test_Failures
- source:
- gerrit
- trigger:
- gerrit:
- - event: comment-added
- approval:
- - Approved: 1
- success:
- gerrit:
- Verified: 2
- submit: true
- failure:
- gerrit:
- Verified: -2
- start:
- gerrit:
- Verified: 0
-
- - name: experimental
- manager: independent
- source:
- gerrit
- trigger:
- gerrit:
- - event: patchset-created
- success:
- gerrit: {}
- failure:
- gerrit: {}
-
-jobs:
- - name: ^.*-merge$
- failure-message: Unable to merge change
- hold-following-changes: true
- tags: merge
- - name: nonvoting-project-test2
- voting: false
- - name: project-testfile
- files:
- - '.*-requires'
- - name: project1-project2-integration
- queue-name: integration
- - name: mutex-one
- mutex: test-mutex
- - name: mutex-two
- mutex: test-mutex
- - name: project1-merge
- tags:
- - project1
- - extratag
-
-projects:
- - name: org/project
- merge-mode: cherry-pick
- check:
- - project-merge:
- - project-test1
- - project-test2
- - project-testfile
- gate:
- - project-merge:
- - project-test1
- - project-test2
- - project-testfile
- post:
- - project-post
- dup1:
- - project-test1
- dup2:
- - project-test1
-
- - name: org/project1
- check:
- - project1-merge:
- - project1-test1
- - project1-test2
- - project1-project2-integration
- gate:
- - project1-merge:
- - project1-test1
- - project1-test2
- - project1-project2-integration
- post:
- - project1-post
-
- - name: org/project2
- check:
- - project2-merge:
- - project2-test1
- - project2-test2
- - project1-project2-integration
- gate:
- - project2-merge:
- - project2-test1
- - project2-test2
- - project1-project2-integration
- post:
- - project2-post
-
- - name: org/project3
- check:
- - project3-merge:
- - project3-test1
- - project3-test2
- - project1-project2-integration
- gate:
- - project3-merge:
- - project3-test1
- - project3-test2
- - project1-project2-integration
- post:
- - project3-post
-
- - name: org/nonvoting-project
- check:
- - nonvoting-project-merge:
- - nonvoting-project-test1
- - nonvoting-project-test2
- gate:
- - nonvoting-project-merge:
- - nonvoting-project-test1
- - nonvoting-project-test2
- post:
- - nonvoting-project-post
-
- - name: org/conflict-project
- conflict:
- - conflict-project-merge:
- - conflict-project-test1
- - conflict-project-test2
-
- - name: org/noop-project
- gate:
- - noop
-
- - name: org/experimental-project
- experimental:
- - experimental-project-test
-
- - name: org/no-jobs-project
- check:
- - project-testfile
diff --git a/tests/fixtures/layouts/circular-deps-node-failure.yaml b/tests/fixtures/layouts/circular-deps-node-failure.yaml
new file mode 100644
index 000000000..244449b82
--- /dev/null
+++ b/tests/fixtures/layouts/circular-deps-node-failure.yaml
@@ -0,0 +1,62 @@
+- queue:
+ name: integrated
+ allow-circular-dependencies: true
+
+- pipeline:
+ name: gate
+ manager: dependent
+ success-message: Build succeeded (gate).
+ require:
+ gerrit:
+ approval:
+ - Approved: 1
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - Approved: 1
+ success:
+ gerrit:
+ Verified: 2
+ submit: true
+ failure:
+ gerrit:
+ Verified: -2
+ start:
+ gerrit:
+ Verified: 0
+ precedence: high
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/run.yaml
+ nodeset:
+ nodes:
+ - label: debian
+ name: controller
+
+- job:
+ name: common-job
+
+- job:
+ name: project1-job
+
+- job:
+ name: project2-job
+
+- project:
+ name: org/project1
+ queue: integrated
+ gate:
+ jobs:
+ - common-job
+ - project1-job
+
+- project:
+ name: org/project2
+ queue: integrated
+ gate:
+ jobs:
+ - common-job
+ - project2-job
diff --git a/tests/fixtures/layouts/crd-github.yaml b/tests/fixtures/layouts/crd-github.yaml
index 6ef881f9b..bc938dec3 100644
--- a/tests/fixtures/layouts/crd-github.yaml
+++ b/tests/fixtures/layouts/crd-github.yaml
@@ -70,15 +70,15 @@
- project:
name: org/project3
+ queue: cogated
gate:
- queue: cogated
jobs:
- project3-test
- project:
name: org/project4
+ queue: cogated
gate:
- queue: cogated
jobs:
- project4-test
diff --git a/tests/fixtures/layouts/crd-gitlab.yaml b/tests/fixtures/layouts/crd-gitlab.yaml
index 210390b93..1884e4026 100644
--- a/tests/fixtures/layouts/crd-gitlab.yaml
+++ b/tests/fixtures/layouts/crd-gitlab.yaml
@@ -55,14 +55,14 @@
- project:
name: org/project3
+ queue: cogated
gate:
- queue: cogated
jobs:
- project3-test
- project:
name: org/project4
+ queue: cogated
gate:
- queue: cogated
jobs:
- - project4-test \ No newline at end of file
+ - project4-test
diff --git a/tests/fixtures/layouts/crd-pagure.yaml b/tests/fixtures/layouts/crd-pagure.yaml
index e0828aeeb..79e041f9a 100644
--- a/tests/fixtures/layouts/crd-pagure.yaml
+++ b/tests/fixtures/layouts/crd-pagure.yaml
@@ -52,14 +52,14 @@
- project:
name: org/project3
+ queue: cogated
gate:
- queue: cogated
jobs:
- project3-test
- project:
name: org/project4
+ queue: cogated
gate:
- queue: cogated
jobs:
- project4-test
diff --git a/tests/fixtures/layouts/deps-by-topic.yaml b/tests/fixtures/layouts/deps-by-topic.yaml
new file mode 100644
index 000000000..3824c5c2c
--- /dev/null
+++ b/tests/fixtures/layouts/deps-by-topic.yaml
@@ -0,0 +1,70 @@
+- queue:
+ name: integrated
+ allow-circular-dependencies: true
+ dependencies-by-topic: true
+
+- pipeline:
+ name: check
+ manager: independent
+ trigger:
+ gerrit:
+ - event: patchset-created
+ success:
+ gerrit:
+ Verified: 1
+ failure:
+ gerrit:
+ Verified: -1
+
+- pipeline:
+ name: gate
+ manager: dependent
+ success-message: Build succeeded (gate).
+ require:
+ gerrit:
+ approval:
+ - Approved: 1
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - Approved: 1
+ success:
+ gerrit:
+ Verified: 2
+ submit: true
+ failure:
+ gerrit:
+ Verified: -2
+ start:
+ gerrit:
+ Verified: 0
+ precedence: high
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/run.yaml
+
+- job:
+ name: test-job
+
+- project:
+ name: org/project1
+ queue: integrated
+ check:
+ jobs:
+ - test-job
+ gate:
+ jobs:
+ - test-job
+
+- project:
+ name: org/project2
+ queue: integrated
+ check:
+ jobs:
+ - test-job
+ gate:
+ jobs:
+ - test-job
diff --git a/tests/fixtures/layouts/files-github.yaml b/tests/fixtures/layouts/files-github.yaml
index ed053f989..88d979ca4 100644
--- a/tests/fixtures/layouts/files-github.yaml
+++ b/tests/fixtures/layouts/files-github.yaml
@@ -17,8 +17,15 @@
- .*-requires
run: playbooks/project-test1.yaml
+- job:
+ name: project-test2
+ files:
+ - .*-removed
+ run: playbooks/project-test1.yaml
+
- project:
name: org/project
check:
jobs:
- project-test1
+ - project-test2
diff --git a/tests/fixtures/layouts/files-gitlab.yaml b/tests/fixtures/layouts/files-gitlab.yaml
new file mode 100644
index 000000000..a6b12e681
--- /dev/null
+++ b/tests/fixtures/layouts/files-gitlab.yaml
@@ -0,0 +1,31 @@
+- pipeline:
+ name: check
+ manager: independent
+ trigger:
+ gitlab:
+ - event: gl_merge_request
+ action: opened
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/base.yaml
+
+- job:
+ name: project-test1
+ files:
+ - .*-requires
+ run: playbooks/project-test1.yaml
+
+- job:
+ name: project-test2
+ files:
+ - .*-removed
+ run: playbooks/project-test1.yaml
+
+- project:
+ name: org/project
+ check:
+ jobs:
+ - project-test1
+ - project-test2
diff --git a/tests/fixtures/layouts/files-pagure.yaml b/tests/fixtures/layouts/files-pagure.yaml
index 03171c1b9..c64c72f63 100644
--- a/tests/fixtures/layouts/files-pagure.yaml
+++ b/tests/fixtures/layouts/files-pagure.yaml
@@ -17,8 +17,15 @@
- .*-requires
run: playbooks/project-test1.yaml
+- job:
+ name: project-test2
+ files:
+ - .*-removed
+ run: playbooks/project-test1.yaml
+
- project:
name: org/project
check:
jobs:
- project-test1
+ - project-test2
diff --git a/tests/fixtures/layouts/freeze-job-failure.yaml b/tests/fixtures/layouts/freeze-job-failure.yaml
new file mode 100644
index 000000000..ae3f48324
--- /dev/null
+++ b/tests/fixtures/layouts/freeze-job-failure.yaml
@@ -0,0 +1,32 @@
+- pipeline:
+ name: check
+ manager: independent
+ trigger:
+ gerrit:
+ - event: patchset-created
+ success:
+ gerrit:
+ Verified: 1
+ failure:
+ gerrit:
+ Verified: -1
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/base.yaml
+
+- job:
+ name: project-test1
+ run: playbooks/project-test1.yaml
+
+- job:
+ name: project-test2
+ run: playbooks/project-test2.yaml
+
+- project:
+ name: org/project
+ check:
+ jobs:
+ - project-test2:
+ dependencies: project-test1
diff --git a/tests/fixtures/layouts/job-dedup-auto-shared.yaml b/tests/fixtures/layouts/job-dedup-auto-shared.yaml
new file mode 100644
index 000000000..26896dec8
--- /dev/null
+++ b/tests/fixtures/layouts/job-dedup-auto-shared.yaml
@@ -0,0 +1,65 @@
+- queue:
+ name: integrated
+ allow-circular-dependencies: true
+
+- pipeline:
+ name: gate
+ manager: dependent
+ success-message: Build succeeded (gate).
+ require:
+ gerrit:
+ approval:
+ - Approved: 1
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - Approved: 1
+ success:
+ gerrit:
+ Verified: 2
+ submit: true
+ failure:
+ gerrit:
+ Verified: -2
+ start:
+ gerrit:
+ Verified: 0
+ precedence: high
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/run.yaml
+ nodeset:
+ nodes:
+ - label: debian
+ name: controller
+
+- job:
+ name: common-job
+ required-projects:
+ - org/project1
+ - org/project2
+
+- job:
+ name: project1-job
+
+- job:
+ name: project2-job
+
+- project:
+ name: org/project1
+ queue: integrated
+ gate:
+ jobs:
+ - common-job
+ - project1-job
+
+- project:
+ name: org/project2
+ queue: integrated
+ gate:
+ jobs:
+ - common-job
+ - project2-job
diff --git a/tests/fixtures/layouts/job-dedup-auto-unshared.yaml b/tests/fixtures/layouts/job-dedup-auto-unshared.yaml
new file mode 100644
index 000000000..244449b82
--- /dev/null
+++ b/tests/fixtures/layouts/job-dedup-auto-unshared.yaml
@@ -0,0 +1,62 @@
+- queue:
+ name: integrated
+ allow-circular-dependencies: true
+
+- pipeline:
+ name: gate
+ manager: dependent
+ success-message: Build succeeded (gate).
+ require:
+ gerrit:
+ approval:
+ - Approved: 1
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - Approved: 1
+ success:
+ gerrit:
+ Verified: 2
+ submit: true
+ failure:
+ gerrit:
+ Verified: -2
+ start:
+ gerrit:
+ Verified: 0
+ precedence: high
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/run.yaml
+ nodeset:
+ nodes:
+ - label: debian
+ name: controller
+
+- job:
+ name: common-job
+
+- job:
+ name: project1-job
+
+- job:
+ name: project2-job
+
+- project:
+ name: org/project1
+ queue: integrated
+ gate:
+ jobs:
+ - common-job
+ - project1-job
+
+- project:
+ name: org/project2
+ queue: integrated
+ gate:
+ jobs:
+ - common-job
+ - project2-job
diff --git a/tests/fixtures/layouts/job-dedup-auto.yaml b/tests/fixtures/layouts/job-dedup-auto.yaml
new file mode 100644
index 000000000..f36f81136
--- /dev/null
+++ b/tests/fixtures/layouts/job-dedup-auto.yaml
@@ -0,0 +1,61 @@
+- queue:
+ name: integrated
+ allow-circular-dependencies: true
+
+- pipeline:
+ name: gate
+ manager: dependent
+ success-message: Build succeeded (gate).
+ require:
+ gerrit:
+ approval:
+ - Approved: 1
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - Approved: 1
+ success:
+ gerrit:
+ Verified: 2
+ submit: true
+ failure:
+ gerrit:
+ Verified: -2
+ start:
+ gerrit:
+ Verified: 0
+ precedence: high
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/run.yaml
+
+- job:
+ name: common-job
+ required-projects:
+ - org/project1
+ - org/project2
+
+- job:
+ name: project1-job
+
+- job:
+ name: project2-job
+
+- project:
+ name: org/project1
+ queue: integrated
+ gate:
+ jobs:
+ - common-job
+ - project1-job
+
+- project:
+ name: org/project2
+ queue: integrated
+ gate:
+ jobs:
+ - common-job
+ - project2-job
diff --git a/tests/fixtures/layouts/job-dedup-empty-nodeset.yaml b/tests/fixtures/layouts/job-dedup-empty-nodeset.yaml
new file mode 100644
index 000000000..f36f81136
--- /dev/null
+++ b/tests/fixtures/layouts/job-dedup-empty-nodeset.yaml
@@ -0,0 +1,61 @@
+- queue:
+ name: integrated
+ allow-circular-dependencies: true
+
+- pipeline:
+ name: gate
+ manager: dependent
+ success-message: Build succeeded (gate).
+ require:
+ gerrit:
+ approval:
+ - Approved: 1
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - Approved: 1
+ success:
+ gerrit:
+ Verified: 2
+ submit: true
+ failure:
+ gerrit:
+ Verified: -2
+ start:
+ gerrit:
+ Verified: 0
+ precedence: high
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/run.yaml
+
+- job:
+ name: common-job
+ required-projects:
+ - org/project1
+ - org/project2
+
+- job:
+ name: project1-job
+
+- job:
+ name: project2-job
+
+- project:
+ name: org/project1
+ queue: integrated
+ gate:
+ jobs:
+ - common-job
+ - project1-job
+
+- project:
+ name: org/project2
+ queue: integrated
+ gate:
+ jobs:
+ - common-job
+ - project2-job
diff --git a/tests/fixtures/layouts/job-dedup-false.yaml b/tests/fixtures/layouts/job-dedup-false.yaml
new file mode 100644
index 000000000..9254f0b41
--- /dev/null
+++ b/tests/fixtures/layouts/job-dedup-false.yaml
@@ -0,0 +1,67 @@
+- queue:
+ name: integrated
+ allow-circular-dependencies: true
+
+- pipeline:
+ name: gate
+ manager: dependent
+ success-message: Build succeeded (gate).
+ require:
+ gerrit:
+ approval:
+ - Approved: 1
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - Approved: 1
+ success:
+ gerrit:
+ Verified: 2
+ submit: true
+ failure:
+ gerrit:
+ Verified: -2
+ start:
+ gerrit:
+ Verified: 0
+ precedence: high
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/run.yaml
+ nodeset:
+ nodes:
+ - label: debian
+ name: controller
+
+- job:
+ name: common-job
+ deduplicate: false
+ pre-run: playbooks/pre.yaml
+ required-projects:
+ - org/project1
+ - org/project2
+
+- job:
+ name: project1-job
+
+- job:
+ name: project2-job
+
+- project:
+ name: org/project1
+ queue: integrated
+ gate:
+ jobs:
+ - common-job
+ - project1-job
+
+- project:
+ name: org/project2
+ queue: integrated
+ gate:
+ jobs:
+ - common-job
+ - project2-job
diff --git a/tests/fixtures/layouts/job-dedup-noop.yaml b/tests/fixtures/layouts/job-dedup-noop.yaml
new file mode 100644
index 000000000..9383fd8b6
--- /dev/null
+++ b/tests/fixtures/layouts/job-dedup-noop.yaml
@@ -0,0 +1,55 @@
+- queue:
+ name: integrated
+ allow-circular-dependencies: true
+
+- pipeline:
+ name: gate
+ manager: dependent
+ success-message: Build succeeded (gate).
+ require:
+ gerrit:
+ approval:
+ - Approved: 1
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - Approved: 1
+ success:
+ gerrit:
+ Verified: 2
+ submit: true
+ failure:
+ gerrit:
+ Verified: -2
+ start:
+ gerrit:
+ Verified: 0
+ precedence: high
+
+- job:
+ name: base
+ parent: null
+ pre-run: playbooks/pre.yaml
+ run: playbooks/run.yaml
+ nodeset:
+ nodes:
+ - label: debian
+ name: controller
+
+- job:
+ name: common-job
+ required-projects:
+ - org/project1
+
+- job:
+ name: project1-job
+
+- project:
+ name: org/project1
+ queue: integrated
+ gate:
+ jobs:
+ - noop
+ - common-job
+ - project1-job
diff --git a/tests/fixtures/layouts/job-dedup-parent-data.yaml b/tests/fixtures/layouts/job-dedup-parent-data.yaml
new file mode 100644
index 000000000..c88dbe3c6
--- /dev/null
+++ b/tests/fixtures/layouts/job-dedup-parent-data.yaml
@@ -0,0 +1,81 @@
+- queue:
+ name: integrated
+ allow-circular-dependencies: true
+
+- pipeline:
+ name: gate
+ manager: dependent
+ success-message: Build succeeded (gate).
+ require:
+ gerrit:
+ approval:
+ - Approved: 1
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - Approved: 1
+ success:
+ gerrit:
+ Verified: 2
+ submit: true
+ failure:
+ gerrit:
+ Verified: -2
+ start:
+ gerrit:
+ Verified: 0
+ precedence: high
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/run.yaml
+ nodeset:
+ nodes:
+ - label: debian
+ name: controller
+
+- job:
+ name: parent-job
+ deduplicate: true
+
+- job:
+ name: forked-child-job
+ deduplicate: true
+
+- job:
+ name: common-child-job
+ deduplicate: true
+
+- job:
+ name: project1-job
+
+- job:
+ name: project2-job
+
+- project:
+ name: org/project1
+ queue: integrated
+ gate:
+ jobs:
+ - parent-job
+ - common-child-job:
+ dependencies: parent-job
+ - project1-job:
+ dependencies: parent-job
+ - forked-child-job:
+ dependencies: project1-job
+
+- project:
+ name: org/project2
+ queue: integrated
+ gate:
+ jobs:
+ - parent-job
+ - common-child-job:
+ dependencies: parent-job
+ - project2-job:
+ dependencies: parent-job
+ - forked-child-job:
+ dependencies: project2-job
diff --git a/tests/fixtures/layouts/job-dedup-retry-child.yaml b/tests/fixtures/layouts/job-dedup-retry-child.yaml
new file mode 100644
index 000000000..89d25db42
--- /dev/null
+++ b/tests/fixtures/layouts/job-dedup-retry-child.yaml
@@ -0,0 +1,65 @@
+- queue:
+ name: integrated
+ allow-circular-dependencies: true
+
+- pipeline:
+ name: gate
+ manager: dependent
+ success-message: Build succeeded (gate).
+ require:
+ gerrit:
+ approval:
+ - Approved: 1
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - Approved: 1
+ success:
+ gerrit:
+ Verified: 2
+ submit: true
+ failure:
+ gerrit:
+ Verified: -2
+ start:
+ gerrit:
+ Verified: 0
+ precedence: high
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/run.yaml
+ nodeset:
+ nodes:
+ - label: debian
+ name: controller
+
+- job:
+ name: parent-job
+ deduplicate: true
+
+- job:
+ name: project1-job
+
+- job:
+ name: project2-job
+
+- project:
+ name: org/project1
+ queue: integrated
+ gate:
+ jobs:
+ - parent-job
+ - project1-job:
+ dependencies: parent-job
+
+- project:
+ name: org/project2
+ queue: integrated
+ gate:
+ jobs:
+ - parent-job
+ - project2-job:
+ dependencies: parent-job
diff --git a/tests/fixtures/layouts/job-dedup-retry.yaml b/tests/fixtures/layouts/job-dedup-retry.yaml
new file mode 100644
index 000000000..9cf963951
--- /dev/null
+++ b/tests/fixtures/layouts/job-dedup-retry.yaml
@@ -0,0 +1,66 @@
+- queue:
+ name: integrated
+ allow-circular-dependencies: true
+
+- pipeline:
+ name: gate
+ manager: dependent
+ success-message: Build succeeded (gate).
+ require:
+ gerrit:
+ approval:
+ - Approved: 1
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - Approved: 1
+ success:
+ gerrit:
+ Verified: 2
+ submit: true
+ failure:
+ gerrit:
+ Verified: -2
+ start:
+ gerrit:
+ Verified: 0
+ precedence: high
+
+- job:
+ name: base
+ parent: null
+ pre-run: playbooks/pre.yaml
+ run: playbooks/run.yaml
+ nodeset:
+ nodes:
+ - label: debian
+ name: controller
+
+- job:
+ name: common-job
+ required-projects:
+ - org/project1
+ - org/project2
+
+- job:
+ name: project1-job
+
+- job:
+ name: project2-job
+
+- project:
+ name: org/project1
+ queue: integrated
+ gate:
+ jobs:
+ - common-job
+ - project1-job
+
+- project:
+ name: org/project2
+ queue: integrated
+ gate:
+ jobs:
+ - common-job
+ - project2-job
diff --git a/tests/fixtures/layouts/job-dedup-semaphore-first.yaml b/tests/fixtures/layouts/job-dedup-semaphore-first.yaml
new file mode 100644
index 000000000..fe2dcce06
--- /dev/null
+++ b/tests/fixtures/layouts/job-dedup-semaphore-first.yaml
@@ -0,0 +1,71 @@
+- queue:
+ name: integrated
+ allow-circular-dependencies: true
+
+- semaphore:
+ name: test-semaphore
+
+- pipeline:
+ name: gate
+ manager: dependent
+ success-message: Build succeeded (gate).
+ require:
+ gerrit:
+ approval:
+ - Approved: 1
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - Approved: 1
+ success:
+ gerrit:
+ Verified: 2
+ submit: true
+ failure:
+ gerrit:
+ Verified: -2
+ start:
+ gerrit:
+ Verified: 0
+ precedence: high
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/run.yaml
+ nodeset:
+ nodes:
+ - label: debian
+ name: controller
+
+- job:
+ name: common-job
+ semaphore:
+ name: test-semaphore
+ resources-first: true
+ required-projects:
+ - org/project1
+ - org/project2
+
+- job:
+ name: project1-job
+
+- job:
+ name: project2-job
+
+- project:
+ name: org/project1
+ queue: integrated
+ gate:
+ jobs:
+ - common-job
+ - project1-job
+
+- project:
+ name: org/project2
+ queue: integrated
+ gate:
+ jobs:
+ - common-job
+ - project2-job
diff --git a/tests/fixtures/layouts/job-dedup-semaphore.yaml b/tests/fixtures/layouts/job-dedup-semaphore.yaml
new file mode 100644
index 000000000..5d793a21f
--- /dev/null
+++ b/tests/fixtures/layouts/job-dedup-semaphore.yaml
@@ -0,0 +1,70 @@
+- queue:
+ name: integrated
+ allow-circular-dependencies: true
+
+- semaphore:
+ name: test-semaphore
+
+- pipeline:
+ name: gate
+ manager: dependent
+ success-message: Build succeeded (gate).
+ require:
+ gerrit:
+ approval:
+ - Approved: 1
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - Approved: 1
+ success:
+ gerrit:
+ Verified: 2
+ submit: true
+ failure:
+ gerrit:
+ Verified: -2
+ start:
+ gerrit:
+ Verified: 0
+ precedence: high
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/run.yaml
+ nodeset:
+ nodes:
+ - label: debian
+ name: controller
+
+- job:
+ name: common-job
+ semaphore:
+ name: test-semaphore
+ required-projects:
+ - org/project1
+ - org/project2
+
+- job:
+ name: project1-job
+
+- job:
+ name: project2-job
+
+- project:
+ name: org/project1
+ queue: integrated
+ gate:
+ jobs:
+ - common-job
+ - project1-job
+
+- project:
+ name: org/project2
+ queue: integrated
+ gate:
+ jobs:
+ - common-job
+ - project2-job
diff --git a/tests/fixtures/layouts/job-dedup-true.yaml b/tests/fixtures/layouts/job-dedup-true.yaml
new file mode 100644
index 000000000..559ea5a15
--- /dev/null
+++ b/tests/fixtures/layouts/job-dedup-true.yaml
@@ -0,0 +1,63 @@
+- queue:
+ name: integrated
+ allow-circular-dependencies: true
+
+- pipeline:
+ name: gate
+ manager: dependent
+ success-message: Build succeeded (gate).
+ require:
+ gerrit:
+ approval:
+ - Approved: 1
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - Approved: 1
+ success:
+ gerrit:
+ Verified: 2
+ submit: true
+ failure:
+ gerrit:
+ Verified: -2
+ start:
+ gerrit:
+ Verified: 0
+ precedence: high
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/run.yaml
+ nodeset:
+ nodes:
+ - label: debian
+ name: controller
+
+- job:
+ name: common-job
+ deduplicate: true
+
+- job:
+ name: project1-job
+
+- job:
+ name: project2-job
+
+- project:
+ name: org/project1
+ queue: integrated
+ gate:
+ jobs:
+ - common-job
+ - project1-job
+
+- project:
+ name: org/project2
+ queue: integrated
+ gate:
+ jobs:
+ - common-job
+ - project2-job
diff --git a/tests/fixtures/layouts/merge-failure.yaml b/tests/fixtures/layouts/merge-failure.yaml
index 3828a06eb..2efcdced3 100644
--- a/tests/fixtures/layouts/merge-failure.yaml
+++ b/tests/fixtures/layouts/merge-failure.yaml
@@ -23,7 +23,7 @@
name: gate
manager: dependent
failure-message: Build failed. For information on how to proceed, see http://wiki.example.org/Test_Failures
- merge-failure-message: The merge failed! For more information...
+ merge-conflict-message: The merge failed! For more information...
trigger:
gerrit:
- event: comment-added
@@ -36,7 +36,7 @@
failure:
gerrit:
Verified: -2
- merge-failure:
+ merge-conflict:
gerrit:
Verified: -1
smtp:
diff --git a/tests/fixtures/layouts/merging-gitlab-squash-merge.yaml b/tests/fixtures/layouts/merging-gitlab-squash-merge.yaml
new file mode 100644
index 000000000..bfc8de36b
--- /dev/null
+++ b/tests/fixtures/layouts/merging-gitlab-squash-merge.yaml
@@ -0,0 +1,28 @@
+- pipeline:
+ name: gate-merge
+ manager: dependent
+ trigger:
+ gitlab:
+ - event: gl_merge_request
+ action:
+ - opened
+ - changed
+ success:
+ gitlab:
+ merge: true
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/base.yaml
+
+- job:
+ name: project-test
+ run: playbooks/project-test.yaml
+
+- project:
+ name: org/project1
+ merge-mode: squash-merge
+ gate-merge:
+ jobs:
+ - project-test
diff --git a/tests/fixtures/layouts/no-jobs-reporting.yaml b/tests/fixtures/layouts/no-jobs-reporting.yaml
new file mode 100644
index 000000000..6d48dca63
--- /dev/null
+++ b/tests/fixtures/layouts/no-jobs-reporting.yaml
@@ -0,0 +1,44 @@
+- pipeline:
+ name: check
+ manager: independent
+ trigger:
+ gerrit:
+ - event: patchset-created
+ success:
+ gerrit:
+ Verified: 1
+ failure:
+ gerrit:
+ Verified: -1
+ start:
+ gerrit:
+ Verified: 0
+
+- pipeline:
+ name: gate
+ manager: dependent
+ success-message: Build succeeded (gate).
+ supercedes: check
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - Approved: 1
+ success:
+ gerrit:
+ Verified: 2
+ submit: true
+ failure:
+ gerrit:
+ Verified: -2
+ start:
+ gerrit:
+ Verified: 0
+ precedence: high
+
+- project:
+ name: org/project
+ check:
+ jobs: []
+ gate:
+ jobs: []
diff --git a/tests/fixtures/layouts/nodeset-alternatives.yaml b/tests/fixtures/layouts/nodeset-alternatives.yaml
new file mode 100644
index 000000000..21f9f11ae
--- /dev/null
+++ b/tests/fixtures/layouts/nodeset-alternatives.yaml
@@ -0,0 +1,14 @@
+- nodeset:
+ name: fast-nodeset
+ nodes:
+ - name: controller
+ label: fast-label
+
+- job:
+ name: test-job
+ nodeset:
+ alternatives:
+ - fast-nodeset
+ - nodes:
+ - name: controller
+ label: slow-label
diff --git a/tests/fixtures/layouts/nodeset-fallback.yaml b/tests/fixtures/layouts/nodeset-fallback.yaml
new file mode 100644
index 000000000..01869537e
--- /dev/null
+++ b/tests/fixtures/layouts/nodeset-fallback.yaml
@@ -0,0 +1,66 @@
+- pipeline:
+ name: check
+ manager: independent
+ trigger:
+ gerrit:
+ - event: patchset-created
+ success:
+ gerrit:
+ Verified: 1
+ failure:
+ gerrit:
+ Verified: -1
+
+- nodeset:
+ name: fast-nodeset
+ nodes:
+ - label: fast-label
+ name: controller
+
+- nodeset:
+ name: red-nodeset
+ nodes:
+ - label: red-label
+ name: controller
+
+- nodeset:
+ name: blue-nodeset
+ nodes:
+ - label: blue-label
+ name: controller
+
+# This adds an unused second level of alternatives to verify we are
+# able to flatten it.
+- nodeset:
+ name: red-or-blue-nodeset
+ alternatives:
+ - red-nodeset
+ - blue-nodeset
+
+# Test alternatives by name or anonymous nodeset
+- nodeset:
+ name: fast-or-slow
+ alternatives:
+ - fast-nodeset
+ - nodes:
+ label: slow-label
+ name: controller
+ - red-or-blue-nodeset
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/base.yaml
+
+- job:
+ name: check-job
+ nodeset: fast-or-slow
+
+- project:
+ name: org/project
+ check:
+ jobs:
+ - check-job
+ gate:
+ jobs:
+ - check-job
diff --git a/tests/fixtures/layouts/not-skip-when-reenqueue.yaml b/tests/fixtures/layouts/not-skip-when-reenqueue.yaml
new file mode 100644
index 000000000..024759991
--- /dev/null
+++ b/tests/fixtures/layouts/not-skip-when-reenqueue.yaml
@@ -0,0 +1,47 @@
+- pipeline:
+ name: check
+ manager: independent
+ trigger:
+ gerrit:
+ - event: patchset-created
+ success:
+ gerrit:
+ Verified: 1
+ failure:
+ gerrit:
+ Verified: -1
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/base.yaml
+
+- job:
+ name: grand-parent
+
+- job:
+ name: parent1
+
+- job:
+ name: parent2
+
+- job:
+ name: child
+
+- project:
+ name: org/project
+ check:
+ jobs:
+ - grand-parent
+ - parent1:
+ dependencies:
+ - grand-parent
+ - parent2:
+ dependencies:
+ - grand-parent
+ - child:
+ dependencies:
+ - name: parent1
+ soft: true
+ - name: parent2
+ soft: true
diff --git a/tests/fixtures/layouts/provides-requires-two-jobs.yaml b/tests/fixtures/layouts/provides-requires-two-jobs.yaml
index 9d1008752..7568c31d8 100644
--- a/tests/fixtures/layouts/provides-requires-two-jobs.yaml
+++ b/tests/fixtures/layouts/provides-requires-two-jobs.yaml
@@ -51,11 +51,11 @@
- project:
name: org/project1
+ queue: integrated
check:
jobs:
- image-builder
gate:
- queue: integrated
jobs:
- image-builder
- image-user:
@@ -63,10 +63,10 @@
- project:
name: org/project2
+ queue: integrated
check:
jobs:
- image-user
gate:
- queue: integrated
jobs:
- image-user
diff --git a/tests/fixtures/layouts/provides-requires.yaml b/tests/fixtures/layouts/provides-requires.yaml
index 17b17bab1..aeb959bfd 100644
--- a/tests/fixtures/layouts/provides-requires.yaml
+++ b/tests/fixtures/layouts/provides-requires.yaml
@@ -72,18 +72,19 @@
- project:
name: org/project1
+ queue: integrated
check:
jobs:
- image-builder
- library-builder
- hold
gate:
- queue: integrated
jobs:
- image-builder
- project:
name: org/project2
+ queue: integrated
check:
jobs:
- image-user
@@ -91,7 +92,6 @@
- library-user2
- hold
gate:
- queue: integrated
jobs:
- image-user
diff --git a/tests/fixtures/layouts/regex-queue.yaml b/tests/fixtures/layouts/regex-queue.yaml
index 0bacbec0e..5650e2611 100644
--- a/tests/fixtures/layouts/regex-queue.yaml
+++ b/tests/fixtures/layouts/regex-queue.yaml
@@ -10,8 +10,8 @@
- project:
name: ^.*$
+ queue: integrated
gate:
- queue: integrated
jobs:
- base
diff --git a/tests/fixtures/layouts/regex-template-queue.yaml b/tests/fixtures/layouts/regex-template-queue.yaml
index f809e0e43..38eb596ea 100644
--- a/tests/fixtures/layouts/regex-template-queue.yaml
+++ b/tests/fixtures/layouts/regex-template-queue.yaml
@@ -10,8 +10,8 @@
- project-template:
name: integrated-jobs
+ queue: integrated
gate:
- queue: integrated
jobs:
- base
diff --git a/tests/fixtures/layouts/repo-checkout-four-project.yaml b/tests/fixtures/layouts/repo-checkout-four-project.yaml
index 11212e85f..433e6f584 100644
--- a/tests/fixtures/layouts/repo-checkout-four-project.yaml
+++ b/tests/fixtures/layouts/repo-checkout-four-project.yaml
@@ -48,40 +48,40 @@
- project:
name: org/project1
+ queue: integrated
check:
jobs:
- integration
gate:
- queue: integrated
jobs:
- integration
- project:
name: org/project2
+ queue: integrated
check:
jobs:
- integration
gate:
- queue: integrated
jobs:
- integration
- project:
name: org/project3
+ queue: integrated
check:
jobs:
- integration
gate:
- queue: integrated
jobs:
- integration
- project:
name: org/project4
+ queue: integrated
check:
jobs:
- integration
gate:
- queue: integrated
jobs:
- integration
diff --git a/tests/fixtures/layouts/repo-checkout-six-project.yaml b/tests/fixtures/layouts/repo-checkout-six-project.yaml
index 48786654b..92f2f0a20 100644
--- a/tests/fixtures/layouts/repo-checkout-six-project.yaml
+++ b/tests/fixtures/layouts/repo-checkout-six-project.yaml
@@ -51,60 +51,60 @@
- project:
name: org/project1
+ queue: integrated
check:
jobs:
- integration
gate:
- queue: integrated
jobs:
- integration
- project:
name: org/project2
+ queue: integrated
check:
jobs:
- integration
gate:
- queue: integrated
jobs:
- integration
- project:
name: org/project3
+ queue: integrated
check:
jobs:
- integration
gate:
- queue: integrated
jobs:
- integration
- project:
name: org/project4
+ queue: integrated
check:
jobs:
- integration
gate:
- queue: integrated
jobs:
- integration
- project:
name: org/project5
+ queue: integrated
check:
jobs:
- integration
gate:
- queue: integrated
jobs:
- integration
- project:
name: org/project6
+ queue: integrated
check:
jobs:
- integration
gate:
- queue: integrated
jobs:
- integration
diff --git a/tests/fixtures/layouts/repo-checkout-two-project.yaml b/tests/fixtures/layouts/repo-checkout-two-project.yaml
index 64c6ee943..6cf66a994 100644
--- a/tests/fixtures/layouts/repo-checkout-two-project.yaml
+++ b/tests/fixtures/layouts/repo-checkout-two-project.yaml
@@ -46,20 +46,20 @@
- project:
name: org/project1
+ queue: integrated
check:
jobs:
- integration
gate:
- queue: integrated
jobs:
- integration
- project:
name: org/project2
+ queue: integrated
check:
jobs:
- integration
gate:
- queue: integrated
jobs:
- integration
diff --git a/tests/fixtures/layouts/serial.yaml b/tests/fixtures/layouts/serial.yaml
index 5a744ce82..70d16bd1a 100644
--- a/tests/fixtures/layouts/serial.yaml
+++ b/tests/fixtures/layouts/serial.yaml
@@ -35,14 +35,14 @@
- project:
name: org/project1
+ queue: shared
deploy:
- queue: shared
jobs:
- job1
- project:
name: org/project2
+ queue: shared
deploy:
- queue: shared
jobs:
- job1
diff --git a/tests/fixtures/layouts/sos-circular.yaml b/tests/fixtures/layouts/sos-circular.yaml
index 77667a478..79f8e8d7a 100644
--- a/tests/fixtures/layouts/sos-circular.yaml
+++ b/tests/fixtures/layouts/sos-circular.yaml
@@ -45,6 +45,7 @@
name: base
parent: null
run: playbooks/base.yaml
+ deduplicate: false
nodeset:
nodes:
- label: ubuntu-xenial
diff --git a/tests/fixtures/layouts/special-characters-job.yaml b/tests/fixtures/layouts/special-characters-job.yaml
new file mode 100644
index 000000000..20308c6d6
--- /dev/null
+++ b/tests/fixtures/layouts/special-characters-job.yaml
@@ -0,0 +1,2 @@
+- job:
+ name: "a@b/c"
diff --git a/tests/fixtures/layouts/submitted-together-per-branch.yaml b/tests/fixtures/layouts/submitted-together-per-branch.yaml
new file mode 100644
index 000000000..73898ac99
--- /dev/null
+++ b/tests/fixtures/layouts/submitted-together-per-branch.yaml
@@ -0,0 +1,70 @@
+- queue:
+ name: integrated
+ allow-circular-dependencies: true
+ per-branch: true
+
+- pipeline:
+ name: check
+ manager: independent
+ trigger:
+ gerrit:
+ - event: patchset-created
+ success:
+ gerrit:
+ Verified: 1
+ failure:
+ gerrit:
+ Verified: -1
+
+- pipeline:
+ name: gate
+ manager: dependent
+ success-message: Build succeeded (gate).
+ require:
+ gerrit:
+ approval:
+ - Approved: 1
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - Approved: 1
+ success:
+ gerrit:
+ Verified: 2
+ submit: true
+ failure:
+ gerrit:
+ Verified: -2
+ start:
+ gerrit:
+ Verified: 0
+ precedence: high
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/run.yaml
+
+- job:
+ name: test-job
+
+- project:
+ name: org/project1
+ queue: integrated
+ check:
+ jobs:
+ - test-job
+ gate:
+ jobs:
+ - test-job
+
+- project:
+ name: org/project2
+ queue: integrated
+ check:
+ jobs:
+ - test-job
+ gate:
+ jobs:
+ - test-job
diff --git a/tests/fixtures/layouts/template-queue.yaml b/tests/fixtures/layouts/template-queue.yaml
index 407956feb..bc841e38b 100644
--- a/tests/fixtures/layouts/template-queue.yaml
+++ b/tests/fixtures/layouts/template-queue.yaml
@@ -10,8 +10,8 @@
- project-template:
name: integrated-jobs
+ queue: integrated
gate:
- queue: integrated
jobs:
- base
diff --git a/tests/fixtures/layouts/three-projects.yaml b/tests/fixtures/layouts/three-projects.yaml
index 33e81aca5..2db072eda 100644
--- a/tests/fixtures/layouts/three-projects.yaml
+++ b/tests/fixtures/layouts/three-projects.yaml
@@ -56,6 +56,7 @@
- project:
name: org/project1
+ queue: integrated
check:
jobs:
- project-merge
@@ -66,7 +67,6 @@
- project1-project2-integration:
dependencies: project-merge
gate:
- queue: integrated
jobs:
- project-merge
- project-test1:
@@ -78,6 +78,7 @@
- project:
name: org/project2
+ queue: integrated
check:
jobs:
- project-merge
@@ -88,7 +89,6 @@
- project1-project2-integration:
dependencies: project-merge
gate:
- queue: integrated
jobs:
- project-merge
- project-test1:
@@ -100,6 +100,7 @@
- project:
name: org/project3
+ queue: integrated
check:
jobs:
- project-merge
@@ -110,7 +111,6 @@
- project1-project2-integration:
dependencies: project-merge
gate:
- queue: integrated
jobs:
- project-merge
- project-test1:
diff --git a/tests/fixtures/layouts/timer-freeze-job-failure.yaml b/tests/fixtures/layouts/timer-freeze-job-failure.yaml
new file mode 100644
index 000000000..2e6d709bb
--- /dev/null
+++ b/tests/fixtures/layouts/timer-freeze-job-failure.yaml
@@ -0,0 +1,26 @@
+- pipeline:
+ name: periodic
+ manager: independent
+ trigger:
+ timer:
+ - time: '* * * * * */1'
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/base.yaml
+
+- job:
+ name: project-test1
+ run: playbooks/project-test1.yaml
+
+- job:
+ name: project-test2
+ run: playbooks/project-test2.yaml
+
+- project:
+ name: org/project
+ periodic:
+ jobs:
+ - project-test2:
+ dependencies: project-test1
diff --git a/tests/fixtures/layouts/trigger-sequence.yaml b/tests/fixtures/layouts/trigger-sequence.yaml
new file mode 100644
index 000000000..31db734b1
--- /dev/null
+++ b/tests/fixtures/layouts/trigger-sequence.yaml
@@ -0,0 +1,75 @@
+- pipeline:
+ name: check
+ manager: independent
+ trigger:
+ gerrit:
+ - event: patchset-created
+ success:
+ gerrit:
+ Verified: 1
+ failure:
+ gerrit:
+ Verified: -1
+
+- pipeline:
+ name: gate
+ manager: dependent
+ success-message: Build succeeded (gate).
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - Approved: 1
+ success:
+ gerrit:
+ Verified: 2
+ submit: true
+ failure:
+ gerrit:
+ Verified: -2
+ start:
+ gerrit:
+ Verified: 0
+ precedence: high
+
+- pipeline:
+ name: post
+ manager: independent
+ trigger:
+ gerrit:
+ - event: ref-updated
+ ref: ^(?!refs/).*$
+
+- pipeline:
+ name: tag
+ manager: independent
+ trigger:
+ gerrit:
+ - event: ref-updated
+ ref: ^refs/tags/.*$
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/base.yaml
+ nodeset:
+ nodes:
+ - label: ubuntu-xenial
+ name: controller
+
+- job:
+ name: check-job
+ run: playbooks/check.yaml
+
+- job:
+ name: post-job
+ run: playbooks/post.yaml
+
+- project:
+ name: org/project
+ check:
+ jobs:
+ - check-job
+ gate:
+ jobs:
+ - check-job
diff --git a/tests/fixtures/layouts/two-projects-integrated.yaml b/tests/fixtures/layouts/two-projects-integrated.yaml
index 45c726e4f..7e3a07a00 100644
--- a/tests/fixtures/layouts/two-projects-integrated.yaml
+++ b/tests/fixtures/layouts/two-projects-integrated.yaml
@@ -58,24 +58,31 @@
jobs:
- test
-- project:
- name: org/project1
+# Define jobs for org/project1 in a template to test that the queue name is
+# picked up correctly from the project config. This should also be the case
+# when the project doesn't include any pipeline config and only references a
+# template.
+- project-template:
+ name: project1-template
check:
- queue: integrated
jobs:
- integration
gate:
- queue: integrated
jobs:
- integration
- project:
+ name: org/project1
+ queue: integrated
+ templates:
+ - project1-template
+
+- project:
name: org/project2
+ queue: integrated
check:
- queue: integrated
jobs:
- integration
gate:
- queue: integrated
jobs:
- integration
diff --git a/tests/fixtures/zuul-default-ansible-version.conf b/tests/fixtures/zuul-default-ansible-version.conf
index 6ec8e38df..000f27723 100644
--- a/tests/fixtures/zuul-default-ansible-version.conf
+++ b/tests/fixtures/zuul-default-ansible-version.conf
@@ -6,7 +6,8 @@ server=127.0.0.1
[scheduler]
tenant_config=main.yaml
relative_priority=true
-default_ansible_version=2.8
+# Used by ansible-default-zuul-conf job
+default_ansible_version=6
[merger]
git_dir=/tmp/zuul-test/merger-git
diff --git a/tests/fixtures/zuul-gerrit-github.conf b/tests/fixtures/zuul-gerrit-github.conf
index 1b2813dd4..0d03bacc2 100644
--- a/tests/fixtures/zuul-gerrit-github.conf
+++ b/tests/fixtures/zuul-gerrit-github.conf
@@ -20,6 +20,7 @@ driver=gerrit
server=review.example.com
user=jenkins
sshkey=fake_id_rsa_path
+password=badpassword
[connection github]
driver=github
diff --git a/tests/fixtures/zuul-gerrit-ssh.conf b/tests/fixtures/zuul-gerrit-ssh.conf
new file mode 100644
index 000000000..2f414032c
--- /dev/null
+++ b/tests/fixtures/zuul-gerrit-ssh.conf
@@ -0,0 +1,38 @@
+[statsd]
+# note, use 127.0.0.1 rather than localhost to avoid getting ipv6
+# see: https://github.com/jsocol/pystatsd/issues/61
+server=127.0.0.1
+
+[scheduler]
+tenant_config=main.yaml
+
+[merger]
+git_dir=/tmp/zuul-test/merger-git
+git_user_email=zuul@example.com
+git_user_name=zuul
+
+[executor]
+git_dir=/tmp/zuul-test/executor-git
+load_multiplier=100
+
+[connection gerrit]
+driver=gerrit
+server=review.example.com
+ssh_server=ssh-review.example.com
+user=jenkins
+sshkey=fake_id_rsa_path
+password=badpassword
+
+[connection github]
+driver=github
+webhook_token=0000000000000000000000000000000000000000
+
+[connection smtp]
+driver=smtp
+server=localhost
+port=25
+default_from=zuul@example.com
+default_to=you@example.com
+
+[database]
+dburi=$MYSQL_FIXTURE_DBURI$
diff --git a/tests/fixtures/zuul-tracing.conf b/tests/fixtures/zuul-tracing.conf
new file mode 100644
index 000000000..e90922198
--- /dev/null
+++ b/tests/fixtures/zuul-tracing.conf
@@ -0,0 +1,42 @@
+[statsd]
+# note, use 127.0.0.1 rather than localhost to avoid getting ipv6
+# see: https://github.com/jsocol/pystatsd/issues/61
+server=127.0.0.1
+
+[scheduler]
+tenant_config=main.yaml
+relative_priority=true
+
+[merger]
+git_dir=/tmp/zuul-test/merger-git
+git_user_email=zuul@example.com
+git_user_name=zuul
+
+[executor]
+git_dir=/tmp/zuul-test/executor-git
+load_multiplier=100
+
+[connection gerrit]
+driver=gerrit
+server=review.example.com
+user=jenkins
+sshkey=fake_id_rsa_path
+
+[connection smtp]
+driver=smtp
+server=localhost
+port=25
+default_from=zuul@example.com
+default_to=you@example.com
+
+[database]
+dburi=$MYSQL_FIXTURE_DBURI$
+
+[web]
+static_cache_expiry=1200
+root=https://zuul.example.com/
+
+[tracing]
+enabled=true
+endpoint=http://localhost:port
+service_name=zuultest \ No newline at end of file
diff --git a/tests/otlp_fixture.py b/tests/otlp_fixture.py
new file mode 100644
index 000000000..633296fac
--- /dev/null
+++ b/tests/otlp_fixture.py
@@ -0,0 +1,58 @@
+# Copyright 2022 Acme Gating, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+from concurrent import futures
+
+import fixtures
+import grpc
+from opentelemetry import trace
+from opentelemetry.proto.collector.trace.v1.trace_service_pb2_grpc import (
+ TraceServiceServicer,
+ add_TraceServiceServicer_to_server
+)
+from opentelemetry.proto.collector.trace.v1.trace_service_pb2 import (
+ ExportTraceServiceResponse,
+)
+
+
+class TraceServer(TraceServiceServicer):
+ def __init__(self, fixture):
+ super().__init__()
+ self.fixture = fixture
+
+ def Export(self, request, context):
+ self.fixture.requests.append(request)
+ return ExportTraceServiceResponse()
+
+
+class OTLPFixture(fixtures.Fixture):
+ def __init__(self):
+ super().__init__()
+ self.requests = []
+ self.executor = futures.ThreadPoolExecutor(
+ thread_name_prefix='OTLPFixture',
+ max_workers=10)
+ self.server = grpc.server(self.executor)
+ add_TraceServiceServicer_to_server(TraceServer(self), self.server)
+ self.port = self.server.add_insecure_port('[::]:0')
+ # Reset global tracer provider
+ trace._TRACER_PROVIDER_SET_ONCE = trace.Once()
+ trace._TRACER_PROVIDER = None
+
+ def _setUp(self):
+ self.server.start()
+
+ def _cleanup(self):
+ self.server.stop()
+ self.server.wait_for_termination()
+ self.executor.shutdown()
diff --git a/tests/remote/test_remote_action_modules.py b/tests/remote/test_remote_action_modules.py
index a147a9e5d..923b877c2 100644
--- a/tests/remote/test_remote_action_modules.py
+++ b/tests/remote/test_remote_action_modules.py
@@ -15,20 +15,13 @@
import os
import textwrap
-from tests.base import AnsibleZuulTestCase, FIXTURE_DIR
-
-ERROR_ACCESS_OUTSIDE = "Accessing files from outside the working dir"
-ERROR_LOCAL_CODE = "Executing local code is prohibited"
-ERROR_SYNC_TO_OUTSIDE = "Syncing files to outside the working dir"
-ERROR_SYNC_FROM_OUTSIDE = "Syncing files from outside the working dir"
-ERROR_SYNC_RSH = "Using custom synchronize rsh is prohibited"
-ERROR_SCHEME_INVALID = "file urls are not allowed from localhost."
+from tests.base import AnsibleZuulTestCase
class FunctionalActionModulesMixIn:
tenant_config_file = 'config/remote-action-modules/main.yaml'
# This should be overriden in child classes.
- ansible_version = '2.9'
+ ansible_version = '5'
wait_timeout = 120
def _setUp(self):
@@ -37,11 +30,6 @@ class FunctionalActionModulesMixIn:
ansible_remote = os.environ.get('ZUUL_REMOTE_IPV4')
self.assertIsNotNone(ansible_remote)
- # inject some files as forbidden sources
- fixture_dir = os.path.join(FIXTURE_DIR, 'bwrap-mounts')
- self.executor_server.execution_wrapper.bwrap_command.extend(
- ['--ro-bind', fixture_dir, '/opt'])
-
def _run_job(self, job_name, result, expect_error=None):
# Keep the jobdir around so we can inspect contents if an
# assert fails. It will be cleaned up anyway as it is contained
@@ -86,24 +74,6 @@ class FunctionalActionModulesMixIn:
with open(path, 'r') as f:
self.assertIn(expect_error, f.read())
- def test_assemble_module(self):
- self._run_job('assemble-good', 'SUCCESS')
-
- # assemble-delegate does multiple tests with various delegates and
- # safe and non-safe paths. It asserts by itself within ansible so we
- # expect SUCCESS here.
- self._run_job('assemble-delegate', 'SUCCESS')
- self._run_job('assemble-localhost', 'SUCCESS')
-
- self._run_job('assemble-bad', 'FAILURE', ERROR_ACCESS_OUTSIDE)
- self._run_job('assemble-bad-symlink', 'FAILURE', ERROR_ACCESS_OUTSIDE)
- self._run_job('assemble-bad-dir-with-symlink', 'FAILURE',
- ERROR_ACCESS_OUTSIDE)
-
- def test_synchronize_rsh_fail(self):
- self._run_job('synchronize-rsh-bad', 'FAILURE', ERROR_SYNC_RSH)
- self._run_job('synchronize-rsh-env-bad', 'FAILURE', ERROR_SYNC_RSH)
-
def test_command_module(self):
self._run_job('command-good', 'SUCCESS')
@@ -113,132 +83,20 @@ class FunctionalActionModulesMixIn:
def test_zuul_return_module_delegate_to(self):
self._run_job('zuul_return-good-delegate', 'SUCCESS')
- def test_copy_module(self):
- self._run_job('copy-good', 'SUCCESS')
-
- # copy-delegate does multiple tests with various delegates and
- # safe and non-safe paths. It asserts by itself within ansible so we
- # expect SUCCESS here.
- self._run_job('copy-delegate', 'SUCCESS')
- self._run_job('copy-localhost', 'SUCCESS')
-
- self._run_job('copy-bad', 'FAILURE', ERROR_ACCESS_OUTSIDE)
- self._run_job('copy-bad-symlink', 'FAILURE', ERROR_ACCESS_OUTSIDE)
- self._run_job('copy-bad-dir-with-symlink', 'FAILURE',
- ERROR_ACCESS_OUTSIDE)
-
- def test_includevars_module(self):
- self._run_job('includevars-good', 'SUCCESS')
- self._run_job('includevars-good-dir', 'SUCCESS')
-
- self._run_job('includevars-bad', 'FAILURE', ERROR_ACCESS_OUTSIDE)
- self._run_job('includevars-bad-symlink', 'FAILURE',
- ERROR_ACCESS_OUTSIDE)
- self._run_job('includevars-bad-dir', 'FAILURE', ERROR_ACCESS_OUTSIDE)
- self._run_job('includevars-bad-dir-symlink', 'FAILURE',
- ERROR_ACCESS_OUTSIDE)
- self._run_job('includevars-bad-dir-with-symlink', 'FAILURE',
- ERROR_ACCESS_OUTSIDE)
- self._run_job('includevars-bad-dir-with-double-symlink', 'FAILURE',
- ERROR_ACCESS_OUTSIDE)
-
- def test_patch_module(self):
- self._run_job('patch-good', 'SUCCESS')
-
- # patch-delegate does multiple tests with various delegates and
- # safe and non-safe paths. It asserts by itself within ansible so we
- # expect SUCCESS here.
- self._run_job('patch-delegate', 'SUCCESS')
- self._run_job('patch-localhost', 'SUCCESS')
-
- self._run_job('patch-bad', 'FAILURE', ERROR_ACCESS_OUTSIDE)
- self._run_job('patch-bad-symlink', 'FAILURE', ERROR_ACCESS_OUTSIDE)
-
- def test_raw_module(self):
- self._run_job('raw-good', 'SUCCESS')
-
- # raw-delegate does multiple tests with various delegates. It
- # asserts by itself within ansible so we
- # expect SUCCESS here.
- self._run_job('raw-delegate', 'SUCCESS')
- self._run_job('raw-localhost', 'SUCCESS')
-
- def test_script_module(self):
- self._run_job('script-good', 'SUCCESS')
-
- # script-delegate does multiple tests with various delegates. It
- # asserts by itself within ansible so we
- # expect SUCCESS here.
- self._run_job('script-delegate', 'SUCCESS')
- self._run_job('script-localhost', 'SUCCESS')
-
- self._run_job('script-bad', 'FAILURE', ERROR_ACCESS_OUTSIDE)
- self._run_job('script-bad-symlink', 'FAILURE', ERROR_ACCESS_OUTSIDE)
-
def test_shell_module(self):
self._run_job('shell-good', 'SUCCESS')
- self._run_job('shell-localhost', 'FAILURE', ERROR_LOCAL_CODE)
- self._run_job('shell-delegate', 'FAILURE', ERROR_LOCAL_CODE)
-
- def test_synchronize_module(self):
- self._run_job('synchronize-good', 'SUCCESS')
- self._run_job('synchronize-bad-pull', 'FAILURE', ERROR_SYNC_TO_OUTSIDE)
- self._run_job(
- 'synchronize-bad-push', 'FAILURE', ERROR_SYNC_FROM_OUTSIDE)
- self._run_job('synchronize-delegate-good', 'SUCCESS')
-
- def test_template_module(self):
- self._run_job('template-good', 'SUCCESS')
-
- # template-delegate does multiple tests with various delegates and
- # safe and non-safe paths. It asserts by itself within ansible so we
- # expect SUCCESS here.
- self._run_job('template-delegate', 'SUCCESS')
- self._run_job('template-localhost', 'SUCCESS')
-
- self._run_job('template-bad', 'FAILURE', ERROR_ACCESS_OUTSIDE)
- self._run_job('template-bad-symlink', 'FAILURE', ERROR_ACCESS_OUTSIDE)
-
- def test_unarchive_module(self):
- self._run_job('unarchive-good', 'SUCCESS')
-
- # template-delegate does multiple tests with various delegates and
- # safe and non-safe paths. It asserts by itself within ansible so we
- # expect SUCCESS here.
- self._run_job('unarchive-delegate', 'SUCCESS')
- self._run_job('unarchive-localhost', 'SUCCESS')
-
- self._run_job('unarchive-bad', 'FAILURE', ERROR_ACCESS_OUTSIDE)
- self._run_job('unarchive-bad-symlink', 'FAILURE', ERROR_ACCESS_OUTSIDE)
-
- def test_known_hosts_module(self):
- self._run_job('known-hosts-good', 'SUCCESS')
-
- # known-hosts-delegate does multiple tests with various delegates and
- # safe and non-safe paths. It asserts by itself within ansible so we
- # expect SUCCESS here.
- self._run_job('known-hosts-delegate', 'SUCCESS')
- self._run_job('known-hosts-localhost', 'SUCCESS')
-
- self._run_job('known-hosts-bad', 'FAILURE', ERROR_ACCESS_OUTSIDE)
-
- def test_uri_module(self):
- self._run_job('uri-good', 'SUCCESS')
- self._run_job('uri-bad-src', 'FAILURE', ERROR_ACCESS_OUTSIDE)
- self._run_job('uri-bad-dest', 'FAILURE', ERROR_ACCESS_OUTSIDE)
- self._run_job('uri-bad-url', 'FAILURE', ERROR_SCHEME_INVALID)
-class TestActionModules28(AnsibleZuulTestCase, FunctionalActionModulesMixIn):
- ansible_version = '2.8'
+class TestActionModules5(AnsibleZuulTestCase, FunctionalActionModulesMixIn):
+ ansible_version = '5'
def setUp(self):
super().setUp()
self._setUp()
-class TestActionModules29(AnsibleZuulTestCase, FunctionalActionModulesMixIn):
- ansible_version = '2.9'
+class TestActionModules6(AnsibleZuulTestCase, FunctionalActionModulesMixIn):
+ ansible_version = '6'
def setUp(self):
super().setUp()
diff --git a/tests/remote/test_remote_zuul_json.py b/tests/remote/test_remote_zuul_json.py
index 36db277d8..4451c3630 100644
--- a/tests/remote/test_remote_zuul_json.py
+++ b/tests/remote/test_remote_zuul_json.py
@@ -144,16 +144,16 @@ class FunctionalZuulJSONMixIn:
dateutil.parser.parse(play_end_time)
-class TestZuulJSON28(AnsibleZuulTestCase, FunctionalZuulJSONMixIn):
- ansible_version = '2.8'
+class TestZuulJSON5(AnsibleZuulTestCase, FunctionalZuulJSONMixIn):
+ ansible_version = '5'
def setUp(self):
super().setUp()
self._setUp()
-class TestZuulJSON29(AnsibleZuulTestCase, FunctionalZuulJSONMixIn):
- ansible_version = '2.9'
+class TestZuulJSON6(AnsibleZuulTestCase, FunctionalZuulJSONMixIn):
+ ansible_version = '6'
def setUp(self):
super().setUp()
diff --git a/tests/remote/test_remote_zuul_stream.py b/tests/remote/test_remote_zuul_stream.py
index aed500769..7a7fef08d 100644
--- a/tests/remote/test_remote_zuul_stream.py
+++ b/tests/remote/test_remote_zuul_stream.py
@@ -12,9 +12,12 @@
# License for the specific language governing permissions and limitations
# under the License.
+import io
+import logging
import os
import re
import textwrap
+from datetime import datetime, timedelta
from tests.base import AnsibleZuulTestCase
@@ -22,12 +25,20 @@ from tests.base import AnsibleZuulTestCase
class FunctionalZuulStreamMixIn:
tenant_config_file = 'config/remote-zuul-stream/main.yaml'
# This should be overriden in child classes.
- ansible_version = '2.9'
- wait_timeout = 120
+ ansible_version = '5'
def _setUp(self):
- self.log_console_port = 19000 + int(self.ansible_version.split('.')[1])
+ self.log_console_port = 19000 + int(
+ self.ansible_core_version.split('.')[1])
+ self.executor_server.log_console_port = self.log_console_port
+ self.wait_timeout = 180
self.fake_nodepool.remote_ansible = True
+ # This catches the Ansible output; rather than the callback
+ # output captured in the job log. For example if the callback
+ # fails, there will be an error output in this stream.
+ self.logger = logging.getLogger('zuul.AnsibleJob')
+ self.console_output = io.StringIO()
+ self.logger.addHandler(logging.StreamHandler(self.console_output))
ansible_remote = os.environ.get('ZUUL_REMOTE_IPV4')
self.assertIsNotNone(ansible_remote)
@@ -89,13 +100,33 @@ class FunctionalZuulStreamMixIn:
with open(path) as f:
return f.read()
+ def _assertLogLine(self, line, log, full_match=True):
+ pattern = (r'^\d\d\d\d-\d\d-\d\d \d\d:\d\d\:\d\d\.\d\d\d\d\d\d \| %s%s'
+ % (line, '$' if full_match else ''))
+ log_re = re.compile(pattern, re.MULTILINE)
+ m = log_re.search(log)
+ if m is None:
+ raise Exception("'%s' not found in log" % (line,))
+
+ def assertLogLineStartsWith(self, line, log):
+ self._assertLogLine(line, log, full_match=False)
+
def assertLogLine(self, line, log):
- pattern = (r'^\d\d\d\d-\d\d-\d\d \d\d:\d\d\:\d\d\.\d\d\d\d\d\d \| %s$'
+ self._assertLogLine(line, log, full_match=True)
+
+ def _getLogTime(self, line, log):
+ pattern = (r'^(\d\d\d\d-\d\d-\d\d \d\d:\d\d\:\d\d\.\d\d\d\d\d\d)'
+ r' \| %s\n'
+ r'(\d\d\d\d-\d\d-\d\d \d\d:\d\d\:\d\d\.\d\d\d\d\d\d)'
% line)
log_re = re.compile(pattern, re.MULTILINE)
m = log_re.search(log)
if m is None:
raise Exception("'%s' not found in log" % (line,))
+ else:
+ date1 = datetime.strptime(m.group(1), "%Y-%m-%d %H:%M:%S.%f")
+ date2 = datetime.strptime(m.group(2), "%Y-%m-%d %H:%M:%S.%f")
+ return (date1, date2)
def test_command(self):
job = self._run_job('command')
@@ -103,13 +134,27 @@ class FunctionalZuulStreamMixIn:
build = self.history[-1]
self.assertEqual(build.result, 'SUCCESS')
+ console_output = self.console_output.getvalue()
+ # This should be generic enough to match any callback
+ # plugin failures, which look something like
+ #
+ # [WARNING]: Failure using method (v2_runner_on_ok) in \
+ # callback plugin
+ # (<ansible.plugins.callback.zuul_stream.CallbackModule object at'
+ # 0x7f89f72a20b0>): 'dict' object has no attribute 'startswith'"
+ # Callback Exception:
+ # ...
+ #
+ self.assertNotIn('[WARNING]: Failure using method', console_output)
+
text = self._get_job_output(build)
+
self.assertLogLine(
r'RUN START: \[untrusted : review.example.com/org/project/'
r'playbooks/command.yaml@master\]', text)
self.assertLogLine(r'PLAY \[all\]', text)
self.assertLogLine(
- r'Ansible version={}'.format(self.ansible_version), text)
+ r'Ansible version={}'.format(self.ansible_core_version), text)
self.assertLogLine(r'TASK \[Show contents of first file\]', text)
self.assertLogLine(r'controller \| command test one', text)
self.assertLogLine(
@@ -149,35 +194,37 @@ class FunctionalZuulStreamMixIn:
self.assertLogLine(r'compute1 \| failed_in_loop2', text)
self.assertLogLine(r'compute1 \| ok: Item: failed_in_loop2 '
r'Result: 1', text)
- self.assertLogLine(r'compute1 \| .*No such file or directory: .*'
- r'\'/remote-shelltask/somewhere/'
- r'that/does/not/exist\'', text)
- self.assertLogLine(r'controller \| .*No such file or directory: .*'
- r'\'/remote-shelltask/somewhere/'
- r'that/does/not/exist\'', text)
+ self.assertLogLine(r'compute1 \| transitive-one', text)
+ self.assertLogLine(r'compute1 \| transitive-two', text)
+ self.assertLogLine(r'compute1 \| transitive-three', text)
+ self.assertLogLine(r'compute1 \| transitive-four', text)
self.assertLogLine(
r'controller \| ok: Runtime: \d:\d\d:\d\d\.\d\d\d\d\d\d', text)
self.assertLogLine('PLAY RECAP', text)
- # NOTE(pabelanger): Ansible 2.8 added new stats
- # skipped, rescued, ignored.
self.assertLogLine(
r'controller \| ok: \d+ changed: \d+ unreachable: 0 failed: 0 '
'skipped: 0 rescued: 1 ignored: 0', text)
self.assertLogLine(
r'RUN END RESULT_NORMAL: \[untrusted : review.example.com/'
r'org/project/playbooks/command.yaml@master]', text)
+ time1, time2 = self._getLogTime(r'TASK \[Command Not Found\]',
+ text)
+ self.assertLess((time2 - time1) / timedelta(milliseconds=1),
+ 9000)
- # Run a pre-defined job that is defined in a trusted repo to test
- # localhost tasks.
- job = self._run_job('command-localhost', create=False)
- with self.jobLog(job):
- build = self.history[-1]
- self.assertEqual(build.result, 'SUCCESS')
+ # This is from the debug: msg='{{ ansible_version }}'
+ # testing raw variable output. To make it version
+ # agnostic, match just the start of
+ # compute1 | ok: {'string': '2.9.27'...
- text = self._get_job_output(build)
- self.assertLogLine(r'localhost \| .*No such file or directory: .*'
- r'\'/local-shelltask/somewhere/'
- r'that/does/not/exist\'', text)
+ # NOTE(ianw) 2022-08-24 : I don't know why the callback
+ # for debug: msg= doesn't put the hostname first like
+ # other output. Undetermined if bug or feature.
+ self.assertLogLineStartsWith(
+ r"""\{'string': '\d.""", text)
+ # ... handling loops is a different path, and that does
+ self.assertLogLineStartsWith(
+ r"""compute1 \| ok: \{'string': '\d.""", text)
def test_module_exception(self):
job = self._run_job('module_failure_exception')
@@ -201,27 +248,23 @@ class FunctionalZuulStreamMixIn:
text = self._get_job_output(build)
self.assertLogLine(r'TASK \[Module failure\]', text)
- if self.ansible_version in ('2.5', '2.6'):
- regex = r'controller \| MODULE FAILURE: This module is broken'
- else:
- # Ansible starting with 2.7 emits a different error message
- # if a module exits without an exception or the ansible
- # supplied methods.
- regex = r'controller \| "msg": "New-style module did not ' \
- r'handle its own exit"'
+ regex = r'controller \| "msg": "New-style module did not ' \
+ r'handle its own exit"'
self.assertLogLine(regex, text)
-class TestZuulStream28(AnsibleZuulTestCase, FunctionalZuulStreamMixIn):
- ansible_version = '2.8'
+class TestZuulStream5(AnsibleZuulTestCase, FunctionalZuulStreamMixIn):
+ ansible_version = '5'
+ ansible_core_version = '2.12'
def setUp(self):
super().setUp()
self._setUp()
-class TestZuulStream29(AnsibleZuulTestCase, FunctionalZuulStreamMixIn):
- ansible_version = '2.9'
+class TestZuulStream6(AnsibleZuulTestCase, FunctionalZuulStreamMixIn):
+ ansible_version = '6'
+ ansible_core_version = '2.13'
def setUp(self):
super().setUp()
diff --git a/tests/unit/test_circular_dependencies.py b/tests/unit/test_circular_dependencies.py
index 0b48a66a9..6060855cd 100644
--- a/tests/unit/test_circular_dependencies.py
+++ b/tests/unit/test_circular_dependencies.py
@@ -13,11 +13,12 @@
# You should have received a copy of the GNU General Public License
# along with this software. If not, see <http://www.gnu.org/licenses/>.
+import re
import textwrap
from zuul.model import PromoteEvent
-from tests.base import ZuulTestCase
+from tests.base import ZuulTestCase, simple_layout, iterate_timeout
class TestGerritCircularDependencies(ZuulTestCase):
@@ -180,7 +181,7 @@ class TestGerritCircularDependencies(ZuulTestCase):
self.fake_gerrit.addEvent(A.addApproval("Approved", 1))
self.waitUntilSettled()
- self.assertEqual(A.reported, 1)
+ self.assertEqual(A.reported, 2)
self.assertEqual(B.reported, 1)
self.assertEqual(A.data["status"], "NEW")
self.assertEqual(B.data["status"], "NEW")
@@ -464,6 +465,45 @@ class TestGerritCircularDependencies(ZuulTestCase):
self.assertEqual(A.data["status"], "NEW")
self.assertEqual(B.data["status"], "NEW")
+ @simple_layout('layouts/circular-deps-node-failure.yaml')
+ def test_cycle_failed_node_request(self):
+ # Test a node request failure as part of a dependency cycle
+
+ # Pause nodepool so we can fail the node request later
+ self.fake_nodepool.pause()
+
+ A = self.fake_gerrit.addFakeChange("org/project1", "master", "A")
+ B = self.fake_gerrit.addFakeChange("org/project2", "master", "B")
+
+ # A <-> B (via commit-depends)
+ A.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ A.subject, B.data["url"]
+ )
+ B.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ B.subject, A.data["url"]
+ )
+
+ A.addApproval("Code-Review", 2)
+ B.addApproval("Code-Review", 2)
+ B.addApproval("Approved", 1)
+
+ self.fake_gerrit.addEvent(A.addApproval("Approved", 1))
+ self.waitUntilSettled()
+
+ # Fail the node request and unpause
+ req = self.fake_nodepool.getNodeRequests()
+ self.fake_nodepool.addFailRequest(req[0])
+
+ self.fake_nodepool.unpause()
+ self.waitUntilSettled()
+
+ self.assertEqual(A.reported, 2)
+ self.assertEqual(B.reported, 2)
+ self.assertIn("bundle", A.messages[-1])
+ self.assertIn("bundle", B.messages[-1])
+ self.assertEqual(A.data["status"], "NEW")
+ self.assertEqual(B.data["status"], "NEW")
+
def test_failing_cycle_behind_failing_change(self):
self.executor_server.hold_jobs_in_build = True
A = self.fake_gerrit.addFakeChange("org/project", "master", "A")
@@ -560,8 +600,23 @@ class TestGerritCircularDependencies(ZuulTestCase):
self.assertIn("depends on a change that failed to merge",
A.messages[-1])
+ self.assertTrue(re.search(r'Change http://localhost:\d+/2 is needed',
+ A.messages[-1]))
+ self.assertFalse(re.search('Change .*? can not be merged',
+ A.messages[-1]))
+
self.assertIn("bundle that failed.", B.messages[-1])
+ self.assertFalse(re.search('Change http://localhost:.*? is needed',
+ B.messages[-1]))
+ self.assertFalse(re.search('Change .*? can not be merged',
+ B.messages[-1]))
+
self.assertIn("bundle that failed.", C.messages[-1])
+ self.assertFalse(re.search('Change http://localhost:.*? is needed',
+ C.messages[-1]))
+ self.assertFalse(re.search('Change .*? can not be merged',
+ C.messages[-1]))
+
self.assertEqual(A.data["status"], "NEW")
self.assertEqual(B.data["status"], "NEW")
self.assertEqual(C.data["status"], "NEW")
@@ -727,7 +782,7 @@ class TestGerritCircularDependencies(ZuulTestCase):
self.fake_gerrit.addEvent(A.addApproval("Approved", 1))
self.waitUntilSettled()
- self.assertEqual(A.reported, 2)
+ self.assertEqual(A.reported, 3)
self.assertEqual(B.reported, 3)
self.assertEqual(A.patchsets[-1]["approvals"][-1]["value"], "-2")
self.assertEqual(B.patchsets[-1]["approvals"][-1]["value"], "-2")
@@ -1022,11 +1077,11 @@ class TestGerritCircularDependencies(ZuulTestCase):
use_job = textwrap.dedent(
"""
- project:
+ queue: integrated
check:
jobs:
- new-job
gate:
- queue: integrated
jobs:
- new-job
""")
@@ -1074,15 +1129,16 @@ class TestGerritCircularDependencies(ZuulTestCase):
"""
- job:
name: project-vars-job
+ deduplicate: false
vars:
test_var: pass
- project:
+ queue: integrated
check:
jobs:
- project-vars-job
gate:
- queue: integrated
jobs:
- project-vars-job
""")
@@ -1177,6 +1233,93 @@ class TestGerritCircularDependencies(ZuulTestCase):
self.assertEqual(B.data["status"], "MERGED")
self.assertEqual(C.data["status"], "MERGED")
+ def test_bundle_id_in_zuul_var(self):
+ A = self.fake_gerrit.addFakeChange("org/project1", "master", "A")
+ B = self.fake_gerrit.addFakeChange("org/project1", "master", "B")
+ C = self.fake_gerrit.addFakeChange("org/project1", "master", "C")
+
+ # A <-> B (via commit-depends)
+ A.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ A.subject, B.data["url"]
+ )
+ B.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ B.subject, A.data["url"]
+ )
+
+ self.executor_server.hold_jobs_in_build = True
+
+ # bundle_id should be in check build of A
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+ var_zuul_items = self.builds[0].parameters["zuul"]["items"]
+ self.assertEqual(len(var_zuul_items), 2)
+ self.assertIn("bundle_id", var_zuul_items[0])
+ bundle_id_0 = var_zuul_items[0]["bundle_id"]
+ self.assertIn("bundle_id", var_zuul_items[1])
+ bundle_id_1 = var_zuul_items[1]["bundle_id"]
+ self.assertEqual(bundle_id_0, bundle_id_1)
+ self.executor_server.release()
+ self.waitUntilSettled()
+ self.assertEqual(len(A.patchsets[-1]["approvals"]), 1)
+ self.assertEqual(A.patchsets[-1]["approvals"][0]["type"], "Verified")
+ self.assertEqual(A.patchsets[-1]["approvals"][0]["value"], "1")
+
+ # bundle_id should be in check build of B
+ self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+ var_zuul_items = self.builds[0].parameters["zuul"]["items"]
+ self.assertEqual(len(var_zuul_items), 2)
+ self.assertIn("bundle_id", var_zuul_items[0])
+ bundle_id_0 = var_zuul_items[0]["bundle_id"]
+ self.assertIn("bundle_id", var_zuul_items[1])
+ bundle_id_1 = var_zuul_items[1]["bundle_id"]
+ self.assertEqual(bundle_id_0, bundle_id_1)
+ self.executor_server.release()
+ self.waitUntilSettled()
+ self.assertEqual(len(B.patchsets[-1]["approvals"]), 1)
+ self.assertEqual(B.patchsets[-1]["approvals"][0]["type"], "Verified")
+ self.assertEqual(B.patchsets[-1]["approvals"][0]["value"], "1")
+
+ # bundle_id should not be in check build of C
+ self.fake_gerrit.addEvent(C.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+ var_zuul_items = self.builds[0].parameters["zuul"]["items"]
+ self.assertEqual(len(var_zuul_items), 1)
+ self.assertNotIn("bundle_id", var_zuul_items[0])
+ self.executor_server.release()
+ self.waitUntilSettled()
+ self.assertEqual(len(C.patchsets[-1]["approvals"]), 1)
+ self.assertEqual(C.patchsets[-1]["approvals"][0]["type"], "Verified")
+ self.assertEqual(C.patchsets[-1]["approvals"][0]["value"], "1")
+
+ # bundle_id should be in gate jobs of A and B, but not in C
+ A.addApproval("Code-Review", 2)
+ B.addApproval("Code-Review", 2)
+ C.addApproval("Code-Review", 2)
+ self.fake_gerrit.addEvent(A.addApproval("Approved", 1))
+ self.fake_gerrit.addEvent(B.addApproval("Approved", 1))
+ self.fake_gerrit.addEvent(C.addApproval("Approved", 1))
+ self.waitUntilSettled()
+ var_zuul_items = self.builds[-1].parameters["zuul"]["items"]
+ self.assertEqual(len(var_zuul_items), 3)
+ self.assertIn("bundle_id", var_zuul_items[0])
+ bundle_id_0 = var_zuul_items[0]["bundle_id"]
+ self.assertIn("bundle_id", var_zuul_items[1])
+ bundle_id_1 = var_zuul_items[1]["bundle_id"]
+ self.assertEqual(bundle_id_0, bundle_id_1)
+ self.assertNotIn("bundle_id", var_zuul_items[2])
+
+ self.executor_server.hold_jobs_in_build = False
+ self.executor_server.release()
+ self.waitUntilSettled()
+
+ self.assertEqual(A.reported, 3)
+ self.assertEqual(B.reported, 3)
+ self.assertEqual(C.reported, 3)
+ self.assertEqual(A.data["status"], "MERGED")
+ self.assertEqual(B.data["status"], "MERGED")
+ self.assertEqual(C.data["status"], "MERGED")
+
def test_cross_tenant_cycle(self):
org_project_files = {
"zuul.yaml": textwrap.dedent(
@@ -1187,11 +1330,11 @@ class TestGerritCircularDependencies(ZuulTestCase):
test_var: pass
- project:
+ queue: integrated
check:
jobs:
- project-vars-job
gate:
- queue: integrated
jobs:
- project-vars-job
""")
@@ -1266,7 +1409,7 @@ class TestGerritCircularDependencies(ZuulTestCase):
self.assertEqual(A.reported, 3)
self.assertEqual(B.reported, 3)
- self.assertEqual(C.reported, 3)
+ self.assertEqual(C.reported, 6)
self.assertEqual(A.data["status"], "MERGED")
self.assertEqual(B.data["status"], "MERGED")
self.assertEqual(C.data["status"], "MERGED")
@@ -1300,7 +1443,7 @@ class TestGerritCircularDependencies(ZuulTestCase):
self.fake_gerrit.addEvent(A.addApproval("Approved", 1))
self.waitUntilSettled()
- self.assertEqual(A.reported, 1)
+ self.assertEqual(A.reported, 2)
self.assertEqual(A.data["status"], "NEW")
self.assertEqual(B.data["status"], "NEW")
@@ -1311,7 +1454,7 @@ class TestGerritCircularDependencies(ZuulTestCase):
self.fake_gerrit.addEvent(A.addApproval("Approved", 1))
self.waitUntilSettled()
- self.assertEqual(A.reported, 3)
+ self.assertEqual(A.reported, 4)
self.assertEqual(A.data["status"], "MERGED")
def test_promote_cycle(self):
@@ -1410,6 +1553,736 @@ class TestGerritCircularDependencies(ZuulTestCase):
self.assertEqual(B.data['status'], 'NEW')
self.assertEqual(C.data['status'], 'MERGED')
+ def _test_job_deduplication(self):
+ A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
+ B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
+
+ # A <-> B
+ A.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ A.subject, B.data["url"]
+ )
+ B.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ B.subject, A.data["url"]
+ )
+
+ A.addApproval('Code-Review', 2)
+ B.addApproval('Code-Review', 2)
+
+ self.fake_gerrit.addEvent(A.addApproval('Approved', 1))
+ self.fake_gerrit.addEvent(B.addApproval('Approved', 1))
+
+ self.waitUntilSettled()
+
+ self.assertEqual(A.data['status'], 'MERGED')
+ self.assertEqual(B.data['status'], 'MERGED')
+
+ @simple_layout('layouts/job-dedup-auto-shared.yaml')
+ def test_job_deduplication_auto_shared(self):
+ self._test_job_deduplication()
+ self.assertHistory([
+ dict(name="project1-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="common-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="project2-job", result="SUCCESS", changes="2,1 1,1"),
+ # This is deduplicated
+ # dict(name="common-job", result="SUCCESS", changes="2,1 1,1"),
+ ], ordered=False)
+ self.assertEqual(len(self.fake_nodepool.history), 3)
+
+ @simple_layout('layouts/job-dedup-auto-unshared.yaml')
+ def test_job_deduplication_auto_unshared(self):
+ self._test_job_deduplication()
+ self.assertHistory([
+ dict(name="project1-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="common-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="project2-job", result="SUCCESS", changes="2,1 1,1"),
+ # This is not deduplicated
+ dict(name="common-job", result="SUCCESS", changes="2,1 1,1"),
+ ], ordered=False)
+ self.assertEqual(len(self.fake_nodepool.history), 4)
+
+ @simple_layout('layouts/job-dedup-true.yaml')
+ def test_job_deduplication_true(self):
+ self._test_job_deduplication()
+ self.assertHistory([
+ dict(name="project1-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="common-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="project2-job", result="SUCCESS", changes="2,1 1,1"),
+ # This is deduplicated
+ # dict(name="common-job", result="SUCCESS", changes="2,1 1,1"),
+ ], ordered=False)
+ self.assertEqual(len(self.fake_nodepool.history), 3)
+
+ @simple_layout('layouts/job-dedup-false.yaml')
+ def test_job_deduplication_false(self):
+ self._test_job_deduplication()
+ self.assertHistory([
+ dict(name="project1-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="common-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="project2-job", result="SUCCESS", changes="2,1 1,1"),
+ # This is not deduplicated, though it would be under auto
+ dict(name="common-job", result="SUCCESS", changes="2,1 1,1"),
+ ], ordered=False)
+ self.assertEqual(len(self.fake_nodepool.history), 4)
+
+ @simple_layout('layouts/job-dedup-empty-nodeset.yaml')
+ def test_job_deduplication_empty_nodeset(self):
+ # Make sure that jobs with empty nodesets can still be
+ # deduplicated
+ self._test_job_deduplication()
+ self.assertHistory([
+ dict(name="project1-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="common-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="project2-job", result="SUCCESS", changes="2,1 1,1"),
+ # This is deduplicated
+ # dict(name="common-job", result="SUCCESS", changes="2,1 1,1"),
+ ], ordered=False)
+ self.assertEqual(len(self.fake_nodepool.history), 0)
+
+ @simple_layout('layouts/job-dedup-auto-shared.yaml')
+ def test_job_deduplication_failed_node_request(self):
+ # Pause nodepool so we can fail the node request later
+ self.fake_nodepool.pause()
+
+ A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
+ B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
+
+ # A <-> B
+ A.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ A.subject, B.data["url"]
+ )
+ B.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ B.subject, A.data["url"]
+ )
+
+ A.addApproval('Code-Review', 2)
+ B.addApproval('Code-Review', 2)
+
+ self.fake_gerrit.addEvent(A.addApproval('Approved', 1))
+ self.fake_gerrit.addEvent(B.addApproval('Approved', 1))
+
+ self.waitUntilSettled()
+
+ # Fail the node request and unpause
+ for req in self.fake_nodepool.getNodeRequests():
+ if req['requestor_data']['job_name'] == 'common-job':
+ self.fake_nodepool.addFailRequest(req)
+
+ self.fake_nodepool.unpause()
+ self.waitUntilSettled()
+
+ self.assertEqual(A.data['status'], 'NEW')
+ self.assertEqual(B.data['status'], 'NEW')
+ self.assertHistory([])
+ self.assertEqual(len(self.fake_nodepool.history), 3)
+
+ @simple_layout('layouts/job-dedup-auto-shared.yaml')
+ def test_job_deduplication_failed_job(self):
+ self.executor_server.hold_jobs_in_build = True
+ A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
+ B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
+
+ # A <-> B
+ A.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ A.subject, B.data["url"]
+ )
+ B.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ B.subject, A.data["url"]
+ )
+
+ A.addApproval('Code-Review', 2)
+ B.addApproval('Code-Review', 2)
+ self.executor_server.failJob("common-job", A)
+
+ self.fake_gerrit.addEvent(A.addApproval('Approved', 1))
+ self.fake_gerrit.addEvent(B.addApproval('Approved', 1))
+
+ # If we don't make sure these jobs finish first, then one of
+ # the items may complete before the other and cause Zuul to
+ # abort the project*-job on the other item (with a "bundle
+ # failed to merge" error).
+ self.waitUntilSettled()
+ self.executor_server.release('project1-job')
+ self.executor_server.release('project2-job')
+ self.waitUntilSettled()
+ self.executor_server.hold_jobs_in_build = False
+ self.executor_server.release()
+ self.waitUntilSettled()
+
+ self.assertEqual(A.data['status'], 'NEW')
+ self.assertEqual(B.data['status'], 'NEW')
+ self.assertHistory([
+ dict(name="project1-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="common-job", result="FAILURE", changes="2,1 1,1"),
+ dict(name="project2-job", result="SUCCESS", changes="2,1 1,1"),
+ # This is deduplicated
+ # dict(name="common-job", result="SUCCESS", changes="2,1 1,1"),
+ ], ordered=False)
+ self.assertEqual(len(self.fake_nodepool.history), 3)
+
+ @simple_layout('layouts/job-dedup-false.yaml')
+ def test_job_deduplication_false_failed_job(self):
+ # Test that if we are *not* deduplicating jobs, we don't
+ # duplicate the result on two different builds.
+ # The way we check that is to retry the common-job between two
+ # items, but only once, and only on one item. The other item
+ # should be unaffected.
+ self.executor_server.hold_jobs_in_build = True
+ A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
+ B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
+
+ # A <-> B
+ A.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ A.subject, B.data["url"]
+ )
+ B.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ B.subject, A.data["url"]
+ )
+
+ A.addApproval('Code-Review', 2)
+ B.addApproval('Code-Review', 2)
+
+ self.fake_gerrit.addEvent(A.addApproval('Approved', 1))
+ self.fake_gerrit.addEvent(B.addApproval('Approved', 1))
+
+ # If we don't make sure these jobs finish first, then one of
+ # the items may complete before the other and cause Zuul to
+ # abort the project*-job on the other item (with a "bundle
+ # failed to merge" error).
+ self.waitUntilSettled()
+ for build in self.builds:
+ if build.name == 'common-job' and build.project == 'org/project1':
+ break
+ else:
+ raise Exception("Unable to find build")
+ build.should_retry = True
+
+ # Store a reference to the queue items so we can inspect their
+ # internal attributes later to double check the retry build
+ # count is correct.
+ tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
+ pipeline = tenant.layout.pipelines['gate']
+ items = pipeline.getAllItems()
+ self.assertEqual(len(items), 2)
+
+ self.executor_server.release('project1-job')
+ self.executor_server.release('project2-job')
+ self.waitUntilSettled()
+ self.executor_server.hold_jobs_in_build = False
+ self.executor_server.release()
+ self.waitUntilSettled()
+
+ self.assertEqual(A.data['status'], 'MERGED')
+ self.assertEqual(B.data['status'], 'MERGED')
+ self.assertHistory([
+ dict(name="project2-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="project1-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="common-job", result=None, changes="2,1 1,1"),
+ dict(name="common-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="common-job", result="SUCCESS", changes="2,1 1,1"),
+ ], ordered=False)
+ self.assertEqual(len(self.fake_nodepool.history), 5)
+ self.assertEqual(items[0].change.project.name, 'org/project2')
+ self.assertEqual(len(items[0].current_build_set.retry_builds), 0)
+ self.assertEqual(items[1].change.project.name, 'org/project1')
+ self.assertEqual(len(items[1].current_build_set.retry_builds), 1)
+
+ @simple_layout('layouts/job-dedup-auto-shared.yaml')
+ def test_job_deduplication_multi_scheduler(self):
+ # Test that a second scheduler can correctly refresh
+ # deduplicated builds
+ self.executor_server.hold_jobs_in_build = True
+ A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
+ B = self.fake_gerrit.addFakeChange('org/project1', 'master', 'B')
+
+ # A <-> B
+ A.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ A.subject, B.data["url"]
+ )
+ B.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ B.subject, A.data["url"]
+ )
+
+ A.addApproval('Code-Review', 2)
+ B.addApproval('Code-Review', 2)
+
+ self.fake_gerrit.addEvent(A.addApproval('Approved', 1))
+ self.fake_gerrit.addEvent(B.addApproval('Approved', 1))
+
+ self.waitUntilSettled()
+
+ app = self.createScheduler()
+ app.start()
+ self.assertEqual(len(self.scheds), 2)
+
+ # Hold the lock on the first scheduler so that only the second
+ # will act.
+ with self.scheds.first.sched.run_handler_lock:
+ self.executor_server.hold_jobs_in_build = False
+ self.executor_server.release()
+ self.waitUntilSettled(matcher=[app])
+
+ self.assertEqual(A.data['status'], 'MERGED')
+ self.assertEqual(B.data['status'], 'MERGED')
+ self.assertHistory([
+ dict(name="project1-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="common-job", result="SUCCESS", changes="2,1 1,1"),
+ ], ordered=False)
+
+ @simple_layout('layouts/job-dedup-noop.yaml')
+ def test_job_deduplication_noop(self):
+ # Test that we don't deduplicate noop (there's no good reason
+ # to do so)
+ A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
+ B = self.fake_gerrit.addFakeChange('org/project1', 'master', 'B')
+
+ # A <-> B
+ A.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ A.subject, B.data["url"]
+ )
+ B.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ B.subject, A.data["url"]
+ )
+
+ A.addApproval('Code-Review', 2)
+ B.addApproval('Code-Review', 2)
+
+ self.fake_gerrit.addEvent(A.addApproval('Approved', 1))
+ self.fake_gerrit.addEvent(B.addApproval('Approved', 1))
+
+ self.waitUntilSettled()
+
+ self.assertEqual(A.data['status'], 'MERGED')
+ self.assertEqual(B.data['status'], 'MERGED')
+ self.assertHistory([
+ dict(name="project1-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="common-job", result="SUCCESS", changes="2,1 1,1"),
+ ], ordered=False)
+ # It's tricky to get info about a noop build, but the jobs in
+ # the report have the build UUID, so we make sure it's
+ # different.
+ a_noop = [l for l in A.messages[-1].split('\n') if 'noop' in l][0]
+ b_noop = [l for l in B.messages[-1].split('\n') if 'noop' in l][0]
+ self.assertNotEqual(a_noop, b_noop)
+
+ @simple_layout('layouts/job-dedup-retry.yaml')
+ def test_job_deduplication_retry(self):
+ A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
+ B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
+
+ # A <-> B
+ A.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ A.subject, B.data["url"]
+ )
+ B.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ B.subject, A.data["url"]
+ )
+
+ self.executor_server.retryJob('common-job', A)
+
+ A.addApproval('Code-Review', 2)
+ B.addApproval('Code-Review', 2)
+
+ self.fake_gerrit.addEvent(A.addApproval('Approved', 1))
+ self.fake_gerrit.addEvent(B.addApproval('Approved', 1))
+
+ self.waitUntilSettled()
+
+ self.assertEqual(A.data['status'], 'NEW')
+ self.assertEqual(B.data['status'], 'NEW')
+ self.assertHistory([
+ dict(name="project1-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="project2-job", result="SUCCESS", changes="2,1 1,1"),
+ # There should be exactly 3 runs of the job (not 6)
+ dict(name="common-job", result=None, changes="2,1 1,1"),
+ dict(name="common-job", result=None, changes="2,1 1,1"),
+ dict(name="common-job", result=None, changes="2,1 1,1"),
+ ], ordered=False)
+ self.assertEqual(len(self.fake_nodepool.history), 5)
+
+ @simple_layout('layouts/job-dedup-retry-child.yaml')
+ def test_job_deduplication_retry_child(self):
+ # This tests retrying a paused build (simulating an executor restart)
+ # See test_data_return_child_from_retried_paused_job
+ self.executor_server.hold_jobs_in_build = True
+ A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
+ B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
+
+ # A <-> B
+ A.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ A.subject, B.data["url"]
+ )
+ B.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ B.subject, A.data["url"]
+ )
+
+ self.executor_server.returnData(
+ 'parent-job', A,
+ {'zuul': {'pause': True}}
+ )
+
+ A.addApproval('Code-Review', 2)
+ B.addApproval('Code-Review', 2)
+
+ self.fake_gerrit.addEvent(A.addApproval('Approved', 1))
+ self.fake_gerrit.addEvent(B.addApproval('Approved', 1))
+
+ self.waitUntilSettled()
+
+ self.executor_server.release('parent-job')
+ self.waitUntilSettled("till job is paused")
+
+ paused_job = self.builds[0]
+ self.assertTrue(paused_job.paused)
+
+ # Stop the job worker to simulate an executor restart
+ for job_worker in self.executor_server.job_workers.values():
+ if job_worker.build_request.uuid == paused_job.uuid:
+ job_worker.stop()
+ self.waitUntilSettled("stop job worker")
+
+ self.executor_server.hold_jobs_in_build = False
+ self.executor_server.release()
+ self.waitUntilSettled("all jobs are done")
+ # The "pause" job might be paused during the waitUntilSettled
+ # call and appear settled; it should automatically resume
+ # though, so just wait for it.
+ for x in iterate_timeout(60, 'paused job'):
+ if not self.builds:
+ break
+ self.waitUntilSettled()
+
+ self.assertEqual(A.data['status'], 'MERGED')
+ self.assertEqual(B.data['status'], 'MERGED')
+ self.assertHistory([
+ dict(name="parent-job", result="ABORTED", changes="2,1 1,1"),
+ dict(name="project1-job", result="ABORTED", changes="2,1 1,1"),
+ dict(name="project2-job", result="ABORTED", changes="2,1 1,1"),
+ dict(name="parent-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="project1-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="project2-job", result="SUCCESS", changes="2,1 1,1"),
+ ], ordered=False)
+ self.assertEqual(len(self.fake_nodepool.history), 6)
+
+ @simple_layout('layouts/job-dedup-parent-data.yaml')
+ def test_job_deduplication_parent_data(self):
+ A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
+ B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
+
+ # A <-> B
+ A.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ A.subject, B.data["url"]
+ )
+ B.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ B.subject, A.data["url"]
+ )
+
+ # The parent job returns data
+ self.executor_server.returnData(
+ 'parent-job', A,
+ {'zuul':
+ {'artifacts': [
+ {'name': 'image',
+ 'url': 'http://example.com/image',
+ 'metadata': {
+ 'type': 'container_image'
+ }},
+ ]}}
+ )
+
+ A.addApproval('Code-Review', 2)
+ B.addApproval('Code-Review', 2)
+ self.fake_gerrit.addEvent(A.addApproval('Approved', 1))
+ self.fake_gerrit.addEvent(B.addApproval('Approved', 1))
+
+ self.waitUntilSettled()
+
+ self.assertEqual(A.data['status'], 'MERGED')
+ self.assertEqual(B.data['status'], 'MERGED')
+ self.assertHistory([
+ dict(name="parent-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="project1-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="project2-job", result="SUCCESS", changes="2,1 1,1"),
+ # Only one run of the common job since it's the same
+ dict(name="common-child-job", result="SUCCESS", changes="2,1 1,1"),
+ # The forked job depends on different parents
+ # so it should run twice
+ dict(name="forked-child-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="forked-child-job", result="SUCCESS", changes="2,1 1,1"),
+ ], ordered=False)
+ self.assertEqual(len(self.fake_nodepool.history), 6)
+
+ def _test_job_deduplication_semaphore(self):
+ "Test semaphores with max=1 (mutex) and get resources first"
+ self.executor_server.hold_jobs_in_build = True
+
+ tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
+ self.assertEqual(
+ len(tenant.semaphore_handler.semaphoreHolders("test-semaphore")),
+ 0)
+
+ A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
+ B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
+
+ # A <-> B
+ A.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ A.subject, B.data["url"]
+ )
+ B.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ B.subject, A.data["url"]
+ )
+
+ A.addApproval('Code-Review', 2)
+ B.addApproval('Code-Review', 2)
+ self.fake_gerrit.addEvent(A.addApproval('Approved', 1))
+ self.fake_gerrit.addEvent(B.addApproval('Approved', 1))
+
+ self.waitUntilSettled()
+ self.assertEqual(
+ len(tenant.semaphore_handler.semaphoreHolders("test-semaphore")),
+ 1)
+
+ self.executor_server.hold_jobs_in_build = False
+ self.executor_server.release()
+ self.waitUntilSettled()
+
+ self.assertHistory([
+ dict(name="project1-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="common-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="project2-job", result="SUCCESS", changes="2,1 1,1"),
+ # This is deduplicated
+ # dict(name="common-job", result="SUCCESS", changes="2,1 1,1"),
+ ], ordered=False)
+ self.assertEqual(len(self.fake_nodepool.history), 3)
+ self.assertEqual(
+ len(tenant.semaphore_handler.semaphoreHolders("test-semaphore")),
+ 0)
+
+ @simple_layout('layouts/job-dedup-semaphore.yaml')
+ def test_job_deduplication_semaphore(self):
+ self._test_job_deduplication_semaphore()
+
+ @simple_layout('layouts/job-dedup-semaphore-first.yaml')
+ def test_job_deduplication_semaphore_resources_first(self):
+ self._test_job_deduplication_semaphore()
+
+ def test_submitted_together(self):
+ self.fake_gerrit._fake_submit_whole_topic = True
+ A = self.fake_gerrit.addFakeChange('org/project1', "master", "A",
+ topic='test-topic')
+ B = self.fake_gerrit.addFakeChange('org/project2', "master", "B",
+ topic='test-topic')
+
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertEqual(len(A.patchsets[-1]["approvals"]), 1)
+ self.assertEqual(A.patchsets[-1]["approvals"][0]["type"], "Verified")
+ self.assertEqual(A.patchsets[-1]["approvals"][0]["value"], "1")
+
+ self.assertEqual(len(B.patchsets[-1]["approvals"]), 1)
+ self.assertEqual(B.patchsets[-1]["approvals"][0]["type"], "Verified")
+ self.assertEqual(B.patchsets[-1]["approvals"][0]["value"], "1")
+
+ # We're about to add approvals to changes without adding the
+ # triggering events to Zuul, so that we can be sure that it is
+ # enqueing the changes based on dependencies, not because of
+ # triggering events. Since it will have the changes cached
+ # already (without approvals), we need to clear the cache
+ # first.
+ for connection in self.scheds.first.connections.connections.values():
+ connection.maintainCache([], max_age=0)
+
+ A.addApproval("Code-Review", 2)
+ B.addApproval("Code-Review", 2)
+ A.addApproval("Approved", 1)
+ self.fake_gerrit.addEvent(B.addApproval("Approved", 1))
+ self.waitUntilSettled()
+
+ self.assertEqual(A.reported, 3)
+ self.assertEqual(B.reported, 3)
+ self.assertEqual(A.data["status"], "MERGED")
+ self.assertEqual(B.data["status"], "MERGED")
+
+ def test_submitted_together_git(self):
+ self.fake_gerrit._fake_submit_whole_topic = True
+
+ A = self.fake_gerrit.addFakeChange('org/project1', "master", "A")
+ B = self.fake_gerrit.addFakeChange('org/project1', "master", "B")
+ C = self.fake_gerrit.addFakeChange('org/project1', "master", "C")
+ D = self.fake_gerrit.addFakeChange('org/project1', "master", "D")
+ E = self.fake_gerrit.addFakeChange('org/project1', "master", "E")
+ F = self.fake_gerrit.addFakeChange('org/project1', "master", "F")
+ G = self.fake_gerrit.addFakeChange('org/project1', "master", "G")
+ G.setDependsOn(F, 1)
+ F.setDependsOn(E, 1)
+ E.setDependsOn(D, 1)
+ D.setDependsOn(C, 1)
+ C.setDependsOn(B, 1)
+ B.setDependsOn(A, 1)
+
+ self.fake_gerrit.addEvent(C.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertEqual(len(C.patchsets[-1]["approvals"]), 1)
+ self.assertEqual(C.patchsets[-1]["approvals"][0]["type"], "Verified")
+ self.assertEqual(C.patchsets[-1]["approvals"][0]["value"], "1")
+ self.assertEqual(A.queried, 1)
+ self.assertEqual(B.queried, 1)
+ self.assertEqual(C.queried, 1)
+ self.assertEqual(D.queried, 1)
+ self.assertEqual(E.queried, 1)
+ self.assertEqual(F.queried, 1)
+ self.assertEqual(G.queried, 1)
+ self.assertHistory([
+ dict(name="project1-job", result="SUCCESS",
+ changes="1,1 2,1 3,1"),
+ dict(name="project-vars-job", result="SUCCESS",
+ changes="1,1 2,1 3,1"),
+ ], ordered=False)
+
+ def test_submitted_together_git_topic(self):
+ self.fake_gerrit._fake_submit_whole_topic = True
+
+ A = self.fake_gerrit.addFakeChange('org/project1', "master", "A",
+ topic='test-topic')
+ B = self.fake_gerrit.addFakeChange('org/project1', "master", "B",
+ topic='test-topic')
+ C = self.fake_gerrit.addFakeChange('org/project1', "master", "C",
+ topic='test-topic')
+ D = self.fake_gerrit.addFakeChange('org/project1', "master", "D",
+ topic='test-topic')
+ E = self.fake_gerrit.addFakeChange('org/project1', "master", "E",
+ topic='test-topic')
+ F = self.fake_gerrit.addFakeChange('org/project1', "master", "F",
+ topic='test-topic')
+ G = self.fake_gerrit.addFakeChange('org/project1', "master", "G",
+ topic='test-topic')
+ G.setDependsOn(F, 1)
+ F.setDependsOn(E, 1)
+ E.setDependsOn(D, 1)
+ D.setDependsOn(C, 1)
+ C.setDependsOn(B, 1)
+ B.setDependsOn(A, 1)
+
+ self.fake_gerrit.addEvent(C.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertEqual(len(C.patchsets[-1]["approvals"]), 1)
+ self.assertEqual(C.patchsets[-1]["approvals"][0]["type"], "Verified")
+ self.assertEqual(C.patchsets[-1]["approvals"][0]["value"], "1")
+ self.assertEqual(A.queried, 8)
+ self.assertEqual(B.queried, 8)
+ self.assertEqual(C.queried, 8)
+ self.assertEqual(D.queried, 8)
+ self.assertEqual(E.queried, 8)
+ self.assertEqual(F.queried, 8)
+ self.assertEqual(G.queried, 8)
+ self.assertHistory([
+ dict(name="project1-job", result="SUCCESS",
+ changes="7,1 6,1 5,1 4,1 1,1 2,1 3,1"),
+ dict(name="project-vars-job", result="SUCCESS",
+ changes="7,1 6,1 5,1 4,1 1,1 2,1 3,1"),
+ ], ordered=False)
+
+ @simple_layout('layouts/submitted-together-per-branch.yaml')
+ def test_submitted_together_per_branch(self):
+ self.fake_gerrit._fake_submit_whole_topic = True
+ self.create_branch('org/project2', 'stable/foo')
+ A = self.fake_gerrit.addFakeChange('org/project1', "master", "A",
+ topic='test-topic')
+ B = self.fake_gerrit.addFakeChange('org/project2', "stable/foo", "B",
+ topic='test-topic')
+
+ A.addApproval("Code-Review", 2)
+ B.addApproval("Code-Review", 2)
+ A.addApproval("Approved", 1)
+ self.fake_gerrit.addEvent(B.addApproval("Approved", 1))
+ self.waitUntilSettled()
+
+ self.assertEqual(A.reported, 0)
+ self.assertEqual(B.reported, 1)
+ self.assertEqual(A.data["status"], "NEW")
+ self.assertEqual(B.data["status"], "NEW")
+ self.assertIn("does not share a change queue", B.messages[-1])
+
+ @simple_layout('layouts/deps-by-topic.yaml')
+ def test_deps_by_topic(self):
+ A = self.fake_gerrit.addFakeChange('org/project1', "master", "A",
+ topic='test-topic')
+ B = self.fake_gerrit.addFakeChange('org/project2', "master", "B",
+ topic='test-topic')
+
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertEqual(len(A.patchsets[-1]["approvals"]), 1)
+ self.assertEqual(A.patchsets[-1]["approvals"][0]["type"], "Verified")
+ self.assertEqual(A.patchsets[-1]["approvals"][0]["value"], "1")
+
+ self.assertEqual(len(B.patchsets[-1]["approvals"]), 1)
+ self.assertEqual(B.patchsets[-1]["approvals"][0]["type"], "Verified")
+ self.assertEqual(B.patchsets[-1]["approvals"][0]["value"], "1")
+
+ # We're about to add approvals to changes without adding the
+ # triggering events to Zuul, so that we can be sure that it is
+ # enqueing the changes based on dependencies, not because of
+ # triggering events. Since it will have the changes cached
+ # already (without approvals), we need to clear the cache
+ # first.
+ for connection in self.scheds.first.connections.connections.values():
+ connection.maintainCache([], max_age=0)
+
+ A.addApproval("Code-Review", 2)
+ B.addApproval("Code-Review", 2)
+ A.addApproval("Approved", 1)
+ self.fake_gerrit.addEvent(B.addApproval("Approved", 1))
+ self.waitUntilSettled()
+
+ self.assertEqual(A.reported, 3)
+ self.assertEqual(B.reported, 3)
+ self.assertEqual(A.data["status"], "MERGED")
+ self.assertEqual(B.data["status"], "MERGED")
+
+ @simple_layout('layouts/deps-by-topic.yaml')
+ def test_deps_by_topic_new_patchset(self):
+ # Make sure that we correctly update the change cache on new
+ # patchsets.
+ A = self.fake_gerrit.addFakeChange('org/project1', "master", "A",
+ topic='test-topic')
+ B = self.fake_gerrit.addFakeChange('org/project2', "master", "B",
+ topic='test-topic')
+
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertEqual(len(A.patchsets[-1]["approvals"]), 1)
+ self.assertEqual(A.patchsets[-1]["approvals"][0]["type"], "Verified")
+ self.assertEqual(A.patchsets[-1]["approvals"][0]["value"], "1")
+
+ self.assertEqual(len(B.patchsets[-1]["approvals"]), 1)
+ self.assertEqual(B.patchsets[-1]["approvals"][0]["type"], "Verified")
+ self.assertEqual(B.patchsets[-1]["approvals"][0]["value"], "1")
+
+ self.assertHistory([
+ dict(name="test-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="test-job", result="SUCCESS", changes="1,1 2,1"),
+ ], ordered=False)
+
+ A.addPatchset()
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(2))
+ self.waitUntilSettled()
+
+ self.assertHistory([
+ # Original check run
+ dict(name="test-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="test-job", result="SUCCESS", changes="1,1 2,1"),
+ # Second check run
+ dict(name="test-job", result="SUCCESS", changes="2,1 1,2"),
+ ], ordered=False)
+
class TestGithubCircularDependencies(ZuulTestCase):
config_file = "zuul-gerrit-github.conf"
@@ -1584,3 +2457,21 @@ class TestGithubCircularDependencies(ZuulTestCase):
self.assertEqual(len(B.comments), 2)
self.assertFalse(A.is_merged)
self.assertFalse(B.is_merged)
+
+ self.assertIn("part of a bundle that can not merge",
+ A.comments[-1])
+ self.assertTrue(
+ re.search("Change https://github.com/gh/project/pull/1 "
+ "can not be merged",
+ A.comments[-1]))
+ self.assertFalse(re.search('Change .*? is needed',
+ A.comments[-1]))
+
+ self.assertIn("part of a bundle that can not merge",
+ B.comments[-1])
+ self.assertTrue(
+ re.search("Change https://github.com/gh/project/pull/1 "
+ "can not be merged",
+ B.comments[-1]))
+ self.assertFalse(re.search('Change .*? is needed',
+ B.comments[-1]))
diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py
index 87f271490..b51639952 100644
--- a/tests/unit/test_client.py
+++ b/tests/unit/test_client.py
@@ -1,4 +1,5 @@
# Copyright 2018 Red Hat, Inc.
+# Copyright 2022 Acme Gating, LLC
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
@@ -17,18 +18,22 @@ import os
import sys
import subprocess
import time
-
import configparser
+import datetime
+import dateutil.tz
+
import fixtures
import jwt
import testtools
-from kazoo.exceptions import NoNodeError
from zuul.zk import ZooKeeperClient
+from zuul.cmd.client import parse_cutoff
from tests.base import BaseTestCase, ZuulTestCase
from tests.base import FIXTURE_DIR
+from kazoo.exceptions import NoNodeError
+
class BaseClientTestCase(BaseTestCase):
config_file = 'zuul.conf'
@@ -66,7 +71,7 @@ class TestTenantValidationClient(BaseClientTestCase):
with open(os.path.join(self.test_root, 'tenant_ok.conf'), 'w') as f:
self.config.write(f)
p = subprocess.Popen(
- [os.path.join(sys.prefix, 'bin/zuul'),
+ [os.path.join(sys.prefix, 'bin/zuul-admin'),
'-c', os.path.join(self.test_root, 'tenant_ok.conf'),
'tenant-conf-check'], stdout=subprocess.PIPE)
p.communicate()
@@ -78,7 +83,7 @@ class TestTenantValidationClient(BaseClientTestCase):
with open(os.path.join(self.test_root, 'tenant_ko.conf'), 'w') as f:
self.config.write(f)
p = subprocess.Popen(
- [os.path.join(sys.prefix, 'bin/zuul'),
+ [os.path.join(sys.prefix, 'bin/zuul-admin'),
'-c', os.path.join(self.test_root, 'tenant_ko.conf'),
'tenant-conf-check'], stdout=subprocess.PIPE)
out, _ = p.communicate()
@@ -100,7 +105,7 @@ class TestWebTokenClient(BaseClientTestCase):
'no_zuul_operator.conf'), 'w') as f:
self.config.write(f)
p = subprocess.Popen(
- [os.path.join(sys.prefix, 'bin/zuul'),
+ [os.path.join(sys.prefix, 'bin/zuul-admin'),
'-c', os.path.join(self.test_root, 'no_zuul_operator.conf'),
'create-auth-token',
'--auth-config', 'zuul_operator',
@@ -122,7 +127,7 @@ class TestWebTokenClient(BaseClientTestCase):
with open(os.path.join(self.test_root, 'JWKS.conf'), 'w') as f:
self.config.write(f)
p = subprocess.Popen(
- [os.path.join(sys.prefix, 'bin/zuul'),
+ [os.path.join(sys.prefix, 'bin/zuul-admin'),
'-c', os.path.join(self.test_root, 'JWKS.conf'),
'create-auth-token',
'--auth-config', 'someauth',
@@ -140,7 +145,7 @@ class TestWebTokenClient(BaseClientTestCase):
with open(os.path.join(self.test_root, 'good.conf'), 'w') as f:
self.config.write(f)
p = subprocess.Popen(
- [os.path.join(sys.prefix, 'bin/zuul'),
+ [os.path.join(sys.prefix, 'bin/zuul-admin'),
'-c', os.path.join(self.test_root, 'good.conf'),
'create-auth-token',
'--auth-conf', 'zuul_operator',
@@ -187,7 +192,7 @@ class TestKeyOperations(ZuulTestCase):
# Export keys
p = subprocess.Popen(
- [os.path.join(sys.prefix, 'bin/zuul'),
+ [os.path.join(sys.prefix, 'bin/zuul-admin'),
'-c', config_file,
'export-keys', export_root],
stdout=subprocess.PIPE)
@@ -204,7 +209,7 @@ class TestKeyOperations(ZuulTestCase):
# Import keys
p = subprocess.Popen(
- [os.path.join(sys.prefix, 'bin/zuul'),
+ [os.path.join(sys.prefix, 'bin/zuul-admin'),
'-c', config_file,
'import-keys', export_root],
stdout=subprocess.PIPE)
@@ -222,7 +227,7 @@ class TestKeyOperations(ZuulTestCase):
self.config.write(f)
p = subprocess.Popen(
- [os.path.join(sys.prefix, 'bin/zuul'),
+ [os.path.join(sys.prefix, 'bin/zuul-admin'),
'-c', config_file,
'copy-keys',
'gerrit', 'org/project',
@@ -242,7 +247,7 @@ class TestKeyOperations(ZuulTestCase):
data['/keystorage/gerrit/neworg/neworg%2Fnewproject/ssh'])
p = subprocess.Popen(
- [os.path.join(sys.prefix, 'bin/zuul'),
+ [os.path.join(sys.prefix, 'bin/zuul-admin'),
'-c', config_file,
'delete-keys',
'gerrit', 'org/project',
@@ -269,7 +274,7 @@ class TestKeyOperations(ZuulTestCase):
data.get('/keystorage/gerrit/org'))
p = subprocess.Popen(
- [os.path.join(sys.prefix, 'bin/zuul'),
+ [os.path.join(sys.prefix, 'bin/zuul-admin'),
'-c', config_file,
'delete-keys',
'gerrit', 'org/project1',
@@ -280,7 +285,7 @@ class TestKeyOperations(ZuulTestCase):
self.assertEqual(p.returncode, 0)
p = subprocess.Popen(
- [os.path.join(sys.prefix, 'bin/zuul'),
+ [os.path.join(sys.prefix, 'bin/zuul-admin'),
'-c', config_file,
'delete-keys',
'gerrit', 'org/project2',
@@ -310,6 +315,9 @@ class TestOfflineZKOperations(ZuulTestCase):
def assertFinalState(self):
pass
+ def assertCleanShutdown(self):
+ pass
+
def test_delete_state(self):
# Shut everything down (as much as possible) to reduce
# logspam and errors.
@@ -328,7 +336,7 @@ class TestOfflineZKOperations(ZuulTestCase):
old_data = self.getZKTree('/keystorage')
p = subprocess.Popen(
- [os.path.join(sys.prefix, 'bin/zuul'),
+ [os.path.join(sys.prefix, 'bin/zuul-admin'),
'-c', config_file,
'delete-state',
],
@@ -367,7 +375,7 @@ class TestOnlineZKOperations(ZuulTestCase):
# Make sure the pipeline exists
self.getZKTree('/zuul/tenant/tenant-one/pipeline/check/item')
p = subprocess.Popen(
- [os.path.join(sys.prefix, 'bin/zuul'),
+ [os.path.join(sys.prefix, 'bin/zuul-admin'),
'-c', config_file,
'delete-pipeline-state',
'tenant-one', 'check',
@@ -405,7 +413,7 @@ class TestOnlineZKOperations(ZuulTestCase):
# Make sure the pipeline exists
self.getZKTree('/zuul/tenant/tenant-one/pipeline/gate/item')
p = subprocess.Popen(
- [os.path.join(sys.prefix, 'bin/zuul'),
+ [os.path.join(sys.prefix, 'bin/zuul-admin'),
'-c', config_file,
'delete-pipeline-state',
'tenant-one', 'gate',
@@ -429,3 +437,118 @@ class TestOnlineZKOperations(ZuulTestCase):
dict(name='project-test1', result='SUCCESS', changes='2,1'),
dict(name='project-test2', result='SUCCESS', changes='2,1'),
], ordered=False)
+
+
+class TestDBPruneParse(BaseTestCase):
+ def test_db_prune_parse(self):
+ now = datetime.datetime(year=2023, month=5, day=28,
+ hour=22, minute=15, second=1,
+ tzinfo=dateutil.tz.tzutc())
+ reference = datetime.datetime(year=2022, month=5, day=28,
+ hour=22, minute=15, second=1,
+ tzinfo=dateutil.tz.tzutc())
+ # Test absolute times
+ self.assertEqual(
+ reference,
+ parse_cutoff(now, '2022-05-28 22:15:01 UTC', None))
+ self.assertEqual(
+ reference,
+ parse_cutoff(now, '2022-05-28 22:15:01', None))
+
+ # Test relative times
+ self.assertEqual(reference,
+ parse_cutoff(now, None, '8760h'))
+ self.assertEqual(reference,
+ parse_cutoff(now, None, '365d'))
+ with testtools.ExpectedException(RuntimeError):
+ self.assertEqual(reference,
+ parse_cutoff(now, None, '1y'))
+
+
+class DBPruneTestCase(ZuulTestCase):
+ tenant_config_file = 'config/single-tenant/main.yaml'
+
+ def _setup(self):
+ config_file = os.path.join(self.test_root, 'zuul.conf')
+ with open(config_file, 'w') as f:
+ self.config.write(f)
+
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ time.sleep(1)
+
+ B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
+ self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ connection = self.scheds.first.sched.sql.connection
+ buildsets = connection.getBuildsets()
+ builds = connection.getBuilds()
+ self.assertEqual(len(buildsets), 2)
+ self.assertEqual(len(builds), 6)
+ for build in builds:
+ self.log.debug("Build %s %s %s",
+ build, build.start_time, build.end_time)
+ return config_file
+
+ def test_db_prune_before(self):
+ # Test pruning buildsets before a specific date
+ config_file = self._setup()
+ connection = self.scheds.first.sched.sql.connection
+
+ # Builds are reverse ordered; 0 is most recent
+ buildsets = connection.getBuildsets()
+ start_time = buildsets[0].first_build_start_time
+ self.log.debug("Cutoff %s", start_time)
+
+ p = subprocess.Popen(
+ [os.path.join(sys.prefix, 'bin/zuul-admin'),
+ '-c', config_file,
+ 'prune-database',
+ '--before', str(start_time),
+ ],
+ stdout=subprocess.PIPE)
+ out, _ = p.communicate()
+ self.log.debug(out.decode('utf8'))
+
+ buildsets = connection.getBuildsets()
+ builds = connection.getBuilds()
+ self.assertEqual(len(buildsets), 1)
+ self.assertEqual(len(builds), 3)
+ for build in builds:
+ self.log.debug("Build %s %s %s",
+ build, build.start_time, build.end_time)
+
+ def test_db_prune_older_than(self):
+ # Test pruning buildsets older than a relative time
+ config_file = self._setup()
+ connection = self.scheds.first.sched.sql.connection
+
+ # We use 0d as the relative time here since the earliest we
+ # support is 1d and that's tricky in unit tests. The
+ # prune_before test handles verifying that we don't just
+ # always delete everything.
+ p = subprocess.Popen(
+ [os.path.join(sys.prefix, 'bin/zuul-admin'),
+ '-c', config_file,
+ 'prune-database',
+ '--older-than', '0d',
+ ],
+ stdout=subprocess.PIPE)
+ out, _ = p.communicate()
+ self.log.debug(out.decode('utf8'))
+
+ buildsets = connection.getBuildsets()
+ builds = connection.getBuilds()
+ self.assertEqual(len(buildsets), 0)
+ self.assertEqual(len(builds), 0)
+
+
+class TestDBPruneMysql(DBPruneTestCase):
+ config_file = 'zuul-sql-driver-mysql.conf'
+
+
+class TestDBPrunePostgres(DBPruneTestCase):
+ config_file = 'zuul-sql-driver-postgres.conf'
diff --git a/tests/unit/test_configloader.py b/tests/unit/test_configloader.py
index 47bf0d69a..571df7550 100644
--- a/tests/unit/test_configloader.py
+++ b/tests/unit/test_configloader.py
@@ -27,7 +27,7 @@ from zuul.configloader import (
from zuul.model import Abide, MergeRequest, SourceContext
from zuul.zk.locks import tenant_read_lock
-from tests.base import ZuulTestCase
+from tests.base import iterate_timeout, ZuulTestCase
class TestConfigLoader(ZuulTestCase):
@@ -107,6 +107,135 @@ class TestTenantSimple(TenantParserTestCase):
self.assertTrue('project2-job' in
project2_config[1].pipelines['check'].job_list.jobs)
+ def test_cache(self):
+ # A full reconfiguration should issue cat jobs for all repos
+ with self.assertLogs('zuul.TenantParser', level='DEBUG') as full_logs:
+ self.scheds.execute(lambda app: app.sched.reconfigure(app.config))
+ self.waitUntilSettled()
+ self.log.debug("Full reconfigure logs:")
+ for x in full_logs.output:
+ self.log.debug(x)
+ self.assertRegexInList(
+ r'Submitting cat job (.*?) for gerrit common-config master',
+ full_logs.output)
+ self.assertRegexInList(
+ r'Submitting cat job (.*?) for gerrit org/project1 master',
+ full_logs.output)
+ self.assertRegexInList(
+ r'Submitting cat job (.*?) for gerrit org/project2 master',
+ full_logs.output)
+ self.assertRegexNotInList(
+ r'Using files from cache',
+ full_logs.output)
+
+ first = self.scheds.first
+ second = self.createScheduler()
+ second.start()
+ self.assertEqual(len(self.scheds), 2)
+ for _ in iterate_timeout(10, "until priming is complete"):
+ state_one = first.sched.local_layout_state.get("tenant-one")
+ if state_one:
+ break
+
+ for _ in iterate_timeout(
+ 10, "all schedulers to have the same layout state"):
+ if (second.sched.local_layout_state.get(
+ "tenant-one") == state_one):
+ break
+
+ self.log.debug("Freeze scheduler-1")
+ # Start the log context manager for the update test below now,
+ # so that it's already in place when we release the second
+ # scheduler lock.
+ with self.assertLogs('zuul.TenantParser', level='DEBUG'
+ ) as update_logs:
+ lock1 = second.sched.layout_update_lock
+ lock2 = second.sched.run_handler_lock
+ with lock1, lock2:
+ # A tenant reconfiguration should use the cache except for the
+ # updated project.
+ file_dict = {'zuul.d/test.yaml': ''}
+
+ # Now start a second log context manager just for the
+ # tenant reconfig test
+ with self.assertLogs('zuul.TenantParser', level='DEBUG') \
+ as tenant_logs:
+ A = self.fake_gerrit.addFakeChange(
+ 'org/project1', 'master', 'A',
+ files=file_dict)
+ A.setMerged()
+ self.fake_gerrit.addEvent(A.getChangeMergedEvent())
+ self.waitUntilSettled(matcher=[first])
+ self.log.debug("Tenant reconfigure logs:")
+ for x in tenant_logs.output:
+ self.log.debug(x)
+
+ self.assertRegexNotInList(
+ r'Submitting cat job (.*?) for '
+ r'gerrit common-config master',
+ tenant_logs.output)
+ self.assertRegexInList(
+ r'Submitting cat job (.*?) for '
+ r'gerrit org/project1 master',
+ tenant_logs.output)
+ self.assertRegexNotInList(
+ r'Submitting cat job (.*?) for '
+ r'gerrit org/project2 master',
+ tenant_logs.output)
+ self.assertRegexNotInList(
+ r'Using files from cache',
+ tenant_logs.output)
+
+ # A layout update should use the unparsed config cache
+ # except for what needs to be refreshed from the files
+ # cache in ZK.
+ self.log.debug("Thaw scheduler-1")
+ self.waitUntilSettled()
+ self.log.debug("Layout update logs:")
+ for x in update_logs.output:
+ self.log.debug(x)
+
+ self.assertRegexNotInList(
+ r'Submitting cat job',
+ update_logs.output)
+ self.assertRegexNotInList(
+ r'Using files from cache for project '
+ r'review.example.com/common-config @master.*',
+ update_logs.output)
+ self.assertRegexInList(
+ r'Using files from cache for project '
+ r'review.example.com/org/project1 @master.*',
+ update_logs.output)
+ self.assertRegexNotInList(
+ r'Using files from cache for project '
+ r'review.example.com/org/project2 @master.*',
+ update_logs.output)
+
+ def test_cache_new_branch(self):
+ first = self.scheds.first
+ lock1 = first.sched.layout_update_lock
+ lock2_ = first.sched.run_handler_lock
+ with lock1, lock2_:
+ self.create_branch('org/project1', 'stable')
+ self.fake_gerrit.addEvent(
+ self.fake_gerrit.getFakeBranchCreatedEvent(
+ 'org/project1', 'stable'))
+
+ second = self.createScheduler()
+ second.start()
+ self.assertEqual(len(self.scheds), 2)
+ for _ in iterate_timeout(10, "until priming is complete"):
+ state_one = first.sched.local_layout_state.get("tenant-one")
+ if state_one:
+ break
+
+ for _ in iterate_timeout(
+ 10, "all schedulers to have the same layout state"):
+ if (second.sched.local_layout_state.get(
+ "tenant-one") == state_one):
+ break
+ self.waitUntilSettled()
+
def test_variant_description(self):
tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
job = tenant.layout.jobs.get("project2-job")
@@ -430,6 +559,58 @@ class TestTenantUnprotectedBranches(TenantParserTestCase):
self.assertIsNone(tpc[project_name].exclude_unprotected_branches)
+class TestTenantIncludeBranches(TenantParserTestCase):
+ tenant_config_file = 'config/tenant-parser/include-branches.yaml'
+
+ def test_tenant_branches(self):
+ tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
+
+ self.assertEqual(['common-config'],
+ [x.name for x in tenant.config_projects])
+ self.assertEqual(['org/project1', 'org/project2'],
+ [x.name for x in tenant.untrusted_projects])
+
+ tpc = tenant.project_configs
+ project_name = tenant.config_projects[0].canonical_name
+ self.assertEqual(['master'], tpc[project_name].branches)
+
+ # No branches pass the filter at the start
+ project_name = tenant.untrusted_projects[0].canonical_name
+ self.assertEqual([], tpc[project_name].branches)
+
+ # Create the foo branch
+ self.create_branch('org/project1', 'foo')
+ self.fake_gerrit.addEvent(
+ self.fake_gerrit.getFakeBranchCreatedEvent(
+ 'org/project1', 'foo'))
+ self.waitUntilSettled()
+
+ # It should pass the filter
+ tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
+ tpc = tenant.project_configs
+ project_name = tenant.untrusted_projects[0].canonical_name
+ self.assertEqual(['foo'], tpc[project_name].branches)
+
+ # Create the baz branch
+ self.create_branch('org/project1', 'baz')
+ self.fake_gerrit.addEvent(
+ self.fake_gerrit.getFakeBranchCreatedEvent(
+ 'org/project1', 'baz'))
+ self.waitUntilSettled()
+
+ # It should not pass the filter
+ tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
+ tpc = tenant.project_configs
+ project_name = tenant.untrusted_projects[0].canonical_name
+ self.assertEqual(['foo'], tpc[project_name].branches)
+
+
+class TestTenantExcludeBranches(TestTenantIncludeBranches):
+ tenant_config_file = 'config/tenant-parser/exclude-branches.yaml'
+
+ # Same test results as include-branches
+
+
class TestTenantExcludeAll(TenantParserTestCase):
tenant_config_file = 'config/tenant-parser/exclude-all.yaml'
@@ -891,6 +1072,7 @@ class TestTenantExtra(TenantParserTestCase):
tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
self.assertTrue('project2-extra-file' in tenant.layout.jobs)
self.assertTrue('project2-extra-dir' in tenant.layout.jobs)
+ self.assertTrue('project6-extra-dir' in tenant.layout.jobs)
def test_dynamic_extra(self):
in_repo_conf = textwrap.dedent(
@@ -914,6 +1096,30 @@ class TestTenantExtra(TenantParserTestCase):
dict(name='project2-extra-file2', result='SUCCESS', changes='1,1'),
], ordered=False)
+ def test_dynamic_extra_dir(self):
+ in_repo_conf = textwrap.dedent(
+ """
+ - job:
+ name: project6-extra-dir2
+ parent: common-config-job
+ - project:
+ check:
+ jobs:
+ - project6-extra-dir
+ - project6-extra-dir2
+ """)
+ file_dict = {
+ 'other/extra.d/new/extra.yaml': in_repo_conf,
+ }
+ A = self.fake_gerrit.addFakeChange('org/project6', 'master', 'A',
+ files=file_dict)
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+ self.assertHistory([
+ dict(name='project6-extra-dir', result='SUCCESS', changes='1,1'),
+ dict(name='project6-extra-dir2', result='SUCCESS', changes='1,1'),
+ ], ordered=False)
+
def test_extra_reconfigure(self):
in_repo_conf = textwrap.dedent(
"""
diff --git a/tests/unit/test_connection.py b/tests/unit/test_connection.py
index d2956fa03..bae4ff258 100644
--- a/tests/unit/test_connection.py
+++ b/tests/unit/test_connection.py
@@ -73,7 +73,7 @@ class TestSQLConnectionMysql(ZuulTestCase):
buildset_table = table_prefix + 'zuul_buildset'
build_table = table_prefix + 'zuul_build'
- self.assertEqual(19, len(insp.get_columns(buildset_table)))
+ self.assertEqual(20, len(insp.get_columns(buildset_table)))
self.assertEqual(13, len(insp.get_columns(build_table)))
def test_sql_tables_created(self):
@@ -345,6 +345,115 @@ class TestSQLConnectionMysql(ZuulTestCase):
check_results()
+ def test_sql_intermittent_failure(self):
+ # Test that if we fail to create the buildset at the start of
+ # a build, we still create it at the end.
+ self.executor_server.hold_jobs_in_build = True
+
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ # Delete the buildset
+ with self.scheds.first.connections.getSqlConnection().\
+ engine.connect() as conn:
+
+ result = conn.execute(sa.text(
+ f"delete from {self.expected_table_prefix}zuul_build;"))
+ result = conn.execute(sa.text(
+ f"delete from {self.expected_table_prefix}zuul_buildset;"))
+ result = conn.execute(sa.text("commit;"))
+
+ self.executor_server.hold_jobs_in_build = False
+ self.executor_server.release()
+ self.waitUntilSettled()
+
+ # Check the results
+ tenant = self.scheds.first.sched.abide.tenants.get("tenant-one")
+ pipeline = tenant.layout.pipelines['check']
+ reporter = self.scheds.first.connections.getSqlReporter(
+ pipeline)
+
+ with self.scheds.first.connections.getSqlConnection().\
+ engine.connect() as conn:
+
+ result = conn.execute(
+ sa.sql.select([reporter.connection.zuul_buildset_table])
+ )
+
+ buildsets = result.fetchall()
+ self.assertEqual(1, len(buildsets))
+ buildset0 = buildsets[0]
+
+ buildset0_builds = conn.execute(
+ sa.sql.select(
+ [reporter.connection.zuul_build_table]
+ ).where(
+ reporter.connection.zuul_build_table.c.buildset_id ==
+ buildset0['id']
+ )
+ ).fetchall()
+
+ self.assertEqual(len(buildset0_builds), 5)
+
+ def test_sql_retry(self):
+ # Exercise the SQL retry code
+ reporter = self.scheds.first.sched.sql
+ reporter.test_buildset_retries = 0
+ reporter.test_build_retries = 0
+ reporter.retry_delay = 0
+
+ orig_createBuildset = reporter._createBuildset
+ orig_createBuild = reporter._createBuild
+
+ def _createBuildset(*args, **kw):
+ ret = orig_createBuildset(*args, **kw)
+ if reporter.test_buildset_retries == 0:
+ reporter.test_buildset_retries += 1
+ raise sa.exc.DBAPIError(None, None, None)
+ return ret
+
+ def _createBuild(*args, **kw):
+ ret = orig_createBuild(*args, **kw)
+ if reporter.test_build_retries == 0:
+ reporter.test_build_retries += 1
+ raise sa.exc.DBAPIError(None, None, None)
+ return ret
+
+ reporter._createBuildset = _createBuildset
+ reporter._createBuild = _createBuild
+
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ # Check the results
+
+ self.assertEqual(reporter.test_buildset_retries, 1)
+ self.assertEqual(reporter.test_build_retries, 1)
+
+ with self.scheds.first.connections.getSqlConnection().\
+ engine.connect() as conn:
+
+ result = conn.execute(
+ sa.sql.select([reporter.connection.zuul_buildset_table])
+ )
+
+ buildsets = result.fetchall()
+ self.assertEqual(1, len(buildsets))
+ buildset0 = buildsets[0]
+
+ buildset0_builds = conn.execute(
+ sa.sql.select(
+ [reporter.connection.zuul_build_table]
+ ).where(
+ reporter.connection.zuul_build_table.c.buildset_id ==
+ buildset0['id']
+ )
+ ).fetchall()
+
+ self.assertEqual(len(buildset0_builds), 5)
+
class TestSQLConnectionPostgres(TestSQLConnectionMysql):
config_file = 'zuul-sql-driver-postgres.conf'
@@ -572,9 +681,13 @@ class TestMQTTConnection(ZuulTestCase):
'type': 'container_image'
}}
self.executor_server.returnData(
- "test", A, {"zuul": {"log_url": "some-log-url",
- 'artifacts': [artifact],
- }}
+ "test", A, {
+ "zuul": {
+ "log_url": "some-log-url",
+ 'artifacts': [artifact],
+ },
+ 'foo': 'bar',
+ }
)
self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
self.waitUntilSettled()
@@ -594,6 +707,9 @@ class TestMQTTConnection(ZuulTestCase):
'test')
self.assertNotIn('result', mqtt_payload['buildset']['builds'][0])
self.assertNotIn('artifacts', mqtt_payload['buildset']['builds'][0])
+ builds = mqtt_payload['buildset']['builds']
+ test_job = [b for b in builds if b['job_name'] == 'test'][0]
+ self.assertNotIn('returned_data', test_job)
self.assertEquals(success_event.get('topic'),
'tenant-one/zuul_buildset/check/org/project/master')
@@ -611,6 +727,7 @@ class TestMQTTConnection(ZuulTestCase):
self.assertEquals(test_job['dependencies'], [])
self.assertEquals(test_job['artifacts'], [artifact])
self.assertEquals(test_job['log_url'], 'some-log-url/')
+ self.assertEquals(test_job['returned_data'], {'foo': 'bar'})
build_id = test_job["uuid"]
self.assertEquals(
test_job["web_url"],
@@ -740,3 +857,52 @@ class TestElasticsearchConnection(AnsibleZuulTestCase):
# Check if there is a secret leak
self.assertFalse('test_secret' in build_doc['job_vars'])
+
+
+class TestConnectionsBranchCache(ZuulTestCase):
+ config_file = "zuul-gerrit-github.conf"
+ tenant_config_file = 'config/multi-driver/main.yaml'
+
+ def test_branch_cache_fetch_error(self):
+ # Test that a fetch error stores the right value in the branch cache
+ tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
+ connection = self.scheds.first.connections.connections['github']
+ source = connection.source
+ project = source.getProject('org/project1')
+
+ # Patch the fetch method so that it fails
+ orig = connection._fetchProjectBranches
+
+ def fail(*args, **kw):
+ raise Exception("Unable to fetch branches")
+ self.patch(connection, '_fetchProjectBranches', fail)
+
+ # Clear the branch cache so we start with nothing
+ connection.clearBranchCache()
+
+ # Verify that we raise an error when we try to get branches
+ # for a missing project
+ self.assertRaises(
+ Exception,
+ lambda: connection.getProjectBranches(project, tenant))
+ # This should happen again (ie, we should retry since we don't
+ # have an entry)
+ self.assertRaises(
+ Exception,
+ lambda: connection.getProjectBranches(project, tenant))
+
+ # Restore the normal fetch method and verify that the cache
+ # works as expected
+ self.patch(connection, '_fetchProjectBranches', orig)
+ branches = connection.getProjectBranches(project, tenant)
+ self.assertEqual(['master'], branches)
+
+ # Ensure that the empty list of branches is valid and is not
+ # seen as an error
+ newproject = source.getProject('org/newproject')
+ connection.addProject(newproject)
+ tpc = zuul.model.TenantProjectConfig(newproject)
+ tpc.exclude_unprotected_branches = True
+ tenant.addUntrustedProject(tpc)
+ branches = connection.getProjectBranches(newproject, tenant)
+ self.assertEqual([], branches)
diff --git a/tests/unit/test_cross_crd.py b/tests/unit/test_cross_crd.py
index 442277f51..42d86275b 100644
--- a/tests/unit/test_cross_crd.py
+++ b/tests/unit/test_cross_crd.py
@@ -669,7 +669,7 @@ class TestGithubToGerritCRD(ZuulTestCase):
# should not be processed in dependent pipeline
self.assertFalse(A.is_merged)
self.assertEqual(B.data['status'], 'NEW')
- self.assertEqual(len(A.comments), 0)
+ self.assertEqual(len(A.comments), 1)
self.assertEqual(B.reported, 0)
self.assertEqual(len(self.history), 0)
@@ -688,7 +688,7 @@ class TestGithubToGerritCRD(ZuulTestCase):
self.waitUntilSettled()
self.assertTrue(A.is_merged)
- self.assertEqual(len(A.comments), 2)
+ self.assertEqual(len(A.comments), 3)
self.assertEqual(B.data['status'], 'MERGED')
self.assertEqual(B.reported, 0)
diff --git a/tests/unit/test_database.py b/tests/unit/test_database.py
index 60f7eea37..3453f9f72 100644
--- a/tests/unit/test_database.py
+++ b/tests/unit/test_database.py
@@ -106,6 +106,7 @@ class TestMysqlDatabase(DBBaseTestCase):
connection.exec_driver_sql(f"drop table {table}")
connection.exec_driver_sql("set foreign_key_checks=1")
+ self.connection.force_migrations = True
self.connection._migrate('c57e9e76b812')
with self.connection.engine.begin() as connection:
connection.exec_driver_sql(
@@ -122,6 +123,49 @@ class TestMysqlDatabase(DBBaseTestCase):
"select result from zuul_buildset")]
self.assertEqual(results, ['SUCCESS', 'MERGE_CONFLICT'])
+ def test_migration_c7467b642498(self):
+ with self.connection.engine.begin() as connection:
+ connection.exec_driver_sql("set foreign_key_checks=0")
+ for table in connection.exec_driver_sql("show tables"):
+ table = table[0]
+ connection.exec_driver_sql(f"drop table {table}")
+ connection.exec_driver_sql("set foreign_key_checks=1")
+
+ self.connection.force_migrations = True
+ self.connection._migrate('4647def24b32')
+ with self.connection.engine.begin() as connection:
+ connection.exec_driver_sql(
+ "insert into zuul_buildset (result) values ('SUCCESS')")
+ connection.exec_driver_sql(
+ "insert into zuul_buildset (result, first_build_start_time) "
+ "values ('SUCCESS', '2022-05-01 12:34:56')")
+ connection.exec_driver_sql(
+ "insert into zuul_buildset (result, last_build_end_time) "
+ "values ('SUCCESS', '2022-05-02 12:34:56')")
+ connection.exec_driver_sql(
+ "insert into zuul_buildset (result, event_timestamp) "
+ "values ('SUCCESS', '2022-05-03 12:34:56')")
+ connection.exec_driver_sql(
+ "insert into zuul_buildset (result, "
+ "first_build_start_time, "
+ "last_build_end_time, "
+ "event_timestamp)"
+ "values ('SUCCESS', "
+ "'2022-05-11 12:34:56', "
+ "'2022-05-12 12:34:56', "
+ "'2022-05-13 12:34:56')")
+
+ self.connection._migrate()
+ with self.connection.engine.begin() as connection:
+ results = [str(r[0]) for r in connection.exec_driver_sql(
+ "select updated from zuul_buildset")]
+ self.assertEqual(results,
+ ['1970-01-01 00:00:00',
+ '2022-05-01 12:34:56',
+ '2022-05-02 12:34:56',
+ '2022-05-03 12:34:56',
+ '2022-05-13 12:34:56'])
+
def test_buildsets(self):
tenant = 'tenant1',
buildset_uuid = 'deadbeef'
diff --git a/tests/unit/test_executor.py b/tests/unit/test_executor.py
index d18cf4448..31e3b74c5 100644
--- a/tests/unit/test_executor.py
+++ b/tests/unit/test_executor.py
@@ -838,8 +838,10 @@ class TestLineMapping(AnsibleZuulTestCase):
)
-class TestExecutorFacts(AnsibleZuulTestCase):
+class ExecutorFactsMixin:
+ # These should be overridden in child classes.
tenant_config_file = 'config/executor-facts/main.yaml'
+ ansible_major_minor = 'X.Y'
def _get_file(self, build, path):
p = os.path.join(build.jobdir.root, path)
@@ -861,12 +863,29 @@ class TestExecutorFacts(AnsibleZuulTestCase):
date_time = \
j[0]['plays'][0]['tasks'][0]['hosts']['localhost']['date_time']
self.assertEqual(18, len(date_time))
+ build = self.getJobFromHistory('datetime-fact', result='SUCCESS')
+ with open(build.jobdir.job_output_file) as f:
+ output = f.read()
+ self.assertIn(f'Ansible version={self.ansible_major_minor}',
+ output)
-class TestAnsibleCallbackConfigs(AnsibleZuulTestCase):
+class TestExecutorFacts5(AnsibleZuulTestCase, ExecutorFactsMixin):
+ tenant_config_file = 'config/executor-facts/main5.yaml'
+ ansible_major_minor = '2.12'
+
+class TestExecutorFacts6(AnsibleZuulTestCase, ExecutorFactsMixin):
+ tenant_config_file = 'config/executor-facts/main6.yaml'
+ ansible_major_minor = '2.13'
+
+
+class AnsibleCallbackConfigsMixin:
config_file = 'zuul-executor-ansible-callback.conf'
+
+ # These should be overridden in child classes.
tenant_config_file = 'config/ansible-callbacks/main.yaml'
+ ansible_major_minor = 'X.Y'
def test_ansible_callback_config(self):
self.executor_server.keep_jobdir = True
@@ -905,6 +924,25 @@ class TestAnsibleCallbackConfigs(AnsibleZuulTestCase):
'common-config/playbooks/callback_plugins/',
c['callback_test_callback']['file_name'])
self.assertTrue(os.path.isfile(callback_result_file))
+ build = self.getJobFromHistory('callback-test', result='SUCCESS')
+ with open(build.jobdir.job_output_file) as f:
+ output = f.read()
+ self.assertIn(f'Ansible version={self.ansible_major_minor}',
+ output)
+
+
+class TestAnsibleCallbackConfigs5(AnsibleZuulTestCase,
+ AnsibleCallbackConfigsMixin):
+ config_file = 'zuul-executor-ansible-callback.conf'
+ tenant_config_file = 'config/ansible-callbacks/main5.yaml'
+ ansible_major_minor = '2.12'
+
+
+class TestAnsibleCallbackConfigs6(AnsibleZuulTestCase,
+ AnsibleCallbackConfigsMixin):
+ config_file = 'zuul-executor-ansible-callback.conf'
+ tenant_config_file = 'config/ansible-callbacks/main6.yaml'
+ ansible_major_minor = '2.13'
class TestExecutorEnvironment(AnsibleZuulTestCase):
diff --git a/tests/unit/test_gerrit.py b/tests/unit/test_gerrit.py
index 23a6a0cb5..e98cb80b5 100644
--- a/tests/unit/test_gerrit.py
+++ b/tests/unit/test_gerrit.py
@@ -13,6 +13,7 @@
# under the License.
import os
+import threading
import textwrap
from unittest import mock
@@ -148,6 +149,25 @@ class TestGerrit(BaseTestCase):
'ssh://gerrit@localhost:29418/org/project',
url)
+ def test_ssh_server_getGitURL(self):
+ gerrit_config = {
+ 'user': 'gerrit',
+ 'server': 'otherserver',
+ 'password': '1/badpassword',
+ 'ssh_server': 'localhost',
+ 'git_over_ssh': 'true',
+ }
+ # The 1/ in the password ensures we test the url encoding
+ # path; this is the format of password we get from
+ # googlesource.com.
+ driver = GerritDriver()
+ gerrit = GerritConnection(driver, 'review_gerrit', gerrit_config)
+ project = gerrit.source.getProject('org/project')
+ url = gerrit.source.getGitUrl(project)
+ self.assertEqual(
+ 'ssh://gerrit@localhost:29418/org/project',
+ url)
+
class TestGerritWeb(ZuulTestCase):
config_file = 'zuul-gerrit-web.conf'
@@ -297,6 +317,67 @@ class TestGerritWeb(ZuulTestCase):
self.waitUntilSettled()
self.assertEqual(9, len(self.history))
+ def test_submitted_together_git(self):
+ # This tests that the circular dependency handling for submit
+ # whole topic doesn't activate for changes which are only in a
+ # git dependency.
+ A = self.fake_gerrit.addFakeChange('org/project1', "master", "A")
+ B = self.fake_gerrit.addFakeChange('org/project1', "master", "B")
+ C = self.fake_gerrit.addFakeChange('org/project1', "master", "C")
+ D = self.fake_gerrit.addFakeChange('org/project1', "master", "D")
+ E = self.fake_gerrit.addFakeChange('org/project1', "master", "E")
+ F = self.fake_gerrit.addFakeChange('org/project1', "master", "F")
+ G = self.fake_gerrit.addFakeChange('org/project1', "master", "G")
+ G.setDependsOn(F, 1)
+ F.setDependsOn(E, 1)
+ E.setDependsOn(D, 1)
+ D.setDependsOn(C, 1)
+ C.setDependsOn(B, 1)
+ B.setDependsOn(A, 1)
+
+ self.fake_gerrit.addEvent(C.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertEqual(len(C.patchsets[-1]["approvals"]), 1)
+ self.assertEqual(C.patchsets[-1]["approvals"][0]["type"], "Verified")
+ self.assertEqual(C.patchsets[-1]["approvals"][0]["value"], "1")
+ self.assertEqual(A.queried, 1)
+ self.assertEqual(B.queried, 1)
+ self.assertEqual(C.queried, 1)
+ self.assertEqual(D.queried, 1)
+ self.assertEqual(E.queried, 1)
+ self.assertEqual(F.queried, 1)
+ self.assertEqual(G.queried, 1)
+ self.assertHistory([
+ dict(name="project-merge", result="SUCCESS",
+ changes="1,1 2,1 3,1"),
+ dict(name="project-test1", result="SUCCESS",
+ changes="1,1 2,1 3,1"),
+ dict(name="project-test2", result="SUCCESS",
+ changes="1,1 2,1 3,1"),
+ dict(name="project1-project2-integration", result="SUCCESS",
+ changes="1,1 2,1 3,1"),
+ ], ordered=False)
+
+ def test_submit_failure(self):
+ # Test that we log the reason for a submit failure (403 error)
+ self.fake_gerrit._fake_submit_permission = False
+ A = self.fake_gerrit.addFakeChange('org/project1', "master", "A")
+ A.addApproval('Code-Review', 2)
+ with self.assertLogs('zuul.test.FakeGerritConnection', level='INFO'
+ ) as full_logs:
+ self.fake_gerrit.addEvent(A.addApproval('Approved', 1))
+ self.waitUntilSettled()
+ self.log.debug("Full logs:")
+ for x in full_logs.output:
+ self.log.debug(x)
+ self.assertRegexInList(
+ r'Error submitting data to gerrit on attempt 3: '
+ 'Received response 403: submit not permitted',
+ full_logs.output)
+
+ self.assertEqual(A.data['status'], 'NEW')
+
class TestFileComments(AnsibleZuulTestCase):
config_file = 'zuul-gerrit-web.conf'
@@ -638,6 +719,7 @@ class TestPolling(ZuulTestCase):
files=file_dict)
A.setMerged()
self.waitForPoll('gerrit')
+ self.waitUntilSettled()
B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
B.setCheck('zuul:check', reset=True)
@@ -725,3 +807,139 @@ class TestWrongConnection(ZuulTestCase):
dict(name='test-job', result='SUCCESS', changes='1,1'),
dict(name='test-job', result='SUCCESS', changes='2,1'),
], ordered=False)
+
+
+class TestGerritFake(ZuulTestCase):
+ config_file = "zuul-gerrit-github.conf"
+ tenant_config_file = "config/circular-dependencies/main.yaml"
+
+ def _get_tuple(self, change_number):
+ ret = []
+ data = self.fake_gerrit.get(
+ f'changes/{change_number}/submitted_together')
+ for c in data:
+ dep_change = c['_number']
+ dep_ps = c['revisions'][c['current_revision']]['_number']
+ ret.append((dep_change, dep_ps))
+ return sorted(ret)
+
+ def test_submitted_together_normal(self):
+ # Test that the fake submitted together endpoint returns
+ # expected data
+
+ # This test verifies behavior with submitWholeTopic=False
+
+ # A single change
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
+ data = self._get_tuple(1)
+ self.assertEqual(data, [])
+ ret = self.fake_gerrit._getSubmittedTogether(A, None)
+ self.assertEqual(ret, [])
+
+ # A dependent series (B->A)
+ B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
+ B.setDependsOn(A, 1)
+ data = self._get_tuple(2)
+ self.assertEqual(data, [(1, 1), (2, 1)])
+ # The Gerrit connection method filters out the queried change
+ ret = self.fake_gerrit._getSubmittedTogether(B, None)
+ self.assertEqual(ret, [(1, 1)])
+
+ # A topic cycle
+ C1 = self.fake_gerrit.addFakeChange('org/project', 'master', 'C1',
+ topic='test-topic')
+ self.fake_gerrit.addFakeChange('org/project', 'master', 'C2',
+ topic='test-topic')
+ data = self._get_tuple(3)
+ self.assertEqual(data, [])
+ ret = self.fake_gerrit._getSubmittedTogether(C1, None)
+ self.assertEqual(ret, [])
+
+ def test_submitted_together_whole_topic(self):
+ # Test that the fake submitted together endpoint returns
+ # expected data
+
+ # This test verifies behavior with submitWholeTopic=True
+ self.fake_gerrit._fake_submit_whole_topic = True
+
+ # A single change
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
+ data = self._get_tuple(1)
+ self.assertEqual(data, [])
+ ret = self.fake_gerrit._getSubmittedTogether(A, None)
+ self.assertEqual(ret, [])
+
+ # A dependent series (B->A)
+ B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
+ B.setDependsOn(A, 1)
+ data = self._get_tuple(2)
+ self.assertEqual(data, [(1, 1), (2, 1)])
+ # The Gerrit connection method filters out the queried change
+ ret = self.fake_gerrit._getSubmittedTogether(B, None)
+ self.assertEqual(ret, [(1, 1)])
+
+ # A topic cycle
+ C1 = self.fake_gerrit.addFakeChange('org/project', 'master', 'C1',
+ topic='test-topic')
+ self.fake_gerrit.addFakeChange('org/project', 'master', 'C2',
+ topic='test-topic')
+ data = self._get_tuple(3)
+ self.assertEqual(data, [(3, 1), (4, 1)])
+ # The Gerrit connection method filters out the queried change
+ ret = self.fake_gerrit._getSubmittedTogether(C1, None)
+ self.assertEqual(ret, [(4, 1)])
+
+
+class TestGerritConnection(ZuulTestCase):
+ config_file = 'zuul-gerrit-web.conf'
+ tenant_config_file = 'config/single-tenant/main.yaml'
+
+ def test_zuul_query_ltime(self):
+ # Add a lock around the event queue iterator so that we can
+ # ensure that multiple events arrive before the first is
+ # processed.
+ lock = threading.Lock()
+
+ orig_iterEvents = self.fake_gerrit.gerrit_event_connector.\
+ event_queue._iterEvents
+
+ def _iterEvents(*args, **kw):
+ with lock:
+ return orig_iterEvents(*args, **kw)
+
+ self.patch(self.fake_gerrit.gerrit_event_connector.event_queue,
+ '_iterEvents', _iterEvents)
+
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
+ B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
+ B.setDependsOn(A, 1)
+ # Hold the connection queue processing so these events get
+ # processed together
+ with lock:
+ self.fake_gerrit.addEvent(A.addApproval('Code-Review', 2))
+ self.fake_gerrit.addEvent(B.addApproval('Approved', 1))
+ self.fake_gerrit.addEvent(B.addApproval('Code-Review', 2))
+ self.waitUntilSettled()
+ self.assertHistory([])
+ # One query for each change in the above cluster of events.
+ self.assertEqual(A.queried, 1)
+ self.assertEqual(B.queried, 1)
+ self.fake_gerrit.addEvent(A.addApproval('Approved', 1))
+ self.waitUntilSettled()
+ self.assertHistory([
+ dict(name="project-merge", result="SUCCESS", changes="1,1"),
+ dict(name="project-test1", result="SUCCESS", changes="1,1"),
+ dict(name="project-test2", result="SUCCESS", changes="1,1"),
+ dict(name="project-merge", result="SUCCESS", changes="1,1 2,1"),
+ dict(name="project-test1", result="SUCCESS", changes="1,1 2,1"),
+ dict(name="project-test2", result="SUCCESS", changes="1,1 2,1"),
+ ], ordered=False)
+ # One query due to the event on change A, followed by a query
+ # to verify the merge.
+ self.assertEqual(A.queried, 3)
+ # No query for change B necessary since our cache is up to
+ # date with respect for the triggering event. One query to
+ # verify the merge.
+ self.assertEqual(B.queried, 2)
+ self.assertEqual(A.data['status'], 'MERGED')
+ self.assertEqual(B.data['status'], 'MERGED')
diff --git a/tests/unit/test_gerrit_crd.py b/tests/unit/test_gerrit_crd.py
index d92566684..0b0ca86fe 100644
--- a/tests/unit/test_gerrit_crd.py
+++ b/tests/unit/test_gerrit_crd.py
@@ -253,7 +253,7 @@ class TestGerritCRD(ZuulTestCase):
self.assertEqual(A.data['status'], 'NEW')
self.assertEqual(B.data['status'], 'NEW')
- self.assertEqual(A.reported, 0)
+ self.assertEqual(A.reported, 1)
self.assertEqual(B.reported, 0)
self.assertEqual(len(self.history), 0)
@@ -270,7 +270,7 @@ class TestGerritCRD(ZuulTestCase):
self.waitUntilSettled()
self.assertEqual(A.data['status'], 'MERGED')
- self.assertEqual(A.reported, 2)
+ self.assertEqual(A.reported, 3)
def _test_crd_gate_reverse(self, url_fmt):
"Test reverse cross-repo dependencies"
@@ -369,7 +369,7 @@ class TestGerritCRD(ZuulTestCase):
# should not be processed in dependent pipeline
self.assertEqual(A.data['status'], 'NEW')
self.assertEqual(B.data['status'], 'NEW')
- self.assertEqual(A.reported, 0)
+ self.assertEqual(A.reported, 1)
self.assertEqual(B.reported, 0)
self.assertEqual(len(self.history), 0)
@@ -388,7 +388,7 @@ class TestGerritCRD(ZuulTestCase):
self.waitUntilSettled()
self.assertEqual(A.data['status'], 'MERGED')
- self.assertEqual(A.reported, 2)
+ self.assertEqual(A.reported, 3)
self.assertEqual(B.data['status'], 'MERGED')
self.assertEqual(B.reported, 0)
diff --git a/tests/unit/test_gerrit_legacy_crd.py b/tests/unit/test_gerrit_legacy_crd.py
index 5c3e868f9..60616b6cf 100644
--- a/tests/unit/test_gerrit_legacy_crd.py
+++ b/tests/unit/test_gerrit_legacy_crd.py
@@ -194,7 +194,7 @@ class TestGerritLegacyCRD(ZuulTestCase):
self.assertEqual(A.data['status'], 'NEW')
self.assertEqual(B.data['status'], 'NEW')
- self.assertEqual(A.reported, 0)
+ self.assertEqual(A.reported, 1)
self.assertEqual(B.reported, 0)
self.assertEqual(len(self.history), 0)
@@ -211,7 +211,7 @@ class TestGerritLegacyCRD(ZuulTestCase):
self.waitUntilSettled()
self.assertEqual(A.data['status'], 'MERGED')
- self.assertEqual(A.reported, 2)
+ self.assertEqual(A.reported, 3)
def test_crd_gate_reverse(self):
"Test reverse cross-repo dependencies"
@@ -298,7 +298,7 @@ class TestGerritLegacyCRD(ZuulTestCase):
# should not be processed in dependent pipeline
self.assertEqual(A.data['status'], 'NEW')
self.assertEqual(B.data['status'], 'NEW')
- self.assertEqual(A.reported, 0)
+ self.assertEqual(A.reported, 1)
self.assertEqual(B.reported, 0)
self.assertEqual(len(self.history), 0)
@@ -317,7 +317,7 @@ class TestGerritLegacyCRD(ZuulTestCase):
self.waitUntilSettled()
self.assertEqual(A.data['status'], 'MERGED')
- self.assertEqual(A.reported, 2)
+ self.assertEqual(A.reported, 3)
self.assertEqual(B.data['status'], 'MERGED')
self.assertEqual(B.reported, 0)
diff --git a/tests/unit/test_github_driver.py b/tests/unit/test_github_driver.py
index f8c693e0e..49dae0ccb 100644
--- a/tests/unit/test_github_driver.py
+++ b/tests/unit/test_github_driver.py
@@ -23,12 +23,14 @@ import textwrap
from unittest import mock, skip
import git
+import gitdb
import github3.exceptions
from tests.fakegithub import FakeFile, FakeGithubEnterpriseClient
from zuul.driver.github.githubconnection import GithubShaCache
from zuul.zk.layout import LayoutState
from zuul.lib import strings
+from zuul.merger.merger import Repo
from zuul.model import MergeRequest, EnqueueEvent, DequeueEvent
from tests.base import (AnsibleZuulTestCase, BaseTestCase,
@@ -36,7 +38,7 @@ from tests.base import (AnsibleZuulTestCase, BaseTestCase,
simple_layout, random_sha1)
from tests.base import ZuulWebFixture
-EMPTY_LAYOUT_STATE = LayoutState("", "", 0, None, {})
+EMPTY_LAYOUT_STATE = LayoutState("", "", 0, None, {}, -1)
class TestGithubDriver(ZuulTestCase):
@@ -172,6 +174,40 @@ class TestGithubDriver(ZuulTestCase):
])
@simple_layout('layouts/files-github.yaml', driver='github')
+ def test_changed_file_match_filter(self):
+ path = os.path.join(self.upstream_root, 'org/project')
+ base_sha = git.Repo(path).head.object.hexsha
+
+ files = {'{:03d}.txt'.format(n): 'test' for n in range(300)}
+ files["foobar-requires"] = "test"
+ files["to-be-removed"] = "test"
+ A = self.fake_github.openFakePullRequest(
+ 'org/project', 'master', 'A', files=files, base_sha=base_sha)
+
+ self.fake_github.emitEvent(A.getPullRequestOpenedEvent())
+ self.waitUntilSettled()
+ # project-test1 and project-test2 should be run
+ self.assertEqual(2, len(self.history))
+
+ @simple_layout('layouts/files-github.yaml', driver='github')
+ def test_changed_and_reverted_file_not_match_filter(self):
+ path = os.path.join(self.upstream_root, 'org/project')
+ base_sha = git.Repo(path).head.object.hexsha
+
+ files = {'{:03d}.txt'.format(n): 'test' for n in range(300)}
+ files["foobar-requires"] = "test"
+ files["to-be-removed"] = "test"
+ A = self.fake_github.openFakePullRequest(
+ 'org/project', 'master', 'A', files=files, base_sha=base_sha)
+ A.addCommit(delete_files=['to-be-removed'])
+
+ self.fake_github.emitEvent(A.getPullRequestOpenedEvent())
+ self.waitUntilSettled()
+ # Only project-test1 should be run, because the file to-be-removed
+ # is reverted and not in changed files to trigger project-test2
+ self.assertEqual(1, len(self.history))
+
+ @simple_layout('layouts/files-github.yaml', driver='github')
def test_pull_file_rename(self):
A = self.fake_github.openFakePullRequest(
'org/project', 'master', 'A', files={
@@ -1120,6 +1156,55 @@ class TestGithubDriver(ZuulTestCase):
# the change should have entered the gate
self.assertEqual(2, len(self.history))
+ @simple_layout('layouts/gate-github.yaml', driver='github')
+ def test_status_checks_removal(self):
+ github = self.fake_github.getGithubClient()
+ repo = github.repo_from_project('org/project')
+ repo._set_branch_protection(
+ 'master', contexts=['something/check', 'tenant-one/gate'])
+
+ A = self.fake_github.openFakePullRequest('org/project', 'master', 'A')
+ self.fake_github.emitEvent(A.getPullRequestOpenedEvent())
+ self.waitUntilSettled()
+
+ self.executor_server.hold_jobs_in_build = True
+ # Since the required status 'something/check' is not fulfilled,
+ # no job is expected
+ self.assertEqual(0, len(self.builds))
+ self.assertEqual(0, len(self.history))
+
+ # Set the required status 'something/check'
+ repo.create_status(A.head_sha, 'success', 'example.com', 'description',
+ 'something/check')
+
+ self.fake_github.emitEvent(A.getPullRequestOpenedEvent())
+ self.waitUntilSettled()
+ self.assertEqual(2, len(self.builds))
+ self.assertEqual(0, len(self.history))
+
+ # Remove it and verify the change is dequeued.
+ repo.create_status(A.head_sha, 'failed', 'example.com', 'description',
+ 'something/check')
+ self.fake_github.emitEvent(A.getCommitStatusEvent('something/check',
+ state='failed',
+ user='foo'))
+ self.waitUntilSettled()
+
+ self.executor_server.hold_jobs_in_build = False
+ self.executor_server.release()
+ self.waitUntilSettled()
+
+ # The change should be dequeued.
+ self.assertHistory([
+ dict(name='project-test1', result='ABORTED'),
+ dict(name='project-test2', result='ABORTED'),
+ ], ordered=False)
+ self.assertEqual(1, len(A.comments))
+ self.assertFalse(A.is_merged)
+ self.assertIn('This change is unable to merge '
+ 'due to a missing merge requirement.',
+ A.comments[0])
+
# This test case verifies that no reconfiguration happens if a branch was
# deleted that didn't contain configuration.
@simple_layout('layouts/basic-github.yaml', driver='github')
@@ -1299,7 +1384,7 @@ class TestGithubDriver(ZuulTestCase):
# now check if the merge was done via rebase
merges = [report for report in self.fake_github.github_data.reports
if report[2] == 'merge']
- assert(len(merges) == 1 and merges[0][3] == 'squash')
+ assert (len(merges) == 1 and merges[0][3] == 'squash')
@simple_layout('layouts/basic-github.yaml', driver='github')
def test_invalid_event(self):
@@ -1656,6 +1741,53 @@ class TestGithubUnprotectedBranches(ZuulTestCase):
new_sha='0' * 40,
removed_files=['zuul.yaml'])
+ def test_branch_protection_rule_update(self):
+ """Test the branch_protection_rule event"""
+ github = self.fake_github.getGithubClient()
+ repo = github.repo_from_project('org/project2')
+
+ github_connection = self.scheds.first.connections.connections['github']
+ tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
+ project = github_connection.source.getProject('org/project2')
+
+ # The repo starts without branch protection, and Zuul is
+ # configured to exclude unprotected branches, so we should see
+ # no branches.
+ branches = github_connection.getProjectBranches(project, tenant)
+ self.assertEqual(branches, [])
+ tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
+ prev_layout = tenant.layout.uuid
+
+ # Add a rule to the master branch
+ repo._set_branch_protection('master', True)
+ self.fake_github.emitEvent(
+ self.fake_github.getBranchProtectionRuleEvent(
+ 'org/project2', 'created'))
+ self.waitUntilSettled()
+
+ # Verify that it shows up
+ branches = github_connection.getProjectBranches(project, tenant)
+ self.assertEqual(branches, ['master'])
+ tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
+ new_layout = tenant.layout.uuid
+ self.assertNotEqual(new_layout, prev_layout)
+ prev_layout = new_layout
+
+ # Remove the rule
+ repo._set_branch_protection('master', False)
+ self.fake_github.emitEvent(
+ self.fake_github.getBranchProtectionRuleEvent(
+ 'org/project2', 'deleted'))
+ self.waitUntilSettled()
+
+ # Verify it's gone again
+ branches = github_connection.getProjectBranches(project, tenant)
+ self.assertEqual(branches, [])
+ tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
+ new_layout = tenant.layout.uuid
+ self.assertNotEqual(new_layout, prev_layout)
+ prev_layout = new_layout
+
class TestGithubWebhook(ZuulTestCase):
config_file = 'zuul-github-driver.conf'
@@ -2277,7 +2409,7 @@ class TestCheckRunAnnotations(ZuulGithubAppTestCase, AnsibleZuulTestCase):
})
-class TestGithubDriverEnterise(ZuulGithubAppTestCase):
+class TestGithubDriverEnterprise(ZuulGithubAppTestCase):
config_file = 'zuul-github-driver-enterprise.conf'
scheduler_count = 1
@@ -2315,7 +2447,7 @@ class TestGithubDriverEnterise(ZuulGithubAppTestCase):
self.assertEqual(len(A.comments), 0)
-class TestGithubDriverEnteriseLegacy(ZuulGithubAppTestCase):
+class TestGithubDriverEnterpriseLegacy(ZuulGithubAppTestCase):
config_file = 'zuul-github-driver-enterprise.conf'
scheduler_count = 1
@@ -2355,3 +2487,103 @@ class TestGithubDriverEnteriseLegacy(ZuulGithubAppTestCase):
r'.*I shouldnt be seen.*',
re.DOTALL)))
self.assertEqual(len(A.comments), 0)
+
+
+class TestGithubDriverEnterpriseCache(ZuulGithubAppTestCase):
+ config_file = 'zuul-github-driver-enterprise.conf'
+ scheduler_count = 1
+
+ def setup_config(self, config_file):
+ self.upstream_cache_root = self.upstream_root + '-cache'
+ config = super().setup_config(config_file)
+ # This adds the GHE repository cache feature
+ config.set('connection github', 'repo_cache', self.upstream_cache_root)
+ config.set('connection github', 'repo_retry_timeout', '30')
+ # Synchronize the upstream repos to the upstream repo cache
+ self.synchronize_repo('org/common-config')
+ self.synchronize_repo('org/project')
+ return config
+
+ def init_repo(self, project, tag=None):
+ super().init_repo(project, tag)
+ # After creating the upstream repo, also create the empty
+ # cache repo (but unsynchronized for now)
+ parts = project.split('/')
+ path = os.path.join(self.upstream_cache_root, *parts[:-1])
+ if not os.path.exists(path):
+ os.makedirs(path)
+ path = os.path.join(self.upstream_cache_root, project)
+ repo = git.Repo.init(path)
+
+ with repo.config_writer() as config_writer:
+ config_writer.set_value('user', 'email', 'user@example.com')
+ config_writer.set_value('user', 'name', 'User Name')
+
+ def synchronize_repo(self, project):
+ # Synchronize the upstream repo to the cache
+ upstream_path = os.path.join(self.upstream_root, project)
+ upstream = git.Repo(upstream_path)
+
+ cache_path = os.path.join(self.upstream_cache_root, project)
+ cache = git.Repo(cache_path)
+
+ refs = upstream.git.for_each_ref(
+ '--format=%(objectname) %(refname)'
+ )
+ for ref in refs.splitlines():
+ parts = ref.split(" ")
+ if len(parts) == 2:
+ commit, ref = parts
+ else:
+ continue
+
+ self.log.debug("Synchronize ref %s: %s", ref, commit)
+ cache.git.fetch(upstream_path, ref)
+ binsha = gitdb.util.to_bin_sha(commit)
+ obj = git.objects.Object.new_from_sha(cache, binsha)
+ git.refs.Reference.create(cache, ref, obj, force=True)
+
+ @simple_layout('layouts/merging-github.yaml', driver='github')
+ def test_github_repo_cache(self):
+ # Test that we fetch and configure retries correctly when
+ # using a github enterprise repo cache (the cache can be
+ # slightly out of sync).
+ github = self.fake_github.getGithubClient()
+ repo = github.repo_from_project('org/project')
+ repo._set_branch_protection('master', require_review=True)
+
+ # Make sure we have correctly overridden the retry attempts
+ merger = self.executor_server.merger
+ repo = merger.getRepo('github', 'org/project')
+ self.assertEqual(repo.retry_attempts, 1)
+
+ # Our initial attempt should fail; make it happen quickly
+ self.patch(Repo, 'retry_interval', 1)
+
+ # pipeline merges the pull request on success
+ A = self.fake_github.openFakePullRequest('org/project', 'master',
+ 'PR title',
+ body='I shouldnt be seen',
+ body_text='PR body')
+
+ A.addReview('user', 'APPROVED')
+ self.fake_github.emitEvent(A.getCommentAddedEvent('merge me'))
+ self.waitUntilSettled('initial failed attempt')
+
+ self.assertFalse(A.is_merged)
+
+ # Now synchronize the upstream repo to the cache and try again
+ self.synchronize_repo('org/project')
+
+ self.fake_github.emitEvent(A.getCommentAddedEvent('merge me'))
+ self.waitUntilSettled('second successful attempt')
+
+ self.assertTrue(A.is_merged)
+
+ self.assertThat(A.merge_message,
+ MatchesRegex(r'.*PR title\n\nPR body.*', re.DOTALL))
+ self.assertThat(A.merge_message,
+ Not(MatchesRegex(
+ r'.*I shouldnt be seen.*',
+ re.DOTALL)))
+ self.assertEqual(len(A.comments), 0)
diff --git a/tests/unit/test_gitlab_driver.py b/tests/unit/test_gitlab_driver.py
index 84c1744df..6c4d4eeb9 100644
--- a/tests/unit/test_gitlab_driver.py
+++ b/tests/unit/test_gitlab_driver.py
@@ -28,7 +28,7 @@ from tests.base import ZuulTestCase, ZuulWebFixture
from testtools.matchers import MatchesRegex
-EMPTY_LAYOUT_STATE = LayoutState("", "", 0, None, {})
+EMPTY_LAYOUT_STATE = LayoutState("", "", 0, None, {}, -1)
class TestGitlabWebhook(ZuulTestCase):
@@ -665,6 +665,22 @@ class TestGitlabDriver(ZuulTestCase):
self.getJobFromHistory('project-test').result)
self.assertEqual('merged', A.state)
+ @simple_layout('layouts/merging-gitlab-squash-merge.yaml', driver='gitlab')
+ def test_merge_squash(self):
+
+ A = self.fake_gitlab.openFakeMergeRequest(
+ 'org/project1', 'master', 'A')
+
+ self.fake_gitlab.emitEvent(A.getMergeRequestOpenedEvent())
+ self.waitUntilSettled()
+ # canMerge is validated
+ self.assertEqual(1, len(self.history))
+
+ self.assertEqual('SUCCESS',
+ self.getJobFromHistory('project-test').result)
+ self.assertEqual('merged', A.state)
+ self.assertTrue(A.squash_merge)
+
@simple_layout('layouts/crd-gitlab.yaml', driver='gitlab')
def test_crd_dependent(self):
@@ -791,6 +807,40 @@ class TestGitlabDriver(ZuulTestCase):
self.assertEqual("http://tokenname5:555@gitlabfivvve/org/project1.git",
project_git_url)
+ @simple_layout('layouts/files-gitlab.yaml', driver='gitlab')
+ def test_changed_file_match_filter(self):
+ path = os.path.join(self.upstream_root, 'org/project')
+ base_sha = git.Repo(path).head.object.hexsha
+
+ files = {'{:03d}.txt'.format(n): 'test' for n in range(300)}
+ files["foobar-requires"] = "test"
+ files["to-be-removed"] = "test"
+ A = self.fake_gitlab.openFakeMergeRequest(
+ 'org/project', 'master', 'A', files=files, base_sha=base_sha)
+
+ self.fake_gitlab.emitEvent(A.getMergeRequestOpenedEvent())
+ self.waitUntilSettled()
+ # project-test1 and project-test2 should be run
+ self.assertEqual(2, len(self.history))
+
+ @simple_layout('layouts/files-gitlab.yaml', driver='gitlab')
+ def test_changed_and_reverted_file_not_match_filter(self):
+ path = os.path.join(self.upstream_root, 'org/project')
+ base_sha = git.Repo(path).head.object.hexsha
+
+ files = {'{:03d}.txt'.format(n): 'test' for n in range(300)}
+ files["foobar-requires"] = "test"
+ files["to-be-removed"] = "test"
+ A = self.fake_gitlab.openFakeMergeRequest(
+ 'org/project', 'master', 'A', files=files, base_sha=base_sha)
+ A.addCommit(delete_files=['to-be-removed'])
+
+ self.fake_gitlab.emitEvent(A.getMergeRequestOpenedEvent())
+ self.waitUntilSettled()
+ # Only project-test1 should be run, because the file to-be-removed
+ # is reverted and not in changed files to trigger project-test2
+ self.assertEqual(1, len(self.history))
+
class TestGitlabUnprotectedBranches(ZuulTestCase):
config_file = 'zuul-gitlab-driver.conf'
diff --git a/tests/unit/test_global_semaphores.py b/tests/unit/test_global_semaphores.py
new file mode 100644
index 000000000..b76f9d812
--- /dev/null
+++ b/tests/unit/test_global_semaphores.py
@@ -0,0 +1,169 @@
+# Copyright 2022 Acme Gating, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import zuul.configloader
+
+from tests.base import ZuulTestCase
+
+
+class TestGlobalSemaphoresConfig(ZuulTestCase):
+ tenant_config_file = 'config/global-semaphores-config/main.yaml'
+
+ def assertSemaphores(self, tenant, semaphores):
+ for k, v in semaphores.items():
+ self.assertEqual(
+ len(tenant.semaphore_handler.semaphoreHolders(k)),
+ v, k)
+
+ def assertSemaphoresMax(self, tenant, semaphores):
+ for k, v in semaphores.items():
+ abide = tenant.semaphore_handler.abide
+ semaphore = tenant.layout.getSemaphore(abide, k)
+ self.assertEqual(semaphore.max, v, k)
+
+ def test_semaphore_scope(self):
+ # This tests global and tenant semaphore scope
+ self.executor_server.hold_jobs_in_build = True
+ tenant1 = self.scheds.first.sched.abide.tenants.get('tenant-one')
+ tenant2 = self.scheds.first.sched.abide.tenants.get('tenant-two')
+ tenant3 = self.scheds.first.sched.abide.tenants.get('tenant-three')
+
+ # The different max values will tell us that we have the right
+ # semaphore objects. Each tenant has one tenant-scope
+ # semaphore in a tenant-specific project, and one tenant-scope
+ # semaphore with a common definition. Tenants 1 and 2 share a
+ # global-scope semaphore, and tenant 3 has a tenant-scope
+ # semaphore with the same name.
+
+ # Here is what is defined in each tenant:
+ # Tenant-one:
+ # * global-semaphore: scope:global max:100 definition:main.yaml
+ # * common-semaphore: scope:tenant max:10 definition:common-config
+ # * project1-semaphore: scope:tenant max:11 definition:project1
+ # * (global-semaphore): scope:tenant max:2 definition:project1
+ # [unused since it shadows the actual global-semaphore]
+ # Tenant-two:
+ # * global-semaphore: scope:global max:100 definition:main.yaml
+ # * common-semaphore: scope:tenant max:10 definition:common-config
+ # * project2-semaphore: scope:tenant max:12 definition:project2
+ # Tenant-three:
+ # * global-semaphore: scope:global max:999 definition:project3
+ # * common-semaphore: scope:tenant max:10 definition:common-config
+ # * project3-semaphore: scope:tenant max:13 definition:project3
+ self.assertSemaphoresMax(tenant1, {'global-semaphore': 100,
+ 'common-semaphore': 10,
+ 'project1-semaphore': 11,
+ 'project2-semaphore': 1,
+ 'project3-semaphore': 1})
+ self.assertSemaphoresMax(tenant2, {'global-semaphore': 100,
+ 'common-semaphore': 10,
+ 'project1-semaphore': 1,
+ 'project2-semaphore': 12,
+ 'project3-semaphore': 1})
+ # This "global" semaphore is really tenant-scoped, it just has
+ # the same name.
+ self.assertSemaphoresMax(tenant3, {'global-semaphore': 999,
+ 'common-semaphore': 10,
+ 'project1-semaphore': 1,
+ 'project2-semaphore': 1,
+ 'project3-semaphore': 13})
+
+ # We should have a config error in tenant1 due to the
+ # redefinition.
+ self.assertEquals(len(tenant1.layout.loading_errors), 1)
+ self.assertEquals(len(tenant2.layout.loading_errors), 0)
+ self.assertEquals(len(tenant3.layout.loading_errors), 0)
+
+ A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
+ B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
+ C = self.fake_gerrit.addFakeChange('org/project3', 'master', 'C')
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
+ self.fake_gerrit.addEvent(C.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ # Checking the number of holders tells us whethere we are
+ # using global or tenant-scoped semaphores. Each in-use
+ # semaphore in a tenant should have only one holder except the
+ # global-scope semaphore shared between tenants 1 and 2.
+ self.assertSemaphores(tenant1, {'global-semaphore': 2,
+ 'common-semaphore': 1,
+ 'project1-semaphore': 1,
+ 'project2-semaphore': 0,
+ 'project3-semaphore': 0})
+ self.assertSemaphores(tenant2, {'global-semaphore': 2,
+ 'common-semaphore': 1,
+ 'project1-semaphore': 0,
+ 'project2-semaphore': 1,
+ 'project3-semaphore': 0})
+ self.assertSemaphores(tenant3, {'global-semaphore': 1,
+ 'common-semaphore': 1,
+ 'project1-semaphore': 0,
+ 'project2-semaphore': 0,
+ 'project3-semaphore': 1})
+
+ self.executor_server.hold_jobs_in_build = False
+ self.executor_server.release()
+ self.waitUntilSettled()
+
+
+class TestGlobalSemaphoresBroken(ZuulTestCase):
+ validate_tenants = []
+ tenant_config_file = 'config/global-semaphores-config/broken.yaml'
+ # This test raises a config error during the startup of the test
+ # case which makes the first scheduler fail during its startup.
+ # The second (or any additional) scheduler won't even run as the
+ # startup is serialized in tests/base.py.
+ # Thus it doesn't make sense to execute this test with multiple
+ # schedulers.
+ scheduler_count = 1
+
+ def setUp(self):
+ self.assertRaises(zuul.configloader.GlobalSemaphoreNotFoundError,
+ super().setUp)
+
+ def test_broken_global_semaphore_config(self):
+ pass
+
+
+class TestGlobalSemaphores(ZuulTestCase):
+ tenant_config_file = 'config/global-semaphores/main.yaml'
+
+ def test_global_semaphores(self):
+ # This tests that a job finishing in one tenant will correctly
+ # start a job in another tenant waiting on the semahpore.
+ self.executor_server.hold_jobs_in_build = True
+ A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
+ self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertHistory([])
+ self.assertBuilds([
+ dict(name='test-global-semaphore', changes='1,1'),
+ ])
+
+ self.executor_server.hold_jobs_in_build = False
+ self.executor_server.release()
+ self.waitUntilSettled()
+
+ self.assertHistory([
+ dict(name='test-global-semaphore',
+ result='SUCCESS', changes='1,1'),
+ dict(name='test-global-semaphore',
+ result='SUCCESS', changes='2,1'),
+ ], ordered=False)
diff --git a/tests/unit/test_inventory.py b/tests/unit/test_inventory.py
index 1f96bb5ed..acfe1a3ae 100644
--- a/tests/unit/test_inventory.py
+++ b/tests/unit/test_inventory.py
@@ -104,6 +104,7 @@ class TestInventoryGithub(TestInventoryBase):
z_vars = inventory['all']['vars']['zuul']
self.assertIn('executor', z_vars)
self.assertIn('src_root', z_vars['executor'])
+ self.assertIn('ansible_version', z_vars)
self.assertIn('job', z_vars)
self.assertIn('event_id', z_vars)
self.assertEqual(z_vars['job'], 'single-inventory')
@@ -137,6 +138,7 @@ class TestInventoryPythonPath(TestInventoryBase):
z_vars = inventory['all']['vars']['zuul']
self.assertIn('executor', z_vars)
self.assertIn('src_root', z_vars['executor'])
+ self.assertIn('ansible_version', z_vars)
self.assertIn('job', z_vars)
self.assertEqual(z_vars['job'], 'single-inventory')
self.assertEqual(z_vars['message'], 'QQ==')
@@ -167,6 +169,7 @@ class TestInventoryShellType(TestInventoryBase):
z_vars = inventory['all']['vars']['zuul']
self.assertIn('executor', z_vars)
self.assertIn('src_root', z_vars['executor'])
+ self.assertIn('ansible_version', z_vars)
self.assertIn('job', z_vars)
self.assertEqual(z_vars['job'], 'single-inventory')
self.assertEqual(z_vars['message'], 'QQ==')
@@ -177,8 +180,8 @@ class TestInventoryShellType(TestInventoryBase):
class TestInventoryAutoPython(TestInventoryBase):
- def test_auto_python_ansible28_inventory(self):
- inventory = self._get_build_inventory('ansible-version28-inventory')
+ def test_auto_python_ansible5_inventory(self):
+ inventory = self._get_build_inventory('ansible-version5-inventory')
all_nodes = ('ubuntu-xenial',)
self.assertIn('all', inventory)
@@ -195,7 +198,32 @@ class TestInventoryAutoPython(TestInventoryBase):
self.assertIn('executor', z_vars)
self.assertIn('src_root', z_vars['executor'])
self.assertIn('job', z_vars)
- self.assertEqual(z_vars['job'], 'ansible-version28-inventory')
+ self.assertEqual(z_vars['ansible_version'], '5')
+ self.assertEqual(z_vars['job'], 'ansible-version5-inventory')
+ self.assertEqual(z_vars['message'], 'QQ==')
+
+ self.executor_server.release()
+ self.waitUntilSettled()
+
+ def test_auto_python_ansible6_inventory(self):
+ inventory = self._get_build_inventory('ansible-version6-inventory')
+
+ all_nodes = ('ubuntu-xenial',)
+ self.assertIn('all', inventory)
+ self.assertIn('hosts', inventory['all'])
+ self.assertIn('vars', inventory['all'])
+ for node_name in all_nodes:
+ self.assertIn(node_name, inventory['all']['hosts'])
+ node_vars = inventory['all']['hosts'][node_name]
+ self.assertEqual(
+ 'auto', node_vars['ansible_python_interpreter'])
+
+ self.assertIn('zuul', inventory['all']['vars'])
+ z_vars = inventory['all']['vars']['zuul']
+ self.assertIn('executor', z_vars)
+ self.assertIn('src_root', z_vars['executor'])
+ self.assertIn('job', z_vars)
+ self.assertEqual(z_vars['job'], 'ansible-version6-inventory')
self.assertEqual(z_vars['message'], 'QQ==')
self.executor_server.release()
@@ -397,7 +425,8 @@ class TestAnsibleInventory(AnsibleZuulTestCase):
# Output extra ansible info so we might see errors.
self.executor_server.verbose = True
A = self.fake_gerrit.addFakeChange(
- 'org/project2', 'master', expected_message)
+ 'org/project2', 'master', expected_message,
+ files={'jinja.txt': 'foo'})
self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
self.waitUntilSettled()
self.assertHistory([
@@ -429,6 +458,19 @@ class TestAnsibleInventory(AnsibleZuulTestCase):
def test_jinja2_message_raw(self):
self._jinja2_message("This message has {% raw %} in {% endraw %} it ")
+ def test_network_inventory(self):
+ # Network appliances can't run the freeze or setup playbooks,
+ # so they won't have any job variables available. But they
+ # should still have nodepool hostvars. Run a playbook that
+ # verifies that.
+ A = self.fake_gerrit.addFakeChange(
+ 'org/project2', 'master', 'A',
+ files={'network.txt': 'foo'})
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+ self.assertHistory([
+ dict(name='network', result='SUCCESS', changes='1,1')])
+
class TestWindowsInventory(TestInventoryBase):
config_file = 'zuul-winrm.conf'
diff --git a/tests/unit/test_merger_repo.py b/tests/unit/test_merger_repo.py
index 3eb208741..64d0a3098 100644
--- a/tests/unit/test_merger_repo.py
+++ b/tests/unit/test_merger_repo.py
@@ -184,12 +184,14 @@ class TestMergerRepo(ZuulTestCase):
work_repo = Repo(parent_path, self.workspace_root,
'none@example.org', 'User Name', '0', '0')
work_repo.setRemoteRef('master', commit_sha)
- work_repo.setRemoteRef('invalid', commit_sha)
+ # missing remote ref would be created
+ work_repo.setRemoteRef('missing', commit_sha)
repo = git.Repo(self.workspace_root)
self.assertEqual(repo.remotes.origin.refs.master.commit.hexsha,
commit_sha)
- self.assertNotIn('invalid', repo.remotes.origin.refs)
+ self.assertEqual(repo.remotes.origin.refs.missing.commit.hexsha,
+ commit_sha)
def test_clone_timeout(self):
parent_path = os.path.join(self.upstream_root, 'org/project1')
@@ -363,6 +365,39 @@ class TestMergerRepo(ZuulTestCase):
self.assertEqual(sorted(['README', 'feature.txt']),
sorted(changed_files))
+ def test_files_changes_add_and_remove_files(self):
+ """
+ If the changed files in previous commits are reverted in later commits,
+ they should not be considered as changed in the PR.
+ """
+ parent_path = os.path.join(self.upstream_root, 'org/project1')
+ self.create_branch('org/project1', 'feature1')
+
+ base_sha = git.Repo(parent_path).commit('master').hexsha
+
+ # Let the file that is also changed in the feature branch diverge
+ # in master. This change should NOT be considered in the changed
+ # files list.
+ files = {'to-be-deleted.txt': 'FAIL'}
+ self.create_commit('org/project1', files=files, head='master',
+ message='Add master file')
+ work_repo = Repo(parent_path, self.workspace_root,
+ 'none@example.org', 'User Name', '0', '0')
+ # Add a file in first commit
+ files = {'to-be-deleted.txt': 'test'}
+ self.create_commit('org/project1', files=files, head='feature1',
+ message='Add file')
+ changed_files = work_repo.getFilesChanges('feature1', base_sha)
+ self.assertEqual(sorted(['README', 'to-be-deleted.txt']),
+ sorted(changed_files))
+ # Delete the file in second commit
+ delete_files = ['to-be-deleted.txt']
+ self.create_commit('org/project1', files={},
+ delete_files=delete_files, head='feature1',
+ message='Delete file')
+ changed_files = work_repo.getFilesChanges('feature1', base_sha)
+ self.assertEqual(['README'], changed_files)
+
def test_files_changes_master_fork_merges(self):
"""Regression test for getFilesChanges()
@@ -1133,7 +1168,13 @@ class TestMergerSchemes(ZuulTestCase):
os.path.join(root, 'project1')))
def test_unique_scheme(self):
- merger = self._getMerger(scheme=zuul.model.SCHEME_UNIQUE)
+ cache_merger = self._getMerger(work_root=self.cache_root)
+ cache_merger.updateRepo('gerrit', 'org/project1')
+ self._assertScheme(self.cache_root, 'unique')
+
+ merger = self._getMerger(
+ cache_root=self.cache_root,
+ scheme=zuul.model.SCHEME_UNIQUE)
merger.getRepo('gerrit', 'org/project1')
self._assertScheme(self.work_root, 'unique')
diff --git a/tests/unit/test_model.py b/tests/unit/test_model.py
index 2fc7090b7..1ab698b5f 100644
--- a/tests/unit/test_model.py
+++ b/tests/unit/test_model.py
@@ -31,6 +31,7 @@ import zuul.lib.connections
from tests.base import BaseTestCase, FIXTURE_DIR
from zuul.lib.ansible import AnsibleManager
from zuul.zk.zkobject import LocalZKContext
+from zuul import change_matcher
class Dummy(object):
@@ -746,3 +747,22 @@ class TestRef(BaseTestCase):
self.assertFalse(branch1.equals(change1))
self.assertFalse(branch1.equals(tag1))
+
+
+class TestSourceContext(BaseTestCase):
+ def setUp(self):
+ super().setUp()
+ self.connection = Dummy(connection_name='dummy_connection')
+ self.source = Dummy(canonical_hostname='git.example.com',
+ connection=self.connection)
+ self.project = model.Project('project', self.source)
+ self.context = model.SourceContext(
+ self.project.canonical_name, self.project.name,
+ self.project.connection_name, 'master', 'test', True)
+ self.context.implied_branches = [
+ change_matcher.BranchMatcher('foo'),
+ change_matcher.ImpliedBranchMatcher('foo'),
+ ]
+
+ def test_serialize(self):
+ self.context.deserialize(self.context.serialize())
diff --git a/tests/unit/test_model_upgrade.py b/tests/unit/test_model_upgrade.py
index 94c2d307e..020045859 100644
--- a/tests/unit/test_model_upgrade.py
+++ b/tests/unit/test_model_upgrade.py
@@ -1,4 +1,4 @@
-# Copyright 2021 Acme Gating, LLC
+# Copyright 2022 Acme Gating, LLC
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
@@ -35,7 +35,7 @@ def model_version(version):
class TestModelUpgrade(ZuulTestCase):
- tenant_config_file = "config/single-tenant/main.yaml"
+ tenant_config_file = "config/single-tenant/main-model-upgrade.yaml"
scheduler_count = 1
def getJobData(self, tenant, pipeline):
@@ -100,6 +100,159 @@ class TestModelUpgrade(ZuulTestCase):
dict(name='test-job', result='SUCCESS', changes='1,1'),
], ordered=False)
+ @model_version(4)
+ def test_model_4(self):
+ # Test that Zuul return values are correctly passed to child
+ # jobs in version 4 compatibility mode.
+ A = self.fake_gerrit.addFakeChange('org/project3', 'master', 'A')
+ fake_data = [
+ {'name': 'image',
+ 'url': 'http://example.com/image',
+ 'metadata': {
+ 'type': 'container_image'
+ }},
+ ]
+ self.executor_server.returnData(
+ 'project-merge', A,
+ {'zuul': {'artifacts': fake_data}}
+ )
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertHistory([
+ dict(name='project-merge', result='SUCCESS', changes='1,1'),
+ dict(name='project-test1', result='SUCCESS', changes='1,1'),
+ dict(name='project-test2', result='SUCCESS', changes='1,1'),
+ dict(name='project1-project2-integration',
+ result='SUCCESS', changes='1,1'),
+ ], ordered=False)
+ # Verify that the child jobs got the data from the parent
+ test1 = self.getJobFromHistory('project-test1')
+ self.assertEqual(fake_data[0]['url'],
+ test1.parameters['zuul']['artifacts'][0]['url'])
+ integration = self.getJobFromHistory('project1-project2-integration')
+ self.assertEqual(fake_data[0]['url'],
+ integration.parameters['zuul']['artifacts'][0]['url'])
+
+ @model_version(4)
+ def test_model_4_5(self):
+ # Changes share a queue, but with only one job, the first
+ # merges before the second starts.
+ self.executor_server.hold_jobs_in_build = True
+ A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
+ fake_data = [
+ {'name': 'image',
+ 'url': 'http://example.com/image',
+ 'metadata': {
+ 'type': 'container_image'
+ }},
+ ]
+ self.executor_server.returnData(
+ 'project-merge', A,
+ {'zuul': {'artifacts': fake_data}}
+ )
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertEqual(len(self.builds), 1)
+
+ # Upgrade our component
+ self.model_test_component_info.model_api = 5
+
+ self.executor_server.hold_jobs_in_build = False
+ self.executor_server.release()
+ self.waitUntilSettled()
+
+ self.assertHistory([
+ dict(name='project-merge', result='SUCCESS', changes='1,1'),
+ dict(name='project-test1', result='SUCCESS', changes='1,1'),
+ dict(name='project-test2', result='SUCCESS', changes='1,1'),
+ dict(name='project1-project2-integration',
+ result='SUCCESS', changes='1,1'),
+ ], ordered=False)
+ # Verify that the child job got the data from the parent
+ test1 = self.getJobFromHistory('project-test1')
+ self.assertEqual(fake_data[0]['url'],
+ test1.parameters['zuul']['artifacts'][0]['url'])
+
+ @model_version(5)
+ def test_model_5_6(self):
+ # This exercises the min_ltimes=None case in configloader on
+ # layout updates.
+ first = self.scheds.first
+ second = self.createScheduler()
+ second.start()
+ self.assertEqual(len(self.scheds), 2)
+ for _ in iterate_timeout(10, "until priming is complete"):
+ state_one = first.sched.local_layout_state.get("tenant-one")
+ if state_one:
+ break
+
+ for _ in iterate_timeout(
+ 10, "all schedulers to have the same layout state"):
+ if (second.sched.local_layout_state.get(
+ "tenant-one") == state_one):
+ break
+
+ with second.sched.layout_update_lock, second.sched.run_handler_lock:
+ file_dict = {'zuul.d/test.yaml': ''}
+ A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A',
+ files=file_dict)
+ A.setMerged()
+ self.fake_gerrit.addEvent(A.getChangeMergedEvent())
+ self.waitUntilSettled(matcher=[first])
+
+ # Delete the layout data to simulate the first scheduler
+ # being on model api 5 (we write the data regardless of
+ # the cluster version since it's a new znode).
+ self.scheds.first.sched.zk_client.client.delete(
+ '/zuul/layout-data', recursive=True)
+ self.waitUntilSettled()
+ self.assertEqual(first.sched.local_layout_state.get("tenant-one"),
+ second.sched.local_layout_state.get("tenant-one"))
+
+ # No test for model version 7 (secrets in blob store): old and new
+ # code paths are exercised in existing tests since small secrets
+ # don't use the blob store.
+
+ @model_version(8)
+ def test_model_8_9(self):
+ # This excercises the upgrade to nodeset_alternates
+ first = self.scheds.first
+ second = self.createScheduler()
+ second.start()
+ self.assertEqual(len(self.scheds), 2)
+ for _ in iterate_timeout(10, "until priming is complete"):
+ state_one = first.sched.local_layout_state.get("tenant-one")
+ if state_one:
+ break
+
+ for _ in iterate_timeout(
+ 10, "all schedulers to have the same layout state"):
+ if (second.sched.local_layout_state.get(
+ "tenant-one") == state_one):
+ break
+
+ self.fake_nodepool.pause()
+ with second.sched.layout_update_lock, second.sched.run_handler_lock:
+ A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled(matcher=[first])
+
+ self.model_test_component_info.model_api = 9
+ with first.sched.layout_update_lock, first.sched.run_handler_lock:
+ self.fake_nodepool.unpause()
+ self.waitUntilSettled(matcher=[second])
+
+ self.waitUntilSettled()
+ self.assertHistory([
+ dict(name='project-merge', result='SUCCESS', changes='1,1'),
+ dict(name='project-test1', result='SUCCESS', changes='1,1'),
+ dict(name='project-test2', result='SUCCESS', changes='1,1'),
+ dict(name='project1-project2-integration',
+ result='SUCCESS', changes='1,1'),
+ ], ordered=False)
+
class TestSemaphoreModelUpgrade(ZuulTestCase):
tenant_config_file = 'config/semaphore/main.yaml'
@@ -193,3 +346,97 @@ class TestSemaphoreModelUpgrade(ZuulTestCase):
self.assertEqual(
len(tenant.semaphore_handler.semaphoreHolders("test-semaphore")),
0)
+
+
+class TestGithubModelUpgrade(ZuulTestCase):
+ config_file = 'zuul-github-driver.conf'
+ scheduler_count = 1
+
+ @model_version(3)
+ @simple_layout('layouts/gate-github.yaml', driver='github')
+ def test_status_checks_removal(self):
+ # This tests the old behavior -- that changes are not dequeued
+ # once their required status checks are removed -- since the
+ # new behavior requires a flag in ZK.
+ # Contrast with test_status_checks_removal.
+ github = self.fake_github.getGithubClient()
+ repo = github.repo_from_project('org/project')
+ repo._set_branch_protection(
+ 'master', contexts=['something/check', 'tenant-one/gate'])
+
+ A = self.fake_github.openFakePullRequest('org/project', 'master', 'A')
+ self.fake_github.emitEvent(A.getPullRequestOpenedEvent())
+ self.waitUntilSettled()
+
+ self.executor_server.hold_jobs_in_build = True
+ # Since the required status 'something/check' is not fulfilled,
+ # no job is expected
+ self.assertEqual(0, len(self.history))
+
+ # Set the required status 'something/check'
+ repo.create_status(A.head_sha, 'success', 'example.com', 'description',
+ 'something/check')
+
+ self.fake_github.emitEvent(A.getPullRequestOpenedEvent())
+ self.waitUntilSettled()
+
+ # Remove it and verify the change is not dequeued (old behavior).
+ repo.create_status(A.head_sha, 'failed', 'example.com', 'description',
+ 'something/check')
+ self.fake_github.emitEvent(A.getCommitStatusEvent('something/check',
+ state='failed',
+ user='foo'))
+ self.waitUntilSettled()
+
+ self.executor_server.hold_jobs_in_build = False
+ self.executor_server.release()
+ self.waitUntilSettled()
+
+ # the change should have entered the gate
+ self.assertHistory([
+ dict(name='project-test1', result='SUCCESS'),
+ dict(name='project-test2', result='SUCCESS'),
+ ], ordered=False)
+ self.assertTrue(A.is_merged)
+
+
+class TestDeduplication(ZuulTestCase):
+ config_file = "zuul-gerrit-github.conf"
+ tenant_config_file = "config/circular-dependencies/main.yaml"
+ scheduler_count = 1
+
+ def _test_job_deduplication(self):
+ A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
+ B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
+
+ # A <-> B
+ A.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ A.subject, B.data["url"]
+ )
+ B.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ B.subject, A.data["url"]
+ )
+
+ A.addApproval('Code-Review', 2)
+ B.addApproval('Code-Review', 2)
+
+ self.fake_gerrit.addEvent(A.addApproval('Approved', 1))
+ self.fake_gerrit.addEvent(B.addApproval('Approved', 1))
+
+ self.waitUntilSettled()
+
+ self.assertEqual(A.data['status'], 'MERGED')
+ self.assertEqual(B.data['status'], 'MERGED')
+
+ @simple_layout('layouts/job-dedup-auto-shared.yaml')
+ @model_version(7)
+ def test_job_deduplication_auto_shared(self):
+ self._test_job_deduplication()
+ self.assertHistory([
+ dict(name="project1-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="common-job", result="SUCCESS", changes="2,1 1,1"),
+ dict(name="project2-job", result="SUCCESS", changes="2,1 1,1"),
+ # This would be deduplicated
+ dict(name="common-job", result="SUCCESS", changes="2,1 1,1"),
+ ], ordered=False)
+ self.assertEqual(len(self.fake_nodepool.history), 4)
diff --git a/tests/unit/test_pagure_driver.py b/tests/unit/test_pagure_driver.py
index 442020a4f..92159cc9f 100644
--- a/tests/unit/test_pagure_driver.py
+++ b/tests/unit/test_pagure_driver.py
@@ -26,7 +26,7 @@ from zuul.zk.layout import LayoutState
from tests.base import ZuulTestCase, simple_layout
from tests.base import ZuulWebFixture
-EMPTY_LAYOUT_STATE = LayoutState("", "", 0, None, {})
+EMPTY_LAYOUT_STATE = LayoutState("", "", 0, None, {}, -1)
class TestPagureDriver(ZuulTestCase):
@@ -656,6 +656,34 @@ class TestPagureDriver(ZuulTestCase):
self.assertTrue(A.is_merged)
self.assertTrue(B.is_merged)
+ @simple_layout('layouts/files-pagure.yaml', driver='pagure')
+ def test_changed_file_match_filter(self):
+ files = {'{:03d}.txt'.format(n): 'test' for n in range(300)}
+ files["foobar-requires"] = "test"
+ files["to-be-removed"] = "test"
+ A = self.fake_pagure.openFakePullRequest(
+ 'org/project', 'master', 'A', files=files)
+
+ self.fake_pagure.emitEvent(A.getPullRequestOpenedEvent())
+ self.waitUntilSettled()
+ # project-test1 and project-test2 should be run
+ self.assertEqual(2, len(self.history))
+
+ @simple_layout('layouts/files-pagure.yaml', driver='pagure')
+ def test_changed_and_reverted_file_not_match_filter(self):
+ files = {'{:03d}.txt'.format(n): 'test' for n in range(3)}
+ files["foobar-requires"] = "test"
+ files["to-be-removed"] = "test"
+ A = self.fake_pagure.openFakePullRequest(
+ 'org/project', 'master', 'A', files=files)
+ A.addCommit(delete_files=['to-be-removed'])
+
+ self.fake_pagure.emitEvent(A.getPullRequestOpenedEvent())
+ self.waitUntilSettled()
+ # Only project-test1 should be run, because the file to-be-removed
+ # is reverted and not in changed files to trigger project-test2
+ self.assertEqual(1, len(self.history))
+
class TestPagureToGerritCRD(ZuulTestCase):
config_file = 'zuul-crd-pagure.conf'
diff --git a/tests/unit/test_reporting.py b/tests/unit/test_reporting.py
index b9dd3738c..2cf93cdcb 100644
--- a/tests/unit/test_reporting.py
+++ b/tests/unit/test_reporting.py
@@ -12,6 +12,8 @@
# License for the specific language governing permissions and limitations
# under the License.
+import sqlalchemy as sa
+
from zuul.model import DequeueEvent
from tests.base import ZuulTestCase, simple_layout
@@ -128,3 +130,59 @@ class TestReporting(ZuulTestCase):
self.assertIn("Build canceled (check)", A.messages[1])
self.assertIn("Build started (check)", A.messages[2])
self.assertIn("Build succeeded (check)", A.messages[3])
+
+ @simple_layout("layouts/no-jobs-reporting.yaml")
+ def test_no_jobs_reporting_check(self):
+ # Test that we don't report NO_JOBS results
+
+ self.executor_server.hold_jobs_in_build = True
+ A = self.fake_gerrit.addFakeChange("org/project", "master", "A")
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertEqual(0, A.reported)
+ self.assertHistory([])
+
+ tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
+ pipeline = tenant.layout.pipelines['check']
+ reporter = self.scheds.first.connections.getSqlReporter(
+ pipeline)
+ with self.scheds.first.connections.getSqlConnection().\
+ engine.connect() as conn:
+
+ result = conn.execute(
+ sa.sql.select([reporter.connection.zuul_buildset_table]))
+
+ buildsets = result.fetchall()
+ for x in buildsets:
+ self.log.debug("Buildset %s", x)
+ self.assertEqual(0, len(buildsets))
+
+ @simple_layout("layouts/no-jobs-reporting.yaml")
+ def test_no_jobs_reporting_check_and_gate(self):
+ # Test that we don't report NO_JOBS results
+
+ self.executor_server.hold_jobs_in_build = True
+ A = self.fake_gerrit.addFakeChange("org/project", "master", "A")
+ A.addApproval("Code-Review", 2)
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.fake_gerrit.addEvent(A.addApproval("Approved", 1))
+ self.waitUntilSettled()
+
+ self.assertEqual(0, A.reported)
+ self.assertHistory([])
+
+ tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
+ pipeline = tenant.layout.pipelines['check']
+ reporter = self.scheds.first.connections.getSqlReporter(
+ pipeline)
+ with self.scheds.first.connections.getSqlConnection().\
+ engine.connect() as conn:
+
+ result = conn.execute(
+ sa.sql.select([reporter.connection.zuul_buildset_table]))
+
+ buildsets = result.fetchall()
+ for x in buildsets:
+ self.log.debug("Buildset %s", x)
+ self.assertEqual(0, len(buildsets))
diff --git a/tests/unit/test_requirements.py b/tests/unit/test_requirements.py
index eebd73b11..9a32e4b21 100644
--- a/tests/unit/test_requirements.py
+++ b/tests/unit/test_requirements.py
@@ -309,6 +309,18 @@ class TestRequirementsState(ZuulTestCase):
self.waitUntilSettled()
self.assertEqual(len(self.history), 1)
+ def test_pipeline_require_wip(self):
+ A = self.fake_gerrit.addFakeChange('wip-project', 'master', 'A')
+ A.setWorkInProgress(True)
+ self.fake_gerrit.addEvent(A.addApproval('Code-Review', 2))
+ self.waitUntilSettled()
+ self.assertEqual(len(self.history), 0)
+
+ B = self.fake_gerrit.addFakeChange('wip-project', 'master', 'B')
+ self.fake_gerrit.addEvent(B.addApproval('Code-Review', 2))
+ self.waitUntilSettled()
+ self.assertEqual(len(self.history), 1)
+
class TestRequirementsRejectUsername(ZuulTestCase):
"""Requirements with reject username requirement"""
diff --git a/tests/unit/test_scheduler.py b/tests/unit/test_scheduler.py
index a381486b2..5d8099686 100644
--- a/tests/unit/test_scheduler.py
+++ b/tests/unit/test_scheduler.py
@@ -26,6 +26,7 @@ from collections import namedtuple
from unittest import mock, skip
from uuid import uuid4
from kazoo.exceptions import NoNodeError
+from testtools.matchers import StartsWith
import git
import fixtures
@@ -35,6 +36,7 @@ from zuul.driver.gerrit import gerritreporter
import zuul.scheduler
import zuul.model
import zuul.merger.merger
+from zuul.lib import yamlutil as yaml
from tests.base import (
SSLZuulTestCase,
@@ -49,8 +51,9 @@ from tests.base import (
)
from zuul.zk.change_cache import ChangeKey
from zuul.zk.layout import LayoutState
+from zuul.zk.locks import management_queue_lock
-EMPTY_LAYOUT_STATE = LayoutState("", "", 0, None, {})
+EMPTY_LAYOUT_STATE = LayoutState("", "", 0, None, {}, -1)
class TestSchedulerSSL(SSLZuulTestCase):
@@ -224,6 +227,18 @@ class TestSchedulerZoneFallback(ZuulTestCase):
def test_jobs_executed(self):
"Test that jobs are executed and a change is merged per zone"
self.hold_jobs_in_queue = True
+
+ # Validate that the reported executor stats are correct. Since
+ # the executor accepts zoned and unzoned job it should be counted
+ # in both metrics.
+ self.assertReportedStat(
+ 'zuul.executors.online', value='1', kind='g')
+ self.assertReportedStat(
+ 'zuul.executors.unzoned.online', value='1', kind='g')
+ self.assertReportedStat(
+ 'zuul.executors.zone.test-provider_vpn.online',
+ value='1', kind='g')
+
A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
A.addApproval('Code-Review', 2)
self.fake_gerrit.addEvent(A.addApproval('Approved', 1))
@@ -365,6 +380,10 @@ class TestScheduler(ZuulTestCase):
'label1')
self.assertEqual(self.getJobFromHistory('project-test2').node,
'label1')
+ self.assertThat(A.messages[1],
+ StartsWith(
+ 'Build succeeded (gate).\n'
+ 'https://zuul.example.com/t/tenant-one/buildset'))
# TODOv3(jeblair): we may want to report stats by tenant (also?).
# Per-driver
@@ -446,6 +465,7 @@ class TestScheduler(ZuulTestCase):
'zuul.tenant.tenant-one.reconfiguration_time',
'zuul.tenant.tenant-one.pipeline.gate.event_enqueue_time',
'zuul.tenant.tenant-one.pipeline.gate.merge_request_time',
+ 'zuul.tenant.tenant-one.pipeline.gate.merger_merge_op_time',
'zuul.tenant.tenant-one.pipeline.gate.job_freeze_time',
'zuul.tenant.tenant-one.pipeline.gate.node_request_time',
'zuul.tenant.tenant-one.pipeline.gate.job_wait_time',
@@ -1895,6 +1915,35 @@ class TestScheduler(ZuulTestCase):
self.assertEqual(B.reported, 2)
self.assertEqual(C.reported, 2)
+ def test_approval_removal(self):
+ # Test that we dequeue a change when it can not merge
+ self.executor_server.hold_jobs_in_build = True
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
+ A.addApproval('Code-Review', 2)
+ self.fake_gerrit.addEvent(A.addApproval('Approved', 1))
+
+ self.waitUntilSettled()
+ self.assertEqual(1, len(self.builds))
+ self.assertEqual(0, len(self.history))
+
+ # Remove the approval
+ self.fake_gerrit.addEvent(A.addApproval('Approved', 0))
+ self.waitUntilSettled()
+
+ self.executor_server.hold_jobs_in_build = False
+ self.executor_server.release()
+ self.waitUntilSettled()
+
+ # The change should be dequeued.
+ self.assertHistory([
+ dict(name='project-merge', result='ABORTED'),
+ ], ordered=False)
+ self.assertEqual(2, len(A.messages))
+ self.assertEqual(A.data['status'], 'NEW')
+ self.assertIn('This change is unable to merge '
+ 'due to a missing merge requirement.',
+ A.messages[1])
+
@simple_layout('layouts/nonvoting-job-approval.yaml')
def test_nonvoting_job_approval(self):
"Test that non-voting jobs don't vote but leave approval"
@@ -2009,8 +2058,9 @@ class TestScheduler(ZuulTestCase):
self.assertEqual([], request.nodes)
# Some convenience variables for checking the stats.
- tenant_ram_stat = 'zuul.nodepool.resources.tenant.tenant-one.ram'
- project_ram_stat = ('zuul.nodepool.resources.project.'
+ tenant_ram_stat =\
+ 'zuul.nodepool.resources.in_use.tenant.tenant-one.ram'
+ project_ram_stat = ('zuul.nodepool.resources.in_use.project.'
'review_example_com/org/project.ram')
# Test that we zeroed the gauges
self.scheds.first.sched._runStats()
@@ -4179,6 +4229,56 @@ class TestScheduler(ZuulTestCase):
dict(name='check-job', result='SUCCESS', changes='1,1'),
])
+ @simple_layout('layouts/trigger-sequence.yaml')
+ def test_live_reconfiguration_trigger_sequence(self):
+ # Test that events arriving after an event that triggers a
+ # reconfiguration are handled after the reconfiguration
+ # completes.
+
+ in_repo_conf = "[{project: {tag: {jobs: [post-job]}}}]"
+ file_dict = {'zuul.yaml': in_repo_conf}
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A',
+ files=file_dict)
+ sched = self.scheds.first.sched
+ # Hold the management queue so that we don't process any
+ # reconfiguration events yet.
+ with management_queue_lock(
+ self.zk_client, 'tenant-one', blocking=False
+ ):
+ with sched.run_handler_lock:
+ A.setMerged()
+ # Submit two events while no processing is happening:
+ # A change merged event that will trigger a reconfiguration
+ self.fake_gerrit.addEvent(A.getChangeMergedEvent())
+
+ # And a tag event which should only run a job after
+ # the config change above is in effect.
+ event = self.fake_gerrit.addFakeTag(
+ 'org/project', 'master', 'foo')
+ self.fake_gerrit.addEvent(event)
+
+ # Wait for the tenant trigger queue to empty out, and for
+ # us to have a tenant management as well as a pipeline
+ # trigger event. At this point, we should be deferring
+ # the trigger event until the management event is handled.
+ for _ in iterate_timeout(60, 'queues'):
+ with sched.run_handler_lock:
+ if sched.trigger_events['tenant-one'].hasEvents():
+ continue
+ if not sched.pipeline_trigger_events[
+ 'tenant-one']['tag'].hasEvents():
+ continue
+ if not sched.management_events['tenant-one'].hasEvents():
+ continue
+ break
+
+ # Now we can resume and process the reconfiguration event
+ sched.wake_event.set()
+ self.waitUntilSettled()
+ self.assertHistory([
+ dict(name='post-job', result='SUCCESS'),
+ ])
+
@simple_layout('layouts/repo-deleted.yaml')
def test_repo_deleted(self):
self.init_repo("org/delete-project")
@@ -5244,6 +5344,11 @@ For CI problems and help debugging, contact ci@example.org"""
self.assertIn('Error merging gerrit/org/project', B.messages[0])
self.assertNotIn('logs.example.com', B.messages[0])
self.assertNotIn('SKIPPED', B.messages[0])
+ buildsets = list(
+ self.scheds.first.connections.connections[
+ 'database'].getBuildsets())
+ self.assertEqual(buildsets[0].result, 'MERGE_CONFLICT')
+ self.assertIn('This change or one of', buildsets[0].message)
def test_submit_failure(self):
A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
@@ -5258,6 +5363,44 @@ For CI problems and help debugging, contact ci@example.org"""
'database'].getBuildsets())
self.assertEqual(buildsets[0].result, 'MERGE_FAILURE')
+ @simple_layout('layouts/timer-freeze-job-failure.yaml')
+ def test_periodic_freeze_job_failure(self):
+ self.waitUntilSettled()
+
+ for x in iterate_timeout(30, 'buildset complete'):
+ buildsets = list(
+ self.scheds.first.connections.connections[
+ 'database'].getBuildsets())
+ if buildsets:
+ break
+ # Stop queuing timer triggered jobs so that the assertions
+ # below don't race against more jobs being queued.
+ self.commitConfigUpdate('org/common-config', 'layouts/no-timer.yaml')
+ self.scheds.execute(lambda app: app.sched.reconfigure(app.config))
+ self.waitUntilSettled()
+ # If APScheduler is in mid-event when we remove the job, we
+ # can end up with one more event firing, so give it an extra
+ # second to settle.
+ time.sleep(3)
+ self.waitUntilSettled()
+
+ self.assertEqual(buildsets[0].result, 'CONFIG_ERROR')
+ self.assertIn('Job project-test2 depends on project-test1 '
+ 'which was not run', buildsets[0].message)
+
+ @simple_layout('layouts/freeze-job-failure.yaml')
+ def test_freeze_job_failure(self):
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ buildsets = list(
+ self.scheds.first.connections.connections[
+ 'database'].getBuildsets())
+ self.assertEqual(buildsets[0].result, 'CONFIG_ERROR')
+ self.assertIn('Job project-test2 depends on project-test1 '
+ 'which was not run', buildsets[0].message)
+
@simple_layout('layouts/nonvoting-pipeline.yaml')
def test_nonvoting_pipeline(self):
"Test that a nonvoting pipeline (experimental) can still report"
@@ -5645,8 +5788,7 @@ For CI problems and help debugging, contact ci@example.org"""
self.assertEqual(A.reported, 2)
self.assertTrue(re.search('project-merge .* NODE_FAILURE',
A.messages[1]))
- self.assertTrue(re.search('project-test1 .* SKIPPED', A.messages[1]))
- self.assertTrue(re.search('project-test2 .* SKIPPED', A.messages[1]))
+ self.assertTrue('Skipped 2 jobs' in A.messages[1])
def test_nodepool_resources(self):
"Test that resources are reported"
@@ -5672,45 +5814,54 @@ For CI problems and help debugging, contact ci@example.org"""
self.assertHistory([
dict(name='project-merge', result='SUCCESS', changes='1,1'),
])
+ self.assertReportedStat(
+ 'zuul.nodepool.resources.total.tenant.tenant-one.cores',
+ value='6', kind='g')
+ self.assertReportedStat(
+ 'zuul.nodepool.resources.total.tenant.tenant-one.ram',
+ value='3072', kind='g')
+ self.assertReportedStat(
+ 'zuul.nodepool.resources.total.tenant.tenant-one.instances',
+ value='3', kind='g')
# All 3 nodes are in use
self.assertReportedStat(
- 'zuul.nodepool.resources.tenant.tenant-one.cores',
+ 'zuul.nodepool.resources.in_use.tenant.tenant-one.cores',
value='6', kind='g')
self.assertReportedStat(
- 'zuul.nodepool.resources.tenant.tenant-one.ram',
+ 'zuul.nodepool.resources.in_use.tenant.tenant-one.ram',
value='3072', kind='g')
self.assertReportedStat(
- 'zuul.nodepool.resources.tenant.tenant-one.instances',
+ 'zuul.nodepool.resources.in_use.tenant.tenant-one.instances',
value='3', kind='g')
self.assertReportedStat(
- 'zuul.nodepool.resources.project.review_example_com/org/project.'
- 'cores', value='6', kind='g')
+ 'zuul.nodepool.resources.in_use.project.review_example_com/org/'
+ 'project.cores', value='6', kind='g')
self.assertReportedStat(
- 'zuul.nodepool.resources.project.review_example_com/org/project.'
- 'ram', value='3072', kind='g')
+ 'zuul.nodepool.resources.in_use.project.review_example_com/org/'
+ 'project.ram', value='3072', kind='g')
self.assertReportedStat(
- 'zuul.nodepool.resources.project.review_example_com/org/project.'
- 'instances', value='3', kind='g')
+ 'zuul.nodepool.resources.in_use.project.review_example_com/org/'
+ 'project.instances', value='3', kind='g')
# Check that resource usage counters are reported
self.assertReportedStat(
- 'zuul.nodepool.resources.tenant.tenant-one.cores',
+ 'zuul.nodepool.resources.in_use.tenant.tenant-one.cores',
kind='c')
self.assertReportedStat(
- 'zuul.nodepool.resources.tenant.tenant-one.ram',
+ 'zuul.nodepool.resources.in_use.tenant.tenant-one.ram',
kind='c')
self.assertReportedStat(
- 'zuul.nodepool.resources.tenant.tenant-one.instances',
+ 'zuul.nodepool.resources.in_use.tenant.tenant-one.instances',
kind='c')
self.assertReportedStat(
- 'zuul.nodepool.resources.project.review_example_com/org/project.'
- 'cores', kind='c')
+ 'zuul.nodepool.resources.in_use.project.review_example_com/org/'
+ 'project.cores', kind='c')
self.assertReportedStat(
- 'zuul.nodepool.resources.project.review_example_com/org/project.'
- 'ram', kind='c')
+ 'zuul.nodepool.resources.in_use.project.review_example_com/org/'
+ 'project.ram', kind='c')
self.assertReportedStat(
- 'zuul.nodepool.resources.project.review_example_com/org/project.'
- 'instances', kind='c')
+ 'zuul.nodepool.resources.in_use.project.review_example_com/org/'
+ 'project.instances', kind='c')
self.executor_server.hold_jobs_in_build = False
self.executor_server.release()
@@ -5939,6 +6090,50 @@ For CI problems and help debugging, contact ci@example.org"""
self.assertFalse(node['_lock'])
self.assertEqual(node['state'], 'ready')
+ @simple_layout('layouts/nodeset-fallback.yaml')
+ def test_nodeset_fallback(self):
+ # Test that nodeset fallback works
+ self.executor_server.hold_jobs_in_build = True
+
+ # Verify that we get the correct number and order of
+ # alternates from our nested config.
+ tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
+ job = tenant.layout.getJob('check-job')
+ alts = job.flattenNodesetAlternatives(tenant.layout)
+ self.assertEqual(4, len(alts))
+ self.assertEqual('fast-nodeset', alts[0].name)
+ self.assertEqual('', alts[1].name)
+ self.assertEqual('red-nodeset', alts[2].name)
+ self.assertEqual('blue-nodeset', alts[3].name)
+
+ self.fake_nodepool.pause()
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ req = self.fake_nodepool.getNodeRequests()[0]
+ self.fake_nodepool.addFailRequest(req)
+
+ self.fake_nodepool.unpause()
+ self.waitUntilSettled()
+
+ build = self.getBuildByName('check-job')
+ inv_path = os.path.join(build.jobdir.root, 'ansible', 'inventory.yaml')
+ inventory = yaml.safe_load(open(inv_path, 'r'))
+ label = inventory['all']['hosts']['controller']['nodepool']['label']
+ self.assertEqual('slow-label', label)
+
+ self.executor_server.hold_jobs_in_build = False
+ self.executor_server.release()
+ self.waitUntilSettled()
+
+ self.assertEqual(A.data['status'], 'NEW')
+ self.assertEqual(A.reported, 1)
+ self.assertNotIn('NODE_FAILURE', A.messages[0])
+ self.assertHistory([
+ dict(name='check-job', result='SUCCESS', changes='1,1'),
+ ], ordered=False)
+
@simple_layout('layouts/multiple-templates.yaml')
def test_multiple_project_templates(self):
# Test that applying multiple project templates to a project
@@ -6702,6 +6897,52 @@ class TestDependencyGraph(ZuulTestCase):
dict(name='deploy', result='SUCCESS', changes='1,1'),
], ordered=False)
+ @simple_layout('layouts/not-skip-when-reenqueue.yaml')
+ def test_child_with_soft_dependency_should_not_skip(self):
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
+ self.executor_server.hold_jobs_in_build = True
+ self.executor_server.returnData(
+ 'grand-parent', A,
+ {'zuul':
+ {'child_jobs': ['parent2']}
+ }
+ )
+
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.executor_server.release('grand-parent')
+ self.waitUntilSettled()
+ # grand-parent success, parent1 skipped, parent2 running
+ self.assertHistory([
+ dict(name='grand-parent', result='SUCCESS', changes='1,1'),
+ ], ordered=False)
+ self.assertBuilds([dict(name='parent2')])
+
+ # Reconfigure to trigger a re-enqueue, this should not cause job
+ # 'child' to be skipped because parent1 was skipped
+ self.scheds.execute(lambda app: app.sched.reconfigure(app.config))
+
+ self.executor_server.release('parent1')
+ self.executor_server.release('parent2')
+ self.waitUntilSettled()
+ # grand-parent success, parent1 skipped, parent2 success, child running
+ self.assertHistory([
+ dict(name='grand-parent', result='SUCCESS', changes='1,1'),
+ dict(name='parent2', result='SUCCESS', changes='1,1'),
+ ], ordered=False)
+ self.assertBuilds([dict(name='child')])
+
+ self.executor_server.release('child')
+ self.waitUntilSettled()
+ # grand-parent success, parent1 skipped, parent2 success, child success
+ self.assertHistory([
+ dict(name='grand-parent', result='SUCCESS', changes='1,1'),
+ dict(name='parent2', result='SUCCESS', changes='1,1'),
+ dict(name='child', result='SUCCESS', changes='1,1'),
+ ], ordered=False)
+ self.assertBuilds([])
+
@simple_layout('layouts/soft-dependencies.yaml')
def test_soft_dependencies_failure(self):
file_dict = {'main.c': 'test'}
@@ -6713,7 +6954,7 @@ class TestDependencyGraph(ZuulTestCase):
self.assertHistory([
dict(name='build', result='FAILURE', changes='1,1'),
], ordered=False)
- self.assertIn('SKIPPED', A.messages[0])
+ self.assertIn('Skipped 1 job', A.messages[0])
class TestDuplicatePipeline(ZuulTestCase):
@@ -6977,6 +7218,51 @@ class TestSchedulerMerges(ZuulTestCase):
result = self._test_project_merge_mode('cherry-pick')
self.assertEqual(result, expected_messages)
+ def test_project_merge_mode_cherrypick_branch_merge(self):
+ "Test that branches can be merged together in cherry-pick mode"
+ self.create_branch('org/project-merge-branches', 'mp')
+ self.fake_gerrit.addEvent(
+ self.fake_gerrit.getFakeBranchCreatedEvent(
+ 'org/project-merge-branches', 'mp'))
+ self.waitUntilSettled()
+
+ path = os.path.join(self.upstream_root, 'org/project-merge-branches')
+ repo = git.Repo(path)
+ master_sha = repo.heads.master.commit.hexsha
+ mp_sha = repo.heads.mp.commit.hexsha
+
+ self.executor_server.hold_jobs_in_build = True
+ M = self.fake_gerrit.addFakeChange(
+ 'org/project-merge-branches', 'master', 'M',
+ merge_parents=[
+ master_sha,
+ mp_sha,
+ ])
+ M.addApproval('Code-Review', 2)
+ self.fake_gerrit.addEvent(M.addApproval('Approved', 1))
+ self.waitUntilSettled()
+
+ self.executor_server.release('.*-merge')
+ self.waitUntilSettled()
+
+ build = self.builds[-1]
+ self.assertEqual(build.parameters['zuul']['branch'], 'master')
+ path = os.path.join(build.jobdir.src_root, 'review.example.com',
+ "org/project-merge-branches")
+ repo = git.Repo(path)
+ repo_messages = [c.message.strip() for c in repo.iter_commits()]
+ repo_messages.reverse()
+ correct_messages = [
+ 'initial commit',
+ 'add content from fixture',
+ 'mp commit',
+ 'M-1']
+ self.assertEqual(repo_messages, correct_messages)
+
+ self.executor_server.hold_jobs_in_build = False
+ self.executor_server.release()
+ self.waitUntilSettled()
+
def test_merge_branch(self):
"Test that the right commits are on alternate branches"
self.create_branch('org/project-merge-branches', 'mp')
@@ -8043,8 +8329,8 @@ class TestSemaphoreInRepo(ZuulTestCase):
item_dynamic_layout = pipeline.manager._layout_cache.get(
queue_item.layout_uuid)
self.assertIsNotNone(item_dynamic_layout)
- dynamic_test_semaphore = \
- item_dynamic_layout.semaphores.get('test-semaphore')
+ dynamic_test_semaphore = item_dynamic_layout.getSemaphore(
+ self.scheds.first.sched.abide, 'test-semaphore')
self.assertEqual(dynamic_test_semaphore.max, 1)
# one build must be in queue, one semaphores acquired
@@ -8067,7 +8353,8 @@ class TestSemaphoreInRepo(ZuulTestCase):
# now that change A was merged, the new semaphore max must be effective
tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
- self.assertEqual(tenant.layout.semaphores.get('test-semaphore').max, 2)
+ self.assertEqual(tenant.layout.getSemaphore(
+ self.scheds.first.sched.abide, 'test-semaphore').max, 2)
# two builds must be in queue, two semaphores acquired
self.assertEqual(len(self.builds), 2)
@@ -8336,6 +8623,58 @@ class TestPipelineSupersedes(ZuulTestCase):
], ordered=False)
+class TestSchedulerExcludeAll(ZuulTestCase):
+ tenant_config_file = 'config/two-tenant/exclude-all.yaml'
+
+ def test_skip_reconfig_exclude_all(self):
+ """Test that we don't trigger a reconfiguration for a tenant
+ when the changed project excludes all config."""
+ config = textwrap.dedent(
+ """
+ - job:
+ name: project2-test
+ parent: test
+
+ - project:
+ check:
+ jobs:
+ - project2-test
+ """)
+ file_dict = {'zuul.yaml': config}
+ A = self.fake_gerrit.addFakeChange('org/project2', 'master', 'A',
+ files=file_dict)
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+ self.assertHistory([
+ dict(name='project2-test', result='SUCCESS', changes='1,1'),
+ ])
+
+ sched = self.scheds.first.sched
+ tenant_one_layout_state = sched.local_layout_state["tenant-one"]
+ tenant_two_layout_state = sched.local_layout_state["tenant-two"]
+
+ A.setMerged()
+ self.fake_gerrit.addEvent(A.getChangeMergedEvent())
+ self.waitUntilSettled()
+
+ # We don't expect a reconfiguration for tenant-one as it excludes
+ # all config of org/project2.
+ self.assertEqual(sched.local_layout_state["tenant-one"],
+ tenant_one_layout_state)
+ # As tenant-two includes the config from org/project2, the merge of
+ # change A should have triggered a reconfig.
+ self.assertGreater(sched.local_layout_state["tenant-two"],
+ tenant_two_layout_state)
+
+ B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
+ self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+ self.assertHistory([
+ dict(name='project2-test', result='SUCCESS', changes='1,1'),
+ dict(name='project2-test', result='SUCCESS', changes='2,1'),
+ ])
+
+
class TestReportBuildPage(ZuulTestCase):
tenant_config_file = 'config/build-page/main.yaml'
@@ -8611,3 +8950,20 @@ class TestEventProcessing(ZuulTestCase):
dict(name='tagjob', result='SUCCESS'),
dict(name='checkjob', result='SUCCESS', changes='1,1'),
], ordered=False)
+
+
+class TestWaitForInit(ZuulTestCase):
+ tenant_config_file = 'config/single-tenant/main.yaml'
+ wait_for_init = True
+
+ def setUp(self):
+ with self.assertLogs('zuul.Scheduler-0', level='DEBUG') as full_logs:
+ super().setUp()
+ self.assertRegexInList('Waiting for tenant initialization',
+ full_logs.output)
+
+ def test_wait_for_init(self):
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
+ A.addApproval('Code-Review', 2)
+ self.fake_gerrit.addEvent(A.addApproval('Approved', 1))
+ self.waitUntilSettled()
diff --git a/tests/unit/test_sos.py b/tests/unit/test_sos.py
index 13dbac4ff..f371a8064 100644
--- a/tests/unit/test_sos.py
+++ b/tests/unit/test_sos.py
@@ -55,6 +55,79 @@ class TestScaleOutScheduler(ZuulTestCase):
dict(name='project-test2', result='SUCCESS', changes='1,1'),
], ordered=False)
+ def test_pipeline_cache_clear(self):
+ # Test that the pipeline cache on a second scheduler isn't
+ # holding old change objects.
+
+ # Hold jobs in build
+ sched1 = self.scheds.first
+ self.executor_server.hold_jobs_in_build = True
+
+ # We need a pair of changes in order to populate the pipeline
+ # change cache (a single change doesn't activate the cache,
+ # it's for dependencies).
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
+ A.addApproval('Code-Review', 2)
+ B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
+ B.addApproval('Code-Review', 2)
+ B.addApproval('Approved', 1)
+ B.setDependsOn(A, 1)
+
+ # Fail a job
+ self.executor_server.failJob('project-test1', A)
+
+ # Enqueue into gate with scheduler 1
+ self.fake_gerrit.addEvent(A.addApproval('Approved', 1))
+ self.waitUntilSettled()
+
+ # Start scheduler 2
+ sched2 = self.createScheduler()
+ sched2.start()
+ self.assertEqual(len(self.scheds), 2)
+
+ # Pause scheduler 1
+ with sched1.sched.run_handler_lock:
+ # Release jobs
+ self.executor_server.hold_jobs_in_build = False
+ self.executor_server.release()
+ # Wait for scheduler 2 to dequeue
+ self.waitUntilSettled(matcher=[sched2])
+ # Unpause scheduler 1
+ self.assertEqual(A.data['status'], 'NEW')
+ self.assertEqual(B.data['status'], 'NEW')
+
+ # Clear zk change cache
+ self.fake_gerrit._change_cache.prune([], max_age=0)
+
+ # At this point, scheduler 1 should have a bogus change entry
+ # in the pipeline cache because scheduler 2 performed the
+ # dequeue so scheduler 1 never cleaned up its cache.
+
+ self.executor_server.fail_tests.clear()
+ self.executor_server.hold_jobs_in_build = True
+ # Pause scheduler 1
+ with sched1.sched.run_handler_lock:
+ # Enqueue into gate with scheduler 2
+ self.fake_gerrit.addEvent(A.addApproval('Approved', 1))
+ self.waitUntilSettled(matcher=[sched2])
+
+ # Pause scheduler 2
+ with sched2.sched.run_handler_lock:
+ # Make sure that scheduler 1 does some pipeline runs which
+ # reconstitute state from ZK. This gives it the
+ # opportunity to use old cache data if we don't clear it.
+
+ # Release job1
+ self.executor_server.release()
+ self.waitUntilSettled(matcher=[sched1])
+ # Release job2
+ self.executor_server.hold_jobs_in_build = False
+ self.executor_server.release()
+ # Wait for scheduler 1 to merge change
+ self.waitUntilSettled(matcher=[sched1])
+ self.assertEqual(A.data['status'], 'MERGED')
+ self.assertEqual(B.data['status'], 'MERGED')
+
@simple_layout('layouts/multi-scheduler-status.yaml')
def test_multi_scheduler_status(self):
self.hold_merge_jobs_in_queue = True
@@ -211,8 +284,7 @@ class TestScaleOutScheduler(ZuulTestCase):
self.executor_server.hold_jobs_in_build = True
A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
- A.addApproval('Code-Review', 2)
- self.fake_gerrit.addEvent(A.addApproval('Approved', 1))
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
self.waitUntilSettled()
# Delete the change cache
@@ -220,6 +292,12 @@ class TestScaleOutScheduler(ZuulTestCase):
if hasattr(connection, '_change_cache'):
connection.maintainCache([], max_age=0)
+ B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
+ B.data["commitMessage"] = "{}\n\nDepends-On: {}\n".format(
+ B.subject, A.data["url"]
+ )
+ self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
+
# Release
self.executor_server.hold_jobs_in_build = False
self.executor_server.release()
@@ -229,6 +307,9 @@ class TestScaleOutScheduler(ZuulTestCase):
dict(name='project-merge', result='SUCCESS', changes='1,1'),
dict(name='project-test1', result='SUCCESS', changes='1,1'),
dict(name='project-test2', result='SUCCESS', changes='1,1'),
+ dict(name='project-merge', result='SUCCESS', changes='1,1 2,1'),
+ dict(name='project-test1', result='SUCCESS', changes='1,1 2,1'),
+ dict(name='project-test2', result='SUCCESS', changes='1,1 2,1'),
], ordered=False)
def test_pipeline_summary(self):
diff --git a/tests/unit/test_streaming.py b/tests/unit/test_streaming.py
index f323cd82a..ba3117f59 100644
--- a/tests/unit/test_streaming.py
+++ b/tests/unit/test_streaming.py
@@ -295,6 +295,11 @@ class TestStreaming(TestStreamingBase):
match = r.search(self.streaming_data[None])
self.assertNotEqual(match, None)
+ # Check that we logged loop_var contents properly
+ pattern = r'ok: "(one|two|three)"'
+ m = re.search(pattern, self.streaming_data[None])
+ self.assertNotEqual(m, None)
+
def runWSClient(self, port, build_uuid):
client = WSClient(port, build_uuid)
client.event.wait()
diff --git a/tests/unit/test_tracing.py b/tests/unit/test_tracing.py
new file mode 100644
index 000000000..3c452dd53
--- /dev/null
+++ b/tests/unit/test_tracing.py
@@ -0,0 +1,199 @@
+# Copyright 2022 Acme Gating, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import time
+
+from tests.base import iterate_timeout, ZuulTestCase
+
+import zuul.lib.tracing as tracing
+from opentelemetry import trace
+
+
+def attributes_to_dict(attrlist):
+ ret = {}
+ for attr in attrlist:
+ ret[attr.key] = attr.value.string_value
+ return ret
+
+
+class TestTracing(ZuulTestCase):
+ config_file = 'zuul-tracing.conf'
+ tenant_config_file = "config/single-tenant/main.yaml"
+
+ def test_tracing_api(self):
+ tracer = trace.get_tracer("zuul")
+
+ # We have a lot of timestamps stored as floats, so make sure
+ # our root span is a ZuulSpan that can handle that input.
+ span_info = tracing.startSavedSpan('parent-trace',
+ start_time=time.time(),
+ attributes={'startattr': 'bar'},
+ include_attributes=True)
+
+ # Simulate a reconstructed root span
+ span = tracing.restoreSpan(span_info)
+
+ # Within the root span, use the more typical OpenTelemetry
+ # context manager api.
+ with trace.use_span(span):
+ with tracer.start_span('child1-trace') as child1_span:
+ link = trace.Link(child1_span.context,
+ attributes={'relationship': 'prev'})
+
+ # Make sure that we can manually start and stop a child span,
+ # and that it is a ZuulSpan as well.
+ with trace.use_span(span):
+ child = tracer.start_span('child2-trace', start_time=time.time(),
+ links=[link])
+ child.end(end_time=time.time())
+
+ # Make sure that we can start a child span from a span
+ # context and not a full span:
+ span_context = tracing.getSpanContext(span)
+ with tracing.startSpanInContext(span_context, 'child3-trace') as child:
+ child.end(end_time=time.time())
+
+ # End our root span manually.
+ tracing.endSavedSpan(span_info, end_time=time.time(),
+ attributes={'endattr': 'baz'})
+
+ for _ in iterate_timeout(60, "request to arrive"):
+ if len(self.otlp.requests) == 4:
+ break
+ req1 = self.otlp.requests[0]
+ self.log.debug("Received:\n%s", req1)
+ attrs = attributes_to_dict(req1.resource_spans[0].resource.attributes)
+ self.assertEqual({"service.name": "zuultest"}, attrs)
+ self.assertEqual("zuul",
+ req1.resource_spans[0].scope_spans[0].scope.name)
+ span1 = req1.resource_spans[0].scope_spans[0].spans[0]
+ self.assertEqual("child1-trace", span1.name)
+
+ req2 = self.otlp.requests[1]
+ self.log.debug("Received:\n%s", req2)
+ span2 = req2.resource_spans[0].scope_spans[0].spans[0]
+ self.assertEqual("child2-trace", span2.name)
+ self.assertEqual(span2.links[0].span_id, span1.span_id)
+ attrs = attributes_to_dict(span2.links[0].attributes)
+ self.assertEqual({"relationship": "prev"}, attrs)
+
+ req3 = self.otlp.requests[2]
+ self.log.debug("Received:\n%s", req3)
+ span3 = req3.resource_spans[0].scope_spans[0].spans[0]
+ self.assertEqual("child3-trace", span3.name)
+
+ req4 = self.otlp.requests[3]
+ self.log.debug("Received:\n%s", req4)
+ span4 = req4.resource_spans[0].scope_spans[0].spans[0]
+ self.assertEqual("parent-trace", span4.name)
+ attrs = attributes_to_dict(span4.attributes)
+ self.assertEqual({"startattr": "bar",
+ "endattr": "baz"}, attrs)
+
+ self.assertEqual(span1.trace_id, span4.trace_id)
+ self.assertEqual(span2.trace_id, span4.trace_id)
+ self.assertEqual(span3.trace_id, span4.trace_id)
+
+ def test_tracing_api_null(self):
+ tracer = trace.get_tracer("zuul")
+
+ # Test that restoring spans and span contexts works with
+ # null values.
+
+ span_info = None
+ # Simulate a reconstructed root span from a null value
+ span = tracing.restoreSpan(span_info)
+
+ # Within the root span, use the more typical OpenTelemetry
+ # context manager api.
+ with trace.use_span(span):
+ with tracer.start_span('child1-trace') as child1_span:
+ link = trace.Link(child1_span.context,
+ attributes={'relationship': 'prev'})
+
+ # Make sure that we can manually start and stop a child span,
+ # and that it is a ZuulSpan as well.
+ with trace.use_span(span):
+ child = tracer.start_span('child2-trace', start_time=time.time(),
+ links=[link])
+ child.end(end_time=time.time())
+
+ # Make sure that we can start a child span from a null span
+ # context:
+ span_context = None
+ with tracing.startSpanInContext(span_context, 'child3-trace') as child:
+ child.end(end_time=time.time())
+
+ # End our root span manually.
+ span.end(end_time=time.time())
+
+ for _ in iterate_timeout(60, "request to arrive"):
+ if len(self.otlp.requests) == 3:
+ break
+ req1 = self.otlp.requests[0]
+ self.log.debug("Received:\n%s", req1)
+ attrs = attributes_to_dict(req1.resource_spans[0].resource.attributes)
+ self.assertEqual({"service.name": "zuultest"}, attrs)
+ self.assertEqual("zuul",
+ req1.resource_spans[0].scope_spans[0].scope.name)
+ span1 = req1.resource_spans[0].scope_spans[0].spans[0]
+ self.assertEqual("child1-trace", span1.name)
+
+ req2 = self.otlp.requests[1]
+ self.log.debug("Received:\n%s", req2)
+ span2 = req2.resource_spans[0].scope_spans[0].spans[0]
+ self.assertEqual("child2-trace", span2.name)
+ self.assertEqual(span2.links[0].span_id, span1.span_id)
+ attrs = attributes_to_dict(span2.links[0].attributes)
+ self.assertEqual({"relationship": "prev"}, attrs)
+
+ req3 = self.otlp.requests[2]
+ self.log.debug("Received:\n%s", req3)
+ span3 = req3.resource_spans[0].scope_spans[0].spans[0]
+ self.assertEqual("child3-trace", span3.name)
+
+ self.assertNotEqual(span1.trace_id, span2.trace_id)
+ self.assertNotEqual(span2.trace_id, span3.trace_id)
+ self.assertNotEqual(span1.trace_id, span3.trace_id)
+
+ def test_tracing(self):
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
+ A.addApproval('Code-Review', 2)
+ self.fake_gerrit.addEvent(A.addApproval('Approved', 1))
+ self.waitUntilSettled()
+
+ for _ in iterate_timeout(60, "request to arrive"):
+ if len(self.otlp.requests) >= 2:
+ break
+
+ buildset = self.getSpan('BuildSet')
+ self.log.debug("Received:\n%s", buildset)
+ item = self.getSpan('QueueItem')
+ self.log.debug("Received:\n%s", item)
+ self.assertEqual(item.trace_id, buildset.trace_id)
+ self.assertNotEqual(item.span_id, buildset.span_id)
+ self.assertTrue(buildset.start_time_unix_nano >=
+ item.start_time_unix_nano)
+ self.assertTrue(buildset.end_time_unix_nano <=
+ item.end_time_unix_nano)
+ item_attrs = attributes_to_dict(item.attributes)
+ self.assertTrue(item_attrs['ref_number'] == "1")
+ self.assertTrue(item_attrs['ref_patchset'] == "1")
+ self.assertTrue('zuul_event_id' in item_attrs)
+
+ def getSpan(self, name):
+ for req in self.otlp.requests:
+ span = req.resource_spans[0].scope_spans[0].spans[0]
+ if span.name == name:
+ return span
diff --git a/tests/unit/test_v3.py b/tests/unit/test_v3.py
index 23c78b3ef..fe5b46e0c 100644
--- a/tests/unit/test_v3.py
+++ b/tests/unit/test_v3.py
@@ -25,12 +25,14 @@ from time import sleep
from unittest import skip, skipIf
from zuul.lib import yamlutil
+import fixtures
import git
import paramiko
import zuul.configloader
from zuul.lib import yamlutil as yaml
from zuul.model import MergeRequest
+from zuul.zk.blob_store import BlobStore
from tests.base import (
AnsibleZuulTestCase,
@@ -865,6 +867,62 @@ class TestBranchMismatch(ZuulTestCase):
dict(name='project-test2', result='SUCCESS', changes='1,1'),
], ordered=False)
+ def test_implied_branch_matcher_regex(self):
+ # Test that branch names that look like regexes aren't treated
+ # as such for implied branch matchers.
+
+ # Make sure the parent job repo is branched, so it gets
+ # implied branch matchers.
+
+ # The '+' in the branch name would cause the change not to
+ # match if it is treated as a regex.
+ self.create_branch('org/project1', 'feature/foo-0.1.12+bar')
+ self.fake_gerrit.addEvent(
+ self.fake_gerrit.getFakeBranchCreatedEvent(
+ 'org/project1', 'feature/foo-0.1.12+bar'))
+
+ A = self.fake_gerrit.addFakeChange(
+ 'org/project1', 'feature/foo-0.1.12+bar', 'A')
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertHistory([
+ dict(name='project-test1', result='SUCCESS', changes='1,1'),
+ ], ordered=False)
+
+ def test_implied_branch_matcher_pragma_syntax_error(self):
+ # Test that syntax errors are reported if the implied branch
+ # matcher pragma is set. This catches potential errors when
+ # serializing configuration errors since the pragma causes
+ # extra information to be added to the error source context.
+ self.create_branch('org/project1', 'feature/test')
+ self.fake_gerrit.addEvent(
+ self.fake_gerrit.getFakeBranchCreatedEvent(
+ 'org/project1', 'feature/test'))
+
+ in_repo_conf = textwrap.dedent(
+ """
+ - job:
+ name: project-test1
+ nodeset: bar
+ - pragma:
+ implied-branches:
+ - master
+ - feature/r1
+ """)
+ file_dict = {'zuul.yaml': in_repo_conf}
+ A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A',
+ files=file_dict)
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertHistory([])
+ self.assertEqual(A.data['status'], 'NEW')
+ self.assertEqual(A.reported, 1,
+ "A should report failure")
+ self.assertIn('nodeset "bar" was not found', A.messages[0],
+ "A should have a syntax error reported")
+
class TestBranchRef(ZuulTestCase):
tenant_config_file = 'config/branch-ref/main.yaml'
@@ -1421,6 +1479,38 @@ class TestInRepoConfig(ZuulTestCase):
"A should have failed the check pipeline")
self.assertHistory([])
+ def test_dynamic_nonexistent_job_dependency(self):
+ # Tests that a reference to a nonexistent job dependency is an
+ # error.
+ in_repo_conf = textwrap.dedent(
+ """
+ - job:
+ name: project-test1
+ run: playbooks/project-test1.yaml
+
+ - project:
+ name: org/project
+ check:
+ jobs:
+ - project-test1:
+ dependencies:
+ - name: non-existent-job
+ soft: true
+ """)
+
+ file_dict = {'.zuul.yaml': in_repo_conf}
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A',
+ files=file_dict)
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+ self.assertEqual(A.reported, 1,
+ "A should report failure")
+ self.assertEqual(A.patchsets[0]['approvals'][0]['value'], "-1")
+ self.assertIn('Job non-existent-job not defined', A.messages[0],
+ "A should have failed the check pipeline")
+ self.assertNotIn('freezing', A.messages[0])
+ self.assertHistory([])
+
def test_dynamic_config_new_patchset(self):
self.executor_server.hold_jobs_in_build = True
@@ -1692,6 +1782,25 @@ class TestInRepoConfig(ZuulTestCase):
self.assertIn('while constructing a mapping', A.messages[0],
"A should have a syntax error reported")
+ def test_yaml_dict_error3(self):
+ in_repo_conf = textwrap.dedent(
+ """
+ - job:
+ """)
+
+ file_dict = {'.zuul.yaml': in_repo_conf}
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A',
+ files=file_dict)
+ A.addApproval('Code-Review', 2)
+ self.fake_gerrit.addEvent(A.addApproval('Approved', 1))
+ self.waitUntilSettled()
+
+ self.assertEqual(A.data['status'], 'NEW')
+ self.assertEqual(A.reported, 1,
+ "A should report failure")
+ self.assertIn('is not a dictionary', A.messages[0],
+ "A should have a syntax error reported")
+
def test_yaml_duplicate_key_error(self):
in_repo_conf = textwrap.dedent(
"""
@@ -2573,6 +2682,69 @@ class TestInRepoConfig(ZuulTestCase):
self.assertIn('Debug information:',
A.messages[0], "A should have debug info")
+ def test_nodeset_alternates_cycle(self):
+ in_repo_conf = textwrap.dedent(
+ """
+ - nodeset:
+ name: red
+ alternatives: [blue]
+ - nodeset:
+ name: blue
+ alternatives: [red]
+ - job:
+ name: project-test1
+ run: playbooks/project-test1.yaml
+ nodeset: blue
+ """)
+
+ file_dict = {'.zuul.yaml': in_repo_conf}
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A',
+ files=file_dict)
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertEqual(A.reported, 1)
+ self.assertIn("cycle detected", A.messages[0])
+
+ def test_nodeset_alternates_missing_from_nodeset(self):
+ in_repo_conf = textwrap.dedent(
+ """
+ - nodeset:
+ name: red
+ alternatives: [blue]
+ - job:
+ name: project-test1
+ run: playbooks/project-test1.yaml
+ """)
+
+ file_dict = {'.zuul.yaml': in_repo_conf}
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A',
+ files=file_dict)
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertEqual(A.reported, 1)
+ self.assertIn('nodeset "blue" was not found', A.messages[0])
+
+ def test_nodeset_alternates_missing_from_job(self):
+ in_repo_conf = textwrap.dedent(
+ """
+ - job:
+ name: project-test1
+ run: playbooks/project-test1.yaml
+ nodeset:
+ alternatives: [red]
+ """)
+
+ file_dict = {'.zuul.yaml': in_repo_conf}
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A',
+ files=file_dict)
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertEqual(A.reported, 1)
+ self.assertIn('nodeset "red" was not found', A.messages[0])
+
@skipIfMultiScheduler()
# See comment in TestInRepoConfigDir.scheduler_count for further
# details.
@@ -2880,6 +3052,41 @@ class TestInRepoConfigDir(ZuulTestCase):
], ordered=True)
+class TestExtraConfigInDependent(ZuulTestCase):
+ # in org/project2, jobs are defined in extra config paths, while
+ # project is defined in .zuul.yaml
+ tenant_config_file = 'config/in-repo-dir/main.yaml'
+ scheduler_count = 1
+
+ def test_extra_config_in_dependent_change(self):
+ # Test that when jobs are defined in a extra-config-paths in a repo, if
+ # another change is dependent on a change of that repo, the jobs should
+ # still be loaded.
+
+ # Add an empty zuul.yaml here so we are triggering dynamic layout load
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A',
+ files={'zuul.yaml': ''})
+ B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B',
+ files={'zuul.yaml': ''})
+ # A Depends-On: B who has private jobs defined in extra-config-paths
+ A.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
+ A.subject, B.data['url'])
+
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ # Jobs in both changes should be success
+ self.assertHistory([
+ dict(name='project2-private-extra-file', result='SUCCESS',
+ changes='2,1'),
+ dict(name='project2-private-extra-dir', result='SUCCESS',
+ changes='2,1'),
+ dict(name='project-test1', result='SUCCESS',
+ changes='2,1 1,1'),
+ ], ordered=False)
+
+
class TestGlobalRepoState(AnsibleZuulTestCase):
config_file = 'zuul-connections-gerrit-and-github.conf'
tenant_config_file = 'config/global-repo-state/main.yaml'
@@ -3589,9 +3796,9 @@ class TestInRepoJoin(ZuulTestCase):
class FunctionalAnsibleMixIn(object):
# A temporary class to hold new tests while others are disabled
+ # These should be overridden in child classes.
tenant_config_file = 'config/ansible/main.yaml'
- # This should be overriden in child classes.
- ansible_version = '2.9'
+ ansible_major_minor = 'X.Y'
def test_playbook(self):
# This test runs a bit long and needs extra time.
@@ -3677,8 +3884,12 @@ class FunctionalAnsibleMixIn(object):
build_python27.uuid + '.secrets')
with open(secrets_path) as f:
self.assertEqual(f.read(), "test-username test-password")
+ build_bubblewrap = self.getJobFromHistory('bubblewrap')
+ with self.jobLog(build_bubblewrap):
+ self.assertEqual(build_bubblewrap.result, 'SUCCESS')
def test_repo_ansible(self):
+ self.executor_server.keep_jobdir = True
A = self.fake_gerrit.addFakeChange('org/ansible', 'master', 'A')
self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
self.waitUntilSettled()
@@ -3688,103 +3899,21 @@ class FunctionalAnsibleMixIn(object):
self.assertHistory([
dict(name='hello-ansible', result='SUCCESS', changes='1,1'),
])
+ build = self.getJobFromHistory('hello-ansible', result='SUCCESS')
+ with open(build.jobdir.job_output_file) as f:
+ output = f.read()
+ self.assertIn(f'Ansible version={self.ansible_major_minor}',
+ output)
- def _add_job(self, job_name):
- conf = textwrap.dedent(
- """
- - job:
- name: {job_name}
- run: playbooks/{job_name}.yaml
- ansible-version: {ansible_version}
-
- - project:
- check:
- jobs:
- - {job_name}
- """.format(job_name=job_name,
- ansible_version=self.ansible_version))
-
- file_dict = {'.zuul.yaml': conf}
- A = self.fake_gerrit.addFakeChange('org/plugin-project', 'master', 'A',
- files=file_dict)
- self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
- def _test_plugins(self, plugin_tests):
- # This test runs a bit long and needs extra time.
- self.wait_timeout = 180
+class TestAnsible5(AnsibleZuulTestCase, FunctionalAnsibleMixIn):
+ tenant_config_file = 'config/ansible/main5.yaml'
+ ansible_major_minor = '2.12'
- # Keep the jobdir around so we can inspect contents if an
- # assert fails.
- self.executor_server.keep_jobdir = True
- # Output extra ansible info so we might see errors.
- self.executor_server.verbose = True
- count = 0
-
- # Kick off all test jobs in parallel
- for job_name, result in plugin_tests:
- count += 1
- self._add_job(job_name)
- # Wait for all jobs to complete
- self.waitUntilSettled()
-
- # Check the correct number of jobs ran
- self.assertEqual(count, len(self.history))
- # Check the job results
- for job_name, result in plugin_tests:
- build = self.getJobFromHistory(job_name)
- with self.jobLog(build):
- self.assertEqual(build.result, result)
-
- # TODOv3(jeblair): parse the ansible output and verify we're
- # getting the exception we expect.
-
- def test_plugins_1(self):
- '''
- Split plugin tests to avoid timeouts and exceeding subunit
- report lengths.
- '''
- plugin_tests = [
- ('passwd', 'FAILURE'),
- ('cartesian', 'SUCCESS'),
- ('consul_kv', 'FAILURE'),
- ('credstash', 'FAILURE'),
- ('csvfile_good', 'SUCCESS'),
- ('csvfile_bad', 'FAILURE'),
- ('uri_bad_path', 'FAILURE'),
- ('uri_bad_scheme', 'FAILURE'),
- ]
- self._test_plugins(plugin_tests)
-
- def test_plugins_2(self):
- '''
- Split plugin tests to avoid timeouts and exceeding subunit
- report lengths.
- '''
- plugin_tests = [
- ('block_local_override', 'FAILURE'),
- ('file_local_good', 'SUCCESS'),
- ('file_local_bad', 'FAILURE'),
- ('fileglob_local_good', 'SUCCESS'),
- ('fileglob_local_bad', 'FAILURE'),
- ('find_local_good', 'SUCCESS'),
- ('find_local_bad', 'FAILURE'),
- ('zuul_return', 'SUCCESS'),
- ('password_create_good', 'SUCCESS'),
- ('password_null_good', 'SUCCESS'),
- ('password_read_good', 'SUCCESS'),
- ('password_create_bad', 'FAILURE'),
- ('password_read_bad', 'FAILURE'),
- ]
- self._test_plugins(plugin_tests)
-
-
-class TestAnsible28(AnsibleZuulTestCase, FunctionalAnsibleMixIn):
- ansible_version = '2.8'
-
-
-class TestAnsible29(AnsibleZuulTestCase, FunctionalAnsibleMixIn):
- ansible_version = '2.9'
+class TestAnsible6(AnsibleZuulTestCase, FunctionalAnsibleMixIn):
+ tenant_config_file = 'config/ansible/main6.yaml'
+ ansible_major_minor = '2.13'
class TestPrePlaybooks(AnsibleZuulTestCase):
@@ -4868,7 +4997,7 @@ class TestDataReturn(AnsibleZuulTestCase):
self.assertIn(
'- data-return https://zuul.example.com/',
A.messages[-1])
- self.assertTrue(re.search('child .* SKIPPED', A.messages[-1]))
+ self.assertTrue('Skipped 1 job' in A.messages[-1])
self.assertIn('Build succeeded', A.messages[-1])
def test_data_return_invalid_child_job(self):
@@ -4881,7 +5010,7 @@ class TestDataReturn(AnsibleZuulTestCase):
self.assertIn(
'- data-return-invalid-child-job https://zuul.example.com',
A.messages[-1])
- self.assertTrue(re.search('data-return .* SKIPPED', A.messages[-1]))
+ self.assertTrue('Skipped 1 job' in A.messages[-1])
self.assertIn('Build succeeded', A.messages[-1])
def test_data_return_skip_all_child_jobs(self):
@@ -4895,8 +5024,7 @@ class TestDataReturn(AnsibleZuulTestCase):
self.assertIn(
'- data-return-skip-all https://zuul.example.com/',
A.messages[-1])
- self.assertTrue(re.search('child .* SKIPPED', A.messages[-1]))
- self.assertTrue(re.search('data-return .* SKIPPED', A.messages[-1]))
+ self.assertTrue('Skipped 2 jobs' in A.messages[-1])
self.assertIn('Build succeeded', A.messages[-1])
def test_data_return_skip_all_child_jobs_with_soft_dependencies(self):
@@ -4910,8 +5038,7 @@ class TestDataReturn(AnsibleZuulTestCase):
])
self.assertIn('- data-return-cd https://zuul.example.com/',
A.messages[-1])
- self.assertTrue(re.search('data-return-a .* SKIPPED', A.messages[-1]))
- self.assertTrue(re.search('data-return-b .* SKIPPED', A.messages[-1]))
+ self.assertTrue('Skipped 2 jobs' in A.messages[-1])
self.assertIn('Build succeeded', A.messages[-1])
def test_several_zuul_return(self):
@@ -4925,9 +5052,22 @@ class TestDataReturn(AnsibleZuulTestCase):
self.assertIn(
'- several-zuul-return-child https://zuul.example.com/',
A.messages[-1])
- self.assertTrue(re.search('data-return .* SKIPPED', A.messages[-1]))
+ self.assertTrue('Skipped 1 job' in A.messages[-1])
self.assertIn('Build succeeded', A.messages[-1])
+ def test_data_return_skip_retry(self):
+ A = self.fake_gerrit.addFakeChange(
+ 'org/project-skip-retry',
+ 'master',
+ 'A'
+ )
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+ self.assertHistory([
+ dict(name='skip-retry-return', result='FAILURE',
+ changes='1,1'),
+ ])
+
def test_data_return_child_jobs_failure(self):
A = self.fake_gerrit.addFakeChange('org/project5', 'master', 'A')
self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
@@ -5587,6 +5727,39 @@ class TestSecrets(ZuulTestCase):
self._getSecrets('project2-complex', 'playbooks'),
[secret])
+ def test_blobstore_secret(self):
+ # Test the large secret blob store
+ self.executor_server.hold_jobs_in_build = True
+ self.useFixture(fixtures.MonkeyPatch(
+ 'zuul.model.Job.SECRET_BLOB_SIZE',
+ 1))
+
+ A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ context = self.scheds.first.sched.createZKContext(None, self.log)
+ bs = BlobStore(context)
+ self.assertEqual(len(bs), 1)
+
+ self.scheds.first.sched._runBlobStoreCleanup()
+ self.assertEqual(len(bs), 1)
+
+ self.executor_server.hold_jobs_in_build = False
+ self.executor_server.release()
+ self.waitUntilSettled()
+
+ self.assertEqual(A.reported, 1, "A should report success")
+ self.assertHistory([
+ dict(name='project1-secret', result='SUCCESS', changes='1,1'),
+ ])
+ self.assertEqual(
+ [{'secret_name': self.secret}],
+ self._getSecrets('project1-secret', 'playbooks'))
+
+ self.scheds.first.sched._runBlobStoreCleanup()
+ self.assertEqual(len(bs), 0)
+
class TestSecretInheritance(ZuulTestCase):
tenant_config_file = 'config/secret-inheritance/main.yaml'
@@ -6395,68 +6568,21 @@ class TestJobOutput(AnsibleZuulTestCase):
self.assertIn('Final playbook failed', log_output)
self.assertIn('Failure test', log_output)
-
-class TestPlugins(AnsibleZuulTestCase):
- tenant_config_file = 'config/speculative-plugins/main.yaml'
-
- def _run_job(self, job_name, project='org/project', roles=''):
- # Output extra ansible info so we might see errors.
- self.executor_server.verbose = True
- conf = textwrap.dedent(
- """
- - job:
- name: {job_name}
- run: playbooks/{job_name}/test.yaml
- nodeset:
- nodes:
- - name: controller
- label: whatever
- {roles}
- - project:
- check:
- jobs:
- - {job_name}
- """.format(job_name=job_name, roles=roles))
-
- file_dict = {'zuul.yaml': conf}
- A = self.fake_gerrit.addFakeChange(project, 'master', 'A',
- files=file_dict)
+ def test_job_POST_FAILURE_reports_statsd(self):
+ """Test that POST_FAILURES output job stats."""
+ self.statsd.clear()
+ A = self.fake_gerrit.addFakeChange('org/project2', 'master', 'A')
self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
self.waitUntilSettled()
- return A
-
- def _check_job(self, job_name, project='org/project', roles=''):
- A = self._run_job(job_name, project, roles)
-
- message = A.messages[0]
- self.assertIn('ERROR Ansible plugin dir', message)
- self.assertIn('found adjacent to playbook', message)
- self.assertIn('in non-trusted repo', message)
-
- def test_filter_plugin(self):
- self._check_job('filter-plugin-playbook')
- self._check_job('filter-plugin-playbook-symlink')
- self._check_job('filter-plugin-bare-role')
- self._check_job('filter-plugin-role')
- self._check_job('filter-plugin-repo-role', project='org/projectrole',
- roles="roles: [{zuul: 'org/projectrole'}]")
- self._check_job('filter-plugin-shared-role',
- roles="roles: [{zuul: 'org/project2'}]")
- self._check_job(
- 'filter-plugin-shared-bare-role',
- roles="roles: [{zuul: 'org/project3', name: 'shared'}]")
-
- def test_implicit_role_not_added(self):
- # This fails because the job uses the role which isn't added
- # to the role path, but it's a normal ansible failure, not a
- # Zuul executor error.
- A = self._run_job('filter-plugin-repo-role', project='org/projectrole')
self.assertHistory([
- dict(name='filter-plugin-repo-role', result='FAILURE',
- changes='1,1'),
+ dict(name='job-output-failure',
+ result='POST_FAILURE', changes='1,1'),
], ordered=False)
- message = A.messages[0]
- self.assertNotIn('Ansible plugin', message)
+ post_failure_stat = 'zuul.tenant.tenant-one.pipeline.check.project.' \
+ 'review_example_com.org_project2.master.job.' \
+ 'job-output-failure.POST_FAILURE'
+ self.assertReportedStat(post_failure_stat, value='1', kind='c')
+ self.assertReportedStat(post_failure_stat, kind='ms')
class TestNoLog(AnsibleZuulTestCase):
@@ -6486,6 +6612,51 @@ class TestNoLog(AnsibleZuulTestCase):
self.assertNotIn('my-very-secret-password-2', text_log)
+class TestJsonStringResults(AnsibleZuulTestCase):
+ tenant_config_file = 'config/ansible-json-string-results/main.yaml'
+
+ def _get_file(self, build, path):
+ p = os.path.join(build.jobdir.root, path)
+ with open(p) as f:
+ return f.read()
+
+ def test_ansible_json_string_results(self):
+ """Test modules that return string results are captured
+
+ The yum/dnf modules are seemily almost unique in setting
+ "results" in their module return value to a list of strings
+ (other things might too, but not many other built-in
+ components). Confusingly, when using loops in ansible the
+ output also has a "results" which is a list of dicts with
+ return values from each iteration.
+
+ The zuul_json callback handler needs to deal with both; We've
+ broken this before making changes to its results parsing.
+ This test fakes some string return values like the yum modules
+ do, and ensures they are captured.
+
+ """
+
+ self.executor_server.keep_jobdir = True
+
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
+
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ json_log = self._get_file(self.history[0], 'work/logs/job-output.json')
+ text_log = self._get_file(self.history[0], 'work/logs/job-output.txt')
+
+ self.assertIn('if you see this string, it is working', json_log)
+ # Note the text log doesn't include the detail of the returned
+ # results, just the msg field, hence to following "not in"
+ self.assertNotIn('if you see this string, it is working', text_log)
+ self.assertIn('A plugin message', text_log)
+ # no_log checking
+ self.assertNotIn('this is a secret string', json_log)
+ self.assertNotIn('this is a secret string', text_log)
+
+
class TestUnreachable(AnsibleZuulTestCase):
tenant_config_file = 'config/ansible-unreachable/main.yaml'
@@ -6799,7 +6970,7 @@ class TestJobPause(AnsibleZuulTestCase):
dict(name='compile', result='SUCCESS', changes='1,1'),
])
- self.assertTrue(re.search('test .* SKIPPED', A.messages[0]))
+ self.assertTrue('Skipped 1 job' in A.messages[0])
def test_job_pause_pre_skipped_child(self):
"""
@@ -6847,7 +7018,7 @@ class TestJobPause(AnsibleZuulTestCase):
dict(name='compile', result='SUCCESS', changes='1,1'),
])
- self.assertTrue(re.search('test .* SKIPPED', A.messages[0]))
+ self.assertTrue('Skipped 1 job' in A.messages[0])
def test_job_pause_skipped_child_retry(self):
"""
@@ -7716,7 +7887,7 @@ class TestProvidesRequiresMysql(ZuulTestCase):
dict(name='image-builder', result='FAILURE', changes='1,1'),
dict(name='hold', result='SUCCESS', changes='1,1'),
], ordered=False)
- self.assertTrue(re.search('image-user .* SKIPPED', A.messages[0]))
+ self.assertTrue('Skipped 1 job' in A.messages[0])
B = self.fake_gerrit.addFakeChange('org/project1', 'master', 'B')
B.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
@@ -7835,8 +8006,8 @@ class TestAnsibleVersion(AnsibleZuulTestCase):
self.assertHistory([
dict(name='ansible-default', result='SUCCESS', changes='1,1'),
- dict(name='ansible-28', result='SUCCESS', changes='1,1'),
- dict(name='ansible-29', result='SUCCESS', changes='1,1'),
+ dict(name='ansible-5', result='SUCCESS', changes='1,1'),
+ dict(name='ansible-6', result='SUCCESS', changes='1,1'),
], ordered=False)
@@ -7855,8 +8026,8 @@ class TestDefaultAnsibleVersion(AnsibleZuulTestCase):
self.assertHistory([
dict(name='ansible-default-zuul-conf', result='SUCCESS',
changes='1,1'),
- dict(name='ansible-28', result='SUCCESS', changes='1,1'),
- dict(name='ansible-29', result='SUCCESS', changes='1,1'),
+ dict(name='ansible-5', result='SUCCESS', changes='1,1'),
+ dict(name='ansible-6', result='SUCCESS', changes='1,1'),
], ordered=False)
@@ -7988,3 +8159,124 @@ class TestConnectionVars(AnsibleZuulTestCase):
# job_output = self._get_file(job, 'work/logs/job-output.txt')
# self.log.debug(job_output)
# self.assertNotIn("/bin/du", job_output)
+
+
+class IncludeBranchesTestCase(ZuulTestCase):
+ def _test_include_branches(self, history1, history2, history3, history4):
+ self.create_branch('org/project', 'stable')
+ self.create_branch('org/project', 'feature/foo')
+ self.fake_gerrit.addEvent(
+ self.fake_gerrit.getFakeBranchCreatedEvent(
+ 'org/project', 'stable'))
+ self.fake_gerrit.addEvent(
+ self.fake_gerrit.getFakeBranchCreatedEvent(
+ 'org/project', 'feature/foo'))
+ self.waitUntilSettled()
+
+ # Test the jobs on the master branch.
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertHistory(history1, ordered=False)
+
+ # Test the jobs on the excluded feature branch.
+ B = self.fake_gerrit.addFakeChange('org/project', 'feature/foo', 'A')
+ self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertHistory(history1 + history2, ordered=False)
+
+ # Test in-repo config proposed on the excluded feature branch.
+ conf = textwrap.dedent(
+ """
+ - job:
+ name: project-dynamic
+
+ - project:
+ check:
+ jobs:
+ - project-dynamic
+ """)
+ file_dict = {'zuul.yaml': conf}
+ C = self.fake_gerrit.addFakeChange('org/project', 'feature/foo', 'A',
+ files=file_dict)
+ self.fake_gerrit.addEvent(C.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertHistory(history1 + history2 + history3, ordered=False)
+
+ old = self.scheds.first.sched.tenant_layout_state.get('tenant-one')
+ # Merge a change to the excluded feature branch.
+ B.addApproval('Code-Review', 2)
+ self.fake_gerrit.addEvent(B.addApproval('Approved', 1))
+ self.waitUntilSettled()
+ self.assertEqual(B.data['status'], 'MERGED')
+ self.assertHistory(history1 + history2 + history3 + history4,
+ ordered=False)
+ new = self.scheds.first.sched.tenant_layout_state.get('tenant-one')
+ # Verify we haven't performed a tenant reconfiguration
+ self.assertTrue(old == new)
+
+
+class TestIncludeBranchesProject(IncludeBranchesTestCase):
+ tenant_config_file = 'config/dynamic-only-project/include.yaml'
+
+ def test_include_branches(self):
+ history1 = [
+ dict(name='central-test', result='SUCCESS', changes='1,1'),
+ dict(name='project-test', result='SUCCESS', changes='1,1'),
+ ]
+ history2 = [
+ dict(name='central-test', result='SUCCESS', changes='2,1'),
+ ]
+ history3 = [
+ dict(name='central-test', result='SUCCESS', changes='3,1'),
+ ]
+ history4 = [
+ dict(name='central-test', result='SUCCESS', changes='2,1'),
+ ]
+ self._test_include_branches(history1, history2, history3, history4)
+
+
+class TestExcludeBranchesProject(IncludeBranchesTestCase):
+ tenant_config_file = 'config/dynamic-only-project/exclude.yaml'
+
+ def test_exclude_branches(self):
+ history1 = [
+ dict(name='central-test', result='SUCCESS', changes='1,1'),
+ dict(name='project-test', result='SUCCESS', changes='1,1'),
+ ]
+ history2 = [
+ dict(name='central-test', result='SUCCESS', changes='2,1'),
+ ]
+ history3 = [
+ dict(name='central-test', result='SUCCESS', changes='3,1'),
+ ]
+ history4 = [
+ dict(name='central-test', result='SUCCESS', changes='2,1'),
+ ]
+ self._test_include_branches(history1, history2, history3, history4)
+
+
+class TestDynamicBranchesProject(IncludeBranchesTestCase):
+ tenant_config_file = 'config/dynamic-only-project/dynamic.yaml'
+
+ def test_dynamic_branches(self):
+ history1 = [
+ dict(name='central-test', result='SUCCESS', changes='1,1'),
+ dict(name='project-test', result='SUCCESS', changes='1,1'),
+ ]
+ history2 = [
+ dict(name='central-test', result='SUCCESS', changes='2,1'),
+ dict(name='project-test', result='SUCCESS', changes='2,1'),
+ ]
+ history3 = [
+ dict(name='central-test', result='SUCCESS', changes='3,1'),
+ dict(name='project-dynamic', result='SUCCESS', changes='3,1'),
+ ]
+ history4 = [
+ dict(name='central-test', result='SUCCESS', changes='2,1'),
+ dict(name='project-test', result='SUCCESS', changes='2,1'),
+ ]
+ self._test_include_branches(history1, history2, history3, history4)
diff --git a/tests/unit/test_web.py b/tests/unit/test_web.py
index 9be7efd2b..d8901fabb 100644
--- a/tests/unit/test_web.py
+++ b/tests/unit/test_web.py
@@ -28,6 +28,7 @@ from unittest import skip
import requests
from zuul.lib.statsd import normalize_statsd_name
+from zuul.zk.locks import tenant_write_lock
import zuul.web
from tests.base import ZuulTestCase, AnsibleZuulTestCase
@@ -259,6 +260,8 @@ class TestWeb(BaseTestWeb):
def test_web_tenants(self):
"Test that we can retrieve JSON status info"
+ # Disable tenant list caching
+ self.web.web.api.cache_expiry = 0
self.add_base_changes()
self.executor_server.hold_jobs_in_build = True
A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
@@ -315,6 +318,7 @@ class TestWeb(BaseTestWeb):
'baseurl': 'https://review.example.com',
'canonical_hostname': 'review.example.com',
'server': 'review.example.com',
+ 'ssh_server': 'review.example.com',
'port': 29418,
}
self.assertEqual([connection], data)
@@ -337,6 +341,82 @@ class TestWeb(BaseTestWeb):
self.assertEqual(1, len(data), data)
self.assertEqual("org/project1", data[0]['project'], data)
+ @simple_layout('layouts/nodeset-alternatives.yaml')
+ def test_web_find_job_nodeset_alternatives(self):
+ # test a complex nodeset
+ data = self.get_url('api/tenant/tenant-one/job/test-job').json()
+
+ self.assertEqual([
+ {'abstract': False,
+ 'ansible_version': None,
+ 'attempts': 3,
+ 'branches': [],
+ 'cleanup_run': [],
+ 'deduplicate': 'auto',
+ 'dependencies': [],
+ 'description': None,
+ 'extra_variables': {},
+ 'files': [],
+ 'final': False,
+ 'group_variables': {},
+ 'host_variables': {},
+ 'intermediate': False,
+ 'irrelevant_files': [],
+ 'match_on_config_updates': True,
+ 'name': 'test-job',
+ 'nodeset_alternatives': [{'alternatives': [],
+ 'groups': [],
+ 'name': 'fast-nodeset',
+ 'nodes': [{'aliases': [],
+ 'comment': None,
+ 'hold_job': None,
+ 'id': None,
+ 'label': 'fast-label',
+ 'name': 'controller',
+ 'requestor': None,
+ 'state': 'unknown',
+ 'tenant_name': None,
+ 'user_data': None}]},
+ {'alternatives': [],
+ 'groups': [],
+ 'name': '',
+ 'nodes': [{'aliases': [],
+ 'comment': None,
+ 'hold_job': None,
+ 'id': None,
+ 'label': 'slow-label',
+ 'name': 'controller',
+ 'requestor': None,
+ 'state': 'unknown',
+ 'tenant_name': None,
+ 'user_data': None}]}],
+ 'override_checkout': None,
+ 'parent': 'base',
+ 'post_review': None,
+ 'post_run': [],
+ 'pre_run': [],
+ 'protected': None,
+ 'provides': [],
+ 'required_projects': [],
+ 'requires': [],
+ 'roles': [{'implicit': True,
+ 'project_canonical_name':
+ 'review.example.com/org/common-config',
+ 'target_name': 'common-config',
+ 'type': 'zuul'}],
+ 'run': [],
+ 'semaphores': [],
+ 'source_context': {'branch': 'master',
+ 'path': 'zuul.yaml',
+ 'project': 'org/common-config'},
+ 'tags': [],
+ 'timeout': None,
+ 'variables': {},
+ 'variant_description': '',
+ 'voting': True,
+ 'workspace_scheme': 'golang',
+ }], data)
+
def test_web_find_job(self):
# can we fetch the variants for a single job
data = self.get_url('api/tenant/tenant-one/job/project-test1').json()
@@ -371,6 +451,7 @@ class TestWeb(BaseTestWeb):
'ansible_version': None,
'attempts': 4,
'branches': [],
+ 'deduplicate': 'auto',
'dependencies': [],
'description': None,
'files': [],
@@ -379,6 +460,7 @@ class TestWeb(BaseTestWeb):
'match_on_config_updates': True,
'final': False,
'nodeset': {
+ 'alternatives': [],
'groups': [],
'name': '',
'nodes': [{'comment': None,
@@ -387,7 +469,9 @@ class TestWeb(BaseTestWeb):
'label': 'label1',
'name': 'controller',
'aliases': [],
+ 'requestor': None,
'state': 'unknown',
+ 'tenant_name': None,
'user_data': None}],
},
'override_checkout': None,
@@ -419,6 +503,7 @@ class TestWeb(BaseTestWeb):
'ansible_version': None,
'attempts': 3,
'branches': ['stable'],
+ 'deduplicate': 'auto',
'dependencies': [],
'description': None,
'files': [],
@@ -427,6 +512,7 @@ class TestWeb(BaseTestWeb):
'match_on_config_updates': True,
'final': False,
'nodeset': {
+ 'alternatives': [],
'groups': [],
'name': '',
'nodes': [{'comment': None,
@@ -435,7 +521,9 @@ class TestWeb(BaseTestWeb):
'label': 'label2',
'name': 'controller',
'aliases': [],
+ 'requestor': None,
'state': 'unknown',
+ 'tenant_name': None,
'user_data': None}],
},
'override_checkout': None,
@@ -471,6 +559,7 @@ class TestWeb(BaseTestWeb):
'ansible_version': None,
'attempts': 3,
'branches': [],
+ 'deduplicate': 'auto',
'dependencies': [],
'description': None,
'files': [],
@@ -594,6 +683,7 @@ class TestWeb(BaseTestWeb):
'ansible_version': None,
'attempts': 3,
'branches': [],
+ 'deduplicate': 'auto',
'dependencies': [],
'description': None,
'files': [],
@@ -632,6 +722,7 @@ class TestWeb(BaseTestWeb):
'ansible_version': None,
'attempts': 3,
'branches': [],
+ 'deduplicate': 'auto',
'dependencies': [{'name': 'project-merge',
'soft': False}],
'description': None,
@@ -671,6 +762,7 @@ class TestWeb(BaseTestWeb):
'ansible_version': None,
'attempts': 3,
'branches': [],
+ 'deduplicate': 'auto',
'dependencies': [{'name': 'project-merge',
'soft': False}],
'description': None,
@@ -710,6 +802,7 @@ class TestWeb(BaseTestWeb):
'ansible_version': None,
'attempts': 3,
'branches': [],
+ 'deduplicate': 'auto',
'dependencies': [{'name': 'project-merge',
'soft': False}],
'description': None,
@@ -761,19 +854,17 @@ class TestWeb(BaseTestWeb):
'merge_mode': 'merge-resolve',
'pipelines': [{
'name': 'check',
- 'queue_name': None,
'jobs': jobs,
}, {
'name': 'gate',
- 'queue_name': 'integrated-overridden',
'jobs': jobs,
}, {'name': 'post',
- 'queue_name': None,
'jobs': [[
{'abstract': False,
'ansible_version': None,
'attempts': 3,
'branches': [],
+ 'deduplicate': 'auto',
'dependencies': [],
'description': None,
'files': [],
@@ -925,6 +1016,11 @@ class TestWeb(BaseTestWeb):
self.assertEqual("reason text", ah_request['reason'])
self.assertEqual([], ah_request['nodes'])
+ # Unknown tenants return 404
+ resp = self.get_url(
+ "api/tenant/tenant-fifty/autohold")
+ self.assertEqual(404, resp.status_code, resp.text)
+
def test_admin_routes_404_by_default(self):
resp = self.post_url(
"api/tenant/tenant-one/project/org/project/autohold",
@@ -984,6 +1080,11 @@ class TestWeb(BaseTestWeb):
job = self.get_url("api/tenant/tenant-one/job/noop").json()
self.assertEqual("noop", job[0]["name"])
+ @simple_layout('layouts/special-characters-job.yaml')
+ def test_web_job_special_characters(self):
+ job = self.get_url("api/tenant/tenant-one/job/a%40b%2Fc").json()
+ self.assertEqual("a@b/c", job[0]["name"])
+
def test_freeze_jobs(self):
# Test can get a list of the jobs for a given project+pipeline+branch.
resp = self.get_url(
@@ -1040,7 +1141,7 @@ class TestWeb(BaseTestWeb):
job_params = {
'job': 'project-test1',
- 'ansible_version': '2.9',
+ 'ansible_version': '5',
'timeout': None,
'post_timeout': None,
'items': [],
@@ -1048,6 +1149,7 @@ class TestWeb(BaseTestWeb):
'branch': 'master',
'cleanup_playbooks': [],
'nodeset': {
+ 'alternatives': [],
'groups': [],
'name': '',
'nodes': [
@@ -1057,7 +1159,9 @@ class TestWeb(BaseTestWeb):
'id': None,
'label': 'label1',
'name': 'controller',
+ 'requestor': None,
'state': 'unknown',
+ 'tenant_name': None,
'user_data': None}]},
'override_branch': None,
'override_checkout': None,
@@ -1136,14 +1240,15 @@ class TestWeb(BaseTestWeb):
"noop")
job_params = {
- 'ansible_version': '2.9',
+ 'ansible_version': '5',
'branch': 'master',
'extra_vars': {},
'group_vars': {},
'host_vars': {},
'items': [],
'job': 'noop',
- 'nodeset': {'groups': [], 'name': '', 'nodes': []},
+ 'nodeset': {'alternatives': [],
+ 'groups': [], 'name': '', 'nodes': []},
'override_branch': None,
'override_checkout': None,
'post_timeout': None,
@@ -1221,6 +1326,94 @@ class TestWebStatusDisplayBranch(BaseTestWeb):
class TestWebMultiTenant(BaseTestWeb):
tenant_config_file = 'config/multi-tenant/main.yaml'
+ def test_tenant_reconfigure_command(self):
+ # The 'zuul-scheduler tenant-reconfigure' and full-reconfigure
+ # are used to correct problems, and as such they clear the
+ # branch cache. Until the reconfiguration is complete,
+ # zuul-web will be unable to load configuration for any tenant
+ # which has projects that have been cleared from the branch
+ # cache. This test verifies that we retry that operation
+ # after encountering missing branch errors.
+ sched = self.scheds.first.sched
+ web = self.web.web
+ # Don't perform any automatic config updates on zuul web so
+ # that we can control the sequencing.
+ self.web.web._system_config_running = False
+ self.web.web.system_config_cache_wake_event.set()
+ self.web.web.system_config_thread.join()
+
+ first_state = sched.tenant_layout_state.get('tenant-one')
+ self.assertEqual(first_state,
+ web.local_layout_state.get('tenant-one'))
+
+ data = self.get_url('api/tenant/tenant-one/jobs').json()
+ self.assertEqual(len(data), 4)
+
+ # Reconfigure tenant-one so that the layout state will be
+ # different and we can start a layout update in zuul-web
+ # later.
+ self.log.debug("Reconfigure tenant-one")
+ self.scheds.first.tenantReconfigure(['tenant-one'])
+ self.waitUntilSettled()
+ self.log.debug("Done reconfigure tenant-one")
+
+ second_state = sched.tenant_layout_state.get('tenant-one')
+ self.assertEqual(second_state,
+ sched.local_layout_state.get('tenant-one'))
+ self.assertEqual(first_state,
+ web.local_layout_state.get('tenant-one'))
+
+ self.log.debug("Grab write lock for tenant-two")
+ with tenant_write_lock(self.zk_client, 'tenant-two') as lock:
+ # Start a reconfiguration of tenant-two; allow it to
+ # proceed past the point that the branch cache is cleared
+ # and is waiting on the lock we hold.
+ self.scheds.first.tenantReconfigure(
+ ['tenant-two'], command_socket=True)
+ for _ in iterate_timeout(30, "reconfiguration to start"):
+ if 'RECONFIG' in lock.contenders():
+ break
+ # Now that the branch cache is cleared as part of the
+ # tenant-two reconfiguration, allow zuul-web to
+ # reconfigure tenant-one. This should produce an error
+ # because of the missing branch cache.
+ self.log.debug("Web update layout 1")
+ self.web.web.updateSystemConfig()
+ self.assertFalse(self.web.web.updateLayout())
+ self.log.debug("Web update layout done")
+
+ self.assertEqual(second_state,
+ sched.local_layout_state.get('tenant-one'))
+ self.assertEqual(first_state,
+ web.local_layout_state.get('tenant-one'))
+
+ # Make sure we can still access tenant-one's config via
+ # zuul-web
+ data = self.get_url('api/tenant/tenant-one/jobs').json()
+ self.assertEqual(len(data), 4)
+ self.log.debug("Release write lock for tenant-two")
+ for _ in iterate_timeout(30, "reconfiguration to finish"):
+ if 'RECONFIG' not in lock.contenders():
+ break
+
+ self.log.debug("Web update layout 2")
+ self.web.web.updateSystemConfig()
+ self.web.web.updateLayout()
+ self.log.debug("Web update layout done")
+
+ # Depending on tenant order, we may need to run one more time
+ self.log.debug("Web update layout 3")
+ self.web.web.updateSystemConfig()
+ self.assertTrue(self.web.web.updateLayout())
+ self.log.debug("Web update layout done")
+
+ self.assertEqual(second_state,
+ sched.local_layout_state.get('tenant-one'))
+ self.assertEqual(second_state,
+ web.local_layout_state.get('tenant-one'))
+ data = self.get_url('api/tenant/tenant-one/jobs').json()
+ self.assertEqual(len(data), 4)
+
def test_web_labels_allowed_list(self):
labels = ["tenant-one-label", "fake", "tenant-two-label"]
self.fake_nodepool.registerLauncher(labels, "FakeLauncher2")
@@ -1235,6 +1428,8 @@ class TestWebMultiTenant(BaseTestWeb):
def test_tenant_add_remove(self):
"Test that tenants are correctly added/removed to/from the layout"
+ # Disable tenant list caching
+ self.web.web.api.cache_expiry = 0
resp = self.get_url("api/tenants")
data = resp.json()
self.assertEqual(sorted(d["name"] for d in data),
@@ -1259,6 +1454,94 @@ class TestWebMultiTenant(BaseTestWeb):
sorted(["tenant-one", "tenant-two", "tenant-four"]))
+class TestWebGlobalSemaphores(BaseTestWeb):
+ tenant_config_file = 'config/global-semaphores-config/main.yaml'
+
+ def test_web_semaphores(self):
+ self.executor_server.hold_jobs_in_build = True
+ A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
+ self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertBuilds([
+ dict(name='test-global-semaphore', changes='1,1'),
+ dict(name='test-common-semaphore', changes='1,1'),
+ dict(name='test-project1-semaphore', changes='1,1'),
+ dict(name='test-global-semaphore', changes='2,1'),
+ dict(name='test-common-semaphore', changes='2,1'),
+ dict(name='test-project2-semaphore', changes='2,1'),
+ ])
+
+ tenant1_buildset_uuid = self.builds[0].parameters['zuul']['buildset']
+ data = self.get_url('api/tenant/tenant-one/semaphores').json()
+
+ expected = [
+ {'name': 'common-semaphore',
+ 'global': False,
+ 'max': 10,
+ 'holders': {
+ 'count': 1,
+ 'this_tenant': [
+ {'buildset_uuid': tenant1_buildset_uuid,
+ 'job_name': 'test-common-semaphore'}
+ ],
+ 'other_tenants': 0
+ }},
+ {'name': 'global-semaphore',
+ 'global': True,
+ 'max': 100,
+ 'holders': {
+ 'count': 2,
+ 'this_tenant': [
+ {'buildset_uuid': tenant1_buildset_uuid,
+ 'job_name': 'test-global-semaphore'}
+ ],
+ 'other_tenants': 1
+ }},
+ {'name': 'project1-semaphore',
+ 'global': False,
+ 'max': 11,
+ 'holders': {
+ 'count': 1,
+ 'this_tenant': [
+ {'buildset_uuid': tenant1_buildset_uuid,
+ 'job_name': 'test-project1-semaphore'}
+ ],
+ 'other_tenants': 0
+ }}
+ ]
+ self.assertEqual(expected, data)
+
+
+class TestEmptyConfig(BaseTestWeb):
+ tenant_config_file = 'config/empty-config/main.yaml'
+
+ def test_empty_config_startup(self):
+ # Test that we can bootstrap a tenant with an empty config
+
+ resp = self.get_url("api/tenant/tenant-one/jobs").json()
+ self.assertEqual(len(resp), 1)
+ self.commitConfigUpdate(
+ 'common-config',
+ 'config/empty-config/git/common-config/new-zuul.yaml')
+ self.scheds.execute(lambda app: app.sched.reconfigure(app.config))
+ self.waitUntilSettled()
+
+ layout_scheduler = self.scheds.first.sched.local_layout_state.get(
+ 'tenant-one')
+ for _ in iterate_timeout(10, "local layout of zuul-web to be updated"):
+ layout_web = self.web.web.local_layout_state.get('tenant-one')
+ if layout_web == layout_scheduler:
+ break
+
+ resp = self.get_url("api/tenant/tenant-one/jobs").json()
+ self.assertEqual(len(resp), 3)
+
+
class TestWebSecrets(BaseTestWeb):
tenant_config_file = 'config/secrets/main.yaml'
@@ -1337,6 +1620,7 @@ class TestWebCapabilitiesInfo(TestInfo):
'type': 'JWT',
'scope': 'openid profile',
'driver': 'OpenIDConnect',
+ 'load_user_info': True,
},
'myOIDC2': {
'authority': 'http://oidc2',
@@ -1344,6 +1628,7 @@ class TestWebCapabilitiesInfo(TestInfo):
'type': 'JWT',
'scope': 'openid profile email special-scope',
'driver': 'OpenIDConnect',
+ 'load_user_info': True,
},
'zuul.example.com': {
'authority': 'zuul_operator',
@@ -1715,6 +2000,33 @@ class TestTenantScopedWebApi(BaseTestWeb):
'pipeline': 'check'})
self.assertEqual(401, resp.status_code)
+ def test_bad_format_JWT_token(self):
+ token = 'thisisnotwhatatokenshouldbelike'
+ resp = self.post_url(
+ "api/tenant/tenant-one/project/org/project/autohold",
+ headers={'Authorization': 'Bearer %s' % token},
+ json={'job': 'project-test1',
+ 'count': 1,
+ 'reason': 'because',
+ 'node_hold_expiration': 36000})
+ self.assertEqual(401, resp.status_code)
+ resp = self.post_url(
+ "api/tenant/tenant-one/project/org/project/enqueue",
+ headers={'Authorization': 'Bearer %s' % token},
+ json={'trigger': 'gerrit',
+ 'change': '2,1',
+ 'pipeline': 'check'})
+ self.assertEqual(401, resp.status_code)
+ resp = self.post_url(
+ "api/tenant/tenant-one/project/org/project/enqueue",
+ headers={'Authorization': 'Bearer %s' % token},
+ json={'trigger': 'gerrit',
+ 'ref': 'abcd',
+ 'newrev': 'aaaa',
+ 'oldrev': 'bbbb',
+ 'pipeline': 'check'})
+ self.assertEqual(401, resp.status_code)
+
def test_expired_JWT_token(self):
authz = {'iss': 'zuul_operator',
'sub': 'testuser',
@@ -2205,6 +2517,172 @@ class TestTenantScopedWebApi(BaseTestWeb):
self.assertEqual(B.reported, 2)
self.assertEqual(C.data['status'], 'MERGED')
self.assertEqual(C.reported, 2)
+ self.assertEqual(self.countJobResults(self.history, 'ABORTED'), 1)
+ self.assertEqual(len(self.history), 10)
+
+ def test_promote_no_change(self):
+ """Test that jobs are not unecessarily restarted when promoting"""
+ self.executor_server.hold_jobs_in_build = True
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
+ B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
+ C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
+ A.addApproval('Code-Review', 2)
+ B.addApproval('Code-Review', 2)
+ C.addApproval('Code-Review', 2)
+
+ self.fake_gerrit.addEvent(A.addApproval('Approved', 1))
+ self.fake_gerrit.addEvent(B.addApproval('Approved', 1))
+ self.fake_gerrit.addEvent(C.addApproval('Approved', 1))
+
+ self.waitUntilSettled()
+
+ tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
+ items = tenant.layout.pipelines['gate'].getAllItems()
+ enqueue_times = {}
+ for item in items:
+ enqueue_times[str(item.change)] = item.enqueue_time
+
+ # REST API
+ args = {'pipeline': 'gate',
+ 'changes': ['1,1', '2,1', '3,1']}
+ authz = {'iss': 'zuul_operator',
+ 'aud': 'zuul.example.com',
+ 'sub': 'testuser',
+ 'zuul': {
+ 'admin': ['tenant-one', ],
+ },
+ 'exp': time.time() + 3600,
+ 'iat': time.time()}
+ token = jwt.encode(authz, key='NoDanaOnlyZuul',
+ algorithm='HS256')
+ req = self.post_url(
+ 'api/tenant/tenant-one/promote',
+ headers={'Authorization': 'Bearer %s' % token},
+ json=args)
+ self.assertEqual(200, req.status_code, req.text)
+ data = req.json()
+ self.assertEqual(True, data)
+
+ # ensure that enqueue times are durable
+ items = tenant.layout.pipelines['gate'].getAllItems()
+ for item in items:
+ self.assertEqual(
+ enqueue_times[str(item.change)], item.enqueue_time)
+
+ self.waitUntilSettled()
+ self.executor_server.release('.*-merge')
+ self.waitUntilSettled()
+ self.executor_server.release('.*-merge')
+ self.waitUntilSettled()
+ self.executor_server.release('.*-merge')
+ self.waitUntilSettled()
+
+ self.assertEqual(len(self.builds), 6)
+ self.assertEqual(self.builds[0].name, 'project-test1')
+ self.assertEqual(self.builds[1].name, 'project-test2')
+ self.assertEqual(self.builds[2].name, 'project-test1')
+ self.assertEqual(self.builds[3].name, 'project-test2')
+ self.assertEqual(self.builds[4].name, 'project-test1')
+ self.assertEqual(self.builds[5].name, 'project-test2')
+
+ self.assertTrue(self.builds[0].hasChanges(A))
+ self.assertFalse(self.builds[0].hasChanges(B))
+ self.assertFalse(self.builds[0].hasChanges(C))
+
+ self.assertTrue(self.builds[2].hasChanges(A))
+ self.assertTrue(self.builds[2].hasChanges(B))
+ self.assertFalse(self.builds[2].hasChanges(C))
+
+ self.assertTrue(self.builds[4].hasChanges(A))
+ self.assertTrue(self.builds[4].hasChanges(B))
+ self.assertTrue(self.builds[4].hasChanges(C))
+
+ self.executor_server.release()
+ self.waitUntilSettled()
+
+ self.assertEqual(A.data['status'], 'MERGED')
+ self.assertEqual(A.reported, 2)
+ self.assertEqual(B.data['status'], 'MERGED')
+ self.assertEqual(B.reported, 2)
+ self.assertEqual(C.data['status'], 'MERGED')
+ self.assertEqual(C.reported, 2)
+ # The promote should be a noop, so no canceled jobs
+ self.assertEqual(self.countJobResults(self.history, 'ABORTED'), 0)
+ self.assertEqual(len(self.history), 9)
+
+ def test_promote_check(self):
+ """Test that a change can be promoted via the admin web interface"""
+ self.executor_server.hold_jobs_in_build = True
+ # Make a patch series so that we have some non-live items in
+ # the pipeline and we can make sure they are not promoted.
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
+ B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
+ B.setDependsOn(A, 1)
+ C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
+ C.setDependsOn(B, 1)
+
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
+ self.fake_gerrit.addEvent(C.getPatchsetCreatedEvent(1))
+
+ self.waitUntilSettled()
+
+ tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
+ items = [i for i in tenant.layout.pipelines['check'].getAllItems()
+ if i.live]
+ enqueue_times = {}
+ for item in items:
+ enqueue_times[str(item.change)] = item.enqueue_time
+
+ # REST API
+ args = {'pipeline': 'check',
+ 'changes': ['2,1', '3,1']}
+ authz = {'iss': 'zuul_operator',
+ 'aud': 'zuul.example.com',
+ 'sub': 'testuser',
+ 'zuul': {
+ 'admin': ['tenant-one', ],
+ },
+ 'exp': time.time() + 3600,
+ 'iat': time.time()}
+ token = jwt.encode(authz, key='NoDanaOnlyZuul',
+ algorithm='HS256')
+ req = self.post_url(
+ 'api/tenant/tenant-one/promote',
+ headers={'Authorization': 'Bearer %s' % token},
+ json=args)
+ self.assertEqual(200, req.status_code, req.text)
+ data = req.json()
+ self.assertEqual(True, data)
+ self.waitUntilSettled()
+
+ # ensure that enqueue times are durable
+ items = [i for i in tenant.layout.pipelines['check'].getAllItems()
+ if i.live]
+ for item in items:
+ self.assertEqual(
+ enqueue_times[str(item.change)], item.enqueue_time)
+
+ # We can't reliably test for side effects in the check
+ # pipeline since the change queues are independent, so we
+ # directly examine the queues.
+ queue_items = [(item.change.number, item.live) for item in
+ tenant.layout.pipelines['check'].getAllItems()]
+ expected = [('1', False),
+ ('2', True),
+ ('1', False),
+ ('2', False),
+ ('3', True),
+ ('1', True)]
+ self.assertEqual(expected, queue_items)
+
+ self.executor_server.release('.*-merge')
+ self.waitUntilSettled()
+ self.executor_server.release()
+ self.waitUntilSettled()
+ # No jobs should be canceled
+ self.assertEqual(self.countJobResults(self.history, 'ABORTED'), 0)
+ self.assertEqual(len(self.history), 9)
def test_tenant_authorizations_override(self):
"""Test that user gets overriden tenant authz if allowed"""
@@ -2661,16 +3139,19 @@ class TestHeldAttributeInBuildInfo(BaseTestWeb):
class TestWebMulti(BaseTestWeb):
- config_file = 'zuul-gerrit-github.conf'
+ config_file = 'zuul-gerrit-ssh.conf'
def test_web_connections_list_multi(self):
data = self.get_url('api/connections').json()
+ port = self.web.connections.connections['gerrit'].web_server.port
+ url = f'http://localhost:{port}'
gerrit_connection = {
'driver': 'gerrit',
'name': 'gerrit',
- 'baseurl': 'https://review.example.com',
+ 'baseurl': url,
'canonical_hostname': 'review.example.com',
'server': 'review.example.com',
+ 'ssh_server': 'ssh-review.example.com',
'port': 29418,
}
github_connection = {
@@ -2679,6 +3160,7 @@ class TestWebMulti(BaseTestWeb):
'driver': 'github',
'name': 'github',
'server': 'github.com',
+ 'repo_cache': None,
}
self.assertEqual([gerrit_connection, github_connection], data)
@@ -2699,7 +3181,7 @@ class TestCLIViaWebApi(BaseTestWeb):
token = jwt.encode(authz, key='NoDanaOnlyZuul',
algorithm='HS256')
p = subprocess.Popen(
- [os.path.join(sys.prefix, 'bin/zuul'),
+ [os.path.join(sys.prefix, 'bin/zuul-admin'),
'--zuul-url', self.base_url, '--auth-token', token,
'autohold', '--reason', 'some reason',
'--tenant', 'tenant-one', '--project', 'org/project',
@@ -2738,7 +3220,7 @@ class TestCLIViaWebApi(BaseTestWeb):
token = jwt.encode(authz, key='NoDanaOnlyZuul',
algorithm='HS256')
p = subprocess.Popen(
- [os.path.join(sys.prefix, 'bin/zuul'),
+ [os.path.join(sys.prefix, 'bin/zuul-admin'),
'--zuul-url', self.base_url, '--auth-token', token,
'enqueue', '--tenant', 'tenant-one',
'--project', 'org/project',
@@ -2767,7 +3249,7 @@ class TestCLIViaWebApi(BaseTestWeb):
token = jwt.encode(authz, key='NoDanaOnlyZuul',
algorithm='HS256')
p = subprocess.Popen(
- [os.path.join(sys.prefix, 'bin/zuul'),
+ [os.path.join(sys.prefix, 'bin/zuul-admin'),
'--zuul-url', self.base_url, '--auth-token', token,
'enqueue-ref', '--tenant', 'tenant-one',
'--project', 'org/project',
@@ -2806,7 +3288,7 @@ class TestCLIViaWebApi(BaseTestWeb):
token = jwt.encode(authz, key='NoDanaOnlyZuul',
algorithm='HS256')
p = subprocess.Popen(
- [os.path.join(sys.prefix, 'bin/zuul'),
+ [os.path.join(sys.prefix, 'bin/zuul-admin'),
'--zuul-url', self.base_url, '--auth-token', token,
'dequeue', '--tenant', 'tenant-one', '--project', 'org/project',
'--pipeline', 'periodic', '--ref', 'refs/heads/stable'],
@@ -2857,7 +3339,7 @@ class TestCLIViaWebApi(BaseTestWeb):
token = jwt.encode(authz, key='NoDanaOnlyZuul',
algorithm='HS256')
p = subprocess.Popen(
- [os.path.join(sys.prefix, 'bin/zuul'),
+ [os.path.join(sys.prefix, 'bin/zuul-admin'),
'--zuul-url', self.base_url, '--auth-token', token,
'promote', '--tenant', 'tenant-one',
'--pipeline', 'gate', '--changes', '2,1', '3,1'],
@@ -2972,3 +3454,25 @@ class TestWebStartup(ZuulTestCase):
# If the config didn't load correctly, we won't have the jobs
jobs = self.get_url("api/tenant/tenant-one/jobs").json()
self.assertEqual(len(jobs), 10)
+
+
+class TestWebUnprotectedBranches(BaseWithWeb):
+ config_file = 'zuul-github-driver.conf'
+ tenant_config_file = 'config/unprotected-branches/main.yaml'
+
+ def test_no_protected_branches(self):
+ """Regression test to check that zuul-web doesn't display
+ config errors when no protected branch exists."""
+ self.startWebServer()
+ tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
+
+ project2 = tenant.untrusted_projects[1]
+ tpc2 = tenant.project_configs[project2.canonical_name]
+
+ # project2 should have no parsed branch
+ self.assertEqual(0, len(tpc2.parsed_branch_config.keys()))
+
+ # Zuul-web should not display any config errors
+ config_errors = self.get_url(
+ "api/tenant/tenant-one/config-errors").json()
+ self.assertEqual(len(config_errors), 0)
diff --git a/tests/unit/test_zk.py b/tests/unit/test_zk.py
index f3b664da2..fc6a47b93 100644
--- a/tests/unit/test_zk.py
+++ b/tests/unit/test_zk.py
@@ -1,4 +1,5 @@
# Copyright 2019 Red Hat, Inc.
+# Copyright 2022 Acme Gating, LLC
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
@@ -12,6 +13,7 @@
# License for the specific language governing permissions and limitations
# under the License.
+from collections import defaultdict
import json
import queue
import threading
@@ -23,6 +25,7 @@ from zuul import model
from zuul.lib import yamlutil as yaml
from zuul.model import BuildRequest, HoldRequest, MergeRequest
from zuul.zk import ZooKeeperClient
+from zuul.zk.blob_store import BlobStore
from zuul.zk.branch_cache import BranchCache
from zuul.zk.change_cache import (
AbstractChangeCache,
@@ -1287,7 +1290,7 @@ class TestLayoutStore(ZooKeeperBaseTestCase):
"github": 456,
}
state = LayoutState("tenant", "hostname", 0, layout_uuid,
- branch_cache_min_ltimes)
+ branch_cache_min_ltimes, -1)
store["tenant"] = state
self.assertEqual(state, store["tenant"])
self.assertNotEqual(state.ltime, -1)
@@ -1298,12 +1301,42 @@ class TestLayoutStore(ZooKeeperBaseTestCase):
def test_ordering(self):
layout_uuid = uuid.uuid4().hex
state_one = LayoutState("tenant", "hostname", 1, layout_uuid,
- {}, ltime=1)
+ {}, -1, ltime=1)
state_two = LayoutState("tenant", "hostname", 2, layout_uuid,
- {}, ltime=2)
+ {}, -1, ltime=2)
self.assertGreater(state_two, state_one)
+ def test_cleanup(self):
+ store = LayoutStateStore(self.zk_client, lambda: None)
+ min_ltimes = defaultdict(lambda x: -1)
+ min_ltimes['foo'] = 1
+ state_one = LayoutState("tenant", "hostname", 1, uuid.uuid4().hex,
+ {}, -1, ltime=1)
+ state_two = LayoutState("tenant", "hostname", 2, uuid.uuid4().hex,
+ {}, -1, ltime=2)
+ store.setMinLtimes(state_one, min_ltimes)
+ store.setMinLtimes(state_two, min_ltimes)
+ store['tenant'] = state_one
+ # Run with the default delay of 5 minutes; nothing should be deleted.
+ store.cleanup()
+ self.assertEqual(store.get('tenant'), state_one)
+ self.assertIsNotNone(
+ self.zk_client.client.exists(
+ f'/zuul/layout-data/{state_one.uuid}'))
+ self.assertIsNotNone(
+ self.zk_client.client.exists(
+ f'/zuul/layout-data/{state_two.uuid}'))
+ # Run again with immediate deletion
+ store.cleanup(delay=0)
+ self.assertEqual(store.get('tenant'), state_one)
+ self.assertIsNotNone(
+ self.zk_client.client.exists(
+ f'/zuul/layout-data/{state_one.uuid}'))
+ self.assertIsNone(
+ self.zk_client.client.exists(
+ f'/zuul/layout-data/{state_two.uuid}'))
+
class TestSystemConfigCache(ZooKeeperBaseTestCase):
@@ -1319,7 +1352,7 @@ class TestSystemConfigCache(ZooKeeperBaseTestCase):
"use_relative_priority": True,
"max_hold_expiration": 7200,
"default_hold_expiration": 3600,
- "default_ansible_version": "2.9",
+ "default_ansible_version": "5",
"web_root": "/web/root",
"web_status_url": "/web/status",
"websocket_url": "/web/socket",
@@ -1801,9 +1834,9 @@ class TestBranchCache(ZooKeeperBaseTestCase):
sorted(cache.getProjectBranches('project1', True)),
test_data['project1']['protected']
)
- self.assertEqual(
- cache.getProjectBranches('project1', False),
- None,
+ self.assertRaises(
+ LookupError,
+ lambda: cache.getProjectBranches('project1', False)
)
cache.setProjectBranches('project1', False,
@@ -1829,21 +1862,21 @@ class TestBranchCache(ZooKeeperBaseTestCase):
},
}
- self.assertEqual(
- cache.getProjectBranches('project1', True),
- None
+ self.assertRaises(
+ LookupError,
+ lambda: cache.getProjectBranches('project1', True)
)
- self.assertEqual(
- cache.getProjectBranches('project1', False),
- None
+ self.assertRaises(
+ LookupError,
+ lambda: cache.getProjectBranches('project1', False)
)
# Test the other order; all followed by protected-only
cache.setProjectBranches('project1', False,
test_data['project1']['all'])
- self.assertEqual(
- cache.getProjectBranches('project1', True),
- None
+ self.assertRaises(
+ LookupError,
+ lambda: cache.getProjectBranches('project1', True)
)
self.assertEqual(
sorted(cache.getProjectBranches('project1', False)),
@@ -1914,6 +1947,18 @@ class TestBranchCache(ZooKeeperBaseTestCase):
data1['project1']['all']
)
+ def test_branch_cache_lookup_error(self):
+ # Test that a missing branch cache entry results in a LookupError
+ conn = DummyConnection()
+ cache = BranchCache(self.zk_client, conn, self.component_registry)
+ self.assertRaises(
+ LookupError,
+ lambda: cache.getProjectBranches('project1', True)
+ )
+ self.assertIsNone(
+ cache.getProjectBranches('project1', True, default=None)
+ )
+
class TestConfigurationErrorList(ZooKeeperBaseTestCase):
def test_config_error_list(self):
@@ -1948,3 +1993,37 @@ class TestConfigurationErrorList(ZooKeeperBaseTestCase):
self.assertEqual(el1.errors[0], e1)
self.assertNotEqual(e1, e2)
self.assertEqual([e1, e2], [e1, e2])
+
+
+class TestBlobStore(ZooKeeperBaseTestCase):
+ def test_blob_store(self):
+ stop_event = threading.Event()
+ self.zk_client.client.create('/zuul/pipeline', makepath=True)
+ # Create a new object
+ tenant_name = 'fake_tenant'
+
+ start_ltime = self.zk_client.getCurrentLtime()
+ with tenant_write_lock(self.zk_client, tenant_name) as lock:
+ context = ZKContext(self.zk_client, lock, stop_event, self.log)
+ bs = BlobStore(context)
+ with testtools.ExpectedException(KeyError):
+ bs.get('nope')
+
+ path = bs.put(b'something')
+
+ self.assertEqual(bs.get(path), b'something')
+ self.assertEqual([x for x in bs], [path])
+ self.assertEqual(len(bs), 1)
+
+ self.assertTrue(path in bs)
+ self.assertFalse('nope' in bs)
+ self.assertTrue(bs._checkKey(path))
+ self.assertFalse(bs._checkKey('nope'))
+
+ cur_ltime = self.zk_client.getCurrentLtime()
+ self.assertEqual(bs.getKeysLastUsedBefore(cur_ltime), {path})
+ self.assertEqual(bs.getKeysLastUsedBefore(start_ltime), set())
+ bs.delete(path, cur_ltime)
+
+ with testtools.ExpectedException(KeyError):
+ bs.get(path)
diff --git a/tests/zuul_client/test_zuulclient.py b/tests/zuul_client/test_zuulclient.py
index cc7d789c7..9d381c99b 100644
--- a/tests/zuul_client/test_zuulclient.py
+++ b/tests/zuul_client/test_zuulclient.py
@@ -629,3 +629,92 @@ class TestZuulClientBuildInfo(TestZuulClientQueryData,
x['url'] == 'http://example.com/docs'
for x in artifacts),
output)
+
+
+class TestZuulClientJobGraph(BaseTestWeb):
+ def _split_pretty_table(self, output):
+ lines = output.decode().split('\n')
+ headers = [x.strip() for x in lines[1].split('|') if x != '']
+ # Trim headers and last line of the table
+ return [dict(zip(headers,
+ [x.strip() for x in l.split('|') if x != '']))
+ for l in lines[3:-2]]
+
+ def test_job_graph(self):
+ """Test the job-graph command"""
+ p = subprocess.Popen(
+ ['zuul-client',
+ '--zuul-url', self.base_url,
+ 'job-graph',
+ '--tenant', 'tenant-one',
+ '--pipeline', 'check',
+ '--project', 'org/project1',
+ '--branch', 'master',
+ ],
+ stdout=subprocess.PIPE)
+ output, err = p.communicate()
+ self.assertEqual(p.returncode, 0, (output, err))
+ results = self._split_pretty_table(output)
+ expected = [
+ {'Job': 'project-merge', 'Dependencies': ''},
+ {'Job': 'project-test1', 'Dependencies': 'project-merge'},
+ {'Job': 'project-test2', 'Dependencies': 'project-merge'},
+ {'Job': 'project1-project2-integration',
+ 'Dependencies': 'project-merge'}
+ ]
+ self.assertEqual(results, expected)
+
+ def test_job_graph_dot(self):
+ """Test the job-graph command dot output"""
+ p = subprocess.Popen(
+ ['zuul-client',
+ '--format', 'dot',
+ '--zuul-url', self.base_url,
+ 'job-graph',
+ '--tenant', 'tenant-one',
+ '--pipeline', 'check',
+ '--project', 'org/project1',
+ '--branch', 'master',
+ ],
+ stdout=subprocess.PIPE)
+ output, err = p.communicate()
+ self.assertEqual(p.returncode, 0, (output, err))
+ expected = textwrap.dedent('''\
+ digraph job_graph {
+ rankdir=LR;
+ node [shape=box];
+ "project-merge";
+ "project-merge" -> "project-test1" [dir=back];
+ "project-merge" -> "project-test2" [dir=back];
+ "project-merge" -> "project1-project2-integration" [dir=back];
+ }
+ ''').encode('utf8')
+ self.assertEqual(output.strip(), expected.strip())
+
+
+class TestZuulClientFreezeJob(BaseTestWeb):
+ def test_freeze_job(self):
+ """Test the freeze-job command"""
+ p = subprocess.Popen(
+ ['zuul-client',
+ '--zuul-url', self.base_url,
+ 'freeze-job',
+ '--tenant', 'tenant-one',
+ '--pipeline', 'check',
+ '--project', 'org/project1',
+ '--branch', 'master',
+ '--job', 'project-test1',
+ ],
+ stdout=subprocess.PIPE)
+ output, err = p.communicate()
+ self.assertEqual(p.returncode, 0, (output, err))
+ output = output.decode('utf8')
+ for s in [
+ 'Job: project-test1',
+ 'Branch: master',
+ 'Ansible Version:',
+ 'Workspace Scheme: golang',
+ ('gerrit:common-config:playbooks/project-test1.yaml'
+ '@master [trusted]'),
+ ]:
+ self.assertIn(s, output)
diff --git a/tools/deprecated-queues.py b/tools/deprecated-queues.py
new file mode 100644
index 000000000..dfd9df497
--- /dev/null
+++ b/tools/deprecated-queues.py
@@ -0,0 +1,61 @@
+#!/usr/bin/env python3
+# Copyright 2022 Acme Gating, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import argparse
+import requests
+
+
+def main():
+ parser = argparse.ArgumentParser(
+ description="Find where a project declares a queue")
+ parser.add_argument("url", help="Zuul URL")
+ parser.add_argument("tenant", help="Zuul tenant name")
+ parser.add_argument("--verbose", help="Display progress",
+ action='store_true')
+ args = parser.parse_args()
+
+ projects = requests.get(
+ f'{args.url}/api/tenant/{args.tenant}/projects',
+ ).json()
+
+ pipeline_contexts = set()
+ for tenant_project in projects:
+ if args.verbose:
+ print(f"Checking {tenant_project['name']}")
+ project = requests.get(
+ f"{args.url}/api/tenant/{args.tenant}/project/"
+ f"{tenant_project['name']}",
+ ).json()
+
+ for config in project['configs']:
+ for pipeline in config['pipelines']:
+ if pipeline['queue_name']:
+ pipeline_contexts.add(repr(config['source_context']))
+
+ if pipeline_contexts:
+ print("The following project-pipeline stanzas define a queue.")
+ print("This syntax is deprecated and queue definitions should")
+ print("be moved to the project level.")
+ print("See https://zuul-ci.org/docs/zuul/latest/"
+ "releasenotes.html#relnotes-4-1-0-deprecation-notes")
+ for c in pipeline_contexts:
+ print(c)
+ else:
+ print("Good, no project-pipeline queue definitions found.")
+
+
+if __name__ == '__main__':
+ main()
diff --git a/tools/docker-compose.yaml b/tools/docker-compose.yaml
index fbf5ad280..83ab9f930 100644
--- a/tools/docker-compose.yaml
+++ b/tools/docker-compose.yaml
@@ -26,6 +26,7 @@ services:
zookeeper:
container_name: zuul-test-zookeeper
+ user: "${USER_ID}"
image: zookeeper
environment:
- ZOO_AUTOPURGE_PURGEINTERVAL=1
@@ -33,8 +34,8 @@ services:
ports:
- "2281:2281"
tmpfs:
- - /data
- - /datalog
+ - /data:uid=${USER_ID}
+ - /datalog:uid=${USER_ID}
volumes:
- "./ca:/var/certs:z"
- "./zoo.cfg:/conf/zoo.cfg:z"
diff --git a/tools/github-debugging.py b/tools/github-debugging.py
index da6fd0c66..afc8159d6 100755
--- a/tools/github-debugging.py
+++ b/tools/github-debugging.py
@@ -1,10 +1,12 @@
#!/usr/bin/env python3
import logging
+from collections import UserDict
from zuul.driver.github.githubconnection import GithubConnection
from zuul.driver.github import GithubDriver
-from zuul.model import Change, Project
+from zuul.model import Change
+from zuul.zk.change_cache import ChangeKey
# This is a template with boilerplate code for debugging github issues
@@ -19,6 +21,14 @@ repo = 'sandbox'
pull_nr = 8
+class DummyChangeCache(UserDict):
+
+ def updateChangeWithRetry(self, key, change, update_func, retry_count=5):
+ update_func(change)
+ self[key] = change
+ return change
+
+
def configure_logging(context):
stream_handler = logging.StreamHandler()
logger = logging.getLogger(context)
@@ -40,7 +50,8 @@ def create_connection(server, api_token):
'api_token': api_token,
}
conn = GithubConnection(driver, 'github', connection_config)
- conn._authenticateGithubAPI()
+ conn._github_client_manager.initialize()
+ conn._change_cache = DummyChangeCache()
return conn
@@ -52,8 +63,8 @@ def create_connection_app(server, appid, appkey):
'app_key': appkey,
}
conn = GithubConnection(driver, 'github', connection_config)
- conn._authenticateGithubAPI()
- conn._prime_installation_map()
+ conn._github_client_manager.initialize()
+ conn._change_cache = DummyChangeCache()
return conn
@@ -61,11 +72,12 @@ def get_change(connection: GithubConnection,
org: str,
repo: str,
pull: int) -> Change:
- p = Project("%s/%s" % (org, repo), connection.source)
- github = connection.getGithubClient(p.name)
+ project_name = f"{org}/{repo}"
+ github = connection.getGithubClient(project_name)
pr = github.pull_request(org, repo, pull)
sha = pr.head.sha
- return conn._getChange(p, pull, sha, True)
+ change_key = ChangeKey('github', project_name, 'PullRequest', pull, sha)
+ return conn._getChange(change_key, refresh=True)
# create github connection with api token
diff --git a/tools/test-logs.sh b/tools/test-logs.sh
index d71b9b7f9..046743aca 100755
--- a/tools/test-logs.sh
+++ b/tools/test-logs.sh
@@ -66,12 +66,12 @@ gathering = smart
gather_subset = !all
fact_caching = jsonfile
fact_caching_connection = ~/.cache/facts
-lookup_plugins = ${ZUUL_ANSIBLE}/zuul/ansible/lookup
-callback_plugins = ${ZUUL_ANSIBLE}/zuul/ansible/callback:$ARA_DIR/plugins/callbacks
-action_plugins = ${ZUUL_ANSIBLE}/zuul/ansible/actiongeneral:${ZUUL_ANSIBLE}/zuul/ansible/actiontrusted
-module_utils = ${ZUUL_ANSIBLE}/zuul/ansible/module_utils
+lookup_plugins = ${ZUUL_ANSIBLE}/zuul/ansible/base/lookup
+callback_plugins = ${ZUUL_ANSIBLE}/zuul/ansible/base/callback:$ARA_DIR/plugins/callbacks
+action_plugins = ${ZUUL_ANSIBLE}/zuul/ansible/base/action
+module_utils = ${ZUUL_ANSIBLE}/zuul/ansible/base/module_utils
stdout_callback = zuul_stream
-library = ${ZUUL_ANSIBLE}/zuul/ansible/library
+library = ${ZUUL_ANSIBLE}/zuul/ansible/base/library
retry_files_enabled = False
EOF
diff --git a/tools/test-setup-docker.sh b/tools/test-setup-docker.sh
index 526f025c7..a0fcf9f5a 100755
--- a/tools/test-setup-docker.sh
+++ b/tools/test-setup-docker.sh
@@ -1,6 +1,18 @@
#!/bin/bash
-set -eu
+# This runs ZooKeeper and databases in docker containers, which are
+# required for tests.
+
+# This setup needs to be run as a user that can run docker or podman, or by
+# setting $ROOTCMD to a user substitution tool like "sudo" in the calling
+# environment.
+
+set -xeu
+
+# Default ROOTCMD to the 'env' command, otherwise variable assignments will be
+# interpreted as command when no ROOTCMD is given. The reason for that is
+# Bash's simple command expansion.
+ROOTCMD=${ROOTCMD:-env}
cd $(dirname $0)
SCRIPT_DIR="$(pwd)"
@@ -29,9 +41,9 @@ fi
MYSQL="${DOCKER} exec zuul-test-mysql mysql -u root -pinsecure_worker"
if [ "${COMPOSE}" == "docker-compose" ]; then
- docker-compose rm -sf
+ ${ROOTCMD} docker-compose rm -sf
else
- podman-compose down
+ ${ROOTCMD} podman-compose down
fi
CA_DIR=$SCRIPT_DIR/ca
@@ -39,14 +51,14 @@ CA_DIR=$SCRIPT_DIR/ca
mkdir -p $CA_DIR
$SCRIPT_DIR/zk-ca.sh $CA_DIR zuul-test-zookeeper
-${COMPOSE} up -d
+${ROOTCMD} USER_ID=$(id -u) ${COMPOSE} up -d
echo "Waiting for mysql"
-timeout 30 bash -c "until ${MYSQL} -e 'show databases'; do sleep 0.5; done"
+timeout 30 bash -c "until ${ROOTCMD} ${MYSQL} -e 'show databases'; do sleep 0.5; done"
echo
echo "Setting up permissions for zuul tests"
-${MYSQL} -e "GRANT ALL PRIVILEGES ON *.* TO 'openstack_citest'@'%' identified by 'openstack_citest' WITH GRANT OPTION;"
-${MYSQL} -u openstack_citest -popenstack_citest -e "SET default_storage_engine=MYISAM; DROP DATABASE IF EXISTS openstack_citest; CREATE DATABASE openstack_citest CHARACTER SET utf8;"
+${ROOTCMD} ${MYSQL} -e "GRANT ALL PRIVILEGES ON *.* TO 'openstack_citest'@'%' identified by 'openstack_citest' WITH GRANT OPTION;"
+${ROOTCMD} ${MYSQL} -u openstack_citest -popenstack_citest -e "SET default_storage_engine=MYISAM; DROP DATABASE IF EXISTS openstack_citest; CREATE DATABASE openstack_citest CHARACTER SET utf8;"
echo "Finished"
diff --git a/tools/test-setup.sh b/tools/test-setup.sh
index 237763569..cc67d012b 100755
--- a/tools/test-setup.sh
+++ b/tools/test-setup.sh
@@ -44,8 +44,8 @@ mysql -u $DB_USER -p$DB_PW -h 127.0.0.1 -e "
CREATE DATABASE openstack_citest CHARACTER SET utf8;"
# setup postgres user and database
-sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN SUPERUSER PASSWORD '$DB_PW';"
-sudo -u postgres psql -c "CREATE DATABASE openstack_citest OWNER $DB_USER TEMPLATE template0 ENCODING 'UTF8';"
+sudo -Hi -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN SUPERUSER PASSWORD '$DB_PW';"
+sudo -Hi -u postgres psql -c "CREATE DATABASE openstack_citest OWNER $DB_USER TEMPLATE template0 ENCODING 'UTF8';"
LSBDISTCODENAME=$(lsb_release -cs)
if [ $LSBDISTCODENAME == 'xenial' ]; then
diff --git a/tox.ini b/tox.ini
index 56adc201f..8d7fb8c22 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,11 +1,8 @@
[tox]
minversion = 3.2
skipsdist = True
-envlist = linters,py3{-docker}
+envlist = linters,py3
ignore_basepython_conflict = True
-# TODO(stephenfin): It would be good to set 'requires = tox-docker', but doing
-# so borks the tools/pip.sh wrapper we're using here and probably isn't what
-# we want in the gate :(
[testenv]
basepython = python3
@@ -19,7 +16,6 @@ setenv =
SQLALCHEMY_WARN_20={env:SQLALCHEMY_WARN_20:1}
PYTHONWARNINGS=always::DeprecationWarning:zuul.driver.sql.sqlconnection,always::DeprecationWarning:tests.base,always::DeprecationWarning:tests.unit.test_database,always::DeprecationWarning:zuul.driver.sql.alembic.env,always::DeprecationWarning:zuul.driver.sql.alembic.script
passenv =
- DOCKER_*
NODEPOOL_ZK_HOST
OS_LOG_CAPTURE
OS_LOG_DEFAULTS
@@ -40,8 +36,6 @@ whitelist_externals = bash
deps =
-r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
-docker =
- docker: zookeeper:3.4
commands =
bash -c 'stestr run --slowest --concurrency=`python -c "import multiprocessing; print(max(int(multiprocessing.cpu_count()-1),1))"` {posargs}'
@@ -96,7 +90,6 @@ deps =
[testenv:remote]
passenv =
- DOCKER_*
NODEPOOL_ZK_HOST
OS_LOG_CAPTURE
OS_LOG_DEFAULTS
diff --git a/web/package.json b/web/package.json
index 7597e7962..3122e8839 100644
--- a/web/package.json
+++ b/web/package.json
@@ -11,8 +11,9 @@
"@patternfly/react-core": "^4.198.5",
"@patternfly/react-table": "^4.67.5",
"@softwarefactory-project/re-ansi": "^0.5.0",
- "axios": "^0.19.0",
+ "axios": "^0.26.0",
"broadcast-channel": "^4.5.0",
+ "d3-graphviz": "2.6.1",
"js-yaml": "^3.13.0",
"lodash": "^4.17.10",
"moment": "^2.22.2",
@@ -57,7 +58,7 @@
"start:openstack": "REACT_APP_ZUUL_API='https://zuul.openstack.org/api/' react-scripts start",
"start:multi": "REACT_APP_ZUUL_API='https://softwarefactory-project.io/zuul/api/' react-scripts start",
"start": "react-scripts start",
- "build": "react-scripts build",
+ "build": "react-scripts --max_old_space_size=4096 build",
"test": "react-scripts test --env=jsdom --watchAll=false",
"eject": "react-scripts eject",
"lint": "eslint --ext .js --ext .jsx src",
diff --git a/web/public/openapi.yaml b/web/public/openapi.yaml
index 312a1907e..b101c66e0 100644
--- a/web/public/openapi.yaml
+++ b/web/public/openapi.yaml
@@ -474,11 +474,9 @@ components:
description: The event id
type: string
item_ahead:
- description: The list of events ahead
- items:
- type: string
- type: array
- item_behind:
+ description: The event ahead
+ type: string
+ items_behind:
description: The list of events behind
items:
type: string
diff --git a/web/src/App.jsx b/web/src/App.jsx
index 207417c96..bd640f772 100644
--- a/web/src/App.jsx
+++ b/web/src/App.jsx
@@ -443,11 +443,10 @@ class App extends React.Component {
const logoUrl = tenant.name ? tenant.defaultRoute : '/'
const pageHeader = (
<PageHeader
- logo={<Brand src={logo} alt='Zuul logo' className="zuul-brand" />}
+ logo={<Brand src={logo} alt='Zuul logo' />}
logoProps={{ to: logoUrl }}
logoComponent={Link}
headerTools={pageHeaderTools}
- topNav={nav}
/>
)
@@ -455,7 +454,7 @@ class App extends React.Component {
<React.Fragment>
{notifications.length > 0 && this.renderNotifications(notifications)}
{this.renderConfigErrors(configErrors)}
- <Page header={pageHeader}>
+ <Page className="zuul-page" header={pageHeader} tertiaryNav={nav}>
<ErrorBoundary>
{this.renderContent()}
</ErrorBoundary>
diff --git a/web/src/App.test.jsx b/web/src/App.test.jsx
index 05e8d185b..5c9cb3454 100644
--- a/web/src/App.test.jsx
+++ b/web/src/App.test.jsx
@@ -122,8 +122,8 @@ it('renders single tenant', async () => {
// Link should be white-label scoped
const topMenuLinks = application.root.findAllByType(Link)
expect(topMenuLinks[0].props.to).toEqual('/status')
- expect(topMenuLinks[1].props.to.pathname).toEqual('/status')
- expect(topMenuLinks[2].props.to.pathname).toEqual('/projects')
+ expect(topMenuLinks[4].props.to.pathname).toEqual('/status')
+ expect(topMenuLinks[5].props.to.pathname).toEqual('/projects')
// Location should be /status
expect(location.pathname).toEqual('/status')
// Info should tell white label tenant openstack
diff --git a/web/src/actions/auth.js b/web/src/actions/auth.js
index 1730e04f4..842e57ead 100644
--- a/web/src/actions/auth.js
+++ b/web/src/actions/auth.js
@@ -36,6 +36,7 @@ function createAuthParamsFromJson(json) {
authority: '',
client_id: '',
scope: '',
+ loadUserInfo: true,
}
if (!auth_info) {
console.log('No auth config')
@@ -47,6 +48,7 @@ function createAuthParamsFromJson(json) {
auth_params.client_id = client_config.client_id
auth_params.scope = client_config.scope
auth_params.authority = client_config.authority
+ auth_params.loadUserInfo = client_config.load_user_info
return auth_params
} else {
console.log('No OpenIDConnect provider found')
diff --git a/web/src/actions/freezejob.js b/web/src/actions/freezejob.js
new file mode 100644
index 000000000..13b32f124
--- /dev/null
+++ b/web/src/actions/freezejob.js
@@ -0,0 +1,84 @@
+// Copyright 2018 Red Hat, Inc
+// Copyright 2022 Acme Gating, LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License. You may obtain
+// a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+
+import * as API from '../api'
+
+export const FREEZE_JOB_FETCH_REQUEST = 'FREEZE_JOB_FETCH_REQUEST'
+export const FREEZE_JOB_FETCH_SUCCESS = 'FREEZE_JOB_FETCH_SUCCESS'
+export const FREEZE_JOB_FETCH_FAIL = 'FREEZE_JOB_FETCH_FAIL'
+
+export const requestFreezeJob = () => ({
+ type: FREEZE_JOB_FETCH_REQUEST
+})
+
+export function makeFreezeJobKey(pipeline, project, branch, job) {
+ return JSON.stringify({
+ pipeline, project, branch, job
+ })
+}
+
+export const receiveFreezeJob = (tenant, freezeJobKey, freezeJob) => {
+ return {
+ type: FREEZE_JOB_FETCH_SUCCESS,
+ tenant: tenant,
+ freezeJobKey: freezeJobKey,
+ freezeJob: freezeJob,
+ receivedAt: Date.now(),
+ }
+}
+
+const failedFreezeJob = error => ({
+ type: FREEZE_JOB_FETCH_FAIL,
+ error
+})
+
+const fetchFreezeJob = (tenant, pipeline, project, branch, job) => dispatch => {
+ dispatch(requestFreezeJob())
+ const freezeJobKey = makeFreezeJobKey(pipeline, project, branch, job)
+ return API.fetchFreezeJob(tenant.apiPrefix,
+ pipeline,
+ project,
+ branch,
+ job)
+ .then(response => dispatch(receiveFreezeJob(
+ tenant.name, freezeJobKey, response.data)))
+ .catch(error => dispatch(failedFreezeJob(error)))
+}
+
+const shouldFetchFreezeJob = (tenant, pipeline, project, branch, job, state) => {
+ const freezeJobKey = makeFreezeJobKey(pipeline, project, branch, job)
+ const tenantFreezeJobs = state.freezejob.freezeJobs[tenant.name]
+ if (tenantFreezeJobs) {
+ const freezeJob = tenantFreezeJobs[freezeJobKey]
+ if (!freezeJob) {
+ return true
+ }
+ if (freezeJob.isFetching) {
+ return false
+ }
+ return false
+ }
+ return true
+}
+
+export const fetchFreezeJobIfNeeded = (tenant, pipeline, project, branch, job,
+ force) => (
+ dispatch, getState) => {
+ if (force || shouldFetchFreezeJob(tenant, pipeline, project, branch, job,
+ getState())) {
+ return dispatch(fetchFreezeJob(tenant, pipeline, project, branch, job))
+ }
+ return Promise.resolve()
+}
diff --git a/web/src/actions/jobgraph.js b/web/src/actions/jobgraph.js
new file mode 100644
index 000000000..44ca2cb07
--- /dev/null
+++ b/web/src/actions/jobgraph.js
@@ -0,0 +1,83 @@
+// Copyright 2018 Red Hat, Inc
+// Copyright 2022 Acme Gating, LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License. You may obtain
+// a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+
+import * as API from '../api'
+
+export const JOB_GRAPH_FETCH_REQUEST = 'JOB_GRAPH_FETCH_REQUEST'
+export const JOB_GRAPH_FETCH_SUCCESS = 'JOB_GRAPH_FETCH_SUCCESS'
+export const JOB_GRAPH_FETCH_FAIL = 'JOB_GRAPH_FETCH_FAIL'
+
+export const requestJobGraph = () => ({
+ type: JOB_GRAPH_FETCH_REQUEST
+})
+
+export function makeJobGraphKey(project, pipeline, branch) {
+ return JSON.stringify({
+ project: project, pipeline: pipeline, branch: branch
+ })
+}
+
+export const receiveJobGraph = (tenant, jobGraphKey, jobGraph) => {
+ return {
+ type: JOB_GRAPH_FETCH_SUCCESS,
+ tenant: tenant,
+ jobGraphKey: jobGraphKey,
+ jobGraph: jobGraph,
+ receivedAt: Date.now(),
+ }
+}
+
+const failedJobGraph = error => ({
+ type: JOB_GRAPH_FETCH_FAIL,
+ error
+})
+
+const fetchJobGraph = (tenant, project, pipeline, branch) => dispatch => {
+ dispatch(requestJobGraph())
+ const jobGraphKey = makeJobGraphKey(project, pipeline, branch)
+ return API.fetchJobGraph(tenant.apiPrefix,
+ project,
+ pipeline,
+ branch)
+ .then(response => dispatch(receiveJobGraph(
+ tenant.name, jobGraphKey, response.data)))
+ .catch(error => dispatch(failedJobGraph(error)))
+}
+
+const shouldFetchJobGraph = (tenant, project, pipeline, branch, state) => {
+ const jobGraphKey = makeJobGraphKey(project, pipeline, branch)
+ const tenantJobGraphs = state.jobgraph.jobGraphs[tenant.name]
+ if (tenantJobGraphs) {
+ const jobGraph = tenantJobGraphs[jobGraphKey]
+ if (!jobGraph) {
+ return true
+ }
+ if (jobGraph.isFetching) {
+ return false
+ }
+ return false
+ }
+ return true
+}
+
+export const fetchJobGraphIfNeeded = (tenant, project, pipeline, branch,
+ force) => (
+ dispatch, getState) => {
+ if (force || shouldFetchJobGraph(tenant, project, pipeline, branch,
+ getState())) {
+ return dispatch(fetchJobGraph(tenant, project, pipeline, branch))
+ }
+ return Promise.resolve()
+}
diff --git a/web/src/actions/pipelines.js b/web/src/actions/pipelines.js
new file mode 100644
index 000000000..7139524f2
--- /dev/null
+++ b/web/src/actions/pipelines.js
@@ -0,0 +1,62 @@
+// Copyright 2018 Red Hat, Inc
+// Copyright 2022 Acme Gating, LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License. You may obtain
+// a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+
+import * as API from '../api'
+
+export const PIPELINES_FETCH_REQUEST = 'PIPELINES_FETCH_REQUEST'
+export const PIPELINES_FETCH_SUCCESS = 'PIPELINES_FETCH_SUCCESS'
+export const PIPELINES_FETCH_FAIL = 'PIPELINES_FETCH_FAIL'
+
+export const requestPipelines = () => ({
+ type: PIPELINES_FETCH_REQUEST
+})
+
+export const receivePipelines = (tenant, json) => ({
+ type: PIPELINES_FETCH_SUCCESS,
+ tenant: tenant,
+ pipelines: json,
+ receivedAt: Date.now()
+})
+
+const failedPipelines = error => ({
+ type: PIPELINES_FETCH_FAIL,
+ error
+})
+
+const fetchPipelines = (tenant) => dispatch => {
+ dispatch(requestPipelines())
+ return API.fetchPipelines(tenant.apiPrefix)
+ .then(response => dispatch(receivePipelines(tenant.name, response.data)))
+ .catch(error => dispatch(failedPipelines(error)))
+}
+
+const shouldFetchPipelines = (tenant, state) => {
+ const pipelines = state.pipelines.pipelines[tenant.name]
+ if (!pipelines || pipelines.length === 0) {
+ return true
+ }
+ if (pipelines.isFetching) {
+ return false
+ }
+ return false
+}
+
+export const fetchPipelinesIfNeeded = (tenant, force) => (
+ dispatch, getState) => {
+ if (force || shouldFetchPipelines(tenant, getState())) {
+ return dispatch(fetchPipelines(tenant))
+ }
+ return Promise.resolve()
+}
diff --git a/web/src/api.js b/web/src/api.js
index 7b574a6b6..1ba39998c 100644
--- a/web/src/api.js
+++ b/web/src/api.js
@@ -130,6 +130,13 @@ function fetchStatus(apiPrefix) {
function fetchChangeStatus(apiPrefix, changeId) {
return Axios.get(apiUrl + apiPrefix + 'status/change/' + changeId)
}
+function fetchFreezeJob(apiPrefix, pipelineName, projectName, branchName, jobName) {
+ return Axios.get(apiUrl + apiPrefix +
+ 'pipeline/' + pipelineName +
+ '/project/' + projectName +
+ '/branch/' + branchName +
+ '/freeze-job/' + jobName)
+}
function fetchBuild(apiPrefix, buildId) {
return Axios.get(apiUrl + apiPrefix + 'build/' + buildId)
}
@@ -150,6 +157,9 @@ function fetchBuildsets(apiPrefix, queryString) {
}
return Axios.get(apiUrl + apiPrefix + path)
}
+function fetchPipelines(apiPrefix) {
+ return Axios.get(apiUrl + apiPrefix + 'pipelines')
+}
function fetchProject(apiPrefix, projectName) {
return Axios.get(apiUrl + apiPrefix + 'project/' + projectName)
}
@@ -159,6 +169,13 @@ function fetchProjects(apiPrefix) {
function fetchJob(apiPrefix, jobName) {
return Axios.get(apiUrl + apiPrefix + 'job/' + jobName)
}
+function fetchJobGraph(apiPrefix, projectName, pipelineName, branchName) {
+ return Axios.get(apiUrl + apiPrefix +
+ 'pipeline/' + pipelineName +
+ '/project/' + projectName +
+ '/branch/' + branchName +
+ '/freeze-jobs')
+}
function fetchJobs(apiPrefix) {
return Axios.get(apiUrl + apiPrefix + 'jobs')
}
@@ -305,9 +322,12 @@ export {
fetchBuilds,
fetchBuildset,
fetchBuildsets,
+ fetchFreezeJob,
+ fetchPipelines,
fetchProject,
fetchProjects,
fetchJob,
+ fetchJobGraph,
fetchJobs,
fetchLabels,
fetchNodes,
diff --git a/web/src/containers/auth/Auth.jsx b/web/src/containers/auth/Auth.jsx
index e57e12963..177e9a02d 100644
--- a/web/src/containers/auth/Auth.jsx
+++ b/web/src/containers/auth/Auth.jsx
@@ -264,10 +264,11 @@ class AuthContainer extends React.Component {
if (info.isFetching) {
return (<><div style={containerStyles}>Fetching auth info ...</div></>)
}
- if (auth.info && auth.info.default_realm) {
+ // auth_params.authority is only set if an OpenID Connect auth is available
+ if (auth.info && auth.info.default_realm && auth.auth_params.authority) {
return this.renderButton(containerStyles)
} else {
- return (<div style={containerStyles} title="Authentication disabled">-</div>)
+ return (<div style={containerStyles} title='Authentication disabled'>-</div>)
}
}
}
diff --git a/web/src/containers/build/Artifact.jsx b/web/src/containers/build/Artifact.jsx
index 4d4259440..3793222d9 100644
--- a/web/src/containers/build/Artifact.jsx
+++ b/web/src/containers/build/Artifact.jsx
@@ -17,6 +17,7 @@ import PropTypes from 'prop-types'
import {
TreeView,
} from 'patternfly-react'
+import ReactJson from 'react-json-view'
class Artifact extends React.Component {
@@ -32,7 +33,17 @@ class Artifact extends React.Component {
{Object.keys(artifact.metadata).map(key => (
<tr key={key}>
<td>{key}</td>
- <td style={{width:'100%'}}>{artifact.metadata[key]}</td>
+ <td style={{width:'100%'}}>
+ {typeof(artifact.metadata[key]) === 'object'?
+ <ReactJson
+ src={artifact.metadata[key]}
+ name={null}
+ collapsed={true}
+ sortKeys={true}
+ enableClipboard={false}
+ displayDataTypes={false}/>
+ :artifact.metadata[key].toString()}
+ </td>
</tr>
))}
</tbody>
diff --git a/web/src/containers/build/Build.jsx b/web/src/containers/build/Build.jsx
index 80d0c1b8b..7acfa5887 100644
--- a/web/src/containers/build/Build.jsx
+++ b/web/src/containers/build/Build.jsx
@@ -273,7 +273,7 @@ function Build({ build, tenant, timezone, user }) {
{<AutoholdModal
showAutoholdModal={showAutoholdModal}
setShowAutoholdModal={setShowAutoholdModal}
- change={change}
+ change={String(change)}
changeRef={ref}
project={project}
jobName={job_name}
diff --git a/web/src/containers/build/BuildOutput.jsx b/web/src/containers/build/BuildOutput.jsx
index 8c064f860..2066852da 100644
--- a/web/src/containers/build/BuildOutput.jsx
+++ b/web/src/containers/build/BuildOutput.jsx
@@ -20,6 +20,7 @@ import {
Card,
CardBody,
CardHeader,
+ Chip,
DataList,
DataListItem,
DataListItemRow,
@@ -32,6 +33,7 @@ import {
import {
CheckCircleIcon,
+ ContainerNodeIcon,
InfoCircleIcon,
TimesIcon,
TimesCircleIcon,
@@ -44,19 +46,23 @@ class BuildOutput extends React.Component {
renderHosts (hosts) {
return (
- <Card>
- <CardHeader>
- <strong>Task run summary</strong>
- </CardHeader>
- <CardBody>
- <DataList aria-label="Build Results">
+ <>
+ <br />
+ <div className={'zuul-task-summary'}>
+ <DataList aria-label="Build Results" isCompact={true}>
{Object.entries(hosts).map(([host, values]) => (
<DataListItem key={host} aria-label="Host">
<DataListItemRow>
<DataListItemCells
dataListCells={[
- <DataListCell key={host + '.name'}>{host} </DataListCell>,
- <DataListCell key={host + '.data'}>
+ <DataListCell key={host + '.name'}>
+ <Chip isReadOnly={true} textMaxWidth='50ch'>
+ <span style={{ fontSize: 'var(--pf-global--FontSize--md)' }}>
+ <ContainerNodeIcon />&nbsp;{host}
+ </span>
+ </Chip>
+ </DataListCell>,
+ <DataListCell key={host + '.data'} >
<Flex>
<FlexItem>
<Label color="green" icon={<CheckCircleIcon />}>{values.ok} OK</Label>
@@ -75,8 +81,8 @@ class BuildOutput extends React.Component {
</DataListItem>
))}
</DataList>
- </CardBody>
- </Card>
+ </div>
+ </>
)
}
@@ -139,6 +145,7 @@ class BuildOutput extends React.Component {
return (
<React.Fragment>
{this.renderHosts(output)}
+ <br />
{Object.entries(output)
.filter(([, values]) => values.failed.length > 0)
.map(([host, values]) => (values.failed.map(failed => (
diff --git a/web/src/containers/build/Buildset.jsx b/web/src/containers/build/Buildset.jsx
index 1e9ca86c7..048a277bc 100644
--- a/web/src/containers/build/Buildset.jsx
+++ b/web/src/containers/build/Buildset.jsx
@@ -65,8 +65,8 @@ function Buildset({ buildset, timezone, tenant, user }) {
const overallDuration =
(moment.utc(lastEndBuild.end_time).tz(timezone) -
moment.utc(
- buildset.event_timestamp!=null
- ? buildset.event_timestamp : firstStartBuild.start_time
+ buildset.event_timestamp != null
+ ? buildset.event_timestamp : firstStartBuild.start_time
).tz(timezone)
) / 1000
@@ -177,15 +177,15 @@ function Buildset({ buildset, timezone, tenant, user }) {
}
function enqueueConfirm() {
- let changeId = buildset.change ? buildset.change + ',' + buildset.patchset : buildset.newrev
setShowEnqueueModal(false)
- if (/^[0-9a-f]{40}$/.test(changeId)) {
+ if (buildset.change === null) {
const oldrev = '0000000000000000000000000000000000000000'
- enqueue_ref(tenant.apiPrefix, buildset.project, buildset.pipeline, buildset.ref, oldrev, changeId, user.token)
+ const newrev = buildset.newrev ? buildset.newrev : '0000000000000000000000000000000000000000'
+ enqueue_ref(tenant.apiPrefix, buildset.project, buildset.pipeline, buildset.ref, oldrev, newrev, user.token)
.then(() => {
dispatch(addNotification(
{
- text: 'Change queued successfully.',
+ text: 'Enqueue successful.',
type: 'success',
status: '',
url: '',
@@ -195,6 +195,7 @@ function Buildset({ buildset, timezone, tenant, user }) {
dispatch(addApiError(error))
})
} else {
+ const changeId = buildset.change + ',' + buildset.patchset
enqueue(tenant.apiPrefix, buildset.project, buildset.pipeline, changeId, user.token)
.then(() => {
dispatch(addNotification(
@@ -213,6 +214,9 @@ function Buildset({ buildset, timezone, tenant, user }) {
function renderEnqueueModal() {
let changeId = buildset.change ? buildset.change + ',' + buildset.patchset : buildset.newrev
+ let changeInfo = changeId
+ ? <>for change <strong>{changeId}</strong></>
+ : <>for ref <strong>{buildset.ref}</strong></>
const title = 'You are about to re-enqueue a change'
return (
<Modal
@@ -225,7 +229,7 @@ function Buildset({ buildset, timezone, tenant, user }) {
<Button key="deq_confirm" variant="primary" onClick={enqueueConfirm}>Confirm</Button>,
<Button key="deq_cancel" variant="link" onClick={() => { setShowEnqueueModal(false) }}>Cancel</Button>,
]}>
- <p>Please confirm that you want to re-enqueue <strong>all jobs</strong> for change <strong>{changeId}</strong> (project <strong>{buildset.project}</strong>) on pipeline <strong>{buildset.pipeline}</strong>.</p>
+ <p>Please confirm that you want to re-enqueue <strong>all jobs</strong> {changeInfo} on project <strong>{buildset.project}</strong> on pipeline <strong>{buildset.pipeline}</strong>.</p>
</Modal>
)
}
diff --git a/web/src/containers/build/Console.jsx b/web/src/containers/build/Console.jsx
index 0b365df62..f677dfbd2 100644
--- a/web/src/containers/build/Console.jsx
+++ b/web/src/containers/build/Console.jsx
@@ -18,17 +18,30 @@ import * as React from 'react'
import ReAnsi from '@softwarefactory-project/re-ansi'
import PropTypes from 'prop-types'
import ReactJson from 'react-json-view'
+
import {
- Icon,
- ListView,
- Row,
- Col,
+ Button,
+ Chip,
+ DataList,
+ DataListItem,
+ DataListItemRow,
+ DataListCell,
+ DataListItemCells,
+ DataListToggle,
+ DataListContent,
+ Flex,
+ FlexItem,
+ Label,
Modal,
-} from 'patternfly-react'
+ Tooltip
+} from '@patternfly/react-core'
+
import {
+ AngleRightIcon,
ContainerNodeIcon,
InfoCircleIcon,
SearchPlusIcon,
+ LinkIcon,
} from '@patternfly/react-icons'
import {
@@ -50,6 +63,19 @@ class TaskOutput extends React.Component {
renderResults(value) {
const interesting_results = []
+
+ // This was written to assume "value" is an array of
+ // key/value mappings to output. This seems to be a
+ // good assumption for the most part, but "package:" for
+ // whatever reason outputs a result that is just an array of
+ // strings with what packages were installed. So, if we
+ // see an array of strings as the value, we just swizzle
+ // that into a key/value so it displays usefully.
+ const isAllStrings = value.every(i => typeof i === 'string')
+ if (isAllStrings) {
+ value = [ {output: [...value]} ]
+ }
+
value.forEach((result, idx) => {
const keys = Object.entries(result).filter(
([key, value]) => shouldIncludeKey(
@@ -154,11 +180,11 @@ class HostTask extends React.Component {
}
open = () => {
- this.setState({ showModal: true})
+ this.setState({showModal: true})
}
close = () => {
- this.setState({ showModal: false})
+ this.setState({showModal: false})
}
constructor (props) {
@@ -178,52 +204,91 @@ class HostTask extends React.Component {
if (taskPathMatches(taskPath, displayPath))
this.state.showModal = true
+
+ // If it has errors, expand by default
+ this.state.expanded = this.props.errorIds.has(this.props.task.task.id)
}
render () {
- const { hostname, task, host, taskPath, errorIds } = this.props
+ const { hostname, task, host, taskPath } = this.props
+ const dataListCells = []
- const ai = []
+ // "interesting" result tasks are those that have some values in
+ // their results that show command output, etc. These plays get
+ // an expansion that shows these values without having to click
+ // and bring up the full insepction modal.
+ const interestingKeys = hasInterestingKeys(host, INTERESTING_KEYS)
+
+ let name = task.task.name
+ if (!name) {
+ name = host.action
+ }
+ if (task.role) {
+ name = task.role.name + ': ' + name
+ }
+
+ // NOTE(ianw) 2022-08-26 since we have some rows that expand and
+ // others that don't, the expansion button pushes things out of
+ // alignment. This tries to emulate the button and then
+ // hide it. See also:
+ // https://github.com/patternfly/patternfly/issues/5055
+ // We might want to think about other ways to present this?
+ if (!interestingKeys) {
+ dataListCells.push(
+ <DataListCell key='padding-icon' isIcon={true}
+ class='pf-c-data-list__item-control'>
+ <div className='pf-c-data-list__toggle'
+ style={{visibility: 'hidden'}}>
+ <Button disabled>
+ <AngleRightIcon />
+ </Button>
+ </div>
+ </DataListCell>
+ )
+ }
+
+ dataListCells.push(
+ <DataListCell key='name' width={4}>{name}</DataListCell>
+ )
+
+ let label = null
if (this.state.failed) {
- ai.push(
- <ListView.InfoItem key="failed" title="Click for details">
- <span className="task-details-icon" onClick={this.open}>
- <SearchPlusIcon />
- </span>
- <span className="task-failed" onClick={this.open}>FAILED</span>
- </ListView.InfoItem>)
+ label = <Label color='red' onClick={this.open}
+ style={{cursor: 'pointer'}}>FAILED</Label>
} else if (this.state.changed) {
- ai.push(
- <ListView.InfoItem key="changed" title="Click for details">
- <span className="task-details-icon" onClick={this.open}>
- <SearchPlusIcon />
- </span>
- <span className="task-changed" onClick={this.open}>CHANGED</span>
- </ListView.InfoItem>)
+ label = <Label color='orange' onClick={this.open}
+ style={{cursor: 'pointer'}}>CHANGED</Label>
} else if (this.state.skipped) {
- ai.push(
- <ListView.InfoItem key="skipped" title="Click for details">
- <span className="task-details-icon" onClick={this.open}>
- <SearchPlusIcon />
- </span>
- <span className="task-skipped" onClick={this.open}>SKIPPED</span>
- </ListView.InfoItem>)
+ label = <Label color='grey' onClick={this.open}
+ style={{cursor: 'pointer'}}>SKIPPED</Label>
} else if (this.state.ok) {
- ai.push(
- <ListView.InfoItem key="ok" title="Click for details">
- <span className="task-details-icon" onClick={this.open}>
- <SearchPlusIcon />
- </span>
- <span className="task-ok" onClick={this.open}>OK</span>
- </ListView.InfoItem>)
+ label = <Label color='green' onClick={this.open}
+ style={{cursor: 'pointer'}}>OK</Label>
}
- ai.push(
- <ListView.InfoItem key="hostname">
- <span className="additionalinfo-icon">
- <ContainerNodeIcon />
- </span>
- {hostname}
- </ListView.InfoItem>
+
+ dataListCells.push(
+ <DataListCell key='state'>
+ <Flex>
+ <FlexItem>
+ <Tooltip content={<div>Click for details</div>}>
+ <SearchPlusIcon style={{cursor: 'pointer'}} onClick={this.open} />
+ </Tooltip>
+ </FlexItem>
+ <FlexItem>
+ <Tooltip content={<div>Click for details</div>}>
+ {label}
+ </Tooltip>
+ </FlexItem>
+ </Flex>
+ </DataListCell>)
+
+ dataListCells.push(
+ <DataListCell key='node'>
+ <Chip isReadOnly={true} textMaxWidth='50ch'>
+ <span style={{ fontSize: 'var(--pf-global--FontSize--md)' }}>
+ <ContainerNodeIcon />&nbsp;{hostname}</span>
+ </Chip>
+ </DataListCell>
)
let duration = moment.duration(
@@ -234,69 +299,63 @@ class HostTask extends React.Component {
minValue: 1,
})
- ai.push(
- <ListView.InfoItem key="task-duration">
- <span className="task-duration">{duration}</span>
- </ListView.InfoItem>
+ dataListCells.push(
+ <DataListCell key='task-duration'>
+ <span className='task-duration'>{duration}</span>
+ </DataListCell>
)
- const expand = errorIds.has(task.task.id)
-
- let name = task.task.name
- if (!name) {
- name = host.action
- }
- if (task.role) {
- name = task.role.name + ': ' + name
- }
- const has_interesting_keys = hasInterestingKeys(this.props.host, INTERESTING_KEYS)
- let lc = undefined
- if (!has_interesting_keys) {
- lc = []
+ const content = <TaskOutput data={this.props.host} include={INTERESTING_KEYS}/>
+
+ let item = null
+ if (interestingKeys) {
+ item = <DataListItem isExpanded={this.state.expanded}>
+ <DataListItemRow>
+ <DataListToggle
+ onClick={() => {this.setState({expanded: !this.state.expanded})}}
+ isExpanded={this.state.expanded}
+ />
+ <DataListItemCells dataListCells={ dataListCells } />
+ </DataListItemRow>
+ <DataListContent
+ isHidden={!this.state.expanded}>
+ { content }
+ </DataListContent>
+ </DataListItem>
+ } else {
+ item = <DataListItem>
+ <DataListItemRow>
+ <DataListItemCells dataListCells={ dataListCells } />
+ </DataListItemRow>
+ </DataListItem>
}
+
+ const modalDescription = <Flex>
+ <FlexItem>{label}</FlexItem>
+ <FlexItem>
+ <Chip isReadOnly={true} textMaxWidth='50ch'>
+ <span style={{ fontSize: 'var(--pf-global--FontSize--md)' }}>
+ <ContainerNodeIcon />&nbsp;{hostname}</span>
+ </Chip>
+ </FlexItem>
+ <FlexItem>
+ <a href={'#'+makeTaskPath(taskPath)}>
+ <LinkIcon name='link' title='Permalink' />
+ </a>
+ </FlexItem>
+ </Flex>
+
return (
- <React.Fragment>
- <ListView.Item
- key='header'
- heading={name}
- initExpanded={expand}
- additionalInfo={ai}
- leftContent={lc}
- >
- {has_interesting_keys &&
- <Row>
- <Col sm={11}>
- <pre>
- <TaskOutput data={this.props.host} include={INTERESTING_KEYS}/>
- </pre>
- </Col>
- </Row>
- }
- </ListView.Item>
- <Modal key='modal' show={this.state.showModal} onHide={this.close}
- dialogClassName="zuul-console-task-detail">
- <Modal.Header>
- <button
- className="close"
- onClick={this.close}
- aria-hidden="true"
- aria-label="Close"
- >
- <Icon type="pf" name="close" />
- </button>
- <Modal.Title>{hostname}
- <span className="zuul-console-modal-header-link">
- <a href={'#'+makeTaskPath(taskPath)}>
- <Icon type="fa" name="link" title="Permalink" />
- </a>
- </span>
- </Modal.Title>
- </Modal.Header>
- <Modal.Body>
- <TaskOutput data={host}/>
- </Modal.Body>
+ <>
+ {item}
+ <Modal
+ title={name}
+ isOpen={this.state.showModal}
+ onClose={this.close}
+ description={modalDescription}>
+ <TaskOutput data={host}/>
</Modal>
- </React.Fragment>
+ </>
)
}
}
@@ -309,60 +368,113 @@ class PlayBook extends React.Component {
displayPath: PropTypes.array,
}
+ constructor(props) {
+ super(props)
+ this.state = {
+ // Start the playbook expanded if
+ // * has errror in it
+ // * direct link
+ // * it is a run playbook
+ expanded: (this.props.errorIds.has(this.props.playbook.phase + this.props.playbook.index) ||
+ taskPathMatches(this.props.taskPath, this.props.displayPath) ||
+ this.props.playbook.phase === 'run'),
+ // NOTE(ianw) 2022-08-26 : Plays start expanded because that is
+ // what it has always done; most playbooks probably only have
+ // one play. Maybe if there's multiple plays things could start
+ // rolled up?
+ playsExpanded: this.props.playbook.plays.map((play, idx) => this.makePlayId(play, idx))
+ }
+ }
+
+ makePlayId = (play, idx) => play.play.name + '-' + idx
+
render () {
const { playbook, errorIds, taskPath, displayPath } = this.props
- const expandAll = (playbook.phase === 'run')
- const expand = (expandAll ||
- errorIds.has(playbook.phase + playbook.index) ||
- taskPathMatches(taskPath, displayPath))
+ const togglePlays = id => {
+ const index = this.state.playsExpanded.indexOf(id)
+ const newExpanded =
+ index >= 0 ? [...this.state.playsExpanded.slice(0, index), ...this.state.playsExpanded.slice(index + 1, this.state.playsExpanded.length)] : [...this.state.playsExpanded, id]
+ this.setState({playsExpanded: newExpanded})
+ }
- const ai = []
+ // This is the header for each playbook
+ let dataListCells = []
+ dataListCells.push(
+ <DataListCell key='name' width={1}>
+ <strong>
+ {playbook.phase[0].toUpperCase() + playbook.phase.slice(1)} playbook<
+ /strong>
+ </DataListCell>)
+ dataListCells.push(
+ <DataListCell key='path' width={5}>
+ {playbook.playbook}
+ </DataListCell>)
if (playbook.trusted) {
- ai.push(
- <ListView.InfoItem key="trusted" title="This playbook runs in a trusted execution context, which permits executing code on the Zuul executor and allows access to all Ansible features.">
- <span className="additionalinfo-icon">
- <InfoCircleIcon />
- </span>
- Trusted
- </ListView.InfoItem>
- )
+ dataListCells.push(
+ <DataListCell key='trust'>
+ <Tooltip content={<div>This playbook runs in a trusted execution context, which permits executing code on the Zuul executor and allows access to all Ansible features.</div>}>
+ <Label color='blue' icon={<InfoCircleIcon />} style={{cursor: 'pointer'}}>Trusted</Label></Tooltip></DataListCell>)
+ } else {
+ // NOTE(ianw) : This empty cell keeps things lined up
+ // correctly. We tried a "untrusted" label but preferred
+ // without.
+ dataListCells.push(<DataListCell key='trust' width={1}/>)
}
return (
- <ListView.Item
- stacked={true}
- additionalInfo={ai}
- initExpanded={expand}
- heading={playbook.phase[0].toUpperCase() + playbook.phase.slice(1) + ' playbook'}
- description={playbook.playbook}
- >
- {playbook.plays.map((play, idx) => (
- <React.Fragment key={idx}>
- <Row key='play'>
- <Col sm={12}>
- <strong>Play: {play.play.name}</strong>
- </Col>
- </Row>
- {play.tasks.map((task, idx2) => (
- Object.entries(task.hosts).map(([hostname, host]) => (
- <Row key={idx2+hostname}>
- <Col sm={12}>
- <HostTask hostname={hostname}
- taskPath={taskPath.concat([
- idx.toString(), idx2.toString(), hostname])}
- displayPath={displayPath} task={task} host={host}
- errorIds={errorIds}/>
- </Col>
- </Row>
- ))))}
- </React.Fragment>
- ))}
- </ListView.Item>
+ <DataListItem isExpanded={this.state.expanded}>
+
+ <DataListItemRow>
+ <DataListToggle
+ onClick={() => this.setState({expanded: !this.state.expanded})}
+ isExpanded={this.state.expanded}/>
+ <DataListItemCells
+ dataListCells={dataListCells} />
+ </DataListItemRow>
+
+ <DataListContent isHidden={!this.state.expanded}>
+
+ {playbook.plays.map((play, idx) => (
+ <DataList isCompact={true} key={this.makePlayId(play, idx)} style={{ fontSize: 'var(--pf-global--FontSize--md)' }}>
+ <DataListItem isExpanded={this.state.playsExpanded.includes(this.makePlayId(play, idx))}>
+ <DataListItemRow>
+ <DataListToggle
+ onClick={() => togglePlays(this.makePlayId(play, idx))}
+ isExpanded={this.state.playsExpanded.includes(this.makePlayId(play, idx))}
+ id={this.makePlayId(play, idx)}/>
+ <DataListItemCells dataListCells={[
+ <DataListCell key='play'>Play: {play.play.name}</DataListCell>
+ ]}
+ />
+ </DataListItemRow>
+ <DataListContent
+ isHidden={!this.state.playsExpanded.includes(this.makePlayId(play, idx))}>
+
+ <DataList isCompact={true} style={{ fontSize: 'var(--pf-global--FontSize--md)' }} >
+ {play.tasks.map((task, idx2) => (
+ Object.entries(task.hosts).map(([hostname, host]) => (
+ <HostTask key={idx+idx2+hostname}
+ hostname={hostname}
+ taskPath={taskPath.concat([
+ idx.toString(), idx2.toString(), hostname])}
+ displayPath={displayPath} task={task} host={host}
+ errorIds={errorIds}/>
+ ))))}
+ </DataList>
+
+ </DataListContent>
+ </DataListItem>
+ </DataList>
+ ))}
+
+ </DataListContent>
+ </DataListItem>
)
}
}
+
class Console extends React.Component {
static propTypes = {
errorIds: PropTypes.object,
@@ -375,11 +487,19 @@ class Console extends React.Component {
return (
<React.Fragment>
- <ListView key="playbooks" className="zuul-console">
- {output.map((playbook, idx) => (
- <PlayBook key={idx} playbook={playbook} taskPath={[idx.toString()]}
- displayPath={displayPath} errorIds={errorIds}/>))}
- </ListView>
+ <br />
+ <span className="zuul-console">
+ <DataList isCompact={true}
+ style={{ fontSize: 'var(--pf-global--FontSize--md)' }}>
+ {
+ output.map((playbook, idx) => (
+ <PlayBook
+ key={idx} playbook={playbook} taskPath={[idx.toString()]}
+ displayPath={displayPath} errorIds={errorIds}
+ />))
+ }
+ </DataList>
+ </span>
</React.Fragment>
)
}
diff --git a/web/src/containers/freezejob/FreezeJobToolbar.jsx b/web/src/containers/freezejob/FreezeJobToolbar.jsx
new file mode 100644
index 000000000..c067b7205
--- /dev/null
+++ b/web/src/containers/freezejob/FreezeJobToolbar.jsx
@@ -0,0 +1,200 @@
+// Copyright 2020 BMW Group
+// Copyright 2022 Acme Gating, LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License. You may obtain
+// a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+
+import React, { useEffect, useState } from 'react'
+import { connect } from 'react-redux'
+import PropTypes from 'prop-types'
+import {
+ Button,
+ TextInput,
+ Dropdown,
+ DropdownItem,
+ DropdownPosition,
+ DropdownToggle,
+ Toolbar,
+ ToolbarContent,
+ ToolbarGroup,
+ ToolbarItem,
+ ToolbarToggleGroup,
+} from '@patternfly/react-core'
+
+import { fetchPipelinesIfNeeded } from '../../actions/pipelines'
+
+function FreezeJobToolbar(props) {
+ const { tenant, fetchPipelinesIfNeeded } = props
+
+ useEffect(() => {
+ fetchPipelinesIfNeeded(tenant)
+ }, [fetchPipelinesIfNeeded, tenant])
+
+ const tenantPipelines = props.pipelines.pipelines[tenant.name]
+ const pipelines = tenantPipelines ? tenantPipelines.map(p => { return p.name }) : []
+
+ const [isPipelineOpen, setIsPipelineOpen] = useState(false)
+ const [currentPipeline, setCurrentPipeline] = useState(props.defaultPipeline || '')
+ const [currentProject, setCurrentProject] = useState(props.defaultProject || '')
+ const [currentBranch, setCurrentBranch] = useState(props.defaultBranch || '')
+ const [currentJob, setCurrentJob] = useState(props.defaultJob || '')
+
+ if (!currentPipeline && pipelines.length) {
+ // We may have gotten a list of pipelines after we loaded the page
+ setCurrentPipeline(pipelines[0])
+ }
+
+ function handlePipelineSelect(event) {
+ setCurrentPipeline(event.target.innerText)
+ setIsPipelineOpen(false)
+ }
+
+ function handlePipelineToggle(isOpen) {
+ setIsPipelineOpen(isOpen)
+ }
+
+ function handleProjectChange(newValue) {
+ setCurrentProject(newValue)
+ }
+
+ function handleBranchChange(newValue) {
+ setCurrentBranch(newValue)
+ }
+
+ function handleJobChange(newValue) {
+ setCurrentJob(newValue)
+ }
+
+ function handleInputSend(event) {
+ // In case the event comes from a key press, only accept "Enter"
+ if (event.key && event.key !== 'Enter') {
+ return
+ }
+
+ // Ignore empty values
+ if (!currentBranch || !currentProject || !currentJob) {
+ return
+ }
+
+ // Notify the parent component about the filter change
+ props.onChange(currentPipeline, currentProject, currentBranch, currentJob)
+ }
+
+ function renderFreezeJobToolbar () {
+ return <>
+ <Toolbar collapseListedFiltersBreakpoint="md">
+ <ToolbarContent>
+ <ToolbarToggleGroup breakpoint="md">
+ <ToolbarGroup variant="filter-group">
+
+ <ToolbarItem key="pipeline">
+ <Dropdown
+ onSelect={handlePipelineSelect}
+ position={DropdownPosition.left}
+ toggle={
+ <DropdownToggle
+ onToggle={handlePipelineToggle}
+ style={{ width: '100%' }}
+ >
+ Pipeline: {currentPipeline}
+ </DropdownToggle>
+ }
+ isOpen={isPipelineOpen}
+ dropdownItems={pipelines.map((pipeline) => (
+ <DropdownItem key={pipeline}>{pipeline}</DropdownItem>
+ ))}
+ style={{ width: '100%' }}
+ menuAppendTo={document.body}
+ />
+ </ToolbarItem>
+
+ <ToolbarItem key="project">
+ <TextInput
+ name="project"
+ id="project-input"
+ type="search"
+ placeholder="Project"
+ defaultValue={props.defaultProject}
+ onChange={handleProjectChange}
+ onKeyDown={(event) => handleInputSend(event)}
+ />
+ </ToolbarItem>
+
+ <ToolbarItem key="branch">
+ <TextInput
+ name="branch"
+ id="branch-input"
+ type="search"
+ placeholder="Branch"
+ defaultValue={props.defaultBranch}
+ onChange={handleBranchChange}
+ onKeyDown={(event) => handleInputSend(event)}
+ />
+ </ToolbarItem>
+
+ <ToolbarItem key="job">
+ <TextInput
+ name="job"
+ id="job-input"
+ type="search"
+ placeholder="Job"
+ defaultValue={props.defaultJob}
+ onChange={handleJobChange}
+ onKeyDown={(event) => handleInputSend(event)}
+ />
+ </ToolbarItem>
+
+ <ToolbarItem key="button">
+ <Button
+ onClick={(event) => handleInputSend(event)}
+ >
+ Freeze Job
+ </Button>
+ </ToolbarItem>
+
+ </ToolbarGroup>
+ </ToolbarToggleGroup>
+ </ToolbarContent>
+ </Toolbar>
+ </>
+ }
+
+ return (
+ <div>
+ {renderFreezeJobToolbar()}
+ </div>
+ )
+}
+
+FreezeJobToolbar.propTypes = {
+ fetchPipelinesIfNeeded: PropTypes.func,
+ tenant: PropTypes.object,
+ pipelines: PropTypes.object,
+ onChange: PropTypes.func.isRequired,
+ defaultPipeline: PropTypes.string,
+ defaultProject: PropTypes.string,
+ defaultBranch: PropTypes.string,
+ defaultJob: PropTypes.string,
+}
+
+function mapStateToProps(state) {
+ return {
+ tenant: state.tenant,
+ pipelines: state.pipelines,
+ }
+}
+
+const mapDispatchToProps = {
+ fetchPipelinesIfNeeded
+}
+
+export default connect(mapStateToProps, mapDispatchToProps)(FreezeJobToolbar)
diff --git a/web/src/containers/job/JobVariant.jsx b/web/src/containers/job/JobVariant.jsx
index bec2276ef..9621cf333 100644
--- a/web/src/containers/job/JobVariant.jsx
+++ b/web/src/containers/job/JobVariant.jsx
@@ -107,7 +107,8 @@ class JobVariant extends React.Component {
const jobInfos = [
'source_context', 'builds', 'status',
'parent', 'attempts', 'timeout', 'semaphores',
- 'nodeset', 'variables', 'override_checkout',
+ 'nodeset', 'nodeset_alternatives', 'variables',
+ 'override_checkout',
]
jobInfos.forEach(key => {
let label = key
@@ -173,7 +174,15 @@ class JobVariant extends React.Component {
)
nice_label = (<span><ClusterIcon /> Required nodes</span>)
}
-
+ if (label === 'nodeset_alternatives') {
+ value = value.map((alt, idx) => {
+ return (<>
+ {(idx > 0 ? <span>or</span>:<></>)}
+ <Nodeset nodeset={alt} />
+ </>)
+ })
+ nice_label = (<span><ClusterIcon /> Required nodes</span>)
+ }
if (label === 'parent') {
value = (
<Link to={tenant.linkPrefix + '/job/' + value}>
diff --git a/web/src/containers/jobgraph/JobGraph.jsx b/web/src/containers/jobgraph/JobGraph.jsx
new file mode 100644
index 000000000..75d77161d
--- /dev/null
+++ b/web/src/containers/jobgraph/JobGraph.jsx
@@ -0,0 +1,78 @@
+// Copyright 2022 Acme Gating, LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License. You may obtain
+// a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+
+import React, { useState } from 'react'
+import PropTypes from 'prop-types'
+import { connect } from 'react-redux'
+import { useHistory, useLocation } from 'react-router-dom'
+
+import JobGraphToolbar from './JobGraphToolbar'
+import JobGraphDisplay from './JobGraphDisplay'
+
+function JobGraph(props) {
+ const [currentPipeline, setCurrentPipeline] = useState()
+ const [currentBranch, setCurrentBranch] = useState()
+ const history = useHistory()
+ const location = useLocation()
+
+ if (!currentBranch) {
+ const urlParams = new URLSearchParams(location.search)
+ const branch = urlParams.get('branch')
+ const pipeline = urlParams.get('pipeline')
+ if (pipeline && branch) {
+ setCurrentPipeline(pipeline)
+ setCurrentBranch(branch)
+ }
+ }
+
+ function onChange(pipeline, branch) {
+ setCurrentPipeline(pipeline)
+ setCurrentBranch(branch)
+
+ const searchParams = new URLSearchParams('')
+ searchParams.append('branch', branch)
+ searchParams.append('pipeline', pipeline)
+ history.push({
+ pathname: location.pathname,
+ search: searchParams.toString(),
+ })
+ }
+
+ return (
+ <>
+ <JobGraphToolbar
+ project={props.project}
+ onChange={onChange}
+ defaultBranch={currentBranch}
+ defaultPipeline={currentPipeline}
+ />
+ {currentPipeline && currentBranch &&
+ <JobGraphDisplay
+ project={props.project}
+ pipeline={currentPipeline}
+ branch={currentBranch}
+ />}
+ </>
+ )
+}
+
+JobGraph.propTypes = {
+ project: PropTypes.object.isRequired,
+ tenant: PropTypes.object,
+ dispatch: PropTypes.func,
+}
+
+export default connect((state) => ({
+ tenant: state.tenant,
+}))(JobGraph)
diff --git a/web/src/containers/jobgraph/JobGraphDisplay.jsx b/web/src/containers/jobgraph/JobGraphDisplay.jsx
new file mode 100644
index 000000000..e5cff9cbc
--- /dev/null
+++ b/web/src/containers/jobgraph/JobGraphDisplay.jsx
@@ -0,0 +1,145 @@
+// Copyright 2022 Acme Gating, LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License. You may obtain
+// a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+
+import React, { useState, useEffect} from 'react'
+import PropTypes from 'prop-types'
+import { connect } from 'react-redux'
+import * as d3 from 'd3'
+import { useHistory } from 'react-router-dom'
+
+import { makeJobGraphKey, fetchJobGraphIfNeeded } from '../../actions/jobgraph'
+import { graphviz } from 'd3-graphviz'
+
+function makeDot(tenant, pipeline, project, branch, jobGraph) {
+ let ret = 'digraph job_graph {\n'
+ ret += ' rankdir=LR;\n'
+ ret += ' node [shape=box];\n'
+ jobGraph.forEach((job) => {
+ const searchParams = new URLSearchParams('')
+ searchParams.append('pipeline', pipeline)
+ searchParams.append('project', project.name)
+ searchParams.append('job', job.name)
+ searchParams.append('branch', branch)
+ // This will appear in the DOM as an "a href=" but we will
+ // manipulate the DOM later to add an onClick callback to make
+ // this an internal link.
+ const url = (tenant.linkPrefix +
+ '/freeze-job?' + searchParams.toString())
+ // Escape ampersands to get it through graphviz and d3; these will
+ // appear unescaped in the DOM.
+ const escaped_url = url.replace(/&/g, '&amp;')
+ ret += ' "' + job.name + '" [URL="' + escaped_url + '"];\n'
+ if (job.dependencies.length) {
+ job.dependencies.forEach((dep) => {
+ let soft = ' [dir=back]'
+ if (dep.soft) {
+ soft = ' [style=dashed dir=back]'
+ }
+ ret += ' "' + dep.name + '" -> "' + job.name + '"' + soft + ';\n'
+ })
+ }
+ })
+ ret += '}\n'
+ return ret
+}
+
+function GraphViz(props) {
+ const history = useHistory()
+
+ useEffect(() => {
+ const gv = graphviz('#graphviz')
+ .options({
+ fit: false,
+ zoom: true,
+ tweenPaths: false,
+ scale: 0.75,
+ }).renderDot(props.dot)
+
+ // Fix up the initial values of the internal transform data;
+ // without this the first time we pan the graph jumps.
+ const element = d3.select('.zuul-job-graph > svg')
+ const transform = element[0][0].firstElementChild.attributes.transform.value
+ const match = transform.match(/translate\(\d+,(\d+)\).*/)
+ if (match && match.length > 0) {
+ const val = parseInt(match[1])
+ gv._translation.y = val
+ gv._originalTransform.y = val
+ }
+
+ // Disable scroll wheel zooming because it interferes with window
+ // scrolling
+ gv.zoomSelection().on('wheel.zoom', null)
+
+ // Mutate the links to be internal links
+ d3.select('.zuul-job-graph').selectAll('.node a').on('click', event => {
+ d3.event.preventDefault()
+ history.push(event.attributes['xlink:href'])
+ })
+ }, [props.dot, history])
+
+ return (
+ <div className="zuul-job-graph" id="graphviz"/>
+ )
+}
+
+GraphViz.propTypes = {
+ dot: PropTypes.string.isRequired,
+}
+
+function JobGraphDisplay(props) {
+ const [dot, setDot] = useState()
+ const {fetchJobGraphIfNeeded, tenant, project, pipeline, branch} = props
+
+ useEffect(() => {
+ fetchJobGraphIfNeeded(tenant, project.name, pipeline, branch)
+ }, [fetchJobGraphIfNeeded, tenant, project, pipeline, branch])
+
+ const tenantJobGraph = props.jobgraph.jobGraphs[tenant.name]
+ const jobGraphKey = makeJobGraphKey(props.project.name,
+ props.pipeline,
+ props.branch)
+ const jobGraph = tenantJobGraph ? tenantJobGraph[jobGraphKey] : undefined
+ useEffect(() => {
+ if (jobGraph) {
+ setDot(makeDot(tenant, pipeline, project, branch, jobGraph))
+ }
+ }, [tenant, pipeline, project, branch, jobGraph])
+ return (
+ <>
+ {dot && <GraphViz dot={dot}/>}
+ </>
+ )
+}
+
+JobGraphDisplay.propTypes = {
+ fetchJobGraphIfNeeded: PropTypes.func,
+ tenant: PropTypes.object,
+ project: PropTypes.object.isRequired,
+ pipeline: PropTypes.string.isRequired,
+ branch: PropTypes.string.isRequired,
+ jobgraph: PropTypes.object,
+ dispatch: PropTypes.func,
+ state: PropTypes.object,
+}
+function mapStateToProps(state) {
+ return {
+ tenant: state.tenant,
+ jobgraph: state.jobgraph,
+ state: state,
+ }
+}
+
+const mapDispatchToProps = { fetchJobGraphIfNeeded }
+
+export default connect(mapStateToProps, mapDispatchToProps)(JobGraphDisplay)
diff --git a/web/src/containers/jobgraph/JobGraphToolbar.jsx b/web/src/containers/jobgraph/JobGraphToolbar.jsx
new file mode 100644
index 000000000..0e293d56c
--- /dev/null
+++ b/web/src/containers/jobgraph/JobGraphToolbar.jsx
@@ -0,0 +1,145 @@
+// Copyright 2020 BMW Group
+// Copyright 2022 Acme Gating, LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License. You may obtain
+// a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+
+import React, { useState } from 'react'
+import PropTypes from 'prop-types'
+import {
+ Button,
+ TextInput,
+ Dropdown,
+ DropdownItem,
+ DropdownPosition,
+ DropdownToggle,
+ Toolbar,
+ ToolbarContent,
+ ToolbarGroup,
+ ToolbarItem,
+ ToolbarToggleGroup,
+} from '@patternfly/react-core'
+
+
+function JobGraphToolbar(props) {
+ const pipelineSet = new Set()
+ props.project.configs.forEach((config) => {
+ config.pipelines.forEach((pipeline) => {
+ pipelineSet.add(pipeline.name)
+ })
+ })
+ const pipelines = Array.from(pipelineSet)
+
+ const [isPipelineOpen, setIsPipelineOpen] = useState(false)
+ const [currentPipeline, setCurrentPipeline] = useState(props.defaultPipeline || pipelines[0])
+ const [currentBranch, setCurrentBranch] = useState(props.defaultBranch || '')
+
+ function handlePipelineSelect(event) {
+ setCurrentPipeline(event.target.innerText)
+ setIsPipelineOpen(false)
+ }
+
+ function handlePipelineToggle(isOpen) {
+ setIsPipelineOpen(isOpen)
+ }
+
+ function handleBranchChange(newValue) {
+ setCurrentBranch(newValue)
+ }
+
+ function handleInputSend(event) {
+ // In case the event comes from a key press, only accept "Enter"
+ if (event.key && event.key !== 'Enter') {
+ return
+ }
+
+ // Ignore empty values
+ if (!currentBranch) {
+ return
+ }
+
+ // Clear the input field
+ setCurrentBranch('')
+ // Notify the parent component about the filter change
+ props.onChange(currentPipeline, currentBranch)
+ }
+
+ function renderJobGraphToolbar () {
+ return <>
+ <Toolbar collapseListedFiltersBreakpoint="md">
+ <ToolbarContent>
+ <ToolbarToggleGroup breakpoint="md">
+ <ToolbarGroup variant="filter-group">
+
+ <ToolbarItem key="pipeline">
+ <Dropdown
+ onSelect={handlePipelineSelect}
+ position={DropdownPosition.left}
+ toggle={
+ <DropdownToggle
+ onToggle={handlePipelineToggle}
+ style={{ width: '100%' }}
+ >
+ Pipeline: {currentPipeline}
+ </DropdownToggle>
+ }
+ isOpen={isPipelineOpen}
+ dropdownItems={pipelines.map((pipeline) => (
+ <DropdownItem key={pipeline}>{pipeline}</DropdownItem>
+ ))}
+ style={{ width: '100%' }}
+ menuAppendTo={document.body}
+ />
+ </ToolbarItem>
+
+ <ToolbarItem key="branch">
+ <TextInput
+ name="branch"
+ id="branch-input"
+ type="search"
+ placeholder="Branch"
+ defaultValue={props.defaultBranch}
+ onChange={handleBranchChange}
+ onKeyDown={(event) => handleInputSend(event)}
+ />
+ </ToolbarItem>
+
+ <ToolbarItem key="button">
+ <Button
+ onClick={(event) => handleInputSend(event)}
+ >
+ View Job Graph
+ </Button>
+ </ToolbarItem>
+
+ </ToolbarGroup>
+ </ToolbarToggleGroup>
+ </ToolbarContent>
+ </Toolbar>
+ </>
+ }
+
+ return (
+ <div>
+ {renderJobGraphToolbar()}
+ </div>
+ )
+}
+
+JobGraphToolbar.propTypes = {
+ project: PropTypes.object.isRequired,
+ onChange: PropTypes.func.isRequired,
+ defaultBranch: PropTypes.string,
+ defaultPipeline: PropTypes.string,
+}
+
+export default JobGraphToolbar
diff --git a/web/src/containers/jobs/Jobs.jsx b/web/src/containers/jobs/Jobs.jsx
index d7ab4bc69..71395f1d1 100644
--- a/web/src/containers/jobs/Jobs.jsx
+++ b/web/src/containers/jobs/Jobs.jsx
@@ -62,7 +62,7 @@ class JobsList extends React.Component {
const createNode = (job, extra) => ({
text: (
<React.Fragment>
- <Link to={linkPrefix + job.name}>{job.name}</Link>
+ <Link to={linkPrefix + encodeURIComponent(job.name)}>{job.name}</Link>
{extra && (<span> ({extra})</span>)}
{job.description && (
<span style={{marginLeft: '10px'}}>{job.description}</span>
diff --git a/web/src/containers/logfile/LogFile.jsx b/web/src/containers/logfile/LogFile.jsx
index f8b198450..7184646bd 100644
--- a/web/src/containers/logfile/LogFile.jsx
+++ b/web/src/containers/logfile/LogFile.jsx
@@ -59,6 +59,11 @@ export default function LogFile({
// Only highlight the lines if the log is present (otherwise it doesn't make
// sense). Although, scrolling to the selected section only works once the
// necessary log lines are part of the DOM tree.
+ // Additionally note that if we set highlightStart before the page content
+ // is available then the window scrolling won't match any lines and we won't
+ // scroll. Then when we try to set highlightStart after page content is loaded
+ // the value isn't different than what is set previously preventing the
+ // scroll event from firing.
if (!isFetching) {
// Get the line numbers to highlight from the URL and directly cast them to
// a number. The substring(1) removes the '#' character.
diff --git a/web/src/containers/project/Project.jsx b/web/src/containers/project/Project.jsx
index c355b6af7..993d4d927 100644
--- a/web/src/containers/project/Project.jsx
+++ b/web/src/containers/project/Project.jsx
@@ -1,4 +1,5 @@
// Copyright 2018 Red Hat, Inc
+// Copyright 2022 Acme Gating, LLC
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License. You may obtain
@@ -12,68 +13,44 @@
// License for the specific language governing permissions and limitations
// under the License.
-import * as React from 'react'
+import React, { useState } from 'react'
import PropTypes from 'prop-types'
import {
- Nav,
- NavItem,
- TabContainer,
- TabPane,
- TabContent,
-} from 'patternfly-react'
+ Tabs,
+ Tab,
+} from '@patternfly/react-core'
import ProjectVariant from './ProjectVariant'
-class Project extends React.Component {
- static propTypes = {
- project: PropTypes.object.isRequired,
- }
-
- state = {
- variantIdx: 0,
- }
+function Project(props) {
+ const [variantIdx, setVariantIdx] = useState(0)
+ const { project } = props
- renderVariantTitle (variant, selected) {
- let title = variant.default_branch
- if (selected) {
- title = <strong>{title}</strong>
- }
+ function renderVariantTitle (variant) {
+ let title = variant.source_context.project === project.name ?
+ variant.source_context.branch : variant.source_context.project
return title
}
- render () {
- const { project } = this.props
- const { variantIdx } = this.state
+ return (
+ <React.Fragment>
+ <Tabs activeKey={variantIdx}
+ onSelect={(event, tabIndex) => setVariantIdx(tabIndex)}
+ isBox>
+ {project.configs.map((variant, idx) => (
+ <Tab key={idx} eventKey={idx}
+ title={renderVariantTitle(variant)}>
+ <ProjectVariant variant={variant} />
+ </Tab>
+ ))}
+ </Tabs>
+ </React.Fragment>
+ )
+}
- return (
- <React.Fragment>
- <h2>{project.canonical_name}</h2>
- <TabContainer id="zuul-project">
- <div>
- <Nav bsClass="nav nav-tabs nav-tabs-pf">
- {project.configs.map((variant, idx) => (
- <NavItem
- key={idx}
- onClick={() => this.setState({variantIdx: idx})}>
- <div>
- {this.renderVariantTitle(variant, variantIdx === idx)}
- </div>
- </NavItem>
- ))}
- </Nav>
- <TabContent>
- <TabPane>
- {project.configs[variantIdx] && (
- <ProjectVariant variant={project.configs[variantIdx]} />
- )}
- </TabPane>
- </TabContent>
- </div>
- </TabContainer>
- </React.Fragment>
- )
- }
+Project.propTypes = {
+ project: PropTypes.object.isRequired,
}
export default Project
diff --git a/web/src/containers/project/ProjectVariant.jsx b/web/src/containers/project/ProjectVariant.jsx
index 74be10a55..51a093a32 100644
--- a/web/src/containers/project/ProjectVariant.jsx
+++ b/web/src/containers/project/ProjectVariant.jsx
@@ -18,64 +18,68 @@ import { connect } from 'react-redux'
import { Link } from 'react-router-dom'
-class ProjectVariant extends React.Component {
- static propTypes = {
- tenant: PropTypes.object,
- variant: PropTypes.object.isRequired
- }
+function ProjectVariant(props) {
+ const { tenant, variant } = props
+ const rows = []
- render () {
- const { tenant, variant } = this.props
- const rows = []
+ rows.push({label: 'Merge mode', value: variant.merge_mode})
- rows.push({label: 'Merge mode', value: variant.merge_mode})
+ if (variant.templates.length > 0) {
+ const templateList = (
+ <ul className='list-group'>
+ {variant.templates.map((item, idx) => (
+ <li className='list-group-item' key={idx}>{item}</li>))}
+ </ul>
+ )
+ rows.push({label: 'Templates', value: templateList})
+ }
- if (variant.templates.length > 0) {
- const templateList = (
+ variant.pipelines.forEach(pipeline => {
+ // TODO: either adds job link anchor to load the right variant
+ // and/or show the job variant config in a modal?
+ const jobList = (
+ <React.Fragment>
+ {pipeline.queue_name && (
+ <p><strong>Queue: </strong> {pipeline.queue_name} </p>)}
<ul className='list-group'>
- {variant.templates.map((item, idx) => (
- <li className='list-group-item' key={idx}>{item}</li>))}
+ {pipeline.jobs.map((item, idx) => (
+ <li className='list-group-item' key={idx}>
+ <Link to={tenant.linkPrefix + '/job/' + item[0].name}>
+ {item[0].name}
+ </Link>
+ </li>
+ ))}
</ul>
- )
- rows.push({label: 'Templates', value: templateList})
- }
+ </React.Fragment>
+ )
+ rows.push({label: pipeline.name + ' jobs', value: jobList})
+ })
- variant.pipelines.forEach(pipeline => {
- // TODO: either adds job link anchor to load the right variant
- // and/or show the job variant config in a modal?
- const jobList = (
- <React.Fragment>
- {pipeline.queue_name && (
- <p><strong>Queue: </strong> {pipeline.queue_name} </p>)}
- <ul className='list-group'>
- {pipeline.jobs.map((item, idx) => (
- <li className='list-group-item' key={idx}>
- <Link to={tenant.linkPrefix + '/job/' + item[0].name}>
- {item[0].name}
- </Link>
- </li>
- ))}
- </ul>
- </React.Fragment>
- )
- rows.push({label: pipeline.name + ' jobs', value: jobList})
- })
+ return (
+ <div>
+ <table className='table table-striped table-bordered'>
+ <tbody>
+ {rows.map(item => (
+ <tr key={item.label}>
+ <td style={{width: '10%'}}>{item.label}</td>
+ <td>{item.value}</td>
+ </tr>
+ ))}
+ </tbody>
+ </table>
+ </div>
+ )
+}
- return (
- <div>
- <table className='table table-striped table-bordered'>
- <tbody>
- {rows.map(item => (
- <tr key={item.label}>
- <td style={{width: '10%'}}>{item.label}</td>
- <td>{item.value}</td>
- </tr>
- ))}
- </tbody>
- </table>
- </div>
- )
+ProjectVariant.propTypes = {
+ tenant: PropTypes.object,
+ variant: PropTypes.object.isRequired
+}
+
+function mapStateToProps(state) {
+ return {
+ tenant: state.tenant,
}
}
-export default connect(state => ({tenant: state.tenant}))(ProjectVariant)
+export default connect(mapStateToProps)(ProjectVariant)
diff --git a/web/src/containers/status/Change.jsx b/web/src/containers/status/Change.jsx
index be488423b..c90d6bdfd 100644
--- a/web/src/containers/status/Change.jsx
+++ b/web/src/containers/status/Change.jsx
@@ -166,7 +166,7 @@ class Change extends React.Component {
renderAdminCommands(idx) {
const { showAdminActions } = this.state
- const { queue, pipeline } = this.props
+ const { queue } = this.props
const dropdownCommands = [
<DropdownItem
key="dequeue"
@@ -179,22 +179,18 @@ class Change extends React.Component {
this.setState(() => ({ showDequeueModal: true }))
}}
>Dequeue</DropdownItem>,
+ <DropdownItem
+ key="promote"
+ icon={<AngleDoubleUpIcon style={{
+ color: 'var(--pf-global--default-color--200)',
+ }} />}
+ description="Promote this change to the top of the queue"
+ onClick={(event) => {
+ event.preventDefault()
+ this.setState(() => ({ showPromoteModal: true }))
+ }}
+ >Promote</DropdownItem>
]
- if (pipeline.manager === 'dependent') {
- dropdownCommands.push(
- <DropdownItem
- key="promote"
- icon={<AngleDoubleUpIcon style={{
- color: 'var(--pf-global--default-color--200)',
- }} />}
- description="Promote this change to the top of the queue"
- onClick={(event) => {
- event.preventDefault()
- this.setState(() => ({ showPromoteModal: true }))
- }}
- >Promote</DropdownItem>
- )
- }
return (
<Dropdown
title='Actions'
diff --git a/web/src/containers/status/ChangePanel.jsx b/web/src/containers/status/ChangePanel.jsx
index 33fc4687c..dd4fc27e5 100644
--- a/web/src/containers/status/ChangePanel.jsx
+++ b/web/src/containers/status/ChangePanel.jsx
@@ -18,6 +18,7 @@ import { connect } from 'react-redux'
import { Link } from 'react-router-dom'
import * as moment from 'moment'
import 'moment-duration-format'
+import { Button } from '@patternfly/react-core'
class ChangePanel extends React.Component {
@@ -30,9 +31,11 @@ class ChangePanel extends React.Component {
constructor () {
super()
this.state = {
- expanded: false
+ expanded: false,
+ showSkipped: false,
}
this.onClick = this.onClick.bind(this)
+ this.toggleSkippedJobs = this.toggleSkippedJobs.bind(this)
this.clicked = false
}
@@ -120,12 +123,13 @@ class ChangePanel extends React.Component {
}
renderProgressBar (change) {
- let jobPercent = (100 / change.jobs.length).toFixed(2)
+ const interesting_jobs = change.jobs.filter(j => this.jobStrResult(j) !== 'skipped')
+ let jobPercent = (100 / interesting_jobs.length).toFixed(2)
return (
<div className='progress zuul-change-total-result'>
{change.jobs.map((job, idx) => {
let result = this.jobStrResult(job)
- if (['queued', 'waiting'].includes(result)) {
+ if (['queued', 'waiting', 'skipped'].includes(result)) {
return ''
}
let className = ''
@@ -144,7 +148,6 @@ class ChangePanel extends React.Component {
className = ' progress-bar-warning'
break
case 'paused':
- case 'skipped':
className = ' progress-bar-info'
break
default:
@@ -302,15 +305,39 @@ class ChangePanel extends React.Component {
</span>)
}
+ toggleSkippedJobs (e) {
+ // Skip middle mouse button
+ if (e.button === 1) {
+ return
+ }
+ this.setState({ showSkipped: !this.state.showSkipped })
+ }
+
renderJobList (jobs, times) {
+ const [buttonText, interestingJobs] = this.state.showSkipped ?
+ ['Hide', jobs] :
+ ['Show', jobs.filter(j => this.jobStrResult(j) !== 'skipped')]
+ const skippedJobCount = jobs.length - interestingJobs.length
+
return (
- <ul className='list-group zuul-patchset-body'>
- {jobs.map((job, idx) => (
- <li key={idx} className='list-group-item zuul-change-job'>
- {this.renderJob(job, times.jobs[job.name])}
- </li>
- ))}
- </ul>)
+ <>
+ <ul className='list-group zuul-patchset-body'>
+ {interestingJobs.map((job, idx) => (
+ <li key={idx} className='list-group-item zuul-change-job'>
+ {this.renderJob(job, times.jobs[job.name])}
+ </li>
+ ))}
+ {(this.state.showSkipped || skippedJobCount) ? (
+ <li key='last' className='list-group-item zuul-change-job'>
+ <Button variant="link" className='zuul-skipped-jobs-button'
+ onClick={this.toggleSkippedJobs}>
+ {buttonText} {skippedJobCount ? skippedJobCount : ''} skipped job{skippedJobCount === 1 ? '' : 's'}
+ </Button>
+ </li>
+ ) : ''}
+ </ul>
+ </>
+ )
}
calculateTimes (change) {
diff --git a/web/src/containers/status/ChangePanel.test.jsx b/web/src/containers/status/ChangePanel.test.jsx
index 5a4be8602..cd27edc73 100644
--- a/web/src/containers/status/ChangePanel.test.jsx
+++ b/web/src/containers/status/ChangePanel.test.jsx
@@ -16,6 +16,7 @@ import React from 'react'
import { Link, BrowserRouter as Router } from 'react-router-dom'
import { Provider } from 'react-redux'
import { create } from 'react-test-renderer'
+import { Button } from '@patternfly/react-core'
import { setTenantAction } from '../../actions/tenant'
import configureStore from '../../store'
@@ -45,6 +46,8 @@ it('change panel render multi tenant links', () => {
const jobLink = application.root.findByType(Link)
expect(jobLink.props.to).toEqual(
'/t/tenant-one/stream/42')
+ const skipButton = application.root.findAllByType(Button)
+ expect(skipButton === undefined)
})
it('change panel render white-label tenant links', () => {
@@ -60,4 +63,29 @@ it('change panel render white-label tenant links', () => {
const jobLink = application.root.findByType(Link)
expect(jobLink.props.to).toEqual(
'/stream/42')
+ const skipButton = application.root.findAllByType(Button)
+ expect(skipButton === undefined)
+})
+
+it('change panel skip jobs', () => {
+ const fakeChange = {
+ project: 'org-project',
+ jobs: [{
+ name: 'job-name',
+ url: 'stream/42',
+ result: 'skipped'
+ }]
+ }
+
+ const store = configureStore()
+ store.dispatch(setTenantAction('tenant-one', true))
+ const application = create(
+ <Provider store={store}>
+ <Router>
+ <ChangePanel change={fakeChange} globalExpanded={true} />
+ </Router>
+ </Provider>
+ )
+ const skipButton = application.root.findByType(Button)
+ expect(skipButton.props.children.includes('skipped job'))
})
diff --git a/web/src/images/logo.svg b/web/src/images/logo.svg
index 3c9d877f3..01d7ce12f 100644
--- a/web/src/images/logo.svg
+++ b/web/src/images/logo.svg
@@ -1,22 +1 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- viewBox="0 20 284.3 124" style="enable-background:new 0 20 284.3 124;" xml:space="preserve">
-<style type="text/css">
- .st0{fill:#f0f0f0;}
-</style>
-<g>
- <path class="st0" d="M34.2,100.8h66.5L86.5,76.2v-8.4l3.9-5.1H78.6L67.4,43.2L56.2,62.7H44.4l3.9,5.1v8.4L34.2,100.8z M48.4,97.4
- H40l8.4-14.5V97.4z M54.1,97.4h-2.4V77.6h2.4V97.4z M54.1,74.3h-2.4v-2.4h2.4V74.3z M65.7,97.4h-8.2V77.6h8.2V97.4z M77.3,97.4
- h-8.2V77.6h8.2V97.4z M77.3,74.3H57.5v-2.4h19.8V74.3z M83.1,97.4h-2.4V77.6h2.4V97.4z M83.1,74.3h-2.4v-2.4h2.4V74.3z M86.5,82.9
- l8.4,14.5h-8.4V82.9z M67.4,49.9l7.4,12.7H60L67.4,49.9z M83.6,66l-0.5,0.7v1.8H51.7v-1.8L51.2,66H83.6z"/>
- <g>
- <polygon class="st0" points="246.7,80 233.5,80 233.5,57.2 227.5,60.7 227.5,86 250.2,86 "/>
- <path class="st0" d="M207.5,74.2L207.5,74.2L207.5,74.2c0,3.6-2.9,6.5-6.5,6.5s-6.5-2.9-6.5-6.5l0,0l0,0v-17l-6,3.5v13.5l0,0
- c0,6.9,5.6,12.5,12.5,12.5s12.5-5.6,12.5-12.5l0,0v-17l-6,3.5V74.2z"/>
- <path class="st0" d="M168.4,74.2L168.4,74.2L168.4,74.2c0,3.6-2.9,6.5-6.5,6.5s-6.5-2.9-6.5-6.5l0,0l0,0v-17l-6,3.5v13.5l0,0
- c0,6.9,5.6,12.5,12.5,12.5s12.5-5.6,12.5-12.5l0,0v-17l-6,3.5V74.2z"/>
- <polygon class="st0" points="133.9,57.2 113.8,57.2 110.4,63.3 123.5,63.3 110.4,86 131.9,86 135.4,80 120.8,80 "/>
- </g>
-</g>
-</svg>
+<svg width="57.149998mm" height="15.239994mm" viewBox="0 0 57.149998 15.239994" xmlns="http://www.w3.org/2000/svg"><path class="st0" d="M34.2 100.8h66.5L86.5 76.2v-8.4l3.9-5.1H78.6L67.4 43.2 56.2 62.7H44.4l3.9 5.1v8.4zm14.2-3.4H40l8.4-14.5zm5.7 0h-2.4V77.6h2.4zm0-23.1h-2.4v-2.4h2.4zm11.6 23.1h-8.2V77.6h8.2zm11.6 0h-8.2V77.6h8.2zm0-23.1H57.5v-2.4h19.8zm5.8 23.1h-2.4V77.6h2.4zm0-23.1h-2.4v-2.4h2.4zm3.4 8.6 8.4 14.5h-8.4zm-19.1-33 7.4 12.7H60ZM83.6 66l-.5.7v1.8H51.7v-1.8l-.5-.7Zm143.9 20h22.7l-3.5-6h-13.2V57.2l-6 3.5zm-20-11.8c0 3.6-2.9 6.5-6.5 6.5s-6.5-2.9-6.5-6.5v-17l-6 3.5v13.5c0 6.9 5.6 12.5 12.5 12.5s12.5-5.6 12.5-12.5v-17l-6 3.5zm-39.1 0c0 3.6-2.9 6.5-6.5 6.5s-6.5-2.9-6.5-6.5v-17l-6 3.5v13.5c0 6.9 5.6 12.5 12.5 12.5s12.5-5.6 12.5-12.5v-17l-6 3.5zm-58-10.9h13.1L110.4 86h21.5l3.5-6h-14.6l13.1-22.8h-20.1z" style="fill:#f0f0f0" transform="translate(-9.04875 -11.430001) scale(.26458)"/></svg> \ No newline at end of file
diff --git a/web/src/index.css b/web/src/index.css
index e8c67a372..380598f95 100644
--- a/web/src/index.css
+++ b/web/src/index.css
@@ -3,6 +3,12 @@ body {
padding: 0;
}
+/* Make the H2 header inline-block so that the refresh icon/button can
+ share space with it floating on the right. */
+h2 {
+ display: inline-block;
+}
+
.pf-c-title {
padding-bottom: 10px;
}
@@ -18,10 +24,19 @@ a.refresh {
}
/* Navigation bar */
-.zuul-brand {
+.zuul-page .pf-c-brand {
/* TODO (felix): If we can define a size in the logo.svg itself, this
shouldn't be necessary. */
- height: 40px;
+ height: 1.5em;
+}
+
+.zuul-page .pf-c-page__header {
+ min-height: 0;
+}
+
+.zuul-page .pf-c-page__main-nav {
+ background-color: var(--pf-global--BackgroundColor--dark-300);
+ padding-top: 0;
}
.zuul-select-tz {
@@ -189,6 +204,11 @@ a.refresh {
font-size: small;
}
+.zuul-skipped-jobs-button {
+ font-size: small;
+ padding: 0;
+}
+
.zuul-non-voting-desc {
font-size: smaller;
}
@@ -280,86 +300,45 @@ pre.version {
}
/* Console */
-.zuul-console .list-group-item-header,
-.zuul-console .list-view-pf-actions,
-.zuul-console .list-view-pf-expand,
-.zuul-console .list-view-pf-main-info
-{
- margin-top: 1px;
- margin-bottom: 1px;
-}
-.zuul-console .list-view-pf-main-info
-{
- padding-top: 1px;
- padding-bottom: 1px;
-}
-.zuul-console .list-view-pf-expand
-{
- padding: 0;
-}
-.zuul-console .list-view-pf-left
-{
- padding-right: 17px;
-}
-.zuul-console .list-group-item-heading
-{
- margin-bottom: 0;
-}
-.zuul-console .list-group-item-text
-{
- margin-bottom: 0;
-}
-.zuul-console .task-skipped
-{
- color: white;
- background-color: #00729b;
- width: 6em;
- cursor: pointer;
-}
-.zuul-console .task-changed
-{
- color: white;
- background-color: #a28301;
- width: 6em;
- cursor: pointer;
+
+.zuul-console .pf-c-data-list__expandable-content {
+ border: none;
}
-.zuul-console .task-ok
+
+.zuul-console .pf-c-data-list__expandable-content-body
{
- color: white;
- background-color: #018200;
- width: 6em;
- cursor: pointer;
+ padding-top: calc(var(--pf-c-data-list__expandable-content-body--PaddingTop) * 0.25) !important;
+ padding-bottom: calc(var(--pf-c-data-list__expandable-content-body--PaddingTop) * 0.25) !important
}
-.zuul-console .task-failed
-{
- color: white;
- background-color: #9b0000;
- width: 6em;
- cursor: pointer;
+
+.zuul-console .pf-c-data-list {
+ border: none
}
-.zuul-console .additionalinfo-icon
+
+.zuul-console .pf-c-data-list__item:hover
{
- cursor: default;
- margin-right: 8px;
+ background: var(--pf-global--BackgroundColor--light-200);
}
-.zuul-console .task-details-icon
+
+.zuul-console .pf-c-data-list__item:hover::before
{
- cursor: pointer;
- margin-right: 8px;
+ background: var(--pf-global--active-color--400);
}
-.zuul-console-modal-header-link
-{
- margin-left: 2em;
- font-size: 18px;
+
+.zuul-console .pf-c-data-list__item {
+ border: none;
}
-.zuul-console-task-detail
-{
- width: 80%;
+
+.zuul-console .pf-c-data-list__item-content {
+ padding-bottom: 2px !important;
+ padding-top: 0px !important
}
-.zuul-console-task-result
-{
- padding-left: 4em;
+
+.zuul-console .pf-c-data-list__cell {
+ padding-top: 4px !important;
+ padding-bottom: 0px !important
}
+
pre.zuul-log-output
{
overflow-x: auto;
@@ -418,23 +397,24 @@ details.foldable[open] summary::before {
content: "less";
}
-/* Overwrite PF4 navbar rules to enforce the 'lg' layout of the navbar also for
- 'xl' sized screens. This will keep the navbar stacked (like it was in Zuul
- before) and prevent PF4 to put all elements in a single line with horizontal
- scrolling (which would look something like:
- ZUUL | < Status Projects Jobs Labels No... > | API Documentation Tenant */
-@media screen and (min-width: 1200px) {
- .pf-c-page__header-nav {
- grid-column: 1/-1;
- grid-row: 2/3;
- }
+/* The box size calculation compared to the text size seems off, but
+ this looks better */
+.zuul-job-graph text {
+ font-size: 12px;
+}
- .pf-c-page {
- --pf-c-page__header-nav--PaddingRight: var(
- --pf-c-page__header-nav--lg--PaddingRight
- );
- --pf-c-page__header-nav--PaddingLeft: var(
- --pf-c-page__header-nav--lg--PaddingLeft
- );
- }
+/* task summary */
+
+.zuul-task-summary .pf-c-data-list {
+ border: none
+}
+
+.zuul-task-summary .pf-c-data-list__item:hover
+{
+ background: var(--pf-global--BackgroundColor--light-200);
+}
+
+.zuul-task-summary .pf-c-data-list__item:hover::before
+{
+ background: var(--pf-global--active-color--400);
}
diff --git a/web/src/pages/FreezeJob.jsx b/web/src/pages/FreezeJob.jsx
new file mode 100644
index 000000000..a78cc7b56
--- /dev/null
+++ b/web/src/pages/FreezeJob.jsx
@@ -0,0 +1,149 @@
+// Copyright 2022 Acme Gating, LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License. You may obtain
+// a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+
+import React, { useEffect, useState } from 'react'
+import PropTypes from 'prop-types'
+import { connect } from 'react-redux'
+import { useHistory, useLocation } from 'react-router-dom'
+import {
+ PageSection,
+ PageSectionVariants,
+ Text,
+ TextContent,
+} from '@patternfly/react-core'
+import ReactJson from 'react-json-view'
+
+import FreezeJobToolbar from '../containers/freezejob/FreezeJobToolbar'
+import { makeFreezeJobKey, fetchFreezeJobIfNeeded } from '../actions/freezejob'
+
+function FreezeJobPage(props) {
+ const { tenant, fetchFreezeJobIfNeeded } = props
+
+ const [currentPipeline, setCurrentPipeline] = useState()
+ const [currentProject, setCurrentProject] = useState()
+ const [currentBranch, setCurrentBranch] = useState()
+ const [currentJob, setCurrentJob] = useState()
+ const history = useHistory()
+ const location = useLocation()
+
+ if (!currentBranch) {
+ const urlParams = new URLSearchParams(location.search)
+ const pipeline = urlParams.get('pipeline')
+ const project = urlParams.get('project')
+ const branch = urlParams.get('branch')
+ const job = urlParams.get('job')
+ if (pipeline && branch && project && job) {
+ setCurrentPipeline(pipeline)
+ setCurrentProject(project)
+ setCurrentBranch(branch)
+ setCurrentJob(job)
+ }
+ }
+
+ useEffect(() => {
+ document.title = 'Zuul Frozen Job'
+ if (currentPipeline && currentProject && currentBranch && currentJob) {
+ fetchFreezeJobIfNeeded(tenant, currentPipeline, currentProject,
+ currentBranch, currentJob)
+ }
+ }, [fetchFreezeJobIfNeeded, tenant, currentPipeline, currentProject,
+ currentBranch, currentJob])
+
+ function onChange(pipeline, project, branch, job) {
+ setCurrentPipeline(pipeline)
+ setCurrentProject(project)
+ setCurrentBranch(branch)
+ setCurrentJob(job)
+
+ const searchParams = new URLSearchParams('')
+ searchParams.append('pipeline', pipeline)
+ searchParams.append('project', project)
+ searchParams.append('branch', branch)
+ searchParams.append('job', job)
+ history.push({
+ pathname: location.pathname,
+ search: searchParams.toString(),
+ })
+
+ if (currentPipeline && currentProject && currentBranch && currentJob) {
+ fetchFreezeJobIfNeeded(tenant, currentPipeline, currentProject,
+ currentBranch, currentJob)
+ }
+ }
+
+ const tenantJobs = props.freezejob.freezeJobs[tenant.name]
+ const freezeJobKey = makeFreezeJobKey(currentPipeline,
+ currentProject,
+ currentBranch,
+ currentJob)
+ const job = tenantJobs ? tenantJobs[freezeJobKey] : undefined
+ function renderFrozenJob() {
+ return (
+ <span style={{whiteSpace: 'pre-wrap'}}>
+ <ReactJson
+ src={job}
+ name={null}
+ collapsed={false}
+ sortKeys={true}
+ enableClipboard={false}
+ displayDataTypes={false}/>
+ </span>
+ )
+ }
+
+ return (
+ <>
+ <PageSection variant={PageSectionVariants.light}>
+ <TextContent>
+ <Text component="h1">Freeze Job</Text>
+ <Text component="p">
+ Freezing a job asks Zuul to combine all the
+ <i>project</i> and <i>job</i> configuration
+ stanzas for a job as if a change for a given
+ project and branch were to be enqueued into
+ a specific pipeline. The resulting job
+ configuration is displayed below.
+ </Text>
+ </TextContent>
+ <FreezeJobToolbar
+ onChange={onChange}
+ defaultPipeline={currentPipeline}
+ defaultProject={currentProject}
+ defaultBranch={currentBranch}
+ defaultJob={currentJob}
+ />
+ {job && renderFrozenJob(job)}
+ </PageSection>
+ </>
+ )
+}
+
+FreezeJobPage.propTypes = {
+ fetchFreezeJobIfNeeded: PropTypes.func,
+ tenant: PropTypes.object,
+ freezejob: PropTypes.object,
+}
+
+function mapStateToProps(state) {
+ return {
+ tenant: state.tenant,
+ freezejob: state.freezejob,
+ }
+}
+
+const mapDispatchToProps = {
+ fetchFreezeJobIfNeeded
+}
+
+export default connect(mapStateToProps, mapDispatchToProps)(FreezeJobPage)
diff --git a/web/src/pages/Project.jsx b/web/src/pages/Project.jsx
index 8f76e9ff1..06e8612c7 100644
--- a/web/src/pages/Project.jsx
+++ b/web/src/pages/Project.jsx
@@ -1,4 +1,5 @@
// Copyright 2018 Red Hat, Inc
+// Copyright 2022 Acme Gating, LLC
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License. You may obtain
@@ -12,62 +13,74 @@
// License for the specific language governing permissions and limitations
// under the License.
-import * as React from 'react'
+import React, { useEffect, useCallback } from 'react'
import { connect } from 'react-redux'
import PropTypes from 'prop-types'
-import { PageSection, PageSectionVariants } from '@patternfly/react-core'
-
+import {
+ PageSection,
+ PageSectionVariants,
+ Text,
+ TextContent,
+} from '@patternfly/react-core'
import Project from '../containers/project/Project'
+import JobGraph from '../containers/jobgraph/JobGraph'
import { fetchProjectIfNeeded } from '../actions/project'
import { Fetchable } from '../containers/Fetching'
-class ProjectPage extends React.Component {
- static propTypes = {
- match: PropTypes.object.isRequired,
- tenant: PropTypes.object,
- remoteData: PropTypes.object,
- dispatch: PropTypes.func
- }
-
- updateData = (force) => {
- this.props.dispatch(fetchProjectIfNeeded(
- this.props.tenant, this.props.match.params.projectName, force))
- }
+function ProjectPage(props) {
+ const { tenant, fetchProjectIfNeeded, remoteData } = props
+ const { projectName } = props.match.params
+ const tenantProjects = remoteData.projects[tenant.name]
- componentDidMount () {
- document.title = 'Zuul Project | ' + this.props.match.params.projectName
- if (this.props.tenant.name) {
- this.updateData()
+ const updateData = useCallback((force) => {
+ if (tenant.name) {
+ fetchProjectIfNeeded(tenant, projectName, force)
}
- }
+ }, [tenant, projectName, fetchProjectIfNeeded])
- componentDidUpdate (prevProps) {
- if (this.props.tenant.name !== prevProps.tenant.name) {
- this.updateData()
- }
- }
+ useEffect(() => {
+ document.title = 'Zuul Project | ' + projectName
+ updateData()
+ }, [tenant, projectName, updateData])
- render () {
- const { remoteData } = this.props
- const tenantProjects = remoteData.projects[this.props.tenant.name]
- const projectName = this.props.match.params.projectName
- return (
+ return (
+ <>
<PageSection variant={PageSectionVariants.light}>
- <PageSection style={{paddingRight: '5px'}}>
- <Fetchable
- isFetching={remoteData.isFetching}
- fetchCallback={this.updateData}
- />
- </PageSection>
+ <TextContent>
+ <Text component="h2">Project {projectName}</Text>
+ <Fetchable
+ isFetching={remoteData.isFetching}
+ fetchCallback={updateData}
+ />
+ </TextContent>
{tenantProjects && tenantProjects[projectName] &&
- <Project project={tenantProjects[projectName]} />}
- </PageSection>
- )
+ <>
+ <Project project={tenantProjects[projectName]} />
+ <JobGraph project={tenantProjects[projectName]} />
+ </>
+ }
+ </PageSection>
+ </>
+ )
+}
+
+ProjectPage.propTypes = {
+ match: PropTypes.object.isRequired,
+ tenant: PropTypes.object,
+ remoteData: PropTypes.object,
+ fetchProjectIfNeeded: PropTypes.func,
+}
+
+function mapStateToProps(state) {
+ return {
+ tenant: state.tenant,
+ remoteData: state.project,
}
}
-export default connect(state => ({
- tenant: state.tenant,
- remoteData: state.project,
-}))(ProjectPage)
+const mapDispatchToProps = {
+ fetchProjectIfNeeded,
+}
+
+export default connect(mapStateToProps, mapDispatchToProps)(ProjectPage)
diff --git a/web/src/reducers/auth.js b/web/src/reducers/auth.js
index bdbe17930..8f990ea22 100644
--- a/web/src/reducers/auth.js
+++ b/web/src/reducers/auth.js
@@ -26,6 +26,7 @@ let auth_params = {
authority: '',
client_id: '',
scope: '',
+ loadUserInfo: true,
}
if (stored_params !== null) {
auth_params = JSON.parse(stored_params)
diff --git a/web/src/reducers/freezejob.js b/web/src/reducers/freezejob.js
new file mode 100644
index 000000000..6e7db4991
--- /dev/null
+++ b/web/src/reducers/freezejob.js
@@ -0,0 +1,55 @@
+// Copyright 2018 Red Hat, Inc
+// Copyright 2022 Acme Gating, LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License. You may obtain
+// a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+
+import {
+ FREEZE_JOB_FETCH_FAIL,
+ FREEZE_JOB_FETCH_REQUEST,
+ FREEZE_JOB_FETCH_SUCCESS
+} from '../actions/freezejob'
+
+export default (state = {
+ isFetching: false,
+ freezeJobs: {},
+}, action) => {
+ let stateFreezeJobs
+ switch (action.type) {
+ case FREEZE_JOB_FETCH_REQUEST:
+ return {
+ isFetching: true,
+ freezeJobs: state.freezeJobs,
+ }
+ case FREEZE_JOB_FETCH_SUCCESS:
+ stateFreezeJobs = !state.freezeJobs[action.tenant] ?
+ { ...state.freezeJobs, [action.tenant]: {} } :
+ { ...state.freezeJobs }
+ return {
+ isFetching: false,
+ freezeJobs: {
+ ...stateFreezeJobs,
+ [action.tenant]: {
+ ...stateFreezeJobs[action.tenant],
+ [action.freezeJobKey]: action.freezeJob
+ }
+ }
+ }
+ case FREEZE_JOB_FETCH_FAIL:
+ return {
+ isFetching: false,
+ freezeJobs: state.freezeJobs,
+ }
+ default:
+ return state
+ }
+}
diff --git a/web/src/reducers/index.js b/web/src/reducers/index.js
index 325e4f3dd..83c86c105 100644
--- a/web/src/reducers/index.js
+++ b/web/src/reducers/index.js
@@ -19,16 +19,19 @@ import autoholds from './autoholds'
import configErrors from './configErrors'
import change from './change'
import component from './component'
+import freezejob from './freezejob'
import notifications from './notifications'
import build from './build'
import info from './info'
import job from './job'
+import jobgraph from './jobgraph'
import jobs from './jobs'
import labels from './labels'
import logfile from './logfile'
import nodes from './nodes'
import openapi from './openapi'
import project from './project'
+import pipelines from './pipelines'
import projects from './projects'
import preferences from './preferences'
import status from './status'
@@ -44,14 +47,17 @@ const reducers = {
change,
component,
configErrors,
+ freezejob,
notifications,
info,
job,
+ jobgraph,
jobs,
labels,
logfile,
nodes,
openapi,
+ pipelines,
project,
projects,
status,
diff --git a/web/src/reducers/initialState.js b/web/src/reducers/initialState.js
index ce74956e9..d2e306032 100644
--- a/web/src/reducers/initialState.js
+++ b/web/src/reducers/initialState.js
@@ -23,7 +23,7 @@ export default {
logfile: {
// Store files by buildId->filename->content
files: {},
- isFetching: false,
+ isFetching: true,
url: null,
},
auth: {},
diff --git a/web/src/reducers/jobgraph.js b/web/src/reducers/jobgraph.js
new file mode 100644
index 000000000..0a015fb45
--- /dev/null
+++ b/web/src/reducers/jobgraph.js
@@ -0,0 +1,55 @@
+// Copyright 2018 Red Hat, Inc
+// Copyright 2022 Acme Gating, LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License. You may obtain
+// a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+
+import {
+ JOB_GRAPH_FETCH_FAIL,
+ JOB_GRAPH_FETCH_REQUEST,
+ JOB_GRAPH_FETCH_SUCCESS
+} from '../actions/jobgraph'
+
+export default (state = {
+ isFetching: false,
+ jobGraphs: {},
+}, action) => {
+ let stateJobGraphs
+ switch (action.type) {
+ case JOB_GRAPH_FETCH_REQUEST:
+ return {
+ isFetching: true,
+ jobGraphs: state.jobGraphs,
+ }
+ case JOB_GRAPH_FETCH_SUCCESS:
+ stateJobGraphs = !state.jobGraphs[action.tenant] ?
+ { ...state.jobGraphs, [action.tenant]: {} } :
+ { ...state.jobGraphs }
+ return {
+ isFetching: false,
+ jobGraphs: {
+ ...stateJobGraphs,
+ [action.tenant]: {
+ ...stateJobGraphs[action.tenant],
+ [action.jobGraphKey]: action.jobGraph
+ }
+ }
+ }
+ case JOB_GRAPH_FETCH_FAIL:
+ return {
+ isFetching: false,
+ jobGraphs: state.jobGraphs,
+ }
+ default:
+ return state
+ }
+}
diff --git a/web/src/reducers/pipelines.js b/web/src/reducers/pipelines.js
new file mode 100644
index 000000000..550352572
--- /dev/null
+++ b/web/src/reducers/pipelines.js
@@ -0,0 +1,45 @@
+// Copyright 2018 Red Hat, Inc
+// Copyright 2022 Acme Gating, LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License. You may obtain
+// a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+
+import {
+ PIPELINES_FETCH_FAIL,
+ PIPELINES_FETCH_REQUEST,
+ PIPELINES_FETCH_SUCCESS
+} from '../actions/pipelines'
+
+export default (state = {
+ isFetching: false,
+ pipelines: {},
+}, action) => {
+ switch (action.type) {
+ case PIPELINES_FETCH_REQUEST:
+ return {
+ isFetching: true,
+ pipelines: state.pipelines,
+ }
+ case PIPELINES_FETCH_SUCCESS:
+ return {
+ isFetching: false,
+ pipelines: { ...state.pipelines, [action.tenant]: action.pipelines },
+ }
+ case PIPELINES_FETCH_FAIL:
+ return {
+ isFetching: false,
+ pipelines: state.pipelines,
+ }
+ default:
+ return state
+ }
+}
diff --git a/web/src/routes.js b/web/src/routes.js
index c2c3a8584..e1bfdae16 100644
--- a/web/src/routes.js
+++ b/web/src/routes.js
@@ -13,6 +13,7 @@
// under the License.
import ComponentsPage from './pages/Components'
+import FreezeJobPage from './pages/FreezeJob'
import StatusPage from './pages/Status'
import ChangeStatusPage from './pages/ChangeStatus'
import ProjectPage from './pages/Project'
@@ -79,6 +80,10 @@ const routes = () => [
component: BuildsetsPage
},
{
+ to: '/freeze-job',
+ component: FreezeJobPage
+ },
+ {
to: '/status/change/:changeId',
component: ChangeStatusPage
},
diff --git a/web/yarn.lock b/web/yarn.lock
index 725a88d3d..fa84a384a 100644
--- a/web/yarn.lock
+++ b/web/yarn.lock
@@ -2,26 +2,58 @@
# yarn lockfile v1
-"@babel/code-frame@7.8.3", "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e"
- integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==
+"@ampproject/remapping@^2.1.0":
+ "integrity" "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w=="
+ "resolved" "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz"
+ "version" "2.2.0"
dependencies:
- "@babel/highlight" "^7.8.3"
+ "@jridgewell/gen-mapping" "^0.1.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
-"@babel/compat-data@^7.9.0", "@babel/compat-data@^7.9.6":
- version "7.9.6"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.6.tgz#3f604c40e420131affe6f2c8052e9a275ae2049b"
- integrity sha512-5QPTrNen2bm7RBc7dsOmcA5hbrS4O2Vhmk5XOL4zWW/zD/hV0iinpefDlkm+tBBy8kDtFaaeEvmAqt+nURAV2g==
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3", "@babel/code-frame@7.8.3":
+ "integrity" "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g=="
+ "resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
- browserslist "^4.11.1"
- invariant "^2.2.4"
- semver "^5.5.0"
+ "@babel/highlight" "^7.8.3"
+
+"@babel/code-frame@^7.18.6":
+ "integrity" "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q=="
+ "resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz"
+ "version" "7.18.6"
+ dependencies:
+ "@babel/highlight" "^7.18.6"
+
+"@babel/compat-data@^7.18.8", "@babel/compat-data@^7.9.0", "@babel/compat-data@^7.9.6":
+ "integrity" "sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw=="
+ "resolved" "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.13.tgz"
+ "version" "7.18.13"
+
+"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.1.0", "@babel/core@^7.4.5":
+ "integrity" "sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A=="
+ "resolved" "https://registry.npmjs.org/@babel/core/-/core-7.18.13.tgz"
+ "version" "7.18.13"
+ dependencies:
+ "@ampproject/remapping" "^2.1.0"
+ "@babel/code-frame" "^7.18.6"
+ "@babel/generator" "^7.18.13"
+ "@babel/helper-compilation-targets" "^7.18.9"
+ "@babel/helper-module-transforms" "^7.18.9"
+ "@babel/helpers" "^7.18.9"
+ "@babel/parser" "^7.18.13"
+ "@babel/template" "^7.18.10"
+ "@babel/traverse" "^7.18.13"
+ "@babel/types" "^7.18.13"
+ "convert-source-map" "^1.7.0"
+ "debug" "^4.1.0"
+ "gensync" "^1.0.0-beta.2"
+ "json5" "^2.2.1"
+ "semver" "^6.3.0"
"@babel/core@7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e"
- integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==
+ "integrity" "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w=="
+ "resolved" "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz"
+ "version" "7.9.0"
dependencies:
"@babel/code-frame" "^7.8.3"
"@babel/generator" "^7.9.0"
@@ -31,94 +63,70 @@
"@babel/template" "^7.8.6"
"@babel/traverse" "^7.9.0"
"@babel/types" "^7.9.0"
- convert-source-map "^1.7.0"
- debug "^4.1.0"
- gensync "^1.0.0-beta.1"
- json5 "^2.1.2"
- lodash "^4.17.13"
- resolve "^1.3.2"
- semver "^5.4.1"
- source-map "^0.5.0"
-
-"@babel/core@^7.1.0", "@babel/core@^7.4.5":
- version "7.9.6"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.6.tgz#d9aa1f580abf3b2286ef40b6904d390904c63376"
- integrity sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg==
- dependencies:
- "@babel/code-frame" "^7.8.3"
- "@babel/generator" "^7.9.6"
- "@babel/helper-module-transforms" "^7.9.0"
- "@babel/helpers" "^7.9.6"
- "@babel/parser" "^7.9.6"
- "@babel/template" "^7.8.6"
- "@babel/traverse" "^7.9.6"
- "@babel/types" "^7.9.6"
- convert-source-map "^1.7.0"
- debug "^4.1.0"
- gensync "^1.0.0-beta.1"
- json5 "^2.1.2"
- lodash "^4.17.13"
- resolve "^1.3.2"
- semver "^5.4.1"
- source-map "^0.5.0"
-
-"@babel/generator@^7.4.0", "@babel/generator@^7.9.0", "@babel/generator@^7.9.6":
- version "7.9.6"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.6.tgz#5408c82ac5de98cda0d77d8124e99fa1f2170a43"
- integrity sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==
- dependencies:
- "@babel/types" "^7.9.6"
- jsesc "^2.5.1"
- lodash "^4.17.13"
- source-map "^0.5.0"
+ "convert-source-map" "^1.7.0"
+ "debug" "^4.1.0"
+ "gensync" "^1.0.0-beta.1"
+ "json5" "^2.1.2"
+ "lodash" "^4.17.13"
+ "resolve" "^1.3.2"
+ "semver" "^5.4.1"
+ "source-map" "^0.5.0"
+
+"@babel/generator@^7.18.13", "@babel/generator@^7.4.0", "@babel/generator@^7.9.0":
+ "integrity" "sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ=="
+ "resolved" "https://registry.npmjs.org/@babel/generator/-/generator-7.18.13.tgz"
+ "version" "7.18.13"
+ dependencies:
+ "@babel/types" "^7.18.13"
+ "@jridgewell/gen-mapping" "^0.3.2"
+ "jsesc" "^2.5.1"
"@babel/helper-annotate-as-pure@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee"
- integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==
+ "integrity" "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/types" "^7.8.3"
"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503"
- integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==
+ "integrity" "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-explode-assignable-expression" "^7.8.3"
"@babel/types" "^7.8.3"
"@babel/helper-builder-react-jsx-experimental@^7.9.0":
- version "7.9.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.5.tgz#0b4b3e04e6123f03b404ca4dfd6528fe6bb92fe3"
- integrity sha512-HAagjAC93tk748jcXpZ7oYRZH485RCq/+yEv9SIWezHRPv9moZArTnkUNciUNzvwHUABmiWKlcxJvMcu59UwTg==
+ "integrity" "sha512-HAagjAC93tk748jcXpZ7oYRZH485RCq/+yEv9SIWezHRPv9moZArTnkUNciUNzvwHUABmiWKlcxJvMcu59UwTg=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.5.tgz"
+ "version" "7.9.5"
dependencies:
"@babel/helper-annotate-as-pure" "^7.8.3"
"@babel/helper-module-imports" "^7.8.3"
"@babel/types" "^7.9.5"
"@babel/helper-builder-react-jsx@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz#16bf391990b57732700a3278d4d9a81231ea8d32"
- integrity sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw==
+ "integrity" "sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz"
+ "version" "7.9.0"
dependencies:
"@babel/helper-annotate-as-pure" "^7.8.3"
"@babel/types" "^7.9.0"
-"@babel/helper-compilation-targets@^7.8.7", "@babel/helper-compilation-targets@^7.9.6":
- version "7.9.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.9.6.tgz#1e05b7ccc9d38d2f8b40b458b380a04dcfadd38a"
- integrity sha512-x2Nvu0igO0ejXzx09B/1fGBxY9NXQlBW2kZsSxCJft+KHN8t9XWzIvFxtPHnBOAXpVsdxZKZFbRUC8TsNKajMw==
+"@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.8.7", "@babel/helper-compilation-targets@^7.9.6":
+ "integrity" "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz"
+ "version" "7.18.9"
dependencies:
- "@babel/compat-data" "^7.9.6"
- browserslist "^4.11.1"
- invariant "^2.2.4"
- levenary "^1.1.1"
- semver "^5.5.0"
+ "@babel/compat-data" "^7.18.8"
+ "@babel/helper-validator-option" "^7.18.6"
+ "browserslist" "^4.20.2"
+ "semver" "^6.3.0"
"@babel/helper-create-class-features-plugin@^7.8.3", "@babel/helper-create-class-features-plugin@^7.9.6":
- version "7.9.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.6.tgz#965c8b0a9f051801fd9d3b372ca0ccf200a90897"
- integrity sha512-6N9IeuyHvMBRyjNYOMJHrhwtu4WJMrYf8hVbEHD3pbbbmNOk1kmXSQs7bA4dYDUaIx4ZEzdnvo6NwC3WHd/Qow==
+ "integrity" "sha512-6N9IeuyHvMBRyjNYOMJHrhwtu4WJMrYf8hVbEHD3pbbbmNOk1kmXSQs7bA4dYDUaIx4ZEzdnvo6NwC3WHd/Qow=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.6.tgz"
+ "version" "7.9.6"
dependencies:
"@babel/helper-function-name" "^7.9.5"
"@babel/helper-member-expression-to-functions" "^7.8.3"
@@ -128,104 +136,109 @@
"@babel/helper-split-export-declaration" "^7.8.3"
"@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8":
- version "7.8.8"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087"
- integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==
+ "integrity" "sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz"
+ "version" "7.8.8"
dependencies:
"@babel/helper-annotate-as-pure" "^7.8.3"
"@babel/helper-regex" "^7.8.3"
- regexpu-core "^4.7.0"
+ "regexpu-core" "^4.7.0"
"@babel/helper-define-map@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15"
- integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==
+ "integrity" "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-function-name" "^7.8.3"
"@babel/types" "^7.8.3"
- lodash "^4.17.13"
+ "lodash" "^4.17.13"
+
+"@babel/helper-environment-visitor@^7.18.9":
+ "integrity" "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz"
+ "version" "7.18.9"
"@babel/helper-explode-assignable-expression@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982"
- integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==
+ "integrity" "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/traverse" "^7.8.3"
"@babel/types" "^7.8.3"
-"@babel/helper-function-name@^7.8.3", "@babel/helper-function-name@^7.9.5":
- version "7.9.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c"
- integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==
+"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.8.3", "@babel/helper-function-name@^7.9.5":
+ "integrity" "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz"
+ "version" "7.18.9"
dependencies:
- "@babel/helper-get-function-arity" "^7.8.3"
- "@babel/template" "^7.8.3"
- "@babel/types" "^7.9.5"
+ "@babel/template" "^7.18.6"
+ "@babel/types" "^7.18.9"
"@babel/helper-get-function-arity@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5"
- integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==
+ "integrity" "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/types" "^7.8.3"
-"@babel/helper-hoist-variables@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134"
- integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==
+"@babel/helper-hoist-variables@^7.18.6", "@babel/helper-hoist-variables@^7.8.3":
+ "integrity" "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz"
+ "version" "7.18.6"
dependencies:
- "@babel/types" "^7.8.3"
+ "@babel/types" "^7.18.6"
"@babel/helper-member-expression-to-functions@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c"
- integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==
+ "integrity" "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/types" "^7.8.3"
-"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498"
- integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==
+"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.8.3":
+ "integrity" "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz"
+ "version" "7.18.6"
dependencies:
- "@babel/types" "^7.8.3"
+ "@babel/types" "^7.18.6"
-"@babel/helper-module-transforms@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5"
- integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==
+"@babel/helper-module-transforms@^7.18.9", "@babel/helper-module-transforms@^7.9.0":
+ "integrity" "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz"
+ "version" "7.18.9"
dependencies:
- "@babel/helper-module-imports" "^7.8.3"
- "@babel/helper-replace-supers" "^7.8.6"
- "@babel/helper-simple-access" "^7.8.3"
- "@babel/helper-split-export-declaration" "^7.8.3"
- "@babel/template" "^7.8.6"
- "@babel/types" "^7.9.0"
- lodash "^4.17.13"
+ "@babel/helper-environment-visitor" "^7.18.9"
+ "@babel/helper-module-imports" "^7.18.6"
+ "@babel/helper-simple-access" "^7.18.6"
+ "@babel/helper-split-export-declaration" "^7.18.6"
+ "@babel/helper-validator-identifier" "^7.18.6"
+ "@babel/template" "^7.18.6"
+ "@babel/traverse" "^7.18.9"
+ "@babel/types" "^7.18.9"
"@babel/helper-optimise-call-expression@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9"
- integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==
+ "integrity" "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/types" "^7.8.3"
"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670"
- integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==
+ "integrity" "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz"
+ "version" "7.8.3"
"@babel/helper-regex@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965"
- integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==
+ "integrity" "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
- lodash "^4.17.13"
+ "lodash" "^4.17.13"
"@babel/helper-remap-async-to-generator@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86"
- integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==
+ "integrity" "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-annotate-as-pure" "^7.8.3"
"@babel/helper-wrap-function" "^7.8.3"
@@ -234,285 +247,294 @@
"@babel/types" "^7.8.3"
"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6", "@babel/helper-replace-supers@^7.9.6":
- version "7.9.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz#03149d7e6a5586ab6764996cd31d6981a17e1444"
- integrity sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA==
+ "integrity" "sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz"
+ "version" "7.9.6"
dependencies:
"@babel/helper-member-expression-to-functions" "^7.8.3"
"@babel/helper-optimise-call-expression" "^7.8.3"
"@babel/traverse" "^7.9.6"
"@babel/types" "^7.9.6"
-"@babel/helper-simple-access@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae"
- integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==
+"@babel/helper-simple-access@^7.18.6", "@babel/helper-simple-access@^7.8.3":
+ "integrity" "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz"
+ "version" "7.18.6"
dependencies:
- "@babel/template" "^7.8.3"
- "@babel/types" "^7.8.3"
+ "@babel/types" "^7.18.6"
-"@babel/helper-split-export-declaration@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9"
- integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==
+"@babel/helper-split-export-declaration@^7.18.6", "@babel/helper-split-export-declaration@^7.8.3":
+ "integrity" "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz"
+ "version" "7.18.6"
dependencies:
- "@babel/types" "^7.8.3"
+ "@babel/types" "^7.18.6"
-"@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5":
- version "7.9.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80"
- integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==
+"@babel/helper-string-parser@^7.18.10":
+ "integrity" "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz"
+ "version" "7.18.10"
+
+"@babel/helper-validator-identifier@^7.18.6":
+ "integrity" "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz"
+ "version" "7.18.6"
+
+"@babel/helper-validator-option@^7.18.6":
+ "integrity" "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz"
+ "version" "7.18.6"
"@babel/helper-wrap-function@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610"
- integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==
+ "integrity" "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-function-name" "^7.8.3"
"@babel/template" "^7.8.3"
"@babel/traverse" "^7.8.3"
"@babel/types" "^7.8.3"
-"@babel/helpers@^7.9.0", "@babel/helpers@^7.9.6":
- version "7.9.6"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.6.tgz#092c774743471d0bb6c7de3ad465ab3d3486d580"
- integrity sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw==
+"@babel/helpers@^7.18.9", "@babel/helpers@^7.9.0":
+ "integrity" "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ=="
+ "resolved" "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz"
+ "version" "7.18.9"
dependencies:
- "@babel/template" "^7.8.3"
- "@babel/traverse" "^7.9.6"
- "@babel/types" "^7.9.6"
+ "@babel/template" "^7.18.6"
+ "@babel/traverse" "^7.18.9"
+ "@babel/types" "^7.18.9"
-"@babel/highlight@^7.8.3":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079"
- integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==
+"@babel/highlight@^7.18.6", "@babel/highlight@^7.8.3":
+ "integrity" "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g=="
+ "resolved" "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz"
+ "version" "7.18.6"
dependencies:
- "@babel/helper-validator-identifier" "^7.9.0"
- chalk "^2.0.0"
- js-tokens "^4.0.0"
+ "@babel/helper-validator-identifier" "^7.18.6"
+ "chalk" "^2.0.0"
+ "js-tokens" "^4.0.0"
-"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0", "@babel/parser@^7.9.6":
- version "7.9.6"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.6.tgz#3b1bbb30dabe600cd72db58720998376ff653bc7"
- integrity sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==
+"@babel/parser@^7.1.0", "@babel/parser@^7.18.10", "@babel/parser@^7.18.13", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.9.0":
+ "integrity" "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg=="
+ "resolved" "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz"
+ "version" "7.18.13"
"@babel/plugin-proposal-async-generator-functions@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f"
- integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==
+ "integrity" "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/helper-remap-async-to-generator" "^7.8.3"
"@babel/plugin-syntax-async-generators" "^7.8.0"
"@babel/plugin-proposal-class-properties@7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e"
- integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==
+ "integrity" "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-create-class-features-plugin" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-proposal-decorators@7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz#2156860ab65c5abf068c3f67042184041066543e"
- integrity sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w==
+ "integrity" "sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-create-class-features-plugin" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-decorators" "^7.8.3"
"@babel/plugin-proposal-dynamic-import@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054"
- integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==
+ "integrity" "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-dynamic-import" "^7.8.0"
"@babel/plugin-proposal-json-strings@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b"
- integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==
+ "integrity" "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-json-strings" "^7.8.0"
-"@babel/plugin-proposal-nullish-coalescing-operator@7.8.3", "@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2"
- integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3", "@babel/plugin-proposal-nullish-coalescing-operator@7.8.3":
+ "integrity" "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
-"@babel/plugin-proposal-numeric-separator@7.8.3", "@babel/plugin-proposal-numeric-separator@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8"
- integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==
+"@babel/plugin-proposal-numeric-separator@^7.8.3", "@babel/plugin-proposal-numeric-separator@7.8.3":
+ "integrity" "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-numeric-separator" "^7.8.3"
"@babel/plugin-proposal-object-rest-spread@^7.9.0", "@babel/plugin-proposal-object-rest-spread@^7.9.6":
- version "7.9.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.6.tgz#7a093586fcb18b08266eb1a7177da671ac575b63"
- integrity sha512-Ga6/fhGqA9Hj+y6whNpPv8psyaK5xzrQwSPsGPloVkvmH+PqW1ixdnfJ9uIO06OjQNYol3PMnfmJ8vfZtkzF+A==
+ "integrity" "sha512-Ga6/fhGqA9Hj+y6whNpPv8psyaK5xzrQwSPsGPloVkvmH+PqW1ixdnfJ9uIO06OjQNYol3PMnfmJ8vfZtkzF+A=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.6.tgz"
+ "version" "7.9.6"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-object-rest-spread" "^7.8.0"
"@babel/plugin-transform-parameters" "^7.9.5"
"@babel/plugin-proposal-optional-catch-binding@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9"
- integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==
+ "integrity" "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
-"@babel/plugin-proposal-optional-chaining@7.9.0", "@babel/plugin-proposal-optional-chaining@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58"
- integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==
+"@babel/plugin-proposal-optional-chaining@^7.9.0", "@babel/plugin-proposal-optional-chaining@7.9.0":
+ "integrity" "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz"
+ "version" "7.9.0"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-optional-chaining" "^7.8.0"
"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3":
- version "7.8.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d"
- integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==
+ "integrity" "sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz"
+ "version" "7.8.8"
dependencies:
"@babel/helper-create-regexp-features-plugin" "^7.8.8"
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-async-generators@^7.8.0":
- version "7.8.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
- integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
+ "integrity" "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz"
+ "version" "7.8.4"
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
"@babel/plugin-syntax-decorators@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz#8d2c15a9f1af624b0025f961682a9d53d3001bda"
- integrity sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ==
+ "integrity" "sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-dynamic-import@^7.8.0":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
- integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
+ "integrity" "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
"@babel/plugin-syntax-flow@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz#f2c883bd61a6316f2c89380ae5122f923ba4527f"
- integrity sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg==
+ "integrity" "sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-json-strings@^7.8.0":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
- integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
+ "integrity" "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
"@babel/plugin-syntax-jsx@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94"
- integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==
+ "integrity" "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
- integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
+ "integrity" "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f"
- integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==
+ "integrity" "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
- integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
+ "integrity" "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
"@babel/plugin-syntax-optional-catch-binding@^7.8.0":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
- integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
+ "integrity" "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
"@babel/plugin-syntax-optional-chaining@^7.8.0":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
- integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
+ "integrity" "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
"@babel/plugin-syntax-top-level-await@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391"
- integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==
+ "integrity" "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-typescript@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz#c1f659dda97711a569cef75275f7e15dcaa6cabc"
- integrity sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg==
+ "integrity" "sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-arrow-functions@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6"
- integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==
+ "integrity" "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-async-to-generator@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086"
- integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==
+ "integrity" "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-module-imports" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/helper-remap-async-to-generator" "^7.8.3"
"@babel/plugin-transform-block-scoped-functions@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3"
- integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==
+ "integrity" "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-block-scoping@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a"
- integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==
+ "integrity" "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
- lodash "^4.17.13"
+ "lodash" "^4.17.13"
"@babel/plugin-transform-classes@^7.9.0", "@babel/plugin-transform-classes@^7.9.5":
- version "7.9.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz#800597ddb8aefc2c293ed27459c1fcc935a26c2c"
- integrity sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg==
+ "integrity" "sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz"
+ "version" "7.9.5"
dependencies:
"@babel/helper-annotate-as-pure" "^7.8.3"
"@babel/helper-define-map" "^7.8.3"
@@ -521,199 +543,199 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/helper-replace-supers" "^7.8.6"
"@babel/helper-split-export-declaration" "^7.8.3"
- globals "^11.1.0"
+ "globals" "^11.1.0"
"@babel/plugin-transform-computed-properties@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b"
- integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==
+ "integrity" "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-destructuring@^7.8.3", "@babel/plugin-transform-destructuring@^7.9.5":
- version "7.9.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz#72c97cf5f38604aea3abf3b935b0e17b1db76a50"
- integrity sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q==
+ "integrity" "sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz"
+ "version" "7.9.5"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e"
- integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==
+ "integrity" "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-create-regexp-features-plugin" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-duplicate-keys@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1"
- integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==
+ "integrity" "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-exponentiation-operator@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7"
- integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==
+ "integrity" "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-flow-strip-types@7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz#8a3538aa40434e000b8f44a3c5c9ac7229bd2392"
- integrity sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg==
+ "integrity" "sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz"
+ "version" "7.9.0"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-flow" "^7.8.3"
"@babel/plugin-transform-for-of@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e"
- integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==
+ "integrity" "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz"
+ "version" "7.9.0"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-function-name@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b"
- integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==
+ "integrity" "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-function-name" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-literals@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1"
- integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==
+ "integrity" "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-member-expression-literals@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410"
- integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==
+ "integrity" "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-modules-amd@^7.9.0", "@babel/plugin-transform-modules-amd@^7.9.6":
- version "7.9.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.6.tgz#8539ec42c153d12ea3836e0e3ac30d5aae7b258e"
- integrity sha512-zoT0kgC3EixAyIAU+9vfaUVKTv9IxBDSabgHoUCBP6FqEJ+iNiN7ip7NBKcYqbfUDfuC2mFCbM7vbu4qJgOnDw==
+ "integrity" "sha512-zoT0kgC3EixAyIAU+9vfaUVKTv9IxBDSabgHoUCBP6FqEJ+iNiN7ip7NBKcYqbfUDfuC2mFCbM7vbu4qJgOnDw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.6.tgz"
+ "version" "7.9.6"
dependencies:
"@babel/helper-module-transforms" "^7.9.0"
"@babel/helper-plugin-utils" "^7.8.3"
- babel-plugin-dynamic-import-node "^2.3.3"
+ "babel-plugin-dynamic-import-node" "^2.3.3"
"@babel/plugin-transform-modules-commonjs@^7.9.0", "@babel/plugin-transform-modules-commonjs@^7.9.6":
- version "7.9.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.6.tgz#64b7474a4279ee588cacd1906695ca721687c277"
- integrity sha512-7H25fSlLcn+iYimmsNe3uK1at79IE6SKW9q0/QeEHTMC9MdOZ+4bA+T1VFB5fgOqBWoqlifXRzYD0JPdmIrgSQ==
+ "integrity" "sha512-7H25fSlLcn+iYimmsNe3uK1at79IE6SKW9q0/QeEHTMC9MdOZ+4bA+T1VFB5fgOqBWoqlifXRzYD0JPdmIrgSQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.6.tgz"
+ "version" "7.9.6"
dependencies:
"@babel/helper-module-transforms" "^7.9.0"
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/helper-simple-access" "^7.8.3"
- babel-plugin-dynamic-import-node "^2.3.3"
+ "babel-plugin-dynamic-import-node" "^2.3.3"
"@babel/plugin-transform-modules-systemjs@^7.9.0", "@babel/plugin-transform-modules-systemjs@^7.9.6":
- version "7.9.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.6.tgz#207f1461c78a231d5337a92140e52422510d81a4"
- integrity sha512-NW5XQuW3N2tTHim8e1b7qGy7s0kZ2OH3m5octc49K1SdAKGxYxeIx7hiIz05kS1R2R+hOWcsr1eYwcGhrdHsrg==
+ "integrity" "sha512-NW5XQuW3N2tTHim8e1b7qGy7s0kZ2OH3m5octc49K1SdAKGxYxeIx7hiIz05kS1R2R+hOWcsr1eYwcGhrdHsrg=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.6.tgz"
+ "version" "7.9.6"
dependencies:
"@babel/helper-hoist-variables" "^7.8.3"
"@babel/helper-module-transforms" "^7.9.0"
"@babel/helper-plugin-utils" "^7.8.3"
- babel-plugin-dynamic-import-node "^2.3.3"
+ "babel-plugin-dynamic-import-node" "^2.3.3"
"@babel/plugin-transform-modules-umd@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697"
- integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==
+ "integrity" "sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz"
+ "version" "7.9.0"
dependencies:
"@babel/helper-module-transforms" "^7.9.0"
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c"
- integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==
+ "integrity" "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-create-regexp-features-plugin" "^7.8.3"
"@babel/plugin-transform-new-target@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43"
- integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==
+ "integrity" "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-object-super@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725"
- integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==
+ "integrity" "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/helper-replace-supers" "^7.8.3"
"@babel/plugin-transform-parameters@^7.8.7", "@babel/plugin-transform-parameters@^7.9.5":
- version "7.9.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz#173b265746f5e15b2afe527eeda65b73623a0795"
- integrity sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA==
+ "integrity" "sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz"
+ "version" "7.9.5"
dependencies:
"@babel/helper-get-function-arity" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-property-literals@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263"
- integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==
+ "integrity" "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-react-constant-elements@^7.0.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.9.0.tgz#a75abc936a3819edec42d3386d9f1c93f28d9d9e"
- integrity sha512-wXMXsToAUOxJuBBEHajqKLFWcCkOSLshTI2ChCFFj1zDd7od4IOxiwLCOObNUvOpkxLpjIuaIdBMmNt6ocCPAw==
+ "integrity" "sha512-wXMXsToAUOxJuBBEHajqKLFWcCkOSLshTI2ChCFFj1zDd7od4IOxiwLCOObNUvOpkxLpjIuaIdBMmNt6ocCPAw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.9.0.tgz"
+ "version" "7.9.0"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-react-display-name@7.8.3", "@babel/plugin-transform-react-display-name@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5"
- integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==
+"@babel/plugin-transform-react-display-name@^7.8.3", "@babel/plugin-transform-react-display-name@7.8.3":
+ "integrity" "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-react-jsx-development@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.9.0.tgz#3c2a130727caf00c2a293f0aed24520825dbf754"
- integrity sha512-tK8hWKrQncVvrhvtOiPpKrQjfNX3DtkNLSX4ObuGcpS9p0QrGetKmlySIGR07y48Zft8WVgPakqd/bk46JrMSw==
+ "integrity" "sha512-tK8hWKrQncVvrhvtOiPpKrQjfNX3DtkNLSX4ObuGcpS9p0QrGetKmlySIGR07y48Zft8WVgPakqd/bk46JrMSw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.9.0.tgz"
+ "version" "7.9.0"
dependencies:
"@babel/helper-builder-react-jsx-experimental" "^7.9.0"
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-jsx" "^7.8.3"
"@babel/plugin-transform-react-jsx-self@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz#f4f26a325820205239bb915bad8e06fcadabb49b"
- integrity sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ==
+ "integrity" "sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz"
+ "version" "7.9.0"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-jsx" "^7.8.3"
"@babel/plugin-transform-react-jsx-source@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz#89ef93025240dd5d17d3122294a093e5e0183de0"
- integrity sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw==
+ "integrity" "sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz"
+ "version" "7.9.0"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-jsx" "^7.8.3"
"@babel/plugin-transform-react-jsx@^7.9.1", "@babel/plugin-transform-react-jsx@^7.9.4":
- version "7.9.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz#86f576c8540bd06d0e95e0b61ea76d55f6cbd03f"
- integrity sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw==
+ "integrity" "sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz"
+ "version" "7.9.4"
dependencies:
"@babel/helper-builder-react-jsx" "^7.9.0"
"@babel/helper-builder-react-jsx-experimental" "^7.9.0"
@@ -721,90 +743,90 @@
"@babel/plugin-syntax-jsx" "^7.8.3"
"@babel/plugin-transform-regenerator@^7.8.7":
- version "7.8.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8"
- integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==
+ "integrity" "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz"
+ "version" "7.8.7"
dependencies:
- regenerator-transform "^0.14.2"
+ "regenerator-transform" "^0.14.2"
"@babel/plugin-transform-reserved-words@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5"
- integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==
+ "integrity" "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-runtime@7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz#45468c0ae74cc13204e1d3b1f4ce6ee83258af0b"
- integrity sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw==
+ "integrity" "sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz"
+ "version" "7.9.0"
dependencies:
"@babel/helper-module-imports" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
- resolve "^1.8.1"
- semver "^5.5.1"
+ "resolve" "^1.8.1"
+ "semver" "^5.5.1"
"@babel/plugin-transform-shorthand-properties@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8"
- integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==
+ "integrity" "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-spread@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8"
- integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==
+ "integrity" "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-sticky-regex@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100"
- integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==
+ "integrity" "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/helper-regex" "^7.8.3"
"@babel/plugin-transform-template-literals@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80"
- integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==
+ "integrity" "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-annotate-as-pure" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-typeof-symbol@^7.8.4":
- version "7.8.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412"
- integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==
+ "integrity" "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz"
+ "version" "7.8.4"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-typescript@^7.9.0":
- version "7.9.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.6.tgz#2248971416a506fc78278fc0c0ea3179224af1e9"
- integrity sha512-8OvsRdvpt3Iesf2qsAn+YdlwAJD7zJ+vhFZmDCa4b8dTp7MmHtKk5FF2mCsGxjZwuwsy/yIIay/nLmxST1ctVQ==
+ "integrity" "sha512-8OvsRdvpt3Iesf2qsAn+YdlwAJD7zJ+vhFZmDCa4b8dTp7MmHtKk5FF2mCsGxjZwuwsy/yIIay/nLmxST1ctVQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.6.tgz"
+ "version" "7.9.6"
dependencies:
"@babel/helper-create-class-features-plugin" "^7.9.6"
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-typescript" "^7.8.3"
"@babel/plugin-transform-unicode-regex@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad"
- integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==
+ "integrity" "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz"
+ "version" "7.8.3"
dependencies:
"@babel/helper-create-regexp-features-plugin" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/preset-env@7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8"
- integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==
+"@babel/preset-env@^7.4.5":
+ "integrity" "sha512-0gQJ9RTzO0heXOhzftog+a/WyOuqMrAIugVYxMYf83gh1CQaQDjMtsOpqOwXyDL/5JcWsrCm8l4ju8QC97O7EQ=="
+ "resolved" "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.6.tgz"
+ "version" "7.9.6"
dependencies:
- "@babel/compat-data" "^7.9.0"
- "@babel/helper-compilation-targets" "^7.8.7"
+ "@babel/compat-data" "^7.9.6"
+ "@babel/helper-compilation-targets" "^7.9.6"
"@babel/helper-module-imports" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-proposal-async-generator-functions" "^7.8.3"
@@ -812,7 +834,7 @@
"@babel/plugin-proposal-json-strings" "^7.8.3"
"@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3"
"@babel/plugin-proposal-numeric-separator" "^7.8.3"
- "@babel/plugin-proposal-object-rest-spread" "^7.9.0"
+ "@babel/plugin-proposal-object-rest-spread" "^7.9.6"
"@babel/plugin-proposal-optional-catch-binding" "^7.8.3"
"@babel/plugin-proposal-optional-chaining" "^7.9.0"
"@babel/plugin-proposal-unicode-property-regex" "^7.8.3"
@@ -829,9 +851,9 @@
"@babel/plugin-transform-async-to-generator" "^7.8.3"
"@babel/plugin-transform-block-scoped-functions" "^7.8.3"
"@babel/plugin-transform-block-scoping" "^7.8.3"
- "@babel/plugin-transform-classes" "^7.9.0"
+ "@babel/plugin-transform-classes" "^7.9.5"
"@babel/plugin-transform-computed-properties" "^7.8.3"
- "@babel/plugin-transform-destructuring" "^7.8.3"
+ "@babel/plugin-transform-destructuring" "^7.9.5"
"@babel/plugin-transform-dotall-regex" "^7.8.3"
"@babel/plugin-transform-duplicate-keys" "^7.8.3"
"@babel/plugin-transform-exponentiation-operator" "^7.8.3"
@@ -839,14 +861,14 @@
"@babel/plugin-transform-function-name" "^7.8.3"
"@babel/plugin-transform-literals" "^7.8.3"
"@babel/plugin-transform-member-expression-literals" "^7.8.3"
- "@babel/plugin-transform-modules-amd" "^7.9.0"
- "@babel/plugin-transform-modules-commonjs" "^7.9.0"
- "@babel/plugin-transform-modules-systemjs" "^7.9.0"
+ "@babel/plugin-transform-modules-amd" "^7.9.6"
+ "@babel/plugin-transform-modules-commonjs" "^7.9.6"
+ "@babel/plugin-transform-modules-systemjs" "^7.9.6"
"@babel/plugin-transform-modules-umd" "^7.9.0"
"@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3"
"@babel/plugin-transform-new-target" "^7.8.3"
"@babel/plugin-transform-object-super" "^7.8.3"
- "@babel/plugin-transform-parameters" "^7.8.7"
+ "@babel/plugin-transform-parameters" "^7.9.5"
"@babel/plugin-transform-property-literals" "^7.8.3"
"@babel/plugin-transform-regenerator" "^7.8.7"
"@babel/plugin-transform-reserved-words" "^7.8.3"
@@ -857,20 +879,20 @@
"@babel/plugin-transform-typeof-symbol" "^7.8.4"
"@babel/plugin-transform-unicode-regex" "^7.8.3"
"@babel/preset-modules" "^0.1.3"
- "@babel/types" "^7.9.0"
- browserslist "^4.9.1"
- core-js-compat "^3.6.2"
- invariant "^2.2.2"
- levenary "^1.1.1"
- semver "^5.5.0"
+ "@babel/types" "^7.9.6"
+ "browserslist" "^4.11.1"
+ "core-js-compat" "^3.6.2"
+ "invariant" "^2.2.2"
+ "levenary" "^1.1.1"
+ "semver" "^5.5.0"
-"@babel/preset-env@^7.4.5":
- version "7.9.6"
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.6.tgz#df063b276c6455ec6fcfc6e53aacc38da9b0aea6"
- integrity sha512-0gQJ9RTzO0heXOhzftog+a/WyOuqMrAIugVYxMYf83gh1CQaQDjMtsOpqOwXyDL/5JcWsrCm8l4ju8QC97O7EQ==
+"@babel/preset-env@7.9.0":
+ "integrity" "sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ=="
+ "resolved" "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.0.tgz"
+ "version" "7.9.0"
dependencies:
- "@babel/compat-data" "^7.9.6"
- "@babel/helper-compilation-targets" "^7.9.6"
+ "@babel/compat-data" "^7.9.0"
+ "@babel/helper-compilation-targets" "^7.8.7"
"@babel/helper-module-imports" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-proposal-async-generator-functions" "^7.8.3"
@@ -878,7 +900,7 @@
"@babel/plugin-proposal-json-strings" "^7.8.3"
"@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3"
"@babel/plugin-proposal-numeric-separator" "^7.8.3"
- "@babel/plugin-proposal-object-rest-spread" "^7.9.6"
+ "@babel/plugin-proposal-object-rest-spread" "^7.9.0"
"@babel/plugin-proposal-optional-catch-binding" "^7.8.3"
"@babel/plugin-proposal-optional-chaining" "^7.9.0"
"@babel/plugin-proposal-unicode-property-regex" "^7.8.3"
@@ -895,9 +917,9 @@
"@babel/plugin-transform-async-to-generator" "^7.8.3"
"@babel/plugin-transform-block-scoped-functions" "^7.8.3"
"@babel/plugin-transform-block-scoping" "^7.8.3"
- "@babel/plugin-transform-classes" "^7.9.5"
+ "@babel/plugin-transform-classes" "^7.9.0"
"@babel/plugin-transform-computed-properties" "^7.8.3"
- "@babel/plugin-transform-destructuring" "^7.9.5"
+ "@babel/plugin-transform-destructuring" "^7.8.3"
"@babel/plugin-transform-dotall-regex" "^7.8.3"
"@babel/plugin-transform-duplicate-keys" "^7.8.3"
"@babel/plugin-transform-exponentiation-operator" "^7.8.3"
@@ -905,14 +927,14 @@
"@babel/plugin-transform-function-name" "^7.8.3"
"@babel/plugin-transform-literals" "^7.8.3"
"@babel/plugin-transform-member-expression-literals" "^7.8.3"
- "@babel/plugin-transform-modules-amd" "^7.9.6"
- "@babel/plugin-transform-modules-commonjs" "^7.9.6"
- "@babel/plugin-transform-modules-systemjs" "^7.9.6"
+ "@babel/plugin-transform-modules-amd" "^7.9.0"
+ "@babel/plugin-transform-modules-commonjs" "^7.9.0"
+ "@babel/plugin-transform-modules-systemjs" "^7.9.0"
"@babel/plugin-transform-modules-umd" "^7.9.0"
"@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3"
"@babel/plugin-transform-new-target" "^7.8.3"
"@babel/plugin-transform-object-super" "^7.8.3"
- "@babel/plugin-transform-parameters" "^7.9.5"
+ "@babel/plugin-transform-parameters" "^7.8.7"
"@babel/plugin-transform-property-literals" "^7.8.3"
"@babel/plugin-transform-regenerator" "^7.8.7"
"@babel/plugin-transform-reserved-words" "^7.8.3"
@@ -923,195 +945,182 @@
"@babel/plugin-transform-typeof-symbol" "^7.8.4"
"@babel/plugin-transform-unicode-regex" "^7.8.3"
"@babel/preset-modules" "^0.1.3"
- "@babel/types" "^7.9.6"
- browserslist "^4.11.1"
- core-js-compat "^3.6.2"
- invariant "^2.2.2"
- levenary "^1.1.1"
- semver "^5.5.0"
+ "@babel/types" "^7.9.0"
+ "browserslist" "^4.9.1"
+ "core-js-compat" "^3.6.2"
+ "invariant" "^2.2.2"
+ "levenary" "^1.1.1"
+ "semver" "^5.5.0"
"@babel/preset-modules@^0.1.3":
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72"
- integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==
+ "integrity" "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg=="
+ "resolved" "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz"
+ "version" "0.1.3"
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
"@babel/plugin-transform-dotall-regex" "^7.4.4"
"@babel/types" "^7.4.4"
- esutils "^2.0.2"
+ "esutils" "^2.0.2"
-"@babel/preset-react@7.9.1":
- version "7.9.1"
- resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.9.1.tgz#b346403c36d58c3bb544148272a0cefd9c28677a"
- integrity sha512-aJBYF23MPj0RNdp/4bHnAP0NVqqZRr9kl0NAOP4nJCex6OYVio59+dnQzsAWFuogdLyeaKA1hmfUIVZkY5J+TQ==
+"@babel/preset-react@^7.0.0":
+ "integrity" "sha512-AxylVB3FXeOTQXNXyiuAQJSvss62FEotbX2Pzx3K/7c+MKJMdSg6Ose6QYllkdCFA8EInCJVw7M/o5QbLuA4ZQ=="
+ "resolved" "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.9.4.tgz"
+ "version" "7.9.4"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-react-display-name" "^7.8.3"
- "@babel/plugin-transform-react-jsx" "^7.9.1"
+ "@babel/plugin-transform-react-jsx" "^7.9.4"
"@babel/plugin-transform-react-jsx-development" "^7.9.0"
"@babel/plugin-transform-react-jsx-self" "^7.9.0"
"@babel/plugin-transform-react-jsx-source" "^7.9.0"
-"@babel/preset-react@^7.0.0":
- version "7.9.4"
- resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.9.4.tgz#c6c97693ac65b6b9c0b4f25b948a8f665463014d"
- integrity sha512-AxylVB3FXeOTQXNXyiuAQJSvss62FEotbX2Pzx3K/7c+MKJMdSg6Ose6QYllkdCFA8EInCJVw7M/o5QbLuA4ZQ==
+"@babel/preset-react@7.9.1":
+ "integrity" "sha512-aJBYF23MPj0RNdp/4bHnAP0NVqqZRr9kl0NAOP4nJCex6OYVio59+dnQzsAWFuogdLyeaKA1hmfUIVZkY5J+TQ=="
+ "resolved" "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.9.1.tgz"
+ "version" "7.9.1"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-react-display-name" "^7.8.3"
- "@babel/plugin-transform-react-jsx" "^7.9.4"
+ "@babel/plugin-transform-react-jsx" "^7.9.1"
"@babel/plugin-transform-react-jsx-development" "^7.9.0"
"@babel/plugin-transform-react-jsx-self" "^7.9.0"
"@babel/plugin-transform-react-jsx-source" "^7.9.0"
"@babel/preset-typescript@7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz#87705a72b1f0d59df21c179f7c3d2ef4b16ce192"
- integrity sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg==
+ "integrity" "sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg=="
+ "resolved" "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz"
+ "version" "7.9.0"
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-typescript" "^7.9.0"
"@babel/runtime-corejs2@^7.0.0", "@babel/runtime-corejs2@^7.5.5":
- version "7.9.6"
- resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.9.6.tgz#acd5d6351384cc2828dc211aa5426a90476bf4a8"
- integrity sha512-TcdM3xc7weMrwTawuG3BTjtVE3mQLXUPQ9CxTbSKOrhn3QAcqCJ2fz+IIv25wztzUnhNZat7hr655YJa61F3zg==
+ "integrity" "sha512-TcdM3xc7weMrwTawuG3BTjtVE3mQLXUPQ9CxTbSKOrhn3QAcqCJ2fz+IIv25wztzUnhNZat7hr655YJa61F3zg=="
+ "resolved" "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.9.6.tgz"
+ "version" "7.9.6"
dependencies:
- core-js "^2.6.5"
- regenerator-runtime "^0.13.4"
+ "core-js" "^2.6.5"
+ "regenerator-runtime" "^0.13.4"
"@babel/runtime-corejs3@^7.8.3":
- version "7.9.6"
- resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.9.6.tgz#67aded13fffbbc2cb93247388cf84d77a4be9a71"
- integrity sha512-6toWAfaALQjt3KMZQc6fABqZwUDDuWzz+cAfPhqyEnzxvdWOAkjwPNxgF8xlmo7OWLsSjaKjsskpKHRLaMArOA==
- dependencies:
- core-js-pure "^3.0.0"
- regenerator-runtime "^0.13.4"
-
-"@babel/runtime@7.8.4":
- version "7.8.4"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.4.tgz#d79f5a2040f7caa24d53e563aad49cbc05581308"
- integrity sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==
- dependencies:
- regenerator-runtime "^0.13.2"
-
-"@babel/runtime@7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.0.tgz#337eda67401f5b066a6f205a3113d4ac18ba495b"
- integrity sha512-cTIudHnzuWLS56ik4DnRnqqNf8MkdUzV4iFFI1h7Jo9xvrpQROYaAnaSd2mHLQAzzZAPfATynX5ord6YlNYNMA==
- dependencies:
- regenerator-runtime "^0.13.4"
-
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7":
- version "7.9.6"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.6.tgz#a9102eb5cadedf3f31d08a9ecf294af7827ea29f"
- integrity sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==
- dependencies:
- regenerator-runtime "^0.13.4"
-
-"@babel/runtime@^7.12.1":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.0.tgz#e27b977f2e2088ba24748bf99b5e1dece64e4f0b"
- integrity sha512-Nht8L0O8YCktmsDV6FqFue7vQLRx3Hb0B37lS5y0jDRqRxlBG4wIJHnf9/bgSE2UyipKFA01YtS+npRdTWBUyw==
+ "integrity" "sha512-6toWAfaALQjt3KMZQc6fABqZwUDDuWzz+cAfPhqyEnzxvdWOAkjwPNxgF8xlmo7OWLsSjaKjsskpKHRLaMArOA=="
+ "resolved" "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.9.6.tgz"
+ "version" "7.9.6"
dependencies:
- regenerator-runtime "^0.13.4"
+ "core-js-pure" "^3.0.0"
+ "regenerator-runtime" "^0.13.4"
-"@babel/runtime@^7.16.0", "@babel/runtime@^7.6.2":
- version "7.16.3"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5"
- integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.16.0", "@babel/runtime@^7.16.3", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7":
+ "integrity" "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw=="
+ "resolved" "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz"
+ "version" "7.18.9"
dependencies:
- regenerator-runtime "^0.13.4"
+ "regenerator-runtime" "^0.13.4"
-"@babel/template@^7.4.0", "@babel/template@^7.8.3", "@babel/template@^7.8.6":
- version "7.8.6"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b"
- integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==
+"@babel/runtime@7.8.4":
+ "integrity" "sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ=="
+ "resolved" "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz"
+ "version" "7.8.4"
dependencies:
- "@babel/code-frame" "^7.8.3"
- "@babel/parser" "^7.8.6"
- "@babel/types" "^7.8.6"
+ "regenerator-runtime" "^0.13.2"
-"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.9.0", "@babel/traverse@^7.9.6":
- version "7.9.6"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.6.tgz#5540d7577697bf619cc57b92aa0f1c231a94f442"
- integrity sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==
- dependencies:
- "@babel/code-frame" "^7.8.3"
- "@babel/generator" "^7.9.6"
- "@babel/helper-function-name" "^7.9.5"
- "@babel/helper-split-export-declaration" "^7.8.3"
- "@babel/parser" "^7.9.6"
- "@babel/types" "^7.9.6"
- debug "^4.1.0"
- globals "^11.1.0"
- lodash "^4.17.13"
-
-"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5", "@babel/types@^7.9.6":
- version "7.9.6"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.6.tgz#2c5502b427251e9de1bd2dff95add646d95cc9f7"
- integrity sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==
- dependencies:
- "@babel/helper-validator-identifier" "^7.9.5"
- lodash "^4.17.13"
- to-fast-properties "^2.0.0"
+"@babel/runtime@7.9.0":
+ "integrity" "sha512-cTIudHnzuWLS56ik4DnRnqqNf8MkdUzV4iFFI1h7Jo9xvrpQROYaAnaSd2mHLQAzzZAPfATynX5ord6YlNYNMA=="
+ "resolved" "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.0.tgz"
+ "version" "7.9.0"
+ dependencies:
+ "regenerator-runtime" "^0.13.4"
+
+"@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.4.0", "@babel/template@^7.8.3", "@babel/template@^7.8.6":
+ "integrity" "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA=="
+ "resolved" "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz"
+ "version" "7.18.10"
+ dependencies:
+ "@babel/code-frame" "^7.18.6"
+ "@babel/parser" "^7.18.10"
+ "@babel/types" "^7.18.10"
+
+"@babel/traverse@^7.1.0", "@babel/traverse@^7.18.13", "@babel/traverse@^7.18.9", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.9.0", "@babel/traverse@^7.9.6":
+ "integrity" "sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA=="
+ "resolved" "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.13.tgz"
+ "version" "7.18.13"
+ dependencies:
+ "@babel/code-frame" "^7.18.6"
+ "@babel/generator" "^7.18.13"
+ "@babel/helper-environment-visitor" "^7.18.9"
+ "@babel/helper-function-name" "^7.18.9"
+ "@babel/helper-hoist-variables" "^7.18.6"
+ "@babel/helper-split-export-declaration" "^7.18.6"
+ "@babel/parser" "^7.18.13"
+ "@babel/types" "^7.18.13"
+ "debug" "^4.1.0"
+ "globals" "^11.1.0"
+
+"@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.13", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.9.0", "@babel/types@^7.9.5", "@babel/types@^7.9.6":
+ "integrity" "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ=="
+ "resolved" "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz"
+ "version" "7.18.13"
+ dependencies:
+ "@babel/helper-string-parser" "^7.18.10"
+ "@babel/helper-validator-identifier" "^7.18.6"
+ "to-fast-properties" "^2.0.0"
"@braintree/sanitize-url@^4.0.0":
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-4.0.1.tgz#16e719eba72693f95989c05f2b3b424f2aabc5b0"
- integrity sha512-THIQtVN491hY2rTZ/h5boj0CwDKrZQIUnfaj6RbpGwRJKfmEIgNpgcCJC3KZl1Vux9bQmdE2P4Q7cYUoSUQ4MA==
+ "integrity" "sha512-THIQtVN491hY2rTZ/h5boj0CwDKrZQIUnfaj6RbpGwRJKfmEIgNpgcCJC3KZl1Vux9bQmdE2P4Q7cYUoSUQ4MA=="
+ "resolved" "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-4.0.1.tgz"
+ "version" "4.0.1"
"@cnakazawa/watch@^1.0.3":
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a"
- integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==
+ "integrity" "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ=="
+ "resolved" "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz"
+ "version" "1.0.4"
dependencies:
- exec-sh "^0.3.2"
- minimist "^1.2.0"
+ "exec-sh" "^0.3.2"
+ "minimist" "^1.2.0"
"@commitlint/execute-rule@^8.3.4":
- version "8.3.4"
- resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-8.3.4.tgz#1b63f0713b197889d90b76f9eea1abc010d256b1"
- integrity sha512-f4HigYjeIBn9f7OuNv5zh2y5vWaAhNFrfeul8CRJDy82l3Y+09lxOTGxfF3uMXKrZq4LmuK6qvvRCZ8mUrVvzQ==
+ "integrity" "sha512-f4HigYjeIBn9f7OuNv5zh2y5vWaAhNFrfeul8CRJDy82l3Y+09lxOTGxfF3uMXKrZq4LmuK6qvvRCZ8mUrVvzQ=="
+ "resolved" "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-8.3.4.tgz"
+ "version" "8.3.4"
"@commitlint/load@>6.1.1":
- version "8.3.5"
- resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-8.3.5.tgz#3f059225ede92166ba94cf4c48e3d67c8b08b18a"
- integrity sha512-poF7R1CtQvIXRmVIe63FjSQmN9KDqjRtU5A6hxqXBga87yB2VUJzic85TV6PcQc+wStk52cjrMI+g0zFx+Zxrw==
+ "integrity" "sha512-poF7R1CtQvIXRmVIe63FjSQmN9KDqjRtU5A6hxqXBga87yB2VUJzic85TV6PcQc+wStk52cjrMI+g0zFx+Zxrw=="
+ "resolved" "https://registry.npmjs.org/@commitlint/load/-/load-8.3.5.tgz"
+ "version" "8.3.5"
dependencies:
"@commitlint/execute-rule" "^8.3.4"
"@commitlint/resolve-extends" "^8.3.5"
- babel-runtime "^6.23.0"
- chalk "2.4.2"
- cosmiconfig "^5.2.0"
- lodash "4.17.15"
- resolve-from "^5.0.0"
+ "babel-runtime" "^6.23.0"
+ "chalk" "2.4.2"
+ "cosmiconfig" "^5.2.0"
+ "lodash" "4.17.15"
+ "resolve-from" "^5.0.0"
"@commitlint/resolve-extends@^8.3.5":
- version "8.3.5"
- resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-8.3.5.tgz#8fff800f292ac217ae30b1862f5f9a84b278310a"
- integrity sha512-nHhFAK29qiXNe6oH6uG5wqBnCR+BQnxlBW/q5fjtxIaQALgfoNLHwLS9exzbIRFqwJckpR6yMCfgMbmbAOtklQ==
+ "integrity" "sha512-nHhFAK29qiXNe6oH6uG5wqBnCR+BQnxlBW/q5fjtxIaQALgfoNLHwLS9exzbIRFqwJckpR6yMCfgMbmbAOtklQ=="
+ "resolved" "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-8.3.5.tgz"
+ "version" "8.3.5"
dependencies:
- import-fresh "^3.0.0"
- lodash "4.17.15"
- resolve-from "^5.0.0"
- resolve-global "^1.0.0"
+ "import-fresh" "^3.0.0"
+ "lodash" "4.17.15"
+ "resolve-from" "^5.0.0"
+ "resolve-global" "^1.0.0"
"@csstools/convert-colors@^1.4.0":
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7"
- integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==
+ "integrity" "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw=="
+ "resolved" "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz"
+ "version" "1.4.0"
"@csstools/normalize.css@^10.1.0":
- version "10.1.0"
- resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18"
- integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==
+ "integrity" "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg=="
+ "resolved" "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz"
+ "version" "10.1.0"
"@emotion/cache@^10.0.27", "@emotion/cache@^10.0.9":
- version "10.0.29"
- resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.29.tgz#87e7e64f412c060102d589fe7c6dc042e6f9d1e0"
- integrity sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==
+ "integrity" "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ=="
+ "resolved" "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz"
+ "version" "10.0.29"
dependencies:
"@emotion/sheet" "0.9.4"
"@emotion/stylis" "0.8.5"
@@ -1119,9 +1128,9 @@
"@emotion/weak-memoize" "0.2.5"
"@emotion/core@^10.0.9":
- version "10.0.28"
- resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.0.28.tgz#bb65af7262a234593a9e952c041d0f1c9b9bef3d"
- integrity sha512-pH8UueKYO5jgg0Iq+AmCLxBsvuGtvlmiDCOuv8fGNYn3cowFpLN98L8zO56U0H1PjDIyAlXymgL3Wu7u7v6hbA==
+ "integrity" "sha512-pH8UueKYO5jgg0Iq+AmCLxBsvuGtvlmiDCOuv8fGNYn3cowFpLN98L8zO56U0H1PjDIyAlXymgL3Wu7u7v6hbA=="
+ "resolved" "https://registry.npmjs.org/@emotion/core/-/core-10.0.28.tgz"
+ "version" "10.0.28"
dependencies:
"@babel/runtime" "^7.5.5"
"@emotion/cache" "^10.0.27"
@@ -1131,79 +1140,79 @@
"@emotion/utils" "0.11.3"
"@emotion/css@^10.0.27", "@emotion/css@^10.0.9":
- version "10.0.27"
- resolved "https://registry.yarnpkg.com/@emotion/css/-/css-10.0.27.tgz#3a7458198fbbebb53b01b2b87f64e5e21241e14c"
- integrity sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==
+ "integrity" "sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw=="
+ "resolved" "https://registry.npmjs.org/@emotion/css/-/css-10.0.27.tgz"
+ "version" "10.0.27"
dependencies:
"@emotion/serialize" "^0.11.15"
"@emotion/utils" "0.11.3"
- babel-plugin-emotion "^10.0.27"
+ "babel-plugin-emotion" "^10.0.27"
"@emotion/hash@0.8.0":
- version "0.8.0"
- resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413"
- integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==
+ "integrity" "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="
+ "resolved" "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz"
+ "version" "0.8.0"
"@emotion/memoize@0.7.4":
- version "0.7.4"
- resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb"
- integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==
+ "integrity" "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw=="
+ "resolved" "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz"
+ "version" "0.7.4"
"@emotion/serialize@^0.11.15", "@emotion/serialize@^0.11.16":
- version "0.11.16"
- resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.16.tgz#dee05f9e96ad2fb25a5206b6d759b2d1ed3379ad"
- integrity sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==
+ "integrity" "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg=="
+ "resolved" "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz"
+ "version" "0.11.16"
dependencies:
"@emotion/hash" "0.8.0"
"@emotion/memoize" "0.7.4"
"@emotion/unitless" "0.7.5"
"@emotion/utils" "0.11.3"
- csstype "^2.5.7"
+ "csstype" "^2.5.7"
"@emotion/sheet@0.9.4":
- version "0.9.4"
- resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.4.tgz#894374bea39ec30f489bbfc3438192b9774d32e5"
- integrity sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==
+ "integrity" "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA=="
+ "resolved" "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz"
+ "version" "0.9.4"
"@emotion/stylis@0.8.5":
- version "0.8.5"
- resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04"
- integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==
+ "integrity" "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ=="
+ "resolved" "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz"
+ "version" "0.8.5"
"@emotion/unitless@0.7.5":
- version "0.7.5"
- resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed"
- integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
+ "integrity" "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
+ "resolved" "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz"
+ "version" "0.7.5"
"@emotion/utils@0.11.3":
- version "0.11.3"
- resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.11.3.tgz#a759863867befa7e583400d322652a3f44820924"
- integrity sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==
+ "integrity" "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw=="
+ "resolved" "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz"
+ "version" "0.11.3"
"@emotion/weak-memoize@0.2.5":
- version "0.2.5"
- resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46"
- integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==
+ "integrity" "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA=="
+ "resolved" "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz"
+ "version" "0.2.5"
"@hapi/address@2.x.x":
- version "2.1.4"
- resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5"
- integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==
+ "integrity" "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ=="
+ "resolved" "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz"
+ "version" "2.1.4"
"@hapi/bourne@1.x.x":
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a"
- integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==
+ "integrity" "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA=="
+ "resolved" "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz"
+ "version" "1.3.2"
-"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0":
- version "8.5.1"
- resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06"
- integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==
+"@hapi/hoek@^8.3.0", "@hapi/hoek@8.x.x":
+ "integrity" "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow=="
+ "resolved" "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz"
+ "version" "8.5.1"
"@hapi/joi@^15.0.0":
- version "15.1.1"
- resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7"
- integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==
+ "integrity" "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ=="
+ "resolved" "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz"
+ "version" "15.1.1"
dependencies:
"@hapi/address" "2.x.x"
"@hapi/bourne" "1.x.x"
@@ -1211,287 +1220,318 @@
"@hapi/topo" "3.x.x"
"@hapi/topo@3.x.x":
- version "3.1.6"
- resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29"
- integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==
+ "integrity" "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ=="
+ "resolved" "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz"
+ "version" "3.1.6"
dependencies:
"@hapi/hoek" "^8.3.0"
-"@iarna/cli@^1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@iarna/cli/-/cli-1.2.0.tgz#0f7af5e851afe895104583c4ca07377a8094d641"
- integrity sha512-ukITQAqVs2n9HGmn3car/Ir7d3ta650iXhrG7pjr3EWdFmJuuOVWgYsu7ftsSe5VifEFFhjxVuX9+8F7L8hwcA==
- dependencies:
- signal-exit "^3.0.2"
- update-notifier "^2.2.0"
- yargs "^8.0.2"
-
"@jest/console@^24.7.1", "@jest/console@^24.9.0":
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0"
- integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==
+ "integrity" "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ=="
+ "resolved" "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/source-map" "^24.9.0"
- chalk "^2.0.1"
- slash "^2.0.0"
+ "chalk" "^2.0.1"
+ "slash" "^2.0.0"
"@jest/core@^24.9.0":
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4"
- integrity sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==
+ "integrity" "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A=="
+ "resolved" "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/console" "^24.7.1"
"@jest/reporters" "^24.9.0"
"@jest/test-result" "^24.9.0"
"@jest/transform" "^24.9.0"
"@jest/types" "^24.9.0"
- ansi-escapes "^3.0.0"
- chalk "^2.0.1"
- exit "^0.1.2"
- graceful-fs "^4.1.15"
- jest-changed-files "^24.9.0"
- jest-config "^24.9.0"
- jest-haste-map "^24.9.0"
- jest-message-util "^24.9.0"
- jest-regex-util "^24.3.0"
- jest-resolve "^24.9.0"
- jest-resolve-dependencies "^24.9.0"
- jest-runner "^24.9.0"
- jest-runtime "^24.9.0"
- jest-snapshot "^24.9.0"
- jest-util "^24.9.0"
- jest-validate "^24.9.0"
- jest-watcher "^24.9.0"
- micromatch "^3.1.10"
- p-each-series "^1.0.0"
- realpath-native "^1.1.0"
- rimraf "^2.5.4"
- slash "^2.0.0"
- strip-ansi "^5.0.0"
+ "ansi-escapes" "^3.0.0"
+ "chalk" "^2.0.1"
+ "exit" "^0.1.2"
+ "graceful-fs" "^4.1.15"
+ "jest-changed-files" "^24.9.0"
+ "jest-config" "^24.9.0"
+ "jest-haste-map" "^24.9.0"
+ "jest-message-util" "^24.9.0"
+ "jest-regex-util" "^24.3.0"
+ "jest-resolve" "^24.9.0"
+ "jest-resolve-dependencies" "^24.9.0"
+ "jest-runner" "^24.9.0"
+ "jest-runtime" "^24.9.0"
+ "jest-snapshot" "^24.9.0"
+ "jest-util" "^24.9.0"
+ "jest-validate" "^24.9.0"
+ "jest-watcher" "^24.9.0"
+ "micromatch" "^3.1.10"
+ "p-each-series" "^1.0.0"
+ "realpath-native" "^1.1.0"
+ "rimraf" "^2.5.4"
+ "slash" "^2.0.0"
+ "strip-ansi" "^5.0.0"
"@jest/environment@^24.3.0", "@jest/environment@^24.9.0":
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18"
- integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==
+ "integrity" "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ=="
+ "resolved" "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/fake-timers" "^24.9.0"
"@jest/transform" "^24.9.0"
"@jest/types" "^24.9.0"
- jest-mock "^24.9.0"
+ "jest-mock" "^24.9.0"
"@jest/fake-timers@^24.3.0", "@jest/fake-timers@^24.9.0":
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93"
- integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==
+ "integrity" "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A=="
+ "resolved" "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/types" "^24.9.0"
- jest-message-util "^24.9.0"
- jest-mock "^24.9.0"
+ "jest-message-util" "^24.9.0"
+ "jest-mock" "^24.9.0"
"@jest/reporters@^24.9.0":
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43"
- integrity sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==
+ "integrity" "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw=="
+ "resolved" "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/environment" "^24.9.0"
"@jest/test-result" "^24.9.0"
"@jest/transform" "^24.9.0"
"@jest/types" "^24.9.0"
- chalk "^2.0.1"
- exit "^0.1.2"
- glob "^7.1.2"
- istanbul-lib-coverage "^2.0.2"
- istanbul-lib-instrument "^3.0.1"
- istanbul-lib-report "^2.0.4"
- istanbul-lib-source-maps "^3.0.1"
- istanbul-reports "^2.2.6"
- jest-haste-map "^24.9.0"
- jest-resolve "^24.9.0"
- jest-runtime "^24.9.0"
- jest-util "^24.9.0"
- jest-worker "^24.6.0"
- node-notifier "^5.4.2"
- slash "^2.0.0"
- source-map "^0.6.0"
- string-length "^2.0.0"
+ "chalk" "^2.0.1"
+ "exit" "^0.1.2"
+ "glob" "^7.1.2"
+ "istanbul-lib-coverage" "^2.0.2"
+ "istanbul-lib-instrument" "^3.0.1"
+ "istanbul-lib-report" "^2.0.4"
+ "istanbul-lib-source-maps" "^3.0.1"
+ "istanbul-reports" "^2.2.6"
+ "jest-haste-map" "^24.9.0"
+ "jest-resolve" "^24.9.0"
+ "jest-runtime" "^24.9.0"
+ "jest-util" "^24.9.0"
+ "jest-worker" "^24.6.0"
+ "node-notifier" "^5.4.2"
+ "slash" "^2.0.0"
+ "source-map" "^0.6.0"
+ "string-length" "^2.0.0"
"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0":
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714"
- integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==
+ "integrity" "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg=="
+ "resolved" "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
- callsites "^3.0.0"
- graceful-fs "^4.1.15"
- source-map "^0.6.0"
+ "callsites" "^3.0.0"
+ "graceful-fs" "^4.1.15"
+ "source-map" "^0.6.0"
"@jest/test-result@^24.9.0":
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca"
- integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==
+ "integrity" "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA=="
+ "resolved" "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/console" "^24.9.0"
"@jest/types" "^24.9.0"
"@types/istanbul-lib-coverage" "^2.0.0"
"@jest/test-sequencer@^24.9.0":
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31"
- integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==
+ "integrity" "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A=="
+ "resolved" "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/test-result" "^24.9.0"
- jest-haste-map "^24.9.0"
- jest-runner "^24.9.0"
- jest-runtime "^24.9.0"
+ "jest-haste-map" "^24.9.0"
+ "jest-runner" "^24.9.0"
+ "jest-runtime" "^24.9.0"
"@jest/transform@^24.9.0":
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56"
- integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==
+ "integrity" "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ=="
+ "resolved" "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@babel/core" "^7.1.0"
"@jest/types" "^24.9.0"
- babel-plugin-istanbul "^5.1.0"
- chalk "^2.0.1"
- convert-source-map "^1.4.0"
- fast-json-stable-stringify "^2.0.0"
- graceful-fs "^4.1.15"
- jest-haste-map "^24.9.0"
- jest-regex-util "^24.9.0"
- jest-util "^24.9.0"
- micromatch "^3.1.10"
- pirates "^4.0.1"
- realpath-native "^1.1.0"
- slash "^2.0.0"
- source-map "^0.6.1"
- write-file-atomic "2.4.1"
+ "babel-plugin-istanbul" "^5.1.0"
+ "chalk" "^2.0.1"
+ "convert-source-map" "^1.4.0"
+ "fast-json-stable-stringify" "^2.0.0"
+ "graceful-fs" "^4.1.15"
+ "jest-haste-map" "^24.9.0"
+ "jest-regex-util" "^24.9.0"
+ "jest-util" "^24.9.0"
+ "micromatch" "^3.1.10"
+ "pirates" "^4.0.1"
+ "realpath-native" "^1.1.0"
+ "slash" "^2.0.0"
+ "source-map" "^0.6.1"
+ "write-file-atomic" "2.4.1"
"@jest/types@^24.3.0", "@jest/types@^24.9.0":
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59"
- integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==
+ "integrity" "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw=="
+ "resolved" "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@types/istanbul-lib-coverage" "^2.0.0"
"@types/istanbul-reports" "^1.1.1"
"@types/yargs" "^13.0.0"
+"@jridgewell/gen-mapping@^0.1.0":
+ "integrity" "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w=="
+ "resolved" "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz"
+ "version" "0.1.1"
+ dependencies:
+ "@jridgewell/set-array" "^1.0.0"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@jridgewell/gen-mapping@^0.3.2":
+ "integrity" "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A=="
+ "resolved" "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz"
+ "version" "0.3.2"
+ dependencies:
+ "@jridgewell/set-array" "^1.0.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/resolve-uri@^3.0.3":
+ "integrity" "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w=="
+ "resolved" "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz"
+ "version" "3.1.0"
+
+"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1":
+ "integrity" "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw=="
+ "resolved" "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz"
+ "version" "1.1.2"
+
+"@jridgewell/sourcemap-codec@^1.4.10":
+ "integrity" "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
+ "resolved" "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz"
+ "version" "1.4.14"
+
+"@jridgewell/trace-mapping@^0.3.9":
+ "integrity" "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g=="
+ "resolved" "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz"
+ "version" "0.3.15"
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.0.3"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+
"@kyleshockey/object-assign-deep@^0.4.0", "@kyleshockey/object-assign-deep@^0.4.2":
- version "0.4.2"
- resolved "https://registry.yarnpkg.com/@kyleshockey/object-assign-deep/-/object-assign-deep-0.4.2.tgz#84900f0eefc372798f4751b5262830b8208922ec"
- integrity sha1-hJAPDu/DcnmPR1G1JigwuCCJIuw=
+ "integrity" "sha1-hJAPDu/DcnmPR1G1JigwuCCJIuw="
+ "resolved" "https://registry.npmjs.org/@kyleshockey/object-assign-deep/-/object-assign-deep-0.4.2.tgz"
+ "version" "0.4.2"
"@kyleshockey/xml@^1.0.2":
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/@kyleshockey/xml/-/xml-1.0.2.tgz#81fad3d7c33da2ba2639db095db3db24c2921f70"
- integrity sha512-iMo32MPLcI9cPxs3YL5kmKxKgDmkSZDCFEqIT5eRk7d/Ll8r4X3SwGYSigzALd6+RHWlFEmjL1QyaQ15xDZFlw==
+ "integrity" "sha512-iMo32MPLcI9cPxs3YL5kmKxKgDmkSZDCFEqIT5eRk7d/Ll8r4X3SwGYSigzALd6+RHWlFEmjL1QyaQ15xDZFlw=="
+ "resolved" "https://registry.npmjs.org/@kyleshockey/xml/-/xml-1.0.2.tgz"
+ "version" "1.0.2"
dependencies:
- stream "^0.0.2"
+ "stream" "^0.0.2"
"@mrmlnc/readdir-enhanced@^2.2.1":
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
- integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==
+ "integrity" "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g=="
+ "resolved" "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz"
+ "version" "2.2.1"
dependencies:
- call-me-maybe "^1.0.1"
- glob-to-regexp "^0.3.0"
+ "call-me-maybe" "^1.0.1"
+ "glob-to-regexp" "^0.3.0"
"@nodelib/fs.scandir@2.1.3":
- version "2.1.3"
- resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b"
- integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==
+ "integrity" "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw=="
+ "resolved" "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz"
+ "version" "2.1.3"
dependencies:
"@nodelib/fs.stat" "2.0.3"
- run-parallel "^1.1.9"
-
-"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3"
- integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==
+ "run-parallel" "^1.1.9"
"@nodelib/fs.stat@^1.1.2":
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
- integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
+ "integrity" "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw=="
+ "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz"
+ "version" "1.1.3"
+
+"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.3":
+ "integrity" "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA=="
+ "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz"
+ "version" "2.0.3"
"@nodelib/fs.walk@^1.2.3":
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976"
- integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==
+ "integrity" "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ=="
+ "resolved" "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz"
+ "version" "1.2.4"
dependencies:
"@nodelib/fs.scandir" "2.1.3"
- fastq "^1.6.0"
+ "fastq" "^1.6.0"
"@octokit/auth-token@^2.4.0":
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.1.tgz#375d79eebd03750e6a9b0299e80b8167c7c85655"
- integrity sha512-NB81O5h39KfHYGtgfWr2booRxp2bWOJoqbWwbyUg2hw6h35ArWYlAST5B3XwAkbdcx13yt84hFXyFP5X0QToWA==
+ "integrity" "sha512-NB81O5h39KfHYGtgfWr2booRxp2bWOJoqbWwbyUg2hw6h35ArWYlAST5B3XwAkbdcx13yt84hFXyFP5X0QToWA=="
+ "resolved" "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.1.tgz"
+ "version" "2.4.1"
dependencies:
"@octokit/types" "^4.0.1"
"@octokit/endpoint@^6.0.1":
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.1.tgz#16d5c0e7a83e3a644d1ddbe8cded6c3d038d31d7"
- integrity sha512-pOPHaSz57SFT/m3R5P8MUu4wLPszokn5pXcB/pzavLTQf2jbU+6iayTvzaY6/BiotuRS0qyEUkx3QglT4U958A==
+ "integrity" "sha512-pOPHaSz57SFT/m3R5P8MUu4wLPszokn5pXcB/pzavLTQf2jbU+6iayTvzaY6/BiotuRS0qyEUkx3QglT4U958A=="
+ "resolved" "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.1.tgz"
+ "version" "6.0.1"
dependencies:
"@octokit/types" "^2.11.1"
- is-plain-object "^3.0.0"
- universal-user-agent "^5.0.0"
+ "is-plain-object" "^3.0.0"
+ "universal-user-agent" "^5.0.0"
"@octokit/plugin-paginate-rest@^1.1.1":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.2.tgz#004170acf8c2be535aba26727867d692f7b488fc"
- integrity sha512-jbsSoi5Q1pj63sC16XIUboklNw+8tL9VOnJsWycWYR78TKss5PVpIPb1TUUcMQ+bBh7cY579cVAWmf5qG+dw+Q==
+ "integrity" "sha512-jbsSoi5Q1pj63sC16XIUboklNw+8tL9VOnJsWycWYR78TKss5PVpIPb1TUUcMQ+bBh7cY579cVAWmf5qG+dw+Q=="
+ "resolved" "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.2.tgz"
+ "version" "1.1.2"
dependencies:
"@octokit/types" "^2.0.1"
"@octokit/plugin-request-log@^1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz#eef87a431300f6148c39a7f75f8cfeb218b2547e"
- integrity sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw==
+ "integrity" "sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw=="
+ "resolved" "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz"
+ "version" "1.0.0"
"@octokit/plugin-rest-endpoint-methods@2.4.0":
- version "2.4.0"
- resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-2.4.0.tgz#3288ecf5481f68c494dd0602fc15407a59faf61e"
- integrity sha512-EZi/AWhtkdfAYi01obpX0DF7U6b1VRr30QNQ5xSFPITMdLSfhcBqjamE3F+sKcxPbD7eZuMHu3Qkk2V+JGxBDQ==
+ "integrity" "sha512-EZi/AWhtkdfAYi01obpX0DF7U6b1VRr30QNQ5xSFPITMdLSfhcBqjamE3F+sKcxPbD7eZuMHu3Qkk2V+JGxBDQ=="
+ "resolved" "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-2.4.0.tgz"
+ "version" "2.4.0"
dependencies:
"@octokit/types" "^2.0.1"
- deprecation "^2.3.1"
+ "deprecation" "^2.3.1"
"@octokit/request-error@^1.0.2":
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-1.2.1.tgz#ede0714c773f32347576c25649dc013ae6b31801"
- integrity sha512-+6yDyk1EES6WK+l3viRDElw96MvwfJxCt45GvmjDUKWjYIb3PJZQkq3i46TwGwoPD4h8NmTrENmtyA1FwbmhRA==
+ "integrity" "sha512-+6yDyk1EES6WK+l3viRDElw96MvwfJxCt45GvmjDUKWjYIb3PJZQkq3i46TwGwoPD4h8NmTrENmtyA1FwbmhRA=="
+ "resolved" "https://registry.npmjs.org/@octokit/request-error/-/request-error-1.2.1.tgz"
+ "version" "1.2.1"
dependencies:
"@octokit/types" "^2.0.0"
- deprecation "^2.0.0"
- once "^1.4.0"
+ "deprecation" "^2.0.0"
+ "once" "^1.4.0"
"@octokit/request-error@^2.0.0":
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.1.tgz#49bd71e811daffd5bdd06ef514ca47b5039682d1"
- integrity sha512-5lqBDJ9/TOehK82VvomQ6zFiZjPeSom8fLkFVLuYL3sKiIb5RB8iN/lenLkY7oBmyQcGP7FBMGiIZTO8jufaRQ==
+ "integrity" "sha512-5lqBDJ9/TOehK82VvomQ6zFiZjPeSom8fLkFVLuYL3sKiIb5RB8iN/lenLkY7oBmyQcGP7FBMGiIZTO8jufaRQ=="
+ "resolved" "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.1.tgz"
+ "version" "2.0.1"
dependencies:
"@octokit/types" "^4.0.1"
- deprecation "^2.0.0"
- once "^1.4.0"
+ "deprecation" "^2.0.0"
+ "once" "^1.4.0"
"@octokit/request@^5.2.0":
- version "5.4.2"
- resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.2.tgz#74f8e5bbd39dc738a1b127629791f8ad1b3193ee"
- integrity sha512-zKdnGuQ2TQ2vFk9VU8awFT4+EYf92Z/v3OlzRaSh4RIP0H6cvW1BFPXq4XYvNez+TPQjqN+0uSkCYnMFFhcFrw==
+ "integrity" "sha512-zKdnGuQ2TQ2vFk9VU8awFT4+EYf92Z/v3OlzRaSh4RIP0H6cvW1BFPXq4XYvNez+TPQjqN+0uSkCYnMFFhcFrw=="
+ "resolved" "https://registry.npmjs.org/@octokit/request/-/request-5.4.2.tgz"
+ "version" "5.4.2"
dependencies:
"@octokit/endpoint" "^6.0.1"
"@octokit/request-error" "^2.0.0"
"@octokit/types" "^2.11.1"
- deprecation "^2.0.0"
- is-plain-object "^3.0.0"
- node-fetch "^2.3.0"
- once "^1.4.0"
- universal-user-agent "^5.0.0"
+ "deprecation" "^2.0.0"
+ "is-plain-object" "^3.0.0"
+ "node-fetch" "^2.3.0"
+ "once" "^1.4.0"
+ "universal-user-agent" "^5.0.0"
"@octokit/rest@^16.27.0":
- version "16.43.1"
- resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.43.1.tgz#3b11e7d1b1ac2bbeeb23b08a17df0b20947eda6b"
- integrity sha512-gfFKwRT/wFxq5qlNjnW2dh+qh74XgTQ2B179UX5K1HYCluioWj8Ndbgqw2PVqa1NnVJkGHp2ovMpVn/DImlmkw==
+ "integrity" "sha512-gfFKwRT/wFxq5qlNjnW2dh+qh74XgTQ2B179UX5K1HYCluioWj8Ndbgqw2PVqa1NnVJkGHp2ovMpVn/DImlmkw=="
+ "resolved" "https://registry.npmjs.org/@octokit/rest/-/rest-16.43.1.tgz"
+ "version" "16.43.1"
dependencies:
"@octokit/auth-token" "^2.4.0"
"@octokit/plugin-paginate-rest" "^1.1.1"
@@ -1499,222 +1539,222 @@
"@octokit/plugin-rest-endpoint-methods" "2.4.0"
"@octokit/request" "^5.2.0"
"@octokit/request-error" "^1.0.2"
- atob-lite "^2.0.0"
- before-after-hook "^2.0.0"
- btoa-lite "^1.0.0"
- deprecation "^2.0.0"
- lodash.get "^4.4.2"
- lodash.set "^4.3.2"
- lodash.uniq "^4.5.0"
- octokit-pagination-methods "^1.1.0"
- once "^1.4.0"
- universal-user-agent "^4.0.0"
+ "atob-lite" "^2.0.0"
+ "before-after-hook" "^2.0.0"
+ "btoa-lite" "^1.0.0"
+ "deprecation" "^2.0.0"
+ "lodash.get" "^4.4.2"
+ "lodash.set" "^4.3.2"
+ "lodash.uniq" "^4.5.0"
+ "octokit-pagination-methods" "^1.1.0"
+ "once" "^1.4.0"
+ "universal-user-agent" "^4.0.0"
"@octokit/types@^2.0.0", "@octokit/types@^2.0.1", "@octokit/types@^2.11.1":
- version "2.16.2"
- resolved "https://registry.yarnpkg.com/@octokit/types/-/types-2.16.2.tgz#4c5f8da3c6fecf3da1811aef678fda03edac35d2"
- integrity sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==
+ "integrity" "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q=="
+ "resolved" "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz"
+ "version" "2.16.2"
dependencies:
"@types/node" ">= 8"
"@octokit/types@^4.0.1":
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/@octokit/types/-/types-4.0.1.tgz#dd32ff2407699f3a0c909cdd24de17b45b7d7051"
- integrity sha512-Ho6h7w2h9y8RRE8r656hIj1oiSbwbIHJGF5r9G5FOwS2VdDPq8QLGvsG4x6pKHpvyGK7j+43sAc2cJKMiFoIJw==
+ "integrity" "sha512-Ho6h7w2h9y8RRE8r656hIj1oiSbwbIHJGF5r9G5FOwS2VdDPq8QLGvsG4x6pKHpvyGK7j+43sAc2cJKMiFoIJw=="
+ "resolved" "https://registry.npmjs.org/@octokit/types/-/types-4.0.1.tgz"
+ "version" "4.0.1"
dependencies:
"@types/node" ">= 8"
"@patternfly/react-charts@^6.51.5":
- version "6.51.5"
- resolved "https://registry.yarnpkg.com/@patternfly/react-charts/-/react-charts-6.51.5.tgz#38bfe95a0d46120af478e66d23d743ccecbcac1f"
- integrity sha512-A+SL+KWYCX9q+Jr8Uy6SzVDlIr4FUpqT2u7gDDo+kyTEPrCrcGar43fN4ivi5nTE6w23px2l93O4iGQxZeTDDw==
+ "integrity" "sha512-A+SL+KWYCX9q+Jr8Uy6SzVDlIr4FUpqT2u7gDDo+kyTEPrCrcGar43fN4ivi5nTE6w23px2l93O4iGQxZeTDDw=="
+ "resolved" "https://registry.npmjs.org/@patternfly/react-charts/-/react-charts-6.51.5.tgz"
+ "version" "6.51.5"
dependencies:
"@patternfly/react-styles" "^4.48.5"
"@patternfly/react-tokens" "^4.50.5"
- hoist-non-react-statics "^3.3.0"
- lodash "^4.17.19"
- tslib "^2.0.0"
- victory-area "^36.2.1"
- victory-axis "^36.2.1"
- victory-bar "^36.2.1"
- victory-chart "^36.2.1"
- victory-core "^36.2.1"
- victory-create-container "^36.2.1"
- victory-group "^36.2.1"
- victory-legend "^36.2.1"
- victory-line "^36.2.1"
- victory-pie "^36.2.1"
- victory-scatter "^36.2.1"
- victory-stack "^36.2.1"
- victory-tooltip "^36.2.1"
- victory-voronoi-container "^36.2.1"
- victory-zoom-container "^36.2.1"
+ "hoist-non-react-statics" "^3.3.0"
+ "lodash" "^4.17.19"
+ "tslib" "^2.0.0"
+ "victory-area" "^36.2.1"
+ "victory-axis" "^36.2.1"
+ "victory-bar" "^36.2.1"
+ "victory-chart" "^36.2.1"
+ "victory-core" "^36.2.1"
+ "victory-create-container" "^36.2.1"
+ "victory-group" "^36.2.1"
+ "victory-legend" "^36.2.1"
+ "victory-line" "^36.2.1"
+ "victory-pie" "^36.2.1"
+ "victory-scatter" "^36.2.1"
+ "victory-stack" "^36.2.1"
+ "victory-tooltip" "^36.2.1"
+ "victory-voronoi-container" "^36.2.1"
+ "victory-zoom-container" "^36.2.1"
"@patternfly/react-core@^4.198.5":
- version "4.198.5"
- resolved "https://registry.yarnpkg.com/@patternfly/react-core/-/react-core-4.198.5.tgz#0bbd5e449644a4667ea65ec6903ee4a690e3a10b"
- integrity sha512-LMpOYgaCp6W8+2nT12D4/9+6RnIJufBPzn5xtr8/0+gvBe16VMlpBfb9msC5ibX28fWqSKzlEic1Ovn1vhUYFw==
- dependencies:
- "@patternfly/react-icons" "^4.49.5"
- "@patternfly/react-styles" "^4.48.5"
- "@patternfly/react-tokens" "^4.50.5"
- focus-trap "6.2.2"
- react-dropzone "9.0.0"
- tippy.js "5.1.2"
- tslib "^2.0.0"
-
-"@patternfly/react-icons@^4.49.5":
- version "4.49.5"
- resolved "https://registry.yarnpkg.com/@patternfly/react-icons/-/react-icons-4.49.5.tgz#ac8c0282b904e8016a0a1dd4db63988e121b4358"
- integrity sha512-pR04R32KZAd4uPWeFf/pYXp0uUTwDotsM1iPbjJ6Rpl1sELM4LuQV4gaG22dWLy24VCRizFoP6BSzDxmq+GY4g==
-
-"@patternfly/react-styles@^4.48.5":
- version "4.48.5"
- resolved "https://registry.yarnpkg.com/@patternfly/react-styles/-/react-styles-4.48.5.tgz#e900118e76bc0d1f7c388215ed56aff07923228c"
- integrity sha512-kXY2piAInTuv1PxuQbSuDYJ+ugIsEs9MnwWqZOMARGrcsElbRLn+vtSxShx7AQeJ9V9e0v64gdgP7pIJqisd1Q==
+ "integrity" "sha512-I26IE75kI2P3kIfPsw0N4/pUSzXxWw2dinGw50fDN0qBMTnSCwwiJnyCFImF0f7YF30QWOO4VPs45zdM4iiQeg=="
+ "resolved" "https://registry.npmjs.org/@patternfly/react-core/-/react-core-4.235.7.tgz"
+ "version" "4.235.7"
+ dependencies:
+ "@patternfly/react-icons" "^4.86.7"
+ "@patternfly/react-styles" "^4.85.7"
+ "@patternfly/react-tokens" "^4.87.7"
+ "focus-trap" "6.9.2"
+ "react-dropzone" "9.0.0"
+ "tippy.js" "5.1.2"
+ "tslib" "^2.0.0"
+
+"@patternfly/react-icons@^4.49.5", "@patternfly/react-icons@^4.86.7":
+ "integrity" "sha512-QYurZzfjOKqHWRI8zeUweXy583C11NVeRAWbxVhOhPT/aFtgkd75iZNlLpv6XI1EN/uLpa9WdkZzyuLY1txYnA=="
+ "resolved" "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-4.86.7.tgz"
+ "version" "4.86.7"
+
+"@patternfly/react-styles@^4.48.5", "@patternfly/react-styles@^4.85.7":
+ "integrity" "sha512-XSa8Loaouj1XEmbJmEeURXxKu5ub1VCRV0yN5YOnRo7j7XI4Yw9QarSHODzhkquI3AhkD0dPyMOaefz4P6lJKw=="
+ "resolved" "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-4.85.7.tgz"
+ "version" "4.85.7"
"@patternfly/react-table@^4.67.5":
- version "4.67.5"
- resolved "https://registry.yarnpkg.com/@patternfly/react-table/-/react-table-4.67.5.tgz#b476f460d82fcb966395c0c4a8d3753d549e9861"
- integrity sha512-drb4hrPAnAI4wlPtqopotjK5pN6E0b0/o9CYfvIO2O+NeabRg8l3MqpxbKIG2bEwXPjmVCBDLQ/ut14loLNe+g==
+ "integrity" "sha512-drb4hrPAnAI4wlPtqopotjK5pN6E0b0/o9CYfvIO2O+NeabRg8l3MqpxbKIG2bEwXPjmVCBDLQ/ut14loLNe+g=="
+ "resolved" "https://registry.npmjs.org/@patternfly/react-table/-/react-table-4.67.5.tgz"
+ "version" "4.67.5"
dependencies:
"@patternfly/react-core" "^4.198.5"
"@patternfly/react-icons" "^4.49.5"
"@patternfly/react-styles" "^4.48.5"
"@patternfly/react-tokens" "^4.50.5"
- lodash "^4.17.19"
- tslib "^2.0.0"
+ "lodash" "^4.17.19"
+ "tslib" "^2.0.0"
-"@patternfly/react-tokens@^4.50.5":
- version "4.50.5"
- resolved "https://registry.yarnpkg.com/@patternfly/react-tokens/-/react-tokens-4.50.5.tgz#5c68ce35002452b6664c55644b7299eb8545cfc1"
- integrity sha512-u8+f4eevQdVC7w4jmy+ynIB9R7A9NlI2v5L8GMtkWLt3A0S4DBzNbU90MPSVwgfw0XHcvdFQjuK3OaS06M0bxw==
+"@patternfly/react-tokens@^4.50.5", "@patternfly/react-tokens@^4.87.7":
+ "integrity" "sha512-07A7Ya4zIAYyYn3mOCG82wMC3/Y8mtTw95a//Onu/H0oDPMJ5oT7Vd14YN7pHexCAtWvc36Mp46iZ1osIQ7yVQ=="
+ "resolved" "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-4.87.7.tgz"
+ "version" "4.87.7"
"@semantic-release/commit-analyzer@^6.1.0":
- version "6.3.3"
- resolved "https://registry.yarnpkg.com/@semantic-release/commit-analyzer/-/commit-analyzer-6.3.3.tgz#885f7e46e2f0aef23a23be0904dbf18d6ece45ca"
- integrity sha512-Pyv1ZL2u5AIOY4YbxFCAB5J1PEh5yON8ylbfiPiriDGGW6Uu1U3Y8lysMtWu+FUD5x7tSnyIzhqx0+fxPxqbgw==
+ "integrity" "sha512-Pyv1ZL2u5AIOY4YbxFCAB5J1PEh5yON8ylbfiPiriDGGW6Uu1U3Y8lysMtWu+FUD5x7tSnyIzhqx0+fxPxqbgw=="
+ "resolved" "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-6.3.3.tgz"
+ "version" "6.3.3"
dependencies:
- conventional-changelog-angular "^5.0.0"
- conventional-commits-filter "^2.0.0"
- conventional-commits-parser "^3.0.7"
- debug "^4.0.0"
- import-from "^3.0.0"
- lodash "^4.17.4"
+ "conventional-changelog-angular" "^5.0.0"
+ "conventional-commits-filter" "^2.0.0"
+ "conventional-commits-parser" "^3.0.7"
+ "debug" "^4.0.0"
+ "import-from" "^3.0.0"
+ "lodash" "^4.17.4"
"@semantic-release/error@^2.2.0":
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/@semantic-release/error/-/error-2.2.0.tgz#ee9d5a09c9969eade1ec864776aeda5c5cddbbf0"
- integrity sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==
+ "integrity" "sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg=="
+ "resolved" "https://registry.npmjs.org/@semantic-release/error/-/error-2.2.0.tgz"
+ "version" "2.2.0"
"@semantic-release/github@^5.1.0":
- version "5.5.8"
- resolved "https://registry.yarnpkg.com/@semantic-release/github/-/github-5.5.8.tgz#2c16d212ca057ba0b0553b6eb62ff0949cfbca6a"
- integrity sha512-YxbBXbCThs/Xk3E4QU01AMIUM8eb0UTvjHJtclTDR3/DEW7kUpmXQqBMnSh3qCTuk4scRFIoaF0fGU/0xByZug==
+ "integrity" "sha512-YxbBXbCThs/Xk3E4QU01AMIUM8eb0UTvjHJtclTDR3/DEW7kUpmXQqBMnSh3qCTuk4scRFIoaF0fGU/0xByZug=="
+ "resolved" "https://registry.npmjs.org/@semantic-release/github/-/github-5.5.8.tgz"
+ "version" "5.5.8"
dependencies:
"@octokit/rest" "^16.27.0"
"@semantic-release/error" "^2.2.0"
- aggregate-error "^3.0.0"
- bottleneck "^2.18.1"
- debug "^4.0.0"
- dir-glob "^3.0.0"
- fs-extra "^8.0.0"
- globby "^10.0.0"
- http-proxy-agent "^3.0.0"
- https-proxy-agent "^4.0.0"
- issue-parser "^5.0.0"
- lodash "^4.17.4"
- mime "^2.4.3"
- p-filter "^2.0.0"
- p-retry "^4.0.0"
- url-join "^4.0.0"
+ "aggregate-error" "^3.0.0"
+ "bottleneck" "^2.18.1"
+ "debug" "^4.0.0"
+ "dir-glob" "^3.0.0"
+ "fs-extra" "^8.0.0"
+ "globby" "^10.0.0"
+ "http-proxy-agent" "^3.0.0"
+ "https-proxy-agent" "^4.0.0"
+ "issue-parser" "^5.0.0"
+ "lodash" "^4.17.4"
+ "mime" "^2.4.3"
+ "p-filter" "^2.0.0"
+ "p-retry" "^4.0.0"
+ "url-join" "^4.0.0"
"@semantic-release/npm@^5.0.5":
- version "5.3.5"
- resolved "https://registry.yarnpkg.com/@semantic-release/npm/-/npm-5.3.5.tgz#4a83952056d32e1401e1078c3910a159afc0cba8"
- integrity sha512-AOREQ6rUT8OAiqXvWCp0kMNjcdnLLq1JdP0voZL4l5zf6Tgs/65YA7ctP+9shthW01Ps85Nu0pILW3p9GkaYuw==
+ "integrity" "sha512-AOREQ6rUT8OAiqXvWCp0kMNjcdnLLq1JdP0voZL4l5zf6Tgs/65YA7ctP+9shthW01Ps85Nu0pILW3p9GkaYuw=="
+ "resolved" "https://registry.npmjs.org/@semantic-release/npm/-/npm-5.3.5.tgz"
+ "version" "5.3.5"
dependencies:
"@semantic-release/error" "^2.2.0"
- aggregate-error "^3.0.0"
- execa "^3.2.0"
- fs-extra "^8.0.0"
- lodash "^4.17.15"
- nerf-dart "^1.0.0"
- normalize-url "^4.0.0"
- npm "^6.10.3"
- rc "^1.2.8"
- read-pkg "^5.0.0"
- registry-auth-token "^4.0.0"
- tempy "^0.3.0"
+ "aggregate-error" "^3.0.0"
+ "execa" "^3.2.0"
+ "fs-extra" "^8.0.0"
+ "lodash" "^4.17.15"
+ "nerf-dart" "^1.0.0"
+ "normalize-url" "^4.0.0"
+ "npm" "^6.10.3"
+ "rc" "^1.2.8"
+ "read-pkg" "^5.0.0"
+ "registry-auth-token" "^4.0.0"
+ "tempy" "^0.3.0"
"@semantic-release/release-notes-generator@^7.1.2":
- version "7.3.5"
- resolved "https://registry.yarnpkg.com/@semantic-release/release-notes-generator/-/release-notes-generator-7.3.5.tgz#ed0941d5b594f18fa1d2667493c03e811f97c0ff"
- integrity sha512-LGjgPBGjjmjap/76O0Md3wc04Y7IlLnzZceLsAkcYRwGQdRPTTFUJKqDQTuieWTs7zfHzQoZqsqPfFxEN+g2+Q==
- dependencies:
- conventional-changelog-angular "^5.0.0"
- conventional-changelog-writer "^4.0.0"
- conventional-commits-filter "^2.0.0"
- conventional-commits-parser "^3.0.0"
- debug "^4.0.0"
- get-stream "^5.0.0"
- import-from "^3.0.0"
- into-stream "^5.0.0"
- lodash "^4.17.4"
- read-pkg-up "^7.0.0"
+ "integrity" "sha512-LGjgPBGjjmjap/76O0Md3wc04Y7IlLnzZceLsAkcYRwGQdRPTTFUJKqDQTuieWTs7zfHzQoZqsqPfFxEN+g2+Q=="
+ "resolved" "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-7.3.5.tgz"
+ "version" "7.3.5"
+ dependencies:
+ "conventional-changelog-angular" "^5.0.0"
+ "conventional-changelog-writer" "^4.0.0"
+ "conventional-commits-filter" "^2.0.0"
+ "conventional-commits-parser" "^3.0.0"
+ "debug" "^4.0.0"
+ "get-stream" "^5.0.0"
+ "import-from" "^3.0.0"
+ "into-stream" "^5.0.0"
+ "lodash" "^4.17.4"
+ "read-pkg-up" "^7.0.0"
"@softwarefactory-project/re-ansi@^0.5.0":
- version "0.5.0"
- resolved "https://registry.yarnpkg.com/@softwarefactory-project/re-ansi/-/re-ansi-0.5.0.tgz#25866af47aca67621e0210ba503899919827a905"
- integrity sha512-T9cfcra+auRq5oX3EtjzHlCN97FfrmPQpzlcl4G7WjNoNG5EouI3SkvUVxK6nAX+IQVO98INUejfOsbHcK4EZQ==
+ "integrity" "sha512-T9cfcra+auRq5oX3EtjzHlCN97FfrmPQpzlcl4G7WjNoNG5EouI3SkvUVxK6nAX+IQVO98INUejfOsbHcK4EZQ=="
+ "resolved" "https://registry.npmjs.org/@softwarefactory-project/re-ansi/-/re-ansi-0.5.0.tgz"
+ "version" "0.5.0"
dependencies:
- bs-platform "^8.2.0"
- reason-react "^0.9.1"
+ "bs-platform" "^8.2.0"
+ "reason-react" "^0.9.1"
"@svgr/babel-plugin-add-jsx-attribute@^4.2.0":
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz#dadcb6218503532d6884b210e7f3c502caaa44b1"
- integrity sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==
+ "integrity" "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig=="
+ "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz"
+ "version" "4.2.0"
"@svgr/babel-plugin-remove-jsx-attribute@^4.2.0":
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz#297550b9a8c0c7337bea12bdfc8a80bb66f85abc"
- integrity sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==
+ "integrity" "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ=="
+ "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz"
+ "version" "4.2.0"
"@svgr/babel-plugin-remove-jsx-empty-expression@^4.2.0":
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz#c196302f3e68eab6a05e98af9ca8570bc13131c7"
- integrity sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==
+ "integrity" "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w=="
+ "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz"
+ "version" "4.2.0"
"@svgr/babel-plugin-replace-jsx-attribute-value@^4.2.0":
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz#310ec0775de808a6a2e4fd4268c245fd734c1165"
- integrity sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==
+ "integrity" "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w=="
+ "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz"
+ "version" "4.2.0"
"@svgr/babel-plugin-svg-dynamic-title@^4.3.3":
- version "4.3.3"
- resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz#2cdedd747e5b1b29ed4c241e46256aac8110dd93"
- integrity sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==
+ "integrity" "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w=="
+ "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz"
+ "version" "4.3.3"
"@svgr/babel-plugin-svg-em-dimensions@^4.2.0":
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz#9a94791c9a288108d20a9d2cc64cac820f141391"
- integrity sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==
+ "integrity" "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w=="
+ "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz"
+ "version" "4.2.0"
"@svgr/babel-plugin-transform-react-native-svg@^4.2.0":
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz#151487322843359a1ca86b21a3815fd21a88b717"
- integrity sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==
+ "integrity" "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw=="
+ "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz"
+ "version" "4.2.0"
"@svgr/babel-plugin-transform-svg-component@^4.2.0":
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz#5f1e2f886b2c85c67e76da42f0f6be1b1767b697"
- integrity sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==
+ "integrity" "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw=="
+ "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz"
+ "version" "4.2.0"
"@svgr/babel-preset@^4.3.3":
- version "4.3.3"
- resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-4.3.3.tgz#a75d8c2f202ac0e5774e6bfc165d028b39a1316c"
- integrity sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==
+ "integrity" "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A=="
+ "resolved" "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz"
+ "version" "4.3.3"
dependencies:
"@svgr/babel-plugin-add-jsx-attribute" "^4.2.0"
"@svgr/babel-plugin-remove-jsx-attribute" "^4.2.0"
@@ -1726,44 +1766,44 @@
"@svgr/babel-plugin-transform-svg-component" "^4.2.0"
"@svgr/core@^4.3.3":
- version "4.3.3"
- resolved "https://registry.yarnpkg.com/@svgr/core/-/core-4.3.3.tgz#b37b89d5b757dc66e8c74156d00c368338d24293"
- integrity sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==
+ "integrity" "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w=="
+ "resolved" "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz"
+ "version" "4.3.3"
dependencies:
"@svgr/plugin-jsx" "^4.3.3"
- camelcase "^5.3.1"
- cosmiconfig "^5.2.1"
+ "camelcase" "^5.3.1"
+ "cosmiconfig" "^5.2.1"
"@svgr/hast-util-to-babel-ast@^4.3.2":
- version "4.3.2"
- resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz#1d5a082f7b929ef8f1f578950238f630e14532b8"
- integrity sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==
+ "integrity" "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg=="
+ "resolved" "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz"
+ "version" "4.3.2"
dependencies:
"@babel/types" "^7.4.4"
"@svgr/plugin-jsx@^4.3.3":
- version "4.3.3"
- resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz#e2ba913dbdfbe85252a34db101abc7ebd50992fa"
- integrity sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==
+ "integrity" "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w=="
+ "resolved" "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz"
+ "version" "4.3.3"
dependencies:
"@babel/core" "^7.4.5"
"@svgr/babel-preset" "^4.3.3"
"@svgr/hast-util-to-babel-ast" "^4.3.2"
- svg-parser "^2.0.0"
+ "svg-parser" "^2.0.0"
"@svgr/plugin-svgo@^4.3.1":
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz#daac0a3d872e3f55935c6588dd370336865e9e32"
- integrity sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==
+ "integrity" "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w=="
+ "resolved" "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz"
+ "version" "4.3.1"
dependencies:
- cosmiconfig "^5.2.1"
- merge-deep "^3.0.2"
- svgo "^1.2.2"
+ "cosmiconfig" "^5.2.1"
+ "merge-deep" "^3.0.2"
+ "svgo" "^1.2.2"
"@svgr/webpack@4.3.3":
- version "4.3.3"
- resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-4.3.3.tgz#13cc2423bf3dff2d494f16b17eb7eacb86895017"
- integrity sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==
+ "integrity" "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg=="
+ "resolved" "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz"
+ "version" "4.3.3"
dependencies:
"@babel/core" "^7.4.5"
"@babel/plugin-transform-react-constant-elements" "^7.0.0"
@@ -1772,19 +1812,19 @@
"@svgr/core" "^4.3.3"
"@svgr/plugin-jsx" "^4.3.3"
"@svgr/plugin-svgo" "^4.3.1"
- loader-utils "^1.2.3"
+ "loader-utils" "^1.2.3"
"@tim-lai/isomorphic-form-data@^1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@tim-lai/isomorphic-form-data/-/isomorphic-form-data-1.0.0.tgz#10e31c1c02ed4d1868721df5374820e047275c16"
- integrity sha512-ukWANS+8w3NCj4Qmnc4zo0XWcoqnDAiqaBXVdh/z6CPtOL+z6I13H3AKOdGzeAaPCeXRL3sPqaPgrSqEgtF8Xg==
+ "integrity" "sha512-ukWANS+8w3NCj4Qmnc4zo0XWcoqnDAiqaBXVdh/z6CPtOL+z6I13H3AKOdGzeAaPCeXRL3sPqaPgrSqEgtF8Xg=="
+ "resolved" "https://registry.npmjs.org/@tim-lai/isomorphic-form-data/-/isomorphic-form-data-1.0.0.tgz"
+ "version" "1.0.0"
dependencies:
- formdata-node "^2.1.1"
+ "formdata-node" "^2.1.1"
"@types/babel__core@^7.1.0":
- version "7.1.7"
- resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.7.tgz#1dacad8840364a57c98d0dd4855c6dd3752c6b89"
- integrity sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==
+ "integrity" "sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw=="
+ "resolved" "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz"
+ "version" "7.1.7"
dependencies:
"@babel/parser" "^7.1.0"
"@babel/types" "^7.0.0"
@@ -1793,214 +1833,214 @@
"@types/babel__traverse" "*"
"@types/babel__generator@*":
- version "7.6.1"
- resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04"
- integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==
+ "integrity" "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew=="
+ "resolved" "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz"
+ "version" "7.6.1"
dependencies:
"@babel/types" "^7.0.0"
"@types/babel__template@*":
- version "7.0.2"
- resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307"
- integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==
+ "integrity" "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg=="
+ "resolved" "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz"
+ "version" "7.0.2"
dependencies:
"@babel/parser" "^7.1.0"
"@babel/types" "^7.0.0"
"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6":
- version "7.0.11"
- resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.11.tgz#1ae3010e8bf8851d324878b42acec71986486d18"
- integrity sha512-ddHK5icION5U6q11+tV2f9Mo6CZVuT8GJKld2q9LqHSZbvLbH34Kcu2yFGckZut453+eQU6btIA3RihmnRgI+Q==
+ "integrity" "sha512-ddHK5icION5U6q11+tV2f9Mo6CZVuT8GJKld2q9LqHSZbvLbH34Kcu2yFGckZut453+eQU6btIA3RihmnRgI+Q=="
+ "resolved" "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.11.tgz"
+ "version" "7.0.11"
dependencies:
"@babel/types" "^7.3.0"
"@types/c3@^0.6.0":
- version "0.6.4"
- resolved "https://registry.yarnpkg.com/@types/c3/-/c3-0.6.4.tgz#449830da0e1a2fc4feceb87f97de7ee5965e183b"
- integrity sha512-W7i7oSmHsXYhseZJsIYexelv9HitGsWdQhx3mcy4NWso+GedpCYr02ghpkNvnZ4oTIjNeISdrOnM70s7HiuV+g==
+ "integrity" "sha512-W7i7oSmHsXYhseZJsIYexelv9HitGsWdQhx3mcy4NWso+GedpCYr02ghpkNvnZ4oTIjNeISdrOnM70s7HiuV+g=="
+ "resolved" "https://registry.npmjs.org/@types/c3/-/c3-0.6.4.tgz"
+ "version" "0.6.4"
dependencies:
"@types/d3" "^4"
"@types/color-name@^1.1.1":
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
- integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
+ "integrity" "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
+ "resolved" "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz"
+ "version" "1.1.1"
"@types/d3-array@^1":
- version "1.2.7"
- resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-1.2.7.tgz#34dc654d34fc058c41c31dbca1ed68071a8fcc17"
- integrity sha512-51vHWuUyDOi+8XuwPrTw3cFqyh2Slg9y8COYkRfjCPG9TfYqY0hoNPzv/8BrcAy0FeQBzqEo/D/8Nk2caOQJnA==
+ "integrity" "sha512-51vHWuUyDOi+8XuwPrTw3cFqyh2Slg9y8COYkRfjCPG9TfYqY0hoNPzv/8BrcAy0FeQBzqEo/D/8Nk2caOQJnA=="
+ "resolved" "https://registry.npmjs.org/@types/d3-array/-/d3-array-1.2.7.tgz"
+ "version" "1.2.7"
"@types/d3-axis@*":
- version "1.0.12"
- resolved "https://registry.yarnpkg.com/@types/d3-axis/-/d3-axis-1.0.12.tgz#8c124edfcc02f3b3a9cdaa2a28b8a20341401799"
- integrity sha512-BZISgSD5M8TgURyNtcPAmUB9sk490CO1Thb6/gIn0WZTt3Y50IssX+2Z0vTccoqZksUDTep0b+o4ofXslvNbqg==
+ "integrity" "sha512-BZISgSD5M8TgURyNtcPAmUB9sk490CO1Thb6/gIn0WZTt3Y50IssX+2Z0vTccoqZksUDTep0b+o4ofXslvNbqg=="
+ "resolved" "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-1.0.12.tgz"
+ "version" "1.0.12"
dependencies:
"@types/d3-selection" "*"
"@types/d3-brush@*":
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/@types/d3-brush/-/d3-brush-1.1.0.tgz#3f1f01aa3d4d70aff2a358c49dd3295be10d774c"
- integrity sha512-yz5Y94XpUARimOlLk+RWM1cZh1FrtmSGOyDQfCArsMa6kAnhjF3EserSTDnHAuVuNATMoTIOPHa7pjG2iTkPYA==
+ "integrity" "sha512-yz5Y94XpUARimOlLk+RWM1cZh1FrtmSGOyDQfCArsMa6kAnhjF3EserSTDnHAuVuNATMoTIOPHa7pjG2iTkPYA=="
+ "resolved" "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-1.1.0.tgz"
+ "version" "1.1.0"
dependencies:
"@types/d3-selection" "*"
"@types/d3-chord@*":
- version "1.0.9"
- resolved "https://registry.yarnpkg.com/@types/d3-chord/-/d3-chord-1.0.9.tgz#ccc5de03ff079025491b7aa6b750670a140b45ae"
- integrity sha512-UA6lI9CVW5cT5Ku/RV4hxoFn4mKySHm7HEgodtfRthAj1lt9rKZEPon58vyYfk+HIAm33DtJJgZwMXy2QgyPXw==
+ "integrity" "sha512-UA6lI9CVW5cT5Ku/RV4hxoFn4mKySHm7HEgodtfRthAj1lt9rKZEPon58vyYfk+HIAm33DtJJgZwMXy2QgyPXw=="
+ "resolved" "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-1.0.9.tgz"
+ "version" "1.0.9"
"@types/d3-collection@*":
- version "1.0.8"
- resolved "https://registry.yarnpkg.com/@types/d3-collection/-/d3-collection-1.0.8.tgz#aa9552c570a96e33c132e0fd20e331f64baa9dd5"
- integrity sha512-y5lGlazdc0HNO0F3UUX2DPE7OmYvd9Kcym4hXwrJcNUkDaypR5pX+apuMikl9LfTxKItJsY9KYvzBulpCKyvuQ==
+ "integrity" "sha512-y5lGlazdc0HNO0F3UUX2DPE7OmYvd9Kcym4hXwrJcNUkDaypR5pX+apuMikl9LfTxKItJsY9KYvzBulpCKyvuQ=="
+ "resolved" "https://registry.npmjs.org/@types/d3-collection/-/d3-collection-1.0.8.tgz"
+ "version" "1.0.8"
"@types/d3-color@*":
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-1.2.2.tgz#80cf7cfff7401587b8f89307ba36fe4a576bc7cf"
- integrity sha512-6pBxzJ8ZP3dYEQ4YjQ+NVbQaOflfgXq/JbDiS99oLobM2o72uAST4q6yPxHv6FOTCRC/n35ktuo8pvw/S4M7sw==
+ "integrity" "sha512-6pBxzJ8ZP3dYEQ4YjQ+NVbQaOflfgXq/JbDiS99oLobM2o72uAST4q6yPxHv6FOTCRC/n35ktuo8pvw/S4M7sw=="
+ "resolved" "https://registry.npmjs.org/@types/d3-color/-/d3-color-1.2.2.tgz"
+ "version" "1.2.2"
"@types/d3-dispatch@*":
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-1.0.7.tgz#6721aefbb9862ce78c20a87a1490c21f57c3ed7f"
- integrity sha512-M+z84G7UKwK6hEPnGCSccOg8zJ3Nk2hgDQ9sCstHXgsFU0sMxlIZVKqKB5oxUDbALqQG6ucg0G9e8cmOSlishg==
+ "integrity" "sha512-M+z84G7UKwK6hEPnGCSccOg8zJ3Nk2hgDQ9sCstHXgsFU0sMxlIZVKqKB5oxUDbALqQG6ucg0G9e8cmOSlishg=="
+ "resolved" "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-1.0.7.tgz"
+ "version" "1.0.7"
"@types/d3-drag@*":
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/@types/d3-drag/-/d3-drag-1.2.3.tgz#d8ddccca28e939e9c689bea6f40a937e48c39051"
- integrity sha512-rWB5SPvkYVxW3sqUxHOJUZwifD0KqvKwvt1bhNqcLpW6Azsd0BJgRNcyVW8GAferaAk5r8dzeZnf9zKlg9+xMQ==
+ "integrity" "sha512-rWB5SPvkYVxW3sqUxHOJUZwifD0KqvKwvt1bhNqcLpW6Azsd0BJgRNcyVW8GAferaAk5r8dzeZnf9zKlg9+xMQ=="
+ "resolved" "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-1.2.3.tgz"
+ "version" "1.2.3"
dependencies:
"@types/d3-selection" "*"
"@types/d3-dsv@*":
- version "1.0.36"
- resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-1.0.36.tgz#e91129d7c02b1b814838d001e921e8b9a67153d0"
- integrity sha512-jbIWQ27QJcBNMZbQv0NSQMHnBDCmxghAxePxgyiPH1XPCRkOsTBei7jcdi3fDrUCGpCV3lKrSZFSlOkhUQVClA==
+ "integrity" "sha512-jbIWQ27QJcBNMZbQv0NSQMHnBDCmxghAxePxgyiPH1XPCRkOsTBei7jcdi3fDrUCGpCV3lKrSZFSlOkhUQVClA=="
+ "resolved" "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-1.0.36.tgz"
+ "version" "1.0.36"
"@types/d3-ease@*":
- version "1.0.9"
- resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-1.0.9.tgz#1dd849bd7edef6426e915e220ed9970db5ea4e04"
- integrity sha512-U5ADevQ+W6fy32FVZZC9EXallcV/Mi12A5Tkd0My5MrC7T8soMQEhlDAg88XUWm0zoCQlB4XV0en/24LvuDB4Q==
+ "integrity" "sha512-U5ADevQ+W6fy32FVZZC9EXallcV/Mi12A5Tkd0My5MrC7T8soMQEhlDAg88XUWm0zoCQlB4XV0en/24LvuDB4Q=="
+ "resolved" "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-1.0.9.tgz"
+ "version" "1.0.9"
"@types/d3-force@*":
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-1.2.1.tgz#c28803ea36fe29788db69efa0ad6c2dc09544e83"
- integrity sha512-jqK+I36uz4kTBjyk39meed5y31Ab+tXYN/x1dn3nZEus9yOHCLc+VrcIYLc/aSQ0Y7tMPRlIhLetulME76EiiA==
+ "integrity" "sha512-jqK+I36uz4kTBjyk39meed5y31Ab+tXYN/x1dn3nZEus9yOHCLc+VrcIYLc/aSQ0Y7tMPRlIhLetulME76EiiA=="
+ "resolved" "https://registry.npmjs.org/@types/d3-force/-/d3-force-1.2.1.tgz"
+ "version" "1.2.1"
"@types/d3-format@*":
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-1.3.1.tgz#35bf88264bd6bcda39251165bb827f67879c4384"
- integrity sha512-KAWvReOKMDreaAwOjdfQMm0HjcUMlQG47GwqdVKgmm20vTd2pucj0a70c3gUSHrnsmo6H2AMrkBsZU2UhJLq8A==
+ "integrity" "sha512-KAWvReOKMDreaAwOjdfQMm0HjcUMlQG47GwqdVKgmm20vTd2pucj0a70c3gUSHrnsmo6H2AMrkBsZU2UhJLq8A=="
+ "resolved" "https://registry.npmjs.org/@types/d3-format/-/d3-format-1.3.1.tgz"
+ "version" "1.3.1"
"@types/d3-geo@*":
- version "1.11.1"
- resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-1.11.1.tgz#e96ec91f16221d87507fec66b2cc889f52d2493e"
- integrity sha512-Ox8WWOG3igDRoep/dNsGbOiSJYdUG3ew/6z0ETvHyAtXZVBjOE0S96zSSmzgl0gqQ3RdZjn2eeJOj9oRcMZPkQ==
+ "integrity" "sha512-Ox8WWOG3igDRoep/dNsGbOiSJYdUG3ew/6z0ETvHyAtXZVBjOE0S96zSSmzgl0gqQ3RdZjn2eeJOj9oRcMZPkQ=="
+ "resolved" "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-1.11.1.tgz"
+ "version" "1.11.1"
dependencies:
"@types/geojson" "*"
"@types/d3-hierarchy@*":
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-1.1.6.tgz#4c017521900813ea524c9ecb8d7985ec26a9ad9a"
- integrity sha512-vvSaIDf/Ov0o3KwMT+1M8+WbnnlRiGjlGD5uvk83a1mPCTd/E5x12bUJ/oP55+wUY/4Kb5kc67rVpVGJ2KUHxg==
+ "integrity" "sha512-vvSaIDf/Ov0o3KwMT+1M8+WbnnlRiGjlGD5uvk83a1mPCTd/E5x12bUJ/oP55+wUY/4Kb5kc67rVpVGJ2KUHxg=="
+ "resolved" "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.6.tgz"
+ "version" "1.1.6"
"@types/d3-interpolate@*":
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-1.3.1.tgz#1c280511f622de9b0b47d463fa55f9a4fd6f5fc8"
- integrity sha512-z8Zmi08XVwe8e62vP6wcA+CNuRhpuUU5XPEfqpG0hRypDE5BWNthQHB1UNWWDB7ojCbGaN4qBdsWp5kWxhT1IQ==
+ "integrity" "sha512-z8Zmi08XVwe8e62vP6wcA+CNuRhpuUU5XPEfqpG0hRypDE5BWNthQHB1UNWWDB7ojCbGaN4qBdsWp5kWxhT1IQ=="
+ "resolved" "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-1.3.1.tgz"
+ "version" "1.3.1"
dependencies:
"@types/d3-color" "*"
"@types/d3-path@*":
- version "1.0.8"
- resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-1.0.8.tgz#48e6945a8ff43ee0a1ce85c8cfa2337de85c7c79"
- integrity sha512-AZGHWslq/oApTAHu9+yH/Bnk63y9oFOMROtqPAtxl5uB6qm1x2lueWdVEjsjjV3Qc2+QfuzKIwIR5MvVBakfzA==
+ "integrity" "sha512-AZGHWslq/oApTAHu9+yH/Bnk63y9oFOMROtqPAtxl5uB6qm1x2lueWdVEjsjjV3Qc2+QfuzKIwIR5MvVBakfzA=="
+ "resolved" "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.8.tgz"
+ "version" "1.0.8"
"@types/d3-polygon@*":
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/@types/d3-polygon/-/d3-polygon-1.0.7.tgz#7b3947aa2d48287ff535230d3d396668ab17bfdf"
- integrity sha512-Xuw0eSjQQKs8jTiNbntWH0S+Xp+JyhqxmQ0YAQ3rDu6c3kKMFfgsaGN7Jv5u3zG6yVX/AsLP/Xs/QRjmi9g43Q==
+ "integrity" "sha512-Xuw0eSjQQKs8jTiNbntWH0S+Xp+JyhqxmQ0YAQ3rDu6c3kKMFfgsaGN7Jv5u3zG6yVX/AsLP/Xs/QRjmi9g43Q=="
+ "resolved" "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-1.0.7.tgz"
+ "version" "1.0.7"
"@types/d3-quadtree@*":
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-1.0.7.tgz#8e29464ff5b326f6612c1428d9362b4b35de2b70"
- integrity sha512-0ajFawWicfjsaCLh6NzxOyVDYhQAmMFbsiI3MPGLInorauHFEh9/Cl6UHNf+kt/J1jfoxKY/ZJaKAoDpbvde5Q==
+ "integrity" "sha512-0ajFawWicfjsaCLh6NzxOyVDYhQAmMFbsiI3MPGLInorauHFEh9/Cl6UHNf+kt/J1jfoxKY/ZJaKAoDpbvde5Q=="
+ "resolved" "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-1.0.7.tgz"
+ "version" "1.0.7"
"@types/d3-queue@*":
- version "3.0.8"
- resolved "https://registry.yarnpkg.com/@types/d3-queue/-/d3-queue-3.0.8.tgz#fad6212f14f34a549fc67144e354f032fb25a447"
- integrity sha512-1FWOiI/MYwS5Z1Sa9EvS1Xet3isiVIIX5ozD6iGnwHonGcqL+RcC1eThXN5VfDmAiYt9Me9EWNEv/9J9k9RIKQ==
+ "integrity" "sha512-1FWOiI/MYwS5Z1Sa9EvS1Xet3isiVIIX5ozD6iGnwHonGcqL+RcC1eThXN5VfDmAiYt9Me9EWNEv/9J9k9RIKQ=="
+ "resolved" "https://registry.npmjs.org/@types/d3-queue/-/d3-queue-3.0.8.tgz"
+ "version" "3.0.8"
"@types/d3-random@*":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-1.1.2.tgz#6f77e8b7bb64ac393f92d33fe8f71038bc4f3cde"
- integrity sha512-Jui+Zn28pQw/3EayPKaN4c/PqTvqNbIPjHkgIIFnxne1FdwNjfHtAIsZIBMKlquQNrrMjFzCrlF2gPs3xckqaA==
+ "integrity" "sha512-Jui+Zn28pQw/3EayPKaN4c/PqTvqNbIPjHkgIIFnxne1FdwNjfHtAIsZIBMKlquQNrrMjFzCrlF2gPs3xckqaA=="
+ "resolved" "https://registry.npmjs.org/@types/d3-random/-/d3-random-1.1.2.tgz"
+ "version" "1.1.2"
"@types/d3-request@*":
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/@types/d3-request/-/d3-request-1.0.5.tgz#a2717ab95cd1e504662f52802aff1476af38cce4"
- integrity sha512-X+/c/qXp92o056C5Qbcp7jL27YRHpmIqOchHb/WB7NwFFqkBtAircqO7oKWv2GTtX4LyEqiDF9gqXsV+ldOlIg==
+ "integrity" "sha512-X+/c/qXp92o056C5Qbcp7jL27YRHpmIqOchHb/WB7NwFFqkBtAircqO7oKWv2GTtX4LyEqiDF9gqXsV+ldOlIg=="
+ "resolved" "https://registry.npmjs.org/@types/d3-request/-/d3-request-1.0.5.tgz"
+ "version" "1.0.5"
dependencies:
"@types/d3-dsv" "*"
"@types/d3-scale@^1":
- version "1.0.14"
- resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-1.0.14.tgz#4544e4eb61e3712dacaba9dd8910e745bb7a9840"
- integrity sha512-dW6Ii8bH+10klJzVVPPeeQvRpCbX3BO3x9cLTngu/+lXNDbk2uC51aFAA/XhocehZroaG5ajwAFelMFsgpClMg==
+ "integrity" "sha512-dW6Ii8bH+10klJzVVPPeeQvRpCbX3BO3x9cLTngu/+lXNDbk2uC51aFAA/XhocehZroaG5ajwAFelMFsgpClMg=="
+ "resolved" "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-1.0.14.tgz"
+ "version" "1.0.14"
dependencies:
"@types/d3-time" "*"
"@types/d3-selection@*":
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-1.4.1.tgz#fa1f8710a6b5d7cfe5c6caa61d161be7cae4a022"
- integrity sha512-bv8IfFYo/xG6dxri9OwDnK3yCagYPeRIjTlrcdYJSx+FDWlCeBDepIHUpqROmhPtZ53jyna0aUajZRk0I3rXNA==
+ "integrity" "sha512-bv8IfFYo/xG6dxri9OwDnK3yCagYPeRIjTlrcdYJSx+FDWlCeBDepIHUpqROmhPtZ53jyna0aUajZRk0I3rXNA=="
+ "resolved" "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.4.1.tgz"
+ "version" "1.4.1"
"@types/d3-shape@*":
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-1.3.2.tgz#a41d9d6b10d02e221696b240caf0b5d0f5a588ec"
- integrity sha512-LtD8EaNYCaBRzHzaAiIPrfcL3DdIysc81dkGlQvv7WQP3+YXV7b0JJTtR1U3bzeRieS603KF4wUo+ZkJVenh8w==
+ "integrity" "sha512-LtD8EaNYCaBRzHzaAiIPrfcL3DdIysc81dkGlQvv7WQP3+YXV7b0JJTtR1U3bzeRieS603KF4wUo+ZkJVenh8w=="
+ "resolved" "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.2.tgz"
+ "version" "1.3.2"
dependencies:
"@types/d3-path" "*"
"@types/d3-time-format@*":
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-2.1.1.tgz#dd2c79ec4575f1355484ab6b10407824668eba42"
- integrity sha512-tJSyXta8ZyJ52wDDHA96JEsvkbL6jl7wowGmuf45+fAkj5Y+SQOnz0N7/H68OWmPshPsAaWMQh+GAws44IzH3g==
+ "integrity" "sha512-tJSyXta8ZyJ52wDDHA96JEsvkbL6jl7wowGmuf45+fAkj5Y+SQOnz0N7/H68OWmPshPsAaWMQh+GAws44IzH3g=="
+ "resolved" "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.1.1.tgz"
+ "version" "2.1.1"
"@types/d3-time@*":
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-1.0.10.tgz#d338c7feac93a98a32aac875d1100f92c7b61f4f"
- integrity sha512-aKf62rRQafDQmSiv1NylKhIMmznsjRN+MnXRXTqHoqm0U/UZzVpdrtRnSIfdiLS616OuC1soYeX1dBg2n1u8Xw==
+ "integrity" "sha512-aKf62rRQafDQmSiv1NylKhIMmznsjRN+MnXRXTqHoqm0U/UZzVpdrtRnSIfdiLS616OuC1soYeX1dBg2n1u8Xw=="
+ "resolved" "https://registry.npmjs.org/@types/d3-time/-/d3-time-1.0.10.tgz"
+ "version" "1.0.10"
"@types/d3-timer@*":
- version "1.0.9"
- resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-1.0.9.tgz#aed1bde0cf18920d33f5d44839d73de393633fd3"
- integrity sha512-WvfJ3LFxBbWjqRGz9n7GJt08RrTHPJDVsIwwoCMROlqF+iDacYiAFjf9oqnq0mXpb2juA2N/qjKP+MKdal3YNQ==
+ "integrity" "sha512-WvfJ3LFxBbWjqRGz9n7GJt08RrTHPJDVsIwwoCMROlqF+iDacYiAFjf9oqnq0mXpb2juA2N/qjKP+MKdal3YNQ=="
+ "resolved" "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-1.0.9.tgz"
+ "version" "1.0.9"
"@types/d3-transition@*":
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-1.1.6.tgz#7e52da29749d874866cc803fad13925713a372da"
- integrity sha512-/F+O2r4oz4G9ATIH3cuSCMGphAnl7VDx7SbENEK0NlI/FE8Jx2oiIrv0uTrpg7yF/AmuWbqp7AGdEHAPIh24Gg==
+ "integrity" "sha512-/F+O2r4oz4G9ATIH3cuSCMGphAnl7VDx7SbENEK0NlI/FE8Jx2oiIrv0uTrpg7yF/AmuWbqp7AGdEHAPIh24Gg=="
+ "resolved" "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-1.1.6.tgz"
+ "version" "1.1.6"
dependencies:
"@types/d3-selection" "*"
"@types/d3-voronoi@*":
- version "1.1.9"
- resolved "https://registry.yarnpkg.com/@types/d3-voronoi/-/d3-voronoi-1.1.9.tgz#7bbc210818a3a5c5e0bafb051420df206617c9e5"
- integrity sha512-DExNQkaHd1F3dFPvGA/Aw2NGyjMln6E9QzsiqOcBgnE+VInYnFBHBBySbZQts6z6xD+5jTfKCP7M4OqMyVjdwQ==
+ "integrity" "sha512-DExNQkaHd1F3dFPvGA/Aw2NGyjMln6E9QzsiqOcBgnE+VInYnFBHBBySbZQts6z6xD+5jTfKCP7M4OqMyVjdwQ=="
+ "resolved" "https://registry.npmjs.org/@types/d3-voronoi/-/d3-voronoi-1.1.9.tgz"
+ "version" "1.1.9"
"@types/d3-zoom@*":
- version "1.7.4"
- resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-1.7.4.tgz#9226ffd2bd3846ec0e4a4e2bff211612d3aafad5"
- integrity sha512-5jnFo/itYhJeB2khO/lKe730kW/h2EbKMOvY0uNp3+7NdPm4w63DwPEMxifQZ7n902xGYK5DdU67FmToSoy4VA==
+ "integrity" "sha512-5jnFo/itYhJeB2khO/lKe730kW/h2EbKMOvY0uNp3+7NdPm4w63DwPEMxifQZ7n902xGYK5DdU67FmToSoy4VA=="
+ "resolved" "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-1.7.4.tgz"
+ "version" "1.7.4"
dependencies:
"@types/d3-interpolate" "*"
"@types/d3-selection" "*"
"@types/d3@^4":
- version "4.13.2"
- resolved "https://registry.yarnpkg.com/@types/d3/-/d3-4.13.2.tgz#c3db6ed6f6b07dde404fc3f43ee463ef5207ec8f"
- integrity sha512-jaMix9nFUgLeBSdU0md3usx5BaZfnO9Z0idyRmEq7mo7Ux7FpenW1SvyLXI0e59BtrgyPGNHMaZ0y2rJcSCMiw==
+ "integrity" "sha512-jaMix9nFUgLeBSdU0md3usx5BaZfnO9Z0idyRmEq7mo7Ux7FpenW1SvyLXI0e59BtrgyPGNHMaZ0y2rJcSCMiw=="
+ "resolved" "https://registry.npmjs.org/@types/d3/-/d3-4.13.2.tgz"
+ "version" "4.13.2"
dependencies:
"@types/d3-array" "^1"
"@types/d3-axis" "*"
@@ -2034,222 +2074,222 @@
"@types/d3-zoom" "*"
"@types/eslint-visitor-keys@^1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d"
- integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==
+ "integrity" "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag=="
+ "resolved" "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz"
+ "version" "1.0.0"
"@types/events@*":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7"
- integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==
+ "integrity" "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g=="
+ "resolved" "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz"
+ "version" "3.0.0"
"@types/geojson@*":
- version "7946.0.7"
- resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.7.tgz#c8fa532b60a0042219cdf173ca21a975ef0666ad"
- integrity sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ==
+ "integrity" "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ=="
+ "resolved" "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz"
+ "version" "7946.0.7"
"@types/glob@^7.1.1":
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575"
- integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==
+ "integrity" "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w=="
+ "resolved" "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz"
+ "version" "7.1.1"
dependencies:
"@types/events" "*"
"@types/minimatch" "*"
"@types/node" "*"
"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0":
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.2.tgz#79d7a78bad4219f4c03d6557a1c72d9ca6ba62d5"
- integrity sha512-rsZg7eL+Xcxsxk2XlBt9KcG8nOp9iYdKCOikY9x2RFJCyOdNj4MKPQty0e8oZr29vVAzKXr1BmR+kZauti3o1w==
+ "integrity" "sha512-rsZg7eL+Xcxsxk2XlBt9KcG8nOp9iYdKCOikY9x2RFJCyOdNj4MKPQty0e8oZr29vVAzKXr1BmR+kZauti3o1w=="
+ "resolved" "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.2.tgz"
+ "version" "2.0.2"
"@types/istanbul-lib-report@*":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686"
- integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==
+ "integrity" "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg=="
+ "resolved" "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz"
+ "version" "3.0.0"
dependencies:
"@types/istanbul-lib-coverage" "*"
"@types/istanbul-reports@^1.1.1":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2"
- integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==
+ "integrity" "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw=="
+ "resolved" "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz"
+ "version" "1.1.2"
dependencies:
"@types/istanbul-lib-coverage" "*"
"@types/istanbul-lib-report" "*"
"@types/json-schema@^7.0.3":
- version "7.0.4"
- resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339"
- integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==
+ "integrity" "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA=="
+ "resolved" "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz"
+ "version" "7.0.4"
"@types/minimatch@*":
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
- integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
+ "integrity" "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA=="
+ "resolved" "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz"
+ "version" "3.0.3"
"@types/minimist@^1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6"
- integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=
+ "integrity" "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY="
+ "resolved" "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz"
+ "version" "1.2.0"
"@types/node@*", "@types/node@>= 8":
- version "14.0.4"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.4.tgz#43a63fc5edce226bed106b31b875165256271107"
- integrity sha512-k3NqigXWRzQZVBDS5D1U70A5E8Qk4Kh+Ha/x4M8Bt9pF0X05eggfnC9+63Usc9Q928hRUIpIhTQaXsZwZBl4Ew==
+ "integrity" "sha512-k3NqigXWRzQZVBDS5D1U70A5E8Qk4Kh+Ha/x4M8Bt9pF0X05eggfnC9+63Usc9Q928hRUIpIhTQaXsZwZBl4Ew=="
+ "resolved" "https://registry.npmjs.org/@types/node/-/node-14.0.4.tgz"
+ "version" "14.0.4"
"@types/normalize-package-data@^2.4.0":
- version "2.4.0"
- resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e"
- integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==
+ "integrity" "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA=="
+ "resolved" "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz"
+ "version" "2.4.0"
"@types/parse-json@^4.0.0":
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
- integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+ "integrity" "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
+ "resolved" "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz"
+ "version" "4.0.0"
"@types/prop-types@*":
- version "15.7.3"
- resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7"
- integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==
+ "integrity" "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw=="
+ "resolved" "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz"
+ "version" "15.7.3"
"@types/q@^1.5.1":
- version "1.5.4"
- resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24"
- integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==
-
-"@types/react@16.4.6":
- version "16.4.6"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-16.4.6.tgz#5024957c6bcef4f02823accf5974faba2e54fada"
- integrity sha512-9LDZdhsuKSc+DjY65SjBkA958oBWcTWSVWAd2cD9XqKBjhGw1KzAkRhWRw2eIsXvaIE/TOTjjKMFVC+JA1iU4g==
- dependencies:
- csstype "^2.2.0"
+ "integrity" "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug=="
+ "resolved" "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz"
+ "version" "1.5.4"
"@types/react@^16.9.11":
- version "16.9.35"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.35.tgz#a0830d172e8aadd9bd41709ba2281a3124bbd368"
- integrity sha512-q0n0SsWcGc8nDqH2GJfWQWUOmZSJhXV64CjVN5SvcNti3TdEaA3AH0D8DwNmMdzjMAC/78tB8nAZIlV8yTz+zQ==
+ "integrity" "sha512-q0n0SsWcGc8nDqH2GJfWQWUOmZSJhXV64CjVN5SvcNti3TdEaA3AH0D8DwNmMdzjMAC/78tB8nAZIlV8yTz+zQ=="
+ "resolved" "https://registry.npmjs.org/@types/react/-/react-16.9.35.tgz"
+ "version" "16.9.35"
dependencies:
"@types/prop-types" "*"
- csstype "^2.2.0"
+ "csstype" "^2.2.0"
+
+"@types/react@16.4.6":
+ "integrity" "sha512-9LDZdhsuKSc+DjY65SjBkA958oBWcTWSVWAd2cD9XqKBjhGw1KzAkRhWRw2eIsXvaIE/TOTjjKMFVC+JA1iU4g=="
+ "resolved" "https://registry.npmjs.org/@types/react/-/react-16.4.6.tgz"
+ "version" "16.4.6"
+ dependencies:
+ "csstype" "^2.2.0"
"@types/retry@^0.12.0":
- version "0.12.0"
- resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d"
- integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==
+ "integrity" "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA=="
+ "resolved" "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz"
+ "version" "0.12.0"
"@types/stack-utils@^1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e"
- integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==
+ "integrity" "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw=="
+ "resolved" "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz"
+ "version" "1.0.1"
"@types/yargs-parser@*":
- version "15.0.0"
- resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d"
- integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==
+ "integrity" "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw=="
+ "resolved" "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz"
+ "version" "15.0.0"
"@types/yargs@^13.0.0":
- version "13.0.9"
- resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.9.tgz#44028e974343c7afcf3960f1a2b1099c39a7b5e1"
- integrity sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==
+ "integrity" "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg=="
+ "resolved" "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz"
+ "version" "13.0.9"
dependencies:
"@types/yargs-parser" "*"
-"@typescript-eslint/eslint-plugin@^2.10.0":
- version "2.34.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9"
- integrity sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==
+"@typescript-eslint/eslint-plugin@^2.10.0", "@typescript-eslint/eslint-plugin@2.x":
+ "integrity" "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ=="
+ "resolved" "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz"
+ "version" "2.34.0"
dependencies:
"@typescript-eslint/experimental-utils" "2.34.0"
- functional-red-black-tree "^1.0.1"
- regexpp "^3.0.0"
- tsutils "^3.17.1"
+ "functional-red-black-tree" "^1.0.1"
+ "regexpp" "^3.0.0"
+ "tsutils" "^3.17.1"
-"@typescript-eslint/experimental-utils@2.34.0", "@typescript-eslint/experimental-utils@^2.5.0":
- version "2.34.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f"
- integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==
+"@typescript-eslint/experimental-utils@^2.5.0", "@typescript-eslint/experimental-utils@2.34.0":
+ "integrity" "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA=="
+ "resolved" "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz"
+ "version" "2.34.0"
dependencies:
"@types/json-schema" "^7.0.3"
"@typescript-eslint/typescript-estree" "2.34.0"
- eslint-scope "^5.0.0"
- eslint-utils "^2.0.0"
+ "eslint-scope" "^5.0.0"
+ "eslint-utils" "^2.0.0"
-"@typescript-eslint/parser@^2.10.0":
- version "2.34.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8"
- integrity sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==
+"@typescript-eslint/parser@^2.0.0", "@typescript-eslint/parser@^2.10.0", "@typescript-eslint/parser@2.x":
+ "integrity" "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA=="
+ "resolved" "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz"
+ "version" "2.34.0"
dependencies:
"@types/eslint-visitor-keys" "^1.0.0"
"@typescript-eslint/experimental-utils" "2.34.0"
"@typescript-eslint/typescript-estree" "2.34.0"
- eslint-visitor-keys "^1.1.0"
+ "eslint-visitor-keys" "^1.1.0"
"@typescript-eslint/typescript-estree@2.34.0":
- version "2.34.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5"
- integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==
- dependencies:
- debug "^4.1.1"
- eslint-visitor-keys "^1.1.0"
- glob "^7.1.6"
- is-glob "^4.0.1"
- lodash "^4.17.15"
- semver "^7.3.2"
- tsutils "^3.17.1"
+ "integrity" "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg=="
+ "resolved" "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz"
+ "version" "2.34.0"
+ dependencies:
+ "debug" "^4.1.1"
+ "eslint-visitor-keys" "^1.1.0"
+ "glob" "^7.1.6"
+ "is-glob" "^4.0.1"
+ "lodash" "^4.17.15"
+ "semver" "^7.3.2"
+ "tsutils" "^3.17.1"
"@webassemblyjs/ast@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359"
- integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==
+ "integrity" "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ=="
+ "resolved" "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz"
+ "version" "1.8.5"
dependencies:
"@webassemblyjs/helper-module-context" "1.8.5"
"@webassemblyjs/helper-wasm-bytecode" "1.8.5"
"@webassemblyjs/wast-parser" "1.8.5"
"@webassemblyjs/floating-point-hex-parser@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721"
- integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==
+ "integrity" "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ=="
+ "resolved" "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz"
+ "version" "1.8.5"
"@webassemblyjs/helper-api-error@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7"
- integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==
+ "integrity" "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA=="
+ "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz"
+ "version" "1.8.5"
"@webassemblyjs/helper-buffer@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204"
- integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==
+ "integrity" "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q=="
+ "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz"
+ "version" "1.8.5"
"@webassemblyjs/helper-code-frame@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e"
- integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==
+ "integrity" "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ=="
+ "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz"
+ "version" "1.8.5"
dependencies:
"@webassemblyjs/wast-printer" "1.8.5"
"@webassemblyjs/helper-fsm@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452"
- integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==
+ "integrity" "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow=="
+ "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz"
+ "version" "1.8.5"
"@webassemblyjs/helper-module-context@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245"
- integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==
+ "integrity" "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g=="
+ "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz"
+ "version" "1.8.5"
dependencies:
"@webassemblyjs/ast" "1.8.5"
- mamacro "^0.0.3"
+ "mamacro" "^0.0.3"
"@webassemblyjs/helper-wasm-bytecode@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61"
- integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==
+ "integrity" "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ=="
+ "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz"
+ "version" "1.8.5"
"@webassemblyjs/helper-wasm-section@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf"
- integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==
+ "integrity" "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA=="
+ "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz"
+ "version" "1.8.5"
dependencies:
"@webassemblyjs/ast" "1.8.5"
"@webassemblyjs/helper-buffer" "1.8.5"
@@ -2257,28 +2297,28 @@
"@webassemblyjs/wasm-gen" "1.8.5"
"@webassemblyjs/ieee754@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e"
- integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==
+ "integrity" "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g=="
+ "resolved" "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz"
+ "version" "1.8.5"
dependencies:
"@xtuc/ieee754" "^1.2.0"
"@webassemblyjs/leb128@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10"
- integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==
+ "integrity" "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A=="
+ "resolved" "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz"
+ "version" "1.8.5"
dependencies:
"@xtuc/long" "4.2.2"
"@webassemblyjs/utf8@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc"
- integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==
+ "integrity" "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw=="
+ "resolved" "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz"
+ "version" "1.8.5"
"@webassemblyjs/wasm-edit@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a"
- integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==
+ "integrity" "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q=="
+ "resolved" "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz"
+ "version" "1.8.5"
dependencies:
"@webassemblyjs/ast" "1.8.5"
"@webassemblyjs/helper-buffer" "1.8.5"
@@ -2290,9 +2330,9 @@
"@webassemblyjs/wast-printer" "1.8.5"
"@webassemblyjs/wasm-gen@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc"
- integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==
+ "integrity" "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg=="
+ "resolved" "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz"
+ "version" "1.8.5"
dependencies:
"@webassemblyjs/ast" "1.8.5"
"@webassemblyjs/helper-wasm-bytecode" "1.8.5"
@@ -2301,9 +2341,9 @@
"@webassemblyjs/utf8" "1.8.5"
"@webassemblyjs/wasm-opt@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264"
- integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==
+ "integrity" "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q=="
+ "resolved" "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz"
+ "version" "1.8.5"
dependencies:
"@webassemblyjs/ast" "1.8.5"
"@webassemblyjs/helper-buffer" "1.8.5"
@@ -2311,9 +2351,9 @@
"@webassemblyjs/wasm-parser" "1.8.5"
"@webassemblyjs/wasm-parser@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d"
- integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==
+ "integrity" "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw=="
+ "resolved" "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz"
+ "version" "1.8.5"
dependencies:
"@webassemblyjs/ast" "1.8.5"
"@webassemblyjs/helper-api-error" "1.8.5"
@@ -2323,9 +2363,9 @@
"@webassemblyjs/utf8" "1.8.5"
"@webassemblyjs/wast-parser@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c"
- integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==
+ "integrity" "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg=="
+ "resolved" "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz"
+ "version" "1.8.5"
dependencies:
"@webassemblyjs/ast" "1.8.5"
"@webassemblyjs/floating-point-hex-parser" "1.8.5"
@@ -2335,668 +2375,706 @@
"@xtuc/long" "4.2.2"
"@webassemblyjs/wast-printer@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc"
- integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==
+ "integrity" "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg=="
+ "resolved" "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz"
+ "version" "1.8.5"
dependencies:
"@webassemblyjs/ast" "1.8.5"
"@webassemblyjs/wast-parser" "1.8.5"
"@xtuc/long" "4.2.2"
"@xtuc/ieee754@^1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
- integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
+ "integrity" "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
+ "resolved" "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz"
+ "version" "1.2.0"
"@xtuc/long@4.2.2":
- version "4.2.2"
- resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
- integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
-
-JSONStream@^1.0.4, JSONStream@^1.3.4, JSONStream@^1.3.5:
- version "1.3.5"
- resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0"
- integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==
- dependencies:
- jsonparse "^1.2.0"
- through ">=2.2.7 <3"
-
-abab@^2.0.0:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a"
- integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==
-
-abbrev@1, abbrev@~1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
- integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
-
-accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7:
- version "1.3.7"
- resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
- integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
- dependencies:
- mime-types "~2.1.24"
- negotiator "0.6.2"
-
-acorn-globals@^4.1.0, acorn-globals@^4.3.0:
- version "4.3.4"
- resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7"
- integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==
- dependencies:
- acorn "^6.0.1"
- acorn-walk "^6.0.1"
-
-acorn-jsx@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe"
- integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==
-
-acorn-walk@^6.0.1:
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c"
- integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==
-
-acorn@^5.5.3:
- version "5.7.4"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e"
- integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==
-
-acorn@^6.0.1, acorn@^6.0.4, acorn@^6.2.1:
- version "6.4.1"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474"
- integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==
-
-acorn@^7.1.1:
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.2.0.tgz#17ea7e40d7c8640ff54a694c889c26f31704effe"
- integrity sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==
-
-acorn@^7.4.1:
- version "7.4.1"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
- integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
-
-address@1.1.2, address@^1.0.1:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6"
- integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==
-
-adjust-sourcemap-loader@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz#6471143af75ec02334b219f54bc7970c52fb29a4"
- integrity sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==
- dependencies:
- assert "1.4.1"
- camelcase "5.0.0"
- loader-utils "1.2.3"
- object-path "0.11.4"
- regex-parser "2.2.10"
-
-agent-base@4, agent-base@^4.3.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee"
- integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==
- dependencies:
- es6-promisify "^5.0.0"
-
-agent-base@5:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c"
- integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==
-
-agent-base@~4.2.1:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9"
- integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==
- dependencies:
- es6-promisify "^5.0.0"
-
-agentkeepalive@^3.4.1:
- version "3.5.2"
- resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.2.tgz#a113924dd3fa24a0bc3b78108c450c2abee00f67"
- integrity sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==
- dependencies:
- humanize-ms "^1.2.1"
-
-aggregate-error@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0"
- integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==
- dependencies:
- clean-stack "^2.0.0"
- indent-string "^4.0.0"
-
-ajv-errors@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
- integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
-
-ajv-keywords@^3.1.0, ajv-keywords@^3.4.1:
- version "3.4.1"
- resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da"
- integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==
-
-ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5:
- version "6.12.2"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd"
- integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==
- dependencies:
- fast-deep-equal "^3.1.1"
- fast-json-stable-stringify "^2.0.0"
- json-schema-traverse "^0.4.1"
- uri-js "^4.2.2"
-
-alphanum-sort@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
- integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=
-
-ansi-align@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
- integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=
- dependencies:
- string-width "^2.0.0"
-
-ansi-colors@^3.0.0:
- version "3.2.4"
- resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf"
- integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==
-
-ansi-escapes@^3.0.0, ansi-escapes@^3.1.0, ansi-escapes@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
- integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
-
-ansi-escapes@^4.2.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61"
- integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==
- dependencies:
- type-fest "^0.11.0"
-
-ansi-html@0.0.7:
- version "0.0.7"
- resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
- integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4=
-
-ansi-regex@^2.0.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
- integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
-
-ansi-regex@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
- integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
-
-ansi-regex@^4.0.0, ansi-regex@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
- integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
-
-ansi-regex@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
- integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
-
-ansi-styles@^2.2.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
- integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
-
-ansi-styles@^3.2.0, ansi-styles@^3.2.1:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
- integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
- dependencies:
- color-convert "^1.9.0"
-
-ansi-styles@^4.0.0, ansi-styles@^4.1.0:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
- integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
+ "integrity" "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
+ "resolved" "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz"
+ "version" "4.2.2"
+
+"abab@^2.0.0":
+ "integrity" "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg=="
+ "resolved" "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz"
+ "version" "2.0.3"
+
+"abbrev@~1.1.1", "abbrev@1":
+ "integrity" "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
+ "resolved" "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz"
+ "version" "1.1.1"
+
+"accepts@~1.3.4", "accepts@~1.3.5", "accepts@~1.3.7":
+ "integrity" "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA=="
+ "resolved" "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz"
+ "version" "1.3.7"
+ dependencies:
+ "mime-types" "~2.1.24"
+ "negotiator" "0.6.2"
+
+"acorn-globals@^4.1.0", "acorn-globals@^4.3.0":
+ "integrity" "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A=="
+ "resolved" "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz"
+ "version" "4.3.4"
+ dependencies:
+ "acorn" "^6.0.1"
+ "acorn-walk" "^6.0.1"
+
+"acorn-jsx@^5.2.0":
+ "integrity" "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ=="
+ "resolved" "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz"
+ "version" "5.2.0"
+
+"acorn-walk@^6.0.1":
+ "integrity" "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA=="
+ "resolved" "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz"
+ "version" "6.2.0"
+
+"acorn@^5.5.3":
+ "integrity" "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg=="
+ "resolved" "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz"
+ "version" "5.7.4"
+
+"acorn@^6.0.0 || ^7.0.0", "acorn@^7.1.1":
+ "integrity" "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ=="
+ "resolved" "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz"
+ "version" "7.2.0"
+
+"acorn@^6.0.1", "acorn@^6.0.4", "acorn@^6.2.1":
+ "integrity" "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA=="
+ "resolved" "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz"
+ "version" "6.4.1"
+
+"acorn@^7.4.1":
+ "integrity" "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
+ "resolved" "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz"
+ "version" "7.4.1"
+
+"address@^1.0.1", "address@1.1.2":
+ "integrity" "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA=="
+ "resolved" "https://registry.npmjs.org/address/-/address-1.1.2.tgz"
+ "version" "1.1.2"
+
+"adjust-sourcemap-loader@2.0.0":
+ "integrity" "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA=="
+ "resolved" "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "assert" "1.4.1"
+ "camelcase" "5.0.0"
+ "loader-utils" "1.2.3"
+ "object-path" "0.11.4"
+ "regex-parser" "2.2.10"
+
+"agent-base@^4.3.0", "agent-base@4":
+ "integrity" "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg=="
+ "resolved" "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz"
+ "version" "4.3.0"
+ dependencies:
+ "es6-promisify" "^5.0.0"
+
+"agent-base@~4.2.1":
+ "integrity" "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg=="
+ "resolved" "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz"
+ "version" "4.2.1"
+ dependencies:
+ "es6-promisify" "^5.0.0"
+
+"agent-base@5":
+ "integrity" "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g=="
+ "resolved" "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz"
+ "version" "5.1.1"
+
+"agentkeepalive@^3.4.1":
+ "integrity" "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ=="
+ "resolved" "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz"
+ "version" "3.5.2"
+ dependencies:
+ "humanize-ms" "^1.2.1"
+
+"aggregate-error@^3.0.0":
+ "integrity" "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA=="
+ "resolved" "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz"
+ "version" "3.0.1"
+ dependencies:
+ "clean-stack" "^2.0.0"
+ "indent-string" "^4.0.0"
+
+"ajv-errors@^1.0.0":
+ "integrity" "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ=="
+ "resolved" "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz"
+ "version" "1.0.1"
+
+"ajv-keywords@^3.1.0", "ajv-keywords@^3.4.1":
+ "integrity" "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ=="
+ "resolved" "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz"
+ "version" "3.4.1"
+
+"ajv@^5.3.0":
+ "version" "5.5.2"
+ dependencies:
+ "co" "^4.6.0"
+ "fast-deep-equal" "^1.0.0"
+ "fast-json-stable-stringify" "^2.0.0"
+ "json-schema-traverse" "^0.3.0"
+
+"ajv@^6.1.0", "ajv@^6.10.0", "ajv@^6.10.2", "ajv@^6.12.0", "ajv@^6.5.5", "ajv@^6.9.1", "ajv@>=5.0.0":
+ "integrity" "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ=="
+ "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz"
+ "version" "6.12.2"
+ dependencies:
+ "fast-deep-equal" "^3.1.1"
+ "fast-json-stable-stringify" "^2.0.0"
+ "json-schema-traverse" "^0.4.1"
+ "uri-js" "^4.2.2"
+
+"alphanum-sort@^1.0.0":
+ "integrity" "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM="
+ "resolved" "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz"
+ "version" "1.0.2"
+
+"ansi-align@^2.0.0":
+ "integrity" "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38="
+ "resolved" "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "string-width" "^2.0.0"
+
+"ansi-colors@^3.0.0":
+ "integrity" "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA=="
+ "resolved" "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz"
+ "version" "3.2.4"
+
+"ansi-escapes@^3.0.0", "ansi-escapes@^3.1.0", "ansi-escapes@^3.2.0":
+ "integrity" "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ=="
+ "resolved" "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz"
+ "version" "3.2.0"
+
+"ansi-escapes@^4.2.1":
+ "integrity" "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA=="
+ "resolved" "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz"
+ "version" "4.3.1"
+ dependencies:
+ "type-fest" "^0.11.0"
+
+"ansi-html@0.0.7":
+ "integrity" "sha1-gTWEAhliqenm/QOflA0S9WynhZ4="
+ "resolved" "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz"
+ "version" "0.0.7"
+
+"ansi-regex@^2.0.0":
+ "integrity" "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+ "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz"
+ "version" "2.1.1"
+
+"ansi-regex@^3.0.0":
+ "integrity" "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+ "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz"
+ "version" "3.0.0"
+
+"ansi-regex@^4.0.0":
+ "integrity" "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
+ "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz"
+ "version" "4.1.0"
+
+"ansi-regex@^4.1.0":
+ "integrity" "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
+ "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz"
+ "version" "4.1.0"
+
+"ansi-regex@^5.0.0":
+ "integrity" "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+ "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz"
+ "version" "5.0.0"
+
+"ansi-styles@^2.2.1":
+ "integrity" "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+ "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz"
+ "version" "2.2.1"
+
+"ansi-styles@^3.2.0", "ansi-styles@^3.2.1":
+ "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="
+ "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
+ "version" "3.2.1"
+ dependencies:
+ "color-convert" "^1.9.0"
+
+"ansi-styles@^4.0.0":
+ "integrity" "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA=="
+ "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz"
+ "version" "4.2.1"
+ dependencies:
+ "@types/color-name" "^1.1.1"
+ "color-convert" "^2.0.1"
+
+"ansi-styles@^4.1.0":
+ "integrity" "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA=="
+ "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz"
+ "version" "4.2.1"
dependencies:
"@types/color-name" "^1.1.1"
- color-convert "^2.0.1"
-
-ansicolors@~0.3.2:
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979"
- integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=
-
-ansistyles@~0.1.3:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539"
- integrity sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk=
-
-anymatch@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
- integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
- dependencies:
- micromatch "^3.1.4"
- normalize-path "^2.1.1"
-
-anymatch@~3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
- integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
- dependencies:
- normalize-path "^3.0.0"
- picomatch "^2.0.4"
-
-aproba@^1.0.3, aproba@^1.1.1, aproba@^1.1.2:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
- integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
-
-"aproba@^1.1.2 || 2", aproba@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc"
- integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==
-
-archy@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
- integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=
-
-are-we-there-yet@~1.1.2:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
- integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
- dependencies:
- delegates "^1.0.0"
- readable-stream "^2.0.6"
-
-argparse@^1.0.10, argparse@^1.0.7:
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
- integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
- dependencies:
- sprintf-js "~1.0.2"
-
-argv-formatter@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/argv-formatter/-/argv-formatter-1.0.0.tgz#a0ca0cbc29a5b73e836eebe1cbf6c5e0e4eb82f9"
- integrity sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk=
-
-aria-query@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc"
- integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=
- dependencies:
- ast-types-flow "0.0.7"
- commander "^2.11.0"
-
-arity-n@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745"
- integrity sha1-2edrEXM+CFacCEeuezmyhgswt0U=
-
-arr-diff@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
- integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
-
-arr-flatten@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
- integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
-
-arr-union@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
- integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
-
-array-equal@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
- integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=
-
-array-flatten@1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
- integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
-
-array-flatten@^2.1.0:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099"
- integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==
-
-array-ify@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece"
- integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=
-
-array-includes@^3.0.3, array-includes@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348"
- integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==
- dependencies:
- define-properties "^1.1.3"
- es-abstract "^1.17.0"
- is-string "^1.0.5"
-
-array-union@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
- integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=
- dependencies:
- array-uniq "^1.0.1"
-
-array-union@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
- integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
-
-array-uniq@^1.0.1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
- integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=
-
-array-unique@^0.3.2:
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
- integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
-
-array.prototype.flat@^1.2.1:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b"
- integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==
- dependencies:
- define-properties "^1.1.3"
- es-abstract "^1.17.0-next.1"
-
-arrify@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
- integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=
-
-arrify@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa"
- integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==
-
-asap@^2.0.0, asap@~2.0.3, asap@~2.0.6:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
- integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
-
-asn1.js@^4.0.0:
- version "4.10.1"
- resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
- integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==
- dependencies:
- bn.js "^4.0.0"
- inherits "^2.0.1"
- minimalistic-assert "^1.0.0"
-
-asn1@~0.2.3:
- version "0.2.4"
- resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
- integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
- dependencies:
- safer-buffer "~2.1.0"
-
-assert-plus@1.0.0, assert-plus@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
- integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
-
-assert@1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
- integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=
- dependencies:
- util "0.10.3"
-
-assert@^1.1.1:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb"
- integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==
- dependencies:
- object-assign "^4.1.1"
- util "0.10.3"
-
-assign-symbols@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
- integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
-
-ast-types-flow@0.0.7, ast-types-flow@^0.0.7:
- version "0.0.7"
- resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad"
- integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0=
-
-astral-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
- integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
-
-async-each@^1.0.1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
- integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
-
-async-limiter@~1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
- integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
-
-async@^2.6.2:
- version "2.6.3"
- resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
- integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
- dependencies:
- lodash "^4.17.14"
-
-asynckit@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
- integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
-
-atob-lite@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696"
- integrity sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=
-
-atob@^2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
- integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
-
-attr-accept@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-1.1.3.tgz#48230c79f93790ef2775fcec4f0db0f5db41ca52"
- integrity sha512-iT40nudw8zmCweivz6j58g+RT33I4KbaIvRUhjNmDwO2WmsQUxFEZZYZ5w3vXe5x5MX9D7mfvA/XaLOZYFR9EQ==
- dependencies:
- core-js "^2.5.0"
-
-autolinker@~0.28.0:
- version "0.28.1"
- resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-0.28.1.tgz#0652b491881879f0775dace0cdca3233942a4e47"
- integrity sha1-BlK0kYgYefB3XazgzcoyM5QqTkc=
- dependencies:
- gulp-header "^1.7.1"
-
-autoprefixer@^9.6.1:
- version "9.8.0"
- resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.0.tgz#68e2d2bef7ba4c3a65436f662d0a56a741e56511"
- integrity sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A==
- dependencies:
- browserslist "^4.12.0"
- caniuse-lite "^1.0.30001061"
- chalk "^2.4.2"
- normalize-range "^0.1.2"
- num2fraction "^1.2.2"
- postcss "^7.0.30"
- postcss-value-parser "^4.1.0"
-
-aws-sign2@~0.7.0:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
- integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
-
-aws4@^1.8.0:
- version "1.9.1"
- resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e"
- integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==
-
-axios@^0.19.0:
- version "0.19.2"
- resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27"
- integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==
- dependencies:
- follow-redirects "1.5.10"
-
-axobject-query@^2.0.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.1.2.tgz#2bdffc0371e643e5f03ba99065d5179b9ca79799"
- integrity sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ==
-
-babel-code-frame@^6.22.0:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
- integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
- dependencies:
- chalk "^1.1.3"
- esutils "^2.0.2"
- js-tokens "^3.0.2"
-
-babel-eslint@10.1.0:
- version "10.1.0"
- resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232"
- integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==
+ "color-convert" "^2.0.1"
+
+"ansicolors@~0.3.2":
+ "integrity" "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk="
+ "resolved" "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz"
+ "version" "0.3.2"
+
+"ansistyles@~0.1.3":
+ "integrity" "sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk="
+ "resolved" "https://registry.npmjs.org/ansistyles/-/ansistyles-0.1.3.tgz"
+ "version" "0.1.3"
+
+"anymatch@^2.0.0":
+ "integrity" "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw=="
+ "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "micromatch" "^3.1.4"
+ "normalize-path" "^2.1.1"
+
+"anymatch@~3.1.1":
+ "integrity" "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg=="
+ "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz"
+ "version" "3.1.1"
+ dependencies:
+ "normalize-path" "^3.0.0"
+ "picomatch" "^2.0.4"
+
+"aproba@^1.0.3":
+ "integrity" "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
+ "resolved" "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz"
+ "version" "1.2.0"
+
+"aproba@^1.1.1":
+ "integrity" "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
+ "resolved" "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz"
+ "version" "1.2.0"
+
+"aproba@^1.1.2 || 2", "aproba@^2.0.0":
+ "integrity" "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="
+ "resolved" "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz"
+ "version" "2.0.0"
+
+"aproba@^1.1.2":
+ "integrity" "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
+ "resolved" "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz"
+ "version" "1.2.0"
+
+"archy@~1.0.0":
+ "integrity" "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA="
+ "resolved" "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz"
+ "version" "1.0.0"
+
+"are-we-there-yet@~1.1.2":
+ "version" "1.1.4"
+ dependencies:
+ "delegates" "^1.0.0"
+ "readable-stream" "^2.0.6"
+
+"argparse@^1.0.10", "argparse@^1.0.7":
+ "integrity" "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="
+ "resolved" "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz"
+ "version" "1.0.10"
+ dependencies:
+ "sprintf-js" "~1.0.2"
+
+"argv-formatter@~1.0.0":
+ "integrity" "sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk="
+ "resolved" "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz"
+ "version" "1.0.0"
+
+"aria-query@^3.0.0":
+ "integrity" "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w="
+ "resolved" "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "ast-types-flow" "0.0.7"
+ "commander" "^2.11.0"
+
+"arity-n@^1.0.4":
+ "integrity" "sha1-2edrEXM+CFacCEeuezmyhgswt0U="
+ "resolved" "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz"
+ "version" "1.0.4"
+
+"arr-diff@^4.0.0":
+ "integrity" "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+ "resolved" "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz"
+ "version" "4.0.0"
+
+"arr-flatten@^1.1.0":
+ "integrity" "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
+ "resolved" "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz"
+ "version" "1.1.0"
+
+"arr-union@^3.1.0":
+ "integrity" "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
+ "resolved" "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz"
+ "version" "3.1.0"
+
+"array-equal@^1.0.0":
+ "integrity" "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM="
+ "resolved" "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz"
+ "version" "1.0.0"
+
+"array-flatten@^2.1.0":
+ "integrity" "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ=="
+ "resolved" "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz"
+ "version" "2.1.2"
+
+"array-flatten@1.1.1":
+ "integrity" "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
+ "resolved" "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz"
+ "version" "1.1.1"
+
+"array-ify@^1.0.0":
+ "integrity" "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4="
+ "resolved" "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz"
+ "version" "1.0.0"
+
+"array-includes@^3.0.3", "array-includes@^3.1.1", "array-includes@^3.1.5":
+ "integrity" "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ=="
+ "resolved" "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz"
+ "version" "3.1.5"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "define-properties" "^1.1.4"
+ "es-abstract" "^1.19.5"
+ "get-intrinsic" "^1.1.1"
+ "is-string" "^1.0.7"
+
+"array-union@^1.0.1":
+ "integrity" "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk="
+ "resolved" "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "array-uniq" "^1.0.1"
+
+"array-union@^2.1.0":
+ "integrity" "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="
+ "resolved" "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz"
+ "version" "2.1.0"
+
+"array-uniq@^1.0.1":
+ "integrity" "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
+ "resolved" "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz"
+ "version" "1.0.3"
+
+"array-unique@^0.3.2":
+ "integrity" "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+ "resolved" "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz"
+ "version" "0.3.2"
+
+"array.prototype.flat@^1.2.1":
+ "integrity" "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ=="
+ "resolved" "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz"
+ "version" "1.2.3"
+ dependencies:
+ "define-properties" "^1.1.3"
+ "es-abstract" "^1.17.0-next.1"
+
+"array.prototype.flatmap@^1.3.0":
+ "integrity" "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg=="
+ "resolved" "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz"
+ "version" "1.3.0"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "define-properties" "^1.1.3"
+ "es-abstract" "^1.19.2"
+ "es-shim-unscopables" "^1.0.0"
+
+"arrify@^1.0.1":
+ "integrity" "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
+ "resolved" "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz"
+ "version" "1.0.1"
+
+"arrify@^2.0.1":
+ "integrity" "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug=="
+ "resolved" "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz"
+ "version" "2.0.1"
+
+"asap@^2.0.0":
+ "integrity" "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
+ "resolved" "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz"
+ "version" "2.0.6"
+
+"asap@~2.0.3", "asap@~2.0.6":
+ "integrity" "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
+ "resolved" "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz"
+ "version" "2.0.6"
+
+"asn1.js@^4.0.0":
+ "integrity" "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw=="
+ "resolved" "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz"
+ "version" "4.10.1"
+ dependencies:
+ "bn.js" "^4.0.0"
+ "inherits" "^2.0.1"
+ "minimalistic-assert" "^1.0.0"
+
+"asn1@~0.2.3":
+ "integrity" "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg=="
+ "resolved" "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz"
+ "version" "0.2.4"
+ dependencies:
+ "safer-buffer" "~2.1.0"
+
+"assert-plus@^1.0.0", "assert-plus@1.0.0":
+ "integrity" "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+ "resolved" "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz"
+ "version" "1.0.0"
+
+"assert@^1.1.1":
+ "integrity" "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA=="
+ "resolved" "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz"
+ "version" "1.5.0"
+ dependencies:
+ "object-assign" "^4.1.1"
+ "util" "0.10.3"
+
+"assert@1.4.1":
+ "integrity" "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE="
+ "resolved" "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz"
+ "version" "1.4.1"
+ dependencies:
+ "util" "0.10.3"
+
+"assign-symbols@^1.0.0":
+ "integrity" "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
+ "resolved" "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz"
+ "version" "1.0.0"
+
+"ast-types-flow@^0.0.7", "ast-types-flow@0.0.7":
+ "integrity" "sha1-9wtzXGvKGlycItmCw+Oef+ujva0="
+ "resolved" "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz"
+ "version" "0.0.7"
+
+"astral-regex@^1.0.0":
+ "integrity" "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg=="
+ "resolved" "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz"
+ "version" "1.0.0"
+
+"async-each@^1.0.1":
+ "integrity" "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ=="
+ "resolved" "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz"
+ "version" "1.0.3"
+
+"async-limiter@~1.0.0":
+ "integrity" "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
+ "resolved" "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz"
+ "version" "1.0.1"
+
+"async@^2.6.2":
+ "integrity" "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg=="
+ "resolved" "https://registry.npmjs.org/async/-/async-2.6.3.tgz"
+ "version" "2.6.3"
+ dependencies:
+ "lodash" "^4.17.14"
+
+"asynckit@^0.4.0":
+ "integrity" "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+ "resolved" "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz"
+ "version" "0.4.0"
+
+"atob-lite@^2.0.0":
+ "integrity" "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY="
+ "resolved" "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz"
+ "version" "2.0.0"
+
+"atob@^2.1.2":
+ "integrity" "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
+ "resolved" "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz"
+ "version" "2.1.2"
+
+"attr-accept@^1.1.3":
+ "integrity" "sha512-iT40nudw8zmCweivz6j58g+RT33I4KbaIvRUhjNmDwO2WmsQUxFEZZYZ5w3vXe5x5MX9D7mfvA/XaLOZYFR9EQ=="
+ "resolved" "https://registry.npmjs.org/attr-accept/-/attr-accept-1.1.3.tgz"
+ "version" "1.1.3"
+ dependencies:
+ "core-js" "^2.5.0"
+
+"autolinker@~0.28.0":
+ "integrity" "sha1-BlK0kYgYefB3XazgzcoyM5QqTkc="
+ "resolved" "https://registry.npmjs.org/autolinker/-/autolinker-0.28.1.tgz"
+ "version" "0.28.1"
+ dependencies:
+ "gulp-header" "^1.7.1"
+
+"autoprefixer@^9.6.1":
+ "integrity" "sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A=="
+ "resolved" "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.0.tgz"
+ "version" "9.8.0"
+ dependencies:
+ "browserslist" "^4.12.0"
+ "caniuse-lite" "^1.0.30001061"
+ "chalk" "^2.4.2"
+ "normalize-range" "^0.1.2"
+ "num2fraction" "^1.2.2"
+ "postcss" "^7.0.30"
+ "postcss-value-parser" "^4.1.0"
+
+"aws-sign2@~0.7.0":
+ "integrity" "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
+ "resolved" "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz"
+ "version" "0.7.0"
+
+"aws4@^1.8.0":
+ "integrity" "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug=="
+ "resolved" "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz"
+ "version" "1.9.1"
+
+"axios@^0.26.0":
+ "integrity" "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA=="
+ "resolved" "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz"
+ "version" "0.26.1"
+ dependencies:
+ "follow-redirects" "^1.14.8"
+
+"axobject-query@^2.0.2":
+ "integrity" "sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ=="
+ "resolved" "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.2.tgz"
+ "version" "2.1.2"
+
+"babel-code-frame@^6.22.0":
+ "integrity" "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s="
+ "resolved" "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz"
+ "version" "6.26.0"
+ dependencies:
+ "chalk" "^1.1.3"
+ "esutils" "^2.0.2"
+ "js-tokens" "^3.0.2"
+
+"babel-eslint@10.1.0", "babel-eslint@10.x":
+ "integrity" "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg=="
+ "resolved" "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz"
+ "version" "10.1.0"
dependencies:
"@babel/code-frame" "^7.0.0"
"@babel/parser" "^7.7.0"
"@babel/traverse" "^7.7.0"
"@babel/types" "^7.7.0"
- eslint-visitor-keys "^1.0.0"
- resolve "^1.12.0"
+ "eslint-visitor-keys" "^1.0.0"
+ "resolve" "^1.12.0"
-babel-extract-comments@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21"
- integrity sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==
+"babel-extract-comments@^1.0.0":
+ "integrity" "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ=="
+ "resolved" "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz"
+ "version" "1.0.0"
dependencies:
- babylon "^6.18.0"
+ "babylon" "^6.18.0"
-babel-jest@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54"
- integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==
+"babel-jest@^24.9.0":
+ "integrity" "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw=="
+ "resolved" "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/transform" "^24.9.0"
"@jest/types" "^24.9.0"
"@types/babel__core" "^7.1.0"
- babel-plugin-istanbul "^5.1.0"
- babel-preset-jest "^24.9.0"
- chalk "^2.4.2"
- slash "^2.0.0"
-
-babel-loader@8.1.0:
- version "8.1.0"
- resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3"
- integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==
- dependencies:
- find-cache-dir "^2.1.0"
- loader-utils "^1.4.0"
- mkdirp "^0.5.3"
- pify "^4.0.1"
- schema-utils "^2.6.5"
-
-babel-plugin-dynamic-import-node@^2.3.3:
- version "2.3.3"
- resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
- integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==
- dependencies:
- object.assign "^4.1.0"
-
-babel-plugin-emotion@^10.0.27:
- version "10.0.33"
- resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.33.tgz#ce1155dcd1783bbb9286051efee53f4e2be63e03"
- integrity sha512-bxZbTTGz0AJQDHm8k6Rf3RQJ8tX2scsfsRyKVgAbiUPUNIRtlK+7JxP+TAd1kRLABFxe0CFm2VdK4ePkoA9FxQ==
+ "babel-plugin-istanbul" "^5.1.0"
+ "babel-preset-jest" "^24.9.0"
+ "chalk" "^2.4.2"
+ "slash" "^2.0.0"
+
+"babel-loader@8.1.0":
+ "integrity" "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw=="
+ "resolved" "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz"
+ "version" "8.1.0"
+ dependencies:
+ "find-cache-dir" "^2.1.0"
+ "loader-utils" "^1.4.0"
+ "mkdirp" "^0.5.3"
+ "pify" "^4.0.1"
+ "schema-utils" "^2.6.5"
+
+"babel-plugin-dynamic-import-node@^2.3.3":
+ "integrity" "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ=="
+ "resolved" "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz"
+ "version" "2.3.3"
+ dependencies:
+ "object.assign" "^4.1.0"
+
+"babel-plugin-emotion@^10.0.27":
+ "integrity" "sha512-bxZbTTGz0AJQDHm8k6Rf3RQJ8tX2scsfsRyKVgAbiUPUNIRtlK+7JxP+TAd1kRLABFxe0CFm2VdK4ePkoA9FxQ=="
+ "resolved" "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.33.tgz"
+ "version" "10.0.33"
dependencies:
"@babel/helper-module-imports" "^7.0.0"
"@emotion/hash" "0.8.0"
"@emotion/memoize" "0.7.4"
"@emotion/serialize" "^0.11.16"
- babel-plugin-macros "^2.0.0"
- babel-plugin-syntax-jsx "^6.18.0"
- convert-source-map "^1.5.0"
- escape-string-regexp "^1.0.5"
- find-root "^1.1.0"
- source-map "^0.5.7"
-
-babel-plugin-istanbul@^5.1.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854"
- integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==
+ "babel-plugin-macros" "^2.0.0"
+ "babel-plugin-syntax-jsx" "^6.18.0"
+ "convert-source-map" "^1.5.0"
+ "escape-string-regexp" "^1.0.5"
+ "find-root" "^1.1.0"
+ "source-map" "^0.5.7"
+
+"babel-plugin-istanbul@^5.1.0":
+ "integrity" "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw=="
+ "resolved" "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz"
+ "version" "5.2.0"
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
- find-up "^3.0.0"
- istanbul-lib-instrument "^3.3.0"
- test-exclude "^5.2.3"
+ "find-up" "^3.0.0"
+ "istanbul-lib-instrument" "^3.3.0"
+ "test-exclude" "^5.2.3"
-babel-plugin-jest-hoist@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756"
- integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==
+"babel-plugin-jest-hoist@^24.9.0":
+ "integrity" "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw=="
+ "resolved" "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@types/babel__traverse" "^7.0.6"
-babel-plugin-macros@2.8.0, babel-plugin-macros@^2.0.0:
- version "2.8.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138"
- integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==
+"babel-plugin-macros@^2.0.0", "babel-plugin-macros@2.8.0":
+ "integrity" "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg=="
+ "resolved" "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz"
+ "version" "2.8.0"
dependencies:
"@babel/runtime" "^7.7.2"
- cosmiconfig "^6.0.0"
- resolve "^1.12.0"
-
-babel-plugin-named-asset-import@^0.3.6:
- version "0.3.6"
- resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz#c9750a1b38d85112c9e166bf3ef7c5dbc605f4be"
- integrity sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA==
-
-babel-plugin-syntax-jsx@^6.18.0:
- version "6.18.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
- integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=
-
-babel-plugin-syntax-object-rest-spread@^6.8.0:
- version "6.13.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
- integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=
-
-babel-plugin-transform-object-rest-spread@^6.26.0:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06"
- integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=
- dependencies:
- babel-plugin-syntax-object-rest-spread "^6.8.0"
- babel-runtime "^6.26.0"
-
-babel-plugin-transform-react-remove-prop-types@0.4.24:
- version "0.4.24"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a"
- integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==
-
-babel-preset-jest@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc"
- integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==
+ "cosmiconfig" "^6.0.0"
+ "resolve" "^1.12.0"
+
+"babel-plugin-named-asset-import@^0.3.6":
+ "integrity" "sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA=="
+ "resolved" "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz"
+ "version" "0.3.6"
+
+"babel-plugin-syntax-jsx@^6.18.0":
+ "integrity" "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY="
+ "resolved" "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz"
+ "version" "6.18.0"
+
+"babel-plugin-syntax-object-rest-spread@^6.8.0":
+ "integrity" "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U="
+ "resolved" "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz"
+ "version" "6.13.0"
+
+"babel-plugin-transform-object-rest-spread@^6.26.0":
+ "integrity" "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY="
+ "resolved" "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz"
+ "version" "6.26.0"
+ dependencies:
+ "babel-plugin-syntax-object-rest-spread" "^6.8.0"
+ "babel-runtime" "^6.26.0"
+
+"babel-plugin-transform-react-remove-prop-types@0.4.24":
+ "integrity" "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA=="
+ "resolved" "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz"
+ "version" "0.4.24"
+
+"babel-preset-jest@^24.9.0":
+ "integrity" "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg=="
+ "resolved" "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@babel/plugin-syntax-object-rest-spread" "^7.0.0"
- babel-plugin-jest-hoist "^24.9.0"
+ "babel-plugin-jest-hoist" "^24.9.0"
-babel-preset-react-app@^9.1.2:
- version "9.1.2"
- resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-9.1.2.tgz#54775d976588a8a6d1a99201a702befecaf48030"
- integrity sha512-k58RtQOKH21NyKtzptoAvtAODuAJJs3ZhqBMl456/GnXEQ/0La92pNmwgWoMn5pBTrsvk3YYXdY7zpY4e3UIxA==
+"babel-preset-react-app@^9.1.2":
+ "integrity" "sha512-k58RtQOKH21NyKtzptoAvtAODuAJJs3ZhqBMl456/GnXEQ/0La92pNmwgWoMn5pBTrsvk3YYXdY7zpY4e3UIxA=="
+ "resolved" "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.1.2.tgz"
+ "version" "9.1.2"
dependencies:
"@babel/core" "7.9.0"
"@babel/plugin-proposal-class-properties" "7.8.3"
@@ -3011,5286 +3089,5609 @@ babel-preset-react-app@^9.1.2:
"@babel/preset-react" "7.9.1"
"@babel/preset-typescript" "7.9.0"
"@babel/runtime" "7.9.0"
- babel-plugin-macros "2.8.0"
- babel-plugin-transform-react-remove-prop-types "0.4.24"
-
-babel-runtime@^6.23.0, babel-runtime@^6.26.0:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
- integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
- dependencies:
- core-js "^2.4.0"
- regenerator-runtime "^0.11.0"
-
-babylon@^6.18.0:
- version "6.18.0"
- resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
- integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
-
-balanced-match@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
- integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
-
-base16@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70"
- integrity sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=
-
-base64-js@^1.0.2, base64-js@^1.2.0:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
- integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==
-
-base64-js@^1.3.0, base64-js@^1.5.1:
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
- integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
-
-base@^0.11.1:
- version "0.11.2"
- resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
- integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
- dependencies:
- cache-base "^1.0.1"
- class-utils "^0.3.5"
- component-emitter "^1.2.1"
- define-property "^1.0.0"
- isobject "^3.0.1"
- mixin-deep "^1.2.0"
- pascalcase "^0.1.1"
-
-batch@0.6.1:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
- integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=
-
-bcrypt-pbkdf@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
- integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
- dependencies:
- tweetnacl "^0.14.3"
-
-before-after-hook@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635"
- integrity sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==
-
-big-integer@^1.6.16:
- version "1.6.51"
- resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686"
- integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==
-
-big.js@^5.2.2:
- version "5.2.2"
- resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
- integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
-
-bin-links@^1.1.2, bin-links@^1.1.7:
- version "1.1.8"
- resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-1.1.8.tgz#bd39aadab5dc4bdac222a07df5baf1af745b2228"
- integrity sha512-KgmVfx+QqggqP9dA3iIc5pA4T1qEEEL+hOhOhNPaUm77OTrJoOXE/C05SJLNJe6m/2wUK7F1tDSou7n5TfCDzQ==
- dependencies:
- bluebird "^3.5.3"
- cmd-shim "^3.0.0"
- gentle-fs "^2.3.0"
- graceful-fs "^4.1.15"
- npm-normalize-package-bin "^1.0.0"
- write-file-atomic "^2.3.0"
-
-binary-extensions@^1.0.0:
- version "1.13.1"
- resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
- integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
-
-binary-extensions@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c"
- integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==
-
-bindings@^1.5.0:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
- integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
- dependencies:
- file-uri-to-path "1.0.0"
-
-bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5:
- version "3.7.2"
- resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
- integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
-
-bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0:
- version "4.11.9"
- resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828"
- integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==
-
-bn.js@^5.1.1:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0"
- integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==
-
-body-parser@1.19.0:
- version "1.19.0"
- resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
- integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
- dependencies:
- bytes "3.1.0"
- content-type "~1.0.4"
- debug "2.6.9"
- depd "~1.1.2"
- http-errors "1.7.2"
- iconv-lite "0.4.24"
- on-finished "~2.3.0"
- qs "6.7.0"
- raw-body "2.4.0"
- type-is "~1.6.17"
-
-bonjour@^3.5.0:
- version "3.5.0"
- resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5"
- integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU=
- dependencies:
- array-flatten "^2.1.0"
- deep-equal "^1.0.1"
- dns-equal "^1.0.0"
- dns-txt "^2.0.2"
- multicast-dns "^6.0.1"
- multicast-dns-service-types "^1.1.0"
-
-boolbase@^1.0.0, boolbase@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
- integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
-
-bootstrap-datepicker@^1.7.1:
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/bootstrap-datepicker/-/bootstrap-datepicker-1.9.0.tgz#e4bfce3fcce1967876b21dc6833ec5994aaed090"
- integrity sha512-9rYYbaVOheGYxjOr/+bJCmRPihfy+LkLSg4fIFMT9Od8WwWB/MB50w0JO1eBgKUMbb7PFHQD5uAfI3ArAxZRXA==
- dependencies:
- jquery ">=1.7.1 <4.0.0"
-
-bootstrap-sass@^3.4.0:
- version "3.4.1"
- resolved "https://registry.yarnpkg.com/bootstrap-sass/-/bootstrap-sass-3.4.1.tgz#6843c73b1c258a0ac5cb2cc6f6f5285b664a8e9a"
- integrity sha512-p5rxsK/IyEDQm2CwiHxxUi0MZZtvVFbhWmyMOt4lLkA4bujDA1TGoKT0i1FKIWiugAdP+kK8T5KMDFIKQCLYIA==
-
-bootstrap-select@1.12.2:
- version "1.12.2"
- resolved "https://registry.yarnpkg.com/bootstrap-select/-/bootstrap-select-1.12.2.tgz#58d095b3fd584b31443866fbe39b6fdd4e4e12a4"
- integrity sha1-WNCVs/1YSzFEOGb745tv3U5OEqQ=
- dependencies:
- jquery ">=1.8"
-
-bootstrap-slider-without-jquery@^10.0.0:
- version "10.0.0"
- resolved "https://registry.yarnpkg.com/bootstrap-slider-without-jquery/-/bootstrap-slider-without-jquery-10.0.0.tgz#5c304461b3b915037c7c118806c8ca08102f5de3"
- integrity sha512-CB9CrpNVrIytlOoqHtRXhhxFo/jencr1U5cMqPBA0WmMdb13bzjHnXQVNGYde/g5gWW+RWiuT9jTquZuz3VE8A==
-
-bootstrap-slider@^9.9.0:
- version "9.10.0"
- resolved "https://registry.yarnpkg.com/bootstrap-slider/-/bootstrap-slider-9.10.0.tgz#1103d6bc00cfbfa8cfc9a2599ab518c55643da3f"
- integrity sha1-EQPWvADPv6jPyaJZmrUYxVZD2j8=
-
-bootstrap-switch@3.3.4:
- version "3.3.4"
- resolved "https://registry.yarnpkg.com/bootstrap-switch/-/bootstrap-switch-3.3.4.tgz#70e0aeb2a877c0dc766991de108e2170fc29a2ff"
- integrity sha1-cOCusqh3wNx2aZHeEI4hcPwpov8=
-
-bootstrap-touchspin@~3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/bootstrap-touchspin/-/bootstrap-touchspin-3.1.1.tgz#9779deac72aaf577e5e762b8512c747c871d9597"
- integrity sha1-l3nerHKq9Xfl52K4USx0fIcdlZc=
-
-bootstrap@^3.3, bootstrap@^3.4.1, bootstrap@~3.4.1:
- version "3.4.1"
- resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-3.4.1.tgz#c3a347d419e289ad11f4033e3c4132b87c081d72"
- integrity sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==
-
-bottleneck@^2.18.1:
- version "2.19.5"
- resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91"
- integrity sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==
-
-boxen@^1.2.1:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b"
- integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==
- dependencies:
- ansi-align "^2.0.0"
- camelcase "^4.0.0"
- chalk "^2.0.1"
- cli-boxes "^1.0.0"
- string-width "^2.0.0"
- term-size "^1.2.0"
- widest-line "^2.0.0"
-
-brace-expansion@^1.1.7:
- version "1.1.11"
- resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
- integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
- dependencies:
- balanced-match "^1.0.0"
- concat-map "0.0.1"
-
-braces@^2.3.1, braces@^2.3.2:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
- integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
- dependencies:
- arr-flatten "^1.1.0"
- array-unique "^0.3.2"
- extend-shallow "^2.0.1"
- fill-range "^4.0.0"
- isobject "^3.0.1"
- repeat-element "^1.1.2"
- snapdragon "^0.8.1"
- snapdragon-node "^2.0.1"
- split-string "^3.0.2"
- to-regex "^3.0.1"
-
-braces@^3.0.1, braces@~3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
- integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
- dependencies:
- fill-range "^7.0.1"
-
-breakjs@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/breakjs/-/breakjs-1.0.0.tgz#ec8353a06862eb43962deae09072ee66a4cd8459"
- integrity sha1-7INToGhi60OWLergkHLuZqTNhFk=
-
-broadcast-channel@^4.5.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/broadcast-channel/-/broadcast-channel-4.5.0.tgz#d4717c493e219908fcb7f2f9078fe0baf95b77c1"
- integrity sha512-jp+VPlQ1HyR0CM3uIYUrdpXupBvhTMFRkjR6mEmt5W4HaGDPFEzrO2Jqvi2PZ6zCC4zwLeco7CC5EUJPrVH8Tw==
+ "babel-plugin-macros" "2.8.0"
+ "babel-plugin-transform-react-remove-prop-types" "0.4.24"
+
+"babel-runtime@^6.23.0", "babel-runtime@^6.26.0":
+ "integrity" "sha1-llxwWGaOgrVde/4E/yM3vItWR/4="
+ "resolved" "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz"
+ "version" "6.26.0"
+ dependencies:
+ "core-js" "^2.4.0"
+ "regenerator-runtime" "^0.11.0"
+
+"babylon@^6.18.0":
+ "integrity" "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+ "resolved" "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz"
+ "version" "6.18.0"
+
+"balanced-match@^1.0.0":
+ "integrity" "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+ "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz"
+ "version" "1.0.0"
+
+"base@^0.11.1":
+ "integrity" "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg=="
+ "resolved" "https://registry.npmjs.org/base/-/base-0.11.2.tgz"
+ "version" "0.11.2"
+ dependencies:
+ "cache-base" "^1.0.1"
+ "class-utils" "^0.3.5"
+ "component-emitter" "^1.2.1"
+ "define-property" "^1.0.0"
+ "isobject" "^3.0.1"
+ "mixin-deep" "^1.2.0"
+ "pascalcase" "^0.1.1"
+
+"base16@^1.0.0":
+ "integrity" "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA="
+ "resolved" "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz"
+ "version" "1.0.0"
+
+"base64-js@^1.0.2", "base64-js@^1.2.0":
+ "integrity" "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
+ "resolved" "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz"
+ "version" "1.3.1"
+
+"base64-js@^1.3.0":
+ "integrity" "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+ "resolved" "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"
+ "version" "1.5.1"
+
+"base64-js@^1.5.1":
+ "integrity" "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+ "resolved" "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"
+ "version" "1.5.1"
+
+"batch@0.6.1":
+ "integrity" "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY="
+ "resolved" "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz"
+ "version" "0.6.1"
+
+"bcrypt-pbkdf@^1.0.0":
+ "integrity" "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4="
+ "resolved" "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "tweetnacl" "^0.14.3"
+
+"before-after-hook@^2.0.0":
+ "integrity" "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A=="
+ "resolved" "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz"
+ "version" "2.1.0"
+
+"big-integer@^1.6.16":
+ "integrity" "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg=="
+ "resolved" "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz"
+ "version" "1.6.51"
+
+"big.js@^5.2.2":
+ "integrity" "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="
+ "resolved" "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz"
+ "version" "5.2.2"
+
+"bin-links@^1.1.2", "bin-links@^1.1.7":
+ "version" "1.1.7"
+ dependencies:
+ "bluebird" "^3.5.3"
+ "cmd-shim" "^3.0.0"
+ "gentle-fs" "^2.3.0"
+ "graceful-fs" "^4.1.15"
+ "npm-normalize-package-bin" "^1.0.0"
+ "write-file-atomic" "^2.3.0"
+
+"binary-extensions@^1.0.0":
+ "integrity" "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw=="
+ "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz"
+ "version" "1.13.1"
+
+"binary-extensions@^2.0.0":
+ "integrity" "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow=="
+ "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz"
+ "version" "2.0.0"
+
+"bluebird@^3.5.1", "bluebird@^3.5.3":
+ "version" "3.5.5"
+
+"bluebird@^3.5.5":
+ "integrity" "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
+ "resolved" "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz"
+ "version" "3.7.2"
+
+"bn.js@^4.0.0", "bn.js@^4.1.0", "bn.js@^4.4.0":
+ "integrity" "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw=="
+ "resolved" "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz"
+ "version" "4.11.9"
+
+"bn.js@^5.1.1":
+ "integrity" "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA=="
+ "resolved" "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz"
+ "version" "5.1.2"
+
+"body-parser@1.19.0":
+ "integrity" "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw=="
+ "resolved" "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz"
+ "version" "1.19.0"
+ dependencies:
+ "bytes" "3.1.0"
+ "content-type" "~1.0.4"
+ "debug" "2.6.9"
+ "depd" "~1.1.2"
+ "http-errors" "1.7.2"
+ "iconv-lite" "0.4.24"
+ "on-finished" "~2.3.0"
+ "qs" "6.7.0"
+ "raw-body" "2.4.0"
+ "type-is" "~1.6.17"
+
+"bonjour@^3.5.0":
+ "integrity" "sha1-jokKGD2O6aI5OzhExpGkK897yfU="
+ "resolved" "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz"
+ "version" "3.5.0"
+ dependencies:
+ "array-flatten" "^2.1.0"
+ "deep-equal" "^1.0.1"
+ "dns-equal" "^1.0.0"
+ "dns-txt" "^2.0.2"
+ "multicast-dns" "^6.0.1"
+ "multicast-dns-service-types" "^1.1.0"
+
+"boolbase@^1.0.0", "boolbase@~1.0.0":
+ "integrity" "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
+ "resolved" "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz"
+ "version" "1.0.0"
+
+"bootstrap-datepicker@^1.7.1":
+ "integrity" "sha512-9rYYbaVOheGYxjOr/+bJCmRPihfy+LkLSg4fIFMT9Od8WwWB/MB50w0JO1eBgKUMbb7PFHQD5uAfI3ArAxZRXA=="
+ "resolved" "https://registry.npmjs.org/bootstrap-datepicker/-/bootstrap-datepicker-1.9.0.tgz"
+ "version" "1.9.0"
+ dependencies:
+ "jquery" ">=1.7.1 <4.0.0"
+
+"bootstrap-sass@^3.4.0":
+ "integrity" "sha512-p5rxsK/IyEDQm2CwiHxxUi0MZZtvVFbhWmyMOt4lLkA4bujDA1TGoKT0i1FKIWiugAdP+kK8T5KMDFIKQCLYIA=="
+ "resolved" "https://registry.npmjs.org/bootstrap-sass/-/bootstrap-sass-3.4.1.tgz"
+ "version" "3.4.1"
+
+"bootstrap-select@1.12.2":
+ "integrity" "sha1-WNCVs/1YSzFEOGb745tv3U5OEqQ="
+ "resolved" "https://registry.npmjs.org/bootstrap-select/-/bootstrap-select-1.12.2.tgz"
+ "version" "1.12.2"
+ dependencies:
+ "jquery" ">=1.8"
+
+"bootstrap-slider-without-jquery@^10.0.0":
+ "integrity" "sha512-CB9CrpNVrIytlOoqHtRXhhxFo/jencr1U5cMqPBA0WmMdb13bzjHnXQVNGYde/g5gWW+RWiuT9jTquZuz3VE8A=="
+ "resolved" "https://registry.npmjs.org/bootstrap-slider-without-jquery/-/bootstrap-slider-without-jquery-10.0.0.tgz"
+ "version" "10.0.0"
+
+"bootstrap-slider@^9.9.0":
+ "integrity" "sha1-EQPWvADPv6jPyaJZmrUYxVZD2j8="
+ "resolved" "https://registry.npmjs.org/bootstrap-slider/-/bootstrap-slider-9.10.0.tgz"
+ "version" "9.10.0"
+
+"bootstrap-switch@3.3.4":
+ "integrity" "sha1-cOCusqh3wNx2aZHeEI4hcPwpov8="
+ "resolved" "https://registry.npmjs.org/bootstrap-switch/-/bootstrap-switch-3.3.4.tgz"
+ "version" "3.3.4"
+
+"bootstrap-touchspin@~3.1.1":
+ "integrity" "sha1-l3nerHKq9Xfl52K4USx0fIcdlZc="
+ "resolved" "https://registry.npmjs.org/bootstrap-touchspin/-/bootstrap-touchspin-3.1.1.tgz"
+ "version" "3.1.1"
+
+"bootstrap@^3.1.1", "bootstrap@^3.3", "bootstrap@^3.4.1", "bootstrap@~3.4.1":
+ "integrity" "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA=="
+ "resolved" "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz"
+ "version" "3.4.1"
+
+"bottleneck@^2.18.1":
+ "integrity" "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw=="
+ "resolved" "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz"
+ "version" "2.19.5"
+
+"boxen@^1.2.1":
+ "integrity" "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw=="
+ "resolved" "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz"
+ "version" "1.3.0"
+ dependencies:
+ "ansi-align" "^2.0.0"
+ "camelcase" "^4.0.0"
+ "chalk" "^2.0.1"
+ "cli-boxes" "^1.0.0"
+ "string-width" "^2.0.0"
+ "term-size" "^1.2.0"
+ "widest-line" "^2.0.0"
+
+"brace-expansion@^1.1.7":
+ "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="
+ "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"
+ "version" "1.1.11"
+ dependencies:
+ "balanced-match" "^1.0.0"
+ "concat-map" "0.0.1"
+
+"braces@^2.3.1", "braces@^2.3.2":
+ "integrity" "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w=="
+ "resolved" "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz"
+ "version" "2.3.2"
+ dependencies:
+ "arr-flatten" "^1.1.0"
+ "array-unique" "^0.3.2"
+ "extend-shallow" "^2.0.1"
+ "fill-range" "^4.0.0"
+ "isobject" "^3.0.1"
+ "repeat-element" "^1.1.2"
+ "snapdragon" "^0.8.1"
+ "snapdragon-node" "^2.0.1"
+ "split-string" "^3.0.2"
+ "to-regex" "^3.0.1"
+
+"braces@^3.0.1":
+ "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A=="
+ "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz"
+ "version" "3.0.2"
+ dependencies:
+ "fill-range" "^7.0.1"
+
+"braces@~3.0.2":
+ "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A=="
+ "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz"
+ "version" "3.0.2"
+ dependencies:
+ "fill-range" "^7.0.1"
+
+"breakjs@^1.0.0":
+ "integrity" "sha1-7INToGhi60OWLergkHLuZqTNhFk="
+ "resolved" "https://registry.npmjs.org/breakjs/-/breakjs-1.0.0.tgz"
+ "version" "1.0.0"
+
+"broadcast-channel@^4.5.0":
+ "integrity" "sha512-jp+VPlQ1HyR0CM3uIYUrdpXupBvhTMFRkjR6mEmt5W4HaGDPFEzrO2Jqvi2PZ6zCC4zwLeco7CC5EUJPrVH8Tw=="
+ "resolved" "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-4.5.0.tgz"
+ "version" "4.5.0"
dependencies:
"@babel/runtime" "^7.16.0"
- detect-node "^2.1.0"
- microseconds "0.2.0"
- nano-time "1.0.0"
- oblivious-set "1.0.0"
- rimraf "3.0.2"
- unload "2.3.1"
-
-brorand@^1.0.1:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
- integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
-
-browser-process-hrtime@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626"
- integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
-
-browser-resolve@^1.11.3:
- version "1.11.3"
- resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6"
- integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==
- dependencies:
- resolve "1.1.7"
-
-browserify-aes@^1.0.0, browserify-aes@^1.0.4:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
- integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
- dependencies:
- buffer-xor "^1.0.3"
- cipher-base "^1.0.0"
- create-hash "^1.1.0"
- evp_bytestokey "^1.0.3"
- inherits "^2.0.1"
- safe-buffer "^5.0.1"
-
-browserify-cipher@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
- integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
- dependencies:
- browserify-aes "^1.0.4"
- browserify-des "^1.0.0"
- evp_bytestokey "^1.0.0"
-
-browserify-des@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
- integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
- dependencies:
- cipher-base "^1.0.1"
- des.js "^1.0.0"
- inherits "^2.0.1"
- safe-buffer "^5.1.2"
-
-browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
- integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=
- dependencies:
- bn.js "^4.1.0"
- randombytes "^2.0.1"
-
-browserify-sign@^4.0.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.0.tgz#545d0b1b07e6b2c99211082bf1b12cce7a0b0e11"
- integrity sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==
- dependencies:
- bn.js "^5.1.1"
- browserify-rsa "^4.0.1"
- create-hash "^1.2.0"
- create-hmac "^1.1.7"
- elliptic "^6.5.2"
- inherits "^2.0.4"
- parse-asn1 "^5.1.5"
- readable-stream "^3.6.0"
- safe-buffer "^5.2.0"
-
-browserify-zlib@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
- integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==
- dependencies:
- pako "~1.0.5"
-
-browserslist@4.10.0:
- version "4.10.0"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.10.0.tgz#f179737913eaf0d2b98e4926ac1ca6a15cbcc6a9"
- integrity sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA==
- dependencies:
- caniuse-lite "^1.0.30001035"
- electron-to-chromium "^1.3.378"
- node-releases "^1.1.52"
- pkg-up "^3.1.0"
-
-browserslist@^4.0.0, browserslist@^4.11.1, browserslist@^4.12.0, browserslist@^4.6.2, browserslist@^4.6.4, browserslist@^4.8.5, browserslist@^4.9.1:
- version "4.12.0"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.0.tgz#06c6d5715a1ede6c51fc39ff67fd647f740b656d"
- integrity sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==
- dependencies:
- caniuse-lite "^1.0.30001043"
- electron-to-chromium "^1.3.413"
- node-releases "^1.1.53"
- pkg-up "^2.0.0"
-
-bs-platform@^8.2.0:
- version "8.3.3"
- resolved "https://registry.yarnpkg.com/bs-platform/-/bs-platform-8.3.3.tgz#68e3796ad0607c55da0f45fe14c0ce0aaf69682c"
- integrity sha512-ayS5wdvrOX6PxU2wX7O2rLllzsQDzmGq582NNDFwfM6b9HQu7ki242Pc46o2/CnGHHumKVarpX0IZzjC2Llgcg==
-
-bser@2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05"
- integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==
- dependencies:
- node-int64 "^0.4.0"
-
-btoa-lite@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337"
- integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc=
-
-btoa@1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.1.2.tgz#3e40b81663f81d2dd6596a4cb714a8dc16cfabe0"
- integrity sha1-PkC4FmP4HS3WWWpMtxSo3BbPq+A=
-
-buffer-from@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
- integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
-
-buffer-indexof@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c"
- integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==
-
-buffer-xor@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
- integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
-
-buffer@^4.3.0:
- version "4.9.2"
- resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8"
- integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==
- dependencies:
- base64-js "^1.0.2"
- ieee754 "^1.1.4"
- isarray "^1.0.0"
-
-buffer@^5.1.0:
- version "5.6.0"
- resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786"
- integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==
- dependencies:
- base64-js "^1.0.2"
- ieee754 "^1.1.4"
-
-builtin-status-codes@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
- integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
-
-builtins@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88"
- integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og=
-
-byline@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1"
- integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=
-
-byte-size@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-5.0.1.tgz#4b651039a5ecd96767e71a3d7ed380e48bed4191"
- integrity sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw==
-
-bytes@3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
- integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=
-
-bytes@3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
- integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
-
-c3@^0.4.11, c3@~0.4.11:
- version "0.4.24"
- resolved "https://registry.yarnpkg.com/c3/-/c3-0.4.24.tgz#57b62357098842d38e265a265f6de1e8c6faadd2"
- integrity sha512-mVCFtN5ZWUT5UE7ilFQ7KBQ7TUCdKIq6KsDt1hH/1m6gC1tBjvzFTO7fqhaiWHfhNOjjM7makschdhg6DkWQMA==
- dependencies:
- d3 "~3.5.0"
-
-cacache@^12.0.0, cacache@^12.0.2, cacache@^12.0.3:
- version "12.0.4"
- resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c"
- integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==
- dependencies:
- bluebird "^3.5.5"
- chownr "^1.1.1"
- figgy-pudding "^3.5.1"
- glob "^7.1.4"
- graceful-fs "^4.1.15"
- infer-owner "^1.0.3"
- lru-cache "^5.1.1"
- mississippi "^3.0.0"
- mkdirp "^0.5.1"
- move-concurrently "^1.0.1"
- promise-inflight "^1.0.1"
- rimraf "^2.6.3"
- ssri "^6.0.1"
- unique-filename "^1.1.1"
- y18n "^4.0.0"
-
-cacache@^13.0.1:
- version "13.0.1"
- resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c"
- integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==
- dependencies:
- chownr "^1.1.2"
- figgy-pudding "^3.5.1"
- fs-minipass "^2.0.0"
- glob "^7.1.4"
- graceful-fs "^4.2.2"
- infer-owner "^1.0.4"
- lru-cache "^5.1.1"
- minipass "^3.0.0"
- minipass-collect "^1.0.2"
- minipass-flush "^1.0.5"
- minipass-pipeline "^1.2.2"
- mkdirp "^0.5.1"
- move-concurrently "^1.0.1"
- p-map "^3.0.0"
- promise-inflight "^1.0.1"
- rimraf "^2.7.1"
- ssri "^7.0.0"
- unique-filename "^1.1.1"
-
-cache-base@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
- integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
- dependencies:
- collection-visit "^1.0.0"
- component-emitter "^1.2.1"
- get-value "^2.0.6"
- has-value "^1.0.0"
- isobject "^3.0.1"
- set-value "^2.0.0"
- to-object-path "^0.3.0"
- union-value "^1.0.0"
- unset-value "^1.0.0"
-
-cachedir@2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.2.0.tgz#19afa4305e05d79e417566882e0c8f960f62ff0e"
- integrity sha512-VvxA0xhNqIIfg0V9AmJkDg91DaJwryutH5rVEZAhcNi4iJFj9f+QxmAjgK1LT9I8OgToX27fypX6/MeCXVbBjQ==
-
-call-limit@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/call-limit/-/call-limit-1.1.1.tgz#ef15f2670db3f1992557e2d965abc459e6e358d4"
- integrity sha512-5twvci5b9eRBw2wCfPtN0GmlR2/gadZqyFpPhOK6CvMFoFgA+USnZ6Jpu1lhG9h85pQ3Ouil3PfXWRD4EUaRiQ==
-
-call-me-maybe@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
- integrity sha1-JtII6onje1y95gJQoV8DHBak1ms=
-
-caller-callsite@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
- integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=
- dependencies:
- callsites "^2.0.0"
-
-caller-path@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4"
- integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=
- dependencies:
- caller-callsite "^2.0.0"
-
-callsites@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
- integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
-
-callsites@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
- integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
-
-camel-case@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.1.tgz#1fc41c854f00e2f7d0139dfeba1542d6896fe547"
- integrity sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==
- dependencies:
- pascal-case "^3.1.1"
- tslib "^1.10.0"
-
-camelcase-keys@^6.2.2:
- version "6.2.2"
- resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0"
- integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==
- dependencies:
- camelcase "^5.3.1"
- map-obj "^4.0.0"
- quick-lru "^4.0.1"
-
-camelcase@5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42"
- integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==
-
-camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1:
- version "5.3.1"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
- integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
-
-camelcase@^4.0.0, camelcase@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
- integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=
-
-camelcase@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e"
- integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==
-
-caniuse-api@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0"
- integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==
- dependencies:
- browserslist "^4.0.0"
- caniuse-lite "^1.0.0"
- lodash.memoize "^4.1.2"
- lodash.uniq "^4.5.0"
-
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001043, caniuse-lite@^1.0.30001061:
- version "1.0.30001062"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001062.tgz#d814b648338504b315222ace6f1a533d9a55e390"
- integrity sha512-ei9ZqeOnN7edDrb24QfJ0OZicpEbsWxv7WusOiQGz/f2SfvBgHHbOEwBJ8HKGVSyx8Z6ndPjxzR6m0NQq+0bfw==
-
-capture-exit@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4"
- integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==
- dependencies:
- rsvp "^4.8.4"
-
-capture-stack-trace@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d"
- integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==
-
-cardinal@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505"
- integrity sha1-fMEFXYItISlU0HsIXeolHMe8VQU=
- dependencies:
- ansicolors "~0.3.2"
- redeyed "~2.1.0"
-
-case-sensitive-paths-webpack-plugin@2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7"
- integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==
-
-caseless@~0.12.0:
- version "0.12.0"
- resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
- integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
-
-chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2:
- version "2.4.2"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
- integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
- dependencies:
- ansi-styles "^3.2.1"
- escape-string-regexp "^1.0.5"
- supports-color "^5.3.0"
-
-chalk@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
- integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
- dependencies:
- ansi-styles "^2.2.1"
- escape-string-regexp "^1.0.2"
- has-ansi "^2.0.0"
- strip-ansi "^3.0.0"
- supports-color "^2.0.0"
-
-chalk@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
- integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
- dependencies:
- ansi-styles "^4.1.0"
- supports-color "^7.1.0"
-
-change-emitter@^0.1.2:
- version "0.1.6"
- resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515"
- integrity sha1-6LL+PX8at9aaMhma/5HqaTFAlRU=
-
-chardet@^0.7.0:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
- integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
-
-chokidar@^2.1.8:
- version "2.1.8"
- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
- integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==
- dependencies:
- anymatch "^2.0.0"
- async-each "^1.0.1"
- braces "^2.3.2"
- glob-parent "^3.1.0"
- inherits "^2.0.3"
- is-binary-path "^1.0.0"
- is-glob "^4.0.0"
- normalize-path "^3.0.0"
- path-is-absolute "^1.0.0"
- readdirp "^2.2.1"
- upath "^1.1.1"
+ "detect-node" "^2.1.0"
+ "microseconds" "0.2.0"
+ "nano-time" "1.0.0"
+ "oblivious-set" "1.0.0"
+ "rimraf" "3.0.2"
+ "unload" "2.3.1"
+
+"brorand@^1.0.1":
+ "integrity" "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
+ "resolved" "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz"
+ "version" "1.1.0"
+
+"browser-process-hrtime@^1.0.0":
+ "integrity" "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow=="
+ "resolved" "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz"
+ "version" "1.0.0"
+
+"browser-resolve@^1.11.3":
+ "integrity" "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ=="
+ "resolved" "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz"
+ "version" "1.11.3"
+ dependencies:
+ "resolve" "1.1.7"
+
+"browserify-aes@^1.0.0", "browserify-aes@^1.0.4":
+ "integrity" "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA=="
+ "resolved" "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz"
+ "version" "1.2.0"
+ dependencies:
+ "buffer-xor" "^1.0.3"
+ "cipher-base" "^1.0.0"
+ "create-hash" "^1.1.0"
+ "evp_bytestokey" "^1.0.3"
+ "inherits" "^2.0.1"
+ "safe-buffer" "^5.0.1"
+
+"browserify-cipher@^1.0.0":
+ "integrity" "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w=="
+ "resolved" "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "browserify-aes" "^1.0.4"
+ "browserify-des" "^1.0.0"
+ "evp_bytestokey" "^1.0.0"
+
+"browserify-des@^1.0.0":
+ "integrity" "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A=="
+ "resolved" "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "cipher-base" "^1.0.1"
+ "des.js" "^1.0.0"
+ "inherits" "^2.0.1"
+ "safe-buffer" "^5.1.2"
+
+"browserify-rsa@^4.0.0", "browserify-rsa@^4.0.1":
+ "integrity" "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ="
+ "resolved" "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz"
+ "version" "4.0.1"
+ dependencies:
+ "bn.js" "^4.1.0"
+ "randombytes" "^2.0.1"
+
+"browserify-sign@^4.0.0":
+ "integrity" "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA=="
+ "resolved" "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz"
+ "version" "4.2.0"
+ dependencies:
+ "bn.js" "^5.1.1"
+ "browserify-rsa" "^4.0.1"
+ "create-hash" "^1.2.0"
+ "create-hmac" "^1.1.7"
+ "elliptic" "^6.5.2"
+ "inherits" "^2.0.4"
+ "parse-asn1" "^5.1.5"
+ "readable-stream" "^3.6.0"
+ "safe-buffer" "^5.2.0"
+
+"browserify-zlib@^0.2.0":
+ "integrity" "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA=="
+ "resolved" "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz"
+ "version" "0.2.0"
+ dependencies:
+ "pako" "~1.0.5"
+
+"browserslist@^4", "browserslist@^4.0.0", "browserslist@^4.11.1", "browserslist@^4.12.0", "browserslist@^4.20.2", "browserslist@^4.6.2", "browserslist@^4.6.4", "browserslist@^4.8.5", "browserslist@^4.9.1", "browserslist@>= 4.21.0":
+ "integrity" "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ=="
+ "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz"
+ "version" "4.21.3"
+ dependencies:
+ "caniuse-lite" "^1.0.30001370"
+ "electron-to-chromium" "^1.4.202"
+ "node-releases" "^2.0.6"
+ "update-browserslist-db" "^1.0.5"
+
+"browserslist@4.10.0":
+ "integrity" "sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA=="
+ "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.10.0.tgz"
+ "version" "4.10.0"
+ dependencies:
+ "caniuse-lite" "^1.0.30001035"
+ "electron-to-chromium" "^1.3.378"
+ "node-releases" "^1.1.52"
+ "pkg-up" "^3.1.0"
+
+"bs-platform@^7.1.1":
+ "integrity" "sha512-seJL5g4anK9la4erv+B2o2sMHQCxDF6OCRl9en3hbaUos/S3JsusQ0sPp4ORsbx5eXfHLYBwPljwKXlgpXtsgQ=="
+ "resolved" "https://registry.npmjs.org/bs-platform/-/bs-platform-7.3.2.tgz"
+ "version" "7.3.2"
+
+"bs-platform@^8.2.0":
+ "integrity" "sha512-9q7S4/LLV/a68CweN382NJdCCr/lOSsJR3oQYnmPK98ChfO/AdiA3lYQkQTp6T+U0I5Z5RypUAUprNstwDtMDQ=="
+ "resolved" "https://registry.npmjs.org/bs-platform/-/bs-platform-8.4.2.tgz"
+ "version" "8.4.2"
+
+"bser@2.1.1":
+ "integrity" "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ=="
+ "resolved" "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz"
+ "version" "2.1.1"
+ dependencies:
+ "node-int64" "^0.4.0"
+
+"btoa-lite@^1.0.0":
+ "integrity" "sha1-M3dm2hWAEhD92VbCLpxokaudAzc="
+ "resolved" "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz"
+ "version" "1.0.0"
+
+"btoa@1.1.2":
+ "integrity" "sha1-PkC4FmP4HS3WWWpMtxSo3BbPq+A="
+ "resolved" "https://registry.npmjs.org/btoa/-/btoa-1.1.2.tgz"
+ "version" "1.1.2"
+
+"buffer-from@^1.0.0":
+ "integrity" "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
+ "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz"
+ "version" "1.1.1"
+
+"buffer-indexof@^1.0.0":
+ "integrity" "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g=="
+ "resolved" "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz"
+ "version" "1.1.1"
+
+"buffer-xor@^1.0.3":
+ "integrity" "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
+ "resolved" "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz"
+ "version" "1.0.3"
+
+"buffer@^4.3.0":
+ "integrity" "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg=="
+ "resolved" "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz"
+ "version" "4.9.2"
+ dependencies:
+ "base64-js" "^1.0.2"
+ "ieee754" "^1.1.4"
+ "isarray" "^1.0.0"
+
+"buffer@^5.1.0":
+ "integrity" "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw=="
+ "resolved" "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz"
+ "version" "5.6.0"
+ dependencies:
+ "base64-js" "^1.0.2"
+ "ieee754" "^1.1.4"
+
+"builtin-status-codes@^3.0.0":
+ "integrity" "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
+ "resolved" "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz"
+ "version" "3.0.0"
+
+"builtins@^1.0.3":
+ "integrity" "sha1-y5T662HIaWRR2zZTThQi+U8K7og="
+ "resolved" "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz"
+ "version" "1.0.3"
+
+"byline@^5.0.0":
+ "integrity" "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE="
+ "resolved" "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz"
+ "version" "5.0.0"
+
+"byte-size@^5.0.1":
+ "integrity" "sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw=="
+ "resolved" "https://registry.npmjs.org/byte-size/-/byte-size-5.0.1.tgz"
+ "version" "5.0.1"
+
+"bytes@3.0.0":
+ "integrity" "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
+ "resolved" "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz"
+ "version" "3.0.0"
+
+"bytes@3.1.0":
+ "integrity" "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
+ "resolved" "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz"
+ "version" "3.1.0"
+
+"c3@^0.4.11", "c3@~0.4.11":
+ "integrity" "sha512-mVCFtN5ZWUT5UE7ilFQ7KBQ7TUCdKIq6KsDt1hH/1m6gC1tBjvzFTO7fqhaiWHfhNOjjM7makschdhg6DkWQMA=="
+ "resolved" "https://registry.npmjs.org/c3/-/c3-0.4.24.tgz"
+ "version" "0.4.24"
+ dependencies:
+ "d3" "~3.5.0"
+
+"cacache@^12.0.0", "cacache@^12.0.3":
+ "version" "12.0.3"
+ dependencies:
+ "bluebird" "^3.5.5"
+ "chownr" "^1.1.1"
+ "figgy-pudding" "^3.5.1"
+ "glob" "^7.1.4"
+ "graceful-fs" "^4.1.15"
+ "infer-owner" "^1.0.3"
+ "lru-cache" "^5.1.1"
+ "mississippi" "^3.0.0"
+ "mkdirp" "^0.5.1"
+ "move-concurrently" "^1.0.1"
+ "promise-inflight" "^1.0.1"
+ "rimraf" "^2.6.3"
+ "ssri" "^6.0.1"
+ "unique-filename" "^1.1.1"
+ "y18n" "^4.0.0"
+
+"cacache@^12.0.2":
+ "integrity" "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ=="
+ "resolved" "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz"
+ "version" "12.0.4"
+ dependencies:
+ "bluebird" "^3.5.5"
+ "chownr" "^1.1.1"
+ "figgy-pudding" "^3.5.1"
+ "glob" "^7.1.4"
+ "graceful-fs" "^4.1.15"
+ "infer-owner" "^1.0.3"
+ "lru-cache" "^5.1.1"
+ "mississippi" "^3.0.0"
+ "mkdirp" "^0.5.1"
+ "move-concurrently" "^1.0.1"
+ "promise-inflight" "^1.0.1"
+ "rimraf" "^2.6.3"
+ "ssri" "^6.0.1"
+ "unique-filename" "^1.1.1"
+ "y18n" "^4.0.0"
+
+"cacache@^13.0.1":
+ "integrity" "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w=="
+ "resolved" "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz"
+ "version" "13.0.1"
+ dependencies:
+ "chownr" "^1.1.2"
+ "figgy-pudding" "^3.5.1"
+ "fs-minipass" "^2.0.0"
+ "glob" "^7.1.4"
+ "graceful-fs" "^4.2.2"
+ "infer-owner" "^1.0.4"
+ "lru-cache" "^5.1.1"
+ "minipass" "^3.0.0"
+ "minipass-collect" "^1.0.2"
+ "minipass-flush" "^1.0.5"
+ "minipass-pipeline" "^1.2.2"
+ "mkdirp" "^0.5.1"
+ "move-concurrently" "^1.0.1"
+ "p-map" "^3.0.0"
+ "promise-inflight" "^1.0.1"
+ "rimraf" "^2.7.1"
+ "ssri" "^7.0.0"
+ "unique-filename" "^1.1.1"
+
+"cache-base@^1.0.1":
+ "integrity" "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ=="
+ "resolved" "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "collection-visit" "^1.0.0"
+ "component-emitter" "^1.2.1"
+ "get-value" "^2.0.6"
+ "has-value" "^1.0.0"
+ "isobject" "^3.0.1"
+ "set-value" "^2.0.0"
+ "to-object-path" "^0.3.0"
+ "union-value" "^1.0.0"
+ "unset-value" "^1.0.0"
+
+"cachedir@2.2.0":
+ "integrity" "sha512-VvxA0xhNqIIfg0V9AmJkDg91DaJwryutH5rVEZAhcNi4iJFj9f+QxmAjgK1LT9I8OgToX27fypX6/MeCXVbBjQ=="
+ "resolved" "https://registry.npmjs.org/cachedir/-/cachedir-2.2.0.tgz"
+ "version" "2.2.0"
+
+"call-bind@^1.0.0", "call-bind@^1.0.2":
+ "integrity" "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA=="
+ "resolved" "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "function-bind" "^1.1.1"
+ "get-intrinsic" "^1.0.2"
+
+"call-limit@^1.1.1":
+ "integrity" "sha512-5twvci5b9eRBw2wCfPtN0GmlR2/gadZqyFpPhOK6CvMFoFgA+USnZ6Jpu1lhG9h85pQ3Ouil3PfXWRD4EUaRiQ=="
+ "resolved" "https://registry.npmjs.org/call-limit/-/call-limit-1.1.1.tgz"
+ "version" "1.1.1"
+
+"call-me-maybe@^1.0.1":
+ "integrity" "sha1-JtII6onje1y95gJQoV8DHBak1ms="
+ "resolved" "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz"
+ "version" "1.0.1"
+
+"caller-callsite@^2.0.0":
+ "integrity" "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ="
+ "resolved" "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "callsites" "^2.0.0"
+
+"caller-path@^2.0.0":
+ "integrity" "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ="
+ "resolved" "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "caller-callsite" "^2.0.0"
+
+"callsites@^2.0.0":
+ "integrity" "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA="
+ "resolved" "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz"
+ "version" "2.0.0"
+
+"callsites@^3.0.0":
+ "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
+ "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
+ "version" "3.1.0"
+
+"camel-case@^4.1.1":
+ "integrity" "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q=="
+ "resolved" "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz"
+ "version" "4.1.1"
+ dependencies:
+ "pascal-case" "^3.1.1"
+ "tslib" "^1.10.0"
+
+"camelcase-keys@^6.2.2":
+ "integrity" "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg=="
+ "resolved" "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz"
+ "version" "6.2.2"
+ dependencies:
+ "camelcase" "^5.3.1"
+ "map-obj" "^4.0.0"
+ "quick-lru" "^4.0.1"
+
+"camelcase@^4.0.0", "camelcase@^4.1.0":
+ "integrity" "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
+ "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz"
+ "version" "4.1.0"
+
+"camelcase@^5.0.0", "camelcase@^5.3.1", "camelcase@5.3.1":
+ "integrity" "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+ "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz"
+ "version" "5.3.1"
+
+"camelcase@^6.0.0":
+ "integrity" "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w=="
+ "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz"
+ "version" "6.0.0"
+
+"camelcase@5.0.0":
+ "integrity" "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA=="
+ "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz"
+ "version" "5.0.0"
+
+"caniuse-api@^3.0.0":
+ "integrity" "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw=="
+ "resolved" "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "browserslist" "^4.0.0"
+ "caniuse-lite" "^1.0.0"
+ "lodash.memoize" "^4.1.2"
+ "lodash.uniq" "^4.5.0"
+
+"caniuse-lite@^1.0.0", "caniuse-lite@^1.0.30000981", "caniuse-lite@^1.0.30001035", "caniuse-lite@^1.0.30001061", "caniuse-lite@^1.0.30001370":
+ "integrity" "sha512-swMpEoTp5vDoGBZsYZX7L7nXHe6dsHxi9o6/LKf/f0LukVtnrxly5GVb/fWdCDTqi/yw6Km6tiJ0pmBacm0gbg=="
+ "resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001383.tgz"
+ "version" "1.0.30001383"
+
+"capture-exit@^2.0.0":
+ "integrity" "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g=="
+ "resolved" "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "rsvp" "^4.8.4"
+
+"capture-stack-trace@^1.0.0":
+ "version" "1.0.0"
+
+"cardinal@^2.1.1":
+ "integrity" "sha1-fMEFXYItISlU0HsIXeolHMe8VQU="
+ "resolved" "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz"
+ "version" "2.1.1"
+ dependencies:
+ "ansicolors" "~0.3.2"
+ "redeyed" "~2.1.0"
+
+"case-sensitive-paths-webpack-plugin@2.3.0":
+ "integrity" "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ=="
+ "resolved" "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz"
+ "version" "2.3.0"
+
+"caseless@~0.12.0":
+ "integrity" "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+ "resolved" "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz"
+ "version" "0.12.0"
+
+"chalk@^1.1.3":
+ "integrity" "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg="
+ "resolved" "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz"
+ "version" "1.1.3"
+ dependencies:
+ "ansi-styles" "^2.2.1"
+ "escape-string-regexp" "^1.0.2"
+ "has-ansi" "^2.0.0"
+ "strip-ansi" "^3.0.0"
+ "supports-color" "^2.0.0"
+
+"chalk@^2.0.0", "chalk@^2.0.1", "chalk@^2.1.0", "chalk@^2.3.2", "chalk@^2.4.1", "chalk@^2.4.2", "chalk@2.4.2":
+ "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="
+ "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
+ "version" "2.4.2"
+ dependencies:
+ "ansi-styles" "^3.2.1"
+ "escape-string-regexp" "^1.0.5"
+ "supports-color" "^5.3.0"
+
+"chalk@^3.0.0":
+ "integrity" "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="
+ "resolved" "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "ansi-styles" "^4.1.0"
+ "supports-color" "^7.1.0"
+
+"change-emitter@^0.1.2":
+ "integrity" "sha512-YXzt1cQ4a2jqazhcuSWEOc1K2q8g9H6eWNsyZgi640LDzRWVQ2eDe+Y/kVdftH+vYdPF2rgDb3dLdpxE1jvAxw=="
+ "resolved" "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz"
+ "version" "0.1.6"
+
+"chardet@^0.7.0":
+ "integrity" "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
+ "resolved" "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz"
+ "version" "0.7.0"
+
+"chokidar@^2.1.8":
+ "integrity" "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg=="
+ "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz"
+ "version" "2.1.8"
+ dependencies:
+ "anymatch" "^2.0.0"
+ "async-each" "^1.0.1"
+ "braces" "^2.3.2"
+ "glob-parent" "^3.1.0"
+ "inherits" "^2.0.3"
+ "is-binary-path" "^1.0.0"
+ "is-glob" "^4.0.0"
+ "normalize-path" "^3.0.0"
+ "path-is-absolute" "^1.0.0"
+ "readdirp" "^2.2.1"
+ "upath" "^1.1.1"
+ optionalDependencies:
+ "fsevents" "^1.2.7"
+
+"chokidar@^3.3.0":
+ "integrity" "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ=="
+ "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz"
+ "version" "3.4.0"
+ dependencies:
+ "anymatch" "~3.1.1"
+ "braces" "~3.0.2"
+ "glob-parent" "~5.1.0"
+ "is-binary-path" "~2.1.0"
+ "is-glob" "~4.0.1"
+ "normalize-path" "~3.0.0"
+ "readdirp" "~3.4.0"
optionalDependencies:
- fsevents "^1.2.7"
-
-chokidar@^3.3.0, chokidar@^3.4.0:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8"
- integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==
- dependencies:
- anymatch "~3.1.1"
- braces "~3.0.2"
- glob-parent "~5.1.0"
- is-binary-path "~2.1.0"
- is-glob "~4.0.1"
- normalize-path "~3.0.0"
- readdirp "~3.4.0"
+ "fsevents" "~2.1.2"
+
+"chokidar@^3.4.0":
+ "integrity" "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ=="
+ "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz"
+ "version" "3.4.0"
+ dependencies:
+ "anymatch" "~3.1.1"
+ "braces" "~3.0.2"
+ "glob-parent" "~5.1.0"
+ "is-binary-path" "~2.1.0"
+ "is-glob" "~4.0.1"
+ "normalize-path" "~3.0.0"
+ "readdirp" "~3.4.0"
optionalDependencies:
- fsevents "~2.1.2"
-
-chownr@^1.1.1, chownr@^1.1.2, chownr@^1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
- integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
-
-chrome-trace-event@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4"
- integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==
- dependencies:
- tslib "^1.9.0"
-
-ci-info@^1.5.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497"
- integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==
-
-ci-info@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
- integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
-
-cidr-regex@^2.0.10:
- version "2.0.10"
- resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-2.0.10.tgz#af13878bd4ad704de77d6dc800799358b3afa70d"
- integrity sha512-sB3ogMQXWvreNPbJUZMRApxuRYd+KoIo4RGQ81VatjmMW6WJPo+IJZ2846FGItr9VzKo5w7DXzijPLGtSd0N3Q==
- dependencies:
- ip-regex "^2.1.0"
-
-cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
- integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
- dependencies:
- inherits "^2.0.1"
- safe-buffer "^5.0.1"
-
-class-utils@^0.3.5:
- version "0.3.6"
- resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
- integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
- dependencies:
- arr-union "^3.1.0"
- define-property "^0.2.5"
- isobject "^3.0.0"
- static-extend "^0.1.1"
-
-classnames@^2.2.0, classnames@^2.2.5, classnames@^2.2.6:
- version "2.2.6"
- resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce"
- integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==
-
-clean-css@^4.2.3:
- version "4.2.3"
- resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78"
- integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==
- dependencies:
- source-map "~0.6.0"
-
-clean-stack@^2.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
- integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
-
-cli-boxes@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
- integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM=
-
-cli-columns@^3.1.2:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/cli-columns/-/cli-columns-3.1.2.tgz#6732d972979efc2ae444a1f08e08fa139c96a18e"
- integrity sha1-ZzLZcpee/CrkRKHwjgj6E5yWoY4=
- dependencies:
- string-width "^2.0.0"
- strip-ansi "^3.0.1"
-
-cli-cursor@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
- integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=
- dependencies:
- restore-cursor "^2.0.0"
-
-cli-cursor@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
- integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
- dependencies:
- restore-cursor "^3.1.0"
-
-cli-table3@^0.5.0, cli-table3@^0.5.1:
- version "0.5.1"
- resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202"
- integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==
- dependencies:
- object-assign "^4.1.0"
- string-width "^2.1.1"
+ "fsevents" "~2.1.2"
+
+"chownr@^1.1.1", "chownr@^1.1.2", "chownr@^1.1.4":
+ "integrity" "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
+ "resolved" "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz"
+ "version" "1.1.4"
+
+"chrome-trace-event@^1.0.2":
+ "integrity" "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ=="
+ "resolved" "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "tslib" "^1.9.0"
+
+"ci-info@^1.5.0":
+ "integrity" "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A=="
+ "resolved" "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz"
+ "version" "1.6.0"
+
+"ci-info@^2.0.0":
+ "integrity" "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
+ "resolved" "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz"
+ "version" "2.0.0"
+
+"cidr-regex@^2.0.10":
+ "integrity" "sha512-sB3ogMQXWvreNPbJUZMRApxuRYd+KoIo4RGQ81VatjmMW6WJPo+IJZ2846FGItr9VzKo5w7DXzijPLGtSd0N3Q=="
+ "resolved" "https://registry.npmjs.org/cidr-regex/-/cidr-regex-2.0.10.tgz"
+ "version" "2.0.10"
+ dependencies:
+ "ip-regex" "^2.1.0"
+
+"cipher-base@^1.0.0", "cipher-base@^1.0.1", "cipher-base@^1.0.3":
+ "integrity" "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q=="
+ "resolved" "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz"
+ "version" "1.0.4"
+ dependencies:
+ "inherits" "^2.0.1"
+ "safe-buffer" "^5.0.1"
+
+"class-utils@^0.3.5":
+ "integrity" "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg=="
+ "resolved" "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz"
+ "version" "0.3.6"
+ dependencies:
+ "arr-union" "^3.1.0"
+ "define-property" "^0.2.5"
+ "isobject" "^3.0.0"
+ "static-extend" "^0.1.1"
+
+"classnames@^2.2.0", "classnames@^2.2.5", "classnames@^2.2.6", "classnames@>= 2.0.0 < 3.0.0":
+ "integrity" "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q=="
+ "resolved" "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz"
+ "version" "2.2.6"
+
+"clean-css@^4.2.3":
+ "integrity" "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA=="
+ "resolved" "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz"
+ "version" "4.2.3"
+ dependencies:
+ "source-map" "~0.6.0"
+
+"clean-stack@^2.0.0":
+ "integrity" "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="
+ "resolved" "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz"
+ "version" "2.2.0"
+
+"cli-boxes@^1.0.0":
+ "integrity" "sha1-T6kXw+WclKAEzWH47lCdplFocUM="
+ "resolved" "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz"
+ "version" "1.0.0"
+
+"cli-columns@^3.1.2":
+ "integrity" "sha1-ZzLZcpee/CrkRKHwjgj6E5yWoY4="
+ "resolved" "https://registry.npmjs.org/cli-columns/-/cli-columns-3.1.2.tgz"
+ "version" "3.1.2"
+ dependencies:
+ "string-width" "^2.0.0"
+ "strip-ansi" "^3.0.1"
+
+"cli-cursor@^2.1.0":
+ "integrity" "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU="
+ "resolved" "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "restore-cursor" "^2.0.0"
+
+"cli-cursor@^3.1.0":
+ "integrity" "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw=="
+ "resolved" "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "restore-cursor" "^3.1.0"
+
+"cli-table@^0.3.1":
+ "integrity" "sha1-9TsFJmqLGguTSz0IIebi3FkUriM="
+ "resolved" "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz"
+ "version" "0.3.1"
+ dependencies:
+ "colors" "1.0.3"
+
+"cli-table3@^0.5.0", "cli-table3@^0.5.1":
+ "integrity" "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw=="
+ "resolved" "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz"
+ "version" "0.5.1"
+ dependencies:
+ "object-assign" "^4.1.0"
+ "string-width" "^2.1.1"
optionalDependencies:
- colors "^1.1.2"
-
-cli-table@^0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23"
- integrity sha1-9TsFJmqLGguTSz0IIebi3FkUriM=
- dependencies:
- colors "1.0.3"
-
-cli-width@^2.0.0:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48"
- integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==
-
-cliui@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
- integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=
- dependencies:
- string-width "^1.0.1"
- strip-ansi "^3.0.1"
- wrap-ansi "^2.0.0"
-
-cliui@^4.0.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
- integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==
- dependencies:
- string-width "^2.1.1"
- strip-ansi "^4.0.0"
- wrap-ansi "^2.0.0"
-
-cliui@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
- integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
- dependencies:
- string-width "^3.1.0"
- strip-ansi "^5.2.0"
- wrap-ansi "^5.1.0"
-
-cliui@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
- integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==
- dependencies:
- string-width "^4.2.0"
- strip-ansi "^6.0.0"
- wrap-ansi "^6.2.0"
-
-clone-deep@^0.2.4:
- version "0.2.4"
- resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6"
- integrity sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=
- dependencies:
- for-own "^0.1.3"
- is-plain-object "^2.0.1"
- kind-of "^3.0.2"
- lazy-cache "^1.0.3"
- shallow-clone "^0.1.2"
-
-clone-deep@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
- integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==
- dependencies:
- is-plain-object "^2.0.4"
- kind-of "^6.0.2"
- shallow-clone "^3.0.0"
-
-clone@^1.0.2:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
- integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
-
-cmd-shim@^3.0.0, cmd-shim@^3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-3.0.3.tgz#2c35238d3df37d98ecdd7d5f6b8dc6b21cadc7cb"
- integrity sha512-DtGg+0xiFhQIntSBRzL2fRQBnmtAVwXIDo4Qq46HPpObYquxMaZS4sb82U9nH91qJrlosC1wa9gwr0QyL/HypA==
- dependencies:
- graceful-fs "^4.1.2"
- mkdirp "~0.5.0"
-
-co@^4.6.0:
- version "4.6.0"
- resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
- integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
-
-coa@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3"
- integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==
+ "colors" "^1.1.2"
+
+"cli-width@^2.0.0":
+ "integrity" "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw=="
+ "resolved" "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz"
+ "version" "2.2.1"
+
+"cliui@^4.0.0":
+ "integrity" "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ=="
+ "resolved" "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz"
+ "version" "4.1.0"
+ dependencies:
+ "string-width" "^2.1.1"
+ "strip-ansi" "^4.0.0"
+ "wrap-ansi" "^2.0.0"
+
+"cliui@^5.0.0":
+ "integrity" "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA=="
+ "resolved" "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz"
+ "version" "5.0.0"
+ dependencies:
+ "string-width" "^3.1.0"
+ "strip-ansi" "^5.2.0"
+ "wrap-ansi" "^5.1.0"
+
+"cliui@^6.0.0":
+ "integrity" "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ=="
+ "resolved" "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz"
+ "version" "6.0.0"
+ dependencies:
+ "string-width" "^4.2.0"
+ "strip-ansi" "^6.0.0"
+ "wrap-ansi" "^6.2.0"
+
+"clone-deep@^0.2.4":
+ "integrity" "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY="
+ "resolved" "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz"
+ "version" "0.2.4"
+ dependencies:
+ "for-own" "^0.1.3"
+ "is-plain-object" "^2.0.1"
+ "kind-of" "^3.0.2"
+ "lazy-cache" "^1.0.3"
+ "shallow-clone" "^0.1.2"
+
+"clone-deep@^4.0.1":
+ "integrity" "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ=="
+ "resolved" "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz"
+ "version" "4.0.1"
+ dependencies:
+ "is-plain-object" "^2.0.4"
+ "kind-of" "^6.0.2"
+ "shallow-clone" "^3.0.0"
+
+"clone@^1.0.2":
+ "integrity" "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
+ "resolved" "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz"
+ "version" "1.0.4"
+
+"cmd-shim@^3.0.0", "cmd-shim@^3.0.3":
+ "integrity" "sha512-DtGg+0xiFhQIntSBRzL2fRQBnmtAVwXIDo4Qq46HPpObYquxMaZS4sb82U9nH91qJrlosC1wa9gwr0QyL/HypA=="
+ "resolved" "https://registry.npmjs.org/cmd-shim/-/cmd-shim-3.0.3.tgz"
+ "version" "3.0.3"
+ dependencies:
+ "graceful-fs" "^4.1.2"
+ "mkdirp" "~0.5.0"
+
+"co@^4.6.0":
+ "integrity" "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
+ "resolved" "https://registry.npmjs.org/co/-/co-4.6.0.tgz"
+ "version" "4.6.0"
+
+"coa@^2.0.2":
+ "integrity" "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA=="
+ "resolved" "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz"
+ "version" "2.0.2"
dependencies:
"@types/q" "^1.5.1"
- chalk "^2.4.1"
- q "^1.1.2"
-
-code-point-at@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
- integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
-
-collection-visit@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
- integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
- dependencies:
- map-visit "^1.0.0"
- object-visit "^1.0.0"
-
-color-convert@^1.9.0, color-convert@^1.9.1:
- version "1.9.3"
- resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
- integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
- dependencies:
- color-name "1.1.3"
-
-color-convert@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
- integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
- dependencies:
- color-name "~1.1.4"
-
-color-name@1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
- integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
-
-color-name@^1.0.0, color-name@~1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
- integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-
-color-string@^1.5.2:
- version "1.5.3"
- resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc"
- integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==
- dependencies:
- color-name "^1.0.0"
- simple-swizzle "^0.2.2"
-
-color@^3.0.0:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10"
- integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==
- dependencies:
- color-convert "^1.9.1"
- color-string "^1.5.2"
-
-colors@1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
- integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=
-
-colors@^1.1.2:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
- integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
-
-columnify@~1.5.4:
- version "1.5.4"
- resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb"
- integrity sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=
- dependencies:
- strip-ansi "^3.0.0"
- wcwidth "^1.0.0"
-
-combined-stream@^1.0.6, combined-stream@~1.0.6:
- version "1.0.8"
- resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
- integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
- dependencies:
- delayed-stream "~1.0.0"
-
-commander@^2.11.0, commander@^2.20.0, commander@~2.20.3:
- version "2.20.3"
- resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
- integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
-
-commander@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
- integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
-
-commitizen@^4.0.3:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-4.1.2.tgz#6095eb825fd3f0d3611df88e6803c69b23307e9a"
- integrity sha512-LBxTQKHbVgroMz9ohpm86N+GfJobonGyvDc3zBGdZazbwCLz2tqLa48Rf2TnAdKx7/06W1i1R3SXUt5QW97qVQ==
- dependencies:
- cachedir "2.2.0"
- cz-conventional-changelog "3.2.0"
- dedent "0.7.0"
- detect-indent "6.0.0"
- find-node-modules "2.0.0"
- find-root "1.1.0"
- fs-extra "8.1.0"
- glob "7.1.4"
- inquirer "6.5.0"
- is-utf8 "^0.2.1"
- lodash "4.17.15"
- minimist "1.2.5"
- strip-bom "4.0.0"
- strip-json-comments "3.0.1"
-
-common-tags@^1.8.0:
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937"
- integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==
-
-commondir@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
- integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
-
-compare-func@^1.3.1:
- version "1.3.4"
- resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.4.tgz#6b07c4c5e8341119baf44578085bda0f4a823516"
- integrity sha512-sq2sWtrqKPkEXAC8tEJA1+BqAH9GbFkGBtUOqrUX57VSfwp8xyktctk+uLoRy5eccTdxzDcVIztlYDpKs3Jv1Q==
- dependencies:
- array-ify "^1.0.0"
- dot-prop "^3.0.0"
-
-component-emitter@^1.2.1:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
- integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
-
-compose-function@3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f"
- integrity sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=
- dependencies:
- arity-n "^1.0.4"
-
-compressible@~2.0.16:
- version "2.0.18"
- resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba"
- integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==
- dependencies:
- mime-db ">= 1.43.0 < 2"
-
-compression@^1.7.4:
- version "1.7.4"
- resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f"
- integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==
- dependencies:
- accepts "~1.3.5"
- bytes "3.0.0"
- compressible "~2.0.16"
- debug "2.6.9"
- on-headers "~1.0.2"
- safe-buffer "5.1.2"
- vary "~1.1.2"
-
-concat-map@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
- integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
-
-concat-stream@^1.5.0:
- version "1.6.2"
- resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
- integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
- dependencies:
- buffer-from "^1.0.0"
- inherits "^2.0.3"
- readable-stream "^2.2.2"
- typedarray "^0.0.6"
-
-concat-with-sourcemaps@*:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e"
- integrity sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==
- dependencies:
- source-map "^0.6.1"
-
-config-chain@^1.1.12:
- version "1.1.12"
- resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa"
- integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==
- dependencies:
- ini "^1.3.4"
- proto-list "~1.2.1"
-
-configstore@^3.0.0:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f"
- integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==
- dependencies:
- dot-prop "^4.1.0"
- graceful-fs "^4.1.2"
- make-dir "^1.0.0"
- unique-string "^1.0.0"
- write-file-atomic "^2.0.0"
- xdg-basedir "^3.0.0"
-
-confusing-browser-globals@^1.0.9:
- version "1.0.9"
- resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd"
- integrity sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==
-
-connect-history-api-fallback@^1.6.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc"
- integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==
-
-console-browserify@^1.1.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
- integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==
-
-console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
- integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
-
-constants-browserify@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
- integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
-
-contains-path@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a"
- integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=
-
-content-disposition@0.5.3:
- version "0.5.3"
- resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
- integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
- dependencies:
- safe-buffer "5.1.2"
-
-content-type@~1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
- integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
-
-conventional-changelog-angular@^5.0.0:
- version "5.0.10"
- resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.10.tgz#5cf7b00dd315b6a6a558223c80d5ef24ddb34205"
- integrity sha512-k7RPPRs0vp8+BtPsM9uDxRl6KcgqtCJmzRD1wRtgqmhQ96g8ifBGo9O/TZBG23jqlXS/rg8BKRDELxfnQQGiaA==
- dependencies:
- compare-func "^1.3.1"
- q "^1.5.1"
-
-conventional-changelog-writer@^4.0.0:
- version "4.0.16"
- resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.16.tgz#ca10f2691a8ea6d3c2eb74bd35bcf40aa052dda5"
- integrity sha512-jmU1sDJDZpm/dkuFxBeRXvyNcJQeKhGtVcFFkwTphUAzyYWcwz2j36Wcv+Mv2hU3tpvLMkysOPXJTLO55AUrYQ==
- dependencies:
- compare-func "^1.3.1"
- conventional-commits-filter "^2.0.6"
- dateformat "^3.0.0"
- handlebars "^4.7.6"
- json-stringify-safe "^5.0.1"
- lodash "^4.17.15"
- meow "^7.0.0"
- semver "^6.0.0"
- split "^1.0.0"
- through2 "^3.0.0"
-
-conventional-commit-types@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz#7c9214e58eae93e85dd66dbfbafe7e4fffa2365b"
- integrity sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==
-
-conventional-commits-filter@^2.0.0, conventional-commits-filter@^2.0.6:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.6.tgz#0935e1240c5ca7698329affee1b6a46d33324c4c"
- integrity sha512-4g+sw8+KA50/Qwzfr0hL5k5NWxqtrOVw4DDk3/h6L85a9Gz0/Eqp3oP+CWCNfesBvZZZEFHF7OTEbRe+yYSyKw==
- dependencies:
- lodash.ismatch "^4.4.0"
- modify-values "^1.0.0"
-
-conventional-commits-parser@^3.0.0, conventional-commits-parser@^3.0.7:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.1.0.tgz#10140673d5e7ef5572633791456c5d03b69e8be4"
- integrity sha512-RSo5S0WIwXZiRxUGTPuYFbqvrR4vpJ1BDdTlthFgvHt5kEdnd1+pdvwWphWn57/oIl4V72NMmOocFqqJ8mFFhA==
- dependencies:
- JSONStream "^1.0.4"
- is-text-path "^1.0.1"
- lodash "^4.17.15"
- meow "^7.0.0"
- split2 "^2.0.0"
- through2 "^3.0.0"
- trim-off-newlines "^1.0.0"
-
-convert-source-map@1.7.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.7.0:
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
- integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
- dependencies:
- safe-buffer "~5.1.1"
-
-convert-source-map@^0.3.3:
- version "0.3.5"
- resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190"
- integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA=
-
-cookie-signature@1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
- integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
-
-cookie@0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
- integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
-
-cookie@^0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
- integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=
-
-copy-concurrently@^1.0.0:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
- integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==
- dependencies:
- aproba "^1.1.1"
- fs-write-stream-atomic "^1.0.8"
- iferr "^0.1.5"
- mkdirp "^0.5.1"
- rimraf "^2.5.4"
- run-queue "^1.0.0"
-
-copy-descriptor@^0.1.0:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
- integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
-
-core-js-compat@^3.6.2:
- version "3.6.5"
- resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c"
- integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==
- dependencies:
- browserslist "^4.8.5"
- semver "7.0.0"
-
-core-js-pure@^3.0.0:
- version "3.6.5"
- resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813"
- integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==
-
-core-js@^1.0.0:
- version "1.2.7"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
- integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=
-
-core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.1, core-js@^2.6.5:
- version "2.6.11"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c"
- integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==
-
-core-js@^2.6.4:
- version "2.6.12"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
- integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
-
-core-js@^3.5.0:
- version "3.6.5"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a"
- integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==
-
-core-js@^3.8.3:
- version "3.16.1"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.16.1.tgz#f4485ce5c9f3c6a7cb18fa80488e08d362097249"
- integrity sha512-AAkP8i35EbefU+JddyWi12AWE9f2N/qr/pwnDtWz4nyUIBGMJPX99ANFFRSw6FefM374lDujdtLDyhN2A/btHw==
-
-core-util-is@1.0.2, core-util-is@~1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
- integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
-
-cosmiconfig@^5.0.0, cosmiconfig@^5.2.0, cosmiconfig@^5.2.1:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
- integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==
- dependencies:
- import-fresh "^2.0.0"
- is-directory "^0.3.1"
- js-yaml "^3.13.1"
- parse-json "^4.0.0"
-
-cosmiconfig@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982"
- integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==
+ "chalk" "^2.4.1"
+ "q" "^1.1.2"
+
+"code-point-at@^1.0.0":
+ "integrity" "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
+ "resolved" "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz"
+ "version" "1.1.0"
+
+"collection-visit@^1.0.0":
+ "integrity" "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA="
+ "resolved" "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "map-visit" "^1.0.0"
+ "object-visit" "^1.0.0"
+
+"color-convert@^1.9.0", "color-convert@^1.9.1":
+ "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="
+ "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"
+ "version" "1.9.3"
+ dependencies:
+ "color-name" "1.1.3"
+
+"color-convert@^2.0.1":
+ "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="
+ "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
+ "version" "2.0.1"
+ dependencies:
+ "color-name" "~1.1.4"
+
+"color-name@^1.0.0", "color-name@~1.1.4":
+ "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
+ "version" "1.1.4"
+
+"color-name@^1.1.1":
+ "version" "1.1.3"
+
+"color-name@1.1.3":
+ "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+ "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
+ "version" "1.1.3"
+
+"color-string@^1.5.2":
+ "integrity" "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw=="
+ "resolved" "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz"
+ "version" "1.5.3"
+ dependencies:
+ "color-name" "^1.0.0"
+ "simple-swizzle" "^0.2.2"
+
+"color@^3.0.0":
+ "integrity" "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg=="
+ "resolved" "https://registry.npmjs.org/color/-/color-3.1.2.tgz"
+ "version" "3.1.2"
+ dependencies:
+ "color-convert" "^1.9.1"
+ "color-string" "^1.5.2"
+
+"colors@^1.1.2":
+ "version" "1.3.3"
+
+"colors@1.0.3":
+ "integrity" "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs="
+ "resolved" "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz"
+ "version" "1.0.3"
+
+"columnify@~1.5.4":
+ "integrity" "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs="
+ "resolved" "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz"
+ "version" "1.5.4"
+ dependencies:
+ "strip-ansi" "^3.0.0"
+ "wcwidth" "^1.0.0"
+
+"combined-stream@^1.0.6", "combined-stream@~1.0.6":
+ "integrity" "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="
+ "resolved" "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz"
+ "version" "1.0.8"
+ dependencies:
+ "delayed-stream" "~1.0.0"
+
+"combined-stream@1.0.6":
+ "version" "1.0.6"
+ dependencies:
+ "delayed-stream" "~1.0.0"
+
+"commander@^2.11.0", "commander@^2.20.0", "commander@~2.20.3":
+ "integrity" "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ "resolved" "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz"
+ "version" "2.20.3"
+
+"commander@^4.1.1":
+ "integrity" "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="
+ "resolved" "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz"
+ "version" "4.1.1"
+
+"commitizen@^4.0.3":
+ "integrity" "sha512-LBxTQKHbVgroMz9ohpm86N+GfJobonGyvDc3zBGdZazbwCLz2tqLa48Rf2TnAdKx7/06W1i1R3SXUt5QW97qVQ=="
+ "resolved" "https://registry.npmjs.org/commitizen/-/commitizen-4.1.2.tgz"
+ "version" "4.1.2"
+ dependencies:
+ "cachedir" "2.2.0"
+ "cz-conventional-changelog" "3.2.0"
+ "dedent" "0.7.0"
+ "detect-indent" "6.0.0"
+ "find-node-modules" "2.0.0"
+ "find-root" "1.1.0"
+ "fs-extra" "8.1.0"
+ "glob" "7.1.4"
+ "inquirer" "6.5.0"
+ "is-utf8" "^0.2.1"
+ "lodash" "4.17.15"
+ "minimist" "1.2.5"
+ "strip-bom" "4.0.0"
+ "strip-json-comments" "3.0.1"
+
+"common-tags@^1.8.0":
+ "integrity" "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw=="
+ "resolved" "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz"
+ "version" "1.8.0"
+
+"commondir@^1.0.1":
+ "integrity" "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
+ "resolved" "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz"
+ "version" "1.0.1"
+
+"compare-func@^1.3.1":
+ "integrity" "sha512-sq2sWtrqKPkEXAC8tEJA1+BqAH9GbFkGBtUOqrUX57VSfwp8xyktctk+uLoRy5eccTdxzDcVIztlYDpKs3Jv1Q=="
+ "resolved" "https://registry.npmjs.org/compare-func/-/compare-func-1.3.4.tgz"
+ "version" "1.3.4"
+ dependencies:
+ "array-ify" "^1.0.0"
+ "dot-prop" "^3.0.0"
+
+"component-emitter@^1.2.1":
+ "integrity" "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
+ "resolved" "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz"
+ "version" "1.3.0"
+
+"compose-function@3.0.3":
+ "integrity" "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8="
+ "resolved" "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz"
+ "version" "3.0.3"
+ dependencies:
+ "arity-n" "^1.0.4"
+
+"compressible@~2.0.16":
+ "integrity" "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg=="
+ "resolved" "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz"
+ "version" "2.0.18"
+ dependencies:
+ "mime-db" ">= 1.43.0 < 2"
+
+"compression@^1.7.4":
+ "integrity" "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ=="
+ "resolved" "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz"
+ "version" "1.7.4"
+ dependencies:
+ "accepts" "~1.3.5"
+ "bytes" "3.0.0"
+ "compressible" "~2.0.16"
+ "debug" "2.6.9"
+ "on-headers" "~1.0.2"
+ "safe-buffer" "5.1.2"
+ "vary" "~1.1.2"
+
+"concat-map@0.0.1":
+ "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
+ "version" "0.0.1"
+
+"concat-stream@^1.5.0":
+ "integrity" "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw=="
+ "resolved" "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz"
+ "version" "1.6.2"
+ dependencies:
+ "buffer-from" "^1.0.0"
+ "inherits" "^2.0.3"
+ "readable-stream" "^2.2.2"
+ "typedarray" "^0.0.6"
+
+"concat-with-sourcemaps@*":
+ "integrity" "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg=="
+ "resolved" "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "source-map" "^0.6.1"
+
+"config-chain@^1.1.12":
+ "integrity" "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA=="
+ "resolved" "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz"
+ "version" "1.1.12"
+ dependencies:
+ "ini" "^1.3.4"
+ "proto-list" "~1.2.1"
+
+"configstore@^3.0.0":
+ "integrity" "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw=="
+ "resolved" "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz"
+ "version" "3.1.2"
+ dependencies:
+ "dot-prop" "^4.1.0"
+ "graceful-fs" "^4.1.2"
+ "make-dir" "^1.0.0"
+ "unique-string" "^1.0.0"
+ "write-file-atomic" "^2.0.0"
+ "xdg-basedir" "^3.0.0"
+
+"confusing-browser-globals@^1.0.9":
+ "integrity" "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw=="
+ "resolved" "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz"
+ "version" "1.0.9"
+
+"connect-history-api-fallback@^1.6.0":
+ "integrity" "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg=="
+ "resolved" "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz"
+ "version" "1.6.0"
+
+"console-browserify@^1.1.0":
+ "integrity" "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA=="
+ "resolved" "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz"
+ "version" "1.2.0"
+
+"console-control-strings@^1.0.0", "console-control-strings@^1.1.0", "console-control-strings@~1.1.0":
+ "integrity" "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
+ "resolved" "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz"
+ "version" "1.1.0"
+
+"constants-browserify@^1.0.0":
+ "integrity" "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U="
+ "resolved" "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz"
+ "version" "1.0.0"
+
+"contains-path@^0.1.0":
+ "integrity" "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo="
+ "resolved" "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz"
+ "version" "0.1.0"
+
+"content-disposition@0.5.3":
+ "integrity" "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g=="
+ "resolved" "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz"
+ "version" "0.5.3"
+ dependencies:
+ "safe-buffer" "5.1.2"
+
+"content-type@~1.0.4":
+ "integrity" "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
+ "resolved" "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz"
+ "version" "1.0.4"
+
+"conventional-changelog-angular@^5.0.0":
+ "integrity" "sha512-k7RPPRs0vp8+BtPsM9uDxRl6KcgqtCJmzRD1wRtgqmhQ96g8ifBGo9O/TZBG23jqlXS/rg8BKRDELxfnQQGiaA=="
+ "resolved" "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.10.tgz"
+ "version" "5.0.10"
+ dependencies:
+ "compare-func" "^1.3.1"
+ "q" "^1.5.1"
+
+"conventional-changelog-writer@^4.0.0":
+ "integrity" "sha512-jmU1sDJDZpm/dkuFxBeRXvyNcJQeKhGtVcFFkwTphUAzyYWcwz2j36Wcv+Mv2hU3tpvLMkysOPXJTLO55AUrYQ=="
+ "resolved" "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.16.tgz"
+ "version" "4.0.16"
+ dependencies:
+ "compare-func" "^1.3.1"
+ "conventional-commits-filter" "^2.0.6"
+ "dateformat" "^3.0.0"
+ "handlebars" "^4.7.6"
+ "json-stringify-safe" "^5.0.1"
+ "lodash" "^4.17.15"
+ "meow" "^7.0.0"
+ "semver" "^6.0.0"
+ "split" "^1.0.0"
+ "through2" "^3.0.0"
+
+"conventional-commit-types@^3.0.0":
+ "integrity" "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg=="
+ "resolved" "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz"
+ "version" "3.0.0"
+
+"conventional-commits-filter@^2.0.0", "conventional-commits-filter@^2.0.6":
+ "integrity" "sha512-4g+sw8+KA50/Qwzfr0hL5k5NWxqtrOVw4DDk3/h6L85a9Gz0/Eqp3oP+CWCNfesBvZZZEFHF7OTEbRe+yYSyKw=="
+ "resolved" "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.6.tgz"
+ "version" "2.0.6"
+ dependencies:
+ "lodash.ismatch" "^4.4.0"
+ "modify-values" "^1.0.0"
+
+"conventional-commits-parser@^3.0.0", "conventional-commits-parser@^3.0.7":
+ "integrity" "sha512-RSo5S0WIwXZiRxUGTPuYFbqvrR4vpJ1BDdTlthFgvHt5kEdnd1+pdvwWphWn57/oIl4V72NMmOocFqqJ8mFFhA=="
+ "resolved" "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "is-text-path" "^1.0.1"
+ "JSONStream" "^1.0.4"
+ "lodash" "^4.17.15"
+ "meow" "^7.0.0"
+ "split2" "^2.0.0"
+ "through2" "^3.0.0"
+ "trim-off-newlines" "^1.0.0"
+
+"convert-source-map@^0.3.3":
+ "integrity" "sha1-8dgClQr33SYxof6+BZZVDIarMZA="
+ "resolved" "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz"
+ "version" "0.3.5"
+
+"convert-source-map@^1.4.0", "convert-source-map@^1.5.0", "convert-source-map@^1.7.0", "convert-source-map@1.7.0":
+ "integrity" "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA=="
+ "resolved" "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz"
+ "version" "1.7.0"
+ dependencies:
+ "safe-buffer" "~5.1.1"
+
+"cookie-signature@1.0.6":
+ "integrity" "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
+ "resolved" "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz"
+ "version" "1.0.6"
+
+"cookie@^0.3.1":
+ "integrity" "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
+ "resolved" "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz"
+ "version" "0.3.1"
+
+"cookie@0.4.0":
+ "integrity" "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
+ "resolved" "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz"
+ "version" "0.4.0"
+
+"copy-concurrently@^1.0.0":
+ "integrity" "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A=="
+ "resolved" "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz"
+ "version" "1.0.5"
+ dependencies:
+ "aproba" "^1.1.1"
+ "fs-write-stream-atomic" "^1.0.8"
+ "iferr" "^0.1.5"
+ "mkdirp" "^0.5.1"
+ "rimraf" "^2.5.4"
+ "run-queue" "^1.0.0"
+
+"copy-descriptor@^0.1.0":
+ "integrity" "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
+ "resolved" "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz"
+ "version" "0.1.1"
+
+"core-js-compat@^3.6.2":
+ "integrity" "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng=="
+ "resolved" "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz"
+ "version" "3.6.5"
+ dependencies:
+ "browserslist" "^4.8.5"
+ "semver" "7.0.0"
+
+"core-js-pure@^3.0.0":
+ "integrity" "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA=="
+ "resolved" "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz"
+ "version" "3.6.5"
+
+"core-js@^1.0.0":
+ "integrity" "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
+ "resolved" "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz"
+ "version" "1.2.7"
+
+"core-js@^2.4.0", "core-js@^2.5.0", "core-js@^2.5.1", "core-js@^2.6.5":
+ "integrity" "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
+ "resolved" "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz"
+ "version" "2.6.11"
+
+"core-js@^2.6.4":
+ "integrity" "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
+ "resolved" "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz"
+ "version" "2.6.12"
+
+"core-js@^3.5.0":
+ "integrity" "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA=="
+ "resolved" "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz"
+ "version" "3.6.5"
+
+"core-js@^3.8.3":
+ "integrity" "sha512-AAkP8i35EbefU+JddyWi12AWE9f2N/qr/pwnDtWz4nyUIBGMJPX99ANFFRSw6FefM374lDujdtLDyhN2A/btHw=="
+ "resolved" "https://registry.npmjs.org/core-js/-/core-js-3.16.1.tgz"
+ "version" "3.16.1"
+
+"core-util-is@~1.0.0", "core-util-is@1.0.2":
+ "integrity" "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+ "resolved" "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz"
+ "version" "1.0.2"
+
+"cosmiconfig@^5.0.0", "cosmiconfig@^5.2.0", "cosmiconfig@^5.2.1":
+ "integrity" "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA=="
+ "resolved" "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz"
+ "version" "5.2.1"
+ dependencies:
+ "import-fresh" "^2.0.0"
+ "is-directory" "^0.3.1"
+ "js-yaml" "^3.13.1"
+ "parse-json" "^4.0.0"
+
+"cosmiconfig@^6.0.0":
+ "integrity" "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg=="
+ "resolved" "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz"
+ "version" "6.0.0"
dependencies:
"@types/parse-json" "^4.0.0"
- import-fresh "^3.1.0"
- parse-json "^5.0.0"
- path-type "^4.0.0"
- yaml "^1.7.2"
-
-create-ecdh@^4.0.0:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
- integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==
- dependencies:
- bn.js "^4.1.0"
- elliptic "^6.0.0"
-
-create-error-class@^3.0.0:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
- integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=
- dependencies:
- capture-stack-trace "^1.0.0"
-
-create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
- integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
- dependencies:
- cipher-base "^1.0.1"
- inherits "^2.0.1"
- md5.js "^1.3.4"
- ripemd160 "^2.0.1"
- sha.js "^2.4.0"
-
-create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
- version "1.1.7"
- resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
- integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
- dependencies:
- cipher-base "^1.0.3"
- create-hash "^1.1.0"
- inherits "^2.0.1"
- ripemd160 "^2.0.0"
- safe-buffer "^5.0.1"
- sha.js "^2.4.8"
-
-create-react-class@^15.5.1, create-react-class@^15.6.0:
- version "15.6.3"
- resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.3.tgz#2d73237fb3f970ae6ebe011a9e66f46dbca80036"
- integrity sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==
- dependencies:
- fbjs "^0.8.9"
- loose-envify "^1.3.1"
- object-assign "^4.1.1"
-
-create-react-context@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.3.0.tgz#546dede9dc422def0d3fc2fe03afe0bc0f4f7d8c"
- integrity sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw==
- dependencies:
- gud "^1.0.0"
- warning "^4.0.3"
-
-cross-fetch@^3.0.4:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.4.tgz#7bef7020207e684a7638ef5f2f698e24d9eb283c"
- integrity sha512-MSHgpjQqgbT/94D4CyADeNoYh52zMkCX4pcJvPP5WqPsLFMKjr2TCMg381ox5qI0ii2dPwaLx/00477knXqXVw==
- dependencies:
- node-fetch "2.6.0"
- whatwg-fetch "3.0.0"
-
-cross-spawn@7.0.1:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14"
- integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==
- dependencies:
- path-key "^3.1.0"
- shebang-command "^2.0.0"
- which "^2.0.1"
-
-cross-spawn@^5.0.1:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
- integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=
- dependencies:
- lru-cache "^4.0.1"
- shebang-command "^1.2.0"
- which "^1.2.9"
-
-cross-spawn@^6.0.0, cross-spawn@^6.0.5:
- version "6.0.5"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
- integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
- dependencies:
- nice-try "^1.0.4"
- path-key "^2.0.1"
- semver "^5.5.0"
- shebang-command "^1.2.0"
- which "^1.2.9"
-
-cross-spawn@^7.0.0:
- version "7.0.2"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6"
- integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==
- dependencies:
- path-key "^3.1.0"
- shebang-command "^2.0.0"
- which "^2.0.1"
-
-crypto-browserify@^3.11.0:
- version "3.12.0"
- resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
- integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
- dependencies:
- browserify-cipher "^1.0.0"
- browserify-sign "^4.0.0"
- create-ecdh "^4.0.0"
- create-hash "^1.1.0"
- create-hmac "^1.1.0"
- diffie-hellman "^5.0.0"
- inherits "^2.0.1"
- pbkdf2 "^3.0.3"
- public-encrypt "^4.0.0"
- randombytes "^2.0.0"
- randomfill "^1.0.3"
-
-crypto-js@^3.1.9-1:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.3.0.tgz#846dd1cce2f68aacfa156c8578f926a609b7976b"
- integrity sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==
-
-crypto-js@^4.0.0:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf"
- integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==
-
-crypto-random-string@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
- integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=
-
-css-blank-pseudo@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5"
- integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==
- dependencies:
- postcss "^7.0.5"
-
-css-color-names@0.0.4, css-color-names@^0.0.4:
- version "0.0.4"
- resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
- integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=
-
-css-declaration-sorter@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22"
- integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==
- dependencies:
- postcss "^7.0.1"
- timsort "^0.3.0"
-
-css-element-queries@^1.0.1:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/css-element-queries/-/css-element-queries-1.2.3.tgz#e14940b1fcd4bf0da60ea4145d05742d7172e516"
- integrity sha512-QK9uovYmKTsV2GXWQiMOByVNrLn2qz6m3P7vWpOR4IdD6I3iXoDw5qtgJEN3Xq7gIbdHVKvzHjdAtcl+4Arc4Q==
-
-css-has-pseudo@^0.10.0:
- version "0.10.0"
- resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee"
- integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==
- dependencies:
- postcss "^7.0.6"
- postcss-selector-parser "^5.0.0-rc.4"
-
-css-loader@3.4.2:
- version "3.4.2"
- resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.2.tgz#d3fdb3358b43f233b78501c5ed7b1c6da6133202"
- integrity sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==
- dependencies:
- camelcase "^5.3.1"
- cssesc "^3.0.0"
- icss-utils "^4.1.1"
- loader-utils "^1.2.3"
- normalize-path "^3.0.0"
- postcss "^7.0.23"
- postcss-modules-extract-imports "^2.0.0"
- postcss-modules-local-by-default "^3.0.2"
- postcss-modules-scope "^2.1.1"
- postcss-modules-values "^3.0.0"
- postcss-value-parser "^4.0.2"
- schema-utils "^2.6.0"
-
-css-prefers-color-scheme@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4"
- integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==
- dependencies:
- postcss "^7.0.5"
-
-css-select-base-adapter@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7"
- integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==
-
-css-select@^1.1.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
- integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=
- dependencies:
- boolbase "~1.0.0"
- css-what "2.1"
- domutils "1.5.1"
- nth-check "~1.0.1"
-
-css-select@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef"
- integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==
- dependencies:
- boolbase "^1.0.0"
- css-what "^3.2.1"
- domutils "^1.7.0"
- nth-check "^1.0.2"
-
-css-tree@1.0.0-alpha.37:
- version "1.0.0-alpha.37"
- resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22"
- integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==
- dependencies:
- mdn-data "2.0.4"
- source-map "^0.6.1"
-
-css-tree@1.0.0-alpha.39:
- version "1.0.0-alpha.39"
- resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb"
- integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==
- dependencies:
- mdn-data "2.0.6"
- source-map "^0.6.1"
-
-css-what@2.1:
- version "2.1.3"
- resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2"
- integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==
-
-css-what@^3.2.1:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1"
- integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==
-
-css.escape@1.5.1:
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb"
- integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=
-
-css@^2.0.0:
- version "2.2.4"
- resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929"
- integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==
- dependencies:
- inherits "^2.0.3"
- source-map "^0.6.1"
- source-map-resolve "^0.5.2"
- urix "^0.1.0"
-
-cssdb@^4.4.0:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0"
- integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==
-
-cssesc@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703"
- integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==
-
-cssesc@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
- integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
-
-cssnano-preset-default@^4.0.7:
- version "4.0.7"
- resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76"
- integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==
- dependencies:
- css-declaration-sorter "^4.0.1"
- cssnano-util-raw-cache "^4.0.1"
- postcss "^7.0.0"
- postcss-calc "^7.0.1"
- postcss-colormin "^4.0.3"
- postcss-convert-values "^4.0.1"
- postcss-discard-comments "^4.0.2"
- postcss-discard-duplicates "^4.0.2"
- postcss-discard-empty "^4.0.1"
- postcss-discard-overridden "^4.0.1"
- postcss-merge-longhand "^4.0.11"
- postcss-merge-rules "^4.0.3"
- postcss-minify-font-values "^4.0.2"
- postcss-minify-gradients "^4.0.2"
- postcss-minify-params "^4.0.2"
- postcss-minify-selectors "^4.0.2"
- postcss-normalize-charset "^4.0.1"
- postcss-normalize-display-values "^4.0.2"
- postcss-normalize-positions "^4.0.2"
- postcss-normalize-repeat-style "^4.0.2"
- postcss-normalize-string "^4.0.2"
- postcss-normalize-timing-functions "^4.0.2"
- postcss-normalize-unicode "^4.0.1"
- postcss-normalize-url "^4.0.1"
- postcss-normalize-whitespace "^4.0.2"
- postcss-ordered-values "^4.1.2"
- postcss-reduce-initial "^4.0.3"
- postcss-reduce-transforms "^4.0.2"
- postcss-svgo "^4.0.2"
- postcss-unique-selectors "^4.0.1"
-
-cssnano-util-get-arguments@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f"
- integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=
-
-cssnano-util-get-match@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d"
- integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=
-
-cssnano-util-raw-cache@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282"
- integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==
- dependencies:
- postcss "^7.0.0"
-
-cssnano-util-same-parent@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3"
- integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==
-
-cssnano@^4.1.10:
- version "4.1.10"
- resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2"
- integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==
- dependencies:
- cosmiconfig "^5.0.0"
- cssnano-preset-default "^4.0.7"
- is-resolvable "^1.0.0"
- postcss "^7.0.0"
-
-csso@^4.0.2:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903"
- integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==
- dependencies:
- css-tree "1.0.0-alpha.39"
-
-cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4:
- version "0.3.8"
- resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
- integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==
-
-cssstyle@^1.0.0, cssstyle@^1.1.1:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1"
- integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==
- dependencies:
- cssom "0.3.x"
-
-csstype@^2.2.0, csstype@^2.5.7, csstype@^2.6.7:
- version "2.6.10"
- resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.10.tgz#e63af50e66d7c266edb6b32909cfd0aabe03928b"
- integrity sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w==
-
-cyclist@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
- integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
-
-cz-conventional-changelog@3.2.0, cz-conventional-changelog@^3.0.2:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-3.2.0.tgz#6aef1f892d64113343d7e455529089ac9f20e477"
- integrity sha512-yAYxeGpVi27hqIilG1nh4A9Bnx4J3Ov+eXy4koL3drrR+IO9GaWPsKjik20ht608Asqi8TQPf0mczhEeyAtMzg==
- dependencies:
- chalk "^2.4.1"
- commitizen "^4.0.3"
- conventional-commit-types "^3.0.0"
- lodash.map "^4.5.1"
- longest "^2.0.1"
- word-wrap "^1.0.3"
+ "import-fresh" "^3.1.0"
+ "parse-json" "^5.0.0"
+ "path-type" "^4.0.0"
+ "yaml" "^1.7.2"
+
+"create-ecdh@^4.0.0":
+ "integrity" "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw=="
+ "resolved" "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz"
+ "version" "4.0.3"
+ dependencies:
+ "bn.js" "^4.1.0"
+ "elliptic" "^6.0.0"
+
+"create-error-class@^3.0.0":
+ "integrity" "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y="
+ "resolved" "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz"
+ "version" "3.0.2"
+ dependencies:
+ "capture-stack-trace" "^1.0.0"
+
+"create-hash@^1.1.0", "create-hash@^1.1.2", "create-hash@^1.2.0":
+ "integrity" "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg=="
+ "resolved" "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz"
+ "version" "1.2.0"
+ dependencies:
+ "cipher-base" "^1.0.1"
+ "inherits" "^2.0.1"
+ "md5.js" "^1.3.4"
+ "ripemd160" "^2.0.1"
+ "sha.js" "^2.4.0"
+
+"create-hmac@^1.1.0", "create-hmac@^1.1.4", "create-hmac@^1.1.7":
+ "integrity" "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg=="
+ "resolved" "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz"
+ "version" "1.1.7"
+ dependencies:
+ "cipher-base" "^1.0.3"
+ "create-hash" "^1.1.0"
+ "inherits" "^2.0.1"
+ "ripemd160" "^2.0.0"
+ "safe-buffer" "^5.0.1"
+ "sha.js" "^2.4.8"
+
+"create-react-class@^15.5.1", "create-react-class@^15.6.0":
+ "integrity" "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg=="
+ "resolved" "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz"
+ "version" "15.6.3"
+ dependencies:
+ "fbjs" "^0.8.9"
+ "loose-envify" "^1.3.1"
+ "object-assign" "^4.1.1"
+
+"create-react-context@^0.3.0":
+ "integrity" "sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw=="
+ "resolved" "https://registry.npmjs.org/create-react-context/-/create-react-context-0.3.0.tgz"
+ "version" "0.3.0"
+ dependencies:
+ "gud" "^1.0.0"
+ "warning" "^4.0.3"
+
+"cross-fetch@^3.0.4":
+ "integrity" "sha512-MSHgpjQqgbT/94D4CyADeNoYh52zMkCX4pcJvPP5WqPsLFMKjr2TCMg381ox5qI0ii2dPwaLx/00477knXqXVw=="
+ "resolved" "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.4.tgz"
+ "version" "3.0.4"
+ dependencies:
+ "node-fetch" "2.6.0"
+ "whatwg-fetch" "3.0.0"
+
+"cross-spawn@^5.0.1":
+ "integrity" "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk="
+ "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz"
+ "version" "5.1.0"
+ dependencies:
+ "lru-cache" "^4.0.1"
+ "shebang-command" "^1.2.0"
+ "which" "^1.2.9"
+
+"cross-spawn@^6.0.0", "cross-spawn@^6.0.5":
+ "integrity" "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ=="
+ "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz"
+ "version" "6.0.5"
+ dependencies:
+ "nice-try" "^1.0.4"
+ "path-key" "^2.0.1"
+ "semver" "^5.5.0"
+ "shebang-command" "^1.2.0"
+ "which" "^1.2.9"
+
+"cross-spawn@^7.0.0":
+ "integrity" "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw=="
+ "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz"
+ "version" "7.0.2"
+ dependencies:
+ "path-key" "^3.1.0"
+ "shebang-command" "^2.0.0"
+ "which" "^2.0.1"
+
+"cross-spawn@7.0.1":
+ "integrity" "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg=="
+ "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz"
+ "version" "7.0.1"
+ dependencies:
+ "path-key" "^3.1.0"
+ "shebang-command" "^2.0.0"
+ "which" "^2.0.1"
+
+"crypto-browserify@^3.11.0":
+ "integrity" "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg=="
+ "resolved" "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz"
+ "version" "3.12.0"
+ dependencies:
+ "browserify-cipher" "^1.0.0"
+ "browserify-sign" "^4.0.0"
+ "create-ecdh" "^4.0.0"
+ "create-hash" "^1.1.0"
+ "create-hmac" "^1.1.0"
+ "diffie-hellman" "^5.0.0"
+ "inherits" "^2.0.1"
+ "pbkdf2" "^3.0.3"
+ "public-encrypt" "^4.0.0"
+ "randombytes" "^2.0.0"
+ "randomfill" "^1.0.3"
+
+"crypto-js@^3.1.9-1":
+ "integrity" "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q=="
+ "resolved" "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz"
+ "version" "3.3.0"
+
+"crypto-js@^4.0.0":
+ "integrity" "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw=="
+ "resolved" "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz"
+ "version" "4.1.1"
+
+"crypto-random-string@^1.0.0":
+ "integrity" "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4="
+ "resolved" "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz"
+ "version" "1.0.0"
+
+"css-blank-pseudo@^0.1.4":
+ "integrity" "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w=="
+ "resolved" "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz"
+ "version" "0.1.4"
+ dependencies:
+ "postcss" "^7.0.5"
+
+"css-color-names@^0.0.4", "css-color-names@0.0.4":
+ "integrity" "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA="
+ "resolved" "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz"
+ "version" "0.0.4"
+
+"css-declaration-sorter@^4.0.1":
+ "integrity" "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA=="
+ "resolved" "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz"
+ "version" "4.0.1"
+ dependencies:
+ "postcss" "^7.0.1"
+ "timsort" "^0.3.0"
+
+"css-element-queries@^1.0.1":
+ "integrity" "sha512-QK9uovYmKTsV2GXWQiMOByVNrLn2qz6m3P7vWpOR4IdD6I3iXoDw5qtgJEN3Xq7gIbdHVKvzHjdAtcl+4Arc4Q=="
+ "resolved" "https://registry.npmjs.org/css-element-queries/-/css-element-queries-1.2.3.tgz"
+ "version" "1.2.3"
+
+"css-has-pseudo@^0.10.0":
+ "integrity" "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ=="
+ "resolved" "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz"
+ "version" "0.10.0"
+ dependencies:
+ "postcss" "^7.0.6"
+ "postcss-selector-parser" "^5.0.0-rc.4"
+
+"css-loader@3.4.2":
+ "integrity" "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA=="
+ "resolved" "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz"
+ "version" "3.4.2"
+ dependencies:
+ "camelcase" "^5.3.1"
+ "cssesc" "^3.0.0"
+ "icss-utils" "^4.1.1"
+ "loader-utils" "^1.2.3"
+ "normalize-path" "^3.0.0"
+ "postcss" "^7.0.23"
+ "postcss-modules-extract-imports" "^2.0.0"
+ "postcss-modules-local-by-default" "^3.0.2"
+ "postcss-modules-scope" "^2.1.1"
+ "postcss-modules-values" "^3.0.0"
+ "postcss-value-parser" "^4.0.2"
+ "schema-utils" "^2.6.0"
+
+"css-prefers-color-scheme@^3.1.1":
+ "integrity" "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg=="
+ "resolved" "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz"
+ "version" "3.1.1"
+ dependencies:
+ "postcss" "^7.0.5"
+
+"css-select-base-adapter@^0.1.1":
+ "integrity" "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w=="
+ "resolved" "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz"
+ "version" "0.1.1"
+
+"css-select@^1.1.0":
+ "integrity" "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg="
+ "resolved" "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz"
+ "version" "1.2.0"
+ dependencies:
+ "boolbase" "~1.0.0"
+ "css-what" "2.1"
+ "domutils" "1.5.1"
+ "nth-check" "~1.0.1"
+
+"css-select@^2.0.0":
+ "integrity" "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ=="
+ "resolved" "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "boolbase" "^1.0.0"
+ "css-what" "^3.2.1"
+ "domutils" "^1.7.0"
+ "nth-check" "^1.0.2"
+
+"css-tree@1.0.0-alpha.37":
+ "integrity" "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg=="
+ "resolved" "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz"
+ "version" "1.0.0-alpha.37"
+ dependencies:
+ "mdn-data" "2.0.4"
+ "source-map" "^0.6.1"
+
+"css-tree@1.0.0-alpha.39":
+ "integrity" "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA=="
+ "resolved" "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz"
+ "version" "1.0.0-alpha.39"
+ dependencies:
+ "mdn-data" "2.0.6"
+ "source-map" "^0.6.1"
+
+"css-what@^3.2.1":
+ "integrity" "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw=="
+ "resolved" "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz"
+ "version" "3.2.1"
+
+"css-what@2.1":
+ "integrity" "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg=="
+ "resolved" "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz"
+ "version" "2.1.3"
+
+"css.escape@1.5.1":
+ "integrity" "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s="
+ "resolved" "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz"
+ "version" "1.5.1"
+
+"css@^2.0.0":
+ "integrity" "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw=="
+ "resolved" "https://registry.npmjs.org/css/-/css-2.2.4.tgz"
+ "version" "2.2.4"
+ dependencies:
+ "inherits" "^2.0.3"
+ "source-map" "^0.6.1"
+ "source-map-resolve" "^0.5.2"
+ "urix" "^0.1.0"
+
+"cssdb@^4.4.0":
+ "integrity" "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ=="
+ "resolved" "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz"
+ "version" "4.4.0"
+
+"cssesc@^2.0.0":
+ "integrity" "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg=="
+ "resolved" "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz"
+ "version" "2.0.0"
+
+"cssesc@^3.0.0":
+ "integrity" "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="
+ "resolved" "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz"
+ "version" "3.0.0"
+
+"cssnano-preset-default@^4.0.7":
+ "integrity" "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA=="
+ "resolved" "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz"
+ "version" "4.0.7"
+ dependencies:
+ "css-declaration-sorter" "^4.0.1"
+ "cssnano-util-raw-cache" "^4.0.1"
+ "postcss" "^7.0.0"
+ "postcss-calc" "^7.0.1"
+ "postcss-colormin" "^4.0.3"
+ "postcss-convert-values" "^4.0.1"
+ "postcss-discard-comments" "^4.0.2"
+ "postcss-discard-duplicates" "^4.0.2"
+ "postcss-discard-empty" "^4.0.1"
+ "postcss-discard-overridden" "^4.0.1"
+ "postcss-merge-longhand" "^4.0.11"
+ "postcss-merge-rules" "^4.0.3"
+ "postcss-minify-font-values" "^4.0.2"
+ "postcss-minify-gradients" "^4.0.2"
+ "postcss-minify-params" "^4.0.2"
+ "postcss-minify-selectors" "^4.0.2"
+ "postcss-normalize-charset" "^4.0.1"
+ "postcss-normalize-display-values" "^4.0.2"
+ "postcss-normalize-positions" "^4.0.2"
+ "postcss-normalize-repeat-style" "^4.0.2"
+ "postcss-normalize-string" "^4.0.2"
+ "postcss-normalize-timing-functions" "^4.0.2"
+ "postcss-normalize-unicode" "^4.0.1"
+ "postcss-normalize-url" "^4.0.1"
+ "postcss-normalize-whitespace" "^4.0.2"
+ "postcss-ordered-values" "^4.1.2"
+ "postcss-reduce-initial" "^4.0.3"
+ "postcss-reduce-transforms" "^4.0.2"
+ "postcss-svgo" "^4.0.2"
+ "postcss-unique-selectors" "^4.0.1"
+
+"cssnano-util-get-arguments@^4.0.0":
+ "integrity" "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8="
+ "resolved" "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz"
+ "version" "4.0.0"
+
+"cssnano-util-get-match@^4.0.0":
+ "integrity" "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0="
+ "resolved" "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz"
+ "version" "4.0.0"
+
+"cssnano-util-raw-cache@^4.0.1":
+ "integrity" "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA=="
+ "resolved" "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz"
+ "version" "4.0.1"
+ dependencies:
+ "postcss" "^7.0.0"
+
+"cssnano-util-same-parent@^4.0.0":
+ "integrity" "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q=="
+ "resolved" "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz"
+ "version" "4.0.1"
+
+"cssnano@^4.1.10":
+ "integrity" "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ=="
+ "resolved" "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz"
+ "version" "4.1.10"
+ dependencies:
+ "cosmiconfig" "^5.0.0"
+ "cssnano-preset-default" "^4.0.7"
+ "is-resolvable" "^1.0.0"
+ "postcss" "^7.0.0"
+
+"csso@^4.0.2":
+ "integrity" "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ=="
+ "resolved" "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz"
+ "version" "4.0.3"
+ dependencies:
+ "css-tree" "1.0.0-alpha.39"
+
+"cssom@^0.3.4", "cssom@>= 0.3.2 < 0.4.0", "cssom@0.3.x":
+ "integrity" "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
+ "resolved" "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz"
+ "version" "0.3.8"
+
+"cssstyle@^1.0.0", "cssstyle@^1.1.1":
+ "integrity" "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA=="
+ "resolved" "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz"
+ "version" "1.4.0"
+ dependencies:
+ "cssom" "0.3.x"
+
+"csstype@^2.2.0", "csstype@^2.5.7", "csstype@^2.6.7":
+ "integrity" "sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w=="
+ "resolved" "https://registry.npmjs.org/csstype/-/csstype-2.6.10.tgz"
+ "version" "2.6.10"
+
+"cyclist@^1.0.1":
+ "integrity" "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk="
+ "resolved" "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz"
+ "version" "1.0.1"
+
+"cyclist@~0.2.2":
+ "version" "0.2.2"
+
+"cz-conventional-changelog@^3.0.2", "cz-conventional-changelog@3.2.0":
+ "integrity" "sha512-yAYxeGpVi27hqIilG1nh4A9Bnx4J3Ov+eXy4koL3drrR+IO9GaWPsKjik20ht608Asqi8TQPf0mczhEeyAtMzg=="
+ "resolved" "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.2.0.tgz"
+ "version" "3.2.0"
+ dependencies:
+ "chalk" "^2.4.1"
+ "commitizen" "^4.0.3"
+ "conventional-commit-types" "^3.0.0"
+ "lodash.map" "^4.5.1"
+ "longest" "^2.0.1"
+ "word-wrap" "^1.0.3"
optionalDependencies:
"@commitlint/load" ">6.1.1"
-d3-array@^1.2.0:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f"
- integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==
-
-d3-collection@1:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e"
- integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==
-
-d3-color@1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a"
- integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==
-
-d3-ease@^1.0.0:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.7.tgz#9a834890ef8b8ae8c558b2fe55bd57f5993b85e2"
- integrity sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==
-
-d3-format@1:
- version "1.4.5"
- resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.5.tgz#374f2ba1320e3717eb74a9356c67daee17a7edb4"
- integrity sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==
-
-d3-interpolate@1, d3-interpolate@^1.1.1:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987"
- integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==
- dependencies:
- d3-color "1"
-
-d3-path@1:
- version "1.0.9"
- resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf"
- integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==
-
-d3-scale@^1.0.0:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-1.0.7.tgz#fa90324b3ea8a776422bd0472afab0b252a0945d"
- integrity sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==
- dependencies:
- d3-array "^1.2.0"
- d3-collection "1"
- d3-color "1"
- d3-format "1"
- d3-interpolate "1"
- d3-time "1"
- d3-time-format "2"
-
-d3-shape@^1.0.0, d3-shape@^1.2.0:
- version "1.3.7"
- resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7"
- integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==
- dependencies:
- d3-path "1"
-
-d3-time-format@2:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.3.0.tgz#107bdc028667788a8924ba040faf1fbccd5a7850"
- integrity sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==
- dependencies:
- d3-time "1"
-
-d3-time@1:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1"
- integrity sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==
-
-d3-timer@^1.0.0:
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5"
- integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==
-
-d3@~3.5.0, d3@~3.5.17:
- version "3.5.17"
- resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8"
- integrity sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=
-
-d@1, d@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
- integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
- dependencies:
- es5-ext "^0.10.50"
- type "^1.0.1"
-
-damerau-levenshtein@^1.0.4:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791"
- integrity sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==
-
-dashdash@^1.12.0:
- version "1.14.1"
- resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
- integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
- dependencies:
- assert-plus "^1.0.0"
-
-data-urls@^1.0.0, data-urls@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe"
- integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==
- dependencies:
- abab "^2.0.0"
- whatwg-mimetype "^2.2.0"
- whatwg-url "^7.0.0"
-
-datatables.net-bs@>=1.10.9:
- version "1.10.21"
- resolved "https://registry.yarnpkg.com/datatables.net-bs/-/datatables.net-bs-1.10.21.tgz#c80e655033787512423ad78a45e8164f25417dc5"
- integrity sha512-4mpesFXNEkLlQET3IDLclLz95Xit4Kp/jHcOM2X0nc/ijDfO3qJk3ehZ+NSEAkXZDge6ZtY5Zxq2O90ISiIjwQ==
- dependencies:
- datatables.net "1.10.21"
- jquery ">=1.7"
-
-datatables.net-colreorder-bs@~1.3.2:
- version "1.3.3"
- resolved "https://registry.yarnpkg.com/datatables.net-colreorder-bs/-/datatables.net-colreorder-bs-1.3.3.tgz#3a9dcb08deebeb5d854079591e06e493ad793a53"
- integrity sha1-Op3LCN7r612FQHlZHgbkk615OlM=
- dependencies:
- datatables.net-bs ">=1.10.9"
- datatables.net-colreorder ">=1.2.0"
- jquery ">=1.7"
-
-datatables.net-colreorder@>=1.2.0, datatables.net-colreorder@^1.4.1:
- version "1.5.2"
- resolved "https://registry.yarnpkg.com/datatables.net-colreorder/-/datatables.net-colreorder-1.5.2.tgz#c425cee1f88b3246be0363c67a152be743ca6bce"
- integrity sha512-77ShdeM7QjKI6M1jfWQ4ZempSYMmmpe9NqjimHBp+o9lAto789YdCLiFrW71dwn1v8Awp4qcMShqHNxGzR/HVg==
- dependencies:
- datatables.net "^1.10.15"
- jquery ">=1.7"
-
-datatables.net-select@~1.2.0:
- version "1.2.7"
- resolved "https://registry.yarnpkg.com/datatables.net-select/-/datatables.net-select-1.2.7.tgz#7d5badfca49c438f8b51df04483d8d77857e917c"
- integrity sha512-C3XDi7wpruGjDXV36dc9hN/FrAX9GOFvBZ7+KfKJTBNkGFbbhdzHS91SMeGiwRXPYivAyxfPTcVVndVaO83uBQ==
- dependencies:
- datatables.net "^1.10.15"
- jquery ">=1.7"
-
-datatables.net@1.10.21, datatables.net@^1.10.15:
- version "1.10.21"
- resolved "https://registry.yarnpkg.com/datatables.net/-/datatables.net-1.10.21.tgz#f1d35c8e5c3eb7f5caef39e80cd5b836a8c77103"
- integrity sha512-/bSZtxmf3GTpYcvEmwZ8q26I1yhSx8qklR2B+s1K8+/51UW/zc2zTYwJMqr/Z+iCYixAc00ildj4g2x0Qamolw==
- dependencies:
- jquery ">=1.7"
-
-dateformat@^3.0.0:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
- integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
-
-debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9:
- version "2.6.9"
- resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
- integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
- dependencies:
- ms "2.0.0"
-
-debug@3.1.0, debug@=3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
- integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
- dependencies:
- ms "2.0.0"
-
-debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
- integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
- dependencies:
- ms "^2.1.1"
-
-debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5:
- version "3.2.6"
- resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
- integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
- dependencies:
- ms "^2.1.1"
-
-debuglog@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
- integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=
-
-decamelize-keys@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9"
- integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=
+"d@^1.0.1", "d@1":
+ "integrity" "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA=="
+ "resolved" "https://registry.npmjs.org/d/-/d-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "es5-ext" "^0.10.50"
+ "type" "^1.0.1"
+
+"d3-array@^1.2.0":
+ "integrity" "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw=="
+ "resolved" "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz"
+ "version" "1.2.4"
+
+"d3-collection@1":
+ "integrity" "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A=="
+ "resolved" "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz"
+ "version" "1.0.7"
+
+"d3-color@1":
+ "integrity" "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q=="
+ "resolved" "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz"
+ "version" "1.4.1"
+
+"d3-dispatch@^1.0.3", "d3-dispatch@1":
+ "integrity" "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA=="
+ "resolved" "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz"
+ "version" "1.0.6"
+
+"d3-drag@1":
+ "integrity" "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w=="
+ "resolved" "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz"
+ "version" "1.2.5"
+ dependencies:
+ "d3-dispatch" "1"
+ "d3-selection" "1"
+
+"d3-ease@^1.0.0", "d3-ease@1":
+ "integrity" "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ=="
+ "resolved" "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz"
+ "version" "1.0.7"
+
+"d3-format@^1.2.0", "d3-format@1":
+ "integrity" "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ=="
+ "resolved" "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz"
+ "version" "1.4.5"
+
+"d3-graphviz@2.6.1":
+ "integrity" "sha512-878AFSagQyr5tTOrM7YiVYeUC2/NoFcOB3/oew+LAML0xekyJSw9j3WOCUMBsc95KYe9XBYZ+SKKuObVya1tJQ=="
+ "resolved" "https://registry.npmjs.org/d3-graphviz/-/d3-graphviz-2.6.1.tgz"
+ "version" "2.6.1"
+ dependencies:
+ "d3-dispatch" "^1.0.3"
+ "d3-format" "^1.2.0"
+ "d3-interpolate" "^1.1.5"
+ "d3-path" "^1.0.5"
+ "d3-selection" "^1.1.0"
+ "d3-timer" "^1.0.6"
+ "d3-transition" "^1.1.1"
+ "d3-zoom" "^1.5.0"
+ "viz.js" "^1.8.2"
+
+"d3-interpolate@^1.1.1", "d3-interpolate@^1.1.5", "d3-interpolate@1":
+ "integrity" "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA=="
+ "resolved" "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz"
+ "version" "1.4.0"
+ dependencies:
+ "d3-color" "1"
+
+"d3-path@^1.0.5", "d3-path@1":
+ "integrity" "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="
+ "resolved" "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz"
+ "version" "1.0.9"
+
+"d3-scale@^1.0.0":
+ "integrity" "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw=="
+ "resolved" "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz"
+ "version" "1.0.7"
+ dependencies:
+ "d3-array" "^1.2.0"
+ "d3-collection" "1"
+ "d3-color" "1"
+ "d3-format" "1"
+ "d3-interpolate" "1"
+ "d3-time" "1"
+ "d3-time-format" "2"
+
+"d3-selection@^1.1.0", "d3-selection@1":
+ "integrity" "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg=="
+ "resolved" "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz"
+ "version" "1.4.2"
+
+"d3-shape@^1.0.0", "d3-shape@^1.2.0":
+ "integrity" "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw=="
+ "resolved" "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz"
+ "version" "1.3.7"
+ dependencies:
+ "d3-path" "1"
+
+"d3-time-format@2":
+ "integrity" "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ=="
+ "resolved" "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz"
+ "version" "2.3.0"
+ dependencies:
+ "d3-time" "1"
+
+"d3-time@1":
+ "integrity" "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA=="
+ "resolved" "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz"
+ "version" "1.1.0"
+
+"d3-timer@^1.0.0", "d3-timer@^1.0.6", "d3-timer@1":
+ "integrity" "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw=="
+ "resolved" "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz"
+ "version" "1.0.10"
+
+"d3-transition@^1.1.1", "d3-transition@1":
+ "integrity" "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA=="
+ "resolved" "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz"
+ "version" "1.3.2"
+ dependencies:
+ "d3-color" "1"
+ "d3-dispatch" "1"
+ "d3-ease" "1"
+ "d3-interpolate" "1"
+ "d3-selection" "^1.1.0"
+ "d3-timer" "1"
+
+"d3-zoom@^1.5.0":
+ "integrity" "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ=="
+ "resolved" "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz"
+ "version" "1.8.3"
+ dependencies:
+ "d3-dispatch" "1"
+ "d3-drag" "1"
+ "d3-interpolate" "1"
+ "d3-selection" "1"
+ "d3-transition" "1"
+
+"d3@~3.5.0", "d3@~3.5.17":
+ "integrity" "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g="
+ "resolved" "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz"
+ "version" "3.5.17"
+
+"damerau-levenshtein@^1.0.4":
+ "integrity" "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug=="
+ "resolved" "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz"
+ "version" "1.0.6"
+
+"dashdash@^1.12.0":
+ "integrity" "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA="
+ "resolved" "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz"
+ "version" "1.14.1"
+ dependencies:
+ "assert-plus" "^1.0.0"
+
+"data-urls@^1.0.0", "data-urls@^1.1.0":
+ "integrity" "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ=="
+ "resolved" "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "abab" "^2.0.0"
+ "whatwg-mimetype" "^2.2.0"
+ "whatwg-url" "^7.0.0"
+
+"datatables.net-bs@>=1.10.9":
+ "integrity" "sha512-4mpesFXNEkLlQET3IDLclLz95Xit4Kp/jHcOM2X0nc/ijDfO3qJk3ehZ+NSEAkXZDge6ZtY5Zxq2O90ISiIjwQ=="
+ "resolved" "https://registry.npmjs.org/datatables.net-bs/-/datatables.net-bs-1.10.21.tgz"
+ "version" "1.10.21"
+ dependencies:
+ "datatables.net" "1.10.21"
+ "jquery" ">=1.7"
+
+"datatables.net-colreorder-bs@~1.3.2":
+ "integrity" "sha1-Op3LCN7r612FQHlZHgbkk615OlM="
+ "resolved" "https://registry.npmjs.org/datatables.net-colreorder-bs/-/datatables.net-colreorder-bs-1.3.3.tgz"
+ "version" "1.3.3"
+ dependencies:
+ "datatables.net-bs" ">=1.10.9"
+ "datatables.net-colreorder" ">=1.2.0"
+ "jquery" ">=1.7"
+
+"datatables.net-colreorder@^1.4.1", "datatables.net-colreorder@>=1.2.0":
+ "integrity" "sha512-77ShdeM7QjKI6M1jfWQ4ZempSYMmmpe9NqjimHBp+o9lAto789YdCLiFrW71dwn1v8Awp4qcMShqHNxGzR/HVg=="
+ "resolved" "https://registry.npmjs.org/datatables.net-colreorder/-/datatables.net-colreorder-1.5.2.tgz"
+ "version" "1.5.2"
+ dependencies:
+ "datatables.net" "^1.10.15"
+ "jquery" ">=1.7"
+
+"datatables.net-select@~1.2.0":
+ "integrity" "sha512-C3XDi7wpruGjDXV36dc9hN/FrAX9GOFvBZ7+KfKJTBNkGFbbhdzHS91SMeGiwRXPYivAyxfPTcVVndVaO83uBQ=="
+ "resolved" "https://registry.npmjs.org/datatables.net-select/-/datatables.net-select-1.2.7.tgz"
+ "version" "1.2.7"
+ dependencies:
+ "datatables.net" "^1.10.15"
+ "jquery" ">=1.7"
+
+"datatables.net@^1.10.15", "datatables.net@1.10.21":
+ "integrity" "sha512-/bSZtxmf3GTpYcvEmwZ8q26I1yhSx8qklR2B+s1K8+/51UW/zc2zTYwJMqr/Z+iCYixAc00ildj4g2x0Qamolw=="
+ "resolved" "https://registry.npmjs.org/datatables.net/-/datatables.net-1.10.21.tgz"
+ "version" "1.10.21"
+ dependencies:
+ "jquery" ">=1.7"
+
+"dateformat@^3.0.0":
+ "integrity" "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q=="
+ "resolved" "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz"
+ "version" "3.0.3"
+
+"debug@^2.2.0":
+ "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="
+ "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
+ "version" "2.6.9"
+ dependencies:
+ "ms" "2.0.0"
+
+"debug@^2.3.3":
+ "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="
+ "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
+ "version" "2.6.9"
+ dependencies:
+ "ms" "2.0.0"
+
+"debug@^2.6.0":
+ "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="
+ "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
+ "version" "2.6.9"
+ dependencies:
+ "ms" "2.0.0"
+
+"debug@^2.6.9":
+ "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="
+ "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
+ "version" "2.6.9"
+ dependencies:
+ "ms" "2.0.0"
+
+"debug@^3.1.0", "debug@3.1.0":
+ "integrity" "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g=="
+ "resolved" "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "ms" "2.0.0"
+
+"debug@^3.1.1":
+ "integrity" "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ=="
+ "resolved" "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz"
+ "version" "3.2.6"
+ dependencies:
+ "ms" "^2.1.1"
+
+"debug@^3.2.5":
+ "integrity" "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ=="
+ "resolved" "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz"
+ "version" "3.2.6"
+ dependencies:
+ "ms" "^2.1.1"
+
+"debug@^4.0.0", "debug@^4.0.1", "debug@^4.1.0", "debug@^4.1.1", "debug@4":
+ "integrity" "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw=="
+ "resolved" "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz"
+ "version" "4.1.1"
dependencies:
- decamelize "^1.1.0"
- map-obj "^1.0.0"
-
-decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
- integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+ "ms" "^2.1.1"
+
+"debug@2.6.9":
+ "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="
+ "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
+ "version" "2.6.9"
+ dependencies:
+ "ms" "2.0.0"
-decode-uri-component@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
- integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+"debuglog@^1.0.1":
+ "integrity" "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI="
+ "resolved" "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz"
+ "version" "1.0.1"
-dedent@0.7.0:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
- integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=
-
-deep-equal@^1.0.1, deep-equal@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a"
- integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==
- dependencies:
- is-arguments "^1.0.4"
- is-date-object "^1.0.1"
- is-regex "^1.0.4"
- object-is "^1.0.1"
- object-keys "^1.1.1"
- regexp.prototype.flags "^1.2.0"
+"decamelize-keys@^1.1.0":
+ "integrity" "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk="
+ "resolved" "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "decamelize" "^1.1.0"
+ "map-obj" "^1.0.0"
-deep-extend@0.6.0, deep-extend@^0.6.0:
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
- integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
-
-deep-extend@^0.5.1:
- version "0.5.1"
- resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.5.1.tgz#b894a9dd90d3023fbf1c55a394fb858eb2066f1f"
- integrity sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==
+"decamelize@^1.1.0", "decamelize@^1.2.0":
+ "integrity" "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+ "resolved" "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz"
+ "version" "1.2.0"
-deep-is@~0.1.3:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
- integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
+"decamelize@^1.1.1":
+ "integrity" "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+ "resolved" "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz"
+ "version" "1.2.0"
-default-gateway@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b"
- integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==
- dependencies:
- execa "^1.0.0"
- ip-regex "^2.1.0"
+"decode-uri-component@^0.2.0":
+ "integrity" "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
+ "resolved" "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz"
+ "version" "0.2.0"
-defaults@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
- integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=
- dependencies:
- clone "^1.0.2"
+"dedent@0.7.0":
+ "integrity" "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw="
+ "resolved" "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz"
+ "version" "0.7.0"
-define-properties@^1.1.2, define-properties@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
- integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+"deep-equal@^1.0.1", "deep-equal@^1.1.1":
+ "integrity" "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g=="
+ "resolved" "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz"
+ "version" "1.1.1"
dependencies:
- object-keys "^1.0.12"
+ "is-arguments" "^1.0.4"
+ "is-date-object" "^1.0.1"
+ "is-regex" "^1.0.4"
+ "object-is" "^1.0.1"
+ "object-keys" "^1.1.1"
+ "regexp.prototype.flags" "^1.2.0"
-define-property@^0.2.5:
- version "0.2.5"
- resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
- integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
- dependencies:
- is-descriptor "^0.1.0"
+"deep-extend@^0.5.1":
+ "integrity" "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w=="
+ "resolved" "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz"
+ "version" "0.5.1"
+
+"deep-extend@^0.6.0", "deep-extend@0.6.0":
+ "integrity" "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
+ "resolved" "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz"
+ "version" "0.6.0"
-define-property@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
- integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
- dependencies:
- is-descriptor "^1.0.0"
+"deep-is@~0.1.3":
+ "integrity" "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
+ "resolved" "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz"
+ "version" "0.1.3"
-define-property@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
- integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
- dependencies:
- is-descriptor "^1.0.2"
- isobject "^3.0.1"
-
-del@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4"
- integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==
+"default-gateway@^4.2.0":
+ "integrity" "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA=="
+ "resolved" "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz"
+ "version" "4.2.0"
dependencies:
- "@types/glob" "^7.1.1"
- globby "^6.1.0"
- is-path-cwd "^2.0.0"
- is-path-in-cwd "^2.0.0"
- p-map "^2.0.0"
- pify "^4.0.1"
- rimraf "^2.6.3"
-
-delaunator@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-4.0.1.tgz#3d779687f57919a7a418f8ab947d3bddb6846957"
- integrity sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==
-
-delaunay-find@0.0.6:
- version "0.0.6"
- resolved "https://registry.yarnpkg.com/delaunay-find/-/delaunay-find-0.0.6.tgz#2ed017a79410013717fa7d9422e082c2502d4ae3"
- integrity sha512-1+almjfrnR7ZamBk0q3Nhg6lqSe6Le4vL0WJDSMx4IDbQwTpUTXPjxC00lqLBT8MYsJpPCbI16sIkw9cPsbi7Q==
- dependencies:
- delaunator "^4.0.0"
-
-delayed-stream@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
- integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
-
-delegates@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
- integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
-
-depd@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
- integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
-
-deprecation@^2.0.0, deprecation@^2.3.1:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919"
- integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==
-
-des.js@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
- integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
- dependencies:
- inherits "^2.0.1"
- minimalistic-assert "^1.0.0"
-
-destroy@~1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
- integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
-
-detect-file@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
- integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=
-
-detect-indent@6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd"
- integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==
-
-detect-indent@~5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
- integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50=
-
-detect-newline@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
- integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=
-
-detect-node@2.1.0, detect-node@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1"
- integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==
-
-detect-node@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c"
- integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==
-
-detect-port-alt@1.1.6:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275"
- integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==
- dependencies:
- address "^1.0.1"
- debug "^2.6.0"
-
-dezalgo@^1.0.0, dezalgo@~1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456"
- integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=
- dependencies:
- asap "^2.0.0"
- wrappy "1"
-
-diff-sequences@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5"
- integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==
-
-diffie-hellman@^5.0.0:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
- integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
- dependencies:
- bn.js "^4.1.0"
- miller-rabin "^4.0.0"
- randombytes "^2.0.0"
-
-dir-glob@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034"
- integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==
- dependencies:
- arrify "^1.0.1"
- path-type "^3.0.0"
-
-dir-glob@^3.0.0, dir-glob@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
- integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
- dependencies:
- path-type "^4.0.0"
-
-dns-equal@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d"
- integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0=
-
-dns-packet@^1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a"
- integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==
- dependencies:
- ip "^1.1.0"
- safe-buffer "^5.0.1"
-
-dns-txt@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6"
- integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=
- dependencies:
- buffer-indexof "^1.0.0"
+ "execa" "^1.0.0"
+ "ip-regex" "^2.1.0"
-doctrine@1.5.0:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
- integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=
+"defaults@^1.0.3":
+ "integrity" "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730="
+ "resolved" "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz"
+ "version" "1.0.3"
+ dependencies:
+ "clone" "^1.0.2"
+
+"define-properties@^1.1.2", "define-properties@^1.1.3", "define-properties@^1.1.4":
+ "integrity" "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA=="
+ "resolved" "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz"
+ "version" "1.1.4"
+ dependencies:
+ "has-property-descriptors" "^1.0.0"
+ "object-keys" "^1.1.1"
+
+"define-property@^0.2.5":
+ "integrity" "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY="
+ "resolved" "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz"
+ "version" "0.2.5"
+ dependencies:
+ "is-descriptor" "^0.1.0"
+
+"define-property@^1.0.0":
+ "integrity" "sha1-dp66rz9KY6rTr56NMEybvnm/sOY="
+ "resolved" "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "is-descriptor" "^1.0.0"
+
+"define-property@^2.0.2":
+ "integrity" "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ=="
+ "resolved" "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz"
+ "version" "2.0.2"
+ dependencies:
+ "is-descriptor" "^1.0.2"
+ "isobject" "^3.0.1"
+
+"del@^4.1.1":
+ "integrity" "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ=="
+ "resolved" "https://registry.npmjs.org/del/-/del-4.1.1.tgz"
+ "version" "4.1.1"
dependencies:
- esutils "^2.0.2"
- isarray "^1.0.0"
+ "@types/glob" "^7.1.1"
+ "globby" "^6.1.0"
+ "is-path-cwd" "^2.0.0"
+ "is-path-in-cwd" "^2.0.0"
+ "p-map" "^2.0.0"
+ "pify" "^4.0.1"
+ "rimraf" "^2.6.3"
+
+"delaunator@^4.0.0":
+ "integrity" "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag=="
+ "resolved" "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz"
+ "version" "4.0.1"
+
+"delaunay-find@0.0.6":
+ "integrity" "sha512-1+almjfrnR7ZamBk0q3Nhg6lqSe6Le4vL0WJDSMx4IDbQwTpUTXPjxC00lqLBT8MYsJpPCbI16sIkw9cPsbi7Q=="
+ "resolved" "https://registry.npmjs.org/delaunay-find/-/delaunay-find-0.0.6.tgz"
+ "version" "0.0.6"
+ dependencies:
+ "delaunator" "^4.0.0"
+
+"delayed-stream@~1.0.0":
+ "integrity" "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+ "resolved" "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
+ "version" "1.0.0"
+
+"delegates@^1.0.0":
+ "integrity" "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
+ "resolved" "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz"
+ "version" "1.0.0"
+
+"depd@~1.1.2":
+ "integrity" "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+ "resolved" "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz"
+ "version" "1.1.2"
+
+"deprecation@^2.0.0", "deprecation@^2.3.1":
+ "integrity" "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="
+ "resolved" "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz"
+ "version" "2.3.1"
+
+"des.js@^1.0.0":
+ "integrity" "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA=="
+ "resolved" "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "inherits" "^2.0.1"
+ "minimalistic-assert" "^1.0.0"
+
+"destroy@~1.0.4":
+ "integrity" "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
+ "resolved" "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz"
+ "version" "1.0.4"
+
+"detect-file@^1.0.0":
+ "integrity" "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc="
+ "resolved" "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz"
+ "version" "1.0.0"
+
+"detect-indent@~5.0.0":
+ "integrity" "sha1-OHHMCmoALow+Wzz38zYmRnXwa50="
+ "resolved" "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz"
+ "version" "5.0.0"
+
+"detect-indent@6.0.0":
+ "integrity" "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA=="
+ "resolved" "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz"
+ "version" "6.0.0"
+
+"detect-newline@^2.1.0":
+ "integrity" "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I="
+ "resolved" "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz"
+ "version" "2.1.0"
+
+"detect-node@^2.0.4", "detect-node@^2.1.0", "detect-node@2.1.0":
+ "integrity" "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="
+ "resolved" "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz"
+ "version" "2.1.0"
+
+"detect-port-alt@1.1.6":
+ "integrity" "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q=="
+ "resolved" "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz"
+ "version" "1.1.6"
+ dependencies:
+ "address" "^1.0.1"
+ "debug" "^2.6.0"
+
+"dezalgo@^1.0.0", "dezalgo@~1.0.3":
+ "integrity" "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY="
+ "resolved" "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz"
+ "version" "1.0.3"
+ dependencies:
+ "asap" "^2.0.0"
+ "wrappy" "1"
+
+"diff-sequences@^24.9.0":
+ "integrity" "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew=="
+ "resolved" "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz"
+ "version" "24.9.0"
+
+"diffie-hellman@^5.0.0":
+ "integrity" "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg=="
+ "resolved" "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz"
+ "version" "5.0.3"
+ dependencies:
+ "bn.js" "^4.1.0"
+ "miller-rabin" "^4.0.0"
+ "randombytes" "^2.0.0"
+
+"dir-glob@^3.0.0", "dir-glob@^3.0.1":
+ "integrity" "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="
+ "resolved" "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz"
+ "version" "3.0.1"
+ dependencies:
+ "path-type" "^4.0.0"
+
+"dir-glob@2.0.0":
+ "integrity" "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag=="
+ "resolved" "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "arrify" "^1.0.1"
+ "path-type" "^3.0.0"
+
+"dns-equal@^1.0.0":
+ "integrity" "sha1-s55/HabrCnW6nBcySzR1PEfgZU0="
+ "resolved" "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz"
+ "version" "1.0.0"
+
+"dns-packet@^1.3.1":
+ "integrity" "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg=="
+ "resolved" "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz"
+ "version" "1.3.1"
+ dependencies:
+ "ip" "^1.1.0"
+ "safe-buffer" "^5.0.1"
+
+"dns-txt@^2.0.2":
+ "integrity" "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY="
+ "resolved" "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz"
+ "version" "2.0.2"
+ dependencies:
+ "buffer-indexof" "^1.0.0"
-doctrine@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
- integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
+"doctrine@^2.1.0":
+ "integrity" "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="
+ "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "esutils" "^2.0.2"
+
+"doctrine@^3.0.0":
+ "integrity" "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="
+ "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz"
+ "version" "3.0.0"
dependencies:
- esutils "^2.0.2"
+ "esutils" "^2.0.2"
-doctrine@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
- integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+"doctrine@1.5.0":
+ "integrity" "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo="
+ "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz"
+ "version" "1.5.0"
dependencies:
- esutils "^2.0.2"
+ "esutils" "^2.0.2"
+ "isarray" "^1.0.0"
-dom-converter@^0.2:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768"
- integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==
+"dom-converter@^0.2":
+ "integrity" "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA=="
+ "resolved" "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz"
+ "version" "0.2.0"
dependencies:
- utila "~0.4"
+ "utila" "~0.4"
-dom-helpers@^3.2.0, dom-helpers@^3.2.1, dom-helpers@^3.4.0:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8"
- integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==
+"dom-helpers@^3.2.0", "dom-helpers@^3.2.1", "dom-helpers@^3.4.0":
+ "integrity" "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA=="
+ "resolved" "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz"
+ "version" "3.4.0"
dependencies:
"@babel/runtime" "^7.1.2"
-dom-helpers@^5.0.1:
- version "5.1.4"
- resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.1.4.tgz#4609680ab5c79a45f2531441f1949b79d6587f4b"
- integrity sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A==
+"dom-helpers@^5.0.1":
+ "integrity" "sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A=="
+ "resolved" "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.4.tgz"
+ "version" "5.1.4"
dependencies:
"@babel/runtime" "^7.8.7"
- csstype "^2.6.7"
+ "csstype" "^2.6.7"
-dom-serializer@0:
- version "0.2.2"
- resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
- integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
+"dom-serializer@0":
+ "integrity" "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g=="
+ "resolved" "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz"
+ "version" "0.2.2"
dependencies:
- domelementtype "^2.0.1"
- entities "^2.0.0"
+ "domelementtype" "^2.0.1"
+ "entities" "^2.0.0"
-domain-browser@^1.1.1:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
- integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
+"domain-browser@^1.1.1":
+ "integrity" "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA=="
+ "resolved" "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz"
+ "version" "1.2.0"
-domelementtype@1, domelementtype@^1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
- integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
+"domelementtype@^1.3.1", "domelementtype@1":
+ "integrity" "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
+ "resolved" "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz"
+ "version" "1.3.1"
+
+"domelementtype@^2.0.1":
+ "integrity" "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ=="
+ "resolved" "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz"
+ "version" "2.0.1"
-domelementtype@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d"
- integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==
-
-domexception@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
- integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==
+"domexception@^1.0.1":
+ "integrity" "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug=="
+ "resolved" "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz"
+ "version" "1.0.1"
dependencies:
- webidl-conversions "^4.0.2"
-
-domhandler@^2.3.0:
- version "2.4.2"
- resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
- integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
- dependencies:
- domelementtype "1"
+ "webidl-conversions" "^4.0.2"
+
+"domhandler@^2.3.0":
+ "integrity" "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA=="
+ "resolved" "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz"
+ "version" "2.4.2"
+ dependencies:
+ "domelementtype" "1"
-dompurify@^2.0.7:
- version "2.0.11"
- resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.0.11.tgz#cd47935774230c5e478b183a572e726300b3891d"
- integrity sha512-qVoGPjIW9IqxRij7klDQQ2j6nSe4UNWANBhZNLnsS7ScTtLb+3YdxkRY8brNTpkUiTtcXsCJO+jS0UCDfenLuA==
-
-domutils@1.5.1:
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
- integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=
- dependencies:
- dom-serializer "0"
- domelementtype "1"
-
-domutils@^1.5.1, domutils@^1.7.0:
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
- integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
- dependencies:
- dom-serializer "0"
- domelementtype "1"
-
-dot-case@^3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.3.tgz#21d3b52efaaba2ea5fda875bb1aa8124521cf4aa"
- integrity sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==
- dependencies:
- no-case "^3.0.3"
- tslib "^1.10.0"
-
-dot-prop@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177"
- integrity sha1-G3CK8JSknJoOfbyteQq6U52sEXc=
- dependencies:
- is-obj "^1.0.0"
-
-dot-prop@^4.1.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
- integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==
- dependencies:
- is-obj "^1.0.0"
-
-dot-prop@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb"
- integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==
- dependencies:
- is-obj "^2.0.0"
-
-dotenv-expand@5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0"
- integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==
-
-dotenv@8.2.0:
- version "8.2.0"
- resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a"
- integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==
-
-dotenv@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef"
- integrity sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==
-
-drmonty-datatables-colvis@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/drmonty-datatables-colvis/-/drmonty-datatables-colvis-1.1.2.tgz#96ab9edfb48643cc2edda3f87b88933cdee8127c"
- integrity sha1-lque37SGQ8wu3aP4e4iTPN7oEnw=
- dependencies:
- jquery ">=1.7.0"
-
-duplexer2@~0.1.0:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
- integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=
- dependencies:
- readable-stream "^2.0.2"
-
-duplexer3@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
- integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
-
-duplexer@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
- integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=
-
-duplexify@^3.4.2, duplexify@^3.6.0:
- version "3.7.1"
- resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
- integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==
- dependencies:
- end-of-stream "^1.0.0"
- inherits "^2.0.1"
- readable-stream "^2.0.0"
- stream-shift "^1.0.0"
-
-ecc-jsbn@~0.1.1:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
- integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
- dependencies:
- jsbn "~0.1.0"
- safer-buffer "^2.1.0"
-
-editor@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742"
- integrity sha1-YMf4e9YrzGqJT6jM1q+3gjok90I=
-
-ee-first@1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
- integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
-
-electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.413:
- version "1.3.448"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.448.tgz#682831ecf3ce505231978f7c795a2813740cae7c"
- integrity sha512-WOr3SrZ55lUFYugA6sUu3H3ZoxVIH5o3zTSqYS+2DOJJP4hnHmBiD1w432a2YFW/H2G5FIxE6DB06rv+9dUL5g==
-
-elliptic@^6.0.0, elliptic@^6.5.2:
- version "6.5.2"
- resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762"
- integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==
- dependencies:
- bn.js "^4.4.0"
- brorand "^1.0.1"
- hash.js "^1.0.0"
- hmac-drbg "^1.0.0"
- inherits "^2.0.1"
- minimalistic-assert "^1.0.0"
- minimalistic-crypto-utils "^1.0.0"
-
-emitter-component@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/emitter-component/-/emitter-component-1.1.1.tgz#065e2dbed6959bf470679edabeaf7981d1003ab6"
- integrity sha1-Bl4tvtaVm/RwZ57avq95gdEAOrY=
-
-emoji-regex@^7.0.1, emoji-regex@^7.0.2:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
- integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
-
-emoji-regex@^8.0.0:
- version "8.0.0"
- resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
- integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
-
-emojis-list@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
- integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k=
-
-emojis-list@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
- integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
-
-encode-3986@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/encode-3986/-/encode-3986-1.0.0.tgz#940d51498f8741ade184b75ad1439b317c0c7a60"
- integrity sha1-lA1RSY+HQa3hhLda0UObMXwMemA=
-
-encodeurl@~1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
- integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
-
-encoding@^0.1.11:
- version "0.1.12"
- resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
- integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=
- dependencies:
- iconv-lite "~0.4.13"
-
-end-of-stream@^1.0.0, end-of-stream@^1.1.0:
- version "1.4.4"
- resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
- integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
- dependencies:
- once "^1.4.0"
-
-enhanced-resolve@^4.1.0:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66"
- integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==
- dependencies:
- graceful-fs "^4.1.2"
- memory-fs "^0.5.0"
- tapable "^1.0.0"
-
-entities@^1.1.1:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
- integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
-
-entities@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.2.tgz#ac74db0bba8d33808bbf36809c3a5c3683531436"
- integrity sha512-dmD3AvJQBUjKpcNkoqr+x+IF0SdRtPz9Vk0uTy4yWqga9ibB6s4v++QFWNohjiUGoMlF552ZvNyXDxz5iW0qmw==
-
-env-ci@^4.0.0:
- version "4.5.2"
- resolved "https://registry.yarnpkg.com/env-ci/-/env-ci-4.5.2.tgz#40b08825dcf4ed5b2cddd3d638190571cf96347a"
- integrity sha512-lS+edpNp2+QXEPkx6raEMIjKxKKWnJ4+VWzovYJ2NLYiJAYenSAXotFfVdgaFxdbVnvAbUI8epQDa1u12ERxfQ==
- dependencies:
- execa "^3.2.0"
- java-properties "^1.0.0"
-
-env-paths@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43"
- integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==
-
-eonasdan-bootstrap-datetimepicker@^4.17.47:
- version "4.17.47"
- resolved "https://registry.yarnpkg.com/eonasdan-bootstrap-datetimepicker/-/eonasdan-bootstrap-datetimepicker-4.17.47.tgz#7a49970044065276e7965efd16f822735219e735"
- integrity sha1-ekmXAEQGUnbnll79Fvgic1IZ5zU=
- dependencies:
- bootstrap "^3.3"
- jquery "^1.8.3 || ^2.0 || ^3.0"
- moment "^2.10"
- moment-timezone "^0.4.0"
-
-err-code@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960"
- integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=
-
-errno@^0.1.3, errno@~0.1.7:
- version "0.1.7"
- resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
- integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==
- dependencies:
- prr "~1.0.1"
-
-error-ex@^1.2.0, error-ex@^1.3.1:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
- integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
- dependencies:
- is-arrayish "^0.2.1"
-
-es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5:
- version "1.17.5"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9"
- integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==
- dependencies:
- es-to-primitive "^1.2.1"
- function-bind "^1.1.1"
- has "^1.0.3"
- has-symbols "^1.0.1"
- is-callable "^1.1.5"
- is-regex "^1.0.5"
- object-inspect "^1.7.0"
- object-keys "^1.1.1"
- object.assign "^4.1.0"
- string.prototype.trimleft "^2.1.1"
- string.prototype.trimright "^2.1.1"
-
-es-to-primitive@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
- integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
- dependencies:
- is-callable "^1.1.4"
- is-date-object "^1.0.1"
- is-symbol "^1.0.2"
-
-es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
- version "0.10.53"
- resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1"
- integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==
- dependencies:
- es6-iterator "~2.0.3"
- es6-symbol "~3.1.3"
- next-tick "~1.0.0"
-
-es6-iterator@2.0.3, es6-iterator@^2.0.3, es6-iterator@~2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
- integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
- dependencies:
- d "1"
- es5-ext "^0.10.35"
- es6-symbol "^3.1.1"
-
-es6-promise@^4.0.3:
- version "4.2.8"
- resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
- integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
-
-es6-promisify@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
- integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=
- dependencies:
- es6-promise "^4.0.3"
-
-es6-symbol@^3.1.1, es6-symbol@~3.1.3:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
- integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
- dependencies:
- d "^1.0.1"
- ext "^1.1.2"
-
-es6-weak-map@^2.0.2:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53"
- integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==
- dependencies:
- d "1"
- es5-ext "^0.10.46"
- es6-iterator "^2.0.3"
- es6-symbol "^3.1.1"
-
-escape-html@~1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
- integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
-
-escape-string-regexp@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
- integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
-
-escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
- integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
-
-escodegen@^1.11.0, escodegen@^1.9.1:
- version "1.14.1"
- resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457"
- integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==
- dependencies:
- esprima "^4.0.1"
- estraverse "^4.2.0"
- esutils "^2.0.2"
- optionator "^0.8.1"
+"dompurify@^2.0.7":
+ "integrity" "sha512-qVoGPjIW9IqxRij7klDQQ2j6nSe4UNWANBhZNLnsS7ScTtLb+3YdxkRY8brNTpkUiTtcXsCJO+jS0UCDfenLuA=="
+ "resolved" "https://registry.npmjs.org/dompurify/-/dompurify-2.0.11.tgz"
+ "version" "2.0.11"
+
+"domutils@^1.5.1", "domutils@^1.7.0":
+ "integrity" "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg=="
+ "resolved" "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz"
+ "version" "1.7.0"
+ dependencies:
+ "dom-serializer" "0"
+ "domelementtype" "1"
+
+"domutils@1.5.1":
+ "integrity" "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8="
+ "resolved" "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz"
+ "version" "1.5.1"
+ dependencies:
+ "dom-serializer" "0"
+ "domelementtype" "1"
+
+"dot-case@^3.0.3":
+ "integrity" "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA=="
+ "resolved" "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz"
+ "version" "3.0.3"
+ dependencies:
+ "no-case" "^3.0.3"
+ "tslib" "^1.10.0"
+
+"dot-prop@^3.0.0":
+ "integrity" "sha1-G3CK8JSknJoOfbyteQq6U52sEXc="
+ "resolved" "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "is-obj" "^1.0.0"
+
+"dot-prop@^4.1.0":
+ "integrity" "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ=="
+ "resolved" "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz"
+ "version" "4.2.0"
+ dependencies:
+ "is-obj" "^1.0.0"
+
+"dot-prop@^5.2.0":
+ "integrity" "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A=="
+ "resolved" "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz"
+ "version" "5.2.0"
+ dependencies:
+ "is-obj" "^2.0.0"
+
+"dotenv-expand@5.1.0":
+ "integrity" "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA=="
+ "resolved" "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz"
+ "version" "5.1.0"
+
+"dotenv@^5.0.1":
+ "integrity" "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow=="
+ "resolved" "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz"
+ "version" "5.0.1"
+
+"dotenv@8.2.0":
+ "integrity" "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
+ "resolved" "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz"
+ "version" "8.2.0"
+
+"drmonty-datatables-colvis@~1.1.2":
+ "integrity" "sha1-lque37SGQ8wu3aP4e4iTPN7oEnw="
+ "resolved" "https://registry.npmjs.org/drmonty-datatables-colvis/-/drmonty-datatables-colvis-1.1.2.tgz"
+ "version" "1.1.2"
+ dependencies:
+ "jquery" ">=1.7.0"
+
+"duplexer@^0.1.1":
+ "integrity" "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E="
+ "resolved" "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz"
+ "version" "0.1.1"
+
+"duplexer2@~0.1.0":
+ "integrity" "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME="
+ "resolved" "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz"
+ "version" "0.1.4"
+ dependencies:
+ "readable-stream" "^2.0.2"
+
+"duplexer3@^0.1.4":
+ "integrity" "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
+ "resolved" "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz"
+ "version" "0.1.4"
+
+"duplexify@^3.4.2", "duplexify@^3.6.0":
+ "integrity" "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g=="
+ "resolved" "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz"
+ "version" "3.7.1"
+ dependencies:
+ "end-of-stream" "^1.0.0"
+ "inherits" "^2.0.1"
+ "readable-stream" "^2.0.0"
+ "stream-shift" "^1.0.0"
+
+"ecc-jsbn@~0.1.1":
+ "integrity" "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk="
+ "resolved" "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz"
+ "version" "0.1.2"
+ dependencies:
+ "jsbn" "~0.1.0"
+ "safer-buffer" "^2.1.0"
+
+"editor@~1.0.0":
+ "integrity" "sha1-YMf4e9YrzGqJT6jM1q+3gjok90I="
+ "resolved" "https://registry.npmjs.org/editor/-/editor-1.0.0.tgz"
+ "version" "1.0.0"
+
+"ee-first@1.1.1":
+ "integrity" "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+ "resolved" "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz"
+ "version" "1.1.1"
+
+"electron-to-chromium@^1.3.378", "electron-to-chromium@^1.4.202":
+ "integrity" "sha512-3pwjAK0qHSDN9+YAF4fJknsSruP7mpjdWzUSruIJD/JCH77pEh0SorEyb3xVaKkfwk2tzjOt2D8scJ0KAdfXLA=="
+ "resolved" "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.230.tgz"
+ "version" "1.4.230"
+
+"elliptic@^6.0.0", "elliptic@^6.5.2":
+ "integrity" "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw=="
+ "resolved" "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz"
+ "version" "6.5.2"
+ dependencies:
+ "bn.js" "^4.4.0"
+ "brorand" "^1.0.1"
+ "hash.js" "^1.0.0"
+ "hmac-drbg" "^1.0.0"
+ "inherits" "^2.0.1"
+ "minimalistic-assert" "^1.0.0"
+ "minimalistic-crypto-utils" "^1.0.0"
+
+"emitter-component@^1.1.1":
+ "integrity" "sha1-Bl4tvtaVm/RwZ57avq95gdEAOrY="
+ "resolved" "https://registry.npmjs.org/emitter-component/-/emitter-component-1.1.1.tgz"
+ "version" "1.1.1"
+
+"emoji-regex@^7.0.1", "emoji-regex@^7.0.2":
+ "integrity" "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
+ "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz"
+ "version" "7.0.3"
+
+"emoji-regex@^8.0.0":
+ "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz"
+ "version" "8.0.0"
+
+"emojis-list@^2.0.0":
+ "integrity" "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
+ "resolved" "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz"
+ "version" "2.1.0"
+
+"emojis-list@^3.0.0":
+ "integrity" "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
+ "resolved" "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz"
+ "version" "3.0.0"
+
+"encode-3986@^1.0.0":
+ "integrity" "sha1-lA1RSY+HQa3hhLda0UObMXwMemA="
+ "resolved" "https://registry.npmjs.org/encode-3986/-/encode-3986-1.0.0.tgz"
+ "version" "1.0.0"
+
+"encodeurl@~1.0.2":
+ "integrity" "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
+ "resolved" "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz"
+ "version" "1.0.2"
+
+"encoding@^0.1.11":
+ "integrity" "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s="
+ "resolved" "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz"
+ "version" "0.1.12"
+ dependencies:
+ "iconv-lite" "~0.4.13"
+
+"end-of-stream@^1.0.0", "end-of-stream@^1.1.0":
+ "integrity" "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="
+ "resolved" "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz"
+ "version" "1.4.4"
+ dependencies:
+ "once" "^1.4.0"
+
+"enhanced-resolve@^4.1.0":
+ "integrity" "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA=="
+ "resolved" "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz"
+ "version" "4.1.1"
+ dependencies:
+ "graceful-fs" "^4.1.2"
+ "memory-fs" "^0.5.0"
+ "tapable" "^1.0.0"
+
+"entities@^1.1.1":
+ "integrity" "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
+ "resolved" "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz"
+ "version" "1.1.2"
+
+"entities@^2.0.0":
+ "integrity" "sha512-dmD3AvJQBUjKpcNkoqr+x+IF0SdRtPz9Vk0uTy4yWqga9ibB6s4v++QFWNohjiUGoMlF552ZvNyXDxz5iW0qmw=="
+ "resolved" "https://registry.npmjs.org/entities/-/entities-2.0.2.tgz"
+ "version" "2.0.2"
+
+"env-ci@^4.0.0":
+ "integrity" "sha512-lS+edpNp2+QXEPkx6raEMIjKxKKWnJ4+VWzovYJ2NLYiJAYenSAXotFfVdgaFxdbVnvAbUI8epQDa1u12ERxfQ=="
+ "resolved" "https://registry.npmjs.org/env-ci/-/env-ci-4.5.2.tgz"
+ "version" "4.5.2"
+ dependencies:
+ "execa" "^3.2.0"
+ "java-properties" "^1.0.0"
+
+"env-paths@^2.2.0":
+ "integrity" "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA=="
+ "resolved" "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz"
+ "version" "2.2.0"
+
+"eonasdan-bootstrap-datetimepicker@^4.17.47":
+ "integrity" "sha1-ekmXAEQGUnbnll79Fvgic1IZ5zU="
+ "resolved" "https://registry.npmjs.org/eonasdan-bootstrap-datetimepicker/-/eonasdan-bootstrap-datetimepicker-4.17.47.tgz"
+ "version" "4.17.47"
+ dependencies:
+ "bootstrap" "^3.3"
+ "jquery" "^1.8.3 || ^2.0 || ^3.0"
+ "moment" "^2.10"
+ "moment-timezone" "^0.4.0"
+
+"err-code@^1.0.0":
+ "integrity" "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA="
+ "resolved" "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz"
+ "version" "1.1.2"
+
+"errno@^0.1.3", "errno@~0.1.7":
+ "integrity" "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg=="
+ "resolved" "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz"
+ "version" "0.1.7"
+ dependencies:
+ "prr" "~1.0.1"
+
+"error-ex@^1.2.0", "error-ex@^1.3.1":
+ "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="
+ "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz"
+ "version" "1.3.2"
+ dependencies:
+ "is-arrayish" "^0.2.1"
+
+"es-abstract@^1.17.0-next.1", "es-abstract@^1.17.2", "es-abstract@^1.17.5", "es-abstract@^1.19.0", "es-abstract@^1.19.1", "es-abstract@^1.19.2", "es-abstract@^1.19.5":
+ "integrity" "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA=="
+ "resolved" "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz"
+ "version" "1.20.1"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "es-to-primitive" "^1.2.1"
+ "function-bind" "^1.1.1"
+ "function.prototype.name" "^1.1.5"
+ "get-intrinsic" "^1.1.1"
+ "get-symbol-description" "^1.0.0"
+ "has" "^1.0.3"
+ "has-property-descriptors" "^1.0.0"
+ "has-symbols" "^1.0.3"
+ "internal-slot" "^1.0.3"
+ "is-callable" "^1.2.4"
+ "is-negative-zero" "^2.0.2"
+ "is-regex" "^1.1.4"
+ "is-shared-array-buffer" "^1.0.2"
+ "is-string" "^1.0.7"
+ "is-weakref" "^1.0.2"
+ "object-inspect" "^1.12.0"
+ "object-keys" "^1.1.1"
+ "object.assign" "^4.1.2"
+ "regexp.prototype.flags" "^1.4.3"
+ "string.prototype.trimend" "^1.0.5"
+ "string.prototype.trimstart" "^1.0.5"
+ "unbox-primitive" "^1.0.2"
+
+"es-abstract@^1.5.1":
+ "version" "1.12.0"
+ dependencies:
+ "es-to-primitive" "^1.1.1"
+ "function-bind" "^1.1.1"
+ "has" "^1.0.1"
+ "is-callable" "^1.1.3"
+ "is-regex" "^1.0.4"
+
+"es-shim-unscopables@^1.0.0":
+ "integrity" "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w=="
+ "resolved" "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "has" "^1.0.3"
+
+"es-to-primitive@^1.1.1":
+ "version" "1.2.0"
+ dependencies:
+ "is-callable" "^1.1.4"
+ "is-date-object" "^1.0.1"
+ "is-symbol" "^1.0.2"
+
+"es-to-primitive@^1.2.1":
+ "integrity" "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA=="
+ "resolved" "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz"
+ "version" "1.2.1"
+ dependencies:
+ "is-callable" "^1.1.4"
+ "is-date-object" "^1.0.1"
+ "is-symbol" "^1.0.2"
+
+"es5-ext@^0.10.35", "es5-ext@^0.10.45", "es5-ext@^0.10.46", "es5-ext@^0.10.50", "es5-ext@~0.10.14", "es5-ext@~0.10.2", "es5-ext@~0.10.46":
+ "integrity" "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q=="
+ "resolved" "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz"
+ "version" "0.10.53"
+ dependencies:
+ "es6-iterator" "~2.0.3"
+ "es6-symbol" "~3.1.3"
+ "next-tick" "~1.0.0"
+
+"es6-iterator@^2.0.3", "es6-iterator@~2.0.3", "es6-iterator@2.0.3":
+ "integrity" "sha1-p96IkUGgWpSwhUQDstCg+/qY87c="
+ "resolved" "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz"
+ "version" "2.0.3"
+ dependencies:
+ "d" "1"
+ "es5-ext" "^0.10.35"
+ "es6-symbol" "^3.1.1"
+
+"es6-promise@^4.0.3":
+ "integrity" "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="
+ "resolved" "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz"
+ "version" "4.2.8"
+
+"es6-promisify@^5.0.0":
+ "integrity" "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM="
+ "resolved" "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz"
+ "version" "5.0.0"
+ dependencies:
+ "es6-promise" "^4.0.3"
+
+"es6-symbol@^3.1.1", "es6-symbol@~3.1.3":
+ "integrity" "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA=="
+ "resolved" "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz"
+ "version" "3.1.3"
+ dependencies:
+ "d" "^1.0.1"
+ "ext" "^1.1.2"
+
+"es6-weak-map@^2.0.2":
+ "integrity" "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA=="
+ "resolved" "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz"
+ "version" "2.0.3"
+ dependencies:
+ "d" "1"
+ "es5-ext" "^0.10.46"
+ "es6-iterator" "^2.0.3"
+ "es6-symbol" "^3.1.1"
+
+"escalade@^3.1.1":
+ "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
+ "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz"
+ "version" "3.1.1"
+
+"escape-html@~1.0.3":
+ "integrity" "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+ "resolved" "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz"
+ "version" "1.0.3"
+
+"escape-string-regexp@^1.0.2", "escape-string-regexp@^1.0.5":
+ "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+ "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
+ "version" "1.0.5"
+
+"escape-string-regexp@2.0.0":
+ "integrity" "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="
+ "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz"
+ "version" "2.0.0"
+
+"escodegen@^1.11.0", "escodegen@^1.9.1":
+ "integrity" "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ=="
+ "resolved" "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz"
+ "version" "1.14.1"
+ dependencies:
+ "esprima" "^4.0.1"
+ "estraverse" "^4.2.0"
+ "esutils" "^2.0.2"
+ "optionator" "^0.8.1"
optionalDependencies:
- source-map "~0.6.1"
-
-eslint-config-react-app@^5.2.1:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz#698bf7aeee27f0cea0139eaef261c7bf7dd623df"
- integrity sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ==
- dependencies:
- confusing-browser-globals "^1.0.9"
-
-eslint-import-resolver-node@^0.3.2:
- version "0.3.3"
- resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404"
- integrity sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==
- dependencies:
- debug "^2.6.9"
- resolve "^1.13.1"
-
-eslint-loader@3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-3.0.3.tgz#e018e3d2722381d982b1201adb56819c73b480ca"
- integrity sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw==
- dependencies:
- fs-extra "^8.1.0"
- loader-fs-cache "^1.0.2"
- loader-utils "^1.2.3"
- object-hash "^2.0.1"
- schema-utils "^2.6.1"
-
-eslint-module-utils@^2.4.1:
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6"
- integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==
- dependencies:
- debug "^2.6.9"
- pkg-dir "^2.0.0"
-
-eslint-plugin-flowtype@4.6.0:
- version "4.6.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.6.0.tgz#82b2bd6f21770e0e5deede0228e456cb35308451"
- integrity sha512-W5hLjpFfZyZsXfo5anlu7HM970JBDqbEshAJUkeczP6BFCIfJXuiIBQXyberLRtOStT0OGPF8efeTbxlHk4LpQ==
- dependencies:
- lodash "^4.17.15"
-
-eslint-plugin-import@2.20.1:
- version "2.20.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz#802423196dcb11d9ce8435a5fc02a6d3b46939b3"
- integrity sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw==
- dependencies:
- array-includes "^3.0.3"
- array.prototype.flat "^1.2.1"
- contains-path "^0.1.0"
- debug "^2.6.9"
- doctrine "1.5.0"
- eslint-import-resolver-node "^0.3.2"
- eslint-module-utils "^2.4.1"
- has "^1.0.3"
- minimatch "^3.0.4"
- object.values "^1.1.0"
- read-pkg-up "^2.0.0"
- resolve "^1.12.0"
-
-eslint-plugin-jest@^23.8.2:
- version "23.13.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.13.1.tgz#b2ce83f76064ad8ba1f1f26f322b86a86e44148e"
- integrity sha512-TRLJH6M6EDvGocD98a7yVThrAOCK9WJfo9phuUb0MJptcrOYZeCKzC9aOzZCD93sxXCsiJVZywaTHdI/mAi0FQ==
+ "source-map" "~0.6.1"
+
+"eslint-config-react-app@^5.2.1":
+ "integrity" "sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ=="
+ "resolved" "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz"
+ "version" "5.2.1"
+ dependencies:
+ "confusing-browser-globals" "^1.0.9"
+
+"eslint-import-resolver-node@^0.3.2":
+ "integrity" "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg=="
+ "resolved" "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz"
+ "version" "0.3.3"
+ dependencies:
+ "debug" "^2.6.9"
+ "resolve" "^1.13.1"
+
+"eslint-loader@3.0.3":
+ "integrity" "sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw=="
+ "resolved" "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.3.tgz"
+ "version" "3.0.3"
+ dependencies:
+ "fs-extra" "^8.1.0"
+ "loader-fs-cache" "^1.0.2"
+ "loader-utils" "^1.2.3"
+ "object-hash" "^2.0.1"
+ "schema-utils" "^2.6.1"
+
+"eslint-module-utils@^2.4.1":
+ "integrity" "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA=="
+ "resolved" "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz"
+ "version" "2.6.0"
+ dependencies:
+ "debug" "^2.6.9"
+ "pkg-dir" "^2.0.0"
+
+"eslint-plugin-flowtype@3.x || 4.x", "eslint-plugin-flowtype@4.6.0":
+ "integrity" "sha512-W5hLjpFfZyZsXfo5anlu7HM970JBDqbEshAJUkeczP6BFCIfJXuiIBQXyberLRtOStT0OGPF8efeTbxlHk4LpQ=="
+ "resolved" "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.6.0.tgz"
+ "version" "4.6.0"
+ dependencies:
+ "lodash" "^4.17.15"
+
+"eslint-plugin-import@2.20.1", "eslint-plugin-import@2.x":
+ "integrity" "sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw=="
+ "resolved" "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz"
+ "version" "2.20.1"
+ dependencies:
+ "array-includes" "^3.0.3"
+ "array.prototype.flat" "^1.2.1"
+ "contains-path" "^0.1.0"
+ "debug" "^2.6.9"
+ "doctrine" "1.5.0"
+ "eslint-import-resolver-node" "^0.3.2"
+ "eslint-module-utils" "^2.4.1"
+ "has" "^1.0.3"
+ "minimatch" "^3.0.4"
+ "object.values" "^1.1.0"
+ "read-pkg-up" "^2.0.0"
+ "resolve" "^1.12.0"
+
+"eslint-plugin-jest@^23.8.2":
+ "integrity" "sha512-TRLJH6M6EDvGocD98a7yVThrAOCK9WJfo9phuUb0MJptcrOYZeCKzC9aOzZCD93sxXCsiJVZywaTHdI/mAi0FQ=="
+ "resolved" "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.13.1.tgz"
+ "version" "23.13.1"
dependencies:
"@typescript-eslint/experimental-utils" "^2.5.0"
-eslint-plugin-jsx-a11y@6.2.3:
- version "6.2.3"
- resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz#b872a09d5de51af70a97db1eea7dc933043708aa"
- integrity sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==
+"eslint-plugin-jsx-a11y@6.2.3", "eslint-plugin-jsx-a11y@6.x":
+ "integrity" "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg=="
+ "resolved" "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz"
+ "version" "6.2.3"
dependencies:
"@babel/runtime" "^7.4.5"
- aria-query "^3.0.0"
- array-includes "^3.0.3"
- ast-types-flow "^0.0.7"
- axobject-query "^2.0.2"
- damerau-levenshtein "^1.0.4"
- emoji-regex "^7.0.2"
- has "^1.0.3"
- jsx-ast-utils "^2.2.1"
-
-eslint-plugin-react-hooks@^1.6.1:
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz#6210b6d5a37205f0b92858f895a4e827020a7d04"
- integrity sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==
-
-eslint-plugin-react@7.19.0:
- version "7.19.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz#6d08f9673628aa69c5559d33489e855d83551666"
- integrity sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==
- dependencies:
- array-includes "^3.1.1"
- doctrine "^2.1.0"
- has "^1.0.3"
- jsx-ast-utils "^2.2.3"
- object.entries "^1.1.1"
- object.fromentries "^2.0.2"
- object.values "^1.1.1"
- prop-types "^15.7.2"
- resolve "^1.15.1"
- semver "^6.3.0"
- string.prototype.matchall "^4.0.2"
- xregexp "^4.3.0"
-
-eslint-plugin-react@^7.19.0:
- version "7.20.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.20.0.tgz#f98712f0a5e57dfd3e5542ef0604b8739cd47be3"
- integrity sha512-rqe1abd0vxMjmbPngo4NaYxTcR3Y4Hrmc/jg4T+sYz63yqlmJRknpEQfmWY+eDWPuMmix6iUIK+mv0zExjeLgA==
- dependencies:
- array-includes "^3.1.1"
- doctrine "^2.1.0"
- has "^1.0.3"
- jsx-ast-utils "^2.2.3"
- object.entries "^1.1.1"
- object.fromentries "^2.0.2"
- object.values "^1.1.1"
- prop-types "^15.7.2"
- resolve "^1.15.1"
- string.prototype.matchall "^4.0.2"
- xregexp "^4.3.0"
-
-eslint-plugin-standard@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz#ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4"
- integrity sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==
-
-eslint-scope@^4.0.3:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
- integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
- dependencies:
- esrecurse "^4.1.0"
- estraverse "^4.1.1"
-
-eslint-scope@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9"
- integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==
- dependencies:
- esrecurse "^4.1.0"
- estraverse "^4.1.1"
-
-eslint-utils@^1.4.3:
- version "1.4.3"
- resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f"
- integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==
- dependencies:
- eslint-visitor-keys "^1.1.0"
-
-eslint-utils@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd"
- integrity sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==
- dependencies:
- eslint-visitor-keys "^1.1.0"
-
-eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
- integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
-
-eslint@^6.6.0:
- version "6.8.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb"
- integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==
+ "aria-query" "^3.0.0"
+ "array-includes" "^3.0.3"
+ "ast-types-flow" "^0.0.7"
+ "axobject-query" "^2.0.2"
+ "damerau-levenshtein" "^1.0.4"
+ "emoji-regex" "^7.0.2"
+ "has" "^1.0.3"
+ "jsx-ast-utils" "^2.2.1"
+
+"eslint-plugin-react-hooks@^1.6.1", "eslint-plugin-react-hooks@1.x || 2.x":
+ "integrity" "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA=="
+ "resolved" "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz"
+ "version" "1.7.0"
+
+"eslint-plugin-react@^7.19.0", "eslint-plugin-react@7.x":
+ "integrity" "sha512-BWriBttYYCnfb4RO9SB91Og8uA9CPcBMl5UlCOCtuYW1UjhN3QypzEcEHky4ZIRZDKjbO2Blh9BjP8E7W/b1SA=="
+ "resolved" "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.0.tgz"
+ "version" "7.31.0"
+ dependencies:
+ "array-includes" "^3.1.5"
+ "array.prototype.flatmap" "^1.3.0"
+ "doctrine" "^2.1.0"
+ "estraverse" "^5.3.0"
+ "jsx-ast-utils" "^2.4.1 || ^3.0.0"
+ "minimatch" "^3.1.2"
+ "object.entries" "^1.1.5"
+ "object.fromentries" "^2.0.5"
+ "object.hasown" "^1.1.1"
+ "object.values" "^1.1.5"
+ "prop-types" "^15.8.1"
+ "resolve" "^2.0.0-next.3"
+ "semver" "^6.3.0"
+ "string.prototype.matchall" "^4.0.7"
+
+"eslint-plugin-react@7.19.0":
+ "integrity" "sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ=="
+ "resolved" "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz"
+ "version" "7.19.0"
+ dependencies:
+ "array-includes" "^3.1.1"
+ "doctrine" "^2.1.0"
+ "has" "^1.0.3"
+ "jsx-ast-utils" "^2.2.3"
+ "object.entries" "^1.1.1"
+ "object.fromentries" "^2.0.2"
+ "object.values" "^1.1.1"
+ "prop-types" "^15.7.2"
+ "resolve" "^1.15.1"
+ "semver" "^6.3.0"
+ "string.prototype.matchall" "^4.0.2"
+ "xregexp" "^4.3.0"
+
+"eslint-plugin-standard@^4.0.1":
+ "integrity" "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ=="
+ "resolved" "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz"
+ "version" "4.0.1"
+
+"eslint-scope@^4.0.3":
+ "integrity" "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg=="
+ "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz"
+ "version" "4.0.3"
+ dependencies:
+ "esrecurse" "^4.1.0"
+ "estraverse" "^4.1.1"
+
+"eslint-scope@^5.0.0":
+ "integrity" "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw=="
+ "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz"
+ "version" "5.0.0"
+ dependencies:
+ "esrecurse" "^4.1.0"
+ "estraverse" "^4.1.1"
+
+"eslint-utils@^1.4.3":
+ "integrity" "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q=="
+ "resolved" "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz"
+ "version" "1.4.3"
+ dependencies:
+ "eslint-visitor-keys" "^1.1.0"
+
+"eslint-utils@^2.0.0":
+ "integrity" "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA=="
+ "resolved" "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "eslint-visitor-keys" "^1.1.0"
+
+"eslint-visitor-keys@^1.0.0", "eslint-visitor-keys@^1.1.0":
+ "integrity" "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A=="
+ "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz"
+ "version" "1.1.0"
+
+"eslint@*", "eslint@^3 || ^4 || ^5 || ^6", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", "eslint@^5.0.0 || ^6.0.0", "eslint@^6.6.0", "eslint@>= 4.12.1", "eslint@>=5", "eslint@>=5.0.0", "eslint@>=6.1.0", "eslint@2.x - 6.x", "eslint@6.x":
+ "integrity" "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig=="
+ "resolved" "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz"
+ "version" "6.8.0"
dependencies:
"@babel/code-frame" "^7.0.0"
- ajv "^6.10.0"
- chalk "^2.1.0"
- cross-spawn "^6.0.5"
- debug "^4.0.1"
- doctrine "^3.0.0"
- eslint-scope "^5.0.0"
- eslint-utils "^1.4.3"
- eslint-visitor-keys "^1.1.0"
- espree "^6.1.2"
- esquery "^1.0.1"
- esutils "^2.0.2"
- file-entry-cache "^5.0.1"
- functional-red-black-tree "^1.0.1"
- glob-parent "^5.0.0"
- globals "^12.1.0"
- ignore "^4.0.6"
- import-fresh "^3.0.0"
- imurmurhash "^0.1.4"
- inquirer "^7.0.0"
- is-glob "^4.0.0"
- js-yaml "^3.13.1"
- json-stable-stringify-without-jsonify "^1.0.1"
- levn "^0.3.0"
- lodash "^4.17.14"
- minimatch "^3.0.4"
- mkdirp "^0.5.1"
- natural-compare "^1.4.0"
- optionator "^0.8.3"
- progress "^2.0.0"
- regexpp "^2.0.1"
- semver "^6.1.2"
- strip-ansi "^5.2.0"
- strip-json-comments "^3.0.1"
- table "^5.2.3"
- text-table "^0.2.0"
- v8-compile-cache "^2.0.3"
-
-espree@^6.1.2:
- version "6.2.1"
- resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a"
- integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==
- dependencies:
- acorn "^7.1.1"
- acorn-jsx "^5.2.0"
- eslint-visitor-keys "^1.1.0"
-
-esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
- integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
-
-esquery@^1.0.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57"
- integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==
- dependencies:
- estraverse "^5.1.0"
-
-esrecurse@^4.1.0:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
- integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==
- dependencies:
- estraverse "^4.1.0"
-
-estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
- integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
-
-estraverse@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642"
- integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==
-
-esutils@^2.0.2:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
- integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
-
-etag@~1.8.1:
- version "1.8.1"
- resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
- integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
-
-event-emitter@^0.3.5:
- version "0.3.5"
- resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
- integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=
- dependencies:
- d "1"
- es5-ext "~0.10.14"
-
-eventemitter3@^4.0.0:
- version "4.0.4"
- resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384"
- integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==
-
-events@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59"
- integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==
-
-eventsource@^1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0"
- integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==
- dependencies:
- original "^1.0.0"
-
-evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
- integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
- dependencies:
- md5.js "^1.3.4"
- safe-buffer "^5.1.1"
-
-exec-sh@^0.3.2:
- version "0.3.4"
- resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5"
- integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==
-
-execa@^0.7.0:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
- integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=
- dependencies:
- cross-spawn "^5.0.1"
- get-stream "^3.0.0"
- is-stream "^1.1.0"
- npm-run-path "^2.0.0"
- p-finally "^1.0.0"
- signal-exit "^3.0.0"
- strip-eof "^1.0.0"
-
-execa@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
- integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
- dependencies:
- cross-spawn "^6.0.0"
- get-stream "^4.0.0"
- is-stream "^1.1.0"
- npm-run-path "^2.0.0"
- p-finally "^1.0.0"
- signal-exit "^3.0.0"
- strip-eof "^1.0.0"
-
-execa@^3.2.0:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89"
- integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==
- dependencies:
- cross-spawn "^7.0.0"
- get-stream "^5.0.0"
- human-signals "^1.1.1"
- is-stream "^2.0.0"
- merge-stream "^2.0.0"
- npm-run-path "^4.0.0"
- onetime "^5.1.0"
- p-finally "^2.0.0"
- signal-exit "^3.0.2"
- strip-final-newline "^2.0.0"
-
-exit@^0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
- integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=
-
-expand-brackets@^2.1.4:
- version "2.1.4"
- resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
- integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
- dependencies:
- debug "^2.3.3"
- define-property "^0.2.5"
- extend-shallow "^2.0.1"
- posix-character-classes "^0.1.0"
- regex-not "^1.0.0"
- snapdragon "^0.8.1"
- to-regex "^3.0.1"
-
-expand-tilde@^2.0.0, expand-tilde@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
- integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=
- dependencies:
- homedir-polyfill "^1.0.1"
-
-expect@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca"
- integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==
+ "ajv" "^6.10.0"
+ "chalk" "^2.1.0"
+ "cross-spawn" "^6.0.5"
+ "debug" "^4.0.1"
+ "doctrine" "^3.0.0"
+ "eslint-scope" "^5.0.0"
+ "eslint-utils" "^1.4.3"
+ "eslint-visitor-keys" "^1.1.0"
+ "espree" "^6.1.2"
+ "esquery" "^1.0.1"
+ "esutils" "^2.0.2"
+ "file-entry-cache" "^5.0.1"
+ "functional-red-black-tree" "^1.0.1"
+ "glob-parent" "^5.0.0"
+ "globals" "^12.1.0"
+ "ignore" "^4.0.6"
+ "import-fresh" "^3.0.0"
+ "imurmurhash" "^0.1.4"
+ "inquirer" "^7.0.0"
+ "is-glob" "^4.0.0"
+ "js-yaml" "^3.13.1"
+ "json-stable-stringify-without-jsonify" "^1.0.1"
+ "levn" "^0.3.0"
+ "lodash" "^4.17.14"
+ "minimatch" "^3.0.4"
+ "mkdirp" "^0.5.1"
+ "natural-compare" "^1.4.0"
+ "optionator" "^0.8.3"
+ "progress" "^2.0.0"
+ "regexpp" "^2.0.1"
+ "semver" "^6.1.2"
+ "strip-ansi" "^5.2.0"
+ "strip-json-comments" "^3.0.1"
+ "table" "^5.2.3"
+ "text-table" "^0.2.0"
+ "v8-compile-cache" "^2.0.3"
+
+"espree@^6.1.2":
+ "integrity" "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw=="
+ "resolved" "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz"
+ "version" "6.2.1"
+ dependencies:
+ "acorn" "^7.1.1"
+ "acorn-jsx" "^5.2.0"
+ "eslint-visitor-keys" "^1.1.0"
+
+"esprima@^4.0.0", "esprima@^4.0.1", "esprima@~4.0.0":
+ "integrity" "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+ "resolved" "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz"
+ "version" "4.0.1"
+
+"esquery@^1.0.1":
+ "integrity" "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ=="
+ "resolved" "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz"
+ "version" "1.3.1"
+ dependencies:
+ "estraverse" "^5.1.0"
+
+"esrecurse@^4.1.0":
+ "integrity" "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ=="
+ "resolved" "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz"
+ "version" "4.2.1"
+ dependencies:
+ "estraverse" "^4.1.0"
+
+"estraverse@^4.1.0", "estraverse@^4.1.1", "estraverse@^4.2.0":
+ "integrity" "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
+ "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz"
+ "version" "4.3.0"
+
+"estraverse@^5.1.0":
+ "integrity" "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw=="
+ "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz"
+ "version" "5.1.0"
+
+"estraverse@^5.3.0":
+ "integrity" "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
+ "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz"
+ "version" "5.3.0"
+
+"esutils@^2.0.2":
+ "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+ "resolved" "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz"
+ "version" "2.0.3"
+
+"etag@~1.8.1":
+ "integrity" "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
+ "resolved" "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz"
+ "version" "1.8.1"
+
+"event-emitter@^0.3.5":
+ "integrity" "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk="
+ "resolved" "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz"
+ "version" "0.3.5"
+ dependencies:
+ "d" "1"
+ "es5-ext" "~0.10.14"
+
+"eventemitter3@^4.0.0":
+ "integrity" "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ=="
+ "resolved" "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz"
+ "version" "4.0.4"
+
+"events@^3.0.0":
+ "integrity" "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg=="
+ "resolved" "https://registry.npmjs.org/events/-/events-3.1.0.tgz"
+ "version" "3.1.0"
+
+"eventsource@^1.0.7":
+ "integrity" "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ=="
+ "resolved" "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz"
+ "version" "1.0.7"
+ dependencies:
+ "original" "^1.0.0"
+
+"evp_bytestokey@^1.0.0", "evp_bytestokey@^1.0.3":
+ "integrity" "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA=="
+ "resolved" "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz"
+ "version" "1.0.3"
+ dependencies:
+ "md5.js" "^1.3.4"
+ "safe-buffer" "^5.1.1"
+
+"exec-sh@^0.3.2":
+ "integrity" "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A=="
+ "resolved" "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz"
+ "version" "0.3.4"
+
+"execa@^0.7.0":
+ "integrity" "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c="
+ "resolved" "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz"
+ "version" "0.7.0"
+ dependencies:
+ "cross-spawn" "^5.0.1"
+ "get-stream" "^3.0.0"
+ "is-stream" "^1.1.0"
+ "npm-run-path" "^2.0.0"
+ "p-finally" "^1.0.0"
+ "signal-exit" "^3.0.0"
+ "strip-eof" "^1.0.0"
+
+"execa@^1.0.0":
+ "integrity" "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA=="
+ "resolved" "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "cross-spawn" "^6.0.0"
+ "get-stream" "^4.0.0"
+ "is-stream" "^1.1.0"
+ "npm-run-path" "^2.0.0"
+ "p-finally" "^1.0.0"
+ "signal-exit" "^3.0.0"
+ "strip-eof" "^1.0.0"
+
+"execa@^3.2.0":
+ "integrity" "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g=="
+ "resolved" "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz"
+ "version" "3.4.0"
+ dependencies:
+ "cross-spawn" "^7.0.0"
+ "get-stream" "^5.0.0"
+ "human-signals" "^1.1.1"
+ "is-stream" "^2.0.0"
+ "merge-stream" "^2.0.0"
+ "npm-run-path" "^4.0.0"
+ "onetime" "^5.1.0"
+ "p-finally" "^2.0.0"
+ "signal-exit" "^3.0.2"
+ "strip-final-newline" "^2.0.0"
+
+"exit@^0.1.2":
+ "integrity" "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw="
+ "resolved" "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz"
+ "version" "0.1.2"
+
+"expand-brackets@^2.1.4":
+ "integrity" "sha1-t3c14xXOMPa27/D4OwQVGiJEliI="
+ "resolved" "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz"
+ "version" "2.1.4"
+ dependencies:
+ "debug" "^2.3.3"
+ "define-property" "^0.2.5"
+ "extend-shallow" "^2.0.1"
+ "posix-character-classes" "^0.1.0"
+ "regex-not" "^1.0.0"
+ "snapdragon" "^0.8.1"
+ "to-regex" "^3.0.1"
+
+"expand-tilde@^2.0.0", "expand-tilde@^2.0.2":
+ "integrity" "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI="
+ "resolved" "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz"
+ "version" "2.0.2"
+ dependencies:
+ "homedir-polyfill" "^1.0.1"
+
+"expect@^24.9.0":
+ "integrity" "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q=="
+ "resolved" "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/types" "^24.9.0"
- ansi-styles "^3.2.0"
- jest-get-type "^24.9.0"
- jest-matcher-utils "^24.9.0"
- jest-message-util "^24.9.0"
- jest-regex-util "^24.9.0"
-
-express@^4.17.1:
- version "4.17.1"
- resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
- integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
- dependencies:
- accepts "~1.3.7"
- array-flatten "1.1.1"
- body-parser "1.19.0"
- content-disposition "0.5.3"
- content-type "~1.0.4"
- cookie "0.4.0"
- cookie-signature "1.0.6"
- debug "2.6.9"
- depd "~1.1.2"
- encodeurl "~1.0.2"
- escape-html "~1.0.3"
- etag "~1.8.1"
- finalhandler "~1.1.2"
- fresh "0.5.2"
- merge-descriptors "1.0.1"
- methods "~1.1.2"
- on-finished "~2.3.0"
- parseurl "~1.3.3"
- path-to-regexp "0.1.7"
- proxy-addr "~2.0.5"
- qs "6.7.0"
- range-parser "~1.2.1"
- safe-buffer "5.1.2"
- send "0.17.1"
- serve-static "1.14.1"
- setprototypeof "1.1.1"
- statuses "~1.5.0"
- type-is "~1.6.18"
- utils-merge "1.0.1"
- vary "~1.1.2"
-
-ext@^1.1.2:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244"
- integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==
- dependencies:
- type "^2.0.0"
-
-extend-shallow@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
- integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
- dependencies:
- is-extendable "^0.1.0"
-
-extend-shallow@^3.0.0, extend-shallow@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
- integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
- dependencies:
- assign-symbols "^1.0.0"
- is-extendable "^1.0.1"
-
-extend@~3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
- integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
-
-external-editor@^3.0.3:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
- integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
- dependencies:
- chardet "^0.7.0"
- iconv-lite "^0.4.24"
- tmp "^0.0.33"
-
-extglob@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
- integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
- dependencies:
- array-unique "^0.3.2"
- define-property "^1.0.0"
- expand-brackets "^2.1.4"
- extend-shallow "^2.0.1"
- fragment-cache "^0.2.1"
- regex-not "^1.0.0"
- snapdragon "^0.8.1"
- to-regex "^3.0.1"
-
-extsprintf@1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
- integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
-
-extsprintf@^1.2.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
- integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
-
-fast-deep-equal@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4"
- integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==
-
-fast-glob@^2.0.2:
- version "2.2.7"
- resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d"
- integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==
+ "ansi-styles" "^3.2.0"
+ "jest-get-type" "^24.9.0"
+ "jest-matcher-utils" "^24.9.0"
+ "jest-message-util" "^24.9.0"
+ "jest-regex-util" "^24.9.0"
+
+"express@^4.17.1":
+ "integrity" "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g=="
+ "resolved" "https://registry.npmjs.org/express/-/express-4.17.1.tgz"
+ "version" "4.17.1"
+ dependencies:
+ "accepts" "~1.3.7"
+ "array-flatten" "1.1.1"
+ "body-parser" "1.19.0"
+ "content-disposition" "0.5.3"
+ "content-type" "~1.0.4"
+ "cookie" "0.4.0"
+ "cookie-signature" "1.0.6"
+ "debug" "2.6.9"
+ "depd" "~1.1.2"
+ "encodeurl" "~1.0.2"
+ "escape-html" "~1.0.3"
+ "etag" "~1.8.1"
+ "finalhandler" "~1.1.2"
+ "fresh" "0.5.2"
+ "merge-descriptors" "1.0.1"
+ "methods" "~1.1.2"
+ "on-finished" "~2.3.0"
+ "parseurl" "~1.3.3"
+ "path-to-regexp" "0.1.7"
+ "proxy-addr" "~2.0.5"
+ "qs" "6.7.0"
+ "range-parser" "~1.2.1"
+ "safe-buffer" "5.1.2"
+ "send" "0.17.1"
+ "serve-static" "1.14.1"
+ "setprototypeof" "1.1.1"
+ "statuses" "~1.5.0"
+ "type-is" "~1.6.18"
+ "utils-merge" "1.0.1"
+ "vary" "~1.1.2"
+
+"ext@^1.1.2":
+ "integrity" "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A=="
+ "resolved" "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz"
+ "version" "1.4.0"
+ dependencies:
+ "type" "^2.0.0"
+
+"extend-shallow@^2.0.1":
+ "integrity" "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8="
+ "resolved" "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz"
+ "version" "2.0.1"
+ dependencies:
+ "is-extendable" "^0.1.0"
+
+"extend-shallow@^3.0.0":
+ "integrity" "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg="
+ "resolved" "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz"
+ "version" "3.0.2"
+ dependencies:
+ "assign-symbols" "^1.0.0"
+ "is-extendable" "^1.0.1"
+
+"extend-shallow@^3.0.2":
+ "integrity" "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg="
+ "resolved" "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz"
+ "version" "3.0.2"
+ dependencies:
+ "assign-symbols" "^1.0.0"
+ "is-extendable" "^1.0.1"
+
+"extend@~3.0.2":
+ "integrity" "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+ "resolved" "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz"
+ "version" "3.0.2"
+
+"external-editor@^3.0.3":
+ "integrity" "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew=="
+ "resolved" "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "chardet" "^0.7.0"
+ "iconv-lite" "^0.4.24"
+ "tmp" "^0.0.33"
+
+"extglob@^2.0.4":
+ "integrity" "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw=="
+ "resolved" "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz"
+ "version" "2.0.4"
+ dependencies:
+ "array-unique" "^0.3.2"
+ "define-property" "^1.0.0"
+ "expand-brackets" "^2.1.4"
+ "extend-shallow" "^2.0.1"
+ "fragment-cache" "^0.2.1"
+ "regex-not" "^1.0.0"
+ "snapdragon" "^0.8.1"
+ "to-regex" "^3.0.1"
+
+"extsprintf@^1.2.0", "extsprintf@1.3.0":
+ "integrity" "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
+ "resolved" "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz"
+ "version" "1.3.0"
+
+"fast-deep-equal@^1.0.0":
+ "version" "1.1.0"
+
+"fast-deep-equal@^3.1.1":
+ "integrity" "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA=="
+ "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz"
+ "version" "3.1.1"
+
+"fast-glob@^2.0.2":
+ "integrity" "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw=="
+ "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz"
+ "version" "2.2.7"
dependencies:
"@mrmlnc/readdir-enhanced" "^2.2.1"
"@nodelib/fs.stat" "^1.1.2"
- glob-parent "^3.1.0"
- is-glob "^4.0.0"
- merge2 "^1.2.3"
- micromatch "^3.1.10"
+ "glob-parent" "^3.1.0"
+ "is-glob" "^4.0.0"
+ "merge2" "^1.2.3"
+ "micromatch" "^3.1.10"
-fast-glob@^3.0.3:
- version "3.2.2"
- resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.2.tgz#ade1a9d91148965d4bf7c51f72e1ca662d32e63d"
- integrity sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==
+"fast-glob@^3.0.3":
+ "integrity" "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A=="
+ "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz"
+ "version" "3.2.2"
dependencies:
"@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3"
- glob-parent "^5.1.0"
- merge2 "^1.3.0"
- micromatch "^4.0.2"
- picomatch "^2.2.1"
-
-fast-json-patch@~2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/fast-json-patch/-/fast-json-patch-2.1.0.tgz#e348c330a5b2481b14f5fffd707aebfef8b7bef6"
- integrity sha512-PipOsAKamRw7+CXtKiieehyjUeDVPJ5J7b2kdJYerEf6TSUQoD2ijpVyZ88KQm5YXziff4h762bz3+vzf56khg==
- dependencies:
- deep-equal "^1.0.1"
-
-fast-json-stable-stringify@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
- integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
-
-fast-levenshtein@~2.0.6:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
- integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
-
-fastq@^1.6.0:
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481"
- integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==
- dependencies:
- reusify "^1.0.4"
-
-faye-websocket@^0.10.0:
- version "0.10.0"
- resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"
- integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=
- dependencies:
- websocket-driver ">=0.5.1"
-
-faye-websocket@~0.11.1:
- version "0.11.3"
- resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e"
- integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==
- dependencies:
- websocket-driver ">=0.5.1"
-
-fb-watchman@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85"
- integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==
- dependencies:
- bser "2.1.1"
-
-fbemitter@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3"
- integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==
- dependencies:
- fbjs "^3.0.0"
-
-fbjs-css-vars@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8"
- integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==
-
-fbjs@^0.8.1, fbjs@^0.8.9:
- version "0.8.17"
- resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd"
- integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=
- dependencies:
- core-js "^1.0.0"
- isomorphic-fetch "^2.1.1"
- loose-envify "^1.0.0"
- object-assign "^4.1.0"
- promise "^7.1.1"
- setimmediate "^1.0.5"
- ua-parser-js "^0.7.18"
-
-fbjs@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.0.tgz#0907067fb3f57a78f45d95f1eacffcacd623c165"
- integrity sha512-dJd4PiDOFuhe7vk4F80Mba83Vr2QuK86FoxtgPmzBqEJahncp+13YCmfoa53KHCo6OnlXLG7eeMWPfB5CrpVKg==
- dependencies:
- cross-fetch "^3.0.4"
- fbjs-css-vars "^1.0.0"
- loose-envify "^1.0.0"
- object-assign "^4.1.0"
- promise "^7.1.1"
- setimmediate "^1.0.5"
- ua-parser-js "^0.7.18"
-
-figgy-pudding@^3.4.1, figgy-pudding@^3.5.1:
- version "3.5.2"
- resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e"
- integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==
-
-figures@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
- integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=
- dependencies:
- escape-string-regexp "^1.0.5"
-
-figures@^3.0.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
- integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
- dependencies:
- escape-string-regexp "^1.0.5"
-
-file-entry-cache@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
- integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
- dependencies:
- flat-cache "^2.0.1"
-
-file-loader@4.3.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.3.0.tgz#780f040f729b3d18019f20605f723e844b8a58af"
- integrity sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==
- dependencies:
- loader-utils "^1.2.3"
- schema-utils "^2.5.0"
-
-file-selector@^0.1.8:
- version "0.1.12"
- resolved "https://registry.yarnpkg.com/file-selector/-/file-selector-0.1.12.tgz#fe726547be219a787a9dcc640575a04a032b1fd0"
- integrity sha512-Kx7RTzxyQipHuiqyZGf+Nz4vY9R1XGxuQl/hLoJwq+J4avk/9wxxgZyHKtbyIPJmbD4A66DWGYfyykWNpcYutQ==
- dependencies:
- tslib "^1.9.0"
-
-file-uri-to-path@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
- integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
-
-filesize@6.0.1:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.0.1.tgz#f850b509909c7c86f7e450ea19006c31c2ed3d2f"
- integrity sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg==
-
-fill-range@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
- integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
- dependencies:
- extend-shallow "^2.0.1"
- is-number "^3.0.0"
- repeat-string "^1.6.1"
- to-regex-range "^2.1.0"
-
-fill-range@^7.0.1:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
- integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
- dependencies:
- to-regex-range "^5.0.1"
-
-finalhandler@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
- integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
- dependencies:
- debug "2.6.9"
- encodeurl "~1.0.2"
- escape-html "~1.0.3"
- on-finished "~2.3.0"
- parseurl "~1.3.3"
- statuses "~1.5.0"
- unpipe "~1.0.0"
-
-find-cache-dir@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9"
- integrity sha1-yN765XyKUqinhPnjHFfHQumToLk=
- dependencies:
- commondir "^1.0.1"
- mkdirp "^0.5.1"
- pkg-dir "^1.0.0"
-
-find-cache-dir@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7"
- integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==
- dependencies:
- commondir "^1.0.1"
- make-dir "^2.0.0"
- pkg-dir "^3.0.0"
-
-find-cache-dir@^3.2.0:
- version "3.3.1"
- resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880"
- integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==
- dependencies:
- commondir "^1.0.1"
- make-dir "^3.0.2"
- pkg-dir "^4.1.0"
-
-find-node-modules@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/find-node-modules/-/find-node-modules-2.0.0.tgz#5db1fb9e668a3d451db3d618cd167cdd59e41b69"
- integrity sha512-8MWIBRgJi/WpjjfVXumjPKCtmQ10B+fjx6zmSA+770GMJirLhWIzg8l763rhjl9xaeaHbnxPNRQKq2mgMhr+aw==
- dependencies:
- findup-sync "^3.0.0"
- merge "^1.2.1"
-
-find-npm-prefix@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/find-npm-prefix/-/find-npm-prefix-1.0.2.tgz#8d8ce2c78b3b4b9e66c8acc6a37c231eb841cfdf"
- integrity sha512-KEftzJ+H90x6pcKtdXZEPsQse8/y/UnvzRKrOSQFprnrGaFuJ62fVkP34Iu2IYuMvyauCyoLTNkJZgrrGA2wkA==
-
-find-root@1.1.0, find-root@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
- integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
-
-find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
- integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
- dependencies:
- locate-path "^5.0.0"
- path-exists "^4.0.0"
-
-find-up@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
- integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
- dependencies:
- path-exists "^2.0.0"
- pinkie-promise "^2.0.0"
-
-find-up@^2.0.0, find-up@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
- integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
- dependencies:
- locate-path "^2.0.0"
-
-find-up@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
- integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
- dependencies:
- locate-path "^3.0.0"
-
-find-versions@^3.0.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e"
- integrity sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==
- dependencies:
- semver-regex "^2.0.0"
-
-findup-sync@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1"
- integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==
- dependencies:
- detect-file "^1.0.0"
- is-glob "^4.0.0"
- micromatch "^3.0.4"
- resolve-dir "^1.0.1"
-
-flat-cache@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
- integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
- dependencies:
- flatted "^2.0.0"
- rimraf "2.6.3"
- write "1.0.3"
-
-flatted@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138"
- integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==
-
-flatten@^1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b"
- integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==
-
-flush-write-stream@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8"
- integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==
- dependencies:
- inherits "^2.0.3"
- readable-stream "^2.3.6"
-
-flux@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/flux/-/flux-4.0.1.tgz#7843502b02841d4aaa534af0b373034a1f75ee5c"
- integrity sha512-emk4RCvJ8RzNP2lNpphKnG7r18q8elDYNAPx7xn+bDeOIo9FFfxEfIQ2y6YbQNmnsGD3nH1noxtLE64Puz1bRQ==
- dependencies:
- fbemitter "^3.0.0"
- fbjs "^3.0.0"
-
-focus-trap@6.2.2:
- version "6.2.2"
- resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-6.2.2.tgz#0e6f391415b0697c99da932702dedd13084fa131"
- integrity sha512-qWovH9+LGoKqREvJaTCzJyO0hphQYGz+ap5Hc4NqXHNhZBdxCi5uBPPcaOUw66fHmzXLVwvETLvFgpwPILqKpg==
- dependencies:
- tabbable "^5.1.4"
-
-follow-redirects@1.5.10:
- version "1.5.10"
- resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a"
- integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==
- dependencies:
- debug "=3.1.0"
-
-follow-redirects@^1.0.0:
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.11.0.tgz#afa14f08ba12a52963140fe43212658897bc0ecb"
- integrity sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==
- dependencies:
- debug "^3.0.0"
-
-font-awesome-sass@^4.7.0:
- version "4.7.0"
- resolved "https://registry.yarnpkg.com/font-awesome-sass/-/font-awesome-sass-4.7.0.tgz#4eda693e915009ce00b228e0964dc5eca9bc34e1"
- integrity sha1-TtppPpFQCc4Asijglk3F7Km8NOE=
-
-font-awesome@^4.7.0:
- version "4.7.0"
- resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133"
- integrity sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=
-
-for-in@^0.1.3:
- version "0.1.8"
- resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
- integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=
-
-for-in@^1.0.1, for-in@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
- integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
-
-for-own@^0.1.3:
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
- integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=
- dependencies:
- for-in "^1.0.1"
-
-forever-agent@~0.6.1:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
- integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
-
-fork-ts-checker-webpack-plugin@3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz#a1642c0d3e65f50c2cc1742e9c0a80f441f86b19"
- integrity sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ==
- dependencies:
- babel-code-frame "^6.22.0"
- chalk "^2.4.1"
- chokidar "^3.3.0"
- micromatch "^3.1.10"
- minimatch "^3.0.4"
- semver "^5.6.0"
- tapable "^1.0.0"
- worker-rpc "^0.1.0"
-
-form-data@~2.3.2:
- version "2.3.3"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
- integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
- dependencies:
- asynckit "^0.4.0"
- combined-stream "^1.0.6"
- mime-types "^2.1.12"
-
-formdata-node@2.1.1, formdata-node@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/formdata-node/-/formdata-node-2.1.1.tgz#4e3f801246d8ad8217fda86ae4f833f6e94e3ebf"
- integrity sha512-XfwCd3Edkt2N81Uh1G72kakbavjEOhRuGdiOV6Ekba/DrFrWFWgkjN4dZn5EPNbjmg+QC+i0ckeYukAbuTRHjw==
+ "glob-parent" "^5.1.0"
+ "merge2" "^1.3.0"
+ "micromatch" "^4.0.2"
+ "picomatch" "^2.2.1"
+
+"fast-json-patch@~2.1.0":
+ "integrity" "sha512-PipOsAKamRw7+CXtKiieehyjUeDVPJ5J7b2kdJYerEf6TSUQoD2ijpVyZ88KQm5YXziff4h762bz3+vzf56khg=="
+ "resolved" "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "deep-equal" "^1.0.1"
+
+"fast-json-stable-stringify@^2.0.0":
+ "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
+ "version" "2.1.0"
+
+"fast-levenshtein@~2.0.6":
+ "integrity" "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+ "resolved" "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
+ "version" "2.0.6"
+
+"fastq@^1.6.0":
+ "integrity" "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q=="
+ "resolved" "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz"
+ "version" "1.8.0"
+ dependencies:
+ "reusify" "^1.0.4"
+
+"faye-websocket@^0.10.0":
+ "integrity" "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ="
+ "resolved" "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz"
+ "version" "0.10.0"
+ dependencies:
+ "websocket-driver" ">=0.5.1"
+
+"faye-websocket@~0.11.1":
+ "integrity" "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA=="
+ "resolved" "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz"
+ "version" "0.11.3"
+ dependencies:
+ "websocket-driver" ">=0.5.1"
+
+"fb-watchman@^2.0.0":
+ "integrity" "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg=="
+ "resolved" "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz"
+ "version" "2.0.1"
+ dependencies:
+ "bser" "2.1.1"
+
+"fbemitter@^3.0.0":
+ "integrity" "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw=="
+ "resolved" "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "fbjs" "^3.0.0"
+
+"fbjs-css-vars@^1.0.0":
+ "integrity" "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ=="
+ "resolved" "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz"
+ "version" "1.0.2"
+
+"fbjs@^0.8.9":
+ "integrity" "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90="
+ "resolved" "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz"
+ "version" "0.8.17"
+ dependencies:
+ "core-js" "^1.0.0"
+ "isomorphic-fetch" "^2.1.1"
+ "loose-envify" "^1.0.0"
+ "object-assign" "^4.1.0"
+ "promise" "^7.1.1"
+ "setimmediate" "^1.0.5"
+ "ua-parser-js" "^0.7.18"
+
+"fbjs@^3.0.0":
+ "integrity" "sha512-dJd4PiDOFuhe7vk4F80Mba83Vr2QuK86FoxtgPmzBqEJahncp+13YCmfoa53KHCo6OnlXLG7eeMWPfB5CrpVKg=="
+ "resolved" "https://registry.npmjs.org/fbjs/-/fbjs-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "cross-fetch" "^3.0.4"
+ "fbjs-css-vars" "^1.0.0"
+ "loose-envify" "^1.0.0"
+ "object-assign" "^4.1.0"
+ "promise" "^7.1.1"
+ "setimmediate" "^1.0.5"
+ "ua-parser-js" "^0.7.18"
+
+"figgy-pudding@^3.4.1":
+ "version" "3.5.1"
+
+"figgy-pudding@^3.5.1":
+ "integrity" "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw=="
+ "resolved" "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz"
+ "version" "3.5.2"
+
+"figures@^2.0.0":
+ "integrity" "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI="
+ "resolved" "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "escape-string-regexp" "^1.0.5"
+
+"figures@^3.0.0":
+ "integrity" "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg=="
+ "resolved" "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz"
+ "version" "3.2.0"
+ dependencies:
+ "escape-string-regexp" "^1.0.5"
+
+"file-entry-cache@^5.0.1":
+ "integrity" "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g=="
+ "resolved" "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz"
+ "version" "5.0.1"
+ dependencies:
+ "flat-cache" "^2.0.1"
+
+"file-loader@*", "file-loader@4.3.0":
+ "integrity" "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA=="
+ "resolved" "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz"
+ "version" "4.3.0"
+ dependencies:
+ "loader-utils" "^1.2.3"
+ "schema-utils" "^2.5.0"
+
+"file-selector@^0.1.8":
+ "integrity" "sha512-Kx7RTzxyQipHuiqyZGf+Nz4vY9R1XGxuQl/hLoJwq+J4avk/9wxxgZyHKtbyIPJmbD4A66DWGYfyykWNpcYutQ=="
+ "resolved" "https://registry.npmjs.org/file-selector/-/file-selector-0.1.12.tgz"
+ "version" "0.1.12"
+ dependencies:
+ "tslib" "^1.9.0"
+
+"file-uri-to-path@1.0.0":
+ "integrity" "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="
+ "resolved" "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz"
+ "version" "1.0.0"
+
+"filesize@6.0.1":
+ "integrity" "sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg=="
+ "resolved" "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz"
+ "version" "6.0.1"
+
+"fill-range@^4.0.0":
+ "integrity" "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc="
+ "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz"
+ "version" "4.0.0"
+ dependencies:
+ "extend-shallow" "^2.0.1"
+ "is-number" "^3.0.0"
+ "repeat-string" "^1.6.1"
+ "to-regex-range" "^2.1.0"
+
+"fill-range@^7.0.1":
+ "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ=="
+ "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz"
+ "version" "7.0.1"
+ dependencies:
+ "to-regex-range" "^5.0.1"
+
+"finalhandler@~1.1.2":
+ "integrity" "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA=="
+ "resolved" "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz"
+ "version" "1.1.2"
+ dependencies:
+ "debug" "2.6.9"
+ "encodeurl" "~1.0.2"
+ "escape-html" "~1.0.3"
+ "on-finished" "~2.3.0"
+ "parseurl" "~1.3.3"
+ "statuses" "~1.5.0"
+ "unpipe" "~1.0.0"
+
+"find-cache-dir@^0.1.1":
+ "integrity" "sha1-yN765XyKUqinhPnjHFfHQumToLk="
+ "resolved" "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz"
+ "version" "0.1.1"
+ dependencies:
+ "commondir" "^1.0.1"
+ "mkdirp" "^0.5.1"
+ "pkg-dir" "^1.0.0"
+
+"find-cache-dir@^2.1.0":
+ "integrity" "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ=="
+ "resolved" "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "commondir" "^1.0.1"
+ "make-dir" "^2.0.0"
+ "pkg-dir" "^3.0.0"
+
+"find-cache-dir@^3.2.0":
+ "integrity" "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ=="
+ "resolved" "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz"
+ "version" "3.3.1"
+ dependencies:
+ "commondir" "^1.0.1"
+ "make-dir" "^3.0.2"
+ "pkg-dir" "^4.1.0"
+
+"find-node-modules@2.0.0":
+ "integrity" "sha512-8MWIBRgJi/WpjjfVXumjPKCtmQ10B+fjx6zmSA+770GMJirLhWIzg8l763rhjl9xaeaHbnxPNRQKq2mgMhr+aw=="
+ "resolved" "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "findup-sync" "^3.0.0"
+ "merge" "^1.2.1"
+
+"find-npm-prefix@^1.0.2":
+ "integrity" "sha512-KEftzJ+H90x6pcKtdXZEPsQse8/y/UnvzRKrOSQFprnrGaFuJ62fVkP34Iu2IYuMvyauCyoLTNkJZgrrGA2wkA=="
+ "resolved" "https://registry.npmjs.org/find-npm-prefix/-/find-npm-prefix-1.0.2.tgz"
+ "version" "1.0.2"
+
+"find-root@^1.1.0", "find-root@1.1.0":
+ "integrity" "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
+ "resolved" "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz"
+ "version" "1.1.0"
+
+"find-up@^1.0.0":
+ "integrity" "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8="
+ "resolved" "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz"
+ "version" "1.1.2"
+ dependencies:
+ "path-exists" "^2.0.0"
+ "pinkie-promise" "^2.0.0"
+
+"find-up@^2.0.0":
+ "integrity" "sha1-RdG35QbHF93UgndaK3eSCjwMV6c="
+ "resolved" "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "locate-path" "^2.0.0"
+
+"find-up@^2.1.0":
+ "integrity" "sha1-RdG35QbHF93UgndaK3eSCjwMV6c="
+ "resolved" "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "locate-path" "^2.0.0"
+
+"find-up@^3.0.0":
+ "integrity" "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg=="
+ "resolved" "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "locate-path" "^3.0.0"
+
+"find-up@^4.0.0":
+ "integrity" "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="
+ "resolved" "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz"
+ "version" "4.1.0"
+ dependencies:
+ "locate-path" "^5.0.0"
+ "path-exists" "^4.0.0"
+
+"find-up@^4.1.0":
+ "integrity" "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="
+ "resolved" "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz"
+ "version" "4.1.0"
+ dependencies:
+ "locate-path" "^5.0.0"
+ "path-exists" "^4.0.0"
+
+"find-up@4.1.0":
+ "integrity" "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="
+ "resolved" "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz"
+ "version" "4.1.0"
+ dependencies:
+ "locate-path" "^5.0.0"
+ "path-exists" "^4.0.0"
+
+"find-versions@^3.0.0":
+ "integrity" "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww=="
+ "resolved" "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz"
+ "version" "3.2.0"
+ dependencies:
+ "semver-regex" "^2.0.0"
+
+"findup-sync@^3.0.0":
+ "integrity" "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg=="
+ "resolved" "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "detect-file" "^1.0.0"
+ "is-glob" "^4.0.0"
+ "micromatch" "^3.0.4"
+ "resolve-dir" "^1.0.1"
+
+"flat-cache@^2.0.1":
+ "integrity" "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA=="
+ "resolved" "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz"
+ "version" "2.0.1"
+ dependencies:
+ "flatted" "^2.0.0"
+ "rimraf" "2.6.3"
+ "write" "1.0.3"
+
+"flatted@^2.0.0":
+ "integrity" "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA=="
+ "resolved" "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz"
+ "version" "2.0.2"
+
+"flatten@^1.0.2":
+ "integrity" "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg=="
+ "resolved" "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz"
+ "version" "1.0.3"
+
+"flush-write-stream@^1.0.0":
+ "integrity" "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w=="
+ "resolved" "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz"
+ "version" "1.1.1"
+ dependencies:
+ "inherits" "^2.0.3"
+ "readable-stream" "^2.3.6"
+
+"flux@^4.0.1":
+ "integrity" "sha512-emk4RCvJ8RzNP2lNpphKnG7r18q8elDYNAPx7xn+bDeOIo9FFfxEfIQ2y6YbQNmnsGD3nH1noxtLE64Puz1bRQ=="
+ "resolved" "https://registry.npmjs.org/flux/-/flux-4.0.1.tgz"
+ "version" "4.0.1"
+ dependencies:
+ "fbemitter" "^3.0.0"
+ "fbjs" "^3.0.0"
+
+"focus-trap@6.9.2":
+ "integrity" "sha512-gBEuXOPNOKPrLdZpMFUSTyIo1eT2NSZRrwZ9r/0Jqw5tmT3Yvxfmu8KBHw8xW2XQkw6E/JoG+OlEq7UDtSUNgw=="
+ "resolved" "https://registry.npmjs.org/focus-trap/-/focus-trap-6.9.2.tgz"
+ "version" "6.9.2"
+ dependencies:
+ "tabbable" "^5.3.2"
+
+"follow-redirects@^1.0.0", "follow-redirects@^1.14.8":
+ "integrity" "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w=="
+ "resolved" "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz"
+ "version" "1.14.9"
+
+"font-awesome-sass@^4.7.0":
+ "integrity" "sha1-TtppPpFQCc4Asijglk3F7Km8NOE="
+ "resolved" "https://registry.npmjs.org/font-awesome-sass/-/font-awesome-sass-4.7.0.tgz"
+ "version" "4.7.0"
+
+"font-awesome@^4.7.0":
+ "integrity" "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM="
+ "resolved" "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz"
+ "version" "4.7.0"
+
+"for-in@^0.1.3":
+ "integrity" "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE="
+ "resolved" "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz"
+ "version" "0.1.8"
+
+"for-in@^1.0.1", "for-in@^1.0.2":
+ "integrity" "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
+ "resolved" "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz"
+ "version" "1.0.2"
+
+"for-own@^0.1.3":
+ "integrity" "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4="
+ "resolved" "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz"
+ "version" "0.1.5"
+ dependencies:
+ "for-in" "^1.0.1"
+
+"forever-agent@~0.6.1":
+ "integrity" "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
+ "resolved" "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz"
+ "version" "0.6.1"
+
+"fork-ts-checker-webpack-plugin@3.1.1":
+ "integrity" "sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ=="
+ "resolved" "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz"
+ "version" "3.1.1"
+ dependencies:
+ "babel-code-frame" "^6.22.0"
+ "chalk" "^2.4.1"
+ "chokidar" "^3.3.0"
+ "micromatch" "^3.1.10"
+ "minimatch" "^3.0.4"
+ "semver" "^5.6.0"
+ "tapable" "^1.0.0"
+ "worker-rpc" "^0.1.0"
+
+"form-data@~2.3.2":
+ "integrity" "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ=="
+ "resolved" "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz"
+ "version" "2.3.3"
+ dependencies:
+ "asynckit" "^0.4.0"
+ "combined-stream" "^1.0.6"
+ "mime-types" "^2.1.12"
+
+"formdata-node@^2.1.1":
+ "integrity" "sha512-XfwCd3Edkt2N81Uh1G72kakbavjEOhRuGdiOV6Ekba/DrFrWFWgkjN4dZn5EPNbjmg+QC+i0ckeYukAbuTRHjw=="
+ "resolved" "https://registry.npmjs.org/formdata-node/-/formdata-node-2.1.1.tgz"
+ "version" "2.1.1"
dependencies:
"@babel/runtime" "7.8.4"
- mime-types "2.1.26"
- nanoid "2.1.11"
-
-forwarded@~0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
- integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
-
-fragment-cache@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
- integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
- dependencies:
- map-cache "^0.2.2"
-
-fresh@0.5.2:
- version "0.5.2"
- resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
- integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
-
-from2@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/from2/-/from2-1.3.0.tgz#88413baaa5f9a597cfde9221d86986cd3c061dfd"
- integrity sha1-iEE7qqX5pZfP3pIh2GmGzTwGHf0=
- dependencies:
- inherits "~2.0.1"
- readable-stream "~1.1.10"
-
-from2@^2.1.0, from2@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
- integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=
- dependencies:
- inherits "^2.0.1"
- readable-stream "^2.0.0"
-
-fs-extra@8.1.0, fs-extra@^8.0.0, fs-extra@^8.1.0:
- version "8.1.0"
- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
- integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
- dependencies:
- graceful-fs "^4.2.0"
- jsonfile "^4.0.0"
- universalify "^0.1.0"
-
-fs-extra@^4.0.2:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
- integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
- dependencies:
- graceful-fs "^4.1.2"
- jsonfile "^4.0.0"
- universalify "^0.1.0"
-
-fs-extra@^7.0.0:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
- integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
- dependencies:
- graceful-fs "^4.1.2"
- jsonfile "^4.0.0"
- universalify "^0.1.0"
-
-fs-minipass@^1.2.5:
- version "1.2.7"
- resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
- integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
- dependencies:
- minipass "^2.6.0"
-
-fs-minipass@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
- integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
- dependencies:
- minipass "^3.0.0"
-
-fs-vacuum@^1.2.10, fs-vacuum@~1.2.10:
- version "1.2.10"
- resolved "https://registry.yarnpkg.com/fs-vacuum/-/fs-vacuum-1.2.10.tgz#b7629bec07a4031a2548fdf99f5ecf1cc8b31e36"
- integrity sha1-t2Kb7AekAxolSP35n17PHMizHjY=
- dependencies:
- graceful-fs "^4.1.2"
- path-is-inside "^1.0.1"
- rimraf "^2.5.2"
-
-fs-write-stream-atomic@^1.0.8, fs-write-stream-atomic@~1.0.10:
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
- integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=
- dependencies:
- graceful-fs "^4.1.2"
- iferr "^0.1.5"
- imurmurhash "^0.1.4"
- readable-stream "1 || 2"
-
-fs.realpath@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
- integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
-
-fsevents@2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805"
- integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==
-
-fsevents@^1.2.7:
- version "1.2.13"
- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38"
- integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==
- dependencies:
- bindings "^1.5.0"
- nan "^2.12.1"
-
-fsevents@~2.1.2:
- version "2.1.3"
- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
- integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
-
-function-bind@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
- integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
-
-functional-red-black-tree@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
- integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
-
-gauge@~2.7.3:
- version "2.7.4"
- resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
- integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
- dependencies:
- aproba "^1.0.3"
- console-control-strings "^1.0.0"
- has-unicode "^2.0.0"
- object-assign "^4.1.0"
- signal-exit "^3.0.0"
- string-width "^1.0.1"
- strip-ansi "^3.0.1"
- wide-align "^1.1.0"
-
-genfun@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537"
- integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==
-
-gensync@^1.0.0-beta.1:
- version "1.0.0-beta.1"
- resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269"
- integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==
-
-gentle-fs@^2.3.0:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/gentle-fs/-/gentle-fs-2.3.1.tgz#11201bf66c18f930ddca72cf69460bdfa05727b1"
- integrity sha512-OlwBBwqCFPcjm33rF2BjW+Pr6/ll2741l+xooiwTCeaX2CA1ZuclavyMBe0/KlR21/XGsgY6hzEQZ15BdNa13Q==
- dependencies:
- aproba "^1.1.2"
- chownr "^1.1.2"
- cmd-shim "^3.0.3"
- fs-vacuum "^1.2.10"
- graceful-fs "^4.1.11"
- iferr "^0.1.5"
- infer-owner "^1.0.4"
- mkdirp "^0.5.1"
- path-is-inside "^1.0.2"
- read-cmd-shim "^1.0.1"
- slide "^1.1.6"
-
-get-caller-file@^1.0.1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
- integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
-
-get-caller-file@^2.0.1:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
- integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
-
-get-own-enumerable-property-symbols@^3.0.0:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664"
- integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==
-
-get-stream@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
- integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
-
-get-stream@^4.0.0, get-stream@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
- integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
- dependencies:
- pump "^3.0.0"
-
-get-stream@^5.0.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9"
- integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==
- dependencies:
- pump "^3.0.0"
-
-get-value@^2.0.3, get-value@^2.0.6:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
- integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
-
-getpass@^0.1.1:
- version "0.1.7"
- resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
- integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
- dependencies:
- assert-plus "^1.0.0"
-
-git-log-parser@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/git-log-parser/-/git-log-parser-1.2.0.tgz#2e6a4c1b13fc00028207ba795a7ac31667b9fd4a"
- integrity sha1-LmpMGxP8AAKCB7p5WnrDFme5/Uo=
- dependencies:
- argv-formatter "~1.0.0"
- spawn-error-forwarder "~1.0.0"
- split2 "~1.0.0"
- stream-combiner2 "~1.1.1"
- through2 "~2.0.0"
- traverse "~0.6.6"
-
-glob-parent@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
- integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=
- dependencies:
- is-glob "^3.1.0"
- path-dirname "^1.0.0"
-
-glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
- integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
- dependencies:
- is-glob "^4.0.1"
-
-glob-to-regexp@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
- integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=
-
-glob@7.1.4:
- version "7.1.4"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
- integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^3.0.4"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
- version "7.1.6"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
- integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^3.0.4"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-global-dirs@^0.1.0, global-dirs@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445"
- integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=
- dependencies:
- ini "^1.3.4"
-
-global-modules@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780"
- integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==
- dependencies:
- global-prefix "^3.0.0"
-
-global-modules@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
- integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==
- dependencies:
- global-prefix "^1.0.1"
- is-windows "^1.0.1"
- resolve-dir "^1.0.0"
-
-global-prefix@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe"
- integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=
- dependencies:
- expand-tilde "^2.0.2"
- homedir-polyfill "^1.0.1"
- ini "^1.3.4"
- is-windows "^1.0.1"
- which "^1.2.14"
-
-global-prefix@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97"
- integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==
- dependencies:
- ini "^1.3.5"
- kind-of "^6.0.2"
- which "^1.3.1"
-
-globals@^11.1.0:
- version "11.12.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
- integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
-
-globals@^12.1.0:
- version "12.4.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8"
- integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==
- dependencies:
- type-fest "^0.8.1"
-
-globby@8.0.2:
- version "8.0.2"
- resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d"
- integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==
- dependencies:
- array-union "^1.0.1"
- dir-glob "2.0.0"
- fast-glob "^2.0.2"
- glob "^7.1.2"
- ignore "^3.3.5"
- pify "^3.0.0"
- slash "^1.0.0"
-
-globby@^10.0.0:
- version "10.0.2"
- resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543"
- integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==
+ "mime-types" "2.1.26"
+ "nanoid" "2.1.11"
+
+"forwarded@~0.1.2":
+ "integrity" "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
+ "resolved" "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz"
+ "version" "0.1.2"
+
+"fragment-cache@^0.2.1":
+ "integrity" "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk="
+ "resolved" "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz"
+ "version" "0.2.1"
+ dependencies:
+ "map-cache" "^0.2.2"
+
+"fresh@0.5.2":
+ "integrity" "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
+ "resolved" "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz"
+ "version" "0.5.2"
+
+"from2@^1.3.0":
+ "integrity" "sha1-iEE7qqX5pZfP3pIh2GmGzTwGHf0="
+ "resolved" "https://registry.npmjs.org/from2/-/from2-1.3.0.tgz"
+ "version" "1.3.0"
+ dependencies:
+ "inherits" "~2.0.1"
+ "readable-stream" "~1.1.10"
+
+"from2@^2.1.0", "from2@^2.3.0":
+ "integrity" "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8="
+ "resolved" "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz"
+ "version" "2.3.0"
+ dependencies:
+ "inherits" "^2.0.1"
+ "readable-stream" "^2.0.0"
+
+"fs-extra@^4.0.2":
+ "integrity" "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg=="
+ "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz"
+ "version" "4.0.3"
+ dependencies:
+ "graceful-fs" "^4.1.2"
+ "jsonfile" "^4.0.0"
+ "universalify" "^0.1.0"
+
+"fs-extra@^7.0.0":
+ "integrity" "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="
+ "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz"
+ "version" "7.0.1"
+ dependencies:
+ "graceful-fs" "^4.1.2"
+ "jsonfile" "^4.0.0"
+ "universalify" "^0.1.0"
+
+"fs-extra@^8.0.0", "fs-extra@^8.1.0", "fs-extra@8.1.0":
+ "integrity" "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="
+ "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz"
+ "version" "8.1.0"
+ dependencies:
+ "graceful-fs" "^4.2.0"
+ "jsonfile" "^4.0.0"
+ "universalify" "^0.1.0"
+
+"fs-minipass@^1.2.5":
+ "integrity" "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA=="
+ "resolved" "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz"
+ "version" "1.2.7"
+ dependencies:
+ "minipass" "^2.6.0"
+
+"fs-minipass@^2.0.0":
+ "integrity" "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="
+ "resolved" "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "minipass" "^3.0.0"
+
+"fs-vacuum@^1.2.10", "fs-vacuum@~1.2.10":
+ "integrity" "sha1-t2Kb7AekAxolSP35n17PHMizHjY="
+ "resolved" "https://registry.npmjs.org/fs-vacuum/-/fs-vacuum-1.2.10.tgz"
+ "version" "1.2.10"
+ dependencies:
+ "graceful-fs" "^4.1.2"
+ "path-is-inside" "^1.0.1"
+ "rimraf" "^2.5.2"
+
+"fs-write-stream-atomic@^1.0.8", "fs-write-stream-atomic@~1.0.10":
+ "integrity" "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk="
+ "resolved" "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz"
+ "version" "1.0.10"
+ dependencies:
+ "graceful-fs" "^4.1.2"
+ "iferr" "^0.1.5"
+ "imurmurhash" "^0.1.4"
+ "readable-stream" "1 || 2"
+
+"fs.realpath@^1.0.0":
+ "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
+ "version" "1.0.0"
+
+"function-bind@^1.1.1":
+ "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"
+ "version" "1.1.1"
+
+"function.prototype.name@^1.1.5":
+ "integrity" "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA=="
+ "resolved" "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz"
+ "version" "1.1.5"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "define-properties" "^1.1.3"
+ "es-abstract" "^1.19.0"
+ "functions-have-names" "^1.2.2"
+
+"functional-red-black-tree@^1.0.1":
+ "integrity" "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
+ "resolved" "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz"
+ "version" "1.0.1"
+
+"functions-have-names@^1.2.2":
+ "integrity" "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
+ "resolved" "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz"
+ "version" "1.2.3"
+
+"gauge@~2.7.3":
+ "integrity" "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c="
+ "resolved" "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz"
+ "version" "2.7.4"
+ dependencies:
+ "aproba" "^1.0.3"
+ "console-control-strings" "^1.0.0"
+ "has-unicode" "^2.0.0"
+ "object-assign" "^4.1.0"
+ "signal-exit" "^3.0.0"
+ "string-width" "^1.0.1"
+ "strip-ansi" "^3.0.1"
+ "wide-align" "^1.1.0"
+
+"genfun@^5.0.0":
+ "integrity" "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA=="
+ "resolved" "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz"
+ "version" "5.0.0"
+
+"gensync@^1.0.0-beta.1", "gensync@^1.0.0-beta.2":
+ "integrity" "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="
+ "resolved" "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz"
+ "version" "1.0.0-beta.2"
+
+"gentle-fs@^2.3.0":
+ "version" "2.3.0"
+ dependencies:
+ "aproba" "^1.1.2"
+ "chownr" "^1.1.2"
+ "cmd-shim" "^3.0.3"
+ "fs-vacuum" "^1.2.10"
+ "graceful-fs" "^4.1.11"
+ "iferr" "^0.1.5"
+ "infer-owner" "^1.0.4"
+ "mkdirp" "^0.5.1"
+ "path-is-inside" "^1.0.2"
+ "read-cmd-shim" "^1.0.1"
+ "slide" "^1.1.6"
+
+"get-caller-file@^1.0.1":
+ "integrity" "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w=="
+ "resolved" "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz"
+ "version" "1.0.3"
+
+"get-caller-file@^2.0.1":
+ "integrity" "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
+ "resolved" "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz"
+ "version" "2.0.5"
+
+"get-intrinsic@^1.0.2", "get-intrinsic@^1.1.0", "get-intrinsic@^1.1.1":
+ "integrity" "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA=="
+ "resolved" "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz"
+ "version" "1.1.2"
+ dependencies:
+ "function-bind" "^1.1.1"
+ "has" "^1.0.3"
+ "has-symbols" "^1.0.3"
+
+"get-own-enumerable-property-symbols@^3.0.0":
+ "integrity" "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g=="
+ "resolved" "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz"
+ "version" "3.0.2"
+
+"get-stream@^3.0.0":
+ "integrity" "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
+ "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz"
+ "version" "3.0.0"
+
+"get-stream@^4.0.0", "get-stream@^4.1.0":
+ "integrity" "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w=="
+ "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz"
+ "version" "4.1.0"
+ dependencies:
+ "pump" "^3.0.0"
+
+"get-stream@^5.0.0":
+ "integrity" "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw=="
+ "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz"
+ "version" "5.1.0"
+ dependencies:
+ "pump" "^3.0.0"
+
+"get-symbol-description@^1.0.0":
+ "integrity" "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw=="
+ "resolved" "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "get-intrinsic" "^1.1.1"
+
+"get-value@^2.0.3", "get-value@^2.0.6":
+ "integrity" "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
+ "resolved" "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz"
+ "version" "2.0.6"
+
+"getpass@^0.1.1":
+ "integrity" "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo="
+ "resolved" "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz"
+ "version" "0.1.7"
+ dependencies:
+ "assert-plus" "^1.0.0"
+
+"git-log-parser@^1.2.0":
+ "integrity" "sha1-LmpMGxP8AAKCB7p5WnrDFme5/Uo="
+ "resolved" "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz"
+ "version" "1.2.0"
+ dependencies:
+ "argv-formatter" "~1.0.0"
+ "spawn-error-forwarder" "~1.0.0"
+ "split2" "~1.0.0"
+ "stream-combiner2" "~1.1.1"
+ "through2" "~2.0.0"
+ "traverse" "~0.6.6"
+
+"glob-parent@^3.1.0":
+ "integrity" "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4="
+ "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "is-glob" "^3.1.0"
+ "path-dirname" "^1.0.0"
+
+"glob-parent@^5.0.0", "glob-parent@^5.1.0", "glob-parent@~5.1.0":
+ "integrity" "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ=="
+ "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz"
+ "version" "5.1.1"
+ dependencies:
+ "is-glob" "^4.0.1"
+
+"glob-to-regexp@^0.3.0":
+ "integrity" "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs="
+ "resolved" "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz"
+ "version" "0.3.0"
+
+"glob@^7.0.3", "glob@^7.1.1", "glob@^7.1.2", "glob@^7.1.3", "glob@^7.1.4", "glob@^7.1.6":
+ "integrity" "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA=="
+ "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz"
+ "version" "7.1.6"
+ dependencies:
+ "fs.realpath" "^1.0.0"
+ "inflight" "^1.0.4"
+ "inherits" "2"
+ "minimatch" "^3.0.4"
+ "once" "^1.3.0"
+ "path-is-absolute" "^1.0.0"
+
+"glob@7.1.4":
+ "integrity" "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A=="
+ "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz"
+ "version" "7.1.4"
+ dependencies:
+ "fs.realpath" "^1.0.0"
+ "inflight" "^1.0.4"
+ "inherits" "2"
+ "minimatch" "^3.0.4"
+ "once" "^1.3.0"
+ "path-is-absolute" "^1.0.0"
+
+"global-dirs@^0.1.0":
+ "integrity" "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU="
+ "resolved" "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz"
+ "version" "0.1.1"
+ dependencies:
+ "ini" "^1.3.4"
+
+"global-dirs@^0.1.1":
+ "integrity" "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU="
+ "resolved" "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz"
+ "version" "0.1.1"
+ dependencies:
+ "ini" "^1.3.4"
+
+"global-modules@^1.0.0":
+ "integrity" "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg=="
+ "resolved" "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "global-prefix" "^1.0.1"
+ "is-windows" "^1.0.1"
+ "resolve-dir" "^1.0.0"
+
+"global-modules@2.0.0":
+ "integrity" "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A=="
+ "resolved" "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "global-prefix" "^3.0.0"
+
+"global-prefix@^1.0.1":
+ "integrity" "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4="
+ "resolved" "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "expand-tilde" "^2.0.2"
+ "homedir-polyfill" "^1.0.1"
+ "ini" "^1.3.4"
+ "is-windows" "^1.0.1"
+ "which" "^1.2.14"
+
+"global-prefix@^3.0.0":
+ "integrity" "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg=="
+ "resolved" "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "ini" "^1.3.5"
+ "kind-of" "^6.0.2"
+ "which" "^1.3.1"
+
+"globals@^11.1.0":
+ "integrity" "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
+ "resolved" "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz"
+ "version" "11.12.0"
+
+"globals@^12.1.0":
+ "integrity" "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg=="
+ "resolved" "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz"
+ "version" "12.4.0"
+ dependencies:
+ "type-fest" "^0.8.1"
+
+"globby@^10.0.0":
+ "integrity" "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg=="
+ "resolved" "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz"
+ "version" "10.0.2"
dependencies:
"@types/glob" "^7.1.1"
- array-union "^2.1.0"
- dir-glob "^3.0.1"
- fast-glob "^3.0.3"
- glob "^7.1.3"
- ignore "^5.1.1"
- merge2 "^1.2.3"
- slash "^3.0.0"
-
-globby@^6.1.0:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
- integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=
- dependencies:
- array-union "^1.0.1"
- glob "^7.0.3"
- object-assign "^4.0.1"
- pify "^2.0.0"
- pinkie-promise "^2.0.0"
-
-google-code-prettify@~1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/google-code-prettify/-/google-code-prettify-1.0.5.tgz#9f477f224dbfa62372e5ef803a7e157410400084"
- integrity sha1-n0d/Ik2/piNy5e+AOn4VdBBAAIQ=
-
-got@^6.7.1:
- version "6.7.1"
- resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0"
- integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=
- dependencies:
- create-error-class "^3.0.0"
- duplexer3 "^0.1.4"
- get-stream "^3.0.0"
- is-redirect "^1.0.0"
- is-retry-allowed "^1.0.0"
- is-stream "^1.0.0"
- lowercase-keys "^1.0.0"
- safe-buffer "^5.0.1"
- timed-out "^4.0.0"
- unzip-response "^2.0.1"
- url-parse-lax "^1.0.0"
-
-graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.4:
- version "4.2.4"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
- integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
-
-growly@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
- integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=
-
-gud@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0"
- integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==
-
-gulp-header@^1.7.1:
- version "1.8.12"
- resolved "https://registry.yarnpkg.com/gulp-header/-/gulp-header-1.8.12.tgz#ad306be0066599127281c4f8786660e705080a84"
- integrity sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==
- dependencies:
- concat-with-sourcemaps "*"
- lodash.template "^4.4.0"
- through2 "^2.0.0"
-
-gzip-size@5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274"
- integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==
- dependencies:
- duplexer "^0.1.1"
- pify "^4.0.1"
-
-handle-thing@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e"
- integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==
-
-handlebars@^4.7.6:
- version "4.7.6"
- resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e"
- integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==
- dependencies:
- minimist "^1.2.5"
- neo-async "^2.6.0"
- source-map "^0.6.1"
- wordwrap "^1.0.0"
+ "array-union" "^2.1.0"
+ "dir-glob" "^3.0.1"
+ "fast-glob" "^3.0.3"
+ "glob" "^7.1.3"
+ "ignore" "^5.1.1"
+ "merge2" "^1.2.3"
+ "slash" "^3.0.0"
+
+"globby@^6.1.0":
+ "integrity" "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw="
+ "resolved" "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz"
+ "version" "6.1.0"
+ dependencies:
+ "array-union" "^1.0.1"
+ "glob" "^7.0.3"
+ "object-assign" "^4.0.1"
+ "pify" "^2.0.0"
+ "pinkie-promise" "^2.0.0"
+
+"globby@8.0.2":
+ "integrity" "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w=="
+ "resolved" "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz"
+ "version" "8.0.2"
+ dependencies:
+ "array-union" "^1.0.1"
+ "dir-glob" "2.0.0"
+ "fast-glob" "^2.0.2"
+ "glob" "^7.1.2"
+ "ignore" "^3.3.5"
+ "pify" "^3.0.0"
+ "slash" "^1.0.0"
+
+"google-code-prettify@~1.0.5":
+ "integrity" "sha1-n0d/Ik2/piNy5e+AOn4VdBBAAIQ="
+ "resolved" "https://registry.npmjs.org/google-code-prettify/-/google-code-prettify-1.0.5.tgz"
+ "version" "1.0.5"
+
+"got@^6.7.1":
+ "integrity" "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA="
+ "resolved" "https://registry.npmjs.org/got/-/got-6.7.1.tgz"
+ "version" "6.7.1"
+ dependencies:
+ "create-error-class" "^3.0.0"
+ "duplexer3" "^0.1.4"
+ "get-stream" "^3.0.0"
+ "is-redirect" "^1.0.0"
+ "is-retry-allowed" "^1.0.0"
+ "is-stream" "^1.0.0"
+ "lowercase-keys" "^1.0.0"
+ "safe-buffer" "^5.0.1"
+ "timed-out" "^4.0.0"
+ "unzip-response" "^2.0.1"
+ "url-parse-lax" "^1.0.0"
+
+"graceful-fs@^4.1.11", "graceful-fs@^4.1.15", "graceful-fs@^4.1.2", "graceful-fs@^4.1.6", "graceful-fs@^4.2.0", "graceful-fs@^4.2.2", "graceful-fs@^4.2.4":
+ "integrity" "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
+ "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz"
+ "version" "4.2.4"
+
+"growly@^1.3.0":
+ "integrity" "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE="
+ "resolved" "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz"
+ "version" "1.3.0"
+
+"gud@^1.0.0":
+ "integrity" "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw=="
+ "resolved" "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz"
+ "version" "1.0.0"
+
+"gulp-header@^1.7.1":
+ "integrity" "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ=="
+ "resolved" "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz"
+ "version" "1.8.12"
+ dependencies:
+ "concat-with-sourcemaps" "*"
+ "lodash.template" "^4.4.0"
+ "through2" "^2.0.0"
+
+"gzip-size@5.1.1":
+ "integrity" "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA=="
+ "resolved" "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz"
+ "version" "5.1.1"
+ dependencies:
+ "duplexer" "^0.1.1"
+ "pify" "^4.0.1"
+
+"handle-thing@^2.0.0":
+ "integrity" "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg=="
+ "resolved" "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz"
+ "version" "2.0.1"
+
+"handlebars@^4.7.6":
+ "integrity" "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA=="
+ "resolved" "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz"
+ "version" "4.7.6"
+ dependencies:
+ "minimist" "^1.2.5"
+ "neo-async" "^2.6.0"
+ "source-map" "^0.6.1"
+ "wordwrap" "^1.0.0"
optionalDependencies:
- uglify-js "^3.1.4"
-
-har-schema@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
- integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
-
-har-validator@~5.1.3:
- version "5.1.3"
- resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080"
- integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==
- dependencies:
- ajv "^6.5.5"
- har-schema "^2.0.0"
-
-hard-rejection@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883"
- integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==
-
-harmony-reflect@^1.4.6:
- version "1.6.1"
- resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.1.tgz#c108d4f2bb451efef7a37861fdbdae72c9bdefa9"
- integrity sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==
-
-has-ansi@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
- integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
- dependencies:
- ansi-regex "^2.0.0"
-
-has-flag@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
- integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=
-
-has-flag@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
- integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
-
-has-flag@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
- integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
-
-has-symbols@^1.0.0, has-symbols@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
- integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
-
-has-unicode@^2.0.0, has-unicode@~2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
- integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
-
-has-value@^0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
- integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
- dependencies:
- get-value "^2.0.3"
- has-values "^0.1.4"
- isobject "^2.0.0"
-
-has-value@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
- integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
- dependencies:
- get-value "^2.0.6"
- has-values "^1.0.0"
- isobject "^3.0.0"
-
-has-values@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
- integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
-
-has-values@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
- integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
- dependencies:
- is-number "^3.0.0"
- kind-of "^4.0.0"
-
-has@^1.0.0, has@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
- integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
- dependencies:
- function-bind "^1.1.1"
-
-hash-base@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
- integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
- dependencies:
- inherits "^2.0.4"
- readable-stream "^3.6.0"
- safe-buffer "^5.2.0"
-
-hash.js@^1.0.0, hash.js@^1.0.3:
- version "1.1.7"
- resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
- integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
- dependencies:
- inherits "^2.0.3"
- minimalistic-assert "^1.0.1"
-
-he@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
- integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
-
-hex-color-regex@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
- integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
-
-history@^4.9.0:
- version "4.10.1"
- resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3"
- integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==
+ "uglify-js" "^3.1.4"
+
+"har-schema@^2.0.0":
+ "integrity" "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
+ "resolved" "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz"
+ "version" "2.0.0"
+
+"har-validator@~5.1.0":
+ "version" "5.1.0"
+ dependencies:
+ "ajv" "^5.3.0"
+ "har-schema" "^2.0.0"
+
+"har-validator@~5.1.3":
+ "integrity" "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g=="
+ "resolved" "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz"
+ "version" "5.1.3"
+ dependencies:
+ "ajv" "^6.5.5"
+ "har-schema" "^2.0.0"
+
+"hard-rejection@^2.1.0":
+ "integrity" "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA=="
+ "resolved" "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz"
+ "version" "2.1.0"
+
+"harmony-reflect@^1.4.6":
+ "integrity" "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA=="
+ "resolved" "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz"
+ "version" "1.6.1"
+
+"has-ansi@^2.0.0":
+ "integrity" "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE="
+ "resolved" "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "ansi-regex" "^2.0.0"
+
+"has-bigints@^1.0.1", "has-bigints@^1.0.2":
+ "integrity" "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ=="
+ "resolved" "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz"
+ "version" "1.0.2"
+
+"has-flag@^2.0.0":
+ "integrity" "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE="
+ "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz"
+ "version" "2.0.0"
+
+"has-flag@^3.0.0":
+ "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+ "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
+ "version" "3.0.0"
+
+"has-flag@^4.0.0":
+ "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
+ "version" "4.0.0"
+
+"has-property-descriptors@^1.0.0":
+ "integrity" "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ=="
+ "resolved" "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "get-intrinsic" "^1.1.1"
+
+"has-symbols@^1.0.0":
+ "version" "1.0.0"
+
+"has-symbols@^1.0.1", "has-symbols@^1.0.2", "has-symbols@^1.0.3":
+ "integrity" "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+ "resolved" "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz"
+ "version" "1.0.3"
+
+"has-tostringtag@^1.0.0":
+ "integrity" "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ=="
+ "resolved" "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "has-symbols" "^1.0.2"
+
+"has-unicode@^2.0.0", "has-unicode@~2.0.1":
+ "integrity" "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
+ "resolved" "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz"
+ "version" "2.0.1"
+
+"has-value@^0.3.1":
+ "integrity" "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8="
+ "resolved" "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz"
+ "version" "0.3.1"
+ dependencies:
+ "get-value" "^2.0.3"
+ "has-values" "^0.1.4"
+ "isobject" "^2.0.0"
+
+"has-value@^1.0.0":
+ "integrity" "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc="
+ "resolved" "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "get-value" "^2.0.6"
+ "has-values" "^1.0.0"
+ "isobject" "^3.0.0"
+
+"has-values@^0.1.4":
+ "integrity" "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
+ "resolved" "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz"
+ "version" "0.1.4"
+
+"has-values@^1.0.0":
+ "integrity" "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8="
+ "resolved" "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "is-number" "^3.0.0"
+ "kind-of" "^4.0.0"
+
+"has@^1.0.0", "has@^1.0.3":
+ "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw=="
+ "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz"
+ "version" "1.0.3"
+ dependencies:
+ "function-bind" "^1.1.1"
+
+"has@^1.0.1":
+ "version" "1.0.3"
+ dependencies:
+ "function-bind" "^1.1.1"
+
+"hash-base@^3.0.0":
+ "integrity" "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA=="
+ "resolved" "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "inherits" "^2.0.4"
+ "readable-stream" "^3.6.0"
+ "safe-buffer" "^5.2.0"
+
+"hash.js@^1.0.0", "hash.js@^1.0.3":
+ "integrity" "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA=="
+ "resolved" "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz"
+ "version" "1.1.7"
+ dependencies:
+ "inherits" "^2.0.3"
+ "minimalistic-assert" "^1.0.1"
+
+"he@^1.2.0":
+ "integrity" "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
+ "resolved" "https://registry.npmjs.org/he/-/he-1.2.0.tgz"
+ "version" "1.2.0"
+
+"hex-color-regex@^1.1.0":
+ "integrity" "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ=="
+ "resolved" "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz"
+ "version" "1.1.0"
+
+"history@^4.9.0":
+ "integrity" "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew=="
+ "resolved" "https://registry.npmjs.org/history/-/history-4.10.1.tgz"
+ "version" "4.10.1"
dependencies:
"@babel/runtime" "^7.1.2"
- loose-envify "^1.2.0"
- resolve-pathname "^3.0.0"
- tiny-invariant "^1.0.2"
- tiny-warning "^1.0.0"
- value-equal "^1.0.1"
-
-hmac-drbg@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
- integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
- dependencies:
- hash.js "^1.0.3"
- minimalistic-assert "^1.0.0"
- minimalistic-crypto-utils "^1.0.1"
-
-hoist-non-react-statics@^2.1.1, hoist-non-react-statics@^2.3.1:
- version "2.5.5"
- resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47"
- integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==
-
-hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0:
- version "3.3.2"
- resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
- integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
- dependencies:
- react-is "^16.7.0"
-
-homedir-polyfill@^1.0.1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8"
- integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==
- dependencies:
- parse-passwd "^1.0.0"
-
-hook-std@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/hook-std/-/hook-std-2.0.0.tgz#ff9aafdebb6a989a354f729bb6445cf4a3a7077c"
- integrity sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==
-
-hosted-git-info@^2.1.4, hosted-git-info@^2.7.1, hosted-git-info@^2.8.8:
- version "2.8.8"
- resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488"
- integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==
-
-hosted-git-info@^3.0.0:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.4.tgz#be4973eb1fd2737b11c9c7c19380739bb249f60d"
- integrity sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ==
- dependencies:
- lru-cache "^5.1.1"
-
-hpack.js@^2.1.6:
- version "2.1.6"
- resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2"
- integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=
- dependencies:
- inherits "^2.0.1"
- obuf "^1.0.0"
- readable-stream "^2.0.1"
- wbuf "^1.1.0"
-
-hsl-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e"
- integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=
-
-hsla-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38"
- integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg=
-
-html-comment-regex@^1.1.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7"
- integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==
-
-html-encoding-sniffer@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
- integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==
- dependencies:
- whatwg-encoding "^1.0.1"
-
-html-entities@^1.2.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44"
- integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==
-
-html-escaper@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
- integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
-
-html-minifier-terser@^5.0.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054"
- integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==
- dependencies:
- camel-case "^4.1.1"
- clean-css "^4.2.3"
- commander "^4.1.1"
- he "^1.2.0"
- param-case "^3.0.3"
- relateurl "^0.2.7"
- terser "^4.6.3"
-
-html-webpack-plugin@4.0.0-beta.11:
- version "4.0.0-beta.11"
- resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz#3059a69144b5aecef97708196ca32f9e68677715"
- integrity sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg==
- dependencies:
- html-minifier-terser "^5.0.1"
- loader-utils "^1.2.3"
- lodash "^4.17.15"
- pretty-error "^2.1.1"
- tapable "^1.1.3"
- util.promisify "1.0.0"
-
-htmlparser2@^3.3.0:
- version "3.10.1"
- resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
- integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
- dependencies:
- domelementtype "^1.3.1"
- domhandler "^2.3.0"
- domutils "^1.5.1"
- entities "^1.1.1"
- inherits "^2.0.1"
- readable-stream "^3.1.1"
-
-http-cache-semantics@^3.8.1:
- version "3.8.1"
- resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2"
- integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==
-
-http-deceiver@^1.2.7:
- version "1.2.7"
- resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
- integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=
-
-http-errors@1.7.2:
- version "1.7.2"
- resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
- integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
- dependencies:
- depd "~1.1.2"
- inherits "2.0.3"
- setprototypeof "1.1.1"
- statuses ">= 1.5.0 < 2"
- toidentifier "1.0.0"
-
-http-errors@~1.6.2:
- version "1.6.3"
- resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
- integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=
- dependencies:
- depd "~1.1.2"
- inherits "2.0.3"
- setprototypeof "1.1.0"
- statuses ">= 1.4.0 < 2"
-
-http-errors@~1.7.2:
- version "1.7.3"
- resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
- integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
- dependencies:
- depd "~1.1.2"
- inherits "2.0.4"
- setprototypeof "1.1.1"
- statuses ">= 1.5.0 < 2"
- toidentifier "1.0.0"
+ "loose-envify" "^1.2.0"
+ "resolve-pathname" "^3.0.0"
+ "tiny-invariant" "^1.0.2"
+ "tiny-warning" "^1.0.0"
+ "value-equal" "^1.0.1"
+
+"hmac-drbg@^1.0.0":
+ "integrity" "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE="
+ "resolved" "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "hash.js" "^1.0.3"
+ "minimalistic-assert" "^1.0.0"
+ "minimalistic-crypto-utils" "^1.0.1"
+
+"hoist-non-react-statics@^2.1.1":
+ "integrity" "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw=="
+ "resolved" "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz"
+ "version" "2.5.5"
+
+"hoist-non-react-statics@^2.5.5":
+ "integrity" "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw=="
+ "resolved" "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz"
+ "version" "2.5.5"
+
+"hoist-non-react-statics@^3.1.0", "hoist-non-react-statics@^3.3.0":
+ "integrity" "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="
+ "resolved" "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz"
+ "version" "3.3.2"
+ dependencies:
+ "react-is" "^16.7.0"
+
+"homedir-polyfill@^1.0.1":
+ "integrity" "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA=="
+ "resolved" "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz"
+ "version" "1.0.3"
+ dependencies:
+ "parse-passwd" "^1.0.0"
+
+"hook-std@^2.0.0":
+ "integrity" "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g=="
+ "resolved" "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz"
+ "version" "2.0.0"
+
+"hosted-git-info@^2.1.4", "hosted-git-info@^2.7.1", "hosted-git-info@^2.8.8":
+ "integrity" "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg=="
+ "resolved" "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz"
+ "version" "2.8.8"
+
+"hosted-git-info@^3.0.0":
+ "integrity" "sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ=="
+ "resolved" "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.4.tgz"
+ "version" "3.0.4"
+ dependencies:
+ "lru-cache" "^5.1.1"
+
+"hpack.js@^2.1.6":
+ "integrity" "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI="
+ "resolved" "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz"
+ "version" "2.1.6"
+ dependencies:
+ "inherits" "^2.0.1"
+ "obuf" "^1.0.0"
+ "readable-stream" "^2.0.1"
+ "wbuf" "^1.1.0"
+
+"hsl-regex@^1.0.0":
+ "integrity" "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4="
+ "resolved" "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz"
+ "version" "1.0.0"
+
+"hsla-regex@^1.0.0":
+ "integrity" "sha1-wc56MWjIxmFAM6S194d/OyJfnDg="
+ "resolved" "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz"
+ "version" "1.0.0"
+
+"html-comment-regex@^1.1.0":
+ "integrity" "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ=="
+ "resolved" "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz"
+ "version" "1.1.2"
+
+"html-encoding-sniffer@^1.0.2":
+ "integrity" "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw=="
+ "resolved" "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "whatwg-encoding" "^1.0.1"
+
+"html-entities@^1.2.1":
+ "integrity" "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA=="
+ "resolved" "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz"
+ "version" "1.3.1"
+
+"html-escaper@^2.0.0":
+ "integrity" "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="
+ "resolved" "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz"
+ "version" "2.0.2"
+
+"html-minifier-terser@^5.0.1":
+ "integrity" "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg=="
+ "resolved" "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz"
+ "version" "5.1.1"
+ dependencies:
+ "camel-case" "^4.1.1"
+ "clean-css" "^4.2.3"
+ "commander" "^4.1.1"
+ "he" "^1.2.0"
+ "param-case" "^3.0.3"
+ "relateurl" "^0.2.7"
+ "terser" "^4.6.3"
+
+"html-webpack-plugin@4.0.0-beta.11":
+ "integrity" "sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg=="
+ "resolved" "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz"
+ "version" "4.0.0-beta.11"
+ dependencies:
+ "html-minifier-terser" "^5.0.1"
+ "loader-utils" "^1.2.3"
+ "lodash" "^4.17.15"
+ "pretty-error" "^2.1.1"
+ "tapable" "^1.1.3"
+ "util.promisify" "1.0.0"
+
+"htmlparser2@^3.3.0":
+ "integrity" "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ=="
+ "resolved" "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz"
+ "version" "3.10.1"
+ dependencies:
+ "domelementtype" "^1.3.1"
+ "domhandler" "^2.3.0"
+ "domutils" "^1.5.1"
+ "entities" "^1.1.1"
+ "inherits" "^2.0.1"
+ "readable-stream" "^3.1.1"
+
+"http-cache-semantics@^3.8.1":
+ "integrity" "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w=="
+ "resolved" "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz"
+ "version" "3.8.1"
+
+"http-deceiver@^1.2.7":
+ "integrity" "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc="
+ "resolved" "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz"
+ "version" "1.2.7"
+
+"http-errors@~1.6.2":
+ "integrity" "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0="
+ "resolved" "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz"
+ "version" "1.6.3"
+ dependencies:
+ "depd" "~1.1.2"
+ "inherits" "2.0.3"
+ "setprototypeof" "1.1.0"
+ "statuses" ">= 1.4.0 < 2"
+
+"http-errors@~1.7.2":
+ "integrity" "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw=="
+ "resolved" "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz"
+ "version" "1.7.3"
+ dependencies:
+ "depd" "~1.1.2"
+ "inherits" "2.0.4"
+ "setprototypeof" "1.1.1"
+ "statuses" ">= 1.5.0 < 2"
+ "toidentifier" "1.0.0"
+
+"http-errors@1.7.2":
+ "integrity" "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg=="
+ "resolved" "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz"
+ "version" "1.7.2"
+ dependencies:
+ "depd" "~1.1.2"
+ "inherits" "2.0.3"
+ "setprototypeof" "1.1.1"
+ "statuses" ">= 1.5.0 < 2"
+ "toidentifier" "1.0.0"
"http-parser-js@>=0.4.0 <0.4.11":
- version "0.4.10"
- resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4"
- integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=
-
-http-proxy-agent@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405"
- integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==
- dependencies:
- agent-base "4"
- debug "3.1.0"
-
-http-proxy-agent@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-3.0.0.tgz#598f42dc815949a11e2c6dbfdf24cd8a4c165327"
- integrity sha512-uGuJaBWQWDQCJI5ip0d/VTYZW0nRrlLWXA4A7P1jrsa+f77rW2yXz315oBt6zGCF6l8C2tlMxY7ffULCj+5FhA==
- dependencies:
- agent-base "5"
- debug "4"
-
-http-proxy-middleware@0.19.1:
- version "0.19.1"
- resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a"
- integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==
- dependencies:
- http-proxy "^1.17.0"
- is-glob "^4.0.0"
- lodash "^4.17.11"
- micromatch "^3.1.10"
-
-http-proxy@^1.17.0:
- version "1.18.1"
- resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"
- integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==
- dependencies:
- eventemitter3 "^4.0.0"
- follow-redirects "^1.0.0"
- requires-port "^1.0.0"
-
-http-signature@~1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
- integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
- dependencies:
- assert-plus "^1.0.0"
- jsprim "^1.2.2"
- sshpk "^1.7.0"
-
-https-browserify@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
- integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
-
-https-proxy-agent@^2.2.3:
- version "2.2.4"
- resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b"
- integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==
- dependencies:
- agent-base "^4.3.0"
- debug "^3.1.0"
-
-https-proxy-agent@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz#702b71fb5520a132a66de1f67541d9e62154d82b"
- integrity sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==
- dependencies:
- agent-base "5"
- debug "4"
-
-human-signals@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
- integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
-
-humanize-ms@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
- integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=
- dependencies:
- ms "^2.0.0"
-
-iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13:
- version "0.4.24"
- resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
- integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
- dependencies:
- safer-buffer ">= 2.1.2 < 3"
-
-icss-utils@^4.0.0, icss-utils@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467"
- integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==
- dependencies:
- postcss "^7.0.14"
-
-identity-obj-proxy@3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14"
- integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=
- dependencies:
- harmony-reflect "^1.4.6"
-
-ieee754@^1.1.13, ieee754@^1.1.4:
- version "1.1.13"
- resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
- integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==
-
-iferr@^0.1.5:
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
- integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=
-
-iferr@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/iferr/-/iferr-1.0.2.tgz#e9fde49a9da06dc4a4194c6c9ed6d08305037a6d"
- integrity sha512-9AfeLfji44r5TKInjhz3W9DyZI1zR1JAf2hVBMGhddAKPqBsupb89jGfbCTHIGZd6fGZl9WlHdn4AObygyMKwg==
-
-ignore-walk@^3.0.1:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37"
- integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==
- dependencies:
- minimatch "^3.0.4"
-
-ignore@^3.3.5:
- version "3.3.10"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
- integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
-
-ignore@^4.0.6:
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
- integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
-
-ignore@^5.1.1:
- version "5.1.4"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf"
- integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==
-
-immer@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/immer/-/immer-1.10.0.tgz#bad67605ba9c810275d91e1c2a47d4582e98286d"
- integrity sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==
-
-immutable@^3.8.1, immutable@^3.x.x:
- version "3.8.2"
- resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3"
- integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=
-
-import-cwd@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9"
- integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=
- dependencies:
- import-from "^2.1.0"
-
-import-fresh@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546"
- integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY=
- dependencies:
- caller-path "^2.0.0"
- resolve-from "^3.0.0"
-
-import-fresh@^3.0.0, import-fresh@^3.1.0:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66"
- integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==
- dependencies:
- parent-module "^1.0.0"
- resolve-from "^4.0.0"
-
-import-from@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1"
- integrity sha1-M1238qev/VOqpHHUuAId7ja387E=
- dependencies:
- resolve-from "^3.0.0"
-
-import-from@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966"
- integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==
- dependencies:
- resolve-from "^5.0.0"
-
-import-lazy@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
- integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=
-
-import-local@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d"
- integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==
- dependencies:
- pkg-dir "^3.0.0"
- resolve-cwd "^2.0.0"
-
-imurmurhash@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
- integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
-
-indent-string@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
- integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
-
-indexes-of@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
- integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
-
-infer-owner@^1.0.3, infer-owner@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
- integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
-
-inflight@^1.0.4, inflight@~1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
- integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
- dependencies:
- once "^1.3.0"
- wrappy "1"
-
-inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
- integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-
-inherits@2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
- integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
-
-inherits@2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
- integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
-
-ini@^1.3.4, ini@^1.3.5, ini@~1.3.0:
- version "1.3.5"
- resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
- integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
-
-init-package-json@^1.10.3:
- version "1.10.3"
- resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.3.tgz#45ffe2f610a8ca134f2bd1db5637b235070f6cbe"
- integrity sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw==
- dependencies:
- glob "^7.1.1"
- npm-package-arg "^4.0.0 || ^5.0.0 || ^6.0.0"
- promzard "^0.3.0"
- read "~1.0.1"
- read-package-json "1 || 2"
- semver "2.x || 3.x || 4 || 5"
- validate-npm-package-license "^3.0.1"
- validate-npm-package-name "^3.0.0"
-
-inquirer@6.5.0:
- version "6.5.0"
- resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42"
- integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==
- dependencies:
- ansi-escapes "^3.2.0"
- chalk "^2.4.2"
- cli-cursor "^2.1.0"
- cli-width "^2.0.0"
- external-editor "^3.0.3"
- figures "^2.0.0"
- lodash "^4.17.12"
- mute-stream "0.0.7"
- run-async "^2.2.0"
- rxjs "^6.4.0"
- string-width "^2.1.0"
- strip-ansi "^5.1.0"
- through "^2.3.6"
-
-inquirer@7.0.4:
- version "7.0.4"
- resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703"
- integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==
- dependencies:
- ansi-escapes "^4.2.1"
- chalk "^2.4.2"
- cli-cursor "^3.1.0"
- cli-width "^2.0.0"
- external-editor "^3.0.3"
- figures "^3.0.0"
- lodash "^4.17.15"
- mute-stream "0.0.8"
- run-async "^2.2.0"
- rxjs "^6.5.3"
- string-width "^4.1.0"
- strip-ansi "^5.1.0"
- through "^2.3.6"
-
-inquirer@^7.0.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29"
- integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==
- dependencies:
- ansi-escapes "^4.2.1"
- chalk "^3.0.0"
- cli-cursor "^3.1.0"
- cli-width "^2.0.0"
- external-editor "^3.0.3"
- figures "^3.0.0"
- lodash "^4.17.15"
- mute-stream "0.0.8"
- run-async "^2.4.0"
- rxjs "^6.5.3"
- string-width "^4.1.0"
- strip-ansi "^6.0.0"
- through "^2.3.6"
-
-internal-ip@^4.3.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907"
- integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==
- dependencies:
- default-gateway "^4.2.0"
- ipaddr.js "^1.9.0"
-
-internal-slot@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3"
- integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==
- dependencies:
- es-abstract "^1.17.0-next.1"
- has "^1.0.3"
- side-channel "^1.0.2"
-
-into-stream@^5.0.0:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-5.1.1.tgz#f9a20a348a11f3c13face22763f2d02e127f4db8"
- integrity sha512-krrAJ7McQxGGmvaYbB7Q1mcA+cRwg9Ij2RfWIeVesNBgVDZmzY/Fa4IpZUT3bmdRzMzdf/mzltCG2Dq99IZGBA==
- dependencies:
- from2 "^2.3.0"
- p-is-promise "^3.0.0"
-
-invariant@^2.0.0, invariant@^2.1.0, invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4:
- version "2.2.4"
- resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
- integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
- dependencies:
- loose-envify "^1.0.0"
-
-invert-kv@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
- integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
-
-invert-kv@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02"
- integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==
-
-ip-regex@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9"
- integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=
-
-ip@1.1.5, ip@^1.1.0, ip@^1.1.5:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
- integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
-
-ipaddr.js@1.9.1, ipaddr.js@^1.9.0:
- version "1.9.1"
- resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
- integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
-
-is-absolute-url@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
- integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=
-
-is-absolute-url@^3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698"
- integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==
-
-is-accessor-descriptor@^0.1.6:
- version "0.1.6"
- resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
- integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
- dependencies:
- kind-of "^3.0.2"
-
-is-accessor-descriptor@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
- integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
- dependencies:
- kind-of "^6.0.0"
-
-is-arguments@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3"
- integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==
-
-is-arrayish@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
- integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
-
-is-arrayish@^0.3.1:
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
- integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
-
-is-binary-path@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
- integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=
- dependencies:
- binary-extensions "^1.0.0"
-
-is-binary-path@~2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
- integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
- dependencies:
- binary-extensions "^2.0.0"
-
-is-buffer@^1.0.2, is-buffer@^1.1.5:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
- integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
-
-is-callable@^1.1.4, is-callable@^1.1.5:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab"
- integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==
-
-is-ci@^1.0.10:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c"
- integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==
- dependencies:
- ci-info "^1.5.0"
-
-is-ci@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
- integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
- dependencies:
- ci-info "^2.0.0"
-
-is-cidr@^3.0.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-3.1.1.tgz#e92ef121bdec2782271a77ce487a8b8df3718ab7"
- integrity sha512-Gx+oErgq1j2jAKCR2Kbq0b3wbH0vQKqZ0wOlHxm0o56nq51Cs/DZA8oz9dMDhbHyHEGgJ86eTeVudtgMMOx3Mw==
- dependencies:
- cidr-regex "^2.0.10"
-
-is-color-stop@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345"
- integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=
- dependencies:
- css-color-names "^0.0.4"
- hex-color-regex "^1.1.0"
- hsl-regex "^1.0.0"
- hsla-regex "^1.0.0"
- rgb-regex "^1.0.1"
- rgba-regex "^1.0.0"
-
-is-data-descriptor@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
- integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
- dependencies:
- kind-of "^3.0.2"
-
-is-data-descriptor@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
- integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
- dependencies:
- kind-of "^6.0.0"
-
-is-date-object@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e"
- integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==
-
-is-descriptor@^0.1.0:
- version "0.1.6"
- resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
- integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
- dependencies:
- is-accessor-descriptor "^0.1.6"
- is-data-descriptor "^0.1.4"
- kind-of "^5.0.0"
-
-is-descriptor@^1.0.0, is-descriptor@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
- integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
- dependencies:
- is-accessor-descriptor "^1.0.0"
- is-data-descriptor "^1.0.0"
- kind-of "^6.0.2"
-
-is-directory@^0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
- integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
-
-is-docker@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b"
- integrity sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==
-
-is-dom@^1.0.9:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-dom/-/is-dom-1.1.0.tgz#af1fced292742443bb59ca3f76ab5e80907b4e8a"
- integrity sha512-u82f6mvhYxRPKpw8V1N0W8ce1xXwOrQtgGcxl6UCL5zBmZu3is/18K0rR7uFCnMDuAsS/3W54mGL4vsaFUQlEQ==
- dependencies:
- is-object "^1.0.1"
- is-window "^1.0.2"
-
-is-extendable@^0.1.0, is-extendable@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
- integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
-
-is-extendable@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
- integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
- dependencies:
- is-plain-object "^2.0.4"
-
-is-extglob@^2.1.0, is-extglob@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
- integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
-
-is-fullwidth-code-point@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
- integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
- dependencies:
- number-is-nan "^1.0.0"
-
-is-fullwidth-code-point@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
- integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
-
-is-fullwidth-code-point@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
- integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
-
-is-generator-fn@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
- integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
-
-is-glob@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
- integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
- dependencies:
- is-extglob "^2.1.0"
-
-is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
- integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
- dependencies:
- is-extglob "^2.1.1"
-
-is-installed-globally@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80"
- integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=
- dependencies:
- global-dirs "^0.1.0"
- is-path-inside "^1.0.0"
-
-is-npm@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
- integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ=
-
-is-number@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
- integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
- dependencies:
- kind-of "^3.0.2"
-
-is-number@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
- integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
-
-is-obj@^1.0.0, is-obj@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
- integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8=
-
-is-obj@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
- integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
-
-is-object@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470"
- integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA=
-
-is-path-cwd@^2.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb"
- integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==
-
-is-path-in-cwd@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb"
- integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==
- dependencies:
- is-path-inside "^2.1.0"
-
-is-path-inside@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
- integrity sha1-jvW33lBDej/cprToZe96pVy0gDY=
- dependencies:
- path-is-inside "^1.0.1"
-
-is-path-inside@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2"
- integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==
- dependencies:
- path-is-inside "^1.0.2"
-
-is-plain-obj@^1.0.0, is-plain-obj@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
- integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
-
-is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
- integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
- dependencies:
- isobject "^3.0.1"
-
-is-plain-object@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928"
- integrity sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==
- dependencies:
- isobject "^4.0.0"
-
-is-promise@^2.1:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
- integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
-
-is-redirect@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
- integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=
-
-is-regex@^1.0.4, is-regex@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae"
- integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==
- dependencies:
- has "^1.0.3"
-
-is-regexp@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069"
- integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk=
-
-is-resolvable@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
- integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
-
-is-retry-allowed@^1.0.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
- integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
-
-is-root@2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c"
- integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==
-
-is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
- integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
-
-is-stream@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3"
- integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==
-
-is-string@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6"
- integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==
-
-is-svg@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75"
- integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==
- dependencies:
- html-comment-regex "^1.1.0"
-
-is-symbol@^1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937"
- integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==
- dependencies:
- has-symbols "^1.0.1"
-
-is-text-path@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e"
- integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=
- dependencies:
- text-extensions "^1.0.0"
-
-is-typedarray@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
- integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
-
-is-utf8@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
- integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
-
-is-window@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-window/-/is-window-1.0.2.tgz#2c896ca53db97de45d3c33133a65d8c9f563480d"
- integrity sha1-LIlspT25feRdPDMTOmXYyfVjSA0=
-
-is-windows@^1.0.1, is-windows@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
- integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
-
-is-wsl@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
- integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
-
-is-wsl@^2.1.1:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
- integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
- dependencies:
- is-docker "^2.0.0"
-
-isarray@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
- integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
-
-isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
- integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
-
-isexe@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
- integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
-
-isobject@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
- integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
- dependencies:
- isarray "1.0.0"
-
-isobject@^3.0.0, isobject@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
- integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
-
-isobject@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0"
- integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==
-
-isomorphic-fetch@^2.1.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9"
- integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=
- dependencies:
- node-fetch "^1.0.1"
- whatwg-fetch ">=0.10.0"
-
-isstream@~0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
- integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
-
-issue-parser@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/issue-parser/-/issue-parser-5.0.0.tgz#0e22a40bc275b6c7da6ddf4a9b979e8ca9faf0d4"
- integrity sha512-q/16W7EPHRL0FKVz9NU++TUsoygXGj6JOi88oulyAcQG+IEZ0T6teVdE+VLbe19OfL/tbV8Wi3Dfo0HedeHW0Q==
- dependencies:
- lodash.capitalize "^4.2.1"
- lodash.escaperegexp "^4.1.2"
- lodash.isplainobject "^4.0.6"
- lodash.isstring "^4.0.1"
- lodash.uniqby "^4.7.0"
-
-istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49"
- integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==
-
-istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630"
- integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==
+ "integrity" "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q="
+ "resolved" "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz"
+ "version" "0.4.10"
+
+"http-proxy-agent@^2.1.0":
+ "integrity" "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg=="
+ "resolved" "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "agent-base" "4"
+ "debug" "3.1.0"
+
+"http-proxy-agent@^3.0.0":
+ "integrity" "sha512-uGuJaBWQWDQCJI5ip0d/VTYZW0nRrlLWXA4A7P1jrsa+f77rW2yXz315oBt6zGCF6l8C2tlMxY7ffULCj+5FhA=="
+ "resolved" "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "agent-base" "5"
+ "debug" "4"
+
+"http-proxy-middleware@0.19.1":
+ "integrity" "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q=="
+ "resolved" "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz"
+ "version" "0.19.1"
+ dependencies:
+ "http-proxy" "^1.17.0"
+ "is-glob" "^4.0.0"
+ "lodash" "^4.17.11"
+ "micromatch" "^3.1.10"
+
+"http-proxy@^1.17.0":
+ "integrity" "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ=="
+ "resolved" "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz"
+ "version" "1.18.1"
+ dependencies:
+ "eventemitter3" "^4.0.0"
+ "follow-redirects" "^1.0.0"
+ "requires-port" "^1.0.0"
+
+"http-signature@~1.2.0":
+ "integrity" "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE="
+ "resolved" "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz"
+ "version" "1.2.0"
+ dependencies:
+ "assert-plus" "^1.0.0"
+ "jsprim" "^1.2.2"
+ "sshpk" "^1.7.0"
+
+"https-browserify@^1.0.0":
+ "integrity" "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
+ "resolved" "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz"
+ "version" "1.0.0"
+
+"https-proxy-agent@^2.2.3":
+ "integrity" "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg=="
+ "resolved" "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz"
+ "version" "2.2.4"
+ dependencies:
+ "agent-base" "^4.3.0"
+ "debug" "^3.1.0"
+
+"https-proxy-agent@^4.0.0":
+ "integrity" "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg=="
+ "resolved" "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz"
+ "version" "4.0.0"
+ dependencies:
+ "agent-base" "5"
+ "debug" "4"
+
+"human-signals@^1.1.1":
+ "integrity" "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw=="
+ "resolved" "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz"
+ "version" "1.1.1"
+
+"humanize-ms@^1.2.1":
+ "integrity" "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0="
+ "resolved" "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz"
+ "version" "1.2.1"
+ dependencies:
+ "ms" "^2.0.0"
+
+"iconv-lite@^0.4.24", "iconv-lite@~0.4.13", "iconv-lite@0.4.24":
+ "integrity" "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="
+ "resolved" "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz"
+ "version" "0.4.24"
+ dependencies:
+ "safer-buffer" ">= 2.1.2 < 3"
+
+"icss-utils@^4.0.0", "icss-utils@^4.1.1":
+ "integrity" "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA=="
+ "resolved" "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz"
+ "version" "4.1.1"
+ dependencies:
+ "postcss" "^7.0.14"
+
+"identity-obj-proxy@3.0.0":
+ "integrity" "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ="
+ "resolved" "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "harmony-reflect" "^1.4.6"
+
+"ieee754@^1.1.13", "ieee754@^1.1.4":
+ "integrity" "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
+ "resolved" "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz"
+ "version" "1.1.13"
+
+"iferr@^0.1.5":
+ "integrity" "sha1-xg7taebY/bazEEofy8ocGS3FtQE="
+ "resolved" "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz"
+ "version" "0.1.5"
+
+"iferr@^1.0.2":
+ "integrity" "sha512-9AfeLfji44r5TKInjhz3W9DyZI1zR1JAf2hVBMGhddAKPqBsupb89jGfbCTHIGZd6fGZl9WlHdn4AObygyMKwg=="
+ "resolved" "https://registry.npmjs.org/iferr/-/iferr-1.0.2.tgz"
+ "version" "1.0.2"
+
+"ignore-walk@^3.0.1":
+ "integrity" "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw=="
+ "resolved" "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz"
+ "version" "3.0.3"
+ dependencies:
+ "minimatch" "^3.0.4"
+
+"ignore@^3.3.5":
+ "integrity" "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug=="
+ "resolved" "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz"
+ "version" "3.3.10"
+
+"ignore@^4.0.6":
+ "integrity" "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
+ "resolved" "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz"
+ "version" "4.0.6"
+
+"ignore@^5.1.1":
+ "integrity" "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A=="
+ "resolved" "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz"
+ "version" "5.1.4"
+
+"immer@1.10.0":
+ "integrity" "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg=="
+ "resolved" "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz"
+ "version" "1.10.0"
+
+"immutable@^3.8.1", "immutable@^3.x.x", "immutable@>= 3", "immutable@>=3.6.2":
+ "integrity" "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM="
+ "resolved" "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz"
+ "version" "3.8.2"
+
+"import-cwd@^2.0.0":
+ "integrity" "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk="
+ "resolved" "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "import-from" "^2.1.0"
+
+"import-fresh@^2.0.0":
+ "integrity" "sha1-2BNVwVYS04bGH53dOSLUMEgipUY="
+ "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "caller-path" "^2.0.0"
+ "resolve-from" "^3.0.0"
+
+"import-fresh@^3.0.0", "import-fresh@^3.1.0":
+ "integrity" "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ=="
+ "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz"
+ "version" "3.2.1"
+ dependencies:
+ "parent-module" "^1.0.0"
+ "resolve-from" "^4.0.0"
+
+"import-from@^2.1.0":
+ "integrity" "sha1-M1238qev/VOqpHHUuAId7ja387E="
+ "resolved" "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "resolve-from" "^3.0.0"
+
+"import-from@^3.0.0":
+ "integrity" "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ=="
+ "resolved" "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "resolve-from" "^5.0.0"
+
+"import-lazy@^2.1.0":
+ "integrity" "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM="
+ "resolved" "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz"
+ "version" "2.1.0"
+
+"import-local@^2.0.0":
+ "integrity" "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ=="
+ "resolved" "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "pkg-dir" "^3.0.0"
+ "resolve-cwd" "^2.0.0"
+
+"imurmurhash@^0.1.4":
+ "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+ "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"
+ "version" "0.1.4"
+
+"indent-string@^4.0.0":
+ "integrity" "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="
+ "resolved" "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz"
+ "version" "4.0.0"
+
+"indexes-of@^1.0.1":
+ "integrity" "sha1-8w9xbI4r00bHtn0985FVZqfAVgc="
+ "resolved" "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz"
+ "version" "1.0.1"
+
+"infer-owner@^1.0.3", "infer-owner@^1.0.4":
+ "integrity" "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A=="
+ "resolved" "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz"
+ "version" "1.0.4"
+
+"inflight@^1.0.4", "inflight@~1.0.6":
+ "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk="
+ "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"
+ "version" "1.0.6"
+ dependencies:
+ "once" "^1.3.0"
+ "wrappy" "1"
+
+"inherits@^2.0.1", "inherits@^2.0.3", "inherits@^2.0.4", "inherits@~2.0.1", "inherits@~2.0.3", "inherits@2", "inherits@2.0.4":
+ "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
+ "version" "2.0.4"
+
+"inherits@2.0.1":
+ "integrity" "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
+ "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
+ "version" "2.0.1"
+
+"inherits@2.0.3":
+ "integrity" "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz"
+ "version" "2.0.3"
+
+"ini@^1.3.4", "ini@^1.3.5", "ini@~1.3.0":
+ "integrity" "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
+ "resolved" "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz"
+ "version" "1.3.5"
+
+"init-package-json@^1.10.3":
+ "integrity" "sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw=="
+ "resolved" "https://registry.npmjs.org/init-package-json/-/init-package-json-1.10.3.tgz"
+ "version" "1.10.3"
+ dependencies:
+ "glob" "^7.1.1"
+ "npm-package-arg" "^4.0.0 || ^5.0.0 || ^6.0.0"
+ "promzard" "^0.3.0"
+ "read" "~1.0.1"
+ "read-package-json" "1 || 2"
+ "semver" "2.x || 3.x || 4 || 5"
+ "validate-npm-package-license" "^3.0.1"
+ "validate-npm-package-name" "^3.0.0"
+
+"inquirer@^7.0.0":
+ "integrity" "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg=="
+ "resolved" "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz"
+ "version" "7.1.0"
+ dependencies:
+ "ansi-escapes" "^4.2.1"
+ "chalk" "^3.0.0"
+ "cli-cursor" "^3.1.0"
+ "cli-width" "^2.0.0"
+ "external-editor" "^3.0.3"
+ "figures" "^3.0.0"
+ "lodash" "^4.17.15"
+ "mute-stream" "0.0.8"
+ "run-async" "^2.4.0"
+ "rxjs" "^6.5.3"
+ "string-width" "^4.1.0"
+ "strip-ansi" "^6.0.0"
+ "through" "^2.3.6"
+
+"inquirer@6.5.0":
+ "integrity" "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA=="
+ "resolved" "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz"
+ "version" "6.5.0"
+ dependencies:
+ "ansi-escapes" "^3.2.0"
+ "chalk" "^2.4.2"
+ "cli-cursor" "^2.1.0"
+ "cli-width" "^2.0.0"
+ "external-editor" "^3.0.3"
+ "figures" "^2.0.0"
+ "lodash" "^4.17.12"
+ "mute-stream" "0.0.7"
+ "run-async" "^2.2.0"
+ "rxjs" "^6.4.0"
+ "string-width" "^2.1.0"
+ "strip-ansi" "^5.1.0"
+ "through" "^2.3.6"
+
+"inquirer@7.0.4":
+ "integrity" "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ=="
+ "resolved" "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz"
+ "version" "7.0.4"
+ dependencies:
+ "ansi-escapes" "^4.2.1"
+ "chalk" "^2.4.2"
+ "cli-cursor" "^3.1.0"
+ "cli-width" "^2.0.0"
+ "external-editor" "^3.0.3"
+ "figures" "^3.0.0"
+ "lodash" "^4.17.15"
+ "mute-stream" "0.0.8"
+ "run-async" "^2.2.0"
+ "rxjs" "^6.5.3"
+ "string-width" "^4.1.0"
+ "strip-ansi" "^5.1.0"
+ "through" "^2.3.6"
+
+"internal-ip@^4.3.0":
+ "integrity" "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg=="
+ "resolved" "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz"
+ "version" "4.3.0"
+ dependencies:
+ "default-gateway" "^4.2.0"
+ "ipaddr.js" "^1.9.0"
+
+"internal-slot@^1.0.3":
+ "integrity" "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA=="
+ "resolved" "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz"
+ "version" "1.0.3"
+ dependencies:
+ "get-intrinsic" "^1.1.0"
+ "has" "^1.0.3"
+ "side-channel" "^1.0.4"
+
+"into-stream@^5.0.0":
+ "integrity" "sha512-krrAJ7McQxGGmvaYbB7Q1mcA+cRwg9Ij2RfWIeVesNBgVDZmzY/Fa4IpZUT3bmdRzMzdf/mzltCG2Dq99IZGBA=="
+ "resolved" "https://registry.npmjs.org/into-stream/-/into-stream-5.1.1.tgz"
+ "version" "5.1.1"
+ dependencies:
+ "from2" "^2.3.0"
+ "p-is-promise" "^3.0.0"
+
+"invariant@^2.0.0", "invariant@^2.1.0", "invariant@^2.2.1", "invariant@^2.2.2", "invariant@^2.2.4":
+ "integrity" "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA=="
+ "resolved" "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz"
+ "version" "2.2.4"
+ dependencies:
+ "loose-envify" "^1.0.0"
+
+"invert-kv@^2.0.0":
+ "integrity" "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA=="
+ "resolved" "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz"
+ "version" "2.0.0"
+
+"ip-regex@^2.1.0":
+ "integrity" "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk="
+ "resolved" "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz"
+ "version" "2.1.0"
+
+"ip@^1.1.0", "ip@^1.1.5":
+ "integrity" "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
+ "resolved" "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz"
+ "version" "1.1.5"
+
+"ip@1.1.5":
+ "integrity" "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
+ "resolved" "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz"
+ "version" "1.1.5"
+
+"ipaddr.js@^1.9.0", "ipaddr.js@1.9.1":
+ "integrity" "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
+ "resolved" "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz"
+ "version" "1.9.1"
+
+"is-absolute-url@^2.0.0":
+ "integrity" "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY="
+ "resolved" "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz"
+ "version" "2.1.0"
+
+"is-absolute-url@^3.0.3":
+ "integrity" "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q=="
+ "resolved" "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz"
+ "version" "3.0.3"
+
+"is-accessor-descriptor@^0.1.6":
+ "integrity" "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY="
+ "resolved" "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz"
+ "version" "0.1.6"
+ dependencies:
+ "kind-of" "^3.0.2"
+
+"is-accessor-descriptor@^1.0.0":
+ "integrity" "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ=="
+ "resolved" "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "kind-of" "^6.0.0"
+
+"is-arguments@^1.0.4":
+ "integrity" "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA=="
+ "resolved" "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz"
+ "version" "1.0.4"
+
+"is-arrayish@^0.2.1":
+ "integrity" "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+ "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz"
+ "version" "0.2.1"
+
+"is-arrayish@^0.3.1":
+ "integrity" "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+ "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz"
+ "version" "0.3.2"
+
+"is-bigint@^1.0.1":
+ "integrity" "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg=="
+ "resolved" "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz"
+ "version" "1.0.4"
+ dependencies:
+ "has-bigints" "^1.0.1"
+
+"is-binary-path@^1.0.0":
+ "integrity" "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg="
+ "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "binary-extensions" "^1.0.0"
+
+"is-binary-path@~2.1.0":
+ "integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="
+ "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "binary-extensions" "^2.0.0"
+
+"is-boolean-object@^1.1.0":
+ "integrity" "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA=="
+ "resolved" "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz"
+ "version" "1.1.2"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "has-tostringtag" "^1.0.0"
+
+"is-buffer@^1.0.2", "is-buffer@^1.1.5":
+ "integrity" "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ "resolved" "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz"
+ "version" "1.1.6"
+
+"is-callable@^1.1.3":
+ "version" "1.1.4"
+
+"is-callable@^1.1.4", "is-callable@^1.2.4":
+ "integrity" "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w=="
+ "resolved" "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz"
+ "version" "1.2.4"
+
+"is-ci@^1.0.10":
+ "integrity" "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg=="
+ "resolved" "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz"
+ "version" "1.2.1"
+ dependencies:
+ "ci-info" "^1.5.0"
+
+"is-ci@^2.0.0":
+ "integrity" "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w=="
+ "resolved" "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "ci-info" "^2.0.0"
+
+"is-cidr@^3.0.0":
+ "version" "3.0.0"
+ dependencies:
+ "cidr-regex" "^2.0.10"
+
+"is-color-stop@^1.0.0":
+ "integrity" "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U="
+ "resolved" "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "css-color-names" "^0.0.4"
+ "hex-color-regex" "^1.1.0"
+ "hsl-regex" "^1.0.0"
+ "hsla-regex" "^1.0.0"
+ "rgb-regex" "^1.0.1"
+ "rgba-regex" "^1.0.0"
+
+"is-core-module@^2.9.0":
+ "integrity" "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg=="
+ "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz"
+ "version" "2.10.0"
+ dependencies:
+ "has" "^1.0.3"
+
+"is-data-descriptor@^0.1.4":
+ "integrity" "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y="
+ "resolved" "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz"
+ "version" "0.1.4"
+ dependencies:
+ "kind-of" "^3.0.2"
+
+"is-data-descriptor@^1.0.0":
+ "integrity" "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ=="
+ "resolved" "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "kind-of" "^6.0.0"
+
+"is-date-object@^1.0.1":
+ "integrity" "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g=="
+ "resolved" "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz"
+ "version" "1.0.2"
+
+"is-descriptor@^0.1.0":
+ "integrity" "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg=="
+ "resolved" "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz"
+ "version" "0.1.6"
+ dependencies:
+ "is-accessor-descriptor" "^0.1.6"
+ "is-data-descriptor" "^0.1.4"
+ "kind-of" "^5.0.0"
+
+"is-descriptor@^1.0.0", "is-descriptor@^1.0.2":
+ "integrity" "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg=="
+ "resolved" "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "is-accessor-descriptor" "^1.0.0"
+ "is-data-descriptor" "^1.0.0"
+ "kind-of" "^6.0.2"
+
+"is-directory@^0.3.1":
+ "integrity" "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE="
+ "resolved" "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz"
+ "version" "0.3.1"
+
+"is-docker@^2.0.0":
+ "integrity" "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ=="
+ "resolved" "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz"
+ "version" "2.0.0"
+
+"is-dom@^1.0.9":
+ "integrity" "sha512-u82f6mvhYxRPKpw8V1N0W8ce1xXwOrQtgGcxl6UCL5zBmZu3is/18K0rR7uFCnMDuAsS/3W54mGL4vsaFUQlEQ=="
+ "resolved" "https://registry.npmjs.org/is-dom/-/is-dom-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "is-object" "^1.0.1"
+ "is-window" "^1.0.2"
+
+"is-extendable@^0.1.0", "is-extendable@^0.1.1":
+ "integrity" "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ "resolved" "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz"
+ "version" "0.1.1"
+
+"is-extendable@^1.0.1":
+ "integrity" "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA=="
+ "resolved" "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "is-plain-object" "^2.0.4"
+
+"is-extglob@^2.1.0", "is-extglob@^2.1.1":
+ "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+ "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
+ "version" "2.1.1"
+
+"is-fullwidth-code-point@^1.0.0":
+ "integrity" "sha1-754xOG8DGn8NZDr4L95QxFfvAMs="
+ "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "number-is-nan" "^1.0.0"
+
+"is-fullwidth-code-point@^2.0.0":
+ "integrity" "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+ "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz"
+ "version" "2.0.0"
+
+"is-fullwidth-code-point@^3.0.0":
+ "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+ "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
+ "version" "3.0.0"
+
+"is-generator-fn@^2.0.0":
+ "integrity" "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ=="
+ "resolved" "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz"
+ "version" "2.1.0"
+
+"is-glob@^3.1.0":
+ "integrity" "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo="
+ "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "is-extglob" "^2.1.0"
+
+"is-glob@^4.0.0", "is-glob@^4.0.1", "is-glob@~4.0.1":
+ "integrity" "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg=="
+ "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz"
+ "version" "4.0.1"
+ dependencies:
+ "is-extglob" "^2.1.1"
+
+"is-installed-globally@^0.1.0":
+ "integrity" "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA="
+ "resolved" "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz"
+ "version" "0.1.0"
+ dependencies:
+ "global-dirs" "^0.1.0"
+ "is-path-inside" "^1.0.0"
+
+"is-negative-zero@^2.0.2":
+ "integrity" "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA=="
+ "resolved" "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz"
+ "version" "2.0.2"
+
+"is-npm@^1.0.0":
+ "integrity" "sha1-8vtjpl5JBbQGyGBydloaTceTufQ="
+ "resolved" "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz"
+ "version" "1.0.0"
+
+"is-number-object@^1.0.4":
+ "integrity" "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ=="
+ "resolved" "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz"
+ "version" "1.0.7"
+ dependencies:
+ "has-tostringtag" "^1.0.0"
+
+"is-number@^3.0.0":
+ "integrity" "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU="
+ "resolved" "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "kind-of" "^3.0.2"
+
+"is-number@^7.0.0":
+ "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+ "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
+ "version" "7.0.0"
+
+"is-obj@^1.0.0", "is-obj@^1.0.1":
+ "integrity" "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
+ "resolved" "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz"
+ "version" "1.0.1"
+
+"is-obj@^2.0.0":
+ "integrity" "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="
+ "resolved" "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz"
+ "version" "2.0.0"
+
+"is-object@^1.0.1":
+ "integrity" "sha1-iVJojF7C/9awPsyF52ngKQMINHA="
+ "resolved" "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz"
+ "version" "1.0.1"
+
+"is-path-cwd@^2.0.0":
+ "integrity" "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ=="
+ "resolved" "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz"
+ "version" "2.2.0"
+
+"is-path-in-cwd@^2.0.0":
+ "integrity" "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ=="
+ "resolved" "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "is-path-inside" "^2.1.0"
+
+"is-path-inside@^1.0.0":
+ "integrity" "sha1-jvW33lBDej/cprToZe96pVy0gDY="
+ "resolved" "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "path-is-inside" "^1.0.1"
+
+"is-path-inside@^2.1.0":
+ "integrity" "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg=="
+ "resolved" "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "path-is-inside" "^1.0.2"
+
+"is-plain-obj@^1.0.0", "is-plain-obj@^1.1.0":
+ "integrity" "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
+ "resolved" "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz"
+ "version" "1.1.0"
+
+"is-plain-object@^2.0.1", "is-plain-object@^2.0.3", "is-plain-object@^2.0.4":
+ "integrity" "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="
+ "resolved" "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz"
+ "version" "2.0.4"
+ dependencies:
+ "isobject" "^3.0.1"
+
+"is-plain-object@^3.0.0":
+ "integrity" "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg=="
+ "resolved" "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "isobject" "^4.0.0"
+
+"is-promise@^2.1":
+ "integrity" "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
+ "resolved" "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz"
+ "version" "2.2.2"
+
+"is-redirect@^1.0.0":
+ "integrity" "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ="
+ "resolved" "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz"
+ "version" "1.0.0"
+
+"is-regex@^1.0.4", "is-regex@^1.1.4":
+ "integrity" "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg=="
+ "resolved" "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz"
+ "version" "1.1.4"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "has-tostringtag" "^1.0.0"
+
+"is-regexp@^1.0.0":
+ "integrity" "sha1-/S2INUXEa6xaYz57mgnof6LLUGk="
+ "resolved" "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz"
+ "version" "1.0.0"
+
+"is-resolvable@^1.0.0":
+ "integrity" "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg=="
+ "resolved" "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz"
+ "version" "1.1.0"
+
+"is-retry-allowed@^1.0.0":
+ "integrity" "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg=="
+ "resolved" "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz"
+ "version" "1.2.0"
+
+"is-root@2.1.0":
+ "integrity" "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg=="
+ "resolved" "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz"
+ "version" "2.1.0"
+
+"is-shared-array-buffer@^1.0.2":
+ "integrity" "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA=="
+ "resolved" "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "call-bind" "^1.0.2"
+
+"is-stream@^1.0.0", "is-stream@^1.0.1", "is-stream@^1.1.0":
+ "integrity" "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+ "resolved" "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz"
+ "version" "1.1.0"
+
+"is-stream@^2.0.0":
+ "integrity" "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw=="
+ "resolved" "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz"
+ "version" "2.0.0"
+
+"is-string@^1.0.5", "is-string@^1.0.7":
+ "integrity" "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg=="
+ "resolved" "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz"
+ "version" "1.0.7"
+ dependencies:
+ "has-tostringtag" "^1.0.0"
+
+"is-svg@^3.0.0":
+ "integrity" "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ=="
+ "resolved" "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "html-comment-regex" "^1.1.0"
+
+"is-symbol@^1.0.2", "is-symbol@^1.0.3":
+ "integrity" "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ=="
+ "resolved" "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz"
+ "version" "1.0.3"
+ dependencies:
+ "has-symbols" "^1.0.1"
+
+"is-text-path@^1.0.1":
+ "integrity" "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4="
+ "resolved" "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "text-extensions" "^1.0.0"
+
+"is-typedarray@~1.0.0":
+ "integrity" "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+ "resolved" "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz"
+ "version" "1.0.0"
+
+"is-utf8@^0.2.1":
+ "integrity" "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
+ "resolved" "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz"
+ "version" "0.2.1"
+
+"is-weakref@^1.0.2":
+ "integrity" "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ=="
+ "resolved" "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "call-bind" "^1.0.2"
+
+"is-window@^1.0.2":
+ "integrity" "sha1-LIlspT25feRdPDMTOmXYyfVjSA0="
+ "resolved" "https://registry.npmjs.org/is-window/-/is-window-1.0.2.tgz"
+ "version" "1.0.2"
+
+"is-windows@^1.0.1", "is-windows@^1.0.2":
+ "integrity" "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+ "resolved" "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz"
+ "version" "1.0.2"
+
+"is-wsl@^1.1.0":
+ "integrity" "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
+ "resolved" "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz"
+ "version" "1.1.0"
+
+"is-wsl@^2.1.1":
+ "integrity" "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="
+ "resolved" "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz"
+ "version" "2.2.0"
+ dependencies:
+ "is-docker" "^2.0.0"
+
+"isarray@^1.0.0", "isarray@~1.0.0", "isarray@1.0.0":
+ "integrity" "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
+ "version" "1.0.0"
+
+"isarray@0.0.1":
+ "integrity" "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ "resolved" "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz"
+ "version" "0.0.1"
+
+"isexe@^2.0.0":
+ "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+ "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
+ "version" "2.0.0"
+
+"isobject@^2.0.0":
+ "integrity" "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk="
+ "resolved" "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "isarray" "1.0.0"
+
+"isobject@^3.0.0", "isobject@^3.0.1":
+ "integrity" "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ "resolved" "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz"
+ "version" "3.0.1"
+
+"isobject@^4.0.0":
+ "integrity" "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA=="
+ "resolved" "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz"
+ "version" "4.0.0"
+
+"isomorphic-fetch@^2.1.1":
+ "integrity" "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk="
+ "resolved" "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz"
+ "version" "2.2.1"
+ dependencies:
+ "node-fetch" "^1.0.1"
+ "whatwg-fetch" ">=0.10.0"
+
+"isstream@~0.1.2":
+ "integrity" "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+ "resolved" "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz"
+ "version" "0.1.2"
+
+"issue-parser@^5.0.0":
+ "integrity" "sha512-q/16W7EPHRL0FKVz9NU++TUsoygXGj6JOi88oulyAcQG+IEZ0T6teVdE+VLbe19OfL/tbV8Wi3Dfo0HedeHW0Q=="
+ "resolved" "https://registry.npmjs.org/issue-parser/-/issue-parser-5.0.0.tgz"
+ "version" "5.0.0"
+ dependencies:
+ "lodash.capitalize" "^4.2.1"
+ "lodash.escaperegexp" "^4.1.2"
+ "lodash.isplainobject" "^4.0.6"
+ "lodash.isstring" "^4.0.1"
+ "lodash.uniqby" "^4.7.0"
+
+"istanbul-lib-coverage@^2.0.2", "istanbul-lib-coverage@^2.0.5":
+ "integrity" "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA=="
+ "resolved" "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz"
+ "version" "2.0.5"
+
+"istanbul-lib-instrument@^3.0.1", "istanbul-lib-instrument@^3.3.0":
+ "integrity" "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA=="
+ "resolved" "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz"
+ "version" "3.3.0"
dependencies:
"@babel/generator" "^7.4.0"
"@babel/parser" "^7.4.3"
"@babel/template" "^7.4.0"
"@babel/traverse" "^7.4.3"
"@babel/types" "^7.4.0"
- istanbul-lib-coverage "^2.0.5"
- semver "^6.0.0"
-
-istanbul-lib-report@^2.0.4:
- version "2.0.8"
- resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33"
- integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==
- dependencies:
- istanbul-lib-coverage "^2.0.5"
- make-dir "^2.1.0"
- supports-color "^6.1.0"
-
-istanbul-lib-source-maps@^3.0.1:
- version "3.0.6"
- resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8"
- integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==
- dependencies:
- debug "^4.1.1"
- istanbul-lib-coverage "^2.0.5"
- make-dir "^2.1.0"
- rimraf "^2.6.3"
- source-map "^0.6.1"
-
-istanbul-reports@^2.2.6:
- version "2.2.7"
- resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.7.tgz#5d939f6237d7b48393cc0959eab40cd4fd056931"
- integrity sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==
- dependencies:
- html-escaper "^2.0.0"
-
-java-properties@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-1.0.2.tgz#ccd1fa73907438a5b5c38982269d0e771fe78211"
- integrity sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==
-
-jest-changed-files@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039"
- integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==
+ "istanbul-lib-coverage" "^2.0.5"
+ "semver" "^6.0.0"
+
+"istanbul-lib-report@^2.0.4":
+ "integrity" "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ=="
+ "resolved" "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz"
+ "version" "2.0.8"
+ dependencies:
+ "istanbul-lib-coverage" "^2.0.5"
+ "make-dir" "^2.1.0"
+ "supports-color" "^6.1.0"
+
+"istanbul-lib-source-maps@^3.0.1":
+ "integrity" "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw=="
+ "resolved" "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz"
+ "version" "3.0.6"
+ dependencies:
+ "debug" "^4.1.1"
+ "istanbul-lib-coverage" "^2.0.5"
+ "make-dir" "^2.1.0"
+ "rimraf" "^2.6.3"
+ "source-map" "^0.6.1"
+
+"istanbul-reports@^2.2.6":
+ "integrity" "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg=="
+ "resolved" "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz"
+ "version" "2.2.7"
+ dependencies:
+ "html-escaper" "^2.0.0"
+
+"java-properties@^1.0.0":
+ "integrity" "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ=="
+ "resolved" "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz"
+ "version" "1.0.2"
+
+"jest-changed-files@^24.9.0":
+ "integrity" "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg=="
+ "resolved" "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/types" "^24.9.0"
- execa "^1.0.0"
- throat "^4.0.0"
+ "execa" "^1.0.0"
+ "throat" "^4.0.0"
-jest-cli@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af"
- integrity sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==
+"jest-cli@^24.9.0":
+ "integrity" "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg=="
+ "resolved" "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/core" "^24.9.0"
"@jest/test-result" "^24.9.0"
"@jest/types" "^24.9.0"
- chalk "^2.0.1"
- exit "^0.1.2"
- import-local "^2.0.0"
- is-ci "^2.0.0"
- jest-config "^24.9.0"
- jest-util "^24.9.0"
- jest-validate "^24.9.0"
- prompts "^2.0.1"
- realpath-native "^1.1.0"
- yargs "^13.3.0"
-
-jest-config@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5"
- integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==
+ "chalk" "^2.0.1"
+ "exit" "^0.1.2"
+ "import-local" "^2.0.0"
+ "is-ci" "^2.0.0"
+ "jest-config" "^24.9.0"
+ "jest-util" "^24.9.0"
+ "jest-validate" "^24.9.0"
+ "prompts" "^2.0.1"
+ "realpath-native" "^1.1.0"
+ "yargs" "^13.3.0"
+
+"jest-config@^24.9.0":
+ "integrity" "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ=="
+ "resolved" "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@babel/core" "^7.1.0"
"@jest/test-sequencer" "^24.9.0"
"@jest/types" "^24.9.0"
- babel-jest "^24.9.0"
- chalk "^2.0.1"
- glob "^7.1.1"
- jest-environment-jsdom "^24.9.0"
- jest-environment-node "^24.9.0"
- jest-get-type "^24.9.0"
- jest-jasmine2 "^24.9.0"
- jest-regex-util "^24.3.0"
- jest-resolve "^24.9.0"
- jest-util "^24.9.0"
- jest-validate "^24.9.0"
- micromatch "^3.1.10"
- pretty-format "^24.9.0"
- realpath-native "^1.1.0"
-
-jest-diff@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da"
- integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==
- dependencies:
- chalk "^2.0.1"
- diff-sequences "^24.9.0"
- jest-get-type "^24.9.0"
- pretty-format "^24.9.0"
-
-jest-docblock@^24.3.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2"
- integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==
- dependencies:
- detect-newline "^2.1.0"
-
-jest-each@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05"
- integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==
+ "babel-jest" "^24.9.0"
+ "chalk" "^2.0.1"
+ "glob" "^7.1.1"
+ "jest-environment-jsdom" "^24.9.0"
+ "jest-environment-node" "^24.9.0"
+ "jest-get-type" "^24.9.0"
+ "jest-jasmine2" "^24.9.0"
+ "jest-regex-util" "^24.3.0"
+ "jest-resolve" "^24.9.0"
+ "jest-util" "^24.9.0"
+ "jest-validate" "^24.9.0"
+ "micromatch" "^3.1.10"
+ "pretty-format" "^24.9.0"
+ "realpath-native" "^1.1.0"
+
+"jest-diff@^24.9.0":
+ "integrity" "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ=="
+ "resolved" "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz"
+ "version" "24.9.0"
+ dependencies:
+ "chalk" "^2.0.1"
+ "diff-sequences" "^24.9.0"
+ "jest-get-type" "^24.9.0"
+ "pretty-format" "^24.9.0"
+
+"jest-docblock@^24.3.0":
+ "integrity" "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA=="
+ "resolved" "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz"
+ "version" "24.9.0"
+ dependencies:
+ "detect-newline" "^2.1.0"
+
+"jest-each@^24.9.0":
+ "integrity" "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog=="
+ "resolved" "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/types" "^24.9.0"
- chalk "^2.0.1"
- jest-get-type "^24.9.0"
- jest-util "^24.9.0"
- pretty-format "^24.9.0"
+ "chalk" "^2.0.1"
+ "jest-get-type" "^24.9.0"
+ "jest-util" "^24.9.0"
+ "pretty-format" "^24.9.0"
-jest-environment-jsdom-fourteen@1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-1.0.1.tgz#4cd0042f58b4ab666950d96532ecb2fc188f96fb"
- integrity sha512-DojMX1sY+at5Ep+O9yME34CdidZnO3/zfPh8UW+918C5fIZET5vCjfkegixmsi7AtdYfkr4bPlIzmWnlvQkP7Q==
+"jest-environment-jsdom-fourteen@1.0.1":
+ "integrity" "sha512-DojMX1sY+at5Ep+O9yME34CdidZnO3/zfPh8UW+918C5fIZET5vCjfkegixmsi7AtdYfkr4bPlIzmWnlvQkP7Q=="
+ "resolved" "https://registry.npmjs.org/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-1.0.1.tgz"
+ "version" "1.0.1"
dependencies:
"@jest/environment" "^24.3.0"
"@jest/fake-timers" "^24.3.0"
"@jest/types" "^24.3.0"
- jest-mock "^24.0.0"
- jest-util "^24.0.0"
- jsdom "^14.1.0"
+ "jest-mock" "^24.0.0"
+ "jest-util" "^24.0.0"
+ "jsdom" "^14.1.0"
-jest-environment-jsdom@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b"
- integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==
+"jest-environment-jsdom@^24.9.0":
+ "integrity" "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA=="
+ "resolved" "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/environment" "^24.9.0"
"@jest/fake-timers" "^24.9.0"
"@jest/types" "^24.9.0"
- jest-mock "^24.9.0"
- jest-util "^24.9.0"
- jsdom "^11.5.1"
+ "jest-mock" "^24.9.0"
+ "jest-util" "^24.9.0"
+ "jsdom" "^11.5.1"
-jest-environment-node@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3"
- integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==
+"jest-environment-node@^24.9.0":
+ "integrity" "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA=="
+ "resolved" "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/environment" "^24.9.0"
"@jest/fake-timers" "^24.9.0"
"@jest/types" "^24.9.0"
- jest-mock "^24.9.0"
- jest-util "^24.9.0"
+ "jest-mock" "^24.9.0"
+ "jest-util" "^24.9.0"
-jest-get-type@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e"
- integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==
+"jest-get-type@^24.9.0":
+ "integrity" "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q=="
+ "resolved" "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz"
+ "version" "24.9.0"
-jest-haste-map@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d"
- integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==
+"jest-haste-map@^24.9.0":
+ "integrity" "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ=="
+ "resolved" "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/types" "^24.9.0"
- anymatch "^2.0.0"
- fb-watchman "^2.0.0"
- graceful-fs "^4.1.15"
- invariant "^2.2.4"
- jest-serializer "^24.9.0"
- jest-util "^24.9.0"
- jest-worker "^24.9.0"
- micromatch "^3.1.10"
- sane "^4.0.3"
- walker "^1.0.7"
+ "anymatch" "^2.0.0"
+ "fb-watchman" "^2.0.0"
+ "graceful-fs" "^4.1.15"
+ "invariant" "^2.2.4"
+ "jest-serializer" "^24.9.0"
+ "jest-util" "^24.9.0"
+ "jest-worker" "^24.9.0"
+ "micromatch" "^3.1.10"
+ "sane" "^4.0.3"
+ "walker" "^1.0.7"
optionalDependencies:
- fsevents "^1.2.7"
+ "fsevents" "^1.2.7"
-jest-jasmine2@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0"
- integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==
+"jest-jasmine2@^24.9.0":
+ "integrity" "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw=="
+ "resolved" "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@babel/traverse" "^7.1.0"
"@jest/environment" "^24.9.0"
"@jest/test-result" "^24.9.0"
"@jest/types" "^24.9.0"
- chalk "^2.0.1"
- co "^4.6.0"
- expect "^24.9.0"
- is-generator-fn "^2.0.0"
- jest-each "^24.9.0"
- jest-matcher-utils "^24.9.0"
- jest-message-util "^24.9.0"
- jest-runtime "^24.9.0"
- jest-snapshot "^24.9.0"
- jest-util "^24.9.0"
- pretty-format "^24.9.0"
- throat "^4.0.0"
-
-jest-leak-detector@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a"
- integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==
- dependencies:
- jest-get-type "^24.9.0"
- pretty-format "^24.9.0"
-
-jest-matcher-utils@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073"
- integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==
- dependencies:
- chalk "^2.0.1"
- jest-diff "^24.9.0"
- jest-get-type "^24.9.0"
- pretty-format "^24.9.0"
-
-jest-message-util@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3"
- integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==
+ "chalk" "^2.0.1"
+ "co" "^4.6.0"
+ "expect" "^24.9.0"
+ "is-generator-fn" "^2.0.0"
+ "jest-each" "^24.9.0"
+ "jest-matcher-utils" "^24.9.0"
+ "jest-message-util" "^24.9.0"
+ "jest-runtime" "^24.9.0"
+ "jest-snapshot" "^24.9.0"
+ "jest-util" "^24.9.0"
+ "pretty-format" "^24.9.0"
+ "throat" "^4.0.0"
+
+"jest-leak-detector@^24.9.0":
+ "integrity" "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA=="
+ "resolved" "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz"
+ "version" "24.9.0"
+ dependencies:
+ "jest-get-type" "^24.9.0"
+ "pretty-format" "^24.9.0"
+
+"jest-matcher-utils@^24.9.0":
+ "integrity" "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA=="
+ "resolved" "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz"
+ "version" "24.9.0"
+ dependencies:
+ "chalk" "^2.0.1"
+ "jest-diff" "^24.9.0"
+ "jest-get-type" "^24.9.0"
+ "pretty-format" "^24.9.0"
+
+"jest-message-util@^24.9.0":
+ "integrity" "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw=="
+ "resolved" "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@babel/code-frame" "^7.0.0"
"@jest/test-result" "^24.9.0"
"@jest/types" "^24.9.0"
"@types/stack-utils" "^1.0.1"
- chalk "^2.0.1"
- micromatch "^3.1.10"
- slash "^2.0.0"
- stack-utils "^1.0.1"
+ "chalk" "^2.0.1"
+ "micromatch" "^3.1.10"
+ "slash" "^2.0.0"
+ "stack-utils" "^1.0.1"
-jest-mock@^24.0.0, jest-mock@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6"
- integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==
+"jest-mock@^24.0.0", "jest-mock@^24.9.0":
+ "integrity" "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w=="
+ "resolved" "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/types" "^24.9.0"
-jest-pnp-resolver@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a"
- integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==
+"jest-pnp-resolver@^1.2.1":
+ "integrity" "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ=="
+ "resolved" "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz"
+ "version" "1.2.1"
-jest-regex-util@^24.3.0, jest-regex-util@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636"
- integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==
+"jest-regex-util@^24.3.0", "jest-regex-util@^24.9.0":
+ "integrity" "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA=="
+ "resolved" "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz"
+ "version" "24.9.0"
-jest-resolve-dependencies@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab"
- integrity sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==
+"jest-resolve-dependencies@^24.9.0":
+ "integrity" "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g=="
+ "resolved" "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/types" "^24.9.0"
- jest-regex-util "^24.3.0"
- jest-snapshot "^24.9.0"
+ "jest-regex-util" "^24.3.0"
+ "jest-snapshot" "^24.9.0"
-jest-resolve@24.9.0, jest-resolve@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321"
- integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==
+"jest-resolve@*", "jest-resolve@^24.9.0", "jest-resolve@24.9.0":
+ "integrity" "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ=="
+ "resolved" "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/types" "^24.9.0"
- browser-resolve "^1.11.3"
- chalk "^2.0.1"
- jest-pnp-resolver "^1.2.1"
- realpath-native "^1.1.0"
+ "browser-resolve" "^1.11.3"
+ "chalk" "^2.0.1"
+ "jest-pnp-resolver" "^1.2.1"
+ "realpath-native" "^1.1.0"
-jest-runner@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42"
- integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==
+"jest-runner@^24.9.0":
+ "integrity" "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg=="
+ "resolved" "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/console" "^24.7.1"
"@jest/environment" "^24.9.0"
"@jest/test-result" "^24.9.0"
"@jest/types" "^24.9.0"
- chalk "^2.4.2"
- exit "^0.1.2"
- graceful-fs "^4.1.15"
- jest-config "^24.9.0"
- jest-docblock "^24.3.0"
- jest-haste-map "^24.9.0"
- jest-jasmine2 "^24.9.0"
- jest-leak-detector "^24.9.0"
- jest-message-util "^24.9.0"
- jest-resolve "^24.9.0"
- jest-runtime "^24.9.0"
- jest-util "^24.9.0"
- jest-worker "^24.6.0"
- source-map-support "^0.5.6"
- throat "^4.0.0"
-
-jest-runtime@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac"
- integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==
+ "chalk" "^2.4.2"
+ "exit" "^0.1.2"
+ "graceful-fs" "^4.1.15"
+ "jest-config" "^24.9.0"
+ "jest-docblock" "^24.3.0"
+ "jest-haste-map" "^24.9.0"
+ "jest-jasmine2" "^24.9.0"
+ "jest-leak-detector" "^24.9.0"
+ "jest-message-util" "^24.9.0"
+ "jest-resolve" "^24.9.0"
+ "jest-runtime" "^24.9.0"
+ "jest-util" "^24.9.0"
+ "jest-worker" "^24.6.0"
+ "source-map-support" "^0.5.6"
+ "throat" "^4.0.0"
+
+"jest-runtime@^24.9.0":
+ "integrity" "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw=="
+ "resolved" "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/console" "^24.7.1"
"@jest/environment" "^24.9.0"
@@ -8298,7636 +8699,7930 @@ jest-runtime@^24.9.0:
"@jest/transform" "^24.9.0"
"@jest/types" "^24.9.0"
"@types/yargs" "^13.0.0"
- chalk "^2.0.1"
- exit "^0.1.2"
- glob "^7.1.3"
- graceful-fs "^4.1.15"
- jest-config "^24.9.0"
- jest-haste-map "^24.9.0"
- jest-message-util "^24.9.0"
- jest-mock "^24.9.0"
- jest-regex-util "^24.3.0"
- jest-resolve "^24.9.0"
- jest-snapshot "^24.9.0"
- jest-util "^24.9.0"
- jest-validate "^24.9.0"
- realpath-native "^1.1.0"
- slash "^2.0.0"
- strip-bom "^3.0.0"
- yargs "^13.3.0"
-
-jest-serializer@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73"
- integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==
-
-jest-snapshot@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba"
- integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==
+ "chalk" "^2.0.1"
+ "exit" "^0.1.2"
+ "glob" "^7.1.3"
+ "graceful-fs" "^4.1.15"
+ "jest-config" "^24.9.0"
+ "jest-haste-map" "^24.9.0"
+ "jest-message-util" "^24.9.0"
+ "jest-mock" "^24.9.0"
+ "jest-regex-util" "^24.3.0"
+ "jest-resolve" "^24.9.0"
+ "jest-snapshot" "^24.9.0"
+ "jest-util" "^24.9.0"
+ "jest-validate" "^24.9.0"
+ "realpath-native" "^1.1.0"
+ "slash" "^2.0.0"
+ "strip-bom" "^3.0.0"
+ "yargs" "^13.3.0"
+
+"jest-serializer@^24.9.0":
+ "integrity" "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ=="
+ "resolved" "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz"
+ "version" "24.9.0"
+
+"jest-snapshot@^24.9.0":
+ "integrity" "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew=="
+ "resolved" "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@babel/types" "^7.0.0"
"@jest/types" "^24.9.0"
- chalk "^2.0.1"
- expect "^24.9.0"
- jest-diff "^24.9.0"
- jest-get-type "^24.9.0"
- jest-matcher-utils "^24.9.0"
- jest-message-util "^24.9.0"
- jest-resolve "^24.9.0"
- mkdirp "^0.5.1"
- natural-compare "^1.4.0"
- pretty-format "^24.9.0"
- semver "^6.2.0"
-
-jest-util@^24.0.0, jest-util@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162"
- integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==
+ "chalk" "^2.0.1"
+ "expect" "^24.9.0"
+ "jest-diff" "^24.9.0"
+ "jest-get-type" "^24.9.0"
+ "jest-matcher-utils" "^24.9.0"
+ "jest-message-util" "^24.9.0"
+ "jest-resolve" "^24.9.0"
+ "mkdirp" "^0.5.1"
+ "natural-compare" "^1.4.0"
+ "pretty-format" "^24.9.0"
+ "semver" "^6.2.0"
+
+"jest-util@^24.0.0", "jest-util@^24.9.0":
+ "integrity" "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg=="
+ "resolved" "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/console" "^24.9.0"
"@jest/fake-timers" "^24.9.0"
"@jest/source-map" "^24.9.0"
"@jest/test-result" "^24.9.0"
"@jest/types" "^24.9.0"
- callsites "^3.0.0"
- chalk "^2.0.1"
- graceful-fs "^4.1.15"
- is-ci "^2.0.0"
- mkdirp "^0.5.1"
- slash "^2.0.0"
- source-map "^0.6.0"
-
-jest-validate@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab"
- integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==
+ "callsites" "^3.0.0"
+ "chalk" "^2.0.1"
+ "graceful-fs" "^4.1.15"
+ "is-ci" "^2.0.0"
+ "mkdirp" "^0.5.1"
+ "slash" "^2.0.0"
+ "source-map" "^0.6.0"
+
+"jest-validate@^24.9.0":
+ "integrity" "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ=="
+ "resolved" "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/types" "^24.9.0"
- camelcase "^5.3.1"
- chalk "^2.0.1"
- jest-get-type "^24.9.0"
- leven "^3.1.0"
- pretty-format "^24.9.0"
-
-jest-watch-typeahead@0.4.2:
- version "0.4.2"
- resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz#e5be959698a7fa2302229a5082c488c3c8780a4a"
- integrity sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q==
- dependencies:
- ansi-escapes "^4.2.1"
- chalk "^2.4.1"
- jest-regex-util "^24.9.0"
- jest-watcher "^24.3.0"
- slash "^3.0.0"
- string-length "^3.1.0"
- strip-ansi "^5.0.0"
-
-jest-watcher@^24.3.0, jest-watcher@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b"
- integrity sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==
+ "camelcase" "^5.3.1"
+ "chalk" "^2.0.1"
+ "jest-get-type" "^24.9.0"
+ "leven" "^3.1.0"
+ "pretty-format" "^24.9.0"
+
+"jest-watch-typeahead@0.4.2":
+ "integrity" "sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q=="
+ "resolved" "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz"
+ "version" "0.4.2"
+ dependencies:
+ "ansi-escapes" "^4.2.1"
+ "chalk" "^2.4.1"
+ "jest-regex-util" "^24.9.0"
+ "jest-watcher" "^24.3.0"
+ "slash" "^3.0.0"
+ "string-length" "^3.1.0"
+ "strip-ansi" "^5.0.0"
+
+"jest-watcher@^24.3.0", "jest-watcher@^24.9.0":
+ "integrity" "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw=="
+ "resolved" "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/test-result" "^24.9.0"
"@jest/types" "^24.9.0"
"@types/yargs" "^13.0.0"
- ansi-escapes "^3.0.0"
- chalk "^2.0.1"
- jest-util "^24.9.0"
- string-length "^2.0.0"
-
-jest-worker@^24.6.0, jest-worker@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5"
- integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==
- dependencies:
- merge-stream "^2.0.0"
- supports-color "^6.1.0"
-
-jest-worker@^25.1.0:
- version "25.5.0"
- resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1"
- integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==
- dependencies:
- merge-stream "^2.0.0"
- supports-color "^7.0.0"
-
-jest@24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171"
- integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==
- dependencies:
- import-local "^2.0.0"
- jest-cli "^24.9.0"
-
-jquery-match-height@^0.7.2:
- version "0.7.2"
- resolved "https://registry.yarnpkg.com/jquery-match-height/-/jquery-match-height-0.7.2.tgz#f8d9f3ba5314daab109cf07408674be204be5f0e"
- integrity sha1-+NnzulMU2qsQnPB0CGdL4gS+Xw4=
-
-jquery@>=1.7, jquery@>=1.7.0, "jquery@>=1.7.1 <4.0.0", jquery@>=1.8, "jquery@^1.8.3 || ^2.0 || ^3.0", jquery@^3.4.1:
- version "3.5.1"
- resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5"
- integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==
-
-jquery@~3.4.1:
- version "3.4.1"
- resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2"
- integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==
-
-js-file-download@^0.4.1:
- version "0.4.12"
- resolved "https://registry.yarnpkg.com/js-file-download/-/js-file-download-0.4.12.tgz#10c70ef362559a5b23cdbdc3bd6f399c3d91d821"
- integrity sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg==
-
-"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
- integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
-
-js-tokens@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
- integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
-
-js-yaml@^3.13.0, js-yaml@^3.13.1:
- version "3.13.1"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
- integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
- dependencies:
- argparse "^1.0.7"
- esprima "^4.0.0"
-
-jsbn@~0.1.0:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
- integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
-
-jsdom@^11.5.1:
- version "11.12.0"
- resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8"
- integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==
- dependencies:
- abab "^2.0.0"
- acorn "^5.5.3"
- acorn-globals "^4.1.0"
- array-equal "^1.0.0"
- cssom ">= 0.3.2 < 0.4.0"
- cssstyle "^1.0.0"
- data-urls "^1.0.0"
- domexception "^1.0.1"
- escodegen "^1.9.1"
- html-encoding-sniffer "^1.0.2"
- left-pad "^1.3.0"
- nwsapi "^2.0.7"
- parse5 "4.0.0"
- pn "^1.1.0"
- request "^2.87.0"
- request-promise-native "^1.0.5"
- sax "^1.2.4"
- symbol-tree "^3.2.2"
- tough-cookie "^2.3.4"
- w3c-hr-time "^1.0.1"
- webidl-conversions "^4.0.2"
- whatwg-encoding "^1.0.3"
- whatwg-mimetype "^2.1.0"
- whatwg-url "^6.4.1"
- ws "^5.2.0"
- xml-name-validator "^3.0.0"
-
-jsdom@^14.1.0:
- version "14.1.0"
- resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-14.1.0.tgz#916463b6094956b0a6c1782c94e380cd30e1981b"
- integrity sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==
- dependencies:
- abab "^2.0.0"
- acorn "^6.0.4"
- acorn-globals "^4.3.0"
- array-equal "^1.0.0"
- cssom "^0.3.4"
- cssstyle "^1.1.1"
- data-urls "^1.1.0"
- domexception "^1.0.1"
- escodegen "^1.11.0"
- html-encoding-sniffer "^1.0.2"
- nwsapi "^2.1.3"
- parse5 "5.1.0"
- pn "^1.1.0"
- request "^2.88.0"
- request-promise-native "^1.0.5"
- saxes "^3.1.9"
- symbol-tree "^3.2.2"
- tough-cookie "^2.5.0"
- w3c-hr-time "^1.0.1"
- w3c-xmlserializer "^1.1.2"
- webidl-conversions "^4.0.2"
- whatwg-encoding "^1.0.5"
- whatwg-mimetype "^2.3.0"
- whatwg-url "^7.0.0"
- ws "^6.1.2"
- xml-name-validator "^3.0.0"
-
-jsesc@^2.5.1:
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
- integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
-
-jsesc@~0.5.0:
- version "0.5.0"
- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
- integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
-
-json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
- integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
-
-json-schema-traverse@^0.4.1:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
- integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
-
-json-schema@0.2.3:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
- integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
-
-json-stable-stringify-without-jsonify@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
- integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
-
-json-stable-stringify@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
- integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=
- dependencies:
- jsonify "~0.0.0"
-
-json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
- integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
-
-json3@^3.3.2:
- version "3.3.3"
- resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81"
- integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==
-
-json5@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
- integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
- dependencies:
- minimist "^1.2.0"
-
-json5@^2.1.2:
- version "2.1.3"
- resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43"
- integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==
- dependencies:
- minimist "^1.2.5"
-
-jsonfile@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
- integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
+ "ansi-escapes" "^3.0.0"
+ "chalk" "^2.0.1"
+ "jest-util" "^24.9.0"
+ "string-length" "^2.0.0"
+
+"jest-worker@^24.6.0", "jest-worker@^24.9.0":
+ "integrity" "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw=="
+ "resolved" "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz"
+ "version" "24.9.0"
+ dependencies:
+ "merge-stream" "^2.0.0"
+ "supports-color" "^6.1.0"
+
+"jest-worker@^25.1.0":
+ "integrity" "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw=="
+ "resolved" "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz"
+ "version" "25.5.0"
+ dependencies:
+ "merge-stream" "^2.0.0"
+ "supports-color" "^7.0.0"
+
+"jest@24.9.0":
+ "integrity" "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw=="
+ "resolved" "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz"
+ "version" "24.9.0"
+ dependencies:
+ "import-local" "^2.0.0"
+ "jest-cli" "^24.9.0"
+
+"jquery-match-height@^0.7.2":
+ "integrity" "sha1-+NnzulMU2qsQnPB0CGdL4gS+Xw4="
+ "resolved" "https://registry.npmjs.org/jquery-match-height/-/jquery-match-height-0.7.2.tgz"
+ "version" "0.7.2"
+
+"jquery@^1.8.3 || ^2.0 || ^3.0", "jquery@>=1.9.0", "jquery@~3.4.1":
+ "integrity" "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw=="
+ "resolved" "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz"
+ "version" "3.4.1"
+
+"jquery@^3.4.1", "jquery@>=1.7", "jquery@>=1.7.0", "jquery@>=1.7.1 <4.0.0", "jquery@>=1.8":
+ "integrity" "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg=="
+ "resolved" "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz"
+ "version" "3.5.1"
+
+"js-file-download@^0.4.1":
+ "integrity" "sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg=="
+ "resolved" "https://registry.npmjs.org/js-file-download/-/js-file-download-0.4.12.tgz"
+ "version" "0.4.12"
+
+"js-tokens@^3.0.0 || ^4.0.0", "js-tokens@^4.0.0":
+ "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
+ "version" "4.0.0"
+
+"js-tokens@^3.0.2":
+ "integrity" "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
+ "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz"
+ "version" "3.0.2"
+
+"js-yaml@^3.13.0", "js-yaml@^3.13.1":
+ "integrity" "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw=="
+ "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz"
+ "version" "3.13.1"
+ dependencies:
+ "argparse" "^1.0.7"
+ "esprima" "^4.0.0"
+
+"jsbn@~0.1.0":
+ "integrity" "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
+ "resolved" "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz"
+ "version" "0.1.1"
+
+"jsdom@^11.5.1":
+ "integrity" "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw=="
+ "resolved" "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz"
+ "version" "11.12.0"
+ dependencies:
+ "abab" "^2.0.0"
+ "acorn" "^5.5.3"
+ "acorn-globals" "^4.1.0"
+ "array-equal" "^1.0.0"
+ "cssom" ">= 0.3.2 < 0.4.0"
+ "cssstyle" "^1.0.0"
+ "data-urls" "^1.0.0"
+ "domexception" "^1.0.1"
+ "escodegen" "^1.9.1"
+ "html-encoding-sniffer" "^1.0.2"
+ "left-pad" "^1.3.0"
+ "nwsapi" "^2.0.7"
+ "parse5" "4.0.0"
+ "pn" "^1.1.0"
+ "request" "^2.87.0"
+ "request-promise-native" "^1.0.5"
+ "sax" "^1.2.4"
+ "symbol-tree" "^3.2.2"
+ "tough-cookie" "^2.3.4"
+ "w3c-hr-time" "^1.0.1"
+ "webidl-conversions" "^4.0.2"
+ "whatwg-encoding" "^1.0.3"
+ "whatwg-mimetype" "^2.1.0"
+ "whatwg-url" "^6.4.1"
+ "ws" "^5.2.0"
+ "xml-name-validator" "^3.0.0"
+
+"jsdom@^14.1.0":
+ "integrity" "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng=="
+ "resolved" "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz"
+ "version" "14.1.0"
+ dependencies:
+ "abab" "^2.0.0"
+ "acorn" "^6.0.4"
+ "acorn-globals" "^4.3.0"
+ "array-equal" "^1.0.0"
+ "cssom" "^0.3.4"
+ "cssstyle" "^1.1.1"
+ "data-urls" "^1.1.0"
+ "domexception" "^1.0.1"
+ "escodegen" "^1.11.0"
+ "html-encoding-sniffer" "^1.0.2"
+ "nwsapi" "^2.1.3"
+ "parse5" "5.1.0"
+ "pn" "^1.1.0"
+ "request" "^2.88.0"
+ "request-promise-native" "^1.0.5"
+ "saxes" "^3.1.9"
+ "symbol-tree" "^3.2.2"
+ "tough-cookie" "^2.5.0"
+ "w3c-hr-time" "^1.0.1"
+ "w3c-xmlserializer" "^1.1.2"
+ "webidl-conversions" "^4.0.2"
+ "whatwg-encoding" "^1.0.5"
+ "whatwg-mimetype" "^2.3.0"
+ "whatwg-url" "^7.0.0"
+ "ws" "^6.1.2"
+ "xml-name-validator" "^3.0.0"
+
+"jsesc@^2.5.1":
+ "integrity" "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
+ "resolved" "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz"
+ "version" "2.5.2"
+
+"jsesc@~0.5.0":
+ "integrity" "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0="
+ "resolved" "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz"
+ "version" "0.5.0"
+
+"json-parse-better-errors@^1.0.0", "json-parse-better-errors@^1.0.1", "json-parse-better-errors@^1.0.2":
+ "integrity" "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
+ "resolved" "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz"
+ "version" "1.0.2"
+
+"json-schema-traverse@^0.3.0":
+ "version" "0.3.1"
+
+"json-schema-traverse@^0.4.1":
+ "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"
+ "version" "0.4.1"
+
+"json-schema@0.2.3":
+ "integrity" "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+ "resolved" "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz"
+ "version" "0.2.3"
+
+"json-stable-stringify-without-jsonify@^1.0.1":
+ "integrity" "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
+ "resolved" "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz"
+ "version" "1.0.1"
+
+"json-stable-stringify@^1.0.1":
+ "integrity" "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8="
+ "resolved" "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "jsonify" "~0.0.0"
+
+"json-stringify-safe@^5.0.1", "json-stringify-safe@~5.0.1":
+ "integrity" "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+ "resolved" "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"
+ "version" "5.0.1"
+
+"json3@^3.3.2":
+ "integrity" "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA=="
+ "resolved" "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz"
+ "version" "3.3.3"
+
+"json5@^1.0.1":
+ "integrity" "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow=="
+ "resolved" "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "minimist" "^1.2.0"
+
+"json5@^2.1.2":
+ "integrity" "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA=="
+ "resolved" "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz"
+ "version" "2.1.3"
+ dependencies:
+ "minimist" "^1.2.5"
+
+"json5@^2.2.1":
+ "integrity" "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA=="
+ "resolved" "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz"
+ "version" "2.2.1"
+
+"jsonfile@^4.0.0":
+ "integrity" "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss="
+ "resolved" "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz"
+ "version" "4.0.0"
optionalDependencies:
- graceful-fs "^4.1.6"
-
-jsonify@~0.0.0:
- version "0.0.0"
- resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
- integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
-
-jsonparse@^1.2.0:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
- integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=
-
-jsprim@^1.2.2:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
- integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
- dependencies:
- assert-plus "1.0.0"
- extsprintf "1.3.0"
- json-schema "0.2.3"
- verror "1.10.0"
-
-jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3:
- version "2.2.3"
- resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz#8a9364e402448a3ce7f14d357738310d9248054f"
- integrity sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==
- dependencies:
- array-includes "^3.0.3"
- object.assign "^4.1.0"
-
-keycode@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04"
- integrity sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=
-
-killable@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"
- integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==
-
-kind-of@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5"
- integrity sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=
- dependencies:
- is-buffer "^1.0.2"
-
-kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
- version "3.2.2"
- resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
- integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
- dependencies:
- is-buffer "^1.1.5"
-
-kind-of@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
- integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
- dependencies:
- is-buffer "^1.1.5"
-
-kind-of@^5.0.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
- integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
-
-kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3:
- version "6.0.3"
- resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
- integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
-
-kleur@^3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
- integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
-
-last-call-webpack-plugin@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555"
- integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==
- dependencies:
- lodash "^4.17.5"
- webpack-sources "^1.1.0"
-
-latest-version@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15"
- integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=
- dependencies:
- package-json "^4.0.0"
-
-lazy-cache@^0.2.3:
- version "0.2.7"
- resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65"
- integrity sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=
-
-lazy-cache@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
- integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4=
-
-lazy-property@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/lazy-property/-/lazy-property-1.0.0.tgz#84ddc4b370679ba8bd4cdcfa4c06b43d57111147"
- integrity sha1-hN3Es3Bnm6i9TNz6TAa0PVcREUc=
-
-lcid@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
- integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=
- dependencies:
- invert-kv "^1.0.0"
-
-lcid@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf"
- integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==
- dependencies:
- invert-kv "^2.0.0"
-
-left-pad@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e"
- integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==
-
-leven@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
- integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
-
-levenary@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77"
- integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==
- dependencies:
- leven "^3.1.0"
-
-levn@^0.3.0, levn@~0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
- integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
- dependencies:
- prelude-ls "~1.1.2"
- type-check "~0.3.2"
-
-libcipm@^4.0.7:
- version "4.0.8"
- resolved "https://registry.yarnpkg.com/libcipm/-/libcipm-4.0.8.tgz#dcea4919e10dfbce420327e63901613b9141bc89"
- integrity sha512-IN3hh2yDJQtZZ5paSV4fbvJg4aHxCCg5tcZID/dSVlTuUiWktsgaldVljJv6Z5OUlYspx6xQkbR0efNodnIrOA==
- dependencies:
- bin-links "^1.1.2"
- bluebird "^3.5.1"
- figgy-pudding "^3.5.1"
- find-npm-prefix "^1.0.2"
- graceful-fs "^4.1.11"
- ini "^1.3.5"
- lock-verify "^2.1.0"
- mkdirp "^0.5.1"
- npm-lifecycle "^3.0.0"
- npm-logical-tree "^1.2.1"
- npm-package-arg "^6.1.0"
- pacote "^9.1.0"
- read-package-json "^2.0.13"
- rimraf "^2.6.2"
- worker-farm "^1.6.0"
-
-libnpm@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/libnpm/-/libnpm-3.0.1.tgz#0be11b4c9dd4d1ffd7d95c786e92e55d65be77a2"
- integrity sha512-d7jU5ZcMiTfBqTUJVZ3xid44fE5ERBm9vBnmhp2ECD2Ls+FNXWxHSkO7gtvrnbLO78gwPdNPz1HpsF3W4rjkBQ==
- dependencies:
- bin-links "^1.1.2"
- bluebird "^3.5.3"
- find-npm-prefix "^1.0.2"
- libnpmaccess "^3.0.2"
- libnpmconfig "^1.2.1"
- libnpmhook "^5.0.3"
- libnpmorg "^1.0.1"
- libnpmpublish "^1.1.2"
- libnpmsearch "^2.0.2"
- libnpmteam "^1.0.2"
- lock-verify "^2.0.2"
- npm-lifecycle "^3.0.0"
- npm-logical-tree "^1.2.1"
- npm-package-arg "^6.1.0"
- npm-profile "^4.0.2"
- npm-registry-fetch "^4.0.0"
- npmlog "^4.1.2"
- pacote "^9.5.3"
- read-package-json "^2.0.13"
- stringify-package "^1.0.0"
-
-libnpmaccess@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-3.0.2.tgz#8b2d72345ba3bef90d3b4f694edd5c0417f58923"
- integrity sha512-01512AK7MqByrI2mfC7h5j8N9V4I7MHJuk9buo8Gv+5QgThpOgpjB7sQBDDkeZqRteFb1QM/6YNdHfG7cDvfAQ==
- dependencies:
- aproba "^2.0.0"
- get-stream "^4.0.0"
- npm-package-arg "^6.1.0"
- npm-registry-fetch "^4.0.0"
-
-libnpmconfig@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/libnpmconfig/-/libnpmconfig-1.2.1.tgz#c0c2f793a74e67d4825e5039e7a02a0044dfcbc0"
- integrity sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA==
- dependencies:
- figgy-pudding "^3.5.1"
- find-up "^3.0.0"
- ini "^1.3.5"
-
-libnpmhook@^5.0.3:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-5.0.3.tgz#4020c0f5edbf08ebe395325caa5ea01885b928f7"
- integrity sha512-UdNLMuefVZra/wbnBXECZPefHMGsVDTq5zaM/LgKNE9Keyl5YXQTnGAzEo+nFOpdRqTWI9LYi4ApqF9uVCCtuA==
- dependencies:
- aproba "^2.0.0"
- figgy-pudding "^3.4.1"
- get-stream "^4.0.0"
- npm-registry-fetch "^4.0.0"
-
-libnpmorg@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/libnpmorg/-/libnpmorg-1.0.1.tgz#5d2503f6ceb57f33dbdcc718e6698fea6d5ad087"
- integrity sha512-0sRUXLh+PLBgZmARvthhYXQAWn0fOsa6T5l3JSe2n9vKG/lCVK4nuG7pDsa7uMq+uTt2epdPK+a2g6btcY11Ww==
- dependencies:
- aproba "^2.0.0"
- figgy-pudding "^3.4.1"
- get-stream "^4.0.0"
- npm-registry-fetch "^4.0.0"
-
-libnpmpublish@^1.1.2:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-1.1.3.tgz#e3782796722d79eef1a0a22944c117e0c4ca4280"
- integrity sha512-/3LsYqVc52cHXBmu26+J8Ed7sLs/hgGVFMH1mwYpL7Qaynb9RenpKqIKu0sJ130FB9PMkpMlWjlbtU8A4m7CQw==
- dependencies:
- aproba "^2.0.0"
- figgy-pudding "^3.5.1"
- get-stream "^4.0.0"
- lodash.clonedeep "^4.5.0"
- normalize-package-data "^2.4.0"
- npm-package-arg "^6.1.0"
- npm-registry-fetch "^4.0.0"
- semver "^5.5.1"
- ssri "^6.0.1"
-
-libnpmsearch@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/libnpmsearch/-/libnpmsearch-2.0.2.tgz#9a4f059102d38e3dd44085bdbfe5095f2a5044cf"
- integrity sha512-VTBbV55Q6fRzTdzziYCr64+f8AopQ1YZ+BdPOv16UegIEaE8C0Kch01wo4s3kRTFV64P121WZJwgmBwrq68zYg==
- dependencies:
- figgy-pudding "^3.5.1"
- get-stream "^4.0.0"
- npm-registry-fetch "^4.0.0"
-
-libnpmteam@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/libnpmteam/-/libnpmteam-1.0.2.tgz#8b48bcbb6ce70dd8150c950fcbdbf3feb6eec820"
- integrity sha512-p420vM28Us04NAcg1rzgGW63LMM6rwe+6rtZpfDxCcXxM0zUTLl7nPFEnRF3JfFBF5skF/yuZDUthTsHgde8QA==
- dependencies:
- aproba "^2.0.0"
- figgy-pudding "^3.4.1"
- get-stream "^4.0.0"
- npm-registry-fetch "^4.0.0"
-
-libnpx@^10.2.2:
- version "10.2.3"
- resolved "https://registry.yarnpkg.com/libnpx/-/libnpx-10.2.3.tgz#d5e01f12d383ffca9a947807ca6a8f587d38fe2c"
- integrity sha512-bCvdARu55fLQBhMfcYGF0GznF1kB2sqxq/9zKZ3652M8DDFWpVpCnpgzjzn0yWMDMez5ZGMBiX24yR11uEYZVQ==
- dependencies:
- dotenv "^5.0.1"
- npm-package-arg "^6.0.0"
- rimraf "^2.6.2"
- safe-buffer "^5.1.0"
- update-notifier "^2.3.0"
- which "^1.3.0"
- y18n "^4.0.0"
- yargs "^11.0.0"
-
-lines-and-columns@^1.1.6:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
- integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
-
-load-json-file@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
- integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=
- dependencies:
- graceful-fs "^4.1.2"
- parse-json "^2.2.0"
- pify "^2.0.0"
- strip-bom "^3.0.0"
-
-load-json-file@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
- integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs=
- dependencies:
- graceful-fs "^4.1.2"
- parse-json "^4.0.0"
- pify "^3.0.0"
- strip-bom "^3.0.0"
-
-loader-fs-cache@^1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz#f08657646d607078be2f0a032f8bd69dd6f277d9"
- integrity sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==
- dependencies:
- find-cache-dir "^0.1.1"
- mkdirp "^0.5.1"
-
-loader-runner@^2.4.0:
- version "2.4.0"
- resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
- integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==
-
-loader-utils@1.2.3:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7"
- integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==
- dependencies:
- big.js "^5.2.2"
- emojis-list "^2.0.0"
- json5 "^1.0.1"
-
-loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
- integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
- dependencies:
- big.js "^5.2.2"
- emojis-list "^3.0.0"
- json5 "^1.0.1"
-
-locate-path@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
- integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
- dependencies:
- p-locate "^2.0.0"
- path-exists "^3.0.0"
-
-locate-path@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
- integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
- dependencies:
- p-locate "^3.0.0"
- path-exists "^3.0.0"
-
-locate-path@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
- integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
- dependencies:
- p-locate "^4.1.0"
-
-lock-verify@^2.0.2, lock-verify@^2.1.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/lock-verify/-/lock-verify-2.2.0.tgz#12432feb68bb647071c78c44bde16029a0f7d935"
- integrity sha512-BhM1Vqsu7x0s+EalTifNjdDPks+ZjdAhComvnA6VcCIlDOI5ouELXqAe1BYuEIP4zGN0W08xVm6byJV1LnCiJg==
- dependencies:
- "@iarna/cli" "^1.2.0"
- npm-package-arg "^6.1.0"
- semver "^5.4.1"
-
-lockfile@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609"
- integrity sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==
- dependencies:
- signal-exit "^3.0.2"
-
-lodash-es@^4.2.1:
- version "4.17.15"
- resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78"
- integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==
-
-lodash._baseuniq@~4.6.0:
- version "4.6.0"
- resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8"
- integrity sha1-DrtE5FaBSveQXGIS+iybLVG4Qeg=
- dependencies:
- lodash._createset "~4.0.0"
- lodash._root "~3.0.0"
-
-lodash._createset@~4.0.0:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26"
- integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY=
-
-lodash._reinterpolate@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
- integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=
-
-lodash._root@~3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692"
- integrity sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=
-
-lodash.capitalize@^4.2.1:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9"
- integrity sha1-+CbJtOKoUR2E46yinbBeGk87cqk=
-
-lodash.clonedeep@^4.5.0, lodash.clonedeep@~4.5.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
- integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
-
-lodash.curry@^4.0.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170"
- integrity sha1-JI42By7ekGUB11lmIAqG2riyMXA=
-
-lodash.debounce@^4:
- version "4.0.8"
- resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
- integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
-
-lodash.escaperegexp@^4.1.2:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347"
- integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=
-
-lodash.flow@^3.3.0:
- version "3.5.0"
- resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a"
- integrity sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=
-
-lodash.get@^4.4.2:
- version "4.4.2"
- resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
- integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=
-
-lodash.ismatch@^4.4.0:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37"
- integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=
-
-lodash.isplainobject@^4.0.6:
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
- integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=
-
-lodash.isstring@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
- integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=
-
-lodash.map@^4.5.1:
- version "4.6.0"
- resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3"
- integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=
-
-lodash.memoize@^4.1.2:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
- integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
-
-lodash.set@^4.3.2:
- version "4.3.2"
- resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23"
- integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=
-
-lodash.sortby@^4.7.0:
- version "4.7.0"
- resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
- integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=
-
-lodash.template@^4.4.0, lodash.template@^4.5.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab"
- integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==
- dependencies:
- lodash._reinterpolate "^3.0.0"
- lodash.templatesettings "^4.0.0"
-
-lodash.templatesettings@^4.0.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33"
- integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==
- dependencies:
- lodash._reinterpolate "^3.0.0"
-
-lodash.toarray@^4.4.0:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561"
- integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE=
-
-lodash.union@~4.6.0:
- version "4.6.0"
- resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88"
- integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=
-
-lodash.uniq@^4.5.0, lodash.uniq@~4.5.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
- integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
-
-lodash.uniqby@^4.7.0:
- version "4.7.0"
- resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302"
- integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=
-
-lodash.without@~4.4.0:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac"
- integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw=
-
-lodash@4.17.15, "lodash@>=3.5 <5", lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1:
- version "4.17.15"
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
- integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
-
-lodash@^4.17.19:
- version "4.17.20"
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
- integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
-
-lodash@^4.17.21:
- version "4.17.21"
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
- integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
-
-loglevel@^1.6.6:
- version "1.6.8"
- resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171"
- integrity sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==
-
-longest@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/longest/-/longest-2.0.1.tgz#781e183296aa94f6d4d916dc335d0d17aefa23f8"
- integrity sha1-eB4YMpaqlPbU2RbcM10NF676I/g=
-
-loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
- integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
- dependencies:
- js-tokens "^3.0.0 || ^4.0.0"
-
-lower-case@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.1.tgz#39eeb36e396115cc05e29422eaea9e692c9408c7"
- integrity sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==
- dependencies:
- tslib "^1.10.0"
-
-lowercase-keys@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
- integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
-
-lru-cache@^4.0.1:
- version "4.1.5"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
- integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
- dependencies:
- pseudomap "^1.0.2"
- yallist "^2.1.2"
-
-lru-cache@^5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
- integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
- dependencies:
- yallist "^3.0.2"
-
-lru-queue@0.1:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3"
- integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=
- dependencies:
- es5-ext "~0.10.2"
-
-macos-release@^2.2.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f"
- integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA==
-
-make-dir@^1.0.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
- integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
- dependencies:
- pify "^3.0.0"
-
-make-dir@^2.0.0, make-dir@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
- integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
- dependencies:
- pify "^4.0.1"
- semver "^5.6.0"
-
-make-dir@^3.0.2:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
- integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
- dependencies:
- semver "^6.0.0"
-
-make-fetch-happen@^5.0.0:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz#aa8387104f2687edca01c8687ee45013d02d19bd"
- integrity sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==
- dependencies:
- agentkeepalive "^3.4.1"
- cacache "^12.0.0"
- http-cache-semantics "^3.8.1"
- http-proxy-agent "^2.1.0"
- https-proxy-agent "^2.2.3"
- lru-cache "^5.1.1"
- mississippi "^3.0.0"
- node-fetch-npm "^2.0.2"
- promise-retry "^1.1.1"
- socks-proxy-agent "^4.0.0"
- ssri "^6.0.0"
-
-makeerror@1.0.x:
- version "1.0.11"
- resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c"
- integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=
- dependencies:
- tmpl "1.0.x"
-
-mamacro@^0.0.3:
- version "0.0.3"
- resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4"
- integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==
-
-map-age-cleaner@^0.1.1:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a"
- integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==
- dependencies:
- p-defer "^1.0.0"
-
-map-cache@^0.2.2:
- version "0.2.2"
- resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
- integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
-
-map-obj@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
- integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=
-
-map-obj@^4.0.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5"
- integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==
-
-map-visit@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
- integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
- dependencies:
- object-visit "^1.0.0"
-
-marked-terminal@^3.2.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-3.3.0.tgz#25ce0c0299285998c7636beaefc87055341ba1bd"
- integrity sha512-+IUQJ5VlZoAFsM5MHNT7g3RHSkA3eETqhRCdXv4niUMAKHQ7lb1yvAcuGPmm4soxhmtX13u4Li6ZToXtvSEH+A==
- dependencies:
- ansi-escapes "^3.1.0"
- cardinal "^2.1.1"
- chalk "^2.4.1"
- cli-table "^0.3.1"
- node-emoji "^1.4.1"
- supports-hyperlinks "^1.0.1"
-
-marked@^0.7.0:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e"
- integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==
-
-md5.js@^1.3.4:
- version "1.3.5"
- resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
- integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
- dependencies:
- hash-base "^3.0.0"
- inherits "^2.0.1"
- safe-buffer "^5.1.2"
-
-mdn-data@2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b"
- integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==
-
-mdn-data@2.0.6:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978"
- integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==
-
-meant@~1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/meant/-/meant-1.0.1.tgz#66044fea2f23230ec806fb515efea29c44d2115d"
- integrity sha512-UakVLFjKkbbUwNWJ2frVLnnAtbb7D7DsloxRd3s/gDpI8rdv8W5Hp3NaDb+POBI1fQdeussER6NB8vpcRURvlg==
-
-media-typer@0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
- integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
-
-mem@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
- integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=
- dependencies:
- mimic-fn "^1.0.0"
-
-mem@^4.0.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178"
- integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==
- dependencies:
- map-age-cleaner "^0.1.1"
- mimic-fn "^2.0.0"
- p-is-promise "^2.0.0"
-
-memoize-one@^5.0.0:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.1.1.tgz#047b6e3199b508eaec03504de71229b8eb1d75c0"
- integrity sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA==
-
-memoizee@^0.4.12:
- version "0.4.14"
- resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57"
- integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==
- dependencies:
- d "1"
- es5-ext "^0.10.45"
- es6-weak-map "^2.0.2"
- event-emitter "^0.3.5"
- is-promise "^2.1"
- lru-queue "0.1"
- next-tick "1"
- timers-ext "^0.1.5"
-
-memory-fs@^0.4.1:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
- integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=
- dependencies:
- errno "^0.1.3"
- readable-stream "^2.0.1"
-
-memory-fs@^0.5.0:
- version "0.5.0"
- resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c"
- integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==
- dependencies:
- errno "^0.1.3"
- readable-stream "^2.0.1"
-
-meow@^7.0.0:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/meow/-/meow-7.0.1.tgz#1ed4a0a50b3844b451369c48362eb0515f04c1dc"
- integrity sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw==
+ "graceful-fs" "^4.1.6"
+
+"jsonify@~0.0.0":
+ "integrity" "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
+ "resolved" "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz"
+ "version" "0.0.0"
+
+"jsonparse@^1.2.0":
+ "integrity" "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA="
+ "resolved" "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz"
+ "version" "1.3.1"
+
+"JSONStream@^1.0.4":
+ "integrity" "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ=="
+ "resolved" "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz"
+ "version" "1.3.5"
+ dependencies:
+ "jsonparse" "^1.2.0"
+ "through" ">=2.2.7 <3"
+
+"JSONStream@^1.3.4", "JSONStream@^1.3.5":
+ "integrity" "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ=="
+ "resolved" "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz"
+ "version" "1.3.5"
+ dependencies:
+ "jsonparse" "^1.2.0"
+ "through" ">=2.2.7 <3"
+
+"jsprim@^1.2.2":
+ "integrity" "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI="
+ "resolved" "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz"
+ "version" "1.4.1"
+ dependencies:
+ "assert-plus" "1.0.0"
+ "extsprintf" "1.3.0"
+ "json-schema" "0.2.3"
+ "verror" "1.10.0"
+
+"jsx-ast-utils@^2.2.1", "jsx-ast-utils@^2.2.3":
+ "integrity" "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA=="
+ "resolved" "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz"
+ "version" "2.2.3"
+ dependencies:
+ "array-includes" "^3.0.3"
+ "object.assign" "^4.1.0"
+
+"jsx-ast-utils@^2.4.1 || ^3.0.0":
+ "integrity" "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw=="
+ "resolved" "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz"
+ "version" "3.3.3"
+ dependencies:
+ "array-includes" "^3.1.5"
+ "object.assign" "^4.1.3"
+
+"keycode@^2.2.0":
+ "integrity" "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ="
+ "resolved" "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz"
+ "version" "2.2.0"
+
+"killable@^1.0.1":
+ "integrity" "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg=="
+ "resolved" "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz"
+ "version" "1.0.1"
+
+"kind-of@^2.0.1":
+ "integrity" "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU="
+ "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz"
+ "version" "2.0.1"
+ dependencies:
+ "is-buffer" "^1.0.2"
+
+"kind-of@^3.0.2":
+ "integrity" "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ="
+ "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz"
+ "version" "3.2.2"
+ dependencies:
+ "is-buffer" "^1.1.5"
+
+"kind-of@^3.0.3":
+ "integrity" "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ="
+ "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz"
+ "version" "3.2.2"
+ dependencies:
+ "is-buffer" "^1.1.5"
+
+"kind-of@^3.2.0":
+ "integrity" "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ="
+ "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz"
+ "version" "3.2.2"
+ dependencies:
+ "is-buffer" "^1.1.5"
+
+"kind-of@^4.0.0":
+ "integrity" "sha1-IIE989cSkosgc3hpGkUGb65y3Vc="
+ "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz"
+ "version" "4.0.0"
+ dependencies:
+ "is-buffer" "^1.1.5"
+
+"kind-of@^5.0.0":
+ "integrity" "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+ "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz"
+ "version" "5.1.0"
+
+"kind-of@^6.0.0", "kind-of@^6.0.2", "kind-of@^6.0.3":
+ "integrity" "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
+ "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz"
+ "version" "6.0.3"
+
+"kleur@^3.0.3":
+ "integrity" "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="
+ "resolved" "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz"
+ "version" "3.0.3"
+
+"last-call-webpack-plugin@^3.0.0":
+ "integrity" "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w=="
+ "resolved" "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "lodash" "^4.17.5"
+ "webpack-sources" "^1.1.0"
+
+"latest-version@^3.0.0":
+ "integrity" "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU="
+ "resolved" "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "package-json" "^4.0.0"
+
+"lazy-cache@^0.2.3":
+ "integrity" "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U="
+ "resolved" "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz"
+ "version" "0.2.7"
+
+"lazy-cache@^1.0.3":
+ "integrity" "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
+ "resolved" "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz"
+ "version" "1.0.4"
+
+"lazy-property@~1.0.0":
+ "integrity" "sha1-hN3Es3Bnm6i9TNz6TAa0PVcREUc="
+ "resolved" "https://registry.npmjs.org/lazy-property/-/lazy-property-1.0.0.tgz"
+ "version" "1.0.0"
+
+"lcid@^2.0.0":
+ "integrity" "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA=="
+ "resolved" "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "invert-kv" "^2.0.0"
+
+"left-pad@^1.3.0":
+ "integrity" "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA=="
+ "resolved" "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz"
+ "version" "1.3.0"
+
+"leven@^3.1.0":
+ "integrity" "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="
+ "resolved" "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz"
+ "version" "3.1.0"
+
+"levenary@^1.1.1":
+ "integrity" "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ=="
+ "resolved" "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz"
+ "version" "1.1.1"
+ dependencies:
+ "leven" "^3.1.0"
+
+"levn@^0.3.0", "levn@~0.3.0":
+ "integrity" "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4="
+ "resolved" "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz"
+ "version" "0.3.0"
+ dependencies:
+ "prelude-ls" "~1.1.2"
+ "type-check" "~0.3.2"
+
+"libcipm@^4.0.7":
+ "version" "4.0.7"
+ dependencies:
+ "bin-links" "^1.1.2"
+ "bluebird" "^3.5.1"
+ "figgy-pudding" "^3.5.1"
+ "find-npm-prefix" "^1.0.2"
+ "graceful-fs" "^4.1.11"
+ "ini" "^1.3.5"
+ "lock-verify" "^2.0.2"
+ "mkdirp" "^0.5.1"
+ "npm-lifecycle" "^3.0.0"
+ "npm-logical-tree" "^1.2.1"
+ "npm-package-arg" "^6.1.0"
+ "pacote" "^9.1.0"
+ "read-package-json" "^2.0.13"
+ "rimraf" "^2.6.2"
+ "worker-farm" "^1.6.0"
+
+"libnpm@^3.0.1":
+ "integrity" "sha512-d7jU5ZcMiTfBqTUJVZ3xid44fE5ERBm9vBnmhp2ECD2Ls+FNXWxHSkO7gtvrnbLO78gwPdNPz1HpsF3W4rjkBQ=="
+ "resolved" "https://registry.npmjs.org/libnpm/-/libnpm-3.0.1.tgz"
+ "version" "3.0.1"
+ dependencies:
+ "bin-links" "^1.1.2"
+ "bluebird" "^3.5.3"
+ "find-npm-prefix" "^1.0.2"
+ "libnpmaccess" "^3.0.2"
+ "libnpmconfig" "^1.2.1"
+ "libnpmhook" "^5.0.3"
+ "libnpmorg" "^1.0.1"
+ "libnpmpublish" "^1.1.2"
+ "libnpmsearch" "^2.0.2"
+ "libnpmteam" "^1.0.2"
+ "lock-verify" "^2.0.2"
+ "npm-lifecycle" "^3.0.0"
+ "npm-logical-tree" "^1.2.1"
+ "npm-package-arg" "^6.1.0"
+ "npm-profile" "^4.0.2"
+ "npm-registry-fetch" "^4.0.0"
+ "npmlog" "^4.1.2"
+ "pacote" "^9.5.3"
+ "read-package-json" "^2.0.13"
+ "stringify-package" "^1.0.0"
+
+"libnpmaccess@^3.0.2":
+ "integrity" "sha512-01512AK7MqByrI2mfC7h5j8N9V4I7MHJuk9buo8Gv+5QgThpOgpjB7sQBDDkeZqRteFb1QM/6YNdHfG7cDvfAQ=="
+ "resolved" "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-3.0.2.tgz"
+ "version" "3.0.2"
+ dependencies:
+ "aproba" "^2.0.0"
+ "get-stream" "^4.0.0"
+ "npm-package-arg" "^6.1.0"
+ "npm-registry-fetch" "^4.0.0"
+
+"libnpmconfig@^1.2.1":
+ "integrity" "sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA=="
+ "resolved" "https://registry.npmjs.org/libnpmconfig/-/libnpmconfig-1.2.1.tgz"
+ "version" "1.2.1"
+ dependencies:
+ "figgy-pudding" "^3.5.1"
+ "find-up" "^3.0.0"
+ "ini" "^1.3.5"
+
+"libnpmhook@^5.0.3":
+ "integrity" "sha512-UdNLMuefVZra/wbnBXECZPefHMGsVDTq5zaM/LgKNE9Keyl5YXQTnGAzEo+nFOpdRqTWI9LYi4ApqF9uVCCtuA=="
+ "resolved" "https://registry.npmjs.org/libnpmhook/-/libnpmhook-5.0.3.tgz"
+ "version" "5.0.3"
+ dependencies:
+ "aproba" "^2.0.0"
+ "figgy-pudding" "^3.4.1"
+ "get-stream" "^4.0.0"
+ "npm-registry-fetch" "^4.0.0"
+
+"libnpmorg@^1.0.1":
+ "integrity" "sha512-0sRUXLh+PLBgZmARvthhYXQAWn0fOsa6T5l3JSe2n9vKG/lCVK4nuG7pDsa7uMq+uTt2epdPK+a2g6btcY11Ww=="
+ "resolved" "https://registry.npmjs.org/libnpmorg/-/libnpmorg-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "aproba" "^2.0.0"
+ "figgy-pudding" "^3.4.1"
+ "get-stream" "^4.0.0"
+ "npm-registry-fetch" "^4.0.0"
+
+"libnpmpublish@^1.1.2":
+ "version" "1.1.2"
+ dependencies:
+ "aproba" "^2.0.0"
+ "figgy-pudding" "^3.5.1"
+ "get-stream" "^4.0.0"
+ "lodash.clonedeep" "^4.5.0"
+ "normalize-package-data" "^2.4.0"
+ "npm-package-arg" "^6.1.0"
+ "npm-registry-fetch" "^4.0.0"
+ "semver" "^5.5.1"
+ "ssri" "^6.0.1"
+
+"libnpmsearch@^2.0.2":
+ "integrity" "sha512-VTBbV55Q6fRzTdzziYCr64+f8AopQ1YZ+BdPOv16UegIEaE8C0Kch01wo4s3kRTFV64P121WZJwgmBwrq68zYg=="
+ "resolved" "https://registry.npmjs.org/libnpmsearch/-/libnpmsearch-2.0.2.tgz"
+ "version" "2.0.2"
+ dependencies:
+ "figgy-pudding" "^3.5.1"
+ "get-stream" "^4.0.0"
+ "npm-registry-fetch" "^4.0.0"
+
+"libnpmteam@^1.0.2":
+ "integrity" "sha512-p420vM28Us04NAcg1rzgGW63LMM6rwe+6rtZpfDxCcXxM0zUTLl7nPFEnRF3JfFBF5skF/yuZDUthTsHgde8QA=="
+ "resolved" "https://registry.npmjs.org/libnpmteam/-/libnpmteam-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "aproba" "^2.0.0"
+ "figgy-pudding" "^3.4.1"
+ "get-stream" "^4.0.0"
+ "npm-registry-fetch" "^4.0.0"
+
+"libnpx@^10.2.2":
+ "version" "10.2.2"
+ dependencies:
+ "dotenv" "^5.0.1"
+ "npm-package-arg" "^6.0.0"
+ "rimraf" "^2.6.2"
+ "safe-buffer" "^5.1.0"
+ "update-notifier" "^2.3.0"
+ "which" "^1.3.0"
+ "y18n" "^4.0.0"
+ "yargs" "^11.0.0"
+
+"lines-and-columns@^1.1.6":
+ "integrity" "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA="
+ "resolved" "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz"
+ "version" "1.1.6"
+
+"load-json-file@^2.0.0":
+ "integrity" "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg="
+ "resolved" "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "graceful-fs" "^4.1.2"
+ "parse-json" "^2.2.0"
+ "pify" "^2.0.0"
+ "strip-bom" "^3.0.0"
+
+"load-json-file@^4.0.0":
+ "integrity" "sha1-L19Fq5HjMhYjT9U62rZo607AmTs="
+ "resolved" "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz"
+ "version" "4.0.0"
+ dependencies:
+ "graceful-fs" "^4.1.2"
+ "parse-json" "^4.0.0"
+ "pify" "^3.0.0"
+ "strip-bom" "^3.0.0"
+
+"loader-fs-cache@^1.0.2":
+ "integrity" "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA=="
+ "resolved" "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz"
+ "version" "1.0.3"
+ dependencies:
+ "find-cache-dir" "^0.1.1"
+ "mkdirp" "^0.5.1"
+
+"loader-runner@^2.4.0":
+ "integrity" "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw=="
+ "resolved" "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz"
+ "version" "2.4.0"
+
+"loader-utils@^1.1.0", "loader-utils@^1.2.3", "loader-utils@^1.4.0":
+ "integrity" "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA=="
+ "resolved" "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz"
+ "version" "1.4.0"
+ dependencies:
+ "big.js" "^5.2.2"
+ "emojis-list" "^3.0.0"
+ "json5" "^1.0.1"
+
+"loader-utils@1.2.3":
+ "integrity" "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA=="
+ "resolved" "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz"
+ "version" "1.2.3"
+ dependencies:
+ "big.js" "^5.2.2"
+ "emojis-list" "^2.0.0"
+ "json5" "^1.0.1"
+
+"locate-path@^2.0.0":
+ "integrity" "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4="
+ "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "p-locate" "^2.0.0"
+ "path-exists" "^3.0.0"
+
+"locate-path@^3.0.0":
+ "integrity" "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="
+ "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "p-locate" "^3.0.0"
+ "path-exists" "^3.0.0"
+
+"locate-path@^5.0.0":
+ "integrity" "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="
+ "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz"
+ "version" "5.0.0"
+ dependencies:
+ "p-locate" "^4.1.0"
+
+"lock-verify@^2.0.2", "lock-verify@^2.1.0":
+ "version" "2.1.0"
+ dependencies:
+ "npm-package-arg" "^6.1.0"
+ "semver" "^5.4.1"
+
+"lockfile@^1.0.4":
+ "integrity" "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA=="
+ "resolved" "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz"
+ "version" "1.0.4"
+ dependencies:
+ "signal-exit" "^3.0.2"
+
+"lodash-es@^4.2.1":
+ "integrity" "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ=="
+ "resolved" "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz"
+ "version" "4.17.15"
+
+"lodash._baseuniq@~4.6.0":
+ "integrity" "sha1-DrtE5FaBSveQXGIS+iybLVG4Qeg="
+ "resolved" "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz"
+ "version" "4.6.0"
+ dependencies:
+ "lodash._createset" "~4.0.0"
+ "lodash._root" "~3.0.0"
+
+"lodash._createset@~4.0.0":
+ "integrity" "sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY="
+ "resolved" "https://registry.npmjs.org/lodash._createset/-/lodash._createset-4.0.3.tgz"
+ "version" "4.0.3"
+
+"lodash._getnative@^3.0.0":
+ "version" "3.9.1"
+
+"lodash._reinterpolate@^3.0.0":
+ "integrity" "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
+ "resolved" "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz"
+ "version" "3.0.0"
+
+"lodash._root@~3.0.0":
+ "integrity" "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI="
+ "resolved" "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz"
+ "version" "3.0.1"
+
+"lodash.capitalize@^4.2.1":
+ "integrity" "sha1-+CbJtOKoUR2E46yinbBeGk87cqk="
+ "resolved" "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz"
+ "version" "4.2.1"
+
+"lodash.clonedeep@^4.5.0", "lodash.clonedeep@~4.5.0":
+ "integrity" "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8="
+ "resolved" "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz"
+ "version" "4.5.0"
+
+"lodash.curry@^4.0.1":
+ "integrity" "sha1-JI42By7ekGUB11lmIAqG2riyMXA="
+ "resolved" "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz"
+ "version" "4.1.1"
+
+"lodash.debounce@^4":
+ "integrity" "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
+ "resolved" "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz"
+ "version" "4.0.8"
+
+"lodash.escaperegexp@^4.1.2":
+ "integrity" "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c="
+ "resolved" "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz"
+ "version" "4.1.2"
+
+"lodash.flow@^3.3.0":
+ "integrity" "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o="
+ "resolved" "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz"
+ "version" "3.5.0"
+
+"lodash.get@^4.4.2":
+ "integrity" "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
+ "resolved" "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz"
+ "version" "4.4.2"
+
+"lodash.ismatch@^4.4.0":
+ "integrity" "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc="
+ "resolved" "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz"
+ "version" "4.4.0"
+
+"lodash.isplainobject@^4.0.6":
+ "integrity" "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
+ "resolved" "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz"
+ "version" "4.0.6"
+
+"lodash.isstring@^4.0.1":
+ "integrity" "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
+ "resolved" "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz"
+ "version" "4.0.1"
+
+"lodash.map@^4.5.1":
+ "integrity" "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM="
+ "resolved" "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz"
+ "version" "4.6.0"
+
+"lodash.memoize@^4.1.2":
+ "integrity" "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4="
+ "resolved" "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz"
+ "version" "4.1.2"
+
+"lodash.set@^4.3.2":
+ "integrity" "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM="
+ "resolved" "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz"
+ "version" "4.3.2"
+
+"lodash.sortby@^4.7.0":
+ "integrity" "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
+ "resolved" "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz"
+ "version" "4.7.0"
+
+"lodash.template@^4.4.0", "lodash.template@^4.5.0":
+ "integrity" "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A=="
+ "resolved" "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz"
+ "version" "4.5.0"
+ dependencies:
+ "lodash._reinterpolate" "^3.0.0"
+ "lodash.templatesettings" "^4.0.0"
+
+"lodash.templatesettings@^4.0.0":
+ "integrity" "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ=="
+ "resolved" "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz"
+ "version" "4.2.0"
+ dependencies:
+ "lodash._reinterpolate" "^3.0.0"
+
+"lodash.toarray@^4.4.0":
+ "integrity" "sha1-JMS/zWsvuji/0FlNsRedjptlZWE="
+ "resolved" "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz"
+ "version" "4.4.0"
+
+"lodash.union@~4.6.0":
+ "integrity" "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg="
+ "resolved" "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz"
+ "version" "4.6.0"
+
+"lodash.uniq@^4.5.0":
+ "integrity" "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M="
+ "resolved" "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz"
+ "version" "4.5.0"
+
+"lodash.uniq@~4.5.0":
+ "integrity" "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M="
+ "resolved" "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz"
+ "version" "4.5.0"
+
+"lodash.uniqby@^4.7.0":
+ "integrity" "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI="
+ "resolved" "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz"
+ "version" "4.7.0"
+
+"lodash.without@~4.4.0":
+ "integrity" "sha1-PNRXSgC2e643OpS3SHcmQFB7eqw="
+ "resolved" "https://registry.npmjs.org/lodash.without/-/lodash.without-4.4.0.tgz"
+ "version" "4.4.0"
+
+"lodash@^4.17.10", "lodash@^4.17.11", "lodash@^4.17.12", "lodash@^4.17.13", "lodash@^4.17.14", "lodash@^4.17.15", "lodash@^4.17.2", "lodash@^4.17.4", "lodash@^4.17.5", "lodash@^4.2.1", "lodash@>= 3.0.0 < 5.0.0", "lodash@>= 4.0.0 < 5.0.0", "lodash@>=3.5 <5", "lodash@4.17.15":
+ "integrity" "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
+ "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz"
+ "version" "4.17.15"
+
+"lodash@^4.17.19":
+ "integrity" "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
+ "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz"
+ "version" "4.17.20"
+
+"lodash@^4.17.21":
+ "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
+ "version" "4.17.21"
+
+"loglevel@^1.6.6":
+ "integrity" "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA=="
+ "resolved" "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz"
+ "version" "1.6.8"
+
+"longest@^2.0.1":
+ "integrity" "sha1-eB4YMpaqlPbU2RbcM10NF676I/g="
+ "resolved" "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz"
+ "version" "2.0.1"
+
+"loose-envify@^1.0.0", "loose-envify@^1.1.0", "loose-envify@^1.2.0", "loose-envify@^1.3.1", "loose-envify@^1.4.0":
+ "integrity" "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="
+ "resolved" "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz"
+ "version" "1.4.0"
+ dependencies:
+ "js-tokens" "^3.0.0 || ^4.0.0"
+
+"lower-case@^2.0.1":
+ "integrity" "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ=="
+ "resolved" "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz"
+ "version" "2.0.1"
+ dependencies:
+ "tslib" "^1.10.0"
+
+"lowercase-keys@^1.0.0":
+ "integrity" "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
+ "resolved" "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz"
+ "version" "1.0.1"
+
+"lru-cache@^4.0.1":
+ "integrity" "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g=="
+ "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz"
+ "version" "4.1.5"
+ dependencies:
+ "pseudomap" "^1.0.2"
+ "yallist" "^2.1.2"
+
+"lru-cache@^5.1.1":
+ "integrity" "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="
+ "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz"
+ "version" "5.1.1"
+ dependencies:
+ "yallist" "^3.0.2"
+
+"lru-queue@0.1":
+ "integrity" "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM="
+ "resolved" "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz"
+ "version" "0.1.0"
+ dependencies:
+ "es5-ext" "~0.10.2"
+
+"macos-release@^2.2.0":
+ "integrity" "sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA=="
+ "resolved" "https://registry.npmjs.org/macos-release/-/macos-release-2.3.0.tgz"
+ "version" "2.3.0"
+
+"make-dir@^1.0.0":
+ "integrity" "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ=="
+ "resolved" "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz"
+ "version" "1.3.0"
+ dependencies:
+ "pify" "^3.0.0"
+
+"make-dir@^2.0.0", "make-dir@^2.1.0":
+ "integrity" "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA=="
+ "resolved" "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "pify" "^4.0.1"
+ "semver" "^5.6.0"
+
+"make-dir@^3.0.2":
+ "integrity" "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw=="
+ "resolved" "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "semver" "^6.0.0"
+
+"make-fetch-happen@^5.0.0":
+ "integrity" "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag=="
+ "resolved" "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz"
+ "version" "5.0.2"
+ dependencies:
+ "agentkeepalive" "^3.4.1"
+ "cacache" "^12.0.0"
+ "http-cache-semantics" "^3.8.1"
+ "http-proxy-agent" "^2.1.0"
+ "https-proxy-agent" "^2.2.3"
+ "lru-cache" "^5.1.1"
+ "mississippi" "^3.0.0"
+ "node-fetch-npm" "^2.0.2"
+ "promise-retry" "^1.1.1"
+ "socks-proxy-agent" "^4.0.0"
+ "ssri" "^6.0.0"
+
+"makeerror@1.0.x":
+ "integrity" "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw="
+ "resolved" "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz"
+ "version" "1.0.11"
+ dependencies:
+ "tmpl" "1.0.x"
+
+"mamacro@^0.0.3":
+ "integrity" "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA=="
+ "resolved" "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz"
+ "version" "0.0.3"
+
+"map-age-cleaner@^0.1.1":
+ "integrity" "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w=="
+ "resolved" "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz"
+ "version" "0.1.3"
+ dependencies:
+ "p-defer" "^1.0.0"
+
+"map-cache@^0.2.2":
+ "integrity" "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
+ "resolved" "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz"
+ "version" "0.2.2"
+
+"map-obj@^1.0.0":
+ "integrity" "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0="
+ "resolved" "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz"
+ "version" "1.0.1"
+
+"map-obj@^4.0.0":
+ "integrity" "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g=="
+ "resolved" "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz"
+ "version" "4.1.0"
+
+"map-visit@^1.0.0":
+ "integrity" "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48="
+ "resolved" "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "object-visit" "^1.0.0"
+
+"marked-terminal@^3.2.0":
+ "integrity" "sha512-+IUQJ5VlZoAFsM5MHNT7g3RHSkA3eETqhRCdXv4niUMAKHQ7lb1yvAcuGPmm4soxhmtX13u4Li6ZToXtvSEH+A=="
+ "resolved" "https://registry.npmjs.org/marked-terminal/-/marked-terminal-3.3.0.tgz"
+ "version" "3.3.0"
+ dependencies:
+ "ansi-escapes" "^3.1.0"
+ "cardinal" "^2.1.1"
+ "chalk" "^2.4.1"
+ "cli-table" "^0.3.1"
+ "node-emoji" "^1.4.1"
+ "supports-hyperlinks" "^1.0.1"
+
+"marked@^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0", "marked@^0.7.0":
+ "integrity" "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg=="
+ "resolved" "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz"
+ "version" "0.7.0"
+
+"md5.js@^1.3.4":
+ "integrity" "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg=="
+ "resolved" "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz"
+ "version" "1.3.5"
+ dependencies:
+ "hash-base" "^3.0.0"
+ "inherits" "^2.0.1"
+ "safe-buffer" "^5.1.2"
+
+"mdn-data@2.0.4":
+ "integrity" "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA=="
+ "resolved" "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz"
+ "version" "2.0.4"
+
+"mdn-data@2.0.6":
+ "integrity" "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA=="
+ "resolved" "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz"
+ "version" "2.0.6"
+
+"meant@~1.0.1":
+ "integrity" "sha512-UakVLFjKkbbUwNWJ2frVLnnAtbb7D7DsloxRd3s/gDpI8rdv8W5Hp3NaDb+POBI1fQdeussER6NB8vpcRURvlg=="
+ "resolved" "https://registry.npmjs.org/meant/-/meant-1.0.1.tgz"
+ "version" "1.0.1"
+
+"media-typer@0.3.0":
+ "integrity" "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
+ "resolved" "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz"
+ "version" "0.3.0"
+
+"mem@^4.0.0":
+ "integrity" "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w=="
+ "resolved" "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz"
+ "version" "4.3.0"
+ dependencies:
+ "map-age-cleaner" "^0.1.1"
+ "mimic-fn" "^2.0.0"
+ "p-is-promise" "^2.0.0"
+
+"memoize-one@^5.0.0":
+ "integrity" "sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA=="
+ "resolved" "https://registry.npmjs.org/memoize-one/-/memoize-one-5.1.1.tgz"
+ "version" "5.1.1"
+
+"memoizee@^0.4.12":
+ "integrity" "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg=="
+ "resolved" "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz"
+ "version" "0.4.14"
+ dependencies:
+ "d" "1"
+ "es5-ext" "^0.10.45"
+ "es6-weak-map" "^2.0.2"
+ "event-emitter" "^0.3.5"
+ "is-promise" "^2.1"
+ "lru-queue" "0.1"
+ "next-tick" "1"
+ "timers-ext" "^0.1.5"
+
+"memory-fs@^0.4.1":
+ "integrity" "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI="
+ "resolved" "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz"
+ "version" "0.4.1"
+ dependencies:
+ "errno" "^0.1.3"
+ "readable-stream" "^2.0.1"
+
+"memory-fs@^0.5.0":
+ "integrity" "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA=="
+ "resolved" "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz"
+ "version" "0.5.0"
+ dependencies:
+ "errno" "^0.1.3"
+ "readable-stream" "^2.0.1"
+
+"meow@^7.0.0":
+ "integrity" "sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw=="
+ "resolved" "https://registry.npmjs.org/meow/-/meow-7.0.1.tgz"
+ "version" "7.0.1"
dependencies:
"@types/minimist" "^1.2.0"
- arrify "^2.0.1"
- camelcase "^6.0.0"
- camelcase-keys "^6.2.2"
- decamelize-keys "^1.1.0"
- hard-rejection "^2.1.0"
- minimist-options "^4.0.2"
- normalize-package-data "^2.5.0"
- read-pkg-up "^7.0.1"
- redent "^3.0.0"
- trim-newlines "^3.0.0"
- type-fest "^0.13.1"
- yargs-parser "^18.1.3"
-
-merge-deep@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.2.tgz#f39fa100a4f1bd34ff29f7d2bf4508fbb8d83ad2"
- integrity sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==
- dependencies:
- arr-union "^3.1.0"
- clone-deep "^0.2.4"
- kind-of "^3.0.2"
-
-merge-descriptors@1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
- integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
-
-merge-stream@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
- integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
-
-merge2@^1.2.3, merge2@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81"
- integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==
-
-merge@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145"
- integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==
-
-methods@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
- integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
-
-microevent.ts@~0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0"
- integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==
-
-micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
- version "3.1.10"
- resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
- integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
- dependencies:
- arr-diff "^4.0.0"
- array-unique "^0.3.2"
- braces "^2.3.1"
- define-property "^2.0.2"
- extend-shallow "^3.0.2"
- extglob "^2.0.4"
- fragment-cache "^0.2.1"
- kind-of "^6.0.2"
- nanomatch "^1.2.9"
- object.pick "^1.3.0"
- regex-not "^1.0.0"
- snapdragon "^0.8.1"
- to-regex "^3.0.2"
-
-micromatch@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259"
- integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==
- dependencies:
- braces "^3.0.1"
- picomatch "^2.0.5"
-
-microseconds@0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/microseconds/-/microseconds-0.2.0.tgz#233b25f50c62a65d861f978a4a4f8ec18797dc39"
- integrity sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==
-
-miller-rabin@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
- integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
- dependencies:
- bn.js "^4.0.0"
- brorand "^1.0.1"
-
-mime-db@1.43.0:
- version "1.43.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58"
- integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==
-
-mime-db@1.44.0, "mime-db@>= 1.43.0 < 2":
- version "1.44.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92"
- integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==
-
-mime-types@2.1.26:
- version "2.1.26"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06"
- integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==
- dependencies:
- mime-db "1.43.0"
-
-mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24:
- version "2.1.27"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f"
- integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==
- dependencies:
- mime-db "1.44.0"
-
-mime@1.6.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
- integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
-
-mime@^2.4.3, mime@^2.4.4:
- version "2.4.5"
- resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.5.tgz#d8de2ecb92982dedbb6541c9b6841d7f218ea009"
- integrity sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w==
-
-mimic-fn@^1.0.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
- integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
-
-mimic-fn@^2.0.0, mimic-fn@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
- integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
-
-min-indent@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.0.tgz#cfc45c37e9ec0d8f0a0ec3dd4ef7f7c3abe39256"
- integrity sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=
-
-mini-create-react-context@^0.4.0:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz#072171561bfdc922da08a60c2197a497cc2d1d5e"
- integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==
+ "arrify" "^2.0.1"
+ "camelcase" "^6.0.0"
+ "camelcase-keys" "^6.2.2"
+ "decamelize-keys" "^1.1.0"
+ "hard-rejection" "^2.1.0"
+ "minimist-options" "^4.0.2"
+ "normalize-package-data" "^2.5.0"
+ "read-pkg-up" "^7.0.1"
+ "redent" "^3.0.0"
+ "trim-newlines" "^3.0.0"
+ "type-fest" "^0.13.1"
+ "yargs-parser" "^18.1.3"
+
+"merge-deep@^3.0.2":
+ "integrity" "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA=="
+ "resolved" "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz"
+ "version" "3.0.2"
+ dependencies:
+ "arr-union" "^3.1.0"
+ "clone-deep" "^0.2.4"
+ "kind-of" "^3.0.2"
+
+"merge-descriptors@1.0.1":
+ "integrity" "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
+ "resolved" "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz"
+ "version" "1.0.1"
+
+"merge-stream@^2.0.0":
+ "integrity" "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+ "resolved" "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz"
+ "version" "2.0.0"
+
+"merge@^1.2.1":
+ "integrity" "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ=="
+ "resolved" "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz"
+ "version" "1.2.1"
+
+"merge2@^1.2.3", "merge2@^1.3.0":
+ "integrity" "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw=="
+ "resolved" "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz"
+ "version" "1.3.0"
+
+"methods@~1.1.2":
+ "integrity" "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
+ "resolved" "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz"
+ "version" "1.1.2"
+
+"microevent.ts@~0.1.1":
+ "integrity" "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g=="
+ "resolved" "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz"
+ "version" "0.1.1"
+
+"micromatch@^3.0.4", "micromatch@^3.1.10", "micromatch@^3.1.4":
+ "integrity" "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg=="
+ "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz"
+ "version" "3.1.10"
+ dependencies:
+ "arr-diff" "^4.0.0"
+ "array-unique" "^0.3.2"
+ "braces" "^2.3.1"
+ "define-property" "^2.0.2"
+ "extend-shallow" "^3.0.2"
+ "extglob" "^2.0.4"
+ "fragment-cache" "^0.2.1"
+ "kind-of" "^6.0.2"
+ "nanomatch" "^1.2.9"
+ "object.pick" "^1.3.0"
+ "regex-not" "^1.0.0"
+ "snapdragon" "^0.8.1"
+ "to-regex" "^3.0.2"
+
+"micromatch@^4.0.2":
+ "integrity" "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q=="
+ "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz"
+ "version" "4.0.2"
+ dependencies:
+ "braces" "^3.0.1"
+ "picomatch" "^2.0.5"
+
+"microseconds@0.2.0":
+ "integrity" "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA=="
+ "resolved" "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz"
+ "version" "0.2.0"
+
+"miller-rabin@^4.0.0":
+ "integrity" "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA=="
+ "resolved" "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz"
+ "version" "4.0.1"
+ dependencies:
+ "bn.js" "^4.0.0"
+ "brorand" "^1.0.1"
+
+"mime-db@>= 1.43.0 < 2", "mime-db@1.44.0":
+ "integrity" "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
+ "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz"
+ "version" "1.44.0"
+
+"mime-db@~1.35.0":
+ "version" "1.35.0"
+
+"mime-db@1.43.0":
+ "integrity" "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ=="
+ "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz"
+ "version" "1.43.0"
+
+"mime-types@^2.1.12", "mime-types@~2.1.17", "mime-types@~2.1.19", "mime-types@~2.1.24":
+ "integrity" "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w=="
+ "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz"
+ "version" "2.1.27"
+ dependencies:
+ "mime-db" "1.44.0"
+
+"mime-types@2.1.26":
+ "integrity" "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ=="
+ "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz"
+ "version" "2.1.26"
+ dependencies:
+ "mime-db" "1.43.0"
+
+"mime@^2.4.3", "mime@^2.4.4":
+ "integrity" "sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w=="
+ "resolved" "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz"
+ "version" "2.4.5"
+
+"mime@1.6.0":
+ "integrity" "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+ "resolved" "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz"
+ "version" "1.6.0"
+
+"mimic-fn@^1.0.0":
+ "integrity" "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
+ "resolved" "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz"
+ "version" "1.2.0"
+
+"mimic-fn@^2.0.0":
+ "integrity" "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
+ "resolved" "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz"
+ "version" "2.1.0"
+
+"mimic-fn@^2.1.0":
+ "integrity" "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
+ "resolved" "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz"
+ "version" "2.1.0"
+
+"min-indent@^1.0.0":
+ "integrity" "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY="
+ "resolved" "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz"
+ "version" "1.0.0"
+
+"mini-create-react-context@^0.4.0":
+ "integrity" "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ=="
+ "resolved" "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz"
+ "version" "0.4.1"
dependencies:
"@babel/runtime" "^7.12.1"
- tiny-warning "^1.0.3"
-
-mini-css-extract-plugin@0.9.0:
- version "0.9.0"
- resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e"
- integrity sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==
- dependencies:
- loader-utils "^1.1.0"
- normalize-url "1.9.1"
- schema-utils "^1.0.0"
- webpack-sources "^1.1.0"
-
-minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
- integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
-
-minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
- integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
-
-minimatch@3.0.4, minimatch@^3.0.4:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
- integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
- dependencies:
- brace-expansion "^1.1.7"
-
-minimist-options@^4.0.2:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619"
- integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==
- dependencies:
- arrify "^1.0.1"
- is-plain-obj "^1.1.0"
- kind-of "^6.0.3"
-
-minimist@1.2.5, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5:
- version "1.2.5"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
- integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
-
-minipass-collect@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617"
- integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==
- dependencies:
- minipass "^3.0.0"
-
-minipass-flush@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373"
- integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==
- dependencies:
- minipass "^3.0.0"
-
-minipass-pipeline@^1.2.2:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz#55f7839307d74859d6e8ada9c3ebe72cec216a34"
- integrity sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ==
- dependencies:
- minipass "^3.0.0"
-
-minipass@^2.3.5, minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
- version "2.9.0"
- resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
- integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
- dependencies:
- safe-buffer "^5.1.2"
- yallist "^3.0.0"
-
-minipass@^3.0.0, minipass@^3.1.1:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd"
- integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==
- dependencies:
- yallist "^4.0.0"
-
-minizlib@^1.2.1:
- version "1.3.3"
- resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
- integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
- dependencies:
- minipass "^2.9.0"
-
-mississippi@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
- integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==
- dependencies:
- concat-stream "^1.5.0"
- duplexify "^3.4.2"
- end-of-stream "^1.1.0"
- flush-write-stream "^1.0.0"
- from2 "^2.1.0"
- parallel-transform "^1.1.0"
- pump "^3.0.0"
- pumpify "^1.3.3"
- stream-each "^1.1.0"
- through2 "^2.0.0"
-
-mixin-deep@^1.2.0:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
- integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
- dependencies:
- for-in "^1.0.2"
- is-extendable "^1.0.1"
-
-mixin-object@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e"
- integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=
- dependencies:
- for-in "^0.1.3"
- is-extendable "^0.1.1"
-
-mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.0, mkdirp@~0.5.1:
- version "0.5.5"
- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
- integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
- dependencies:
- minimist "^1.2.5"
-
-modify-values@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022"
- integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==
-
-moment-duration-format@2.3.2:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/moment-duration-format/-/moment-duration-format-2.3.2.tgz#5fa2b19b941b8d277122ff3f87a12895ec0d6212"
- integrity sha512-cBMXjSW+fjOb4tyaVHuaVE/A5TqkukDWiOfxxAjY+PEqmmBQlLwn+8OzwPiG3brouXKY5Un4pBjAeB6UToXHaQ==
-
-moment-timezone@^0.4.0, moment-timezone@^0.4.1:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.4.1.tgz#81f598c3ad5e22cdad796b67ecd8d88d0f5baa06"
- integrity sha1-gfWYw61eIs2teWtn7NjYjQ9bqgY=
- dependencies:
- moment ">= 2.6.0"
-
-moment-timezone@^0.5.28:
- version "0.5.31"
- resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.31.tgz#9c40d8c5026f0c7ab46eda3d63e49c155148de05"
- integrity sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==
- dependencies:
- moment ">= 2.9.0"
-
-"moment@>= 2.6.0", "moment@>= 2.9.0", moment@^2.10, moment@^2.19.1, moment@^2.22.2:
- version "2.26.0"
- resolved "https://registry.yarnpkg.com/moment/-/moment-2.26.0.tgz#5e1f82c6bafca6e83e808b30c8705eed0dcbd39a"
- integrity sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw==
-
-move-concurrently@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
- integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=
- dependencies:
- aproba "^1.1.1"
- copy-concurrently "^1.0.0"
- fs-write-stream-atomic "^1.0.8"
- mkdirp "^0.5.1"
- rimraf "^2.5.4"
- run-queue "^1.0.3"
-
-ms@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
- integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
-
-ms@2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
- integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
-
-ms@^2.0.0, ms@^2.1.1:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
- integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-
-multicast-dns-service-types@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901"
- integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=
-
-multicast-dns@^6.0.1:
- version "6.2.3"
- resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229"
- integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==
- dependencies:
- dns-packet "^1.3.1"
- thunky "^1.0.2"
-
-mute-stream@0.0.7:
- version "0.0.7"
- resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
- integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
-
-mute-stream@0.0.8, mute-stream@~0.0.4:
- version "0.0.8"
- resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
- integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
-
-nan@^2.12.1:
- version "2.14.1"
- resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01"
- integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==
-
-nano-time@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/nano-time/-/nano-time-1.0.0.tgz#b0554f69ad89e22d0907f7a12b0993a5d96137ef"
- integrity sha1-sFVPaa2J4i0JB/ehKwmTpdlhN+8=
- dependencies:
- big-integer "^1.6.16"
-
-nanoid@2.1.11:
- version "2.1.11"
- resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.1.11.tgz#ec24b8a758d591561531b4176a01e3ab4f0f0280"
- integrity sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==
-
-nanomatch@^1.2.9:
- version "1.2.13"
- resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
- integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
- dependencies:
- arr-diff "^4.0.0"
- array-unique "^0.3.2"
- define-property "^2.0.2"
- extend-shallow "^3.0.2"
- fragment-cache "^0.2.1"
- is-windows "^1.0.2"
- kind-of "^6.0.2"
- object.pick "^1.3.0"
- regex-not "^1.0.0"
- snapdragon "^0.8.1"
- to-regex "^3.0.1"
-
-natural-compare@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
- integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
-
-negotiator@0.6.2:
- version "0.6.2"
- resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
- integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
-
-neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1:
- version "2.6.1"
- resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c"
- integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==
-
-nerf-dart@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/nerf-dart/-/nerf-dart-1.0.0.tgz#e6dab7febf5ad816ea81cf5c629c5a0ebde72c1a"
- integrity sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo=
-
-next-tick@1:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
- integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
-
-next-tick@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
- integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
-
-nice-try@^1.0.4:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
- integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
-
-no-case@^3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.3.tgz#c21b434c1ffe48b39087e86cfb4d2582e9df18f8"
- integrity sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==
- dependencies:
- lower-case "^2.0.1"
- tslib "^1.10.0"
-
-node-emoji@^1.4.1:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da"
- integrity sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==
- dependencies:
- lodash.toarray "^4.4.0"
-
-node-fetch-npm@^2.0.2:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz#6507d0e17a9ec0be3bec516958a497cec54bf5a4"
- integrity sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==
- dependencies:
- encoding "^0.1.11"
- json-parse-better-errors "^1.0.0"
- safe-buffer "^5.1.1"
-
-node-fetch@2.6.0, node-fetch@^2.3.0:
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
- integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
-
-node-fetch@^1.0.1:
- version "1.7.3"
- resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
- integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==
- dependencies:
- encoding "^0.1.11"
- is-stream "^1.0.1"
-
-node-forge@0.9.0:
- version "0.9.0"
- resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579"
- integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==
-
-node-gyp@^5.0.2, node-gyp@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.1.0.tgz#8e31260a7af4a2e2f994b0673d4e0b3866156332"
- integrity sha512-OUTryc5bt/P8zVgNUmC6xdXiDJxLMAW8cF5tLQOT9E5sOQj+UeQxnnPy74K3CLCa/SOjjBlbuzDLR8ANwA+wmw==
- dependencies:
- env-paths "^2.2.0"
- glob "^7.1.4"
- graceful-fs "^4.2.2"
- mkdirp "^0.5.1"
- nopt "^4.0.1"
- npmlog "^4.1.2"
- request "^2.88.0"
- rimraf "^2.6.3"
- semver "^5.7.1"
- tar "^4.4.12"
- which "^1.3.1"
-
-node-int64@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
- integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=
-
-node-libs-browser@^2.2.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425"
- integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==
- dependencies:
- assert "^1.1.1"
- browserify-zlib "^0.2.0"
- buffer "^4.3.0"
- console-browserify "^1.1.0"
- constants-browserify "^1.0.0"
- crypto-browserify "^3.11.0"
- domain-browser "^1.1.1"
- events "^3.0.0"
- https-browserify "^1.0.0"
- os-browserify "^0.3.0"
- path-browserify "0.0.1"
- process "^0.11.10"
- punycode "^1.2.4"
- querystring-es3 "^0.2.0"
- readable-stream "^2.3.3"
- stream-browserify "^2.0.1"
- stream-http "^2.7.2"
- string_decoder "^1.0.0"
- timers-browserify "^2.0.4"
- tty-browserify "0.0.0"
- url "^0.11.0"
- util "^0.11.0"
- vm-browserify "^1.0.1"
-
-node-modules-regexp@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40"
- integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=
-
-node-notifier@^5.4.2:
- version "5.4.3"
- resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50"
- integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==
- dependencies:
- growly "^1.3.0"
- is-wsl "^1.1.0"
- semver "^5.5.0"
- shellwords "^0.1.1"
- which "^1.3.0"
-
-node-releases@^1.1.52, node-releases@^1.1.53:
- version "1.1.56"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.56.tgz#bc054a417d316e3adac90eafb7e1932802f28705"
- integrity sha512-EVo605FhWLygH8a64TjgpjyHYOihkxECwX1bHHr8tETJKWEiWS2YJjPbvsX2jFjnjTNEgBCmk9mLjKG1Mf11cw==
-
-nopt@^4.0.1, nopt@^4.0.3:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48"
- integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==
- dependencies:
- abbrev "1"
- osenv "^0.1.4"
-
-normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
- integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
- dependencies:
- hosted-git-info "^2.1.4"
- resolve "^1.10.0"
- semver "2 || 3 || 4 || 5"
- validate-npm-package-license "^3.0.1"
-
-normalize-path@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
- integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
- dependencies:
- remove-trailing-separator "^1.0.1"
-
-normalize-path@^3.0.0, normalize-path@~3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
- integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
-
-normalize-range@^0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
- integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=
-
-normalize-url@1.9.1:
- version "1.9.1"
- resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c"
- integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=
- dependencies:
- object-assign "^4.0.1"
- prepend-http "^1.0.0"
- query-string "^4.1.0"
- sort-keys "^1.0.0"
-
-normalize-url@^3.0.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
- integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==
-
-normalize-url@^4.0.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129"
- integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==
-
-npm-audit-report@^1.3.2:
- version "1.3.3"
- resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-1.3.3.tgz#8226deeb253b55176ed147592a3995442f2179ed"
- integrity sha512-8nH/JjsFfAWMvn474HB9mpmMjrnKb1Hx/oTAdjv4PT9iZBvBxiZ+wtDUapHCJwLqYGQVPaAfs+vL5+5k9QndXw==
- dependencies:
- cli-table3 "^0.5.0"
- console-control-strings "^1.1.0"
-
-npm-bundled@^1.0.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b"
- integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==
- dependencies:
- npm-normalize-package-bin "^1.0.1"
-
-npm-cache-filename@~1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz#ded306c5b0bfc870a9e9faf823bc5f283e05ae11"
- integrity sha1-3tMGxbC/yHCp6fr4I7xfKD4FrhE=
-
-npm-install-checks@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-3.0.2.tgz#ab2e32ad27baa46720706908e5b14c1852de44d9"
- integrity sha512-E4kzkyZDIWoin6uT5howP8VDvkM+E8IQDcHAycaAxMbwkqhIg5eEYALnXOl3Hq9MrkdQB/2/g1xwBINXdKSRkg==
- dependencies:
- semver "^2.3.0 || 3.x || 4 || 5"
-
-npm-lifecycle@^3.0.0, npm-lifecycle@^3.1.4:
- version "3.1.5"
- resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz#9882d3642b8c82c815782a12e6a1bfeed0026309"
- integrity sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g==
- dependencies:
- byline "^5.0.0"
- graceful-fs "^4.1.15"
- node-gyp "^5.0.2"
- resolve-from "^4.0.0"
- slide "^1.1.6"
- uid-number "0.0.6"
- umask "^1.1.0"
- which "^1.3.1"
-
-npm-logical-tree@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/npm-logical-tree/-/npm-logical-tree-1.2.1.tgz#44610141ca24664cad35d1e607176193fd8f5b88"
- integrity sha512-AJI/qxDB2PWI4LG1CYN579AY1vCiNyWfkiquCsJWqntRu/WwimVrC8yXeILBFHDwxfOejxewlmnvW9XXjMlYIg==
-
-npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2"
- integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==
-
-"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0, npm-package-arg@^6.1.1:
- version "6.1.1"
- resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7"
- integrity sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==
- dependencies:
- hosted-git-info "^2.7.1"
- osenv "^0.1.5"
- semver "^5.6.0"
- validate-npm-package-name "^3.0.0"
-
-npm-packlist@^1.1.12, npm-packlist@^1.4.8:
- version "1.4.8"
- resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e"
- integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==
- dependencies:
- ignore-walk "^3.0.1"
- npm-bundled "^1.0.1"
- npm-normalize-package-bin "^1.0.1"
-
-npm-pick-manifest@^3.0.0, npm-pick-manifest@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz#f4d9e5fd4be2153e5f4e5f9b7be8dc419a99abb7"
- integrity sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==
- dependencies:
- figgy-pudding "^3.5.1"
- npm-package-arg "^6.0.0"
- semver "^5.4.1"
-
-npm-profile@^4.0.2, npm-profile@^4.0.4:
- version "4.0.4"
- resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-4.0.4.tgz#28ee94390e936df6d084263ee2061336a6a1581b"
- integrity sha512-Ta8xq8TLMpqssF0H60BXS1A90iMoM6GeKwsmravJ6wYjWwSzcYBTdyWa3DZCYqPutacBMEm7cxiOkiIeCUAHDQ==
- dependencies:
- aproba "^1.1.2 || 2"
- figgy-pudding "^3.4.1"
- npm-registry-fetch "^4.0.0"
-
-npm-registry-fetch@^4.0.0, npm-registry-fetch@^4.0.4:
- version "4.0.4"
- resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-4.0.4.tgz#2da1ecf3f43d419d96abf313664291a4623d3ea5"
- integrity sha512-6jb34hX/iYNQebqWUHtU8YF6Cjb1H6ouTFPClYsyiW6lpFkljTpdeftm53rRojtja1rKAvKNIIiTS5Sjpw4wsA==
- dependencies:
- JSONStream "^1.3.4"
- bluebird "^3.5.1"
- figgy-pudding "^3.4.1"
- lru-cache "^5.1.1"
- make-fetch-happen "^5.0.0"
- npm-package-arg "^6.1.0"
- safe-buffer "^5.2.0"
-
-npm-run-path@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
- integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
- dependencies:
- path-key "^2.0.0"
-
-npm-run-path@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
- integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
- dependencies:
- path-key "^3.0.0"
-
-npm-user-validate@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.0.tgz#8ceca0f5cea04d4e93519ef72d0557a75122e951"
- integrity sha1-jOyg9c6gTU6TUZ73LQVXp1Ei6VE=
-
-npm@^6.10.3:
- version "6.14.5"
- resolved "https://registry.yarnpkg.com/npm/-/npm-6.14.5.tgz#2cc59a3158cdd8461b486d0584c74ab554567219"
- integrity sha512-CDwa3FJd0XJpKDbWCST484H+mCNjF26dPrU+xnREW+upR0UODjMEfXPl3bxWuAwZIX6c2ASg1plLO7jP8ehWeA==
- dependencies:
- JSONStream "^1.3.5"
- abbrev "~1.1.1"
- ansicolors "~0.3.2"
- ansistyles "~0.1.3"
- aproba "^2.0.0"
- archy "~1.0.0"
- bin-links "^1.1.7"
- bluebird "^3.5.5"
- byte-size "^5.0.1"
- cacache "^12.0.3"
- call-limit "^1.1.1"
- chownr "^1.1.4"
- ci-info "^2.0.0"
- cli-columns "^3.1.2"
- cli-table3 "^0.5.1"
- cmd-shim "^3.0.3"
- columnify "~1.5.4"
- config-chain "^1.1.12"
- detect-indent "~5.0.0"
- detect-newline "^2.1.0"
- dezalgo "~1.0.3"
- editor "~1.0.0"
- figgy-pudding "^3.5.1"
- find-npm-prefix "^1.0.2"
- fs-vacuum "~1.2.10"
- fs-write-stream-atomic "~1.0.10"
- gentle-fs "^2.3.0"
- glob "^7.1.6"
- graceful-fs "^4.2.4"
- has-unicode "~2.0.1"
- hosted-git-info "^2.8.8"
- iferr "^1.0.2"
- infer-owner "^1.0.4"
- inflight "~1.0.6"
- inherits "^2.0.4"
- ini "^1.3.5"
- init-package-json "^1.10.3"
- is-cidr "^3.0.0"
- json-parse-better-errors "^1.0.2"
- lazy-property "~1.0.0"
- libcipm "^4.0.7"
- libnpm "^3.0.1"
- libnpmaccess "^3.0.2"
- libnpmhook "^5.0.3"
- libnpmorg "^1.0.1"
- libnpmsearch "^2.0.2"
- libnpmteam "^1.0.2"
- libnpx "^10.2.2"
- lock-verify "^2.1.0"
- lockfile "^1.0.4"
- lodash._baseuniq "~4.6.0"
- lodash.clonedeep "~4.5.0"
- lodash.union "~4.6.0"
- lodash.uniq "~4.5.0"
- lodash.without "~4.4.0"
- lru-cache "^5.1.1"
- meant "~1.0.1"
- mississippi "^3.0.0"
- mkdirp "^0.5.5"
- move-concurrently "^1.0.1"
- node-gyp "^5.1.0"
- nopt "^4.0.3"
- normalize-package-data "^2.5.0"
- npm-audit-report "^1.3.2"
- npm-cache-filename "~1.0.2"
- npm-install-checks "^3.0.2"
- npm-lifecycle "^3.1.4"
- npm-package-arg "^6.1.1"
- npm-packlist "^1.4.8"
- npm-pick-manifest "^3.0.2"
- npm-profile "^4.0.4"
- npm-registry-fetch "^4.0.4"
- npm-user-validate "~1.0.0"
- npmlog "~4.1.2"
- once "~1.4.0"
- opener "^1.5.1"
- osenv "^0.1.5"
- pacote "^9.5.12"
- path-is-inside "~1.0.2"
- promise-inflight "~1.0.1"
- qrcode-terminal "^0.12.0"
- query-string "^6.8.2"
- qw "~1.0.1"
- read "~1.0.7"
- read-cmd-shim "^1.0.5"
- read-installed "~4.0.3"
- read-package-json "^2.1.1"
- read-package-tree "^5.3.1"
- readable-stream "^3.6.0"
- readdir-scoped-modules "^1.1.0"
- request "^2.88.0"
- retry "^0.12.0"
- rimraf "^2.7.1"
- safe-buffer "^5.1.2"
- semver "^5.7.1"
- sha "^3.0.0"
- slide "~1.1.6"
- sorted-object "~2.0.1"
- sorted-union-stream "~2.1.3"
- ssri "^6.0.1"
- stringify-package "^1.0.1"
- tar "^4.4.13"
- text-table "~0.2.0"
- tiny-relative-date "^1.3.0"
- uid-number "0.0.6"
- umask "~1.1.0"
- unique-filename "^1.1.1"
- unpipe "~1.0.0"
- update-notifier "^2.5.0"
- uuid "^3.3.3"
- validate-npm-package-license "^3.0.4"
- validate-npm-package-name "~3.0.0"
- which "^1.3.1"
- worker-farm "^1.7.0"
- write-file-atomic "^2.4.3"
-
-npmlog@^4.1.2, npmlog@~4.1.2:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
- integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
- dependencies:
- are-we-there-yet "~1.1.2"
- console-control-strings "~1.1.0"
- gauge "~2.7.3"
- set-blocking "~2.0.0"
-
-nth-check@^1.0.2, nth-check@~1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
- integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==
- dependencies:
- boolbase "~1.0.0"
-
-num2fraction@^1.2.2:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
- integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=
-
-number-is-nan@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
- integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
-
-nwsapi@^2.0.7, nwsapi@^2.1.3:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7"
- integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==
-
-oauth-sign@~0.9.0:
- version "0.9.0"
- resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
- integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
-
-object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
- integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
-
-object-copy@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
- integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
- dependencies:
- copy-descriptor "^0.1.0"
- define-property "^0.2.5"
- kind-of "^3.0.3"
-
-object-hash@^2.0.1:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.3.tgz#d12db044e03cd2ca3d77c0570d87225b02e1e6ea"
- integrity sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==
-
-object-inspect@^1.7.0:
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67"
- integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==
-
-object-is@^1.0.1:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6"
- integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==
- dependencies:
- define-properties "^1.1.3"
- es-abstract "^1.17.5"
-
-object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
- integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
-
-object-path@0.11.4:
- version "0.11.4"
- resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.4.tgz#370ae752fbf37de3ea70a861c23bba8915691949"
- integrity sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=
-
-object-visit@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
- integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
- dependencies:
- isobject "^3.0.0"
-
-object.assign@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
- integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
- dependencies:
- define-properties "^1.1.2"
- function-bind "^1.1.1"
- has-symbols "^1.0.0"
- object-keys "^1.0.11"
-
-object.entries@^1.1.0, object.entries@^1.1.1:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add"
- integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==
- dependencies:
- define-properties "^1.1.3"
- es-abstract "^1.17.5"
- has "^1.0.3"
-
-object.fromentries@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9"
- integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==
- dependencies:
- define-properties "^1.1.3"
- es-abstract "^1.17.0-next.1"
- function-bind "^1.1.1"
- has "^1.0.3"
-
-object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649"
- integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==
- dependencies:
- define-properties "^1.1.3"
- es-abstract "^1.17.0-next.1"
-
-object.pick@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
- integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
- dependencies:
- isobject "^3.0.1"
-
-object.values@^1.1.0, object.values@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e"
- integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==
- dependencies:
- define-properties "^1.1.3"
- es-abstract "^1.17.0-next.1"
- function-bind "^1.1.1"
- has "^1.0.3"
-
-oblivious-set@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/oblivious-set/-/oblivious-set-1.0.0.tgz#c8316f2c2fb6ff7b11b6158db3234c49f733c566"
- integrity sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==
-
-obuf@^1.0.0, obuf@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
- integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==
-
-octokit-pagination-methods@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz#cf472edc9d551055f9ef73f6e42b4dbb4c80bea4"
- integrity sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ==
-
-oidc-client@^1.10.1:
- version "1.10.1"
- resolved "https://registry.yarnpkg.com/oidc-client/-/oidc-client-1.10.1.tgz#fe67ae54924fc1c338062f3fd733be362026192c"
- integrity sha512-/QB5Nl7c9GmT9ir1E+OVY3+yZZnuk7Qa9ZEAJqSvDq0bAyAU9KAgeKipTEfKjGdGLTeOLy9FRWuNpULMkfZydQ==
- dependencies:
- base64-js "^1.3.0"
- core-js "^2.6.4"
- crypto-js "^3.1.9-1"
- uuid "^3.3.2"
-
-oidc-client@^1.11.5:
- version "1.11.5"
- resolved "https://registry.yarnpkg.com/oidc-client/-/oidc-client-1.11.5.tgz#020aa193d68a3e1f87a24fcbf50073b738de92bb"
- integrity sha512-LcKrKC8Av0m/KD/4EFmo9Sg8fSQ+WFJWBrmtWd+tZkNn3WT/sQG3REmPANE9tzzhbjW6VkTNy4xhAXCfPApAOg==
- dependencies:
- acorn "^7.4.1"
- base64-js "^1.5.1"
- core-js "^3.8.3"
- crypto-js "^4.0.0"
- serialize-javascript "^4.0.0"
-
-oidc-react@^1.5.1:
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/oidc-react/-/oidc-react-1.5.1.tgz#afe83335252b7657835298b80f5e4b8bbb8f5bd1"
- integrity sha512-rbNfWUBRiqolht9J5tRu5HktDs8yXii1KfOBXtM9uwQNaiY0UgvIzl2h7NNOYA04TFxKtGlXkwrs9cPn28JwEg==
- dependencies:
- oidc-client "^1.11.5"
-
-on-finished@~2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
- integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
- dependencies:
- ee-first "1.1.1"
-
-on-headers@~1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f"
- integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
-
-once@^1.3.0, once@^1.3.1, once@^1.4.0, once@~1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
- integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
- dependencies:
- wrappy "1"
-
-onetime@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
- integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=
- dependencies:
- mimic-fn "^1.0.0"
-
-onetime@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5"
- integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==
- dependencies:
- mimic-fn "^2.1.0"
-
-open@^7.0.2:
- version "7.0.4"
- resolved "https://registry.yarnpkg.com/open/-/open-7.0.4.tgz#c28a9d315e5c98340bf979fdcb2e58664aa10d83"
- integrity sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ==
- dependencies:
- is-docker "^2.0.0"
- is-wsl "^2.1.1"
-
-opener@^1.5.1:
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed"
- integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==
-
-opn@^5.5.0:
- version "5.5.0"
- resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc"
- integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==
- dependencies:
- is-wsl "^1.1.0"
-
-optimize-css-assets-webpack-plugin@5.0.3:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz#e2f1d4d94ad8c0af8967ebd7cf138dcb1ef14572"
- integrity sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==
- dependencies:
- cssnano "^4.1.10"
- last-call-webpack-plugin "^3.0.0"
-
-optionator@^0.8.1, optionator@^0.8.3:
- version "0.8.3"
- resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
- integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
- dependencies:
- deep-is "~0.1.3"
- fast-levenshtein "~2.0.6"
- levn "~0.3.0"
- prelude-ls "~1.1.2"
- type-check "~0.3.2"
- word-wrap "~1.2.3"
-
-original@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f"
- integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==
- dependencies:
- url-parse "^1.4.3"
-
-os-browserify@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
- integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=
-
-os-homedir@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
- integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
-
-os-locale@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
- integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==
- dependencies:
- execa "^0.7.0"
- lcid "^1.0.0"
- mem "^1.1.0"
-
-os-locale@^3.0.0, os-locale@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a"
- integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==
+ "tiny-warning" "^1.0.3"
+
+"mini-css-extract-plugin@0.9.0":
+ "integrity" "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A=="
+ "resolved" "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz"
+ "version" "0.9.0"
dependencies:
- execa "^1.0.0"
- lcid "^2.0.0"
- mem "^4.0.0"
-
-os-name@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801"
- integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==
- dependencies:
- macos-release "^2.2.0"
- windows-release "^3.1.0"
+ "loader-utils" "^1.1.0"
+ "normalize-url" "1.9.1"
+ "schema-utils" "^1.0.0"
+ "webpack-sources" "^1.1.0"
+
+"minimalistic-assert@^1.0.0", "minimalistic-assert@^1.0.1":
+ "integrity" "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
+ "resolved" "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz"
+ "version" "1.0.1"
-os-tmpdir@^1.0.0, os-tmpdir@~1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
- integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
-
-osenv@^0.1.4, osenv@^0.1.5:
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
- integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
- dependencies:
- os-homedir "^1.0.0"
- os-tmpdir "^1.0.0"
-
-p-defer@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c"
- integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=
-
-p-each-series@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71"
- integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=
- dependencies:
- p-reduce "^1.0.0"
-
-p-filter@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c"
- integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==
- dependencies:
- p-map "^2.0.0"
-
-p-finally@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
- integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
-
-p-finally@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561"
- integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==
-
-p-is-promise@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e"
- integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==
-
-p-is-promise@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-3.0.0.tgz#58e78c7dfe2e163cf2a04ff869e7c1dba64a5971"
- integrity sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==
-
-p-limit@^1.1.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
- integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
+"minimalistic-crypto-utils@^1.0.0", "minimalistic-crypto-utils@^1.0.1":
+ "integrity" "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
+ "resolved" "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz"
+ "version" "1.0.1"
+
+"minimatch@^3.0.4", "minimatch@3.0.4":
+ "integrity" "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA=="
+ "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz"
+ "version" "3.0.4"
+ dependencies:
+ "brace-expansion" "^1.1.7"
+
+"minimatch@^3.1.2":
+ "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="
+ "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
+ "version" "3.1.2"
+ dependencies:
+ "brace-expansion" "^1.1.7"
+
+"minimist-options@^4.0.2":
+ "integrity" "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A=="
+ "resolved" "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz"
+ "version" "4.1.0"
+ dependencies:
+ "arrify" "^1.0.1"
+ "is-plain-obj" "^1.1.0"
+ "kind-of" "^6.0.3"
+
+"minimist@^1.1.1", "minimist@^1.2.0", "minimist@^1.2.5", "minimist@1.2.5":
+ "integrity" "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+ "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz"
+ "version" "1.2.5"
+
+"minipass-collect@^1.0.2":
+ "integrity" "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA=="
+ "resolved" "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "minipass" "^3.0.0"
+
+"minipass-flush@^1.0.5":
+ "integrity" "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw=="
+ "resolved" "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz"
+ "version" "1.0.5"
+ dependencies:
+ "minipass" "^3.0.0"
+
+"minipass-pipeline@^1.2.2":
+ "integrity" "sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ=="
+ "resolved" "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz"
+ "version" "1.2.3"
+ dependencies:
+ "minipass" "^3.0.0"
+
+"minipass@^2.3.5":
+ "integrity" "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg=="
+ "resolved" "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz"
+ "version" "2.9.0"
+ dependencies:
+ "safe-buffer" "^5.1.2"
+ "yallist" "^3.0.0"
+
+"minipass@^2.6.0":
+ "integrity" "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg=="
+ "resolved" "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz"
+ "version" "2.9.0"
+ dependencies:
+ "safe-buffer" "^5.1.2"
+ "yallist" "^3.0.0"
+
+"minipass@^2.8.6":
+ "integrity" "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg=="
+ "resolved" "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz"
+ "version" "2.9.0"
+ dependencies:
+ "safe-buffer" "^5.1.2"
+ "yallist" "^3.0.0"
+
+"minipass@^2.9.0":
+ "integrity" "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg=="
+ "resolved" "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz"
+ "version" "2.9.0"
+ dependencies:
+ "safe-buffer" "^5.1.2"
+ "yallist" "^3.0.0"
+
+"minipass@^3.0.0", "minipass@^3.1.1":
+ "integrity" "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg=="
+ "resolved" "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz"
+ "version" "3.1.3"
+ dependencies:
+ "yallist" "^4.0.0"
+
+"minizlib@^1.2.1":
+ "integrity" "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q=="
+ "resolved" "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz"
+ "version" "1.3.3"
+ dependencies:
+ "minipass" "^2.9.0"
+
+"mississippi@^3.0.0":
+ "integrity" "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA=="
+ "resolved" "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "concat-stream" "^1.5.0"
+ "duplexify" "^3.4.2"
+ "end-of-stream" "^1.1.0"
+ "flush-write-stream" "^1.0.0"
+ "from2" "^2.1.0"
+ "parallel-transform" "^1.1.0"
+ "pump" "^3.0.0"
+ "pumpify" "^1.3.3"
+ "stream-each" "^1.1.0"
+ "through2" "^2.0.0"
+
+"mixin-deep@^1.2.0":
+ "integrity" "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA=="
+ "resolved" "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz"
+ "version" "1.3.2"
+ dependencies:
+ "for-in" "^1.0.2"
+ "is-extendable" "^1.0.1"
+
+"mixin-object@^2.0.1":
+ "integrity" "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4="
+ "resolved" "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz"
+ "version" "2.0.1"
+ dependencies:
+ "for-in" "^0.1.3"
+ "is-extendable" "^0.1.1"
+
+"mkdirp@^0.5.0", "mkdirp@^0.5.1", "mkdirp@^0.5.3", "mkdirp@^0.5.5", "mkdirp@~0.5.0", "mkdirp@~0.5.1":
+ "integrity" "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ=="
+ "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz"
+ "version" "0.5.5"
+ dependencies:
+ "minimist" "^1.2.5"
+
+"modify-values@^1.0.0":
+ "integrity" "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw=="
+ "resolved" "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz"
+ "version" "1.0.1"
+
+"moment-duration-format@2.3.2":
+ "integrity" "sha512-cBMXjSW+fjOb4tyaVHuaVE/A5TqkukDWiOfxxAjY+PEqmmBQlLwn+8OzwPiG3brouXKY5Un4pBjAeB6UToXHaQ=="
+ "resolved" "https://registry.npmjs.org/moment-duration-format/-/moment-duration-format-2.3.2.tgz"
+ "version" "2.3.2"
+
+"moment-timezone@^0.4.0", "moment-timezone@^0.4.1":
+ "integrity" "sha1-gfWYw61eIs2teWtn7NjYjQ9bqgY="
+ "resolved" "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.4.1.tgz"
+ "version" "0.4.1"
+ dependencies:
+ "moment" ">= 2.6.0"
+
+"moment-timezone@^0.5.28":
+ "integrity" "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA=="
+ "resolved" "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz"
+ "version" "0.5.31"
+ dependencies:
+ "moment" ">= 2.9.0"
+
+"moment@^2.10", "moment@^2.19.1", "moment@^2.22.2", "moment@>= 2.6.0", "moment@>= 2.9.0":
+ "integrity" "sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw=="
+ "resolved" "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz"
+ "version" "2.26.0"
+
+"move-concurrently@^1.0.1":
+ "integrity" "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I="
+ "resolved" "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "aproba" "^1.1.1"
+ "copy-concurrently" "^1.0.0"
+ "fs-write-stream-atomic" "^1.0.8"
+ "mkdirp" "^0.5.1"
+ "rimraf" "^2.5.4"
+ "run-queue" "^1.0.3"
+
+"ms@^2.0.0":
+ "version" "2.1.1"
+
+"ms@^2.1.1":
+ "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
+ "version" "2.1.2"
+
+"ms@2.0.0":
+ "integrity" "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ "resolved" "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
+ "version" "2.0.0"
+
+"ms@2.1.1":
+ "integrity" "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
+ "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz"
+ "version" "2.1.1"
+
+"multicast-dns-service-types@^1.1.0":
+ "integrity" "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE="
+ "resolved" "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz"
+ "version" "1.1.0"
+
+"multicast-dns@^6.0.1":
+ "integrity" "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g=="
+ "resolved" "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz"
+ "version" "6.2.3"
+ dependencies:
+ "dns-packet" "^1.3.1"
+ "thunky" "^1.0.2"
+
+"mute-stream@~0.0.4":
+ "version" "0.0.7"
+
+"mute-stream@0.0.7":
+ "integrity" "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
+ "resolved" "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz"
+ "version" "0.0.7"
+
+"mute-stream@0.0.8":
+ "integrity" "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
+ "resolved" "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz"
+ "version" "0.0.8"
+
+"nano-time@1.0.0":
+ "integrity" "sha1-sFVPaa2J4i0JB/ehKwmTpdlhN+8="
+ "resolved" "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "big-integer" "^1.6.16"
+
+"nanoid@2.1.11":
+ "integrity" "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA=="
+ "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz"
+ "version" "2.1.11"
+
+"nanomatch@^1.2.9":
+ "integrity" "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA=="
+ "resolved" "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz"
+ "version" "1.2.13"
+ dependencies:
+ "arr-diff" "^4.0.0"
+ "array-unique" "^0.3.2"
+ "define-property" "^2.0.2"
+ "extend-shallow" "^3.0.2"
+ "fragment-cache" "^0.2.1"
+ "is-windows" "^1.0.2"
+ "kind-of" "^6.0.2"
+ "object.pick" "^1.3.0"
+ "regex-not" "^1.0.0"
+ "snapdragon" "^0.8.1"
+ "to-regex" "^3.0.1"
+
+"natural-compare@^1.4.0":
+ "integrity" "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
+ "resolved" "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
+ "version" "1.4.0"
+
+"negotiator@0.6.2":
+ "integrity" "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
+ "resolved" "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz"
+ "version" "0.6.2"
+
+"neo-async@^2.5.0", "neo-async@^2.6.0", "neo-async@^2.6.1":
+ "integrity" "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw=="
+ "resolved" "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz"
+ "version" "2.6.1"
+
+"nerf-dart@^1.0.0":
+ "integrity" "sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo="
+ "resolved" "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz"
+ "version" "1.0.0"
+
+"next-tick@~1.0.0":
+ "integrity" "sha1-yobR/ogoFpsBICCOPchCS524NCw="
+ "resolved" "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz"
+ "version" "1.0.0"
+
+"next-tick@1":
+ "integrity" "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
+ "resolved" "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz"
+ "version" "1.1.0"
+
+"nice-try@^1.0.4":
+ "integrity" "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
+ "resolved" "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz"
+ "version" "1.0.5"
+
+"no-case@^3.0.3":
+ "integrity" "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw=="
+ "resolved" "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz"
+ "version" "3.0.3"
+ dependencies:
+ "lower-case" "^2.0.1"
+ "tslib" "^1.10.0"
+
+"node-emoji@^1.4.1":
+ "integrity" "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw=="
+ "resolved" "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz"
+ "version" "1.10.0"
+ dependencies:
+ "lodash.toarray" "^4.4.0"
+
+"node-fetch-npm@^2.0.2":
+ "version" "2.0.2"
+ dependencies:
+ "encoding" "^0.1.11"
+ "json-parse-better-errors" "^1.0.0"
+ "safe-buffer" "^5.1.1"
+
+"node-fetch@^1.0.1":
+ "integrity" "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ=="
+ "resolved" "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz"
+ "version" "1.7.3"
+ dependencies:
+ "encoding" "^0.1.11"
+ "is-stream" "^1.0.1"
+
+"node-fetch@^2.3.0", "node-fetch@2.6.0":
+ "integrity" "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA=="
+ "resolved" "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz"
+ "version" "2.6.0"
+
+"node-forge@0.9.0":
+ "integrity" "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ=="
+ "resolved" "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz"
+ "version" "0.9.0"
+
+"node-gyp@^5.0.2", "node-gyp@^5.1.0":
+ "integrity" "sha512-OUTryc5bt/P8zVgNUmC6xdXiDJxLMAW8cF5tLQOT9E5sOQj+UeQxnnPy74K3CLCa/SOjjBlbuzDLR8ANwA+wmw=="
+ "resolved" "https://registry.npmjs.org/node-gyp/-/node-gyp-5.1.0.tgz"
+ "version" "5.1.0"
+ dependencies:
+ "env-paths" "^2.2.0"
+ "glob" "^7.1.4"
+ "graceful-fs" "^4.2.2"
+ "mkdirp" "^0.5.1"
+ "nopt" "^4.0.1"
+ "npmlog" "^4.1.2"
+ "request" "^2.88.0"
+ "rimraf" "^2.6.3"
+ "semver" "^5.7.1"
+ "tar" "^4.4.12"
+ "which" "^1.3.1"
+
+"node-int64@^0.4.0":
+ "integrity" "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs="
+ "resolved" "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz"
+ "version" "0.4.0"
+
+"node-libs-browser@^2.2.1":
+ "integrity" "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q=="
+ "resolved" "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz"
+ "version" "2.2.1"
+ dependencies:
+ "assert" "^1.1.1"
+ "browserify-zlib" "^0.2.0"
+ "buffer" "^4.3.0"
+ "console-browserify" "^1.1.0"
+ "constants-browserify" "^1.0.0"
+ "crypto-browserify" "^3.11.0"
+ "domain-browser" "^1.1.1"
+ "events" "^3.0.0"
+ "https-browserify" "^1.0.0"
+ "os-browserify" "^0.3.0"
+ "path-browserify" "0.0.1"
+ "process" "^0.11.10"
+ "punycode" "^1.2.4"
+ "querystring-es3" "^0.2.0"
+ "readable-stream" "^2.3.3"
+ "stream-browserify" "^2.0.1"
+ "stream-http" "^2.7.2"
+ "string_decoder" "^1.0.0"
+ "timers-browserify" "^2.0.4"
+ "tty-browserify" "0.0.0"
+ "url" "^0.11.0"
+ "util" "^0.11.0"
+ "vm-browserify" "^1.0.1"
+
+"node-modules-regexp@^1.0.0":
+ "integrity" "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA="
+ "resolved" "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz"
+ "version" "1.0.0"
+
+"node-notifier@^5.4.2":
+ "integrity" "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q=="
+ "resolved" "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz"
+ "version" "5.4.3"
+ dependencies:
+ "growly" "^1.3.0"
+ "is-wsl" "^1.1.0"
+ "semver" "^5.5.0"
+ "shellwords" "^0.1.1"
+ "which" "^1.3.0"
+
+"node-releases@^1.1.52":
+ "integrity" "sha512-EVo605FhWLygH8a64TjgpjyHYOihkxECwX1bHHr8tETJKWEiWS2YJjPbvsX2jFjnjTNEgBCmk9mLjKG1Mf11cw=="
+ "resolved" "https://registry.npmjs.org/node-releases/-/node-releases-1.1.56.tgz"
+ "version" "1.1.56"
+
+"node-releases@^2.0.6":
+ "integrity" "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg=="
+ "resolved" "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz"
+ "version" "2.0.6"
+
+"nopt@^4.0.1", "nopt@^4.0.3":
+ "integrity" "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg=="
+ "resolved" "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz"
+ "version" "4.0.3"
+ dependencies:
+ "abbrev" "1"
+ "osenv" "^0.1.4"
+
+"normalize-package-data@^2.0.0", "normalize-package-data@^2.3.2", "normalize-package-data@^2.4.0", "normalize-package-data@^2.5.0":
+ "integrity" "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA=="
+ "resolved" "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz"
+ "version" "2.5.0"
+ dependencies:
+ "hosted-git-info" "^2.1.4"
+ "resolve" "^1.10.0"
+ "semver" "2 || 3 || 4 || 5"
+ "validate-npm-package-license" "^3.0.1"
+
+"normalize-path@^2.1.1":
+ "integrity" "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk="
+ "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz"
+ "version" "2.1.1"
+ dependencies:
+ "remove-trailing-separator" "^1.0.1"
+
+"normalize-path@^3.0.0", "normalize-path@~3.0.0":
+ "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
+ "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz"
+ "version" "3.0.0"
+
+"normalize-range@^0.1.2":
+ "integrity" "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI="
+ "resolved" "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz"
+ "version" "0.1.2"
+
+"normalize-url@^3.0.0":
+ "integrity" "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg=="
+ "resolved" "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz"
+ "version" "3.3.0"
+
+"normalize-url@^4.0.0":
+ "integrity" "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ=="
+ "resolved" "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz"
+ "version" "4.5.0"
+
+"normalize-url@1.9.1":
+ "integrity" "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw="
+ "resolved" "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz"
+ "version" "1.9.1"
+ dependencies:
+ "object-assign" "^4.0.1"
+ "prepend-http" "^1.0.0"
+ "query-string" "^4.1.0"
+ "sort-keys" "^1.0.0"
+
+"npm-audit-report@^1.3.2":
+ "version" "1.3.2"
+ dependencies:
+ "cli-table3" "^0.5.0"
+ "console-control-strings" "^1.1.0"
+
+"npm-bundled@^1.0.1":
+ "integrity" "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA=="
+ "resolved" "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz"
+ "version" "1.1.1"
+ dependencies:
+ "npm-normalize-package-bin" "^1.0.1"
+
+"npm-cache-filename@~1.0.2":
+ "integrity" "sha1-3tMGxbC/yHCp6fr4I7xfKD4FrhE="
+ "resolved" "https://registry.npmjs.org/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz"
+ "version" "1.0.2"
+
+"npm-install-checks@^3.0.2":
+ "integrity" "sha512-E4kzkyZDIWoin6uT5howP8VDvkM+E8IQDcHAycaAxMbwkqhIg5eEYALnXOl3Hq9MrkdQB/2/g1xwBINXdKSRkg=="
+ "resolved" "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-3.0.2.tgz"
+ "version" "3.0.2"
+ dependencies:
+ "semver" "^2.3.0 || 3.x || 4 || 5"
+
+"npm-lifecycle@^3.0.0", "npm-lifecycle@^3.1.4":
+ "version" "3.1.4"
+ dependencies:
+ "byline" "^5.0.0"
+ "graceful-fs" "^4.1.15"
+ "node-gyp" "^5.0.2"
+ "resolve-from" "^4.0.0"
+ "slide" "^1.1.6"
+ "uid-number" "0.0.6"
+ "umask" "^1.1.0"
+ "which" "^1.3.1"
+
+"npm-logical-tree@^1.2.1":
+ "integrity" "sha512-AJI/qxDB2PWI4LG1CYN579AY1vCiNyWfkiquCsJWqntRu/WwimVrC8yXeILBFHDwxfOejxewlmnvW9XXjMlYIg=="
+ "resolved" "https://registry.npmjs.org/npm-logical-tree/-/npm-logical-tree-1.2.1.tgz"
+ "version" "1.2.1"
+
+"npm-normalize-package-bin@^1.0.0", "npm-normalize-package-bin@^1.0.1":
+ "integrity" "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="
+ "resolved" "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz"
+ "version" "1.0.1"
+
+"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", "npm-package-arg@^6.0.0", "npm-package-arg@^6.1.0", "npm-package-arg@^6.1.1":
+ "integrity" "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg=="
+ "resolved" "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz"
+ "version" "6.1.1"
+ dependencies:
+ "hosted-git-info" "^2.7.1"
+ "osenv" "^0.1.5"
+ "semver" "^5.6.0"
+ "validate-npm-package-name" "^3.0.0"
+
+"npm-packlist@^1.1.12", "npm-packlist@^1.4.8":
+ "integrity" "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A=="
+ "resolved" "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz"
+ "version" "1.4.8"
+ dependencies:
+ "ignore-walk" "^3.0.1"
+ "npm-bundled" "^1.0.1"
+ "npm-normalize-package-bin" "^1.0.1"
+
+"npm-pick-manifest@^3.0.0", "npm-pick-manifest@^3.0.2":
+ "integrity" "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw=="
+ "resolved" "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz"
+ "version" "3.0.2"
+ dependencies:
+ "figgy-pudding" "^3.5.1"
+ "npm-package-arg" "^6.0.0"
+ "semver" "^5.4.1"
+
+"npm-profile@^4.0.2", "npm-profile@^4.0.4":
+ "integrity" "sha512-Ta8xq8TLMpqssF0H60BXS1A90iMoM6GeKwsmravJ6wYjWwSzcYBTdyWa3DZCYqPutacBMEm7cxiOkiIeCUAHDQ=="
+ "resolved" "https://registry.npmjs.org/npm-profile/-/npm-profile-4.0.4.tgz"
+ "version" "4.0.4"
+ dependencies:
+ "aproba" "^1.1.2 || 2"
+ "figgy-pudding" "^3.4.1"
+ "npm-registry-fetch" "^4.0.0"
+
+"npm-registry-fetch@^4.0.0", "npm-registry-fetch@^4.0.4":
+ "integrity" "sha512-6jb34hX/iYNQebqWUHtU8YF6Cjb1H6ouTFPClYsyiW6lpFkljTpdeftm53rRojtja1rKAvKNIIiTS5Sjpw4wsA=="
+ "resolved" "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.4.tgz"
+ "version" "4.0.4"
+ dependencies:
+ "bluebird" "^3.5.1"
+ "figgy-pudding" "^3.4.1"
+ "JSONStream" "^1.3.4"
+ "lru-cache" "^5.1.1"
+ "make-fetch-happen" "^5.0.0"
+ "npm-package-arg" "^6.1.0"
+ "safe-buffer" "^5.2.0"
+
+"npm-run-path@^2.0.0":
+ "integrity" "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8="
+ "resolved" "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz"
+ "version" "2.0.2"
+ dependencies:
+ "path-key" "^2.0.0"
+
+"npm-run-path@^4.0.0":
+ "integrity" "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="
+ "resolved" "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz"
+ "version" "4.0.1"
+ dependencies:
+ "path-key" "^3.0.0"
+
+"npm-user-validate@~1.0.0":
+ "integrity" "sha1-jOyg9c6gTU6TUZ73LQVXp1Ei6VE="
+ "resolved" "https://registry.npmjs.org/npm-user-validate/-/npm-user-validate-1.0.0.tgz"
+ "version" "1.0.0"
+
+"npm@^6.10.3":
+ "integrity" "sha512-CDwa3FJd0XJpKDbWCST484H+mCNjF26dPrU+xnREW+upR0UODjMEfXPl3bxWuAwZIX6c2ASg1plLO7jP8ehWeA=="
+ "resolved" "https://registry.npmjs.org/npm/-/npm-6.14.5.tgz"
+ "version" "6.14.5"
+ dependencies:
+ "abbrev" "~1.1.1"
+ "ansicolors" "~0.3.2"
+ "ansistyles" "~0.1.3"
+ "aproba" "^2.0.0"
+ "archy" "~1.0.0"
+ "bin-links" "^1.1.7"
+ "bluebird" "^3.5.5"
+ "byte-size" "^5.0.1"
+ "cacache" "^12.0.3"
+ "call-limit" "^1.1.1"
+ "chownr" "^1.1.4"
+ "ci-info" "^2.0.0"
+ "cli-columns" "^3.1.2"
+ "cli-table3" "^0.5.1"
+ "cmd-shim" "^3.0.3"
+ "columnify" "~1.5.4"
+ "config-chain" "^1.1.12"
+ "detect-indent" "~5.0.0"
+ "detect-newline" "^2.1.0"
+ "dezalgo" "~1.0.3"
+ "editor" "~1.0.0"
+ "figgy-pudding" "^3.5.1"
+ "find-npm-prefix" "^1.0.2"
+ "fs-vacuum" "~1.2.10"
+ "fs-write-stream-atomic" "~1.0.10"
+ "gentle-fs" "^2.3.0"
+ "glob" "^7.1.6"
+ "graceful-fs" "^4.2.4"
+ "has-unicode" "~2.0.1"
+ "hosted-git-info" "^2.8.8"
+ "iferr" "^1.0.2"
+ "infer-owner" "^1.0.4"
+ "inflight" "~1.0.6"
+ "inherits" "^2.0.4"
+ "ini" "^1.3.5"
+ "init-package-json" "^1.10.3"
+ "is-cidr" "^3.0.0"
+ "json-parse-better-errors" "^1.0.2"
+ "JSONStream" "^1.3.5"
+ "lazy-property" "~1.0.0"
+ "libcipm" "^4.0.7"
+ "libnpm" "^3.0.1"
+ "libnpmaccess" "^3.0.2"
+ "libnpmhook" "^5.0.3"
+ "libnpmorg" "^1.0.1"
+ "libnpmsearch" "^2.0.2"
+ "libnpmteam" "^1.0.2"
+ "libnpx" "^10.2.2"
+ "lock-verify" "^2.1.0"
+ "lockfile" "^1.0.4"
+ "lodash._baseuniq" "~4.6.0"
+ "lodash.clonedeep" "~4.5.0"
+ "lodash.union" "~4.6.0"
+ "lodash.uniq" "~4.5.0"
+ "lodash.without" "~4.4.0"
+ "lru-cache" "^5.1.1"
+ "meant" "~1.0.1"
+ "mississippi" "^3.0.0"
+ "mkdirp" "^0.5.5"
+ "move-concurrently" "^1.0.1"
+ "node-gyp" "^5.1.0"
+ "nopt" "^4.0.3"
+ "normalize-package-data" "^2.5.0"
+ "npm-audit-report" "^1.3.2"
+ "npm-cache-filename" "~1.0.2"
+ "npm-install-checks" "^3.0.2"
+ "npm-lifecycle" "^3.1.4"
+ "npm-package-arg" "^6.1.1"
+ "npm-packlist" "^1.4.8"
+ "npm-pick-manifest" "^3.0.2"
+ "npm-profile" "^4.0.4"
+ "npm-registry-fetch" "^4.0.4"
+ "npm-user-validate" "~1.0.0"
+ "npmlog" "~4.1.2"
+ "once" "~1.4.0"
+ "opener" "^1.5.1"
+ "osenv" "^0.1.5"
+ "pacote" "^9.5.12"
+ "path-is-inside" "~1.0.2"
+ "promise-inflight" "~1.0.1"
+ "qrcode-terminal" "^0.12.0"
+ "query-string" "^6.8.2"
+ "qw" "~1.0.1"
+ "read" "~1.0.7"
+ "read-cmd-shim" "^1.0.5"
+ "read-installed" "~4.0.3"
+ "read-package-json" "^2.1.1"
+ "read-package-tree" "^5.3.1"
+ "readable-stream" "^3.6.0"
+ "readdir-scoped-modules" "^1.1.0"
+ "request" "^2.88.0"
+ "retry" "^0.12.0"
+ "rimraf" "^2.7.1"
+ "safe-buffer" "^5.1.2"
+ "semver" "^5.7.1"
+ "sha" "^3.0.0"
+ "slide" "~1.1.6"
+ "sorted-object" "~2.0.1"
+ "sorted-union-stream" "~2.1.3"
+ "ssri" "^6.0.1"
+ "stringify-package" "^1.0.1"
+ "tar" "^4.4.13"
+ "text-table" "~0.2.0"
+ "tiny-relative-date" "^1.3.0"
+ "uid-number" "0.0.6"
+ "umask" "~1.1.0"
+ "unique-filename" "^1.1.1"
+ "unpipe" "~1.0.0"
+ "update-notifier" "^2.5.0"
+ "uuid" "^3.3.3"
+ "validate-npm-package-license" "^3.0.4"
+ "validate-npm-package-name" "~3.0.0"
+ "which" "^1.3.1"
+ "worker-farm" "^1.7.0"
+ "write-file-atomic" "^2.4.3"
+
+"npmlog@^4.1.2", "npmlog@~4.1.2":
+ "integrity" "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg=="
+ "resolved" "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz"
+ "version" "4.1.2"
+ dependencies:
+ "are-we-there-yet" "~1.1.2"
+ "console-control-strings" "~1.1.0"
+ "gauge" "~2.7.3"
+ "set-blocking" "~2.0.0"
+
+"nth-check@^1.0.2", "nth-check@~1.0.1":
+ "integrity" "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg=="
+ "resolved" "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "boolbase" "~1.0.0"
+
+"num2fraction@^1.2.2":
+ "integrity" "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4="
+ "resolved" "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz"
+ "version" "1.2.2"
+
+"number-is-nan@^1.0.0":
+ "integrity" "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
+ "resolved" "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz"
+ "version" "1.0.1"
+
+"nwsapi@^2.0.7", "nwsapi@^2.1.3":
+ "integrity" "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ=="
+ "resolved" "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz"
+ "version" "2.2.0"
+
+"oauth-sign@~0.9.0":
+ "integrity" "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
+ "resolved" "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz"
+ "version" "0.9.0"
+
+"object-assign@^4.0.1", "object-assign@^4.1.0", "object-assign@^4.1.1":
+ "integrity" "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
+ "version" "4.1.1"
+
+"object-copy@^0.1.0":
+ "integrity" "sha1-fn2Fi3gb18mRpBupde04EnVOmYw="
+ "resolved" "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz"
+ "version" "0.1.0"
+ dependencies:
+ "copy-descriptor" "^0.1.0"
+ "define-property" "^0.2.5"
+ "kind-of" "^3.0.3"
+
+"object-hash@^2.0.1":
+ "integrity" "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg=="
+ "resolved" "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz"
+ "version" "2.0.3"
+
+"object-inspect@^1.12.0", "object-inspect@^1.9.0":
+ "integrity" "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
+ "resolved" "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz"
+ "version" "1.12.2"
+
+"object-is@^1.0.1":
+ "integrity" "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ=="
+ "resolved" "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz"
+ "version" "1.1.2"
+ dependencies:
+ "define-properties" "^1.1.3"
+ "es-abstract" "^1.17.5"
+
+"object-keys@^1.0.12":
+ "version" "1.0.12"
+
+"object-keys@^1.1.1":
+ "integrity" "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
+ "resolved" "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz"
+ "version" "1.1.1"
+
+"object-path@0.11.4":
+ "integrity" "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk="
+ "resolved" "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz"
+ "version" "0.11.4"
+
+"object-visit@^1.0.0":
+ "integrity" "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs="
+ "resolved" "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "isobject" "^3.0.0"
+
+"object.assign@^4.1.0", "object.assign@^4.1.2", "object.assign@^4.1.3":
+ "integrity" "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ=="
+ "resolved" "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz"
+ "version" "4.1.4"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "define-properties" "^1.1.4"
+ "has-symbols" "^1.0.3"
+ "object-keys" "^1.1.1"
+
+"object.entries@^1.1.0", "object.entries@^1.1.1", "object.entries@^1.1.5":
+ "integrity" "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g=="
+ "resolved" "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz"
+ "version" "1.1.5"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "define-properties" "^1.1.3"
+ "es-abstract" "^1.19.1"
+
+"object.fromentries@^2.0.2", "object.fromentries@^2.0.5":
+ "integrity" "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw=="
+ "resolved" "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz"
+ "version" "2.0.5"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "define-properties" "^1.1.3"
+ "es-abstract" "^1.19.1"
+
+"object.getownpropertydescriptors@^2.0.3", "object.getownpropertydescriptors@^2.1.0":
+ "integrity" "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg=="
+ "resolved" "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "define-properties" "^1.1.3"
+ "es-abstract" "^1.17.0-next.1"
+
+"object.hasown@^1.1.1":
+ "integrity" "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A=="
+ "resolved" "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz"
+ "version" "1.1.1"
+ dependencies:
+ "define-properties" "^1.1.4"
+ "es-abstract" "^1.19.5"
+
+"object.pick@^1.3.0":
+ "integrity" "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c="
+ "resolved" "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz"
+ "version" "1.3.0"
+ dependencies:
+ "isobject" "^3.0.1"
+
+"object.values@^1.1.0", "object.values@^1.1.1", "object.values@^1.1.5":
+ "integrity" "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg=="
+ "resolved" "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz"
+ "version" "1.1.5"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "define-properties" "^1.1.3"
+ "es-abstract" "^1.19.1"
+
+"oblivious-set@1.0.0":
+ "integrity" "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw=="
+ "resolved" "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz"
+ "version" "1.0.0"
+
+"obuf@^1.0.0", "obuf@^1.1.2":
+ "integrity" "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="
+ "resolved" "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz"
+ "version" "1.1.2"
+
+"octokit-pagination-methods@^1.1.0":
+ "integrity" "sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ=="
+ "resolved" "https://registry.npmjs.org/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz"
+ "version" "1.1.0"
+
+"oidc-client@^1.10.1":
+ "integrity" "sha512-/QB5Nl7c9GmT9ir1E+OVY3+yZZnuk7Qa9ZEAJqSvDq0bAyAU9KAgeKipTEfKjGdGLTeOLy9FRWuNpULMkfZydQ=="
+ "resolved" "https://registry.npmjs.org/oidc-client/-/oidc-client-1.10.1.tgz"
+ "version" "1.10.1"
+ dependencies:
+ "base64-js" "^1.3.0"
+ "core-js" "^2.6.4"
+ "crypto-js" "^3.1.9-1"
+ "uuid" "^3.3.2"
+
+"oidc-client@^1.11.5":
+ "integrity" "sha512-LcKrKC8Av0m/KD/4EFmo9Sg8fSQ+WFJWBrmtWd+tZkNn3WT/sQG3REmPANE9tzzhbjW6VkTNy4xhAXCfPApAOg=="
+ "resolved" "https://registry.npmjs.org/oidc-client/-/oidc-client-1.11.5.tgz"
+ "version" "1.11.5"
+ dependencies:
+ "acorn" "^7.4.1"
+ "base64-js" "^1.5.1"
+ "core-js" "^3.8.3"
+ "crypto-js" "^4.0.0"
+ "serialize-javascript" "^4.0.0"
+
+"oidc-react@^1.5.1":
+ "integrity" "sha512-rbNfWUBRiqolht9J5tRu5HktDs8yXii1KfOBXtM9uwQNaiY0UgvIzl2h7NNOYA04TFxKtGlXkwrs9cPn28JwEg=="
+ "resolved" "https://registry.npmjs.org/oidc-react/-/oidc-react-1.5.1.tgz"
+ "version" "1.5.1"
+ dependencies:
+ "oidc-client" "^1.11.5"
+
+"on-finished@~2.3.0":
+ "integrity" "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc="
+ "resolved" "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz"
+ "version" "2.3.0"
+ dependencies:
+ "ee-first" "1.1.1"
+
+"on-headers@~1.0.2":
+ "integrity" "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
+ "resolved" "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz"
+ "version" "1.0.2"
+
+"once@^1.3.0", "once@^1.3.1", "once@^1.4.0", "once@~1.4.0":
+ "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E="
+ "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
+ "version" "1.4.0"
+ dependencies:
+ "wrappy" "1"
+
+"onetime@^2.0.0":
+ "integrity" "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ="
+ "resolved" "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz"
+ "version" "2.0.1"
+ dependencies:
+ "mimic-fn" "^1.0.0"
+
+"onetime@^5.1.0":
+ "integrity" "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q=="
+ "resolved" "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz"
+ "version" "5.1.0"
+ dependencies:
+ "mimic-fn" "^2.1.0"
+
+"open@^7.0.2":
+ "integrity" "sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ=="
+ "resolved" "https://registry.npmjs.org/open/-/open-7.0.4.tgz"
+ "version" "7.0.4"
+ dependencies:
+ "is-docker" "^2.0.0"
+ "is-wsl" "^2.1.1"
+
+"opener@^1.5.1":
+ "integrity" "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA=="
+ "resolved" "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz"
+ "version" "1.5.1"
+
+"opn@^5.5.0":
+ "integrity" "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA=="
+ "resolved" "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz"
+ "version" "5.5.0"
+ dependencies:
+ "is-wsl" "^1.1.0"
+
+"optimize-css-assets-webpack-plugin@5.0.3":
+ "integrity" "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA=="
+ "resolved" "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz"
+ "version" "5.0.3"
+ dependencies:
+ "cssnano" "^4.1.10"
+ "last-call-webpack-plugin" "^3.0.0"
+
+"optionator@^0.8.1", "optionator@^0.8.3":
+ "integrity" "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA=="
+ "resolved" "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz"
+ "version" "0.8.3"
+ dependencies:
+ "deep-is" "~0.1.3"
+ "fast-levenshtein" "~2.0.6"
+ "levn" "~0.3.0"
+ "prelude-ls" "~1.1.2"
+ "type-check" "~0.3.2"
+ "word-wrap" "~1.2.3"
+
+"original@^1.0.0":
+ "integrity" "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg=="
+ "resolved" "https://registry.npmjs.org/original/-/original-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "url-parse" "^1.4.3"
+
+"os-browserify@^0.3.0":
+ "integrity" "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc="
+ "resolved" "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz"
+ "version" "0.3.0"
+
+"os-homedir@^1.0.0":
+ "integrity" "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
+ "resolved" "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz"
+ "version" "1.0.2"
+
+"os-locale@^3.0.0":
+ "integrity" "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q=="
+ "resolved" "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "execa" "^1.0.0"
+ "lcid" "^2.0.0"
+ "mem" "^4.0.0"
+
+"os-locale@^3.1.0":
+ "integrity" "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q=="
+ "resolved" "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "execa" "^1.0.0"
+ "lcid" "^2.0.0"
+ "mem" "^4.0.0"
+
+"os-name@^3.1.0":
+ "integrity" "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg=="
+ "resolved" "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "macos-release" "^2.2.0"
+ "windows-release" "^3.1.0"
+
+"os-tmpdir@^1.0.0":
+ "integrity" "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+ "resolved" "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz"
+ "version" "1.0.2"
+
+"os-tmpdir@~1.0.2":
+ "integrity" "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+ "resolved" "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz"
+ "version" "1.0.2"
+
+"osenv@^0.1.4", "osenv@^0.1.5":
+ "integrity" "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g=="
+ "resolved" "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz"
+ "version" "0.1.5"
+ dependencies:
+ "os-homedir" "^1.0.0"
+ "os-tmpdir" "^1.0.0"
+
+"p-defer@^1.0.0":
+ "integrity" "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww="
+ "resolved" "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz"
+ "version" "1.0.0"
+
+"p-each-series@^1.0.0":
+ "integrity" "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E="
+ "resolved" "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "p-reduce" "^1.0.0"
+
+"p-filter@^2.0.0":
+ "integrity" "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw=="
+ "resolved" "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "p-map" "^2.0.0"
+
+"p-finally@^1.0.0":
+ "integrity" "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+ "resolved" "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz"
+ "version" "1.0.0"
+
+"p-finally@^2.0.0":
+ "integrity" "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw=="
+ "resolved" "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz"
+ "version" "2.0.1"
+
+"p-is-promise@^2.0.0":
+ "integrity" "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg=="
+ "resolved" "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz"
+ "version" "2.1.0"
+
+"p-is-promise@^3.0.0":
+ "integrity" "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ=="
+ "resolved" "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz"
+ "version" "3.0.0"
+
+"p-limit@^1.1.0":
+ "integrity" "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q=="
+ "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz"
+ "version" "1.3.0"
dependencies:
- p-try "^1.0.0"
+ "p-try" "^1.0.0"
-p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.2:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
- integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+"p-limit@^2.0.0", "p-limit@^2.2.0", "p-limit@^2.2.2":
+ "integrity" "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="
+ "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz"
+ "version" "2.3.0"
dependencies:
- p-try "^2.0.0"
-
-p-locate@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
- integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
+ "p-try" "^2.0.0"
+
+"p-locate@^2.0.0":
+ "integrity" "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM="
+ "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz"
+ "version" "2.0.0"
dependencies:
- p-limit "^1.1.0"
+ "p-limit" "^1.1.0"
-p-locate@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
- integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
+"p-locate@^3.0.0":
+ "integrity" "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ=="
+ "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz"
+ "version" "3.0.0"
dependencies:
- p-limit "^2.0.0"
+ "p-limit" "^2.0.0"
-p-locate@^4.0.0, p-locate@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
- integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+"p-locate@^4.0.0", "p-locate@^4.1.0":
+ "integrity" "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="
+ "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz"
+ "version" "4.1.0"
dependencies:
- p-limit "^2.2.0"
+ "p-limit" "^2.2.0"
-p-map@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175"
- integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==
+"p-map@^2.0.0":
+ "integrity" "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw=="
+ "resolved" "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz"
+ "version" "2.1.0"
-p-map@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d"
- integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==
+"p-map@^3.0.0":
+ "integrity" "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ=="
+ "resolved" "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz"
+ "version" "3.0.0"
dependencies:
- aggregate-error "^3.0.0"
+ "aggregate-error" "^3.0.0"
-p-reduce@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa"
- integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=
+"p-reduce@^1.0.0":
+ "integrity" "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo="
+ "resolved" "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz"
+ "version" "1.0.0"
-p-reduce@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-2.1.0.tgz#09408da49507c6c274faa31f28df334bc712b64a"
- integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==
+"p-reduce@^2.0.0":
+ "integrity" "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw=="
+ "resolved" "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz"
+ "version" "2.1.0"
-p-retry@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328"
- integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==
+"p-retry@^3.0.1":
+ "integrity" "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w=="
+ "resolved" "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz"
+ "version" "3.0.1"
dependencies:
- retry "^0.12.0"
+ "retry" "^0.12.0"
-p-retry@^4.0.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.2.0.tgz#ea9066c6b44f23cab4cd42f6147cdbbc6604da5d"
- integrity sha512-jPH38/MRh263KKcq0wBNOGFJbm+U6784RilTmHjB/HM9kH9V8WlCpVUcdOmip9cjXOh6MxZ5yk1z2SjDUJfWmA==
+"p-retry@^4.0.0":
+ "integrity" "sha512-jPH38/MRh263KKcq0wBNOGFJbm+U6784RilTmHjB/HM9kH9V8WlCpVUcdOmip9cjXOh6MxZ5yk1z2SjDUJfWmA=="
+ "resolved" "https://registry.npmjs.org/p-retry/-/p-retry-4.2.0.tgz"
+ "version" "4.2.0"
dependencies:
"@types/retry" "^0.12.0"
- retry "^0.12.0"
-
-p-try@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
- integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
-
-p-try@^2.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
- integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
-
-package-json@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
- integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=
- dependencies:
- got "^6.7.1"
- registry-auth-token "^3.0.1"
- registry-url "^3.0.3"
- semver "^5.1.0"
-
-pacote@^9.1.0, pacote@^9.5.12, pacote@^9.5.3:
- version "9.5.12"
- resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.5.12.tgz#1e11dd7a8d736bcc36b375a9804d41bb0377bf66"
- integrity sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==
- dependencies:
- bluebird "^3.5.3"
- cacache "^12.0.2"
- chownr "^1.1.2"
- figgy-pudding "^3.5.1"
- get-stream "^4.1.0"
- glob "^7.1.3"
- infer-owner "^1.0.4"
- lru-cache "^5.1.1"
- make-fetch-happen "^5.0.0"
- minimatch "^3.0.4"
- minipass "^2.3.5"
- mississippi "^3.0.0"
- mkdirp "^0.5.1"
- normalize-package-data "^2.4.0"
- npm-normalize-package-bin "^1.0.0"
- npm-package-arg "^6.1.0"
- npm-packlist "^1.1.12"
- npm-pick-manifest "^3.0.0"
- npm-registry-fetch "^4.0.0"
- osenv "^0.1.5"
- promise-inflight "^1.0.1"
- promise-retry "^1.1.1"
- protoduck "^5.0.1"
- rimraf "^2.6.2"
- safe-buffer "^5.1.2"
- semver "^5.6.0"
- ssri "^6.0.1"
- tar "^4.4.10"
- unique-filename "^1.1.1"
- which "^1.3.1"
-
-pako@~1.0.5:
- version "1.0.11"
- resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
- integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
-
-parallel-transform@^1.1.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc"
- integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==
- dependencies:
- cyclist "^1.0.1"
- inherits "^2.0.3"
- readable-stream "^2.1.5"
-
-param-case@^3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.3.tgz#4be41f8399eff621c56eebb829a5e451d9801238"
- integrity sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==
- dependencies:
- dot-case "^3.0.3"
- tslib "^1.10.0"
-
-parent-module@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
- integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
- dependencies:
- callsites "^3.0.0"
-
-parse-asn1@^5.0.0, parse-asn1@^5.1.5:
- version "5.1.5"
- resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e"
- integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==
- dependencies:
- asn1.js "^4.0.0"
- browserify-aes "^1.0.0"
- create-hash "^1.1.0"
- evp_bytestokey "^1.0.0"
- pbkdf2 "^3.0.3"
- safe-buffer "^5.1.1"
-
-parse-json@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
- integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
- dependencies:
- error-ex "^1.2.0"
-
-parse-json@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
- integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
- dependencies:
- error-ex "^1.3.1"
- json-parse-better-errors "^1.0.1"
-
-parse-json@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f"
- integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==
+ "retry" "^0.12.0"
+
+"p-try@^1.0.0":
+ "integrity" "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
+ "resolved" "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz"
+ "version" "1.0.0"
+
+"p-try@^2.0.0":
+ "integrity" "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+ "resolved" "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz"
+ "version" "2.2.0"
+
+"package-json@^4.0.0":
+ "integrity" "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0="
+ "resolved" "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz"
+ "version" "4.0.1"
+ dependencies:
+ "got" "^6.7.1"
+ "registry-auth-token" "^3.0.1"
+ "registry-url" "^3.0.3"
+ "semver" "^5.1.0"
+
+"pacote@^9.1.0", "pacote@^9.5.12", "pacote@^9.5.3":
+ "integrity" "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ=="
+ "resolved" "https://registry.npmjs.org/pacote/-/pacote-9.5.12.tgz"
+ "version" "9.5.12"
+ dependencies:
+ "bluebird" "^3.5.3"
+ "cacache" "^12.0.2"
+ "chownr" "^1.1.2"
+ "figgy-pudding" "^3.5.1"
+ "get-stream" "^4.1.0"
+ "glob" "^7.1.3"
+ "infer-owner" "^1.0.4"
+ "lru-cache" "^5.1.1"
+ "make-fetch-happen" "^5.0.0"
+ "minimatch" "^3.0.4"
+ "minipass" "^2.3.5"
+ "mississippi" "^3.0.0"
+ "mkdirp" "^0.5.1"
+ "normalize-package-data" "^2.4.0"
+ "npm-normalize-package-bin" "^1.0.0"
+ "npm-package-arg" "^6.1.0"
+ "npm-packlist" "^1.1.12"
+ "npm-pick-manifest" "^3.0.0"
+ "npm-registry-fetch" "^4.0.0"
+ "osenv" "^0.1.5"
+ "promise-inflight" "^1.0.1"
+ "promise-retry" "^1.1.1"
+ "protoduck" "^5.0.1"
+ "rimraf" "^2.6.2"
+ "safe-buffer" "^5.1.2"
+ "semver" "^5.6.0"
+ "ssri" "^6.0.1"
+ "tar" "^4.4.10"
+ "unique-filename" "^1.1.1"
+ "which" "^1.3.1"
+
+"pako@~1.0.5":
+ "integrity" "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
+ "resolved" "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz"
+ "version" "1.0.11"
+
+"parallel-transform@^1.1.0":
+ "integrity" "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg=="
+ "resolved" "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz"
+ "version" "1.2.0"
+ dependencies:
+ "cyclist" "^1.0.1"
+ "inherits" "^2.0.3"
+ "readable-stream" "^2.1.5"
+
+"param-case@^3.0.3":
+ "integrity" "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA=="
+ "resolved" "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz"
+ "version" "3.0.3"
+ dependencies:
+ "dot-case" "^3.0.3"
+ "tslib" "^1.10.0"
+
+"parent-module@^1.0.0":
+ "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="
+ "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "callsites" "^3.0.0"
+
+"parse-asn1@^5.0.0", "parse-asn1@^5.1.5":
+ "integrity" "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ=="
+ "resolved" "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz"
+ "version" "5.1.5"
+ dependencies:
+ "asn1.js" "^4.0.0"
+ "browserify-aes" "^1.0.0"
+ "create-hash" "^1.1.0"
+ "evp_bytestokey" "^1.0.0"
+ "pbkdf2" "^3.0.3"
+ "safe-buffer" "^5.1.1"
+
+"parse-json@^2.2.0":
+ "integrity" "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck="
+ "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz"
+ "version" "2.2.0"
+ dependencies:
+ "error-ex" "^1.2.0"
+
+"parse-json@^4.0.0":
+ "integrity" "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA="
+ "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz"
+ "version" "4.0.0"
+ dependencies:
+ "error-ex" "^1.3.1"
+ "json-parse-better-errors" "^1.0.1"
+
+"parse-json@^5.0.0":
+ "integrity" "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw=="
+ "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz"
+ "version" "5.0.0"
dependencies:
"@babel/code-frame" "^7.0.0"
- error-ex "^1.3.1"
- json-parse-better-errors "^1.0.1"
- lines-and-columns "^1.1.6"
-
-parse-passwd@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
- integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=
-
-parse5@4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608"
- integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==
-
-parse5@5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2"
- integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==
-
-parseurl@~1.3.2, parseurl@~1.3.3:
- version "1.3.3"
- resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
- integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
-
-pascal-case@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.1.tgz#5ac1975133ed619281e88920973d2cd1f279de5f"
- integrity sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==
- dependencies:
- no-case "^3.0.3"
- tslib "^1.10.0"
-
-pascalcase@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
- integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
-
-path-browserify@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a"
- integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==
-
-path-dirname@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
- integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
-
-path-exists@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
- integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
- dependencies:
- pinkie-promise "^2.0.0"
-
-path-exists@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
- integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
-
-path-exists@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
- integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
-
-path-is-absolute@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
- integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
-
-path-is-inside@^1.0.1, path-is-inside@^1.0.2, path-is-inside@~1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
- integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
-
-path-key@^2.0.0, path-key@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
- integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
-
-path-key@^3.0.0, path-key@^3.1.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
- integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
-
-path-parse@^1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
- integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
-
-path-to-regexp@0.1.7:
- version "0.1.7"
- resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
- integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
-
-path-to-regexp@^1.7.0:
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a"
- integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==
- dependencies:
- isarray "0.0.1"
-
-path-type@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
- integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=
- dependencies:
- pify "^2.0.0"
-
-path-type@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
- integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==
- dependencies:
- pify "^3.0.0"
-
-path-type@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
- integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
-
-patternfly-bootstrap-combobox@~1.1.7:
- version "1.1.7"
- resolved "https://registry.yarnpkg.com/patternfly-bootstrap-combobox/-/patternfly-bootstrap-combobox-1.1.7.tgz#6a5e3ccd1170c21b3c4b4aa168a7413e1ddbb6e1"
- integrity sha1-al48zRFwwhs8S0qhaKdBPh3btuE=
-
-patternfly-bootstrap-treeview@~2.1.10:
- version "2.1.10"
- resolved "https://registry.yarnpkg.com/patternfly-bootstrap-treeview/-/patternfly-bootstrap-treeview-2.1.10.tgz#f96043734bb4ecac951783e2745e3f9a8873ffd4"
- integrity sha512-P9+iFu34CwX+R5Fd7/EWbxTug0q9mDj53PnZIIh5ie54KX2kD0+54lCWtpD9SVylDwDtDv3n3A6gbFVkx7HsuA==
- dependencies:
- bootstrap "^3.4.1"
- jquery "^3.4.1"
-
-patternfly-react@^2.39.16:
- version "2.39.16"
- resolved "https://registry.yarnpkg.com/patternfly-react/-/patternfly-react-2.39.16.tgz#ceae9f9ffecbdbdb27307f48ac0bf636cab063e4"
- integrity sha512-1Om7jt+1CqWgH4O167OsAfVxts35epKwVfmtnmO0Dff1KiivKscVtnwMePJJvXrEeCIHFwWY2L7i2Avvh/3Xeg==
- dependencies:
- bootstrap-slider-without-jquery "^10.0.0"
- breakjs "^1.0.0"
- classnames "^2.2.5"
- css-element-queries "^1.0.1"
- lodash "^4.17.15"
- patternfly "^3.59.4"
- react-bootstrap "^0.33.0"
- react-bootstrap-switch "^15.5.3"
- react-bootstrap-typeahead "^3.4.1"
- react-c3js "^0.1.20"
- react-click-outside "^3.0.1"
- react-collapse "^4.0.3"
- react-debounce-input "^3.2.0"
- react-ellipsis-with-tooltip "^1.0.8"
- react-fontawesome "^1.6.1"
- react-motion "^0.5.2"
- reactabular-table "^8.14.0"
- recompose "^0.26.0"
- uuid "^3.3.2"
+ "error-ex" "^1.3.1"
+ "json-parse-better-errors" "^1.0.1"
+ "lines-and-columns" "^1.1.6"
+
+"parse-passwd@^1.0.0":
+ "integrity" "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY="
+ "resolved" "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz"
+ "version" "1.0.0"
+
+"parse5@4.0.0":
+ "integrity" "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA=="
+ "resolved" "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz"
+ "version" "4.0.0"
+
+"parse5@5.1.0":
+ "integrity" "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ=="
+ "resolved" "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz"
+ "version" "5.1.0"
+
+"parseurl@~1.3.2", "parseurl@~1.3.3":
+ "integrity" "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
+ "resolved" "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz"
+ "version" "1.3.3"
+
+"pascal-case@^3.1.1":
+ "integrity" "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA=="
+ "resolved" "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz"
+ "version" "3.1.1"
+ dependencies:
+ "no-case" "^3.0.3"
+ "tslib" "^1.10.0"
+
+"pascalcase@^0.1.1":
+ "integrity" "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+ "resolved" "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz"
+ "version" "0.1.1"
+
+"path-browserify@0.0.1":
+ "integrity" "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ=="
+ "resolved" "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz"
+ "version" "0.0.1"
+
+"path-dirname@^1.0.0":
+ "integrity" "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA="
+ "resolved" "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz"
+ "version" "1.0.2"
+
+"path-exists@^2.0.0":
+ "integrity" "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s="
+ "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "pinkie-promise" "^2.0.0"
+
+"path-exists@^3.0.0":
+ "integrity" "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+ "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz"
+ "version" "3.0.0"
+
+"path-exists@^4.0.0":
+ "integrity" "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+ "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz"
+ "version" "4.0.0"
+
+"path-is-absolute@^1.0.0":
+ "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+ "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
+ "version" "1.0.1"
+
+"path-is-inside@^1.0.1", "path-is-inside@^1.0.2", "path-is-inside@~1.0.2":
+ "integrity" "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
+ "resolved" "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz"
+ "version" "1.0.2"
+
+"path-key@^2.0.0", "path-key@^2.0.1":
+ "integrity" "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+ "resolved" "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz"
+ "version" "2.0.1"
+
+"path-key@^3.0.0", "path-key@^3.1.0":
+ "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+ "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
+ "version" "3.1.1"
+
+"path-parse@^1.0.6", "path-parse@^1.0.7":
+ "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+ "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"
+ "version" "1.0.7"
+
+"path-to-regexp@^1.7.0":
+ "integrity" "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA=="
+ "resolved" "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz"
+ "version" "1.8.0"
+ dependencies:
+ "isarray" "0.0.1"
+
+"path-to-regexp@0.1.7":
+ "integrity" "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
+ "resolved" "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz"
+ "version" "0.1.7"
+
+"path-type@^2.0.0":
+ "integrity" "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM="
+ "resolved" "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "pify" "^2.0.0"
+
+"path-type@^3.0.0":
+ "integrity" "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg=="
+ "resolved" "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "pify" "^3.0.0"
+
+"path-type@^4.0.0":
+ "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+ "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
+ "version" "4.0.0"
+
+"patternfly-bootstrap-combobox@~1.1.7":
+ "integrity" "sha1-al48zRFwwhs8S0qhaKdBPh3btuE="
+ "resolved" "https://registry.npmjs.org/patternfly-bootstrap-combobox/-/patternfly-bootstrap-combobox-1.1.7.tgz"
+ "version" "1.1.7"
+
+"patternfly-bootstrap-treeview@~2.1.10":
+ "integrity" "sha512-P9+iFu34CwX+R5Fd7/EWbxTug0q9mDj53PnZIIh5ie54KX2kD0+54lCWtpD9SVylDwDtDv3n3A6gbFVkx7HsuA=="
+ "resolved" "https://registry.npmjs.org/patternfly-bootstrap-treeview/-/patternfly-bootstrap-treeview-2.1.10.tgz"
+ "version" "2.1.10"
+ dependencies:
+ "bootstrap" "^3.4.1"
+ "jquery" "^3.4.1"
+
+"patternfly-react@^2.39.16":
+ "integrity" "sha512-aSeJ9jPzHFuTXLoI5uRJ1sh7DVC++em/dSezLR2yI3JVMd+ZB387kBk82FkunCt7WS4obIPGIdVq0Wh45dofSw=="
+ "resolved" "https://registry.npmjs.org/patternfly-react/-/patternfly-react-2.40.0.tgz"
+ "version" "2.40.0"
+ dependencies:
+ "bootstrap-slider-without-jquery" "^10.0.0"
+ "breakjs" "^1.0.0"
+ "classnames" "^2.2.5"
+ "css-element-queries" "^1.0.1"
+ "lodash" "^4.17.15"
+ "patternfly" "^3.59.4"
+ "react-bootstrap" "^0.33.0"
+ "react-bootstrap-switch" "^15.5.3"
+ "react-bootstrap-typeahead" "^3.4.1"
+ "react-c3js" "^0.1.20"
+ "react-click-outside" "^3.0.1"
+ "react-collapse" "^4.0.3"
+ "react-debounce-input" "^3.2.0"
+ "react-ellipsis-with-tooltip" "^1.0.8"
+ "react-fontawesome" "^1.6.1"
+ "react-motion" "^0.5.2"
+ "react-recompose" "^0.31.1"
+ "reactabular-table" "^8.14.0"
+ "uuid" "^3.3.2"
optionalDependencies:
- sortabular "^1.5.1"
- table-resolver "^3.2.0"
+ "sortabular" "^1.5.1"
+ "table-resolver" "^3.2.0"
-patternfly@^3.59.4:
- version "3.59.5"
- resolved "https://registry.yarnpkg.com/patternfly/-/patternfly-3.59.5.tgz#5f515a65b47c4a159d9c300f93134f7c523b8e86"
- integrity sha512-SMQynv9eFrWWG0Ujta5+jPjxHdQB3xkTLiDW5VP8XXc0nGUxXb4EnZh21qiMeGGJYaKpu9CzaPEpCvuBxgYWHQ==
+"patternfly@^3.59.4":
+ "integrity" "sha512-SMQynv9eFrWWG0Ujta5+jPjxHdQB3xkTLiDW5VP8XXc0nGUxXb4EnZh21qiMeGGJYaKpu9CzaPEpCvuBxgYWHQ=="
+ "resolved" "https://registry.npmjs.org/patternfly/-/patternfly-3.59.5.tgz"
+ "version" "3.59.5"
dependencies:
- bootstrap "~3.4.1"
- font-awesome "^4.7.0"
- jquery "~3.4.1"
+ "bootstrap" "~3.4.1"
+ "font-awesome" "^4.7.0"
+ "jquery" "~3.4.1"
optionalDependencies:
"@types/c3" "^0.6.0"
- bootstrap-datepicker "^1.7.1"
- bootstrap-sass "^3.4.0"
- bootstrap-select "1.12.2"
- bootstrap-slider "^9.9.0"
- bootstrap-switch "3.3.4"
- bootstrap-touchspin "~3.1.1"
- c3 "~0.4.11"
- d3 "~3.5.17"
- datatables.net "^1.10.15"
- datatables.net-colreorder "^1.4.1"
- datatables.net-colreorder-bs "~1.3.2"
- datatables.net-select "~1.2.0"
- drmonty-datatables-colvis "~1.1.2"
- eonasdan-bootstrap-datetimepicker "^4.17.47"
- font-awesome-sass "^4.7.0"
- google-code-prettify "~1.0.5"
- jquery-match-height "^0.7.2"
- moment "^2.19.1"
- moment-timezone "^0.4.1"
- patternfly-bootstrap-combobox "~1.1.7"
- patternfly-bootstrap-treeview "~2.1.10"
-
-pbkdf2@^3.0.3:
- version "3.0.17"
- resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6"
- integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==
- dependencies:
- create-hash "^1.1.2"
- create-hmac "^1.1.4"
- ripemd160 "^2.0.1"
- safe-buffer "^5.0.1"
- sha.js "^2.4.8"
-
-performance-now@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
- integrity sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=
-
-performance-now@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
- integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
-
-picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
- integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
-
-pify@^2.0.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
- integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
-
-pify@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
- integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
-
-pify@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
- integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
-
-pinkie-promise@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
- integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
- dependencies:
- pinkie "^2.0.0"
-
-pinkie@^2.0.0:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
- integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
-
-pirates@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87"
- integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==
- dependencies:
- node-modules-regexp "^1.0.0"
-
-pkg-conf@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.1.0.tgz#2126514ca6f2abfebd168596df18ba57867f0058"
- integrity sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=
- dependencies:
- find-up "^2.0.0"
- load-json-file "^4.0.0"
-
-pkg-dir@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4"
- integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q=
- dependencies:
- find-up "^1.0.0"
-
-pkg-dir@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
- integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=
- dependencies:
- find-up "^2.1.0"
-
-pkg-dir@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
- integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==
- dependencies:
- find-up "^3.0.0"
-
-pkg-dir@^4.1.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
- integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
- dependencies:
- find-up "^4.0.0"
-
-pkg-up@3.1.0, pkg-up@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5"
- integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==
- dependencies:
- find-up "^3.0.0"
-
-pkg-up@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f"
- integrity sha1-yBmscoBZpGHKscOImivjxJoATX8=
- dependencies:
- find-up "^2.1.0"
-
-pn@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
- integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==
-
-pnp-webpack-plugin@1.6.4:
- version "1.6.4"
- resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149"
- integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==
+ "bootstrap-datepicker" "^1.7.1"
+ "bootstrap-sass" "^3.4.0"
+ "bootstrap-select" "1.12.2"
+ "bootstrap-slider" "^9.9.0"
+ "bootstrap-switch" "3.3.4"
+ "bootstrap-touchspin" "~3.1.1"
+ "c3" "~0.4.11"
+ "d3" "~3.5.17"
+ "datatables.net" "^1.10.15"
+ "datatables.net-colreorder" "^1.4.1"
+ "datatables.net-colreorder-bs" "~1.3.2"
+ "datatables.net-select" "~1.2.0"
+ "drmonty-datatables-colvis" "~1.1.2"
+ "eonasdan-bootstrap-datetimepicker" "^4.17.47"
+ "font-awesome-sass" "^4.7.0"
+ "google-code-prettify" "~1.0.5"
+ "jquery-match-height" "^0.7.2"
+ "moment" "^2.19.1"
+ "moment-timezone" "^0.4.1"
+ "patternfly-bootstrap-combobox" "~1.1.7"
+ "patternfly-bootstrap-treeview" "~2.1.10"
+
+"pbkdf2@^3.0.3":
+ "integrity" "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA=="
+ "resolved" "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz"
+ "version" "3.0.17"
+ dependencies:
+ "create-hash" "^1.1.2"
+ "create-hmac" "^1.1.4"
+ "ripemd160" "^2.0.1"
+ "safe-buffer" "^5.0.1"
+ "sha.js" "^2.4.8"
+
+"performance-now@^0.2.0":
+ "integrity" "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU="
+ "resolved" "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz"
+ "version" "0.2.0"
+
+"performance-now@^2.1.0":
+ "integrity" "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+ "resolved" "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz"
+ "version" "2.1.0"
+
+"picocolors@^1.0.0":
+ "integrity" "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+ "resolved" "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz"
+ "version" "1.0.0"
+
+"picomatch@^2.0.4", "picomatch@^2.0.5", "picomatch@^2.2.1":
+ "integrity" "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
+ "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz"
+ "version" "2.2.2"
+
+"pify@^2.0.0":
+ "integrity" "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+ "resolved" "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz"
+ "version" "2.3.0"
+
+"pify@^3.0.0":
+ "integrity" "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
+ "resolved" "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz"
+ "version" "3.0.0"
+
+"pify@^4.0.1":
+ "integrity" "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="
+ "resolved" "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz"
+ "version" "4.0.1"
+
+"pinkie-promise@^2.0.0":
+ "integrity" "sha1-ITXW36ejWMBprJsXh3YogihFD/o="
+ "resolved" "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz"
+ "version" "2.0.1"
+ dependencies:
+ "pinkie" "^2.0.0"
+
+"pinkie@^2.0.0":
+ "integrity" "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
+ "resolved" "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz"
+ "version" "2.0.4"
+
+"pirates@^4.0.1":
+ "integrity" "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA=="
+ "resolved" "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz"
+ "version" "4.0.1"
+ dependencies:
+ "node-modules-regexp" "^1.0.0"
+
+"pkg-conf@^2.1.0":
+ "integrity" "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg="
+ "resolved" "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "find-up" "^2.0.0"
+ "load-json-file" "^4.0.0"
+
+"pkg-dir@^1.0.0":
+ "integrity" "sha1-ektQio1bstYp1EcFb/TpyTFM89Q="
+ "resolved" "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "find-up" "^1.0.0"
+
+"pkg-dir@^2.0.0":
+ "integrity" "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s="
+ "resolved" "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "find-up" "^2.1.0"
+
+"pkg-dir@^3.0.0":
+ "integrity" "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw=="
+ "resolved" "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "find-up" "^3.0.0"
+
+"pkg-dir@^4.1.0":
+ "integrity" "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="
+ "resolved" "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz"
+ "version" "4.2.0"
+ dependencies:
+ "find-up" "^4.0.0"
+
+"pkg-up@^3.1.0", "pkg-up@3.1.0":
+ "integrity" "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA=="
+ "resolved" "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "find-up" "^3.0.0"
+
+"pn@^1.1.0":
+ "integrity" "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA=="
+ "resolved" "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz"
+ "version" "1.1.0"
+
+"pnp-webpack-plugin@1.6.4":
+ "integrity" "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg=="
+ "resolved" "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz"
+ "version" "1.6.4"
dependencies:
- ts-pnp "^1.1.6"
+ "ts-pnp" "^1.1.6"
-popper.js@^1.14.4, popper.js@^1.16.0:
- version "1.16.1"
- resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b"
- integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==
+"popper.js@^1.14.4", "popper.js@^1.16.0":
+ "integrity" "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ=="
+ "resolved" "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz"
+ "version" "1.16.1"
-portfinder@^1.0.25:
- version "1.0.26"
- resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.26.tgz#475658d56ca30bed72ac7f1378ed350bd1b64e70"
- integrity sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ==
+"portfinder@^1.0.25":
+ "integrity" "sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ=="
+ "resolved" "https://registry.npmjs.org/portfinder/-/portfinder-1.0.26.tgz"
+ "version" "1.0.26"
dependencies:
- async "^2.6.2"
- debug "^3.1.1"
- mkdirp "^0.5.1"
+ "async" "^2.6.2"
+ "debug" "^3.1.1"
+ "mkdirp" "^0.5.1"
-posix-character-classes@^0.1.0:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
- integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
+"posix-character-classes@^0.1.0":
+ "integrity" "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
+ "resolved" "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz"
+ "version" "0.1.1"
-postcss-attribute-case-insensitive@^4.0.1:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880"
- integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==
+"postcss-attribute-case-insensitive@^4.0.1":
+ "integrity" "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA=="
+ "resolved" "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz"
+ "version" "4.0.2"
dependencies:
- postcss "^7.0.2"
- postcss-selector-parser "^6.0.2"
+ "postcss" "^7.0.2"
+ "postcss-selector-parser" "^6.0.2"
-postcss-browser-comments@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz#1248d2d935fb72053c8e1f61a84a57292d9f65e9"
- integrity sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==
+"postcss-browser-comments@^3.0.0":
+ "integrity" "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig=="
+ "resolved" "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz"
+ "version" "3.0.0"
dependencies:
- postcss "^7"
+ "postcss" "^7"
-postcss-calc@^7.0.1:
- version "7.0.2"
- resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.2.tgz#504efcd008ca0273120568b0792b16cdcde8aac1"
- integrity sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==
+"postcss-calc@^7.0.1":
+ "integrity" "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ=="
+ "resolved" "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz"
+ "version" "7.0.2"
dependencies:
- postcss "^7.0.27"
- postcss-selector-parser "^6.0.2"
- postcss-value-parser "^4.0.2"
+ "postcss" "^7.0.27"
+ "postcss-selector-parser" "^6.0.2"
+ "postcss-value-parser" "^4.0.2"
-postcss-color-functional-notation@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0"
- integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==
+"postcss-color-functional-notation@^2.0.1":
+ "integrity" "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g=="
+ "resolved" "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz"
+ "version" "2.0.1"
dependencies:
- postcss "^7.0.2"
- postcss-values-parser "^2.0.0"
+ "postcss" "^7.0.2"
+ "postcss-values-parser" "^2.0.0"
-postcss-color-gray@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547"
- integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==
+"postcss-color-gray@^5.0.0":
+ "integrity" "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw=="
+ "resolved" "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz"
+ "version" "5.0.0"
dependencies:
"@csstools/convert-colors" "^1.4.0"
- postcss "^7.0.5"
- postcss-values-parser "^2.0.0"
+ "postcss" "^7.0.5"
+ "postcss-values-parser" "^2.0.0"
-postcss-color-hex-alpha@^5.0.3:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388"
- integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==
+"postcss-color-hex-alpha@^5.0.3":
+ "integrity" "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw=="
+ "resolved" "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz"
+ "version" "5.0.3"
dependencies:
- postcss "^7.0.14"
- postcss-values-parser "^2.0.1"
+ "postcss" "^7.0.14"
+ "postcss-values-parser" "^2.0.1"
-postcss-color-mod-function@^3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d"
- integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==
+"postcss-color-mod-function@^3.0.3":
+ "integrity" "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ=="
+ "resolved" "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz"
+ "version" "3.0.3"
dependencies:
"@csstools/convert-colors" "^1.4.0"
- postcss "^7.0.2"
- postcss-values-parser "^2.0.0"
+ "postcss" "^7.0.2"
+ "postcss-values-parser" "^2.0.0"
-postcss-color-rebeccapurple@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77"
- integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==
+"postcss-color-rebeccapurple@^4.0.1":
+ "integrity" "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g=="
+ "resolved" "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz"
+ "version" "4.0.1"
dependencies:
- postcss "^7.0.2"
- postcss-values-parser "^2.0.0"
+ "postcss" "^7.0.2"
+ "postcss-values-parser" "^2.0.0"
-postcss-colormin@^4.0.3:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381"
- integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==
+"postcss-colormin@^4.0.3":
+ "integrity" "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw=="
+ "resolved" "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz"
+ "version" "4.0.3"
dependencies:
- browserslist "^4.0.0"
- color "^3.0.0"
- has "^1.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
+ "browserslist" "^4.0.0"
+ "color" "^3.0.0"
+ "has" "^1.0.0"
+ "postcss" "^7.0.0"
+ "postcss-value-parser" "^3.0.0"
-postcss-convert-values@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f"
- integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==
+"postcss-convert-values@^4.0.1":
+ "integrity" "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ=="
+ "resolved" "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz"
+ "version" "4.0.1"
dependencies:
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
+ "postcss" "^7.0.0"
+ "postcss-value-parser" "^3.0.0"
-postcss-custom-media@^7.0.8:
- version "7.0.8"
- resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c"
- integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==
+"postcss-custom-media@^7.0.8":
+ "integrity" "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg=="
+ "resolved" "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz"
+ "version" "7.0.8"
dependencies:
- postcss "^7.0.14"
+ "postcss" "^7.0.14"
-postcss-custom-properties@^8.0.11:
- version "8.0.11"
- resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97"
- integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==
+"postcss-custom-properties@^8.0.11":
+ "integrity" "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA=="
+ "resolved" "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz"
+ "version" "8.0.11"
dependencies:
- postcss "^7.0.17"
- postcss-values-parser "^2.0.1"
+ "postcss" "^7.0.17"
+ "postcss-values-parser" "^2.0.1"
-postcss-custom-selectors@^5.1.2:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba"
- integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==
+"postcss-custom-selectors@^5.1.2":
+ "integrity" "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w=="
+ "resolved" "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz"
+ "version" "5.1.2"
dependencies:
- postcss "^7.0.2"
- postcss-selector-parser "^5.0.0-rc.3"
+ "postcss" "^7.0.2"
+ "postcss-selector-parser" "^5.0.0-rc.3"
-postcss-dir-pseudo-class@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2"
- integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==
+"postcss-dir-pseudo-class@^5.0.0":
+ "integrity" "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw=="
+ "resolved" "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz"
+ "version" "5.0.0"
dependencies:
- postcss "^7.0.2"
- postcss-selector-parser "^5.0.0-rc.3"
+ "postcss" "^7.0.2"
+ "postcss-selector-parser" "^5.0.0-rc.3"
-postcss-discard-comments@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033"
- integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==
+"postcss-discard-comments@^4.0.2":
+ "integrity" "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg=="
+ "resolved" "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz"
+ "version" "4.0.2"
dependencies:
- postcss "^7.0.0"
+ "postcss" "^7.0.0"
-postcss-discard-duplicates@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb"
- integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==
+"postcss-discard-duplicates@^4.0.2":
+ "integrity" "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ=="
+ "resolved" "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz"
+ "version" "4.0.2"
dependencies:
- postcss "^7.0.0"
+ "postcss" "^7.0.0"
-postcss-discard-empty@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765"
- integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==
+"postcss-discard-empty@^4.0.1":
+ "integrity" "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w=="
+ "resolved" "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz"
+ "version" "4.0.1"
dependencies:
- postcss "^7.0.0"
+ "postcss" "^7.0.0"
-postcss-discard-overridden@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57"
- integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==
+"postcss-discard-overridden@^4.0.1":
+ "integrity" "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg=="
+ "resolved" "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz"
+ "version" "4.0.1"
dependencies:
- postcss "^7.0.0"
+ "postcss" "^7.0.0"
-postcss-double-position-gradients@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e"
- integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==
+"postcss-double-position-gradients@^1.0.0":
+ "integrity" "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA=="
+ "resolved" "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz"
+ "version" "1.0.0"
dependencies:
- postcss "^7.0.5"
- postcss-values-parser "^2.0.0"
+ "postcss" "^7.0.5"
+ "postcss-values-parser" "^2.0.0"
-postcss-env-function@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7"
- integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==
+"postcss-env-function@^2.0.2":
+ "integrity" "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw=="
+ "resolved" "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz"
+ "version" "2.0.2"
dependencies:
- postcss "^7.0.2"
- postcss-values-parser "^2.0.0"
+ "postcss" "^7.0.2"
+ "postcss-values-parser" "^2.0.0"
-postcss-flexbugs-fixes@4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz#e094a9df1783e2200b7b19f875dcad3b3aff8b20"
- integrity sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==
+"postcss-flexbugs-fixes@4.1.0":
+ "integrity" "sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA=="
+ "resolved" "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz"
+ "version" "4.1.0"
dependencies:
- postcss "^7.0.0"
+ "postcss" "^7.0.0"
-postcss-focus-visible@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e"
- integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==
+"postcss-focus-visible@^4.0.0":
+ "integrity" "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g=="
+ "resolved" "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz"
+ "version" "4.0.0"
dependencies:
- postcss "^7.0.2"
+ "postcss" "^7.0.2"
-postcss-focus-within@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680"
- integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==
+"postcss-focus-within@^3.0.0":
+ "integrity" "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w=="
+ "resolved" "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz"
+ "version" "3.0.0"
dependencies:
- postcss "^7.0.2"
+ "postcss" "^7.0.2"
-postcss-font-variant@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz#71dd3c6c10a0d846c5eda07803439617bbbabacc"
- integrity sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==
+"postcss-font-variant@^4.0.0":
+ "integrity" "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg=="
+ "resolved" "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz"
+ "version" "4.0.0"
dependencies:
- postcss "^7.0.2"
+ "postcss" "^7.0.2"
-postcss-gap-properties@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715"
- integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==
+"postcss-gap-properties@^2.0.0":
+ "integrity" "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg=="
+ "resolved" "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz"
+ "version" "2.0.0"
dependencies:
- postcss "^7.0.2"
+ "postcss" "^7.0.2"
-postcss-image-set-function@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288"
- integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==
+"postcss-image-set-function@^3.0.1":
+ "integrity" "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw=="
+ "resolved" "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz"
+ "version" "3.0.1"
dependencies:
- postcss "^7.0.2"
- postcss-values-parser "^2.0.0"
+ "postcss" "^7.0.2"
+ "postcss-values-parser" "^2.0.0"
-postcss-initial@^3.0.0:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.2.tgz#f018563694b3c16ae8eaabe3c585ac6319637b2d"
- integrity sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==
+"postcss-initial@^3.0.0":
+ "integrity" "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA=="
+ "resolved" "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz"
+ "version" "3.0.2"
dependencies:
- lodash.template "^4.5.0"
- postcss "^7.0.2"
+ "lodash.template" "^4.5.0"
+ "postcss" "^7.0.2"
-postcss-lab-function@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e"
- integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==
+"postcss-lab-function@^2.0.1":
+ "integrity" "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg=="
+ "resolved" "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz"
+ "version" "2.0.1"
dependencies:
"@csstools/convert-colors" "^1.4.0"
- postcss "^7.0.2"
- postcss-values-parser "^2.0.0"
-
-postcss-load-config@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003"
- integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==
- dependencies:
- cosmiconfig "^5.0.0"
- import-cwd "^2.0.0"
-
-postcss-loader@3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d"
- integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==
- dependencies:
- loader-utils "^1.1.0"
- postcss "^7.0.0"
- postcss-load-config "^2.0.0"
- schema-utils "^1.0.0"
-
-postcss-logical@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5"
- integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==
- dependencies:
- postcss "^7.0.2"
-
-postcss-media-minmax@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5"
- integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==
- dependencies:
- postcss "^7.0.2"
-
-postcss-merge-longhand@^4.0.11:
- version "4.0.11"
- resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24"
- integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==
- dependencies:
- css-color-names "0.0.4"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
- stylehacks "^4.0.0"
-
-postcss-merge-rules@^4.0.3:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650"
- integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==
- dependencies:
- browserslist "^4.0.0"
- caniuse-api "^3.0.0"
- cssnano-util-same-parent "^4.0.0"
- postcss "^7.0.0"
- postcss-selector-parser "^3.0.0"
- vendors "^1.0.0"
-
-postcss-minify-font-values@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6"
- integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==
- dependencies:
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-minify-gradients@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471"
- integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==
- dependencies:
- cssnano-util-get-arguments "^4.0.0"
- is-color-stop "^1.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-minify-params@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874"
- integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==
- dependencies:
- alphanum-sort "^1.0.0"
- browserslist "^4.0.0"
- cssnano-util-get-arguments "^4.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
- uniqs "^2.0.0"
-
-postcss-minify-selectors@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8"
- integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==
- dependencies:
- alphanum-sort "^1.0.0"
- has "^1.0.0"
- postcss "^7.0.0"
- postcss-selector-parser "^3.0.0"
-
-postcss-modules-extract-imports@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e"
- integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==
- dependencies:
- postcss "^7.0.5"
-
-postcss-modules-local-by-default@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915"
- integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==
- dependencies:
- icss-utils "^4.1.1"
- postcss "^7.0.16"
- postcss-selector-parser "^6.0.2"
- postcss-value-parser "^4.0.0"
-
-postcss-modules-scope@^2.1.1:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee"
- integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==
- dependencies:
- postcss "^7.0.6"
- postcss-selector-parser "^6.0.0"
-
-postcss-modules-values@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10"
- integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==
- dependencies:
- icss-utils "^4.0.0"
- postcss "^7.0.6"
-
-postcss-nesting@^7.0.0:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052"
- integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==
- dependencies:
- postcss "^7.0.2"
-
-postcss-normalize-charset@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4"
- integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==
- dependencies:
- postcss "^7.0.0"
-
-postcss-normalize-display-values@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a"
- integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==
- dependencies:
- cssnano-util-get-match "^4.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-normalize-positions@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f"
- integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==
- dependencies:
- cssnano-util-get-arguments "^4.0.0"
- has "^1.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-normalize-repeat-style@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c"
- integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==
- dependencies:
- cssnano-util-get-arguments "^4.0.0"
- cssnano-util-get-match "^4.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-normalize-string@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c"
- integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==
- dependencies:
- has "^1.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-normalize-timing-functions@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9"
- integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==
- dependencies:
- cssnano-util-get-match "^4.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-normalize-unicode@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb"
- integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==
- dependencies:
- browserslist "^4.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-normalize-url@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1"
- integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==
- dependencies:
- is-absolute-url "^2.0.0"
- normalize-url "^3.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-normalize-whitespace@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82"
- integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==
- dependencies:
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-normalize@8.0.1:
- version "8.0.1"
- resolved "https://registry.yarnpkg.com/postcss-normalize/-/postcss-normalize-8.0.1.tgz#90e80a7763d7fdf2da6f2f0f82be832ce4f66776"
- integrity sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==
+ "postcss" "^7.0.2"
+ "postcss-values-parser" "^2.0.0"
+
+"postcss-load-config@^2.0.0":
+ "integrity" "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q=="
+ "resolved" "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "cosmiconfig" "^5.0.0"
+ "import-cwd" "^2.0.0"
+
+"postcss-loader@3.0.0":
+ "integrity" "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA=="
+ "resolved" "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "loader-utils" "^1.1.0"
+ "postcss" "^7.0.0"
+ "postcss-load-config" "^2.0.0"
+ "schema-utils" "^1.0.0"
+
+"postcss-logical@^3.0.0":
+ "integrity" "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA=="
+ "resolved" "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "postcss" "^7.0.2"
+
+"postcss-media-minmax@^4.0.0":
+ "integrity" "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw=="
+ "resolved" "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz"
+ "version" "4.0.0"
+ dependencies:
+ "postcss" "^7.0.2"
+
+"postcss-merge-longhand@^4.0.11":
+ "integrity" "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw=="
+ "resolved" "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz"
+ "version" "4.0.11"
+ dependencies:
+ "css-color-names" "0.0.4"
+ "postcss" "^7.0.0"
+ "postcss-value-parser" "^3.0.0"
+ "stylehacks" "^4.0.0"
+
+"postcss-merge-rules@^4.0.3":
+ "integrity" "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ=="
+ "resolved" "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz"
+ "version" "4.0.3"
+ dependencies:
+ "browserslist" "^4.0.0"
+ "caniuse-api" "^3.0.0"
+ "cssnano-util-same-parent" "^4.0.0"
+ "postcss" "^7.0.0"
+ "postcss-selector-parser" "^3.0.0"
+ "vendors" "^1.0.0"
+
+"postcss-minify-font-values@^4.0.2":
+ "integrity" "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg=="
+ "resolved" "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz"
+ "version" "4.0.2"
+ dependencies:
+ "postcss" "^7.0.0"
+ "postcss-value-parser" "^3.0.0"
+
+"postcss-minify-gradients@^4.0.2":
+ "integrity" "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q=="
+ "resolved" "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz"
+ "version" "4.0.2"
+ dependencies:
+ "cssnano-util-get-arguments" "^4.0.0"
+ "is-color-stop" "^1.0.0"
+ "postcss" "^7.0.0"
+ "postcss-value-parser" "^3.0.0"
+
+"postcss-minify-params@^4.0.2":
+ "integrity" "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg=="
+ "resolved" "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz"
+ "version" "4.0.2"
+ dependencies:
+ "alphanum-sort" "^1.0.0"
+ "browserslist" "^4.0.0"
+ "cssnano-util-get-arguments" "^4.0.0"
+ "postcss" "^7.0.0"
+ "postcss-value-parser" "^3.0.0"
+ "uniqs" "^2.0.0"
+
+"postcss-minify-selectors@^4.0.2":
+ "integrity" "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g=="
+ "resolved" "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz"
+ "version" "4.0.2"
+ dependencies:
+ "alphanum-sort" "^1.0.0"
+ "has" "^1.0.0"
+ "postcss" "^7.0.0"
+ "postcss-selector-parser" "^3.0.0"
+
+"postcss-modules-extract-imports@^2.0.0":
+ "integrity" "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ=="
+ "resolved" "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "postcss" "^7.0.5"
+
+"postcss-modules-local-by-default@^3.0.2":
+ "integrity" "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ=="
+ "resolved" "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz"
+ "version" "3.0.2"
+ dependencies:
+ "icss-utils" "^4.1.1"
+ "postcss" "^7.0.16"
+ "postcss-selector-parser" "^6.0.2"
+ "postcss-value-parser" "^4.0.0"
+
+"postcss-modules-scope@^2.1.1":
+ "integrity" "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ=="
+ "resolved" "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz"
+ "version" "2.2.0"
+ dependencies:
+ "postcss" "^7.0.6"
+ "postcss-selector-parser" "^6.0.0"
+
+"postcss-modules-values@^3.0.0":
+ "integrity" "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg=="
+ "resolved" "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "icss-utils" "^4.0.0"
+ "postcss" "^7.0.6"
+
+"postcss-nesting@^7.0.0":
+ "integrity" "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg=="
+ "resolved" "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz"
+ "version" "7.0.1"
+ dependencies:
+ "postcss" "^7.0.2"
+
+"postcss-normalize-charset@^4.0.1":
+ "integrity" "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g=="
+ "resolved" "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz"
+ "version" "4.0.1"
+ dependencies:
+ "postcss" "^7.0.0"
+
+"postcss-normalize-display-values@^4.0.2":
+ "integrity" "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ=="
+ "resolved" "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz"
+ "version" "4.0.2"
+ dependencies:
+ "cssnano-util-get-match" "^4.0.0"
+ "postcss" "^7.0.0"
+ "postcss-value-parser" "^3.0.0"
+
+"postcss-normalize-positions@^4.0.2":
+ "integrity" "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA=="
+ "resolved" "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz"
+ "version" "4.0.2"
+ dependencies:
+ "cssnano-util-get-arguments" "^4.0.0"
+ "has" "^1.0.0"
+ "postcss" "^7.0.0"
+ "postcss-value-parser" "^3.0.0"
+
+"postcss-normalize-repeat-style@^4.0.2":
+ "integrity" "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q=="
+ "resolved" "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz"
+ "version" "4.0.2"
+ dependencies:
+ "cssnano-util-get-arguments" "^4.0.0"
+ "cssnano-util-get-match" "^4.0.0"
+ "postcss" "^7.0.0"
+ "postcss-value-parser" "^3.0.0"
+
+"postcss-normalize-string@^4.0.2":
+ "integrity" "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA=="
+ "resolved" "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz"
+ "version" "4.0.2"
+ dependencies:
+ "has" "^1.0.0"
+ "postcss" "^7.0.0"
+ "postcss-value-parser" "^3.0.0"
+
+"postcss-normalize-timing-functions@^4.0.2":
+ "integrity" "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A=="
+ "resolved" "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz"
+ "version" "4.0.2"
+ dependencies:
+ "cssnano-util-get-match" "^4.0.0"
+ "postcss" "^7.0.0"
+ "postcss-value-parser" "^3.0.0"
+
+"postcss-normalize-unicode@^4.0.1":
+ "integrity" "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg=="
+ "resolved" "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz"
+ "version" "4.0.1"
+ dependencies:
+ "browserslist" "^4.0.0"
+ "postcss" "^7.0.0"
+ "postcss-value-parser" "^3.0.0"
+
+"postcss-normalize-url@^4.0.1":
+ "integrity" "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA=="
+ "resolved" "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz"
+ "version" "4.0.1"
+ dependencies:
+ "is-absolute-url" "^2.0.0"
+ "normalize-url" "^3.0.0"
+ "postcss" "^7.0.0"
+ "postcss-value-parser" "^3.0.0"
+
+"postcss-normalize-whitespace@^4.0.2":
+ "integrity" "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA=="
+ "resolved" "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz"
+ "version" "4.0.2"
+ dependencies:
+ "postcss" "^7.0.0"
+ "postcss-value-parser" "^3.0.0"
+
+"postcss-normalize@8.0.1":
+ "integrity" "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ=="
+ "resolved" "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz"
+ "version" "8.0.1"
dependencies:
"@csstools/normalize.css" "^10.1.0"
- browserslist "^4.6.2"
- postcss "^7.0.17"
- postcss-browser-comments "^3.0.0"
- sanitize.css "^10.0.0"
-
-postcss-ordered-values@^4.1.2:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee"
- integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==
- dependencies:
- cssnano-util-get-arguments "^4.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-overflow-shorthand@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30"
- integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==
- dependencies:
- postcss "^7.0.2"
-
-postcss-page-break@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf"
- integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==
- dependencies:
- postcss "^7.0.2"
-
-postcss-place@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62"
- integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==
- dependencies:
- postcss "^7.0.2"
- postcss-values-parser "^2.0.0"
-
-postcss-preset-env@6.7.0:
- version "6.7.0"
- resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5"
- integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==
- dependencies:
- autoprefixer "^9.6.1"
- browserslist "^4.6.4"
- caniuse-lite "^1.0.30000981"
- css-blank-pseudo "^0.1.4"
- css-has-pseudo "^0.10.0"
- css-prefers-color-scheme "^3.1.1"
- cssdb "^4.4.0"
- postcss "^7.0.17"
- postcss-attribute-case-insensitive "^4.0.1"
- postcss-color-functional-notation "^2.0.1"
- postcss-color-gray "^5.0.0"
- postcss-color-hex-alpha "^5.0.3"
- postcss-color-mod-function "^3.0.3"
- postcss-color-rebeccapurple "^4.0.1"
- postcss-custom-media "^7.0.8"
- postcss-custom-properties "^8.0.11"
- postcss-custom-selectors "^5.1.2"
- postcss-dir-pseudo-class "^5.0.0"
- postcss-double-position-gradients "^1.0.0"
- postcss-env-function "^2.0.2"
- postcss-focus-visible "^4.0.0"
- postcss-focus-within "^3.0.0"
- postcss-font-variant "^4.0.0"
- postcss-gap-properties "^2.0.0"
- postcss-image-set-function "^3.0.1"
- postcss-initial "^3.0.0"
- postcss-lab-function "^2.0.1"
- postcss-logical "^3.0.0"
- postcss-media-minmax "^4.0.0"
- postcss-nesting "^7.0.0"
- postcss-overflow-shorthand "^2.0.0"
- postcss-page-break "^2.0.0"
- postcss-place "^4.0.1"
- postcss-pseudo-class-any-link "^6.0.0"
- postcss-replace-overflow-wrap "^3.0.0"
- postcss-selector-matches "^4.0.0"
- postcss-selector-not "^4.0.0"
-
-postcss-pseudo-class-any-link@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1"
- integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==
- dependencies:
- postcss "^7.0.2"
- postcss-selector-parser "^5.0.0-rc.3"
-
-postcss-reduce-initial@^4.0.3:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df"
- integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==
- dependencies:
- browserslist "^4.0.0"
- caniuse-api "^3.0.0"
- has "^1.0.0"
- postcss "^7.0.0"
-
-postcss-reduce-transforms@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29"
- integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==
- dependencies:
- cssnano-util-get-match "^4.0.0"
- has "^1.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-replace-overflow-wrap@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c"
- integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==
- dependencies:
- postcss "^7.0.2"
-
-postcss-safe-parser@4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz#8756d9e4c36fdce2c72b091bbc8ca176ab1fcdea"
- integrity sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==
- dependencies:
- postcss "^7.0.0"
-
-postcss-selector-matches@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff"
- integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==
- dependencies:
- balanced-match "^1.0.0"
- postcss "^7.0.2"
-
-postcss-selector-not@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz#c68ff7ba96527499e832724a2674d65603b645c0"
- integrity sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==
- dependencies:
- balanced-match "^1.0.0"
- postcss "^7.0.2"
-
-postcss-selector-parser@^3.0.0:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270"
- integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==
- dependencies:
- dot-prop "^5.2.0"
- indexes-of "^1.0.1"
- uniq "^1.0.1"
-
-postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c"
- integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==
- dependencies:
- cssesc "^2.0.0"
- indexes-of "^1.0.1"
- uniq "^1.0.1"
-
-postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2:
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c"
- integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==
- dependencies:
- cssesc "^3.0.0"
- indexes-of "^1.0.1"
- uniq "^1.0.1"
-
-postcss-svgo@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258"
- integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==
- dependencies:
- is-svg "^3.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
- svgo "^1.0.0"
-
-postcss-unique-selectors@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac"
- integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==
- dependencies:
- alphanum-sort "^1.0.0"
- postcss "^7.0.0"
- uniqs "^2.0.0"
-
-postcss-value-parser@^3.0.0:
- version "3.3.1"
- resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
- integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
-
-postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
- integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
-
-postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f"
- integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==
- dependencies:
- flatten "^1.0.2"
- indexes-of "^1.0.1"
- uniq "^1.0.1"
-
-postcss@7.0.21:
- version "7.0.21"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17"
- integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==
- dependencies:
- chalk "^2.4.2"
- source-map "^0.6.1"
- supports-color "^6.1.0"
-
-postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.23, postcss@^7.0.27, postcss@^7.0.30, postcss@^7.0.5, postcss@^7.0.6:
- version "7.0.30"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.30.tgz#cc9378beffe46a02cbc4506a0477d05fcea9a8e2"
- integrity sha512-nu/0m+NtIzoubO+xdAlwZl/u5S5vi/y6BCsoL8D+8IxsD3XvBS8X4YEADNIVXKVuQvduiucnRv+vPIqj56EGMQ==
- dependencies:
- chalk "^2.4.2"
- source-map "^0.6.1"
- supports-color "^6.1.0"
-
-prelude-ls@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
- integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
-
-prepend-http@^1.0.0, prepend-http@^1.0.1:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
- integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
-
-pretty-bytes@^5.1.0:
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2"
- integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==
-
-pretty-error@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3"
- integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=
- dependencies:
- renderkid "^2.0.1"
- utila "~0.4"
-
-pretty-format@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9"
- integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==
+ "browserslist" "^4.6.2"
+ "postcss" "^7.0.17"
+ "postcss-browser-comments" "^3.0.0"
+ "sanitize.css" "^10.0.0"
+
+"postcss-ordered-values@^4.1.2":
+ "integrity" "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw=="
+ "resolved" "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz"
+ "version" "4.1.2"
+ dependencies:
+ "cssnano-util-get-arguments" "^4.0.0"
+ "postcss" "^7.0.0"
+ "postcss-value-parser" "^3.0.0"
+
+"postcss-overflow-shorthand@^2.0.0":
+ "integrity" "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g=="
+ "resolved" "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "postcss" "^7.0.2"
+
+"postcss-page-break@^2.0.0":
+ "integrity" "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ=="
+ "resolved" "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "postcss" "^7.0.2"
+
+"postcss-place@^4.0.1":
+ "integrity" "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg=="
+ "resolved" "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz"
+ "version" "4.0.1"
+ dependencies:
+ "postcss" "^7.0.2"
+ "postcss-values-parser" "^2.0.0"
+
+"postcss-preset-env@6.7.0":
+ "integrity" "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg=="
+ "resolved" "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz"
+ "version" "6.7.0"
+ dependencies:
+ "autoprefixer" "^9.6.1"
+ "browserslist" "^4.6.4"
+ "caniuse-lite" "^1.0.30000981"
+ "css-blank-pseudo" "^0.1.4"
+ "css-has-pseudo" "^0.10.0"
+ "css-prefers-color-scheme" "^3.1.1"
+ "cssdb" "^4.4.0"
+ "postcss" "^7.0.17"
+ "postcss-attribute-case-insensitive" "^4.0.1"
+ "postcss-color-functional-notation" "^2.0.1"
+ "postcss-color-gray" "^5.0.0"
+ "postcss-color-hex-alpha" "^5.0.3"
+ "postcss-color-mod-function" "^3.0.3"
+ "postcss-color-rebeccapurple" "^4.0.1"
+ "postcss-custom-media" "^7.0.8"
+ "postcss-custom-properties" "^8.0.11"
+ "postcss-custom-selectors" "^5.1.2"
+ "postcss-dir-pseudo-class" "^5.0.0"
+ "postcss-double-position-gradients" "^1.0.0"
+ "postcss-env-function" "^2.0.2"
+ "postcss-focus-visible" "^4.0.0"
+ "postcss-focus-within" "^3.0.0"
+ "postcss-font-variant" "^4.0.0"
+ "postcss-gap-properties" "^2.0.0"
+ "postcss-image-set-function" "^3.0.1"
+ "postcss-initial" "^3.0.0"
+ "postcss-lab-function" "^2.0.1"
+ "postcss-logical" "^3.0.0"
+ "postcss-media-minmax" "^4.0.0"
+ "postcss-nesting" "^7.0.0"
+ "postcss-overflow-shorthand" "^2.0.0"
+ "postcss-page-break" "^2.0.0"
+ "postcss-place" "^4.0.1"
+ "postcss-pseudo-class-any-link" "^6.0.0"
+ "postcss-replace-overflow-wrap" "^3.0.0"
+ "postcss-selector-matches" "^4.0.0"
+ "postcss-selector-not" "^4.0.0"
+
+"postcss-pseudo-class-any-link@^6.0.0":
+ "integrity" "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew=="
+ "resolved" "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz"
+ "version" "6.0.0"
+ dependencies:
+ "postcss" "^7.0.2"
+ "postcss-selector-parser" "^5.0.0-rc.3"
+
+"postcss-reduce-initial@^4.0.3":
+ "integrity" "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA=="
+ "resolved" "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz"
+ "version" "4.0.3"
+ dependencies:
+ "browserslist" "^4.0.0"
+ "caniuse-api" "^3.0.0"
+ "has" "^1.0.0"
+ "postcss" "^7.0.0"
+
+"postcss-reduce-transforms@^4.0.2":
+ "integrity" "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg=="
+ "resolved" "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz"
+ "version" "4.0.2"
+ dependencies:
+ "cssnano-util-get-match" "^4.0.0"
+ "has" "^1.0.0"
+ "postcss" "^7.0.0"
+ "postcss-value-parser" "^3.0.0"
+
+"postcss-replace-overflow-wrap@^3.0.0":
+ "integrity" "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw=="
+ "resolved" "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "postcss" "^7.0.2"
+
+"postcss-safe-parser@4.0.1":
+ "integrity" "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ=="
+ "resolved" "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz"
+ "version" "4.0.1"
+ dependencies:
+ "postcss" "^7.0.0"
+
+"postcss-selector-matches@^4.0.0":
+ "integrity" "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww=="
+ "resolved" "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz"
+ "version" "4.0.0"
+ dependencies:
+ "balanced-match" "^1.0.0"
+ "postcss" "^7.0.2"
+
+"postcss-selector-not@^4.0.0":
+ "integrity" "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ=="
+ "resolved" "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz"
+ "version" "4.0.0"
+ dependencies:
+ "balanced-match" "^1.0.0"
+ "postcss" "^7.0.2"
+
+"postcss-selector-parser@^3.0.0":
+ "integrity" "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA=="
+ "resolved" "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz"
+ "version" "3.1.2"
+ dependencies:
+ "dot-prop" "^5.2.0"
+ "indexes-of" "^1.0.1"
+ "uniq" "^1.0.1"
+
+"postcss-selector-parser@^5.0.0-rc.3", "postcss-selector-parser@^5.0.0-rc.4":
+ "integrity" "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ=="
+ "resolved" "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz"
+ "version" "5.0.0"
+ dependencies:
+ "cssesc" "^2.0.0"
+ "indexes-of" "^1.0.1"
+ "uniq" "^1.0.1"
+
+"postcss-selector-parser@^6.0.0":
+ "integrity" "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg=="
+ "resolved" "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz"
+ "version" "6.0.2"
+ dependencies:
+ "cssesc" "^3.0.0"
+ "indexes-of" "^1.0.1"
+ "uniq" "^1.0.1"
+
+"postcss-selector-parser@^6.0.2":
+ "integrity" "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg=="
+ "resolved" "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz"
+ "version" "6.0.2"
+ dependencies:
+ "cssesc" "^3.0.0"
+ "indexes-of" "^1.0.1"
+ "uniq" "^1.0.1"
+
+"postcss-svgo@^4.0.2":
+ "integrity" "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw=="
+ "resolved" "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz"
+ "version" "4.0.2"
+ dependencies:
+ "is-svg" "^3.0.0"
+ "postcss" "^7.0.0"
+ "postcss-value-parser" "^3.0.0"
+ "svgo" "^1.0.0"
+
+"postcss-unique-selectors@^4.0.1":
+ "integrity" "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg=="
+ "resolved" "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz"
+ "version" "4.0.1"
+ dependencies:
+ "alphanum-sort" "^1.0.0"
+ "postcss" "^7.0.0"
+ "uniqs" "^2.0.0"
+
+"postcss-value-parser@^3.0.0":
+ "integrity" "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
+ "resolved" "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz"
+ "version" "3.3.1"
+
+"postcss-value-parser@^4.0.0":
+ "integrity" "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ=="
+ "resolved" "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz"
+ "version" "4.1.0"
+
+"postcss-value-parser@^4.0.2":
+ "integrity" "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ=="
+ "resolved" "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz"
+ "version" "4.1.0"
+
+"postcss-value-parser@^4.1.0":
+ "integrity" "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ=="
+ "resolved" "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz"
+ "version" "4.1.0"
+
+"postcss-values-parser@^2.0.0", "postcss-values-parser@^2.0.1":
+ "integrity" "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg=="
+ "resolved" "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz"
+ "version" "2.0.1"
+ dependencies:
+ "flatten" "^1.0.2"
+ "indexes-of" "^1.0.1"
+ "uniq" "^1.0.1"
+
+"postcss@^7", "postcss@^7.0.0", "postcss@^7.0.1", "postcss@^7.0.14", "postcss@^7.0.16", "postcss@^7.0.17", "postcss@^7.0.2", "postcss@^7.0.23", "postcss@^7.0.27", "postcss@^7.0.30", "postcss@^7.0.5", "postcss@^7.0.6":
+ "integrity" "sha512-nu/0m+NtIzoubO+xdAlwZl/u5S5vi/y6BCsoL8D+8IxsD3XvBS8X4YEADNIVXKVuQvduiucnRv+vPIqj56EGMQ=="
+ "resolved" "https://registry.npmjs.org/postcss/-/postcss-7.0.30.tgz"
+ "version" "7.0.30"
+ dependencies:
+ "chalk" "^2.4.2"
+ "source-map" "^0.6.1"
+ "supports-color" "^6.1.0"
+
+"postcss@7.0.21":
+ "integrity" "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ=="
+ "resolved" "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz"
+ "version" "7.0.21"
+ dependencies:
+ "chalk" "^2.4.2"
+ "source-map" "^0.6.1"
+ "supports-color" "^6.1.0"
+
+"prelude-ls@~1.1.2":
+ "integrity" "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
+ "resolved" "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz"
+ "version" "1.1.2"
+
+"prepend-http@^1.0.0":
+ "integrity" "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
+ "resolved" "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz"
+ "version" "1.0.4"
+
+"prepend-http@^1.0.1":
+ "integrity" "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
+ "resolved" "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz"
+ "version" "1.0.4"
+
+"pretty-bytes@^5.1.0":
+ "integrity" "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg=="
+ "resolved" "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz"
+ "version" "5.3.0"
+
+"pretty-error@^2.1.1":
+ "integrity" "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM="
+ "resolved" "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz"
+ "version" "2.1.1"
+ dependencies:
+ "renderkid" "^2.0.1"
+ "utila" "~0.4"
+
+"pretty-format@^24.9.0":
+ "integrity" "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA=="
+ "resolved" "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz"
+ "version" "24.9.0"
dependencies:
"@jest/types" "^24.9.0"
- ansi-regex "^4.0.0"
- ansi-styles "^3.2.0"
- react-is "^16.8.4"
-
-private@^0.1.8:
- version "0.1.8"
- resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
- integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
-
-process-nextick-args@~2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
- integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
-
-process@^0.11.10:
- version "0.11.10"
- resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
- integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
-
-progress@^2.0.0:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
- integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
-
-promise-inflight@^1.0.1, promise-inflight@~1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
- integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
-
-promise-retry@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d"
- integrity sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=
- dependencies:
- err-code "^1.0.0"
- retry "^0.10.0"
-
-promise@^7.1.1:
- version "7.3.1"
- resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
- integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==
- dependencies:
- asap "~2.0.3"
-
-promise@^8.0.3:
- version "8.1.0"
- resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e"
- integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==
- dependencies:
- asap "~2.0.6"
-
-prompts@^2.0.1:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068"
- integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==
- dependencies:
- kleur "^3.0.3"
- sisteransi "^1.0.4"
-
-promzard@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee"
- integrity sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=
- dependencies:
- read "1"
-
-prop-types-extra@^1.0.1, prop-types-extra@^1.1.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.1.tgz#58c3b74cbfbb95d304625975aa2f0848329a010b"
- integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==
- dependencies:
- react-is "^16.3.2"
- warning "^4.0.0"
-
-prop-types@^15.5.10, prop-types@^15.5.6, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2:
- version "15.7.2"
- resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
- integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
- dependencies:
- loose-envify "^1.4.0"
- object-assign "^4.1.1"
- react-is "^16.8.1"
-
-proto-list@~1.2.1:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
- integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
-
-protoduck@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-5.0.1.tgz#03c3659ca18007b69a50fd82a7ebcc516261151f"
- integrity sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==
- dependencies:
- genfun "^5.0.0"
-
-proxy-addr@~2.0.5:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
- integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==
- dependencies:
- forwarded "~0.1.2"
- ipaddr.js "1.9.1"
-
-prr@~1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
- integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
-
-pseudomap@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
- integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
-
-psl@^1.1.28:
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
- integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
-
-public-encrypt@^4.0.0:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
- integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
- dependencies:
- bn.js "^4.1.0"
- browserify-rsa "^4.0.0"
- create-hash "^1.1.0"
- parse-asn1 "^5.0.0"
- randombytes "^2.0.1"
- safe-buffer "^5.1.2"
-
-pump@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
- integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==
- dependencies:
- end-of-stream "^1.1.0"
- once "^1.3.1"
-
-pump@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
- integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
- dependencies:
- end-of-stream "^1.1.0"
- once "^1.3.1"
-
-pumpify@^1.3.3:
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
- integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==
- dependencies:
- duplexify "^3.6.0"
- inherits "^2.0.3"
- pump "^2.0.0"
-
-punycode@1.3.2:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
- integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
-
-punycode@^1.2.4:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
- integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
-
-punycode@^2.1.0, punycode@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
- integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
-
-pure-color@^1.2.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/pure-color/-/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e"
- integrity sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4=
-
-q@^1.1.2, q@^1.5.1:
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
- integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
-
-qrcode-terminal@^0.12.0:
- version "0.12.0"
- resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819"
- integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==
-
-qs@6.7.0:
- version "6.7.0"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
- integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
-
-qs@^6.3.0:
- version "6.9.4"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687"
- integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==
-
-qs@~6.5.2:
- version "6.5.2"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
- integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
-
-query-string@^4.1.0:
- version "4.3.4"
- resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
- integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s=
- dependencies:
- object-assign "^4.1.0"
- strict-uri-encode "^1.0.0"
-
-query-string@^6.8.2:
- version "6.12.1"
- resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.12.1.tgz#2ae4d272db4fba267141665374e49a1de09e8a7c"
- integrity sha512-OHj+zzfRMyj3rmo/6G8a5Ifvw3AleL/EbcHMD27YA31Q+cO5lfmQxECkImuNVjcskLcvBRVHNAB3w6udMs1eAA==
- dependencies:
- decode-uri-component "^0.2.0"
- split-on-first "^1.0.0"
- strict-uri-encode "^2.0.0"
-
-querystring-browser@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/querystring-browser/-/querystring-browser-1.0.4.tgz#f2e35881840a819bc7b1bf597faf0979e6622dc6"
- integrity sha1-8uNYgYQKgZvHsb9Zf68JeeZiLcY=
-
-querystring-es3@^0.2.0:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
- integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=
-
-querystring@0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
- integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
-
-querystringify@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e"
- integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==
-
-quick-lru@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
- integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
-
-qw@~1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/qw/-/qw-1.0.1.tgz#efbfdc740f9ad054304426acb183412cc8b996d4"
- integrity sha1-77/cdA+a0FQwRCassYNBLMi5ltQ=
-
-raf@^3.1.0, raf@^3.4.1:
- version "3.4.1"
- resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39"
- integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==
- dependencies:
- performance-now "^2.1.0"
-
-randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
- integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
- dependencies:
- safe-buffer "^5.1.0"
-
-randomfill@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
- integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
- dependencies:
- randombytes "^2.0.5"
- safe-buffer "^5.1.0"
-
-range-parser@^1.2.1, range-parser@~1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
- integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
-
-raw-body@2.4.0:
- version "2.4.0"
- resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
- integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
- dependencies:
- bytes "3.1.0"
- http-errors "1.7.2"
- iconv-lite "0.4.24"
- unpipe "1.0.0"
-
-rc@^1.0.1, rc@^1.1.6, rc@^1.2.8:
- version "1.2.8"
- resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
- integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
- dependencies:
- deep-extend "^0.6.0"
- ini "~1.3.0"
- minimist "^1.2.0"
- strip-json-comments "~2.0.1"
-
-react-app-polyfill@^1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz#890f8d7f2842ce6073f030b117de9130a5f385f0"
- integrity sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g==
- dependencies:
- core-js "^3.5.0"
- object-assign "^4.1.1"
- promise "^8.0.3"
- raf "^3.4.1"
- regenerator-runtime "^0.13.3"
- whatwg-fetch "^3.0.0"
-
-react-base16-styling@^0.6.0:
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.6.0.tgz#ef2156d66cf4139695c8a167886cb69ea660792c"
- integrity sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw=
- dependencies:
- base16 "^1.0.0"
- lodash.curry "^4.0.1"
- lodash.flow "^3.3.0"
- pure-color "^1.2.0"
-
-react-bootstrap-switch@^15.5.3:
- version "15.5.3"
- resolved "https://registry.yarnpkg.com/react-bootstrap-switch/-/react-bootstrap-switch-15.5.3.tgz#97287791d4ec0d1892d142542e7e5248002b1251"
- integrity sha1-lyh3kdTsDRiS0UJULn5SSAArElE=
-
-react-bootstrap-typeahead@^3.4.1:
- version "3.4.7"
- resolved "https://registry.yarnpkg.com/react-bootstrap-typeahead/-/react-bootstrap-typeahead-3.4.7.tgz#27a3f17c6b1351a0c1b321ac133d5e762cf4dc2a"
- integrity sha512-eUm3hqX12p+iM+1Y0HKF891/ACbKyGep7PsC2pjFGZL48r25Jlv3X2xmV5D8N0wE/YPFZF7iW913tyAlwqjw1Q==
- dependencies:
- classnames "^2.2.0"
- create-react-context "^0.3.0"
- escape-string-regexp "^1.0.5"
- invariant "^2.2.1"
- lodash "^4.17.2"
- prop-types "^15.5.8"
- prop-types-extra "^1.0.1"
- react-overlays "^0.8.1"
- react-popper "^1.0.0"
- warning "^4.0.1"
-
-react-bootstrap@^0.33.0:
- version "0.33.1"
- resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-0.33.1.tgz#e072592aa143b9792526281272eca754bc9a4940"
- integrity sha512-qWTRravSds87P8WC82tETy2yIso8qDqlIm0czsrduCaYAFtHuyLu0XDbUlfLXeRzqgwm5sRk2wRaTNoiVkk/YQ==
+ "ansi-regex" "^4.0.0"
+ "ansi-styles" "^3.2.0"
+ "react-is" "^16.8.4"
+
+"private@^0.1.8":
+ "integrity" "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="
+ "resolved" "https://registry.npmjs.org/private/-/private-0.1.8.tgz"
+ "version" "0.1.8"
+
+"process-nextick-args@~2.0.0":
+ "integrity" "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ "resolved" "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz"
+ "version" "2.0.1"
+
+"process@^0.11.10":
+ "integrity" "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
+ "resolved" "https://registry.npmjs.org/process/-/process-0.11.10.tgz"
+ "version" "0.11.10"
+
+"progress@^2.0.0":
+ "integrity" "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
+ "resolved" "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz"
+ "version" "2.0.3"
+
+"promise-inflight@^1.0.1", "promise-inflight@~1.0.1":
+ "integrity" "sha1-mEcocL8igTL8vdhoEputEsPAKeM="
+ "resolved" "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz"
+ "version" "1.0.1"
+
+"promise-retry@^1.1.1":
+ "integrity" "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0="
+ "resolved" "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz"
+ "version" "1.1.1"
+ dependencies:
+ "err-code" "^1.0.0"
+ "retry" "^0.10.0"
+
+"promise@^7.1.1":
+ "integrity" "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg=="
+ "resolved" "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz"
+ "version" "7.3.1"
+ dependencies:
+ "asap" "~2.0.3"
+
+"promise@^8.0.3":
+ "integrity" "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q=="
+ "resolved" "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz"
+ "version" "8.1.0"
+ dependencies:
+ "asap" "~2.0.6"
+
+"prompts@^2.0.1":
+ "integrity" "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA=="
+ "resolved" "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz"
+ "version" "2.3.2"
+ dependencies:
+ "kleur" "^3.0.3"
+ "sisteransi" "^1.0.4"
+
+"promzard@^0.3.0":
+ "integrity" "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4="
+ "resolved" "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz"
+ "version" "0.3.0"
+ dependencies:
+ "read" "1"
+
+"prop-types-extra@^1.0.1", "prop-types-extra@^1.1.0":
+ "integrity" "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew=="
+ "resolved" "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz"
+ "version" "1.1.1"
+ dependencies:
+ "react-is" "^16.3.2"
+ "warning" "^4.0.0"
+
+"prop-types@^15.0.0", "prop-types@^15.5.0", "prop-types@^15.5.10", "prop-types@^15.5.6", "prop-types@^15.5.8", "prop-types@^15.6.0", "prop-types@^15.6.1", "prop-types@^15.6.2", "prop-types@^15.7.2", "prop-types@^15.8.1":
+ "integrity" "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="
+ "resolved" "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz"
+ "version" "15.8.1"
+ dependencies:
+ "loose-envify" "^1.4.0"
+ "object-assign" "^4.1.1"
+ "react-is" "^16.13.1"
+
+"proto-list@~1.2.1":
+ "integrity" "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk="
+ "resolved" "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz"
+ "version" "1.2.4"
+
+"protoduck@^5.0.1":
+ "integrity" "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg=="
+ "resolved" "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz"
+ "version" "5.0.1"
+ dependencies:
+ "genfun" "^5.0.0"
+
+"proxy-addr@~2.0.5":
+ "integrity" "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw=="
+ "resolved" "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz"
+ "version" "2.0.6"
+ dependencies:
+ "forwarded" "~0.1.2"
+ "ipaddr.js" "1.9.1"
+
+"prr@~1.0.1":
+ "integrity" "sha1-0/wRS6BplaRexok/SEzrHXj19HY="
+ "resolved" "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz"
+ "version" "1.0.1"
+
+"pseudomap@^1.0.2":
+ "integrity" "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
+ "resolved" "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz"
+ "version" "1.0.2"
+
+"psl@^1.1.24":
+ "version" "1.1.29"
+
+"psl@^1.1.28":
+ "integrity" "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
+ "resolved" "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz"
+ "version" "1.8.0"
+
+"public-encrypt@^4.0.0":
+ "integrity" "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q=="
+ "resolved" "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz"
+ "version" "4.0.3"
+ dependencies:
+ "bn.js" "^4.1.0"
+ "browserify-rsa" "^4.0.0"
+ "create-hash" "^1.1.0"
+ "parse-asn1" "^5.0.0"
+ "randombytes" "^2.0.1"
+ "safe-buffer" "^5.1.2"
+
+"pump@^2.0.0":
+ "integrity" "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA=="
+ "resolved" "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz"
+ "version" "2.0.1"
+ dependencies:
+ "end-of-stream" "^1.1.0"
+ "once" "^1.3.1"
+
+"pump@^3.0.0":
+ "integrity" "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww=="
+ "resolved" "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "end-of-stream" "^1.1.0"
+ "once" "^1.3.1"
+
+"pumpify@^1.3.3":
+ "integrity" "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ=="
+ "resolved" "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz"
+ "version" "1.5.1"
+ dependencies:
+ "duplexify" "^3.6.0"
+ "inherits" "^2.0.3"
+ "pump" "^2.0.0"
+
+"punycode@^1.2.4":
+ "integrity" "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+ "resolved" "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz"
+ "version" "1.4.1"
+
+"punycode@^1.4.1":
+ "version" "1.4.1"
+
+"punycode@^2.1.0", "punycode@^2.1.1":
+ "integrity" "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+ "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz"
+ "version" "2.1.1"
+
+"punycode@1.3.2":
+ "integrity" "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
+ "resolved" "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz"
+ "version" "1.3.2"
+
+"pure-color@^1.2.0":
+ "integrity" "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4="
+ "resolved" "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz"
+ "version" "1.3.0"
+
+"q@^1.1.2", "q@^1.5.1":
+ "integrity" "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc="
+ "resolved" "https://registry.npmjs.org/q/-/q-1.5.1.tgz"
+ "version" "1.5.1"
+
+"qrcode-terminal@^0.12.0":
+ "integrity" "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ=="
+ "resolved" "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz"
+ "version" "0.12.0"
+
+"qs@^6.3.0":
+ "integrity" "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ=="
+ "resolved" "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz"
+ "version" "6.9.4"
+
+"qs@~6.5.2":
+ "integrity" "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
+ "resolved" "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz"
+ "version" "6.5.2"
+
+"qs@6.7.0":
+ "integrity" "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
+ "resolved" "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz"
+ "version" "6.7.0"
+
+"query-string@^4.1.0":
+ "integrity" "sha1-u7aTucqRXCMlFbIosaArYJBD2+s="
+ "resolved" "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz"
+ "version" "4.3.4"
+ dependencies:
+ "object-assign" "^4.1.0"
+ "strict-uri-encode" "^1.0.0"
+
+"query-string@^6.8.2":
+ "version" "6.8.2"
+ dependencies:
+ "decode-uri-component" "^0.2.0"
+ "split-on-first" "^1.0.0"
+ "strict-uri-encode" "^2.0.0"
+
+"querystring-browser@^1.0.4":
+ "integrity" "sha1-8uNYgYQKgZvHsb9Zf68JeeZiLcY="
+ "resolved" "https://registry.npmjs.org/querystring-browser/-/querystring-browser-1.0.4.tgz"
+ "version" "1.0.4"
+
+"querystring-es3@^0.2.0":
+ "integrity" "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM="
+ "resolved" "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz"
+ "version" "0.2.1"
+
+"querystring@0.2.0":
+ "integrity" "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
+ "resolved" "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz"
+ "version" "0.2.0"
+
+"querystringify@^2.1.1":
+ "integrity" "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA=="
+ "resolved" "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz"
+ "version" "2.1.1"
+
+"quick-lru@^4.0.1":
+ "integrity" "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g=="
+ "resolved" "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz"
+ "version" "4.0.1"
+
+"qw@~1.0.1":
+ "integrity" "sha1-77/cdA+a0FQwRCassYNBLMi5ltQ="
+ "resolved" "https://registry.npmjs.org/qw/-/qw-1.0.1.tgz"
+ "version" "1.0.1"
+
+"raf@^3.1.0", "raf@^3.4.1":
+ "integrity" "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA=="
+ "resolved" "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz"
+ "version" "3.4.1"
+ dependencies:
+ "performance-now" "^2.1.0"
+
+"randombytes@^2.0.0", "randombytes@^2.0.1", "randombytes@^2.0.5", "randombytes@^2.1.0":
+ "integrity" "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="
+ "resolved" "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "safe-buffer" "^5.1.0"
+
+"randomfill@^1.0.3":
+ "integrity" "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw=="
+ "resolved" "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz"
+ "version" "1.0.4"
+ dependencies:
+ "randombytes" "^2.0.5"
+ "safe-buffer" "^5.1.0"
+
+"range-parser@^1.2.1", "range-parser@~1.2.1":
+ "integrity" "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
+ "resolved" "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz"
+ "version" "1.2.1"
+
+"raw-body@2.4.0":
+ "integrity" "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q=="
+ "resolved" "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz"
+ "version" "2.4.0"
+ dependencies:
+ "bytes" "3.1.0"
+ "http-errors" "1.7.2"
+ "iconv-lite" "0.4.24"
+ "unpipe" "1.0.0"
+
+"rc@^1.0.1", "rc@^1.1.6":
+ "integrity" "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="
+ "resolved" "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz"
+ "version" "1.2.8"
+ dependencies:
+ "deep-extend" "^0.6.0"
+ "ini" "~1.3.0"
+ "minimist" "^1.2.0"
+ "strip-json-comments" "~2.0.1"
+
+"rc@^1.2.8":
+ "integrity" "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="
+ "resolved" "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz"
+ "version" "1.2.8"
+ dependencies:
+ "deep-extend" "^0.6.0"
+ "ini" "~1.3.0"
+ "minimist" "^1.2.0"
+ "strip-json-comments" "~2.0.1"
+
+"react-app-polyfill@^1.0.6":
+ "integrity" "sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g=="
+ "resolved" "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz"
+ "version" "1.0.6"
+ dependencies:
+ "core-js" "^3.5.0"
+ "object-assign" "^4.1.1"
+ "promise" "^8.0.3"
+ "raf" "^3.4.1"
+ "regenerator-runtime" "^0.13.3"
+ "whatwg-fetch" "^3.0.0"
+
+"react-base16-styling@^0.6.0":
+ "integrity" "sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw="
+ "resolved" "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz"
+ "version" "0.6.0"
+ dependencies:
+ "base16" "^1.0.0"
+ "lodash.curry" "^4.0.1"
+ "lodash.flow" "^3.3.0"
+ "pure-color" "^1.2.0"
+
+"react-bootstrap-switch@^15.5.3":
+ "integrity" "sha1-lyh3kdTsDRiS0UJULn5SSAArElE="
+ "resolved" "https://registry.npmjs.org/react-bootstrap-switch/-/react-bootstrap-switch-15.5.3.tgz"
+ "version" "15.5.3"
+
+"react-bootstrap-typeahead@^3.4.1":
+ "integrity" "sha512-eUm3hqX12p+iM+1Y0HKF891/ACbKyGep7PsC2pjFGZL48r25Jlv3X2xmV5D8N0wE/YPFZF7iW913tyAlwqjw1Q=="
+ "resolved" "https://registry.npmjs.org/react-bootstrap-typeahead/-/react-bootstrap-typeahead-3.4.7.tgz"
+ "version" "3.4.7"
+ dependencies:
+ "classnames" "^2.2.0"
+ "create-react-context" "^0.3.0"
+ "escape-string-regexp" "^1.0.5"
+ "invariant" "^2.2.1"
+ "lodash" "^4.17.2"
+ "prop-types" "^15.5.8"
+ "prop-types-extra" "^1.0.1"
+ "react-overlays" "^0.8.1"
+ "react-popper" "^1.0.0"
+ "warning" "^4.0.1"
+
+"react-bootstrap@^0.33.0", "react-bootstrap@0.31.x || 0.32.x":
+ "integrity" "sha512-qWTRravSds87P8WC82tETy2yIso8qDqlIm0czsrduCaYAFtHuyLu0XDbUlfLXeRzqgwm5sRk2wRaTNoiVkk/YQ=="
+ "resolved" "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-0.33.1.tgz"
+ "version" "0.33.1"
dependencies:
"@babel/runtime-corejs2" "^7.0.0"
- classnames "^2.2.5"
- dom-helpers "^3.2.0"
- invariant "^2.2.4"
- keycode "^2.2.0"
- prop-types "^15.6.1"
- prop-types-extra "^1.0.1"
- react-overlays "^0.9.0"
- react-prop-types "^0.4.0"
- react-transition-group "^2.0.0"
- uncontrollable "^7.0.2"
- warning "^3.0.0"
-
-react-c3js@^0.1.20:
- version "0.1.20"
- resolved "https://registry.yarnpkg.com/react-c3js/-/react-c3js-0.1.20.tgz#561bb211bd691be42af39726d11bab42d09f3e7b"
- integrity sha512-+jtEKJj6bFfD0pj3Vx0dDexpK3uGnZ/kLeJiuXYLBdHppx4tzpwAfMBDlQYQ5m4dqDi7jaovFaL2GX8vZRi+Gw==
- dependencies:
- c3 "^0.4.11"
-
-react-click-outside@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/react-click-outside/-/react-click-outside-3.0.1.tgz#6e77e84d2f17afaaac26dbad743cbbf909f5e24c"
- integrity sha512-d0KWFvBt+esoZUF15rL2UBB7jkeAqLU8L/Ny35oLK6fW6mIbOv/ChD+ExF4sR9PD26kVx+9hNfD0FTIqRZEyRQ==
- dependencies:
- hoist-non-react-statics "^2.1.1"
-
-react-collapse@^4.0.3:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/react-collapse/-/react-collapse-4.0.3.tgz#b96de959ed0092a43534630b599a4753dd76d543"
- integrity sha512-OO4NhtEqFtz+1ma31J1B7+ezdRnzHCZiTGSSd/Pxoks9hxrZYhzFEddeYt05A/1477xTtdrwo7xEa2FLJyWGCQ==
- dependencies:
- prop-types "^15.5.8"
-
-react-debounce-input@^3.2.0:
- version "3.2.2"
- resolved "https://registry.yarnpkg.com/react-debounce-input/-/react-debounce-input-3.2.2.tgz#d2cc99c1ce47fae89037965f5699edc1b0317197"
- integrity sha512-RIBu68Cq/gImKz/2h1cE042REDqyqj3D+7SJ3lnnIpJX0ht9D9PfH7KAnL+SgDz6hvKa9pZS2CnAxlkrLmnQlg==
- dependencies:
- lodash.debounce "^4"
- prop-types "^15.7.2"
-
-react-dev-utils@^10.2.1:
- version "10.2.1"
- resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-10.2.1.tgz#f6de325ae25fa4d546d09df4bb1befdc6dd19c19"
- integrity sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ==
+ "classnames" "^2.2.5"
+ "dom-helpers" "^3.2.0"
+ "invariant" "^2.2.4"
+ "keycode" "^2.2.0"
+ "prop-types" "^15.6.1"
+ "prop-types-extra" "^1.0.1"
+ "react-overlays" "^0.9.0"
+ "react-prop-types" "^0.4.0"
+ "react-transition-group" "^2.0.0"
+ "uncontrollable" "^7.0.2"
+ "warning" "^3.0.0"
+
+"react-c3js@^0.1.20":
+ "integrity" "sha512-+jtEKJj6bFfD0pj3Vx0dDexpK3uGnZ/kLeJiuXYLBdHppx4tzpwAfMBDlQYQ5m4dqDi7jaovFaL2GX8vZRi+Gw=="
+ "resolved" "https://registry.npmjs.org/react-c3js/-/react-c3js-0.1.20.tgz"
+ "version" "0.1.20"
+ dependencies:
+ "c3" "^0.4.11"
+
+"react-click-outside@^3.0.1":
+ "integrity" "sha512-d0KWFvBt+esoZUF15rL2UBB7jkeAqLU8L/Ny35oLK6fW6mIbOv/ChD+ExF4sR9PD26kVx+9hNfD0FTIqRZEyRQ=="
+ "resolved" "https://registry.npmjs.org/react-click-outside/-/react-click-outside-3.0.1.tgz"
+ "version" "3.0.1"
+ dependencies:
+ "hoist-non-react-statics" "^2.1.1"
+
+"react-collapse@^4.0.3":
+ "integrity" "sha512-OO4NhtEqFtz+1ma31J1B7+ezdRnzHCZiTGSSd/Pxoks9hxrZYhzFEddeYt05A/1477xTtdrwo7xEa2FLJyWGCQ=="
+ "resolved" "https://registry.npmjs.org/react-collapse/-/react-collapse-4.0.3.tgz"
+ "version" "4.0.3"
+ dependencies:
+ "prop-types" "^15.5.8"
+
+"react-debounce-input@^3.2.0":
+ "integrity" "sha512-RIBu68Cq/gImKz/2h1cE042REDqyqj3D+7SJ3lnnIpJX0ht9D9PfH7KAnL+SgDz6hvKa9pZS2CnAxlkrLmnQlg=="
+ "resolved" "https://registry.npmjs.org/react-debounce-input/-/react-debounce-input-3.2.2.tgz"
+ "version" "3.2.2"
+ dependencies:
+ "lodash.debounce" "^4"
+ "prop-types" "^15.7.2"
+
+"react-dev-utils@^10.2.1":
+ "integrity" "sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ=="
+ "resolved" "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.2.1.tgz"
+ "version" "10.2.1"
dependencies:
"@babel/code-frame" "7.8.3"
- address "1.1.2"
- browserslist "4.10.0"
- chalk "2.4.2"
- cross-spawn "7.0.1"
- detect-port-alt "1.1.6"
- escape-string-regexp "2.0.0"
- filesize "6.0.1"
- find-up "4.1.0"
- fork-ts-checker-webpack-plugin "3.1.1"
- global-modules "2.0.0"
- globby "8.0.2"
- gzip-size "5.1.1"
- immer "1.10.0"
- inquirer "7.0.4"
- is-root "2.1.0"
- loader-utils "1.2.3"
- open "^7.0.2"
- pkg-up "3.1.0"
- react-error-overlay "^6.0.7"
- recursive-readdir "2.2.2"
- shell-quote "1.7.2"
- strip-ansi "6.0.0"
- text-table "0.2.0"
-
-react-dom@^15.6.2:
- version "15.6.2"
- resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.6.2.tgz#41cfadf693b757faf2708443a1d1fd5a02bef730"
- integrity sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=
- dependencies:
- fbjs "^0.8.9"
- loose-envify "^1.1.0"
- object-assign "^4.1.0"
- prop-types "^15.5.10"
-
-react-dom@^16.13.1:
- version "16.13.1"
- resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f"
- integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==
- dependencies:
- loose-envify "^1.1.0"
- object-assign "^4.1.1"
- prop-types "^15.6.2"
- scheduler "^0.19.1"
-
-react-dropzone@9.0.0:
- version "9.0.0"
- resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-9.0.0.tgz#4f5223cdcb4d3bd8a66e3298c4041eb0c75c4634"
- integrity sha512-wZ2o9B2qkdE3RumWhfyZT9swgJYJPeU5qHEcMU8weYpmLex1eeWX0CC32/Y0VutB+BBi2D+iePV/YZIiB4kZGw==
- dependencies:
- attr-accept "^1.1.3"
- file-selector "^0.1.8"
- prop-types "^15.6.2"
- prop-types-extra "^1.1.0"
-
-react-ellipsis-with-tooltip@^1.0.8:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/react-ellipsis-with-tooltip/-/react-ellipsis-with-tooltip-1.1.1.tgz#8de6df1f43529a17f840ff9be0003f2080fb8df3"
- integrity sha512-7WheVWwfllxvRCAac9yhqSq+gWCbXM4UckNw1egEtuiIg362l4LNRoI0n0H92EL6lVK1W79ZE8qOyGjG3rQhfQ==
- dependencies:
- uuid "^3.1.0"
+ "address" "1.1.2"
+ "browserslist" "4.10.0"
+ "chalk" "2.4.2"
+ "cross-spawn" "7.0.1"
+ "detect-port-alt" "1.1.6"
+ "escape-string-regexp" "2.0.0"
+ "filesize" "6.0.1"
+ "find-up" "4.1.0"
+ "fork-ts-checker-webpack-plugin" "3.1.1"
+ "global-modules" "2.0.0"
+ "globby" "8.0.2"
+ "gzip-size" "5.1.1"
+ "immer" "1.10.0"
+ "inquirer" "7.0.4"
+ "is-root" "2.1.0"
+ "loader-utils" "1.2.3"
+ "open" "^7.0.2"
+ "pkg-up" "3.1.0"
+ "react-error-overlay" "^6.0.7"
+ "recursive-readdir" "2.2.2"
+ "shell-quote" "1.7.2"
+ "strip-ansi" "6.0.0"
+ "text-table" "0.2.0"
+
+"react-dom@^0.14.0 || ^15.2.0 || ^16.0.0", "react-dom@^0.14.9 || >=15.3.0", "react-dom@^15.5.0 || ^16.0.0", "react-dom@^15.6.2 || ^16.2.0", "react-dom@^16.13.1", "react-dom@^16.3.0", "react-dom@^16.8.0", "react-dom@^16.8.0 || ^17.0.0", "react-dom@^16.8.1", "react-dom@^17.0.0 || ^16.3.0 || ^15.5.4", "react-dom@>=15.0.0", "react-dom@>=15.5.0", "react-dom@>=16.3.0", "react-dom@>=16.6.0":
+ "integrity" "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag=="
+ "resolved" "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz"
+ "version" "16.13.1"
+ dependencies:
+ "loose-envify" "^1.1.0"
+ "object-assign" "^4.1.1"
+ "prop-types" "^15.6.2"
+ "scheduler" "^0.19.1"
+
+"react-dom@^15.6.2", "react-dom@>= 15":
+ "integrity" "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA="
+ "resolved" "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz"
+ "version" "15.6.2"
+ dependencies:
+ "fbjs" "^0.8.9"
+ "loose-envify" "^1.1.0"
+ "object-assign" "^4.1.0"
+ "prop-types" "^15.5.10"
+
+"react-dropzone@9.0.0":
+ "integrity" "sha512-wZ2o9B2qkdE3RumWhfyZT9swgJYJPeU5qHEcMU8weYpmLex1eeWX0CC32/Y0VutB+BBi2D+iePV/YZIiB4kZGw=="
+ "resolved" "https://registry.npmjs.org/react-dropzone/-/react-dropzone-9.0.0.tgz"
+ "version" "9.0.0"
+ dependencies:
+ "attr-accept" "^1.1.3"
+ "file-selector" "^0.1.8"
+ "prop-types" "^15.6.2"
+ "prop-types-extra" "^1.1.0"
+
+"react-ellipsis-with-tooltip@^1.0.8":
+ "integrity" "sha512-7WheVWwfllxvRCAac9yhqSq+gWCbXM4UckNw1egEtuiIg362l4LNRoI0n0H92EL6lVK1W79ZE8qOyGjG3rQhfQ=="
+ "resolved" "https://registry.npmjs.org/react-ellipsis-with-tooltip/-/react-ellipsis-with-tooltip-1.1.1.tgz"
+ "version" "1.1.1"
+ dependencies:
+ "uuid" "^3.1.0"
optionalDependencies:
- cz-conventional-changelog "^3.0.2"
- semantic-release "^15.13.1"
-
-react-error-overlay@^6.0.7:
- version "6.0.7"
- resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108"
- integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA==
-
-react-fast-compare@^2.0.0:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9"
- integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==
-
-react-fontawesome@^1.6.1:
- version "1.7.1"
- resolved "https://registry.yarnpkg.com/react-fontawesome/-/react-fontawesome-1.7.1.tgz#f74f5a338fef3ee3b379820109c1cba47290f035"
- integrity sha512-kottReWW1I9Uupub6A5YX4VK7qfpFnEjAcm5zB4Aepst7iofONT27GJYdTcRsj7q5uQu9PXBL7GsxAFKANNUVg==
- dependencies:
- prop-types "^15.5.6"
-
-react-height@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/react-height/-/react-height-3.0.1.tgz#2252652fb59468254751224ef1e94a2bb6e90d20"
- integrity sha512-tduavxh0UamJoK3MTguUxz7zu+hpuZ1m7JivfGKXUF1Wx8D5lURsDkrxzE5TfpzDOXEeqswH7n/P0wfKRUjYAQ==
- dependencies:
- prop-types "^15.5.8"
-
-react-immutable-proptypes@2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/react-immutable-proptypes/-/react-immutable-proptypes-2.1.0.tgz#023d6f39bb15c97c071e9e60d00d136eac5fa0b4"
- integrity sha1-Aj1vObsVyXwHHp5g0A0TbqxfoLQ=
-
-react-immutable-pure-component@^1.1.1:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/react-immutable-pure-component/-/react-immutable-pure-component-1.2.3.tgz#fa33638df68cfe9f73ccbee1d5861c17f3053f86"
- integrity sha512-kNy2A/fDrSuR8TKwB+4ynmItmp1vgF87tWxxfmadwDYo2J3ANipHqTjDIBvJvJ7libvuh76jIbvmK0krjtKH1g==
+ "cz-conventional-changelog" "^3.0.2"
+ "semantic-release" "^15.13.1"
+
+"react-error-overlay@^6.0.7":
+ "integrity" "sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA=="
+ "resolved" "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.7.tgz"
+ "version" "6.0.7"
+
+"react-fast-compare@^2.0.0":
+ "integrity" "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw=="
+ "resolved" "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz"
+ "version" "2.0.4"
+
+"react-fontawesome@^1.6.1":
+ "integrity" "sha512-kottReWW1I9Uupub6A5YX4VK7qfpFnEjAcm5zB4Aepst7iofONT27GJYdTcRsj7q5uQu9PXBL7GsxAFKANNUVg=="
+ "resolved" "https://registry.npmjs.org/react-fontawesome/-/react-fontawesome-1.7.1.tgz"
+ "version" "1.7.1"
+ dependencies:
+ "prop-types" "^15.5.6"
+
+"react-height@^3.0.0":
+ "integrity" "sha512-tduavxh0UamJoK3MTguUxz7zu+hpuZ1m7JivfGKXUF1Wx8D5lURsDkrxzE5TfpzDOXEeqswH7n/P0wfKRUjYAQ=="
+ "resolved" "https://registry.npmjs.org/react-height/-/react-height-3.0.1.tgz"
+ "version" "3.0.1"
+ dependencies:
+ "prop-types" "^15.5.8"
+
+"react-immutable-proptypes@2.1.0":
+ "integrity" "sha1-Aj1vObsVyXwHHp5g0A0TbqxfoLQ="
+ "resolved" "https://registry.npmjs.org/react-immutable-proptypes/-/react-immutable-proptypes-2.1.0.tgz"
+ "version" "2.1.0"
+
+"react-immutable-pure-component@^1.1.1":
+ "integrity" "sha512-kNy2A/fDrSuR8TKwB+4ynmItmp1vgF87tWxxfmadwDYo2J3ANipHqTjDIBvJvJ7libvuh76jIbvmK0krjtKH1g=="
+ "resolved" "https://registry.npmjs.org/react-immutable-pure-component/-/react-immutable-pure-component-1.2.3.tgz"
+ "version" "1.2.3"
optionalDependencies:
"@types/react" "16.4.6"
-react-input-autosize@^2.2.2:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.2.2.tgz#fcaa7020568ec206bc04be36f4eb68e647c4d8c2"
- integrity sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw==
- dependencies:
- prop-types "^15.5.8"
-
-react-inspector@^2.3.0:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-2.3.1.tgz#f0eb7f520669b545b441af9d38ec6d706e5f649c"
- integrity sha512-tUUK7t3KWgZEIUktOYko5Ic/oYwvjEvQUFAGC1UeMeDaQ5za2yZFtItJa2RTwBJB//NxPr000WQK6sEbqC6y0Q==
- dependencies:
- babel-runtime "^6.26.0"
- is-dom "^1.0.9"
- prop-types "^15.6.1"
-
-react-is@^16.3.2, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6:
- version "16.13.1"
- resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
- integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
-
-react-json-view@^1.21.1:
- version "1.21.1"
- resolved "https://registry.yarnpkg.com/react-json-view/-/react-json-view-1.21.1.tgz#221b3ec1f84d7225c1cbb56c504ab3e1d06e66ab"
- integrity sha512-AonvGea4nWlsnNXCbnSdUHsetyNS8rUMhbFHS9eFaDB1oeaxgHcVsqo5LhGRMvWybfDdjVUo0xzDoMQP7jbrXw==
- dependencies:
- flux "^4.0.1"
- react-base16-styling "^0.6.0"
- react-lifecycles-compat "^3.0.4"
- react-textarea-autosize "^6.1.0"
-
-react-lifecycles-compat@^3.0.4:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
- integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
-
-react-motion@^0.5.2:
- version "0.5.2"
- resolved "https://registry.yarnpkg.com/react-motion/-/react-motion-0.5.2.tgz#0dd3a69e411316567927917c6626551ba0607316"
- integrity sha512-9q3YAvHoUiWlP3cK0v+w1N5Z23HXMj4IF4YuvjvWegWqNPfLXsOBE/V7UvQGpXxHFKRQQcNcVQE31g9SB/6qgQ==
- dependencies:
- performance-now "^0.2.0"
- prop-types "^15.5.8"
- raf "^3.1.0"
-
-react-overlays@^0.8.1:
- version "0.8.3"
- resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-0.8.3.tgz#fad65eea5b24301cca192a169f5dddb0b20d3ac5"
- integrity sha512-h6GT3jgy90PgctleP39Yu3eK1v9vaJAW73GOA/UbN9dJ7aAN4BTZD6793eI1D5U+ukMk17qiqN/wl3diK1Z5LA==
- dependencies:
- classnames "^2.2.5"
- dom-helpers "^3.2.1"
- prop-types "^15.5.10"
- prop-types-extra "^1.0.1"
- react-transition-group "^2.2.0"
- warning "^3.0.0"
-
-react-overlays@^0.9.0:
- version "0.9.1"
- resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-0.9.1.tgz#d4702bfe5b5e9335b676ff5a940253771fdeed12"
- integrity sha512-b0asy/zHtRd0i2+2/uNxe3YVprF3bRT1guyr791DORjCzE/HSBMog+ul83CdtKQ1kZ+pLnxWCu5W3BMysFhHdQ==
- dependencies:
- classnames "^2.2.5"
- dom-helpers "^3.2.1"
- prop-types "^15.5.10"
- prop-types-extra "^1.0.1"
- react-transition-group "^2.2.1"
- warning "^3.0.0"
-
-react-popper@^1.0.0:
- version "1.3.7"
- resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.7.tgz#f6a3471362ef1f0d10a4963673789de1baca2324"
- integrity sha512-nmqYTx7QVjCm3WUZLeuOomna138R1luC4EqkW3hxJUrAe+3eNz3oFCLYdnPwILfn0mX1Ew2c3wctrjlUMYYUww==
+"react-input-autosize@^2.2.2":
+ "integrity" "sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw=="
+ "resolved" "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.2.tgz"
+ "version" "2.2.2"
+ dependencies:
+ "prop-types" "^15.5.8"
+
+"react-inspector@^2.3.0":
+ "integrity" "sha512-tUUK7t3KWgZEIUktOYko5Ic/oYwvjEvQUFAGC1UeMeDaQ5za2yZFtItJa2RTwBJB//NxPr000WQK6sEbqC6y0Q=="
+ "resolved" "https://registry.npmjs.org/react-inspector/-/react-inspector-2.3.1.tgz"
+ "version" "2.3.1"
+ dependencies:
+ "babel-runtime" "^6.26.0"
+ "is-dom" "^1.0.9"
+ "prop-types" "^15.6.1"
+
+"react-is@^16.13.1", "react-is@^16.3.2", "react-is@^16.6.0", "react-is@^16.7.0", "react-is@^16.8.4", "react-is@^16.8.6":
+ "integrity" "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ "resolved" "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
+ "version" "16.13.1"
+
+"react-json-view@^1.21.1":
+ "integrity" "sha512-AonvGea4nWlsnNXCbnSdUHsetyNS8rUMhbFHS9eFaDB1oeaxgHcVsqo5LhGRMvWybfDdjVUo0xzDoMQP7jbrXw=="
+ "resolved" "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.1.tgz"
+ "version" "1.21.1"
+ dependencies:
+ "flux" "^4.0.1"
+ "react-base16-styling" "^0.6.0"
+ "react-lifecycles-compat" "^3.0.4"
+ "react-textarea-autosize" "^6.1.0"
+
+"react-lifecycles-compat@^3.0.4":
+ "integrity" "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
+ "resolved" "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz"
+ "version" "3.0.4"
+
+"react-motion@^0.4 || ^0.5", "react-motion@^0.5.2":
+ "integrity" "sha512-9q3YAvHoUiWlP3cK0v+w1N5Z23HXMj4IF4YuvjvWegWqNPfLXsOBE/V7UvQGpXxHFKRQQcNcVQE31g9SB/6qgQ=="
+ "resolved" "https://registry.npmjs.org/react-motion/-/react-motion-0.5.2.tgz"
+ "version" "0.5.2"
+ dependencies:
+ "performance-now" "^0.2.0"
+ "prop-types" "^15.5.8"
+ "raf" "^3.1.0"
+
+"react-overlays@^0.8.1":
+ "integrity" "sha512-h6GT3jgy90PgctleP39Yu3eK1v9vaJAW73GOA/UbN9dJ7aAN4BTZD6793eI1D5U+ukMk17qiqN/wl3diK1Z5LA=="
+ "resolved" "https://registry.npmjs.org/react-overlays/-/react-overlays-0.8.3.tgz"
+ "version" "0.8.3"
+ dependencies:
+ "classnames" "^2.2.5"
+ "dom-helpers" "^3.2.1"
+ "prop-types" "^15.5.10"
+ "prop-types-extra" "^1.0.1"
+ "react-transition-group" "^2.2.0"
+ "warning" "^3.0.0"
+
+"react-overlays@^0.9.0":
+ "integrity" "sha512-b0asy/zHtRd0i2+2/uNxe3YVprF3bRT1guyr791DORjCzE/HSBMog+ul83CdtKQ1kZ+pLnxWCu5W3BMysFhHdQ=="
+ "resolved" "https://registry.npmjs.org/react-overlays/-/react-overlays-0.9.1.tgz"
+ "version" "0.9.1"
+ dependencies:
+ "classnames" "^2.2.5"
+ "dom-helpers" "^3.2.1"
+ "prop-types" "^15.5.10"
+ "prop-types-extra" "^1.0.1"
+ "react-transition-group" "^2.2.1"
+ "warning" "^3.0.0"
+
+"react-popper@^1.0.0":
+ "integrity" "sha512-nmqYTx7QVjCm3WUZLeuOomna138R1luC4EqkW3hxJUrAe+3eNz3oFCLYdnPwILfn0mX1Ew2c3wctrjlUMYYUww=="
+ "resolved" "https://registry.npmjs.org/react-popper/-/react-popper-1.3.7.tgz"
+ "version" "1.3.7"
dependencies:
"@babel/runtime" "^7.1.2"
- create-react-context "^0.3.0"
- deep-equal "^1.1.1"
- popper.js "^1.14.4"
- prop-types "^15.6.1"
- typed-styles "^0.0.7"
- warning "^4.0.2"
-
-react-prop-types@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/react-prop-types/-/react-prop-types-0.4.0.tgz#f99b0bfb4006929c9af2051e7c1414a5c75b93d0"
- integrity sha1-+ZsL+0AGkpya8gUefBQUpcdbk9A=
- dependencies:
- warning "^3.0.0"
-
-react-redux@<7.1.1:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.1.0.tgz#72af7cf490a74acdc516ea9c1dd80e25af9ea0b2"
- integrity sha512-hyu/PoFK3vZgdLTg9ozbt7WF3GgX5+Yn3pZm5/96/o4UueXA+zj08aiSC9Mfj2WtD1bvpIb3C5yvskzZySzzaw==
+ "create-react-context" "^0.3.0"
+ "deep-equal" "^1.1.1"
+ "popper.js" "^1.14.4"
+ "prop-types" "^15.6.1"
+ "typed-styles" "^0.0.7"
+ "warning" "^4.0.2"
+
+"react-prop-types@^0.4.0":
+ "integrity" "sha1-+ZsL+0AGkpya8gUefBQUpcdbk9A="
+ "resolved" "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz"
+ "version" "0.4.0"
+ dependencies:
+ "warning" "^3.0.0"
+
+"react-recompose@^0.31.1":
+ "integrity" "sha512-xojvQpjssgIzb/Pfsz9oMT/9Aq1r769sU5F9q6PNv604sOFDL46D5OGGM9Qymy3dqWj5MjzLvAoLZzyA44QnGw=="
+ "resolved" "https://registry.npmjs.org/react-recompose/-/react-recompose-0.31.2.tgz"
+ "version" "0.31.2"
+ dependencies:
+ "@babel/runtime" "^7.16.3"
+ "change-emitter" "^0.1.2"
+ "hoist-non-react-statics" "^2.5.5"
+ "react-lifecycles-compat" "^3.0.4"
+ "symbol-observable" "^1.2.0"
+
+"react-redux@^4.x.x":
+ "integrity" "sha512-tjL0Bmpkj75Td0k+lXlF8Fc8a9GuXFv/3ahUOCXExWs/jhsKiQeTffdH0j5byejCGCRL4tvGFYlrwBF1X/Aujg=="
+ "resolved" "https://registry.npmjs.org/react-redux/-/react-redux-4.4.10.tgz"
+ "version" "4.4.10"
+ dependencies:
+ "create-react-class" "^15.5.1"
+ "hoist-non-react-statics" "^3.3.0"
+ "invariant" "^2.0.0"
+ "lodash" "^4.17.11"
+ "loose-envify" "^1.4.0"
+ "prop-types" "^15.7.2"
+
+"react-redux@<7.1.1":
+ "integrity" "sha512-hyu/PoFK3vZgdLTg9ozbt7WF3GgX5+Yn3pZm5/96/o4UueXA+zj08aiSC9Mfj2WtD1bvpIb3C5yvskzZySzzaw=="
+ "resolved" "https://registry.npmjs.org/react-redux/-/react-redux-7.1.0.tgz"
+ "version" "7.1.0"
dependencies:
"@babel/runtime" "^7.4.5"
- hoist-non-react-statics "^3.3.0"
- invariant "^2.2.4"
- loose-envify "^1.4.0"
- prop-types "^15.7.2"
- react-is "^16.8.6"
-
-react-redux@^4.x.x:
- version "4.4.10"
- resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-4.4.10.tgz#ad57bd1db00c2d0aa7db992b360ce63dd0b80ec5"
- integrity sha512-tjL0Bmpkj75Td0k+lXlF8Fc8a9GuXFv/3ahUOCXExWs/jhsKiQeTffdH0j5byejCGCRL4tvGFYlrwBF1X/Aujg==
- dependencies:
- create-react-class "^15.5.1"
- hoist-non-react-statics "^3.3.0"
- invariant "^2.0.0"
- lodash "^4.17.11"
- loose-envify "^1.4.0"
- prop-types "^15.7.2"
-
-react-router-dom@5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662"
- integrity sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==
+ "hoist-non-react-statics" "^3.3.0"
+ "invariant" "^2.2.4"
+ "loose-envify" "^1.4.0"
+ "prop-types" "^15.7.2"
+ "react-is" "^16.8.6"
+
+"react-router-dom@5.2.0":
+ "integrity" "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA=="
+ "resolved" "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz"
+ "version" "5.2.0"
dependencies:
"@babel/runtime" "^7.1.2"
- history "^4.9.0"
- loose-envify "^1.3.1"
- prop-types "^15.6.2"
- react-router "5.2.0"
- tiny-invariant "^1.0.2"
- tiny-warning "^1.0.0"
-
-react-router@5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293"
- integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==
+ "history" "^4.9.0"
+ "loose-envify" "^1.3.1"
+ "prop-types" "^15.6.2"
+ "react-router" "5.2.0"
+ "tiny-invariant" "^1.0.2"
+ "tiny-warning" "^1.0.0"
+
+"react-router@5.2.0":
+ "integrity" "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw=="
+ "resolved" "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz"
+ "version" "5.2.0"
dependencies:
"@babel/runtime" "^7.1.2"
- history "^4.9.0"
- hoist-non-react-statics "^3.1.0"
- loose-envify "^1.3.1"
- mini-create-react-context "^0.4.0"
- path-to-regexp "^1.7.0"
- prop-types "^15.6.2"
- react-is "^16.6.0"
- tiny-invariant "^1.0.2"
- tiny-warning "^1.0.0"
-
-react-scripts@3.4.1:
- version "3.4.1"
- resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-3.4.1.tgz#f551298b5c71985cc491b9acf3c8e8c0ae3ada0a"
- integrity sha512-JpTdi/0Sfd31mZA6Ukx+lq5j1JoKItX7qqEK4OiACjVQletM1P38g49d9/D0yTxp9FrSF+xpJFStkGgKEIRjlQ==
+ "history" "^4.9.0"
+ "hoist-non-react-statics" "^3.1.0"
+ "loose-envify" "^1.3.1"
+ "mini-create-react-context" "^0.4.0"
+ "path-to-regexp" "^1.7.0"
+ "prop-types" "^15.6.2"
+ "react-is" "^16.6.0"
+ "tiny-invariant" "^1.0.2"
+ "tiny-warning" "^1.0.0"
+
+"react-scripts@3.4.1":
+ "integrity" "sha512-JpTdi/0Sfd31mZA6Ukx+lq5j1JoKItX7qqEK4OiACjVQletM1P38g49d9/D0yTxp9FrSF+xpJFStkGgKEIRjlQ=="
+ "resolved" "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.1.tgz"
+ "version" "3.4.1"
dependencies:
"@babel/core" "7.9.0"
"@svgr/webpack" "4.3.3"
"@typescript-eslint/eslint-plugin" "^2.10.0"
"@typescript-eslint/parser" "^2.10.0"
- babel-eslint "10.1.0"
- babel-jest "^24.9.0"
- babel-loader "8.1.0"
- babel-plugin-named-asset-import "^0.3.6"
- babel-preset-react-app "^9.1.2"
- camelcase "^5.3.1"
- case-sensitive-paths-webpack-plugin "2.3.0"
- css-loader "3.4.2"
- dotenv "8.2.0"
- dotenv-expand "5.1.0"
- eslint "^6.6.0"
- eslint-config-react-app "^5.2.1"
- eslint-loader "3.0.3"
- eslint-plugin-flowtype "4.6.0"
- eslint-plugin-import "2.20.1"
- eslint-plugin-jsx-a11y "6.2.3"
- eslint-plugin-react "7.19.0"
- eslint-plugin-react-hooks "^1.6.1"
- file-loader "4.3.0"
- fs-extra "^8.1.0"
- html-webpack-plugin "4.0.0-beta.11"
- identity-obj-proxy "3.0.0"
- jest "24.9.0"
- jest-environment-jsdom-fourteen "1.0.1"
- jest-resolve "24.9.0"
- jest-watch-typeahead "0.4.2"
- mini-css-extract-plugin "0.9.0"
- optimize-css-assets-webpack-plugin "5.0.3"
- pnp-webpack-plugin "1.6.4"
- postcss-flexbugs-fixes "4.1.0"
- postcss-loader "3.0.0"
- postcss-normalize "8.0.1"
- postcss-preset-env "6.7.0"
- postcss-safe-parser "4.0.1"
- react-app-polyfill "^1.0.6"
- react-dev-utils "^10.2.1"
- resolve "1.15.0"
- resolve-url-loader "3.1.1"
- sass-loader "8.0.2"
- semver "6.3.0"
- style-loader "0.23.1"
- terser-webpack-plugin "2.3.5"
- ts-pnp "1.1.6"
- url-loader "2.3.0"
- webpack "4.42.0"
- webpack-dev-server "3.10.3"
- webpack-manifest-plugin "2.2.0"
- workbox-webpack-plugin "4.3.1"
+ "babel-eslint" "10.1.0"
+ "babel-jest" "^24.9.0"
+ "babel-loader" "8.1.0"
+ "babel-plugin-named-asset-import" "^0.3.6"
+ "babel-preset-react-app" "^9.1.2"
+ "camelcase" "^5.3.1"
+ "case-sensitive-paths-webpack-plugin" "2.3.0"
+ "css-loader" "3.4.2"
+ "dotenv" "8.2.0"
+ "dotenv-expand" "5.1.0"
+ "eslint" "^6.6.0"
+ "eslint-config-react-app" "^5.2.1"
+ "eslint-loader" "3.0.3"
+ "eslint-plugin-flowtype" "4.6.0"
+ "eslint-plugin-import" "2.20.1"
+ "eslint-plugin-jsx-a11y" "6.2.3"
+ "eslint-plugin-react" "7.19.0"
+ "eslint-plugin-react-hooks" "^1.6.1"
+ "file-loader" "4.3.0"
+ "fs-extra" "^8.1.0"
+ "html-webpack-plugin" "4.0.0-beta.11"
+ "identity-obj-proxy" "3.0.0"
+ "jest" "24.9.0"
+ "jest-environment-jsdom-fourteen" "1.0.1"
+ "jest-resolve" "24.9.0"
+ "jest-watch-typeahead" "0.4.2"
+ "mini-css-extract-plugin" "0.9.0"
+ "optimize-css-assets-webpack-plugin" "5.0.3"
+ "pnp-webpack-plugin" "1.6.4"
+ "postcss-flexbugs-fixes" "4.1.0"
+ "postcss-loader" "3.0.0"
+ "postcss-normalize" "8.0.1"
+ "postcss-preset-env" "6.7.0"
+ "postcss-safe-parser" "4.0.1"
+ "react-app-polyfill" "^1.0.6"
+ "react-dev-utils" "^10.2.1"
+ "resolve" "1.15.0"
+ "resolve-url-loader" "3.1.1"
+ "sass-loader" "8.0.2"
+ "semver" "6.3.0"
+ "style-loader" "0.23.1"
+ "terser-webpack-plugin" "2.3.5"
+ "ts-pnp" "1.1.6"
+ "url-loader" "2.3.0"
+ "webpack" "4.42.0"
+ "webpack-dev-server" "3.10.3"
+ "webpack-manifest-plugin" "2.2.0"
+ "workbox-webpack-plugin" "4.3.1"
optionalDependencies:
- fsevents "2.1.2"
+ "fsevents" "2.1.2"
-react-select@3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/react-select/-/react-select-3.1.0.tgz#ab098720b2e9fe275047c993f0d0caf5ded17c27"
- integrity sha512-wBFVblBH1iuCBprtpyGtd1dGMadsG36W5/t2Aj8OE6WbByDg5jIFyT7X5gT+l0qmT5TqWhxX+VsKJvCEl2uL9g==
+"react-select@3.1.0":
+ "integrity" "sha512-wBFVblBH1iuCBprtpyGtd1dGMadsG36W5/t2Aj8OE6WbByDg5jIFyT7X5gT+l0qmT5TqWhxX+VsKJvCEl2uL9g=="
+ "resolved" "https://registry.npmjs.org/react-select/-/react-select-3.1.0.tgz"
+ "version" "3.1.0"
dependencies:
"@babel/runtime" "^7.4.4"
"@emotion/cache" "^10.0.9"
"@emotion/core" "^10.0.9"
"@emotion/css" "^10.0.9"
- memoize-one "^5.0.0"
- prop-types "^15.6.0"
- react-input-autosize "^2.2.2"
- react-transition-group "^4.3.0"
-
-react-test-renderer@16.13.1:
- version "16.13.1"
- resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.13.1.tgz#de25ea358d9012606de51e012d9742e7f0deabc1"
- integrity sha512-Sn2VRyOK2YJJldOqoh8Tn/lWQ+ZiKhyZTPtaO0Q6yNj+QDbmRkVFap6pZPy3YQk8DScRDfyqm/KxKYP9gCMRiQ==
- dependencies:
- object-assign "^4.1.1"
- prop-types "^15.6.2"
- react-is "^16.8.6"
- scheduler "^0.19.1"
-
-react-textarea-autosize@^6.1.0:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-6.1.0.tgz#df91387f8a8f22020b77e3833c09829d706a09a5"
- integrity sha512-F6bI1dgib6fSvG8so1HuArPUv+iVEfPliuLWusLF+gAKz0FbB4jLrWUrTAeq1afnPT2c9toEZYUdz/y1uKMy4A==
- dependencies:
- prop-types "^15.6.0"
-
-react-transition-group@^2.0.0, react-transition-group@^2.2.0, react-transition-group@^2.2.1:
- version "2.9.0"
- resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d"
- integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==
- dependencies:
- dom-helpers "^3.4.0"
- loose-envify "^1.4.0"
- prop-types "^15.6.2"
- react-lifecycles-compat "^3.0.4"
-
-react-transition-group@^4.3.0:
- version "4.4.1"
- resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.1.tgz#63868f9325a38ea5ee9535d828327f85773345c9"
- integrity sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==
+ "memoize-one" "^5.0.0"
+ "prop-types" "^15.6.0"
+ "react-input-autosize" "^2.2.2"
+ "react-transition-group" "^4.3.0"
+
+"react-test-renderer@16.13.1":
+ "integrity" "sha512-Sn2VRyOK2YJJldOqoh8Tn/lWQ+ZiKhyZTPtaO0Q6yNj+QDbmRkVFap6pZPy3YQk8DScRDfyqm/KxKYP9gCMRiQ=="
+ "resolved" "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.13.1.tgz"
+ "version" "16.13.1"
+ dependencies:
+ "object-assign" "^4.1.1"
+ "prop-types" "^15.6.2"
+ "react-is" "^16.8.6"
+ "scheduler" "^0.19.1"
+
+"react-textarea-autosize@^6.1.0":
+ "integrity" "sha512-F6bI1dgib6fSvG8so1HuArPUv+iVEfPliuLWusLF+gAKz0FbB4jLrWUrTAeq1afnPT2c9toEZYUdz/y1uKMy4A=="
+ "resolved" "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-6.1.0.tgz"
+ "version" "6.1.0"
+ dependencies:
+ "prop-types" "^15.6.0"
+
+"react-transition-group@^2.0.0", "react-transition-group@^2.2.0", "react-transition-group@^2.2.1":
+ "integrity" "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg=="
+ "resolved" "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz"
+ "version" "2.9.0"
+ dependencies:
+ "dom-helpers" "^3.4.0"
+ "loose-envify" "^1.4.0"
+ "prop-types" "^15.6.2"
+ "react-lifecycles-compat" "^3.0.4"
+
+"react-transition-group@^4.3.0":
+ "integrity" "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw=="
+ "resolved" "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz"
+ "version" "4.4.1"
dependencies:
"@babel/runtime" "^7.5.5"
- dom-helpers "^5.0.1"
- loose-envify "^1.4.0"
- prop-types "^15.6.2"
-
-react@^15.6.2:
- version "15.6.2"
- resolved "https://registry.yarnpkg.com/react/-/react-15.6.2.tgz#dba0434ab439cfe82f108f0f511663908179aa72"
- integrity sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=
- dependencies:
- create-react-class "^15.6.0"
- fbjs "^0.8.9"
- loose-envify "^1.1.0"
- object-assign "^4.1.0"
- prop-types "^15.5.10"
-
-react@^16.13.1:
- version "16.13.1"
- resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e"
- integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==
- dependencies:
- loose-envify "^1.1.0"
- object-assign "^4.1.1"
- prop-types "^15.6.2"
-
-reactabular-table@^8.14.0:
- version "8.14.0"
- resolved "https://registry.yarnpkg.com/reactabular-table/-/reactabular-table-8.14.0.tgz#2ce05de47d499db91678fa9518505ea509bf3d7f"
- integrity sha512-F3qOa7yJCi1hnxsESmo2QBWVl1RQfUfZhMhpG81zOxDQKsk/nsXlq/5aBtQ17NadYI6PDdMNourNs+255GpmFQ==
- dependencies:
- classnames "^2.2.5"
-
-read-cmd-shim@^1.0.1, read-cmd-shim@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz#87e43eba50098ba5a32d0ceb583ab8e43b961c16"
- integrity sha512-v5yCqQ/7okKoZZkBQUAfTsQ3sVJtXdNfbPnI5cceppoxEVLYA3k+VtV2omkeo8MS94JCy4fSiUwlRBAwCVRPUA==
- dependencies:
- graceful-fs "^4.1.2"
-
-read-installed@~4.0.3:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067"
- integrity sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=
- dependencies:
- debuglog "^1.0.1"
- read-package-json "^2.0.0"
- readdir-scoped-modules "^1.0.0"
- semver "2 || 3 || 4 || 5"
- slide "~1.1.3"
- util-extend "^1.0.1"
+ "dom-helpers" "^5.0.1"
+ "loose-envify" "^1.4.0"
+ "prop-types" "^15.6.2"
+
+"react@^0.14.0 || ^15.0.0 || ^16.0.0", "react@^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0", "react@^0.14.0 || ^15.2.0 || ^16.0.0", "react@^0.14.9 || ^15.3.0 || ^16.0.0", "react@^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0", "react@^0.14.9 || >=15.3.0", "react@^15.0.2 || ^16.0.0 || ^17.0.0", "react@^15.3.0 || ^16.0.0", "react@^15.5.0 || ^16.0.0", "react@^16.13.1", "react@^16.3.0", "react@^16.3.2", "react@^16.6.0 || ^17.0.0", "react@^16.8.0", "react@^16.8.0 || ^17.0.0", "react@^16.8.1", "react@^16.8.3", "react@^17.0.0 || ^16.3.0 || ^15.5.4", "react@>= 0.11.2 < 17.0.0", "react@>= 15.0.0 < 17.0.0", "react@>=0.12.0", "react@>=0.14.0", "react@>=0.14.0 <17.0.0", "react@>=15", "react@>=15.0.0", "react@>=15.3", "react@>=15.5.0", "react@>=16.3.0", "react@>=16.6.0", "react@0.14.x || ^15.0.0 || ^16.0.0":
+ "integrity" "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w=="
+ "resolved" "https://registry.npmjs.org/react/-/react-16.13.1.tgz"
+ "version" "16.13.1"
+ dependencies:
+ "loose-envify" "^1.1.0"
+ "object-assign" "^4.1.1"
+ "prop-types" "^15.6.2"
+
+"react@^0.14.0 || ^15.0.0-0 || ^15.4.0-0 || ^16.0.0-0", "react@^15.6.2", "react@>= 15":
+ "integrity" "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI="
+ "resolved" "https://registry.npmjs.org/react/-/react-15.6.2.tgz"
+ "version" "15.6.2"
+ dependencies:
+ "create-react-class" "^15.6.0"
+ "fbjs" "^0.8.9"
+ "loose-envify" "^1.1.0"
+ "object-assign" "^4.1.0"
+ "prop-types" "^15.5.10"
+
+"reactabular-table@^8.14.0":
+ "integrity" "sha512-F3qOa7yJCi1hnxsESmo2QBWVl1RQfUfZhMhpG81zOxDQKsk/nsXlq/5aBtQ17NadYI6PDdMNourNs+255GpmFQ=="
+ "resolved" "https://registry.npmjs.org/reactabular-table/-/reactabular-table-8.14.0.tgz"
+ "version" "8.14.0"
+ dependencies:
+ "classnames" "^2.2.5"
+
+"read-cmd-shim@^1.0.1", "read-cmd-shim@^1.0.5":
+ "integrity" "sha512-v5yCqQ/7okKoZZkBQUAfTsQ3sVJtXdNfbPnI5cceppoxEVLYA3k+VtV2omkeo8MS94JCy4fSiUwlRBAwCVRPUA=="
+ "resolved" "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz"
+ "version" "1.0.5"
+ dependencies:
+ "graceful-fs" "^4.1.2"
+
+"read-installed@~4.0.3":
+ "integrity" "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc="
+ "resolved" "https://registry.npmjs.org/read-installed/-/read-installed-4.0.3.tgz"
+ "version" "4.0.3"
+ dependencies:
+ "debuglog" "^1.0.1"
+ "read-package-json" "^2.0.0"
+ "readdir-scoped-modules" "^1.0.0"
+ "semver" "2 || 3 || 4 || 5"
+ "slide" "~1.1.3"
+ "util-extend" "^1.0.1"
optionalDependencies:
- graceful-fs "^4.1.2"
+ "graceful-fs" "^4.1.2"
-"read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@^2.0.13, read-package-json@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.1.tgz#16aa66c59e7d4dad6288f179dd9295fd59bb98f1"
- integrity sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A==
+"read-package-json@^2.0.0", "read-package-json@^2.0.13", "read-package-json@^2.1.1", "read-package-json@1 || 2":
+ "integrity" "sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A=="
+ "resolved" "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.1.tgz"
+ "version" "2.1.1"
dependencies:
- glob "^7.1.1"
- json-parse-better-errors "^1.0.1"
- normalize-package-data "^2.0.0"
- npm-normalize-package-bin "^1.0.0"
+ "glob" "^7.1.1"
+ "json-parse-better-errors" "^1.0.1"
+ "normalize-package-data" "^2.0.0"
+ "npm-normalize-package-bin" "^1.0.0"
optionalDependencies:
- graceful-fs "^4.1.2"
+ "graceful-fs" "^4.1.2"
-read-package-tree@^5.3.1:
- version "5.3.1"
- resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.3.1.tgz#a32cb64c7f31eb8a6f31ef06f9cedf74068fe636"
- integrity sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==
+"read-package-tree@^5.3.1":
+ "integrity" "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw=="
+ "resolved" "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz"
+ "version" "5.3.1"
dependencies:
- read-package-json "^2.0.0"
- readdir-scoped-modules "^1.0.0"
- util-promisify "^2.1.0"
+ "read-package-json" "^2.0.0"
+ "readdir-scoped-modules" "^1.0.0"
+ "util-promisify" "^2.1.0"
-read-pkg-up@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
- integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=
+"read-pkg-up@^2.0.0":
+ "integrity" "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4="
+ "resolved" "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz"
+ "version" "2.0.0"
dependencies:
- find-up "^2.0.0"
- read-pkg "^2.0.0"
+ "find-up" "^2.0.0"
+ "read-pkg" "^2.0.0"
-read-pkg-up@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978"
- integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==
+"read-pkg-up@^4.0.0":
+ "integrity" "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA=="
+ "resolved" "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz"
+ "version" "4.0.0"
dependencies:
- find-up "^3.0.0"
- read-pkg "^3.0.0"
+ "find-up" "^3.0.0"
+ "read-pkg" "^3.0.0"
-read-pkg-up@^7.0.0, read-pkg-up@^7.0.1:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507"
- integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==
+"read-pkg-up@^7.0.0", "read-pkg-up@^7.0.1":
+ "integrity" "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg=="
+ "resolved" "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz"
+ "version" "7.0.1"
dependencies:
- find-up "^4.1.0"
- read-pkg "^5.2.0"
- type-fest "^0.8.1"
+ "find-up" "^4.1.0"
+ "read-pkg" "^5.2.0"
+ "type-fest" "^0.8.1"
-read-pkg@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
- integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=
+"read-pkg@^2.0.0":
+ "integrity" "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg="
+ "resolved" "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz"
+ "version" "2.0.0"
dependencies:
- load-json-file "^2.0.0"
- normalize-package-data "^2.3.2"
- path-type "^2.0.0"
+ "load-json-file" "^2.0.0"
+ "normalize-package-data" "^2.3.2"
+ "path-type" "^2.0.0"
-read-pkg@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
- integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=
+"read-pkg@^3.0.0":
+ "integrity" "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k="
+ "resolved" "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz"
+ "version" "3.0.0"
dependencies:
- load-json-file "^4.0.0"
- normalize-package-data "^2.3.2"
- path-type "^3.0.0"
+ "load-json-file" "^4.0.0"
+ "normalize-package-data" "^2.3.2"
+ "path-type" "^3.0.0"
-read-pkg@^5.0.0, read-pkg@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
- integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==
+"read-pkg@^5.0.0", "read-pkg@^5.2.0":
+ "integrity" "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg=="
+ "resolved" "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz"
+ "version" "5.2.0"
dependencies:
"@types/normalize-package-data" "^2.4.0"
- normalize-package-data "^2.5.0"
- parse-json "^5.0.0"
- type-fest "^0.6.0"
-
-read@1, read@~1.0.1, read@~1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
- integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=
- dependencies:
- mute-stream "~0.0.4"
-
-"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6:
- version "2.3.7"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
- integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
- dependencies:
- core-util-is "~1.0.0"
- inherits "~2.0.3"
- isarray "~1.0.0"
- process-nextick-args "~2.0.0"
- safe-buffer "~5.1.1"
- string_decoder "~1.1.1"
- util-deprecate "~1.0.1"
-
-"readable-stream@2 || 3", readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
- integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
- dependencies:
- inherits "^2.0.3"
- string_decoder "^1.1.1"
- util-deprecate "^1.0.1"
-
-readable-stream@~1.1.10:
- version "1.1.14"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
- integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
- dependencies:
- core-util-is "~1.0.0"
- inherits "~2.0.1"
- isarray "0.0.1"
- string_decoder "~0.10.x"
-
-readdir-scoped-modules@^1.0.0, readdir-scoped-modules@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309"
- integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==
- dependencies:
- debuglog "^1.0.1"
- dezalgo "^1.0.0"
- graceful-fs "^4.1.2"
- once "^1.3.0"
-
-readdirp@^2.2.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
- integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
- dependencies:
- graceful-fs "^4.1.11"
- micromatch "^3.1.10"
- readable-stream "^2.0.2"
-
-readdirp@~3.4.0:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada"
- integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==
- dependencies:
- picomatch "^2.2.1"
-
-realpath-native@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c"
- integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==
- dependencies:
- util.promisify "^1.0.0"
-
-reason-react@^0.9.1:
- version "0.9.1"
- resolved "https://registry.yarnpkg.com/reason-react/-/reason-react-0.9.1.tgz#30a887158200b659aa03e2d75ff4cc54dc462bb0"
- integrity sha512-nlH0O2TDy9KzOLOW+vlEQk4ExHOeciyzFdoLcsmmiit6hx6H5+CVDrwJ+8aiaLT/kqK5xFOjy4PS7PftWz4plA==
-
-recompose@^0.26.0:
- version "0.26.0"
- resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.26.0.tgz#9babff039cb72ba5bd17366d55d7232fbdfb2d30"
- integrity sha512-KwOu6ztO0mN5vy3+zDcc45lgnaUoaQse/a5yLVqtzTK13czSWnFGmXbQVmnoMgDkI5POd1EwIKSbjU1V7xdZog==
- dependencies:
- change-emitter "^0.1.2"
- fbjs "^0.8.1"
- hoist-non-react-statics "^2.3.1"
- symbol-observable "^1.0.4"
-
-recursive-readdir@2.2.2:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f"
- integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==
- dependencies:
- minimatch "3.0.4"
-
-redent@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f"
- integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==
- dependencies:
- indent-string "^4.0.0"
- strip-indent "^3.0.0"
-
-redeyed@~2.1.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b"
- integrity sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=
- dependencies:
- esprima "~4.0.0"
-
-redux-immutable-state-invariant@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/redux-immutable-state-invariant/-/redux-immutable-state-invariant-2.1.0.tgz#308fd3cc7415a0e7f11f51ec997b6379c7055ce1"
- integrity sha512-3czbDKs35FwiBRsx/3KabUk5zSOoTXC+cgVofGkpBNv3jQcqIe5JrHcF5AmVt7B/4hyJ8MijBIpCJ8cife6yJg==
- dependencies:
- invariant "^2.1.0"
- json-stringify-safe "^5.0.1"
-
-redux-immutable@3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/redux-immutable/-/redux-immutable-3.1.0.tgz#cafbd686e0711261119b9c28960935dc47a49d0a"
- integrity sha1-yvvWhuBxEmERm5wolgk13EeknQo=
- dependencies:
- immutable "^3.8.1"
-
-redux-thunk@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622"
- integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==
-
-redux@^3.x.x:
- version "3.7.2"
- resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b"
- integrity sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==
- dependencies:
- lodash "^4.2.1"
- lodash-es "^4.2.1"
- loose-envify "^1.1.0"
- symbol-observable "^1.0.3"
-
-redux@^4.0.5:
- version "4.0.5"
- resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f"
- integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==
+ "normalize-package-data" "^2.5.0"
+ "parse-json" "^5.0.0"
+ "type-fest" "^0.6.0"
+
+"read@~1.0.1", "read@~1.0.7", "read@1":
+ "integrity" "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ="
+ "resolved" "https://registry.npmjs.org/read/-/read-1.0.7.tgz"
+ "version" "1.0.7"
+ dependencies:
+ "mute-stream" "~0.0.4"
+
+"readable-stream@^2.0.0", "readable-stream@^2.0.1", "readable-stream@^2.0.2", "readable-stream@^2.1.5", "readable-stream@^2.2.2", "readable-stream@^2.3.3", "readable-stream@^2.3.6", "readable-stream@~2.3.6", "readable-stream@1 || 2":
+ "integrity" "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw=="
+ "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz"
+ "version" "2.3.7"
+ dependencies:
+ "core-util-is" "~1.0.0"
+ "inherits" "~2.0.3"
+ "isarray" "~1.0.0"
+ "process-nextick-args" "~2.0.0"
+ "safe-buffer" "~5.1.1"
+ "string_decoder" "~1.1.1"
+ "util-deprecate" "~1.0.1"
+
+"readable-stream@^2.0.4":
+ "version" "2.3.6"
+ dependencies:
+ "core-util-is" "~1.0.0"
+ "inherits" "~2.0.3"
+ "isarray" "~1.0.0"
+ "process-nextick-args" "~2.0.0"
+ "safe-buffer" "~5.1.1"
+ "string_decoder" "~1.1.1"
+ "util-deprecate" "~1.0.1"
+
+"readable-stream@^2.0.6":
+ "version" "2.3.6"
+ dependencies:
+ "core-util-is" "~1.0.0"
+ "inherits" "~2.0.3"
+ "isarray" "~1.0.0"
+ "process-nextick-args" "~2.0.0"
+ "safe-buffer" "~5.1.1"
+ "string_decoder" "~1.1.1"
+ "util-deprecate" "~1.0.1"
+
+"readable-stream@^3.0.6":
+ "integrity" "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA=="
+ "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz"
+ "version" "3.6.0"
+ dependencies:
+ "inherits" "^2.0.3"
+ "string_decoder" "^1.1.1"
+ "util-deprecate" "^1.0.1"
+
+"readable-stream@^3.1.1":
+ "integrity" "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA=="
+ "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz"
+ "version" "3.6.0"
+ dependencies:
+ "inherits" "^2.0.3"
+ "string_decoder" "^1.1.1"
+ "util-deprecate" "^1.0.1"
+
+"readable-stream@^3.6.0":
+ "integrity" "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA=="
+ "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz"
+ "version" "3.6.0"
+ dependencies:
+ "inherits" "^2.0.3"
+ "string_decoder" "^1.1.1"
+ "util-deprecate" "^1.0.1"
+
+"readable-stream@~1.1.10":
+ "integrity" "sha1-fPTFTvZI44EwhMY23SB54WbAgdk="
+ "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz"
+ "version" "1.1.14"
+ dependencies:
+ "core-util-is" "~1.0.0"
+ "inherits" "~2.0.1"
+ "isarray" "0.0.1"
+ "string_decoder" "~0.10.x"
+
+"readable-stream@2 || 3":
+ "integrity" "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA=="
+ "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz"
+ "version" "3.6.0"
+ dependencies:
+ "inherits" "^2.0.3"
+ "string_decoder" "^1.1.1"
+ "util-deprecate" "^1.0.1"
+
+"readdir-scoped-modules@^1.0.0", "readdir-scoped-modules@^1.1.0":
+ "integrity" "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw=="
+ "resolved" "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "debuglog" "^1.0.1"
+ "dezalgo" "^1.0.0"
+ "graceful-fs" "^4.1.2"
+ "once" "^1.3.0"
+
+"readdirp@^2.2.1":
+ "integrity" "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ=="
+ "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz"
+ "version" "2.2.1"
+ dependencies:
+ "graceful-fs" "^4.1.11"
+ "micromatch" "^3.1.10"
+ "readable-stream" "^2.0.2"
+
+"readdirp@~3.4.0":
+ "integrity" "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ=="
+ "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz"
+ "version" "3.4.0"
+ dependencies:
+ "picomatch" "^2.2.1"
+
+"realpath-native@^1.1.0":
+ "integrity" "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA=="
+ "resolved" "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "util.promisify" "^1.0.0"
+
+"reason-react@^0.9.1":
+ "integrity" "sha512-nlH0O2TDy9KzOLOW+vlEQk4ExHOeciyzFdoLcsmmiit6hx6H5+CVDrwJ+8aiaLT/kqK5xFOjy4PS7PftWz4plA=="
+ "resolved" "https://registry.npmjs.org/reason-react/-/reason-react-0.9.1.tgz"
+ "version" "0.9.1"
+
+"recursive-readdir@2.2.2":
+ "integrity" "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg=="
+ "resolved" "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz"
+ "version" "2.2.2"
+ dependencies:
+ "minimatch" "3.0.4"
+
+"redent@^3.0.0":
+ "integrity" "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg=="
+ "resolved" "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "indent-string" "^4.0.0"
+ "strip-indent" "^3.0.0"
+
+"redeyed@~2.1.0":
+ "integrity" "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs="
+ "resolved" "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz"
+ "version" "2.1.1"
+ dependencies:
+ "esprima" "~4.0.0"
+
+"redux-immutable-state-invariant@^2.1.0":
+ "integrity" "sha512-3czbDKs35FwiBRsx/3KabUk5zSOoTXC+cgVofGkpBNv3jQcqIe5JrHcF5AmVt7B/4hyJ8MijBIpCJ8cife6yJg=="
+ "resolved" "https://registry.npmjs.org/redux-immutable-state-invariant/-/redux-immutable-state-invariant-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "invariant" "^2.1.0"
+ "json-stringify-safe" "^5.0.1"
+
+"redux-immutable@3.1.0":
+ "integrity" "sha1-yvvWhuBxEmERm5wolgk13EeknQo="
+ "resolved" "https://registry.npmjs.org/redux-immutable/-/redux-immutable-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "immutable" "^3.8.1"
+
+"redux-thunk@^2.3.0":
+ "integrity" "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw=="
+ "resolved" "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz"
+ "version" "2.3.0"
+
+"redux@^2.0.0 || ^3.0.0 || ^4.0.0-0", "redux@^4.0.5", "redux@>= 3.0.0 < 4.0.0":
+ "integrity" "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w=="
+ "resolved" "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz"
+ "version" "4.0.5"
+ dependencies:
+ "loose-envify" "^1.4.0"
+ "symbol-observable" "^1.2.0"
+
+"redux@^2.0.0 || ^3.0.0", "redux@^3.x.x":
+ "integrity" "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A=="
+ "resolved" "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz"
+ "version" "3.7.2"
+ dependencies:
+ "lodash" "^4.2.1"
+ "lodash-es" "^4.2.1"
+ "loose-envify" "^1.1.0"
+ "symbol-observable" "^1.0.3"
+
+"regenerate-unicode-properties@^8.2.0":
+ "integrity" "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA=="
+ "resolved" "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz"
+ "version" "8.2.0"
dependencies:
- loose-envify "^1.4.0"
- symbol-observable "^1.2.0"
-
-regenerate-unicode-properties@^8.2.0:
- version "8.2.0"
- resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec"
- integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==
- dependencies:
- regenerate "^1.4.0"
+ "regenerate" "^1.4.0"
+
+"regenerate@^1.4.0":
+ "integrity" "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg=="
+ "resolved" "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz"
+ "version" "1.4.0"
-regenerate@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
- integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==
-
-regenerator-runtime@^0.11.0:
- version "0.11.1"
- resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
- integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
+"regenerator-runtime@^0.11.0":
+ "integrity" "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+ "resolved" "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz"
+ "version" "0.11.1"
-regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4:
- version "0.13.5"
- resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697"
- integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==
+"regenerator-runtime@^0.13.2", "regenerator-runtime@^0.13.3", "regenerator-runtime@^0.13.4":
+ "integrity" "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
+ "resolved" "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz"
+ "version" "0.13.5"
-regenerator-transform@^0.14.2:
- version "0.14.4"
- resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7"
- integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==
+"regenerator-transform@^0.14.2":
+ "integrity" "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw=="
+ "resolved" "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz"
+ "version" "0.14.4"
dependencies:
"@babel/runtime" "^7.8.4"
- private "^0.1.8"
-
-regex-not@^1.0.0, regex-not@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
- integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
- dependencies:
- extend-shallow "^3.0.2"
- safe-regex "^1.1.0"
-
-regex-parser@2.2.10:
- version "2.2.10"
- resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.10.tgz#9e66a8f73d89a107616e63b39d4deddfee912b37"
- integrity sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==
-
-regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75"
- integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==
- dependencies:
- define-properties "^1.1.3"
- es-abstract "^1.17.0-next.1"
-
-regexpp@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
- integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
-
-regexpp@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2"
- integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==
-
-regexpu-core@^4.7.0:
- version "4.7.0"
- resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938"
- integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==
- dependencies:
- regenerate "^1.4.0"
- regenerate-unicode-properties "^8.2.0"
- regjsgen "^0.5.1"
- regjsparser "^0.6.4"
- unicode-match-property-ecmascript "^1.0.4"
- unicode-match-property-value-ecmascript "^1.2.0"
-
-registry-auth-token@^3.0.1:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e"
- integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==
- dependencies:
- rc "^1.1.6"
- safe-buffer "^5.0.1"
-
-registry-auth-token@^4.0.0:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.1.1.tgz#40a33be1e82539460f94328b0f7f0f84c16d9479"
- integrity sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==
- dependencies:
- rc "^1.2.8"
-
-registry-url@^3.0.3:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942"
- integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI=
- dependencies:
- rc "^1.0.1"
-
-regjsgen@^0.5.1:
- version "0.5.1"
- resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c"
- integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==
-
-regjsparser@^0.6.4:
- version "0.6.4"
- resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272"
- integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==
- dependencies:
- jsesc "~0.5.0"
-
-relateurl@^0.2.7:
- version "0.2.7"
- resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
- integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=
-
-remarkable@^1.7.4:
- version "1.7.4"
- resolved "https://registry.yarnpkg.com/remarkable/-/remarkable-1.7.4.tgz#19073cb960398c87a7d6546eaa5e50d2022fcd00"
- integrity sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==
- dependencies:
- argparse "^1.0.10"
- autolinker "~0.28.0"
-
-remove-trailing-separator@^1.0.1:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
- integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
-
-renderkid@^2.0.1:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz#380179c2ff5ae1365c522bf2fcfcff01c5b74149"
- integrity sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==
- dependencies:
- css-select "^1.1.0"
- dom-converter "^0.2"
- htmlparser2 "^3.3.0"
- strip-ansi "^3.0.0"
- utila "^0.4.0"
-
-repeat-element@^1.1.2:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
- integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
-
-repeat-string@^1.5.2, repeat-string@^1.6.1:
- version "1.6.1"
- resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
- integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
-
-request-promise-core@1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9"
- integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==
- dependencies:
- lodash "^4.17.15"
-
-request-promise-native@^1.0.5:
- version "1.0.8"
- resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36"
- integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==
- dependencies:
- request-promise-core "1.1.3"
- stealthy-require "^1.1.1"
- tough-cookie "^2.3.3"
-
-request@^2.87.0, request@^2.88.0:
- version "2.88.2"
- resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
- integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
- dependencies:
- aws-sign2 "~0.7.0"
- aws4 "^1.8.0"
- caseless "~0.12.0"
- combined-stream "~1.0.6"
- extend "~3.0.2"
- forever-agent "~0.6.1"
- form-data "~2.3.2"
- har-validator "~5.1.3"
- http-signature "~1.2.0"
- is-typedarray "~1.0.0"
- isstream "~0.1.2"
- json-stringify-safe "~5.0.1"
- mime-types "~2.1.19"
- oauth-sign "~0.9.0"
- performance-now "^2.1.0"
- qs "~6.5.2"
- safe-buffer "^5.1.2"
- tough-cookie "~2.5.0"
- tunnel-agent "^0.6.0"
- uuid "^3.3.2"
-
-require-directory@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
- integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
-
-require-main-filename@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
- integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
-
-require-main-filename@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
- integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
-
-requires-port@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
- integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
-
-reselect@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7"
- integrity sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==
-
-resolve-cwd@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
- integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=
- dependencies:
- resolve-from "^3.0.0"
-
-resolve-dir@^1.0.0, resolve-dir@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43"
- integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=
- dependencies:
- expand-tilde "^2.0.0"
- global-modules "^1.0.0"
-
-resolve-from@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
- integrity sha1-six699nWiBvItuZTM17rywoYh0g=
-
-resolve-from@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
- integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
-
-resolve-from@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
- integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
-
-resolve-global@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255"
- integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==
- dependencies:
- global-dirs "^0.1.1"
-
-resolve-pathname@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd"
- integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==
-
-resolve-url-loader@3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz#28931895fa1eab9be0647d3b2958c100ae3c0bf0"
- integrity sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==
- dependencies:
- adjust-sourcemap-loader "2.0.0"
- camelcase "5.3.1"
- compose-function "3.0.3"
- convert-source-map "1.7.0"
- es6-iterator "2.0.3"
- loader-utils "1.2.3"
- postcss "7.0.21"
- rework "1.0.1"
- rework-visit "1.0.0"
- source-map "0.6.1"
-
-resolve-url@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
- integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
-
-resolve@1.1.7:
- version "1.1.7"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
- integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
-
-resolve@1.15.0:
- version "1.15.0"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.0.tgz#1b7ca96073ebb52e741ffd799f6b39ea462c67f5"
- integrity sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==
- dependencies:
- path-parse "^1.0.6"
-
-resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.15.1, resolve@^1.3.2, resolve@^1.8.1:
- version "1.17.0"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
- integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
- dependencies:
- path-parse "^1.0.6"
-
-restore-cursor@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
- integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368=
- dependencies:
- onetime "^2.0.0"
- signal-exit "^3.0.2"
-
-restore-cursor@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
- integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
- dependencies:
- onetime "^5.1.0"
- signal-exit "^3.0.2"
-
-ret@~0.1.10:
- version "0.1.15"
- resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
- integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
-
-retry@^0.10.0:
- version "0.10.1"
- resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4"
- integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=
-
-retry@^0.12.0:
- version "0.12.0"
- resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
- integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=
-
-reusify@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
- integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
-
-rework-visit@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a"
- integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo=
-
-rework@1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7"
- integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=
- dependencies:
- convert-source-map "^0.3.3"
- css "^2.0.0"
-
-rgb-regex@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
- integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE=
-
-rgba-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
- integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=
-
-rimraf@2.6.3:
- version "2.6.3"
- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
- integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
- dependencies:
- glob "^7.1.3"
-
-rimraf@3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
- integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
- dependencies:
- glob "^7.1.3"
-
-rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1:
- version "2.7.1"
- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
- integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
- dependencies:
- glob "^7.1.3"
-
-ripemd160@^2.0.0, ripemd160@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
- integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
- dependencies:
- hash-base "^3.0.0"
- inherits "^2.0.1"
-
-rsvp@^4.8.4:
- version "4.8.5"
- resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734"
- integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==
-
-run-async@^2.2.0, run-async@^2.4.0:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
- integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
-
-run-parallel@^1.1.9:
- version "1.1.9"
- resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679"
- integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==
-
-run-queue@^1.0.0, run-queue@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
- integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=
- dependencies:
- aproba "^1.1.1"
-
-rxjs@^6.4.0, rxjs@^6.5.3:
- version "6.5.5"
- resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec"
- integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==
- dependencies:
- tslib "^1.9.0"
-
-safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
- integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
-
-safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
- integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
-
-safe-regex@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
- integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
- dependencies:
- ret "~0.1.10"
+ "private" "^0.1.8"
+
+"regex-not@^1.0.0", "regex-not@^1.0.2":
+ "integrity" "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A=="
+ "resolved" "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "extend-shallow" "^3.0.2"
+ "safe-regex" "^1.1.0"
+
+"regex-parser@2.2.10":
+ "integrity" "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA=="
+ "resolved" "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz"
+ "version" "2.2.10"
+
+"regexp.prototype.flags@^1.2.0", "regexp.prototype.flags@^1.4.1", "regexp.prototype.flags@^1.4.3":
+ "integrity" "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA=="
+ "resolved" "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz"
+ "version" "1.4.3"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "define-properties" "^1.1.3"
+ "functions-have-names" "^1.2.2"
+
+"regexpp@^2.0.1":
+ "integrity" "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw=="
+ "resolved" "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz"
+ "version" "2.0.1"
+
+"regexpp@^3.0.0":
+ "integrity" "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q=="
+ "resolved" "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz"
+ "version" "3.1.0"
+
+"regexpu-core@^4.7.0":
+ "integrity" "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ=="
+ "resolved" "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz"
+ "version" "4.7.0"
+ dependencies:
+ "regenerate" "^1.4.0"
+ "regenerate-unicode-properties" "^8.2.0"
+ "regjsgen" "^0.5.1"
+ "regjsparser" "^0.6.4"
+ "unicode-match-property-ecmascript" "^1.0.4"
+ "unicode-match-property-value-ecmascript" "^1.2.0"
+
+"registry-auth-token@^3.0.1":
+ "integrity" "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A=="
+ "resolved" "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz"
+ "version" "3.4.0"
+ dependencies:
+ "rc" "^1.1.6"
+ "safe-buffer" "^5.0.1"
+
+"registry-auth-token@^4.0.0":
+ "integrity" "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA=="
+ "resolved" "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz"
+ "version" "4.1.1"
+ dependencies:
+ "rc" "^1.2.8"
+
+"registry-url@^3.0.3":
+ "integrity" "sha1-PU74cPc93h138M+aOBQyRE4XSUI="
+ "resolved" "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "rc" "^1.0.1"
+
+"regjsgen@^0.5.1":
+ "integrity" "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg=="
+ "resolved" "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz"
+ "version" "0.5.1"
+
+"regjsparser@^0.6.4":
+ "integrity" "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw=="
+ "resolved" "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz"
+ "version" "0.6.4"
+ dependencies:
+ "jsesc" "~0.5.0"
+
+"relateurl@^0.2.7":
+ "integrity" "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk="
+ "resolved" "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz"
+ "version" "0.2.7"
+
+"remarkable@^1.7.4":
+ "integrity" "sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg=="
+ "resolved" "https://registry.npmjs.org/remarkable/-/remarkable-1.7.4.tgz"
+ "version" "1.7.4"
+ dependencies:
+ "argparse" "^1.0.10"
+ "autolinker" "~0.28.0"
+
+"remove-trailing-separator@^1.0.1":
+ "integrity" "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
+ "resolved" "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz"
+ "version" "1.1.0"
+
+"renderkid@^2.0.1":
+ "integrity" "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA=="
+ "resolved" "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz"
+ "version" "2.0.3"
+ dependencies:
+ "css-select" "^1.1.0"
+ "dom-converter" "^0.2"
+ "htmlparser2" "^3.3.0"
+ "strip-ansi" "^3.0.0"
+ "utila" "^0.4.0"
+
+"repeat-element@^1.1.2":
+ "integrity" "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g=="
+ "resolved" "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz"
+ "version" "1.1.3"
+
+"repeat-string@^1.5.2", "repeat-string@^1.6.1":
+ "integrity" "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
+ "resolved" "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz"
+ "version" "1.6.1"
+
+"request-promise-core@1.1.3":
+ "integrity" "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ=="
+ "resolved" "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz"
+ "version" "1.1.3"
+ dependencies:
+ "lodash" "^4.17.15"
+
+"request-promise-native@^1.0.5":
+ "integrity" "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ=="
+ "resolved" "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz"
+ "version" "1.0.8"
+ dependencies:
+ "request-promise-core" "1.1.3"
+ "stealthy-require" "^1.1.1"
+ "tough-cookie" "^2.3.3"
+
+"request@^2.34", "request@^2.87.0", "request@^2.88.0":
+ "integrity" "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw=="
+ "resolved" "https://registry.npmjs.org/request/-/request-2.88.2.tgz"
+ "version" "2.88.2"
+ dependencies:
+ "aws-sign2" "~0.7.0"
+ "aws4" "^1.8.0"
+ "caseless" "~0.12.0"
+ "combined-stream" "~1.0.6"
+ "extend" "~3.0.2"
+ "forever-agent" "~0.6.1"
+ "form-data" "~2.3.2"
+ "har-validator" "~5.1.3"
+ "http-signature" "~1.2.0"
+ "is-typedarray" "~1.0.0"
+ "isstream" "~0.1.2"
+ "json-stringify-safe" "~5.0.1"
+ "mime-types" "~2.1.19"
+ "oauth-sign" "~0.9.0"
+ "performance-now" "^2.1.0"
+ "qs" "~6.5.2"
+ "safe-buffer" "^5.1.2"
+ "tough-cookie" "~2.5.0"
+ "tunnel-agent" "^0.6.0"
+ "uuid" "^3.3.2"
+
+"require-directory@^2.1.1":
+ "integrity" "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+ "resolved" "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz"
+ "version" "2.1.1"
+
+"require-main-filename@^1.0.1":
+ "integrity" "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
+ "resolved" "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz"
+ "version" "1.0.1"
+
+"require-main-filename@^2.0.0":
+ "integrity" "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+ "resolved" "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz"
+ "version" "2.0.0"
+
+"requires-port@^1.0.0":
+ "integrity" "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
+ "resolved" "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz"
+ "version" "1.0.0"
+
+"reselect@^4.0.0":
+ "integrity" "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA=="
+ "resolved" "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz"
+ "version" "4.0.0"
+
+"resolve-cwd@^2.0.0":
+ "integrity" "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo="
+ "resolved" "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "resolve-from" "^3.0.0"
+
+"resolve-dir@^1.0.0", "resolve-dir@^1.0.1":
+ "integrity" "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M="
+ "resolved" "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "expand-tilde" "^2.0.0"
+ "global-modules" "^1.0.0"
+
+"resolve-from@^3.0.0":
+ "integrity" "sha1-six699nWiBvItuZTM17rywoYh0g="
+ "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz"
+ "version" "3.0.0"
+
+"resolve-from@^4.0.0":
+ "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
+ "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
+ "version" "4.0.0"
+
+"resolve-from@^5.0.0":
+ "integrity" "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="
+ "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz"
+ "version" "5.0.0"
+
+"resolve-global@^1.0.0":
+ "integrity" "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw=="
+ "resolved" "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "global-dirs" "^0.1.1"
+
+"resolve-pathname@^3.0.0":
+ "integrity" "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng=="
+ "resolved" "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz"
+ "version" "3.0.0"
+
+"resolve-url-loader@3.1.1":
+ "integrity" "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ=="
+ "resolved" "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz"
+ "version" "3.1.1"
+ dependencies:
+ "adjust-sourcemap-loader" "2.0.0"
+ "camelcase" "5.3.1"
+ "compose-function" "3.0.3"
+ "convert-source-map" "1.7.0"
+ "es6-iterator" "2.0.3"
+ "loader-utils" "1.2.3"
+ "postcss" "7.0.21"
+ "rework" "1.0.1"
+ "rework-visit" "1.0.0"
+ "source-map" "0.6.1"
+
+"resolve-url@^0.2.1":
+ "integrity" "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
+ "resolved" "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz"
+ "version" "0.2.1"
+
+"resolve@^1.10.0", "resolve@^1.12.0", "resolve@^1.13.1", "resolve@^1.3.2", "resolve@^1.8.1":
+ "integrity" "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w=="
+ "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz"
+ "version" "1.17.0"
+ dependencies:
+ "path-parse" "^1.0.6"
+
+"resolve@^1.15.1":
+ "integrity" "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w=="
+ "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz"
+ "version" "1.17.0"
+ dependencies:
+ "path-parse" "^1.0.6"
+
+"resolve@^2.0.0-next.3":
+ "integrity" "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ=="
+ "resolved" "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz"
+ "version" "2.0.0-next.4"
+ dependencies:
+ "is-core-module" "^2.9.0"
+ "path-parse" "^1.0.7"
+ "supports-preserve-symlinks-flag" "^1.0.0"
+
+"resolve@1.1.7":
+ "integrity" "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs="
+ "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz"
+ "version" "1.1.7"
+
+"resolve@1.15.0":
+ "integrity" "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw=="
+ "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz"
+ "version" "1.15.0"
+ dependencies:
+ "path-parse" "^1.0.6"
+
+"restore-cursor@^2.0.0":
+ "integrity" "sha1-n37ih/gv0ybU/RYpI9YhKe7g368="
+ "resolved" "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "onetime" "^2.0.0"
+ "signal-exit" "^3.0.2"
+
+"restore-cursor@^3.1.0":
+ "integrity" "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="
+ "resolved" "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "onetime" "^5.1.0"
+ "signal-exit" "^3.0.2"
+
+"ret@~0.1.10":
+ "integrity" "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
+ "resolved" "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz"
+ "version" "0.1.15"
+
+"retry@^0.10.0":
+ "integrity" "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q="
+ "resolved" "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz"
+ "version" "0.10.1"
+
+"retry@^0.12.0":
+ "integrity" "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs="
+ "resolved" "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz"
+ "version" "0.12.0"
+
+"reusify@^1.0.4":
+ "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
+ "resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"
+ "version" "1.0.4"
+
+"rework-visit@1.0.0":
+ "integrity" "sha1-mUWygD8hni96ygCtuLyfZA+ELJo="
+ "resolved" "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz"
+ "version" "1.0.0"
+
+"rework@1.0.1":
+ "integrity" "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc="
+ "resolved" "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "convert-source-map" "^0.3.3"
+ "css" "^2.0.0"
+
+"rgb-regex@^1.0.1":
+ "integrity" "sha1-wODWiC3w4jviVKR16O3UGRX+rrE="
+ "resolved" "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz"
+ "version" "1.0.1"
+
+"rgba-regex@^1.0.0":
+ "integrity" "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM="
+ "resolved" "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz"
+ "version" "1.0.0"
+
+"rimraf@^2.5.2", "rimraf@^2.5.4", "rimraf@^2.6.2", "rimraf@^2.6.3", "rimraf@^2.7.1":
+ "integrity" "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="
+ "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz"
+ "version" "2.7.1"
+ dependencies:
+ "glob" "^7.1.3"
+
+"rimraf@2.6.3":
+ "integrity" "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA=="
+ "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz"
+ "version" "2.6.3"
+ dependencies:
+ "glob" "^7.1.3"
+
+"rimraf@3.0.2":
+ "integrity" "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="
+ "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz"
+ "version" "3.0.2"
+ dependencies:
+ "glob" "^7.1.3"
+
+"ripemd160@^2.0.0", "ripemd160@^2.0.1":
+ "integrity" "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA=="
+ "resolved" "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz"
+ "version" "2.0.2"
+ dependencies:
+ "hash-base" "^3.0.0"
+ "inherits" "^2.0.1"
+
+"rsvp@^4.8.4":
+ "integrity" "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA=="
+ "resolved" "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz"
+ "version" "4.8.5"
+
+"run-async@^2.2.0", "run-async@^2.4.0":
+ "integrity" "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="
+ "resolved" "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz"
+ "version" "2.4.1"
+
+"run-parallel@^1.1.9":
+ "integrity" "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q=="
+ "resolved" "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz"
+ "version" "1.1.9"
+
+"run-queue@^1.0.0", "run-queue@^1.0.3":
+ "integrity" "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec="
+ "resolved" "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz"
+ "version" "1.0.3"
+ dependencies:
+ "aproba" "^1.1.1"
+
+"rxjs@^6.4.0", "rxjs@^6.5.3":
+ "integrity" "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ=="
+ "resolved" "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz"
+ "version" "6.5.5"
+ dependencies:
+ "tslib" "^1.9.0"
+
+"safe-buffer@^5.0.1", "safe-buffer@^5.1.0", "safe-buffer@^5.1.1", "safe-buffer@^5.1.2", "safe-buffer@^5.2.0", "safe-buffer@>=5.1.0", "safe-buffer@~5.2.0":
+ "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
+ "version" "5.2.1"
+
+"safe-buffer@~5.1.0", "safe-buffer@~5.1.1":
+ "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
+ "version" "5.1.2"
+
+"safe-buffer@5.1.2":
+ "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
+ "version" "5.1.2"
+
+"safe-regex@^1.1.0":
+ "integrity" "sha1-QKNmnzsHfR6UPURinhV91IAjvy4="
+ "resolved" "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "ret" "~0.1.10"
-"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
- integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+"safer-buffer@^2.0.2", "safer-buffer@^2.1.0", "safer-buffer@>= 2.1.2 < 3", "safer-buffer@~2.1.0":
+ "integrity" "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ "resolved" "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
+ "version" "2.1.2"
-sane@^4.0.3:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded"
- integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==
+"sane@^4.0.3":
+ "integrity" "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA=="
+ "resolved" "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz"
+ "version" "4.1.0"
dependencies:
"@cnakazawa/watch" "^1.0.3"
- anymatch "^2.0.0"
- capture-exit "^2.0.0"
- exec-sh "^0.3.2"
- execa "^1.0.0"
- fb-watchman "^2.0.0"
- micromatch "^3.1.4"
- minimist "^1.1.1"
- walker "~1.0.5"
-
-sanitize.css@^10.0.0:
- version "10.0.0"
- resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-10.0.0.tgz#b5cb2547e96d8629a60947544665243b1dc3657a"
- integrity sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==
-
-sass-loader@8.0.2:
- version "8.0.2"
- resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d"
- integrity sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==
- dependencies:
- clone-deep "^4.0.1"
- loader-utils "^1.2.3"
- neo-async "^2.6.1"
- schema-utils "^2.6.1"
- semver "^6.3.0"
-
-sax@^1.2.4, sax@~1.2.4:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
- integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
-
-saxes@^3.1.9:
- version "3.1.11"
- resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b"
- integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==
- dependencies:
- xmlchars "^2.1.1"
-
-scheduler@^0.19.1:
- version "0.19.1"
- resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196"
- integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==
- dependencies:
- loose-envify "^1.1.0"
- object-assign "^4.1.1"
-
-schema-utils@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770"
- integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==
- dependencies:
- ajv "^6.1.0"
- ajv-errors "^1.0.0"
- ajv-keywords "^3.1.0"
-
-schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6.4, schema-utils@^2.6.5:
- version "2.6.6"
- resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.6.tgz#299fe6bd4a3365dc23d99fd446caff8f1d6c330c"
- integrity sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==
- dependencies:
- ajv "^6.12.0"
- ajv-keywords "^3.4.1"
-
-select-hose@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
- integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=
-
-selfsigned@^1.10.7:
- version "1.10.7"
- resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b"
- integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==
- dependencies:
- node-forge "0.9.0"
-
-semantic-release@^15.13.1:
- version "15.14.0"
- resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-15.14.0.tgz#6ee79b7b3598332378190412880049709fa23376"
- integrity sha512-Cn43W35AOLY0RMcDbtwhJODJmWg6YCs1+R5jRQsTmmkEGzkV4B2F/QXkjVZpl4UbH91r93GGH0xhoq9kh7I5PA==
+ "anymatch" "^2.0.0"
+ "capture-exit" "^2.0.0"
+ "exec-sh" "^0.3.2"
+ "execa" "^1.0.0"
+ "fb-watchman" "^2.0.0"
+ "micromatch" "^3.1.4"
+ "minimist" "^1.1.1"
+ "walker" "~1.0.5"
+
+"sanitize.css@^10.0.0":
+ "integrity" "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg=="
+ "resolved" "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz"
+ "version" "10.0.0"
+
+"sass-loader@8.0.2":
+ "integrity" "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ=="
+ "resolved" "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz"
+ "version" "8.0.2"
+ dependencies:
+ "clone-deep" "^4.0.1"
+ "loader-utils" "^1.2.3"
+ "neo-async" "^2.6.1"
+ "schema-utils" "^2.6.1"
+ "semver" "^6.3.0"
+
+"sax@^1.2.4", "sax@~1.2.4":
+ "integrity" "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+ "resolved" "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz"
+ "version" "1.2.4"
+
+"saxes@^3.1.9":
+ "integrity" "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g=="
+ "resolved" "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz"
+ "version" "3.1.11"
+ dependencies:
+ "xmlchars" "^2.1.1"
+
+"scheduler@^0.19.1":
+ "integrity" "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA=="
+ "resolved" "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz"
+ "version" "0.19.1"
+ dependencies:
+ "loose-envify" "^1.1.0"
+ "object-assign" "^4.1.1"
+
+"schema-utils@^1.0.0":
+ "integrity" "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g=="
+ "resolved" "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "ajv" "^6.1.0"
+ "ajv-errors" "^1.0.0"
+ "ajv-keywords" "^3.1.0"
+
+"schema-utils@^2.5.0", "schema-utils@^2.6.0", "schema-utils@^2.6.1", "schema-utils@^2.6.4", "schema-utils@^2.6.5":
+ "integrity" "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA=="
+ "resolved" "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz"
+ "version" "2.6.6"
+ dependencies:
+ "ajv" "^6.12.0"
+ "ajv-keywords" "^3.4.1"
+
+"select-hose@^2.0.0":
+ "integrity" "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo="
+ "resolved" "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz"
+ "version" "2.0.0"
+
+"selfsigned@^1.10.7":
+ "integrity" "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA=="
+ "resolved" "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz"
+ "version" "1.10.7"
+ dependencies:
+ "node-forge" "0.9.0"
+
+"semantic-release@^15.13.1", "semantic-release@>=15.8.0 <16.0.0", "semantic-release@>=15.8.0 <16.0.0 || >=16.0.0-beta <17.0.0", "semantic-release@>=15.9.0 <16.0.0":
+ "integrity" "sha512-Cn43W35AOLY0RMcDbtwhJODJmWg6YCs1+R5jRQsTmmkEGzkV4B2F/QXkjVZpl4UbH91r93GGH0xhoq9kh7I5PA=="
+ "resolved" "https://registry.npmjs.org/semantic-release/-/semantic-release-15.14.0.tgz"
+ "version" "15.14.0"
dependencies:
"@semantic-release/commit-analyzer" "^6.1.0"
"@semantic-release/error" "^2.2.0"
"@semantic-release/github" "^5.1.0"
"@semantic-release/npm" "^5.0.5"
"@semantic-release/release-notes-generator" "^7.1.2"
- aggregate-error "^3.0.0"
- cosmiconfig "^6.0.0"
- debug "^4.0.0"
- env-ci "^4.0.0"
- execa "^3.2.0"
- figures "^3.0.0"
- find-versions "^3.0.0"
- get-stream "^5.0.0"
- git-log-parser "^1.2.0"
- hook-std "^2.0.0"
- hosted-git-info "^3.0.0"
- lodash "^4.17.15"
- marked "^0.7.0"
- marked-terminal "^3.2.0"
- p-locate "^4.0.0"
- p-reduce "^2.0.0"
- read-pkg-up "^7.0.0"
- resolve-from "^5.0.0"
- semver "^6.0.0"
- signale "^1.2.1"
- yargs "^15.0.1"
-
-semver-diff@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36"
- integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=
- dependencies:
- semver "^5.0.3"
-
-semver-regex@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338"
- integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==
-
-"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.1:
- version "5.7.1"
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
- integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
-
-semver@6.3.0, semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0:
- version "6.3.0"
- resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
- integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
-
-semver@7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
- integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
-
-semver@^7.3.2:
- version "7.3.2"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938"
- integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
-
-send@0.17.1:
- version "0.17.1"
- resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
- integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
- dependencies:
- debug "2.6.9"
- depd "~1.1.2"
- destroy "~1.0.4"
- encodeurl "~1.0.2"
- escape-html "~1.0.3"
- etag "~1.8.1"
- fresh "0.5.2"
- http-errors "~1.7.2"
- mime "1.6.0"
- ms "2.1.1"
- on-finished "~2.3.0"
- range-parser "~1.2.1"
- statuses "~1.5.0"
-
-serialize-error@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a"
- integrity sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=
-
-serialize-javascript@^2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61"
- integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==
-
-serialize-javascript@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa"
- integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==
- dependencies:
- randombytes "^2.1.0"
-
-serve-index@^1.9.1:
- version "1.9.1"
- resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239"
- integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=
- dependencies:
- accepts "~1.3.4"
- batch "0.6.1"
- debug "2.6.9"
- escape-html "~1.0.3"
- http-errors "~1.6.2"
- mime-types "~2.1.17"
- parseurl "~1.3.2"
-
-serve-static@1.14.1:
- version "1.14.1"
- resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
- integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
- dependencies:
- encodeurl "~1.0.2"
- escape-html "~1.0.3"
- parseurl "~1.3.3"
- send "0.17.1"
-
-set-blocking@^2.0.0, set-blocking@~2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
- integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
-
-set-value@^2.0.0, set-value@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
- integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
- dependencies:
- extend-shallow "^2.0.1"
- is-extendable "^0.1.1"
- is-plain-object "^2.0.3"
- split-string "^3.0.1"
-
-setimmediate@^1.0.4, setimmediate@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
- integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
-
-setprototypeof@1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
- integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
-
-setprototypeof@1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
- integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
-
-sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8:
- version "2.4.11"
- resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
- integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
- dependencies:
- inherits "^2.0.1"
- safe-buffer "^5.0.1"
-
-sha@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/sha/-/sha-3.0.0.tgz#b2f2f90af690c16a3a839a6a6c680ea51fedd1ae"
- integrity sha512-DOYnM37cNsLNSGIG/zZWch5CKIRNoLdYUQTQlcgkRkoYIUwDYjqDyye16YcDZg/OPdcbUgTKMjc4SY6TB7ZAPw==
- dependencies:
- graceful-fs "^4.1.2"
-
-shallow-clone@^0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060"
- integrity sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=
- dependencies:
- is-extendable "^0.1.1"
- kind-of "^2.0.1"
- lazy-cache "^0.2.3"
- mixin-object "^2.0.1"
-
-shallow-clone@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3"
- integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==
- dependencies:
- kind-of "^6.0.2"
-
-shebang-command@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
- integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
- dependencies:
- shebang-regex "^1.0.0"
-
-shebang-command@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
- integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
- dependencies:
- shebang-regex "^3.0.0"
-
-shebang-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
- integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
-
-shebang-regex@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
- integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
-
-shell-quote@1.7.2:
- version "1.7.2"
- resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2"
- integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==
-
-shellwords@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
- integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
-
-side-channel@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947"
- integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==
- dependencies:
- es-abstract "^1.17.0-next.1"
- object-inspect "^1.7.0"
-
-signal-exit@^3.0.0, signal-exit@^3.0.2:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
- integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
-
-signale@^1.2.1:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/signale/-/signale-1.4.0.tgz#c4be58302fb0262ac00fc3d886a7c113759042f1"
- integrity sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==
- dependencies:
- chalk "^2.3.2"
- figures "^2.0.0"
- pkg-conf "^2.1.0"
-
-simple-swizzle@^0.2.2:
- version "0.2.2"
- resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
- integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=
- dependencies:
- is-arrayish "^0.3.1"
-
-sisteransi@^1.0.4:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
- integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
-
-slash@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
- integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
-
-slash@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
- integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
-
-slash@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
- integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
-
-slice-ansi@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
- integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
- dependencies:
- ansi-styles "^3.2.0"
- astral-regex "^1.0.0"
- is-fullwidth-code-point "^2.0.0"
-
-slide@^1.1.6, slide@~1.1.3, slide@~1.1.6:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
- integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=
-
-smart-buffer@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba"
- integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==
-
-snapdragon-node@^2.0.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
- integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
- dependencies:
- define-property "^1.0.0"
- isobject "^3.0.0"
- snapdragon-util "^3.0.1"
-
-snapdragon-util@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
- integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
- dependencies:
- kind-of "^3.2.0"
-
-snapdragon@^0.8.1:
- version "0.8.2"
- resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
- integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
- dependencies:
- base "^0.11.1"
- debug "^2.2.0"
- define-property "^0.2.5"
- extend-shallow "^2.0.1"
- map-cache "^0.2.2"
- source-map "^0.5.6"
- source-map-resolve "^0.5.0"
- use "^3.1.0"
-
-sockette@^2.0.0:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/sockette/-/sockette-2.0.6.tgz#63b533f3cfe3b592fc84178beea6577fa18cebf3"
- integrity sha512-W6iG8RGV6Zife3Cj+FhuyHV447E6fqFM2hKmnaQrTvg3OydINV3Msj3WPFbX76blUlUxvQSMMMdrJxce8NqI5Q==
-
-sockjs-client@1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5"
- integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==
- dependencies:
- debug "^3.2.5"
- eventsource "^1.0.7"
- faye-websocket "~0.11.1"
- inherits "^2.0.3"
- json3 "^3.3.2"
- url-parse "^1.4.3"
-
-sockjs@0.3.19:
- version "0.3.19"
- resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d"
- integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==
- dependencies:
- faye-websocket "^0.10.0"
- uuid "^3.0.1"
-
-socks-proxy-agent@^4.0.0:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386"
- integrity sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==
- dependencies:
- agent-base "~4.2.1"
- socks "~2.3.2"
-
-socks@~2.3.2:
- version "2.3.3"
- resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.3.tgz#01129f0a5d534d2b897712ed8aceab7ee65d78e3"
- integrity sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==
- dependencies:
- ip "1.1.5"
- smart-buffer "^4.1.0"
-
-sort-keys@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
- integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0=
- dependencies:
- is-plain-obj "^1.0.0"
-
-sortabular@^1.5.1:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/sortabular/-/sortabular-1.6.0.tgz#d320198c3add5cf8e200b14e076f0a06ad08d341"
- integrity sha512-rKOAXc3Z5JXCeMR1FV6Yuh5HSQUAUyMpEBni5qgO84FBv+C9p4yZ4GnHDhFTyfyMCo7qMS+ZF8ffzXApUOzTBg==
-
-sorted-object@~2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/sorted-object/-/sorted-object-2.0.1.tgz#7d631f4bd3a798a24af1dffcfbfe83337a5df5fc"
- integrity sha1-fWMfS9OnmKJK8d/8+/6DM3pd9fw=
-
-sorted-union-stream@~2.1.3:
- version "2.1.3"
- resolved "https://registry.yarnpkg.com/sorted-union-stream/-/sorted-union-stream-2.1.3.tgz#c7794c7e077880052ff71a8d4a2dbb4a9a638ac7"
- integrity sha1-x3lMfgd4gAUv9xqNSi27Sppjisc=
- dependencies:
- from2 "^1.3.0"
- stream-iterate "^1.1.0"
-
-source-list-map@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
- integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
-
-source-map-resolve@^0.5.0, source-map-resolve@^0.5.2:
- version "0.5.3"
- resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
- integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
- dependencies:
- atob "^2.1.2"
- decode-uri-component "^0.2.0"
- resolve-url "^0.2.1"
- source-map-url "^0.4.0"
- urix "^0.1.0"
-
-source-map-support@^0.5.6, source-map-support@~0.5.12:
- version "0.5.19"
- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
- integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
- dependencies:
- buffer-from "^1.0.0"
- source-map "^0.6.0"
-
-source-map-url@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
- integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
-
-source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
- integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
-
-source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7:
- version "0.5.7"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
- integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
-
-spawn-error-forwarder@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz#1afd94738e999b0346d7b9fc373be55e07577029"
- integrity sha1-Gv2Uc46ZmwNG17n8NzvlXgdXcCk=
-
-spdx-correct@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4"
- integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==
- dependencies:
- spdx-expression-parse "^3.0.0"
- spdx-license-ids "^3.0.0"
-
-spdx-exceptions@^2.1.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
- integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
-
-spdx-expression-parse@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
- integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
- dependencies:
- spdx-exceptions "^2.1.0"
- spdx-license-ids "^3.0.0"
-
-spdx-license-ids@^3.0.0:
- version "3.0.5"
- resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654"
- integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==
-
-spdy-transport@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31"
- integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==
- dependencies:
- debug "^4.1.0"
- detect-node "^2.0.4"
- hpack.js "^2.1.6"
- obuf "^1.1.2"
- readable-stream "^3.0.6"
- wbuf "^1.7.3"
-
-spdy@^4.0.1:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b"
- integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==
- dependencies:
- debug "^4.1.0"
- handle-thing "^2.0.0"
- http-deceiver "^1.2.7"
- select-hose "^2.0.0"
- spdy-transport "^3.0.0"
-
-split-on-first@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f"
- integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==
-
-split-string@^3.0.1, split-string@^3.0.2:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
- integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
- dependencies:
- extend-shallow "^3.0.0"
-
-split2@^2.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493"
- integrity sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==
- dependencies:
- through2 "^2.0.2"
-
-split2@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/split2/-/split2-1.0.0.tgz#52e2e221d88c75f9a73f90556e263ff96772b314"
- integrity sha1-UuLiIdiMdfmnP5BVbiY/+WdysxQ=
- dependencies:
- through2 "~2.0.0"
-
-split@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9"
- integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==
- dependencies:
- through "2"
-
-sprintf-js@~1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
- integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
-
-sshpk@^1.7.0:
- version "1.16.1"
- resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
- integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
- dependencies:
- asn1 "~0.2.3"
- assert-plus "^1.0.0"
- bcrypt-pbkdf "^1.0.0"
- dashdash "^1.12.0"
- ecc-jsbn "~0.1.1"
- getpass "^0.1.1"
- jsbn "~0.1.0"
- safer-buffer "^2.0.2"
- tweetnacl "~0.14.0"
-
-ssri@^6.0.0, ssri@^6.0.1:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8"
- integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==
- dependencies:
- figgy-pudding "^3.5.1"
-
-ssri@^7.0.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d"
- integrity sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==
- dependencies:
- figgy-pudding "^3.5.1"
- minipass "^3.1.1"
-
-stable@^0.1.8:
- version "0.1.8"
- resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
- integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
-
-stack-utils@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8"
- integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==
-
-static-extend@^0.1.1:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
- integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
- dependencies:
- define-property "^0.2.5"
- object-copy "^0.1.0"
-
-"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
- integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
-
-stealthy-require@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
- integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=
-
-stream-browserify@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b"
- integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==
- dependencies:
- inherits "~2.0.1"
- readable-stream "^2.0.2"
-
-stream-combiner2@~1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe"
- integrity sha1-+02KFCDqNidk4hrUeAOXvry0HL4=
- dependencies:
- duplexer2 "~0.1.0"
- readable-stream "^2.0.2"
-
-stream-each@^1.1.0:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae"
- integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==
- dependencies:
- end-of-stream "^1.1.0"
- stream-shift "^1.0.0"
-
-stream-http@^2.7.2:
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
- integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==
- dependencies:
- builtin-status-codes "^3.0.0"
- inherits "^2.0.1"
- readable-stream "^2.3.6"
- to-arraybuffer "^1.0.0"
- xtend "^4.0.0"
-
-stream-iterate@^1.1.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/stream-iterate/-/stream-iterate-1.2.0.tgz#2bd7c77296c1702a46488b8ad41f79865eecd4e1"
- integrity sha1-K9fHcpbBcCpGSIuK1B95hl7s1OE=
- dependencies:
- readable-stream "^2.1.5"
- stream-shift "^1.0.0"
-
-stream-shift@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
- integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
-
-stream@^0.0.2:
- version "0.0.2"
- resolved "https://registry.yarnpkg.com/stream/-/stream-0.0.2.tgz#7f5363f057f6592c5595f00bc80a27f5cec1f0ef"
- integrity sha1-f1Nj8Ff2WSxVlfALyAon9c7B8O8=
- dependencies:
- emitter-component "^1.1.1"
-
-strict-uri-encode@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
- integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
-
-strict-uri-encode@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
- integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY=
-
-string-length@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed"
- integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=
- dependencies:
- astral-regex "^1.0.0"
- strip-ansi "^4.0.0"
-
-string-length@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837"
- integrity sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==
- dependencies:
- astral-regex "^1.0.0"
- strip-ansi "^5.2.0"
-
-string-width@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
- integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
- dependencies:
- code-point-at "^1.0.0"
- is-fullwidth-code-point "^1.0.0"
- strip-ansi "^3.0.0"
-
-"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
- integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
- dependencies:
- is-fullwidth-code-point "^2.0.0"
- strip-ansi "^4.0.0"
-
-string-width@^3.0.0, string-width@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
- integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
- dependencies:
- emoji-regex "^7.0.1"
- is-fullwidth-code-point "^2.0.0"
- strip-ansi "^5.1.0"
-
-string-width@^4.1.0, string-width@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
- integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
- dependencies:
- emoji-regex "^8.0.0"
- is-fullwidth-code-point "^3.0.0"
- strip-ansi "^6.0.0"
-
-string.prototype.matchall@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e"
- integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==
- dependencies:
- define-properties "^1.1.3"
- es-abstract "^1.17.0"
- has-symbols "^1.0.1"
- internal-slot "^1.0.2"
- regexp.prototype.flags "^1.3.0"
- side-channel "^1.0.2"
-
-string.prototype.trimend@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913"
- integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==
- dependencies:
- define-properties "^1.1.3"
- es-abstract "^1.17.5"
-
-string.prototype.trimleft@^2.1.1:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc"
- integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==
- dependencies:
- define-properties "^1.1.3"
- es-abstract "^1.17.5"
- string.prototype.trimstart "^1.0.0"
-
-string.prototype.trimright@^2.1.1:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3"
- integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==
- dependencies:
- define-properties "^1.1.3"
- es-abstract "^1.17.5"
- string.prototype.trimend "^1.0.0"
-
-string.prototype.trimstart@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54"
- integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==
- dependencies:
- define-properties "^1.1.3"
- es-abstract "^1.17.5"
-
-string_decoder@^1.0.0, string_decoder@^1.1.1:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
- integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
- dependencies:
- safe-buffer "~5.2.0"
-
-string_decoder@~0.10.x:
- version "0.10.31"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
- integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
-
-string_decoder@~1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
- integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
- dependencies:
- safe-buffer "~5.1.0"
-
-stringify-object@^3.3.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629"
- integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==
- dependencies:
- get-own-enumerable-property-symbols "^3.0.0"
- is-obj "^1.0.1"
- is-regexp "^1.0.0"
-
-stringify-package@^1.0.0, stringify-package@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.1.tgz#e5aa3643e7f74d0f28628b72f3dad5cecfc3ba85"
- integrity sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==
-
-strip-ansi@6.0.0, strip-ansi@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
- integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
- dependencies:
- ansi-regex "^5.0.0"
-
-strip-ansi@^3.0.0, strip-ansi@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
- integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
- dependencies:
- ansi-regex "^2.0.0"
-
-strip-ansi@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
- integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
- dependencies:
- ansi-regex "^3.0.0"
-
-strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
- integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
- dependencies:
- ansi-regex "^4.1.0"
-
-strip-bom@4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878"
- integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==
-
-strip-bom@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
- integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
-
-strip-comments@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d"
- integrity sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==
- dependencies:
- babel-extract-comments "^1.0.0"
- babel-plugin-transform-object-rest-spread "^6.26.0"
-
-strip-eof@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
- integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
-
-strip-final-newline@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
- integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
-
-strip-indent@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
- integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
- dependencies:
- min-indent "^1.0.0"
-
-strip-json-comments@3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7"
- integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==
-
-strip-json-comments@^3.0.1:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180"
- integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==
-
-strip-json-comments@~2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
- integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
-
-style-loader@0.23.1:
- version "0.23.1"
- resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925"
- integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==
- dependencies:
- loader-utils "^1.1.0"
- schema-utils "^1.0.0"
-
-stylehacks@^4.0.0:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5"
- integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==
- dependencies:
- browserslist "^4.0.0"
- postcss "^7.0.0"
- postcss-selector-parser "^3.0.0"
-
-supports-color@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
- integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
-
-supports-color@^5.0.0, supports-color@^5.3.0:
- version "5.5.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
- integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
- dependencies:
- has-flag "^3.0.0"
-
-supports-color@^6.1.0:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
- integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
- dependencies:
- has-flag "^3.0.0"
-
-supports-color@^7.0.0, supports-color@^7.1.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
- integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
- dependencies:
- has-flag "^4.0.0"
-
-supports-hyperlinks@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz#71daedf36cc1060ac5100c351bb3da48c29c0ef7"
- integrity sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==
- dependencies:
- has-flag "^2.0.0"
- supports-color "^5.0.0"
-
-svg-parser@^2.0.0:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5"
- integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==
-
-svgo@^1.0.0, svgo@^1.2.2:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167"
- integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==
- dependencies:
- chalk "^2.4.1"
- coa "^2.0.2"
- css-select "^2.0.0"
- css-select-base-adapter "^0.1.1"
- css-tree "1.0.0-alpha.37"
- csso "^4.0.2"
- js-yaml "^3.13.1"
- mkdirp "~0.5.1"
- object.values "^1.1.0"
- sax "~1.2.4"
- stable "^0.1.8"
- unquote "~1.1.1"
- util.promisify "~1.0.0"
-
-swagger-client@^3.10.3:
- version "3.10.3"
- resolved "https://registry.yarnpkg.com/swagger-client/-/swagger-client-3.10.3.tgz#0735762a8940506c742502b01423f18b74b90c64"
- integrity sha512-mv/mVh+DEAh5o2qykTB7SK7a/ViuwWaKozHHzqOZpxkHJq4UIpiTA6jQpk+mYjdwYPISGwOVt/bd7J8OTleMjQ==
+ "aggregate-error" "^3.0.0"
+ "cosmiconfig" "^6.0.0"
+ "debug" "^4.0.0"
+ "env-ci" "^4.0.0"
+ "execa" "^3.2.0"
+ "figures" "^3.0.0"
+ "find-versions" "^3.0.0"
+ "get-stream" "^5.0.0"
+ "git-log-parser" "^1.2.0"
+ "hook-std" "^2.0.0"
+ "hosted-git-info" "^3.0.0"
+ "lodash" "^4.17.15"
+ "marked" "^0.7.0"
+ "marked-terminal" "^3.2.0"
+ "p-locate" "^4.0.0"
+ "p-reduce" "^2.0.0"
+ "read-pkg-up" "^7.0.0"
+ "resolve-from" "^5.0.0"
+ "semver" "^6.0.0"
+ "signale" "^1.2.1"
+ "yargs" "^15.0.1"
+
+"semver-diff@^2.0.0":
+ "integrity" "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY="
+ "resolved" "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "semver" "^5.0.3"
+
+"semver-regex@^2.0.0":
+ "integrity" "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw=="
+ "resolved" "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz"
+ "version" "2.0.0"
+
+"semver@^2.3.0 || 3.x || 4 || 5", "semver@^5.0.3", "semver@^5.1.0", "semver@^5.4.1", "semver@^5.5.0", "semver@^5.5.1", "semver@^5.6.0", "semver@^5.7.1", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5":
+ "integrity" "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz"
+ "version" "5.7.1"
+
+"semver@^6.0.0":
+ "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
+ "version" "6.3.0"
+
+"semver@^6.1.2":
+ "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
+ "version" "6.3.0"
+
+"semver@^6.2.0":
+ "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
+ "version" "6.3.0"
+
+"semver@^6.3.0", "semver@6.3.0":
+ "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
+ "version" "6.3.0"
+
+"semver@^7.3.2":
+ "integrity" "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ=="
+ "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz"
+ "version" "7.3.2"
+
+"semver@7.0.0":
+ "integrity" "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A=="
+ "resolved" "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz"
+ "version" "7.0.0"
+
+"send@0.17.1":
+ "integrity" "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg=="
+ "resolved" "https://registry.npmjs.org/send/-/send-0.17.1.tgz"
+ "version" "0.17.1"
+ dependencies:
+ "debug" "2.6.9"
+ "depd" "~1.1.2"
+ "destroy" "~1.0.4"
+ "encodeurl" "~1.0.2"
+ "escape-html" "~1.0.3"
+ "etag" "~1.8.1"
+ "fresh" "0.5.2"
+ "http-errors" "~1.7.2"
+ "mime" "1.6.0"
+ "ms" "2.1.1"
+ "on-finished" "~2.3.0"
+ "range-parser" "~1.2.1"
+ "statuses" "~1.5.0"
+
+"serialize-error@^2.1.0":
+ "integrity" "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go="
+ "resolved" "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz"
+ "version" "2.1.0"
+
+"serialize-javascript@^2.1.2":
+ "integrity" "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ=="
+ "resolved" "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz"
+ "version" "2.1.2"
+
+"serialize-javascript@^4.0.0":
+ "integrity" "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw=="
+ "resolved" "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz"
+ "version" "4.0.0"
+ dependencies:
+ "randombytes" "^2.1.0"
+
+"serve-index@^1.9.1":
+ "integrity" "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk="
+ "resolved" "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz"
+ "version" "1.9.1"
+ dependencies:
+ "accepts" "~1.3.4"
+ "batch" "0.6.1"
+ "debug" "2.6.9"
+ "escape-html" "~1.0.3"
+ "http-errors" "~1.6.2"
+ "mime-types" "~2.1.17"
+ "parseurl" "~1.3.2"
+
+"serve-static@1.14.1":
+ "integrity" "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg=="
+ "resolved" "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz"
+ "version" "1.14.1"
+ dependencies:
+ "encodeurl" "~1.0.2"
+ "escape-html" "~1.0.3"
+ "parseurl" "~1.3.3"
+ "send" "0.17.1"
+
+"set-blocking@^2.0.0", "set-blocking@~2.0.0":
+ "integrity" "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+ "resolved" "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz"
+ "version" "2.0.0"
+
+"set-value@^2.0.0", "set-value@^2.0.1":
+ "integrity" "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw=="
+ "resolved" "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz"
+ "version" "2.0.1"
+ dependencies:
+ "extend-shallow" "^2.0.1"
+ "is-extendable" "^0.1.1"
+ "is-plain-object" "^2.0.3"
+ "split-string" "^3.0.1"
+
+"setimmediate@^1.0.4", "setimmediate@^1.0.5":
+ "integrity" "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
+ "resolved" "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz"
+ "version" "1.0.5"
+
+"setprototypeof@1.1.0":
+ "integrity" "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
+ "resolved" "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz"
+ "version" "1.1.0"
+
+"setprototypeof@1.1.1":
+ "integrity" "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
+ "resolved" "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz"
+ "version" "1.1.1"
+
+"sha.js@^2.4.0", "sha.js@^2.4.11", "sha.js@^2.4.8":
+ "integrity" "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ=="
+ "resolved" "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz"
+ "version" "2.4.11"
+ dependencies:
+ "inherits" "^2.0.1"
+ "safe-buffer" "^5.0.1"
+
+"sha@^3.0.0":
+ "integrity" "sha512-DOYnM37cNsLNSGIG/zZWch5CKIRNoLdYUQTQlcgkRkoYIUwDYjqDyye16YcDZg/OPdcbUgTKMjc4SY6TB7ZAPw=="
+ "resolved" "https://registry.npmjs.org/sha/-/sha-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "graceful-fs" "^4.1.2"
+
+"shallow-clone@^0.1.2":
+ "integrity" "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA="
+ "resolved" "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz"
+ "version" "0.1.2"
+ dependencies:
+ "is-extendable" "^0.1.1"
+ "kind-of" "^2.0.1"
+ "lazy-cache" "^0.2.3"
+ "mixin-object" "^2.0.1"
+
+"shallow-clone@^3.0.0":
+ "integrity" "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA=="
+ "resolved" "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz"
+ "version" "3.0.1"
+ dependencies:
+ "kind-of" "^6.0.2"
+
+"shebang-command@^1.2.0":
+ "integrity" "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo="
+ "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz"
+ "version" "1.2.0"
+ dependencies:
+ "shebang-regex" "^1.0.0"
+
+"shebang-command@^2.0.0":
+ "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="
+ "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "shebang-regex" "^3.0.0"
+
+"shebang-regex@^1.0.0":
+ "integrity" "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
+ "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz"
+ "version" "1.0.0"
+
+"shebang-regex@^3.0.0":
+ "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+ "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"
+ "version" "3.0.0"
+
+"shell-quote@1.7.2":
+ "integrity" "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg=="
+ "resolved" "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz"
+ "version" "1.7.2"
+
+"shellwords@^0.1.1":
+ "integrity" "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww=="
+ "resolved" "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz"
+ "version" "0.1.1"
+
+"side-channel@^1.0.4":
+ "integrity" "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw=="
+ "resolved" "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz"
+ "version" "1.0.4"
+ dependencies:
+ "call-bind" "^1.0.0"
+ "get-intrinsic" "^1.0.2"
+ "object-inspect" "^1.9.0"
+
+"signal-exit@^3.0.0", "signal-exit@^3.0.2":
+ "integrity" "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
+ "resolved" "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz"
+ "version" "3.0.3"
+
+"signale@^1.2.1":
+ "integrity" "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w=="
+ "resolved" "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz"
+ "version" "1.4.0"
+ dependencies:
+ "chalk" "^2.3.2"
+ "figures" "^2.0.0"
+ "pkg-conf" "^2.1.0"
+
+"simple-swizzle@^0.2.2":
+ "integrity" "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo="
+ "resolved" "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz"
+ "version" "0.2.2"
+ dependencies:
+ "is-arrayish" "^0.3.1"
+
+"sisteransi@^1.0.4":
+ "integrity" "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="
+ "resolved" "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz"
+ "version" "1.0.5"
+
+"slash@^1.0.0":
+ "integrity" "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
+ "resolved" "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz"
+ "version" "1.0.0"
+
+"slash@^2.0.0":
+ "integrity" "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A=="
+ "resolved" "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz"
+ "version" "2.0.0"
+
+"slash@^3.0.0":
+ "integrity" "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
+ "resolved" "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz"
+ "version" "3.0.0"
+
+"slice-ansi@^2.1.0":
+ "integrity" "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ=="
+ "resolved" "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "ansi-styles" "^3.2.0"
+ "astral-regex" "^1.0.0"
+ "is-fullwidth-code-point" "^2.0.0"
+
+"slide@^1.1.6", "slide@~1.1.3", "slide@~1.1.6":
+ "integrity" "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc="
+ "resolved" "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz"
+ "version" "1.1.6"
+
+"smart-buffer@^4.1.0":
+ "integrity" "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw=="
+ "resolved" "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz"
+ "version" "4.1.0"
+
+"snapdragon-node@^2.0.1":
+ "integrity" "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw=="
+ "resolved" "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz"
+ "version" "2.1.1"
+ dependencies:
+ "define-property" "^1.0.0"
+ "isobject" "^3.0.0"
+ "snapdragon-util" "^3.0.1"
+
+"snapdragon-util@^3.0.1":
+ "integrity" "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ=="
+ "resolved" "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz"
+ "version" "3.0.1"
+ dependencies:
+ "kind-of" "^3.2.0"
+
+"snapdragon@^0.8.1":
+ "integrity" "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg=="
+ "resolved" "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz"
+ "version" "0.8.2"
+ dependencies:
+ "base" "^0.11.1"
+ "debug" "^2.2.0"
+ "define-property" "^0.2.5"
+ "extend-shallow" "^2.0.1"
+ "map-cache" "^0.2.2"
+ "source-map" "^0.5.6"
+ "source-map-resolve" "^0.5.0"
+ "use" "^3.1.0"
+
+"sockette@^2.0.0":
+ "integrity" "sha512-W6iG8RGV6Zife3Cj+FhuyHV447E6fqFM2hKmnaQrTvg3OydINV3Msj3WPFbX76blUlUxvQSMMMdrJxce8NqI5Q=="
+ "resolved" "https://registry.npmjs.org/sockette/-/sockette-2.0.6.tgz"
+ "version" "2.0.6"
+
+"sockjs-client@1.4.0":
+ "integrity" "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g=="
+ "resolved" "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz"
+ "version" "1.4.0"
+ dependencies:
+ "debug" "^3.2.5"
+ "eventsource" "^1.0.7"
+ "faye-websocket" "~0.11.1"
+ "inherits" "^2.0.3"
+ "json3" "^3.3.2"
+ "url-parse" "^1.4.3"
+
+"sockjs@0.3.19":
+ "integrity" "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw=="
+ "resolved" "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz"
+ "version" "0.3.19"
+ dependencies:
+ "faye-websocket" "^0.10.0"
+ "uuid" "^3.0.1"
+
+"socks-proxy-agent@^4.0.0":
+ "integrity" "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg=="
+ "resolved" "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz"
+ "version" "4.0.2"
+ dependencies:
+ "agent-base" "~4.2.1"
+ "socks" "~2.3.2"
+
+"socks@~2.3.2":
+ "integrity" "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA=="
+ "resolved" "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz"
+ "version" "2.3.3"
+ dependencies:
+ "ip" "1.1.5"
+ "smart-buffer" "^4.1.0"
+
+"sort-keys@^1.0.0":
+ "integrity" "sha1-RBttTTRnmPG05J6JIK37oOVD+a0="
+ "resolved" "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz"
+ "version" "1.1.2"
+ dependencies:
+ "is-plain-obj" "^1.0.0"
+
+"sortabular@^1.5.1":
+ "integrity" "sha512-rKOAXc3Z5JXCeMR1FV6Yuh5HSQUAUyMpEBni5qgO84FBv+C9p4yZ4GnHDhFTyfyMCo7qMS+ZF8ffzXApUOzTBg=="
+ "resolved" "https://registry.npmjs.org/sortabular/-/sortabular-1.6.0.tgz"
+ "version" "1.6.0"
+
+"sorted-object@~2.0.1":
+ "integrity" "sha1-fWMfS9OnmKJK8d/8+/6DM3pd9fw="
+ "resolved" "https://registry.npmjs.org/sorted-object/-/sorted-object-2.0.1.tgz"
+ "version" "2.0.1"
+
+"sorted-union-stream@~2.1.3":
+ "integrity" "sha1-x3lMfgd4gAUv9xqNSi27Sppjisc="
+ "resolved" "https://registry.npmjs.org/sorted-union-stream/-/sorted-union-stream-2.1.3.tgz"
+ "version" "2.1.3"
+ dependencies:
+ "from2" "^1.3.0"
+ "stream-iterate" "^1.1.0"
+
+"source-list-map@^2.0.0":
+ "integrity" "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="
+ "resolved" "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz"
+ "version" "2.0.1"
+
+"source-map-resolve@^0.5.0", "source-map-resolve@^0.5.2":
+ "integrity" "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw=="
+ "resolved" "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz"
+ "version" "0.5.3"
+ dependencies:
+ "atob" "^2.1.2"
+ "decode-uri-component" "^0.2.0"
+ "resolve-url" "^0.2.1"
+ "source-map-url" "^0.4.0"
+ "urix" "^0.1.0"
+
+"source-map-support@^0.5.6", "source-map-support@~0.5.12":
+ "integrity" "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw=="
+ "resolved" "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz"
+ "version" "0.5.19"
+ dependencies:
+ "buffer-from" "^1.0.0"
+ "source-map" "^0.6.0"
+
+"source-map-url@^0.4.0":
+ "integrity" "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
+ "resolved" "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz"
+ "version" "0.4.0"
+
+"source-map@^0.5.0":
+ "integrity" "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz"
+ "version" "0.5.7"
+
+"source-map@^0.5.6":
+ "integrity" "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz"
+ "version" "0.5.7"
+
+"source-map@^0.5.7":
+ "integrity" "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz"
+ "version" "0.5.7"
+
+"source-map@^0.6.0", "source-map@^0.6.1", "source-map@~0.6.0", "source-map@~0.6.1", "source-map@0.6.1":
+ "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
+ "version" "0.6.1"
+
+"spawn-error-forwarder@~1.0.0":
+ "integrity" "sha1-Gv2Uc46ZmwNG17n8NzvlXgdXcCk="
+ "resolved" "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz"
+ "version" "1.0.0"
+
+"spdx-correct@^3.0.0":
+ "integrity" "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q=="
+ "resolved" "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "spdx-expression-parse" "^3.0.0"
+ "spdx-license-ids" "^3.0.0"
+
+"spdx-exceptions@^2.1.0":
+ "integrity" "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A=="
+ "resolved" "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz"
+ "version" "2.3.0"
+
+"spdx-expression-parse@^3.0.0":
+ "integrity" "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="
+ "resolved" "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz"
+ "version" "3.0.1"
+ dependencies:
+ "spdx-exceptions" "^2.1.0"
+ "spdx-license-ids" "^3.0.0"
+
+"spdx-license-ids@^3.0.0":
+ "integrity" "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q=="
+ "resolved" "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz"
+ "version" "3.0.5"
+
+"spdy-transport@^3.0.0":
+ "integrity" "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw=="
+ "resolved" "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "debug" "^4.1.0"
+ "detect-node" "^2.0.4"
+ "hpack.js" "^2.1.6"
+ "obuf" "^1.1.2"
+ "readable-stream" "^3.0.6"
+ "wbuf" "^1.7.3"
+
+"spdy@^4.0.1":
+ "integrity" "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA=="
+ "resolved" "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz"
+ "version" "4.0.2"
+ dependencies:
+ "debug" "^4.1.0"
+ "handle-thing" "^2.0.0"
+ "http-deceiver" "^1.2.7"
+ "select-hose" "^2.0.0"
+ "spdy-transport" "^3.0.0"
+
+"split-on-first@^1.0.0":
+ "integrity" "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw=="
+ "resolved" "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz"
+ "version" "1.1.0"
+
+"split-string@^3.0.1", "split-string@^3.0.2":
+ "integrity" "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw=="
+ "resolved" "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "extend-shallow" "^3.0.0"
+
+"split@^1.0.0":
+ "integrity" "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg=="
+ "resolved" "https://registry.npmjs.org/split/-/split-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "through" "2"
+
+"split2@^2.0.0":
+ "integrity" "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw=="
+ "resolved" "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz"
+ "version" "2.2.0"
+ dependencies:
+ "through2" "^2.0.2"
+
+"split2@~1.0.0":
+ "integrity" "sha1-UuLiIdiMdfmnP5BVbiY/+WdysxQ="
+ "resolved" "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "through2" "~2.0.0"
+
+"sprintf-js@~1.0.2":
+ "integrity" "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+ "resolved" "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz"
+ "version" "1.0.3"
+
+"sshpk@^1.7.0":
+ "integrity" "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg=="
+ "resolved" "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz"
+ "version" "1.16.1"
+ dependencies:
+ "asn1" "~0.2.3"
+ "assert-plus" "^1.0.0"
+ "bcrypt-pbkdf" "^1.0.0"
+ "dashdash" "^1.12.0"
+ "ecc-jsbn" "~0.1.1"
+ "getpass" "^0.1.1"
+ "jsbn" "~0.1.0"
+ "safer-buffer" "^2.0.2"
+ "tweetnacl" "~0.14.0"
+
+"ssri@^6.0.0", "ssri@^6.0.1":
+ "integrity" "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA=="
+ "resolved" "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz"
+ "version" "6.0.1"
+ dependencies:
+ "figgy-pudding" "^3.5.1"
+
+"ssri@^7.0.0":
+ "integrity" "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g=="
+ "resolved" "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz"
+ "version" "7.1.0"
+ dependencies:
+ "figgy-pudding" "^3.5.1"
+ "minipass" "^3.1.1"
+
+"stable@^0.1.8":
+ "integrity" "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w=="
+ "resolved" "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz"
+ "version" "0.1.8"
+
+"stack-utils@^1.0.1":
+ "integrity" "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA=="
+ "resolved" "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz"
+ "version" "1.0.2"
+
+"static-extend@^0.1.1":
+ "integrity" "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY="
+ "resolved" "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz"
+ "version" "0.1.2"
+ dependencies:
+ "define-property" "^0.2.5"
+ "object-copy" "^0.1.0"
+
+"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", "statuses@~1.5.0":
+ "integrity" "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+ "resolved" "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz"
+ "version" "1.5.0"
+
+"stealthy-require@^1.1.1":
+ "integrity" "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks="
+ "resolved" "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz"
+ "version" "1.1.1"
+
+"stream-browserify@^2.0.1":
+ "integrity" "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg=="
+ "resolved" "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz"
+ "version" "2.0.2"
+ dependencies:
+ "inherits" "~2.0.1"
+ "readable-stream" "^2.0.2"
+
+"stream-combiner2@~1.1.1":
+ "integrity" "sha1-+02KFCDqNidk4hrUeAOXvry0HL4="
+ "resolved" "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz"
+ "version" "1.1.1"
+ dependencies:
+ "duplexer2" "~0.1.0"
+ "readable-stream" "^2.0.2"
+
+"stream-each@^1.1.0":
+ "integrity" "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw=="
+ "resolved" "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz"
+ "version" "1.2.3"
+ dependencies:
+ "end-of-stream" "^1.1.0"
+ "stream-shift" "^1.0.0"
+
+"stream-http@^2.7.2":
+ "integrity" "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw=="
+ "resolved" "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz"
+ "version" "2.8.3"
+ dependencies:
+ "builtin-status-codes" "^3.0.0"
+ "inherits" "^2.0.1"
+ "readable-stream" "^2.3.6"
+ "to-arraybuffer" "^1.0.0"
+ "xtend" "^4.0.0"
+
+"stream-iterate@^1.1.0":
+ "integrity" "sha1-K9fHcpbBcCpGSIuK1B95hl7s1OE="
+ "resolved" "https://registry.npmjs.org/stream-iterate/-/stream-iterate-1.2.0.tgz"
+ "version" "1.2.0"
+ dependencies:
+ "readable-stream" "^2.1.5"
+ "stream-shift" "^1.0.0"
+
+"stream-shift@^1.0.0":
+ "integrity" "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ=="
+ "resolved" "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz"
+ "version" "1.0.1"
+
+"stream@^0.0.2":
+ "integrity" "sha1-f1Nj8Ff2WSxVlfALyAon9c7B8O8="
+ "resolved" "https://registry.npmjs.org/stream/-/stream-0.0.2.tgz"
+ "version" "0.0.2"
+ dependencies:
+ "emitter-component" "^1.1.1"
+
+"strict-uri-encode@^1.0.0":
+ "integrity" "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
+ "resolved" "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz"
+ "version" "1.1.0"
+
+"strict-uri-encode@^2.0.0":
+ "integrity" "sha1-ucczDHBChi9rFC3CdLvMWGbONUY="
+ "resolved" "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz"
+ "version" "2.0.0"
+
+"string_decoder@^1.0.0", "string_decoder@^1.1.1":
+ "integrity" "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="
+ "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
+ "version" "1.3.0"
+ dependencies:
+ "safe-buffer" "~5.2.0"
+
+"string_decoder@~0.10.x":
+ "integrity" "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz"
+ "version" "0.10.31"
+
+"string_decoder@~1.1.1":
+ "integrity" "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="
+ "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
+ "version" "1.1.1"
+ dependencies:
+ "safe-buffer" "~5.1.0"
+
+"string-length@^2.0.0":
+ "integrity" "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0="
+ "resolved" "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "astral-regex" "^1.0.0"
+ "strip-ansi" "^4.0.0"
+
+"string-length@^3.1.0":
+ "integrity" "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA=="
+ "resolved" "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "astral-regex" "^1.0.0"
+ "strip-ansi" "^5.2.0"
+
+"string-width@^1.0.1":
+ "integrity" "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M="
+ "resolved" "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "code-point-at" "^1.0.0"
+ "is-fullwidth-code-point" "^1.0.0"
+ "strip-ansi" "^3.0.0"
+
+"string-width@^1.0.2":
+ "version" "1.0.2"
+ dependencies:
+ "code-point-at" "^1.0.0"
+ "is-fullwidth-code-point" "^1.0.0"
+ "strip-ansi" "^3.0.0"
+
+"string-width@^2.0.0", "string-width@^2.1.0", "string-width@^2.1.1":
+ "integrity" "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw=="
+ "resolved" "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz"
+ "version" "2.1.1"
+ dependencies:
+ "is-fullwidth-code-point" "^2.0.0"
+ "strip-ansi" "^4.0.0"
+
+"string-width@^3.0.0", "string-width@^3.1.0":
+ "integrity" "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w=="
+ "resolved" "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "emoji-regex" "^7.0.1"
+ "is-fullwidth-code-point" "^2.0.0"
+ "strip-ansi" "^5.1.0"
+
+"string-width@^4.1.0", "string-width@^4.2.0":
+ "integrity" "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg=="
+ "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz"
+ "version" "4.2.0"
+ dependencies:
+ "emoji-regex" "^8.0.0"
+ "is-fullwidth-code-point" "^3.0.0"
+ "strip-ansi" "^6.0.0"
+
+"string.prototype.matchall@^4.0.2", "string.prototype.matchall@^4.0.7":
+ "integrity" "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg=="
+ "resolved" "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz"
+ "version" "4.0.7"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "define-properties" "^1.1.3"
+ "es-abstract" "^1.19.1"
+ "get-intrinsic" "^1.1.1"
+ "has-symbols" "^1.0.3"
+ "internal-slot" "^1.0.3"
+ "regexp.prototype.flags" "^1.4.1"
+ "side-channel" "^1.0.4"
+
+"string.prototype.trimend@^1.0.5":
+ "integrity" "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog=="
+ "resolved" "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz"
+ "version" "1.0.5"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "define-properties" "^1.1.4"
+ "es-abstract" "^1.19.5"
+
+"string.prototype.trimstart@^1.0.5":
+ "integrity" "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg=="
+ "resolved" "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz"
+ "version" "1.0.5"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "define-properties" "^1.1.4"
+ "es-abstract" "^1.19.5"
+
+"stringify-object@^3.3.0":
+ "integrity" "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw=="
+ "resolved" "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz"
+ "version" "3.3.0"
+ dependencies:
+ "get-own-enumerable-property-symbols" "^3.0.0"
+ "is-obj" "^1.0.1"
+ "is-regexp" "^1.0.0"
+
+"stringify-package@^1.0.0", "stringify-package@^1.0.1":
+ "integrity" "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg=="
+ "resolved" "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz"
+ "version" "1.0.1"
+
+"strip-ansi@^3.0.0", "strip-ansi@^3.0.1":
+ "integrity" "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8="
+ "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz"
+ "version" "3.0.1"
+ dependencies:
+ "ansi-regex" "^2.0.0"
+
+"strip-ansi@^4.0.0":
+ "integrity" "sha1-qEeQIusaw2iocTibY1JixQXuNo8="
+ "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz"
+ "version" "4.0.0"
+ dependencies:
+ "ansi-regex" "^3.0.0"
+
+"strip-ansi@^5.0.0", "strip-ansi@^5.1.0", "strip-ansi@^5.2.0":
+ "integrity" "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="
+ "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz"
+ "version" "5.2.0"
+ dependencies:
+ "ansi-regex" "^4.1.0"
+
+"strip-ansi@^6.0.0":
+ "integrity" "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w=="
+ "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz"
+ "version" "6.0.0"
+ dependencies:
+ "ansi-regex" "^5.0.0"
+
+"strip-ansi@6.0.0":
+ "integrity" "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w=="
+ "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz"
+ "version" "6.0.0"
+ dependencies:
+ "ansi-regex" "^5.0.0"
+
+"strip-bom@^3.0.0":
+ "integrity" "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
+ "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz"
+ "version" "3.0.0"
+
+"strip-bom@4.0.0":
+ "integrity" "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="
+ "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz"
+ "version" "4.0.0"
+
+"strip-comments@^1.0.2":
+ "integrity" "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw=="
+ "resolved" "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "babel-extract-comments" "^1.0.0"
+ "babel-plugin-transform-object-rest-spread" "^6.26.0"
+
+"strip-eof@^1.0.0":
+ "integrity" "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
+ "resolved" "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz"
+ "version" "1.0.0"
+
+"strip-final-newline@^2.0.0":
+ "integrity" "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
+ "resolved" "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz"
+ "version" "2.0.0"
+
+"strip-indent@^3.0.0":
+ "integrity" "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ=="
+ "resolved" "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "min-indent" "^1.0.0"
+
+"strip-json-comments@^3.0.1":
+ "integrity" "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w=="
+ "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz"
+ "version" "3.1.0"
+
+"strip-json-comments@~2.0.1":
+ "integrity" "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
+ "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz"
+ "version" "2.0.1"
+
+"strip-json-comments@3.0.1":
+ "integrity" "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw=="
+ "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz"
+ "version" "3.0.1"
+
+"style-loader@0.23.1":
+ "integrity" "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg=="
+ "resolved" "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz"
+ "version" "0.23.1"
+ dependencies:
+ "loader-utils" "^1.1.0"
+ "schema-utils" "^1.0.0"
+
+"stylehacks@^4.0.0":
+ "integrity" "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g=="
+ "resolved" "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz"
+ "version" "4.0.3"
+ dependencies:
+ "browserslist" "^4.0.0"
+ "postcss" "^7.0.0"
+ "postcss-selector-parser" "^3.0.0"
+
+"supports-color@^2.0.0":
+ "integrity" "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+ "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz"
+ "version" "2.0.0"
+
+"supports-color@^5.0.0":
+ "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="
+ "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
+ "version" "5.5.0"
+ dependencies:
+ "has-flag" "^3.0.0"
+
+"supports-color@^5.3.0":
+ "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="
+ "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
+ "version" "5.5.0"
+ dependencies:
+ "has-flag" "^3.0.0"
+
+"supports-color@^6.1.0":
+ "integrity" "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ=="
+ "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz"
+ "version" "6.1.0"
+ dependencies:
+ "has-flag" "^3.0.0"
+
+"supports-color@^7.0.0":
+ "integrity" "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g=="
+ "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz"
+ "version" "7.1.0"
+ dependencies:
+ "has-flag" "^4.0.0"
+
+"supports-color@^7.1.0":
+ "integrity" "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g=="
+ "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz"
+ "version" "7.1.0"
+ dependencies:
+ "has-flag" "^4.0.0"
+
+"supports-hyperlinks@^1.0.1":
+ "integrity" "sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw=="
+ "resolved" "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "has-flag" "^2.0.0"
+ "supports-color" "^5.0.0"
+
+"supports-preserve-symlinks-flag@^1.0.0":
+ "integrity" "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
+ "resolved" "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
+ "version" "1.0.0"
+
+"svg-parser@^2.0.0":
+ "integrity" "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ=="
+ "resolved" "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz"
+ "version" "2.0.4"
+
+"svgo@^1.0.0", "svgo@^1.2.2":
+ "integrity" "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw=="
+ "resolved" "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz"
+ "version" "1.3.2"
+ dependencies:
+ "chalk" "^2.4.1"
+ "coa" "^2.0.2"
+ "css-select" "^2.0.0"
+ "css-select-base-adapter" "^0.1.1"
+ "css-tree" "1.0.0-alpha.37"
+ "csso" "^4.0.2"
+ "js-yaml" "^3.13.1"
+ "mkdirp" "~0.5.1"
+ "object.values" "^1.1.0"
+ "sax" "~1.2.4"
+ "stable" "^0.1.8"
+ "unquote" "~1.1.1"
+ "util.promisify" "~1.0.0"
+
+"swagger-client@^3.10.3":
+ "integrity" "sha512-mv/mVh+DEAh5o2qykTB7SK7a/ViuwWaKozHHzqOZpxkHJq4UIpiTA6jQpk+mYjdwYPISGwOVt/bd7J8OTleMjQ=="
+ "resolved" "https://registry.npmjs.org/swagger-client/-/swagger-client-3.10.3.tgz"
+ "version" "3.10.3"
dependencies:
"@babel/runtime-corejs2" "^7.0.0"
"@kyleshockey/object-assign-deep" "^0.4.0"
"@tim-lai/isomorphic-form-data" "^1.0.0"
- btoa "1.1.2"
- buffer "^5.1.0"
- cookie "^0.3.1"
- cross-fetch "^3.0.4"
- deep-extend "^0.5.1"
- encode-3986 "^1.0.0"
- fast-json-patch "~2.1.0"
- js-yaml "^3.13.1"
- lodash "^4.17.14"
- qs "^6.3.0"
- querystring-browser "^1.0.4"
- traverse "^0.6.6"
- url "^0.11.0"
- utf8-bytes "0.0.1"
- utfstring "^2.0.0"
-
-swagger-ui@^3.20.1:
- version "3.25.3"
- resolved "https://registry.yarnpkg.com/swagger-ui/-/swagger-ui-3.25.3.tgz#8df2f1faf470ca88316ea596297ede622aa7c29f"
- integrity sha512-FLlPg8LVq15qZfzVbpEDWqc4iGRAr21vJTK1d82oYrvQ7DtiAEMiEgc7JlEpH5DUoxx+h804QpfH9+ABy5mpkw==
+ "btoa" "1.1.2"
+ "buffer" "^5.1.0"
+ "cookie" "^0.3.1"
+ "cross-fetch" "^3.0.4"
+ "deep-extend" "^0.5.1"
+ "encode-3986" "^1.0.0"
+ "fast-json-patch" "~2.1.0"
+ "js-yaml" "^3.13.1"
+ "lodash" "^4.17.14"
+ "qs" "^6.3.0"
+ "querystring-browser" "^1.0.4"
+ "traverse" "^0.6.6"
+ "url" "^0.11.0"
+ "utf8-bytes" "0.0.1"
+ "utfstring" "^2.0.0"
+
+"swagger-ui@^3.20.1":
+ "integrity" "sha512-FLlPg8LVq15qZfzVbpEDWqc4iGRAr21vJTK1d82oYrvQ7DtiAEMiEgc7JlEpH5DUoxx+h804QpfH9+ABy5mpkw=="
+ "resolved" "https://registry.npmjs.org/swagger-ui/-/swagger-ui-3.25.3.tgz"
+ "version" "3.25.3"
dependencies:
"@babel/runtime-corejs2" "^7.5.5"
"@braintree/sanitize-url" "^4.0.0"
"@kyleshockey/object-assign-deep" "^0.4.2"
"@kyleshockey/xml" "^1.0.2"
- base64-js "^1.2.0"
- classnames "^2.2.6"
- core-js "^2.5.1"
- css.escape "1.5.1"
- deep-extend "0.6.0"
- dompurify "^2.0.7"
- ieee754 "^1.1.13"
- immutable "^3.x.x"
- js-file-download "^0.4.1"
- js-yaml "^3.13.1"
- lodash "^4.17.15"
- memoizee "^0.4.12"
- prop-types "^15.7.2"
- randombytes "^2.1.0"
- react "^15.6.2"
- react-debounce-input "^3.2.0"
- react-dom "^15.6.2"
- react-immutable-proptypes "2.1.0"
- react-immutable-pure-component "^1.1.1"
- react-inspector "^2.3.0"
- react-motion "^0.5.2"
- react-redux "^4.x.x"
- redux "^3.x.x"
- redux-immutable "3.1.0"
- remarkable "^1.7.4"
- reselect "^4.0.0"
- serialize-error "^2.1.0"
- sha.js "^2.4.11"
- swagger-client "^3.10.3"
- url-parse "^1.4.7"
- xml-but-prettier "^1.0.1"
- zenscroll "^4.0.2"
-
-symbol-observable@^1.0.3, symbol-observable@^1.0.4, symbol-observable@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
- integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
-
-symbol-tree@^3.2.2:
- version "3.2.4"
- resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
- integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
-
-tabbable@^5.1.4:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-5.2.0.tgz#4fba60991d8bb89d06e5d9455c92b453acf88fb2"
- integrity sha512-0uyt8wbP0P3T4rrsfYg/5Rg3cIJ8Shl1RJ54QMqYxm1TLdWqJD1u6+RQjr2Lor3wmfT7JRHkirIwy99ydBsyPg==
-
-table-resolver@^3.2.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/table-resolver/-/table-resolver-3.3.0.tgz#22e575d3c6aed15404ab71a0f2046c4ff55e556e"
- integrity sha512-BkdhtKYhWtXK54GeACs0khqlMvJ53puOw01tzIPsPUr3PP2pFeq9AelPUb7Iy7NeHMyIUI6vEfnngoWgEG+rLQ==
-
-table@^5.2.3:
- version "5.4.6"
- resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e"
- integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==
- dependencies:
- ajv "^6.10.2"
- lodash "^4.17.14"
- slice-ansi "^2.1.0"
- string-width "^3.0.0"
-
-tapable@^1.0.0, tapable@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
- integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
-
-tar@^4.4.10, tar@^4.4.12, tar@^4.4.13:
- version "4.4.13"
- resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
- integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==
- dependencies:
- chownr "^1.1.1"
- fs-minipass "^1.2.5"
- minipass "^2.8.6"
- minizlib "^1.2.1"
- mkdirp "^0.5.0"
- safe-buffer "^5.1.2"
- yallist "^3.0.3"
-
-temp-dir@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d"
- integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=
-
-tempy@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.3.0.tgz#6f6c5b295695a16130996ad5ab01a8bd726e8bf8"
- integrity sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==
- dependencies:
- temp-dir "^1.0.0"
- type-fest "^0.3.1"
- unique-string "^1.0.0"
-
-term-size@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69"
- integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=
- dependencies:
- execa "^0.7.0"
-
-terser-webpack-plugin@2.3.5:
- version "2.3.5"
- resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz#5ad971acce5c517440ba873ea4f09687de2f4a81"
- integrity sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w==
- dependencies:
- cacache "^13.0.1"
- find-cache-dir "^3.2.0"
- jest-worker "^25.1.0"
- p-limit "^2.2.2"
- schema-utils "^2.6.4"
- serialize-javascript "^2.1.2"
- source-map "^0.6.1"
- terser "^4.4.3"
- webpack-sources "^1.4.3"
-
-terser-webpack-plugin@^1.4.3:
- version "1.4.3"
- resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c"
- integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==
- dependencies:
- cacache "^12.0.2"
- find-cache-dir "^2.1.0"
- is-wsl "^1.1.0"
- schema-utils "^1.0.0"
- serialize-javascript "^2.1.2"
- source-map "^0.6.1"
- terser "^4.1.2"
- webpack-sources "^1.4.0"
- worker-farm "^1.7.0"
-
-terser@^4.1.2, terser@^4.4.3, terser@^4.6.3:
- version "4.7.0"
- resolved "https://registry.yarnpkg.com/terser/-/terser-4.7.0.tgz#15852cf1a08e3256a80428e865a2fa893ffba006"
- integrity sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw==
- dependencies:
- commander "^2.20.0"
- source-map "~0.6.1"
- source-map-support "~0.5.12"
-
-test-exclude@^5.2.3:
- version "5.2.3"
- resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0"
- integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==
- dependencies:
- glob "^7.1.3"
- minimatch "^3.0.4"
- read-pkg-up "^4.0.0"
- require-main-filename "^2.0.0"
-
-text-extensions@^1.0.0:
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26"
- integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==
-
-text-table@0.2.0, text-table@^0.2.0, text-table@~0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
- integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
-
-throat@^4.0.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a"
- integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=
-
-through2@^2.0.0, through2@^2.0.2, through2@~2.0.0:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
- integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
- dependencies:
- readable-stream "~2.3.6"
- xtend "~4.0.1"
-
-through2@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a"
- integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==
- dependencies:
- readable-stream "2 || 3"
-
-through@2, "through@>=2.2.7 <3", through@^2.3.6:
- version "2.3.8"
- resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
- integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
-
-thunky@^1.0.2:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d"
- integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==
-
-timed-out@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
- integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
-
-timers-browserify@^2.0.4:
- version "2.0.11"
- resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f"
- integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==
- dependencies:
- setimmediate "^1.0.4"
-
-timers-ext@^0.1.5:
- version "0.1.7"
- resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6"
- integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==
- dependencies:
- es5-ext "~0.10.46"
- next-tick "1"
-
-timsort@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
- integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
-
-tiny-invariant@^1.0.2:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875"
- integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==
-
-tiny-relative-date@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07"
- integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A==
-
-tiny-warning@^1.0.0, tiny-warning@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
- integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==
-
-tippy.js@5.1.2:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-5.1.2.tgz#5ac91233c59ab482ef5988cffe6e08bd26528e66"
- integrity sha512-Qtrv2wqbRbaKMUb6bWWBQWPayvcDKNrGlvihxtsyowhT7RLGEh1STWuy6EMXC6QLkfKPB2MLnf8W2mzql9VDAw==
- dependencies:
- popper.js "^1.16.0"
-
-tmp@^0.0.33:
- version "0.0.33"
- resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
- integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
- dependencies:
- os-tmpdir "~1.0.2"
-
-tmpl@1.0.x:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
- integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=
-
-to-arraybuffer@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
- integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=
-
-to-fast-properties@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
- integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
-
-to-object-path@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
- integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
- dependencies:
- kind-of "^3.0.2"
-
-to-regex-range@^2.1.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
- integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
- dependencies:
- is-number "^3.0.0"
- repeat-string "^1.6.1"
-
-to-regex-range@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
- integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
- dependencies:
- is-number "^7.0.0"
-
-to-regex@^3.0.1, to-regex@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
- integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
- dependencies:
- define-property "^2.0.2"
- extend-shallow "^3.0.2"
- regex-not "^1.0.2"
- safe-regex "^1.1.0"
-
-toidentifier@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
- integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
-
-tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@^2.5.0, tough-cookie@~2.5.0:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
- integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
- dependencies:
- psl "^1.1.28"
- punycode "^2.1.1"
-
-tr46@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
- integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=
- dependencies:
- punycode "^2.1.0"
-
-traverse@^0.6.6, traverse@~0.6.6:
- version "0.6.6"
- resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137"
- integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=
-
-trim-newlines@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30"
- integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==
-
-trim-off-newlines@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3"
- integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM=
-
-ts-pnp@1.1.6:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.6.tgz#389a24396d425a0d3162e96d2b4638900fdc289a"
- integrity sha512-CrG5GqAAzMT7144Cl+UIFP7mz/iIhiy+xQ6GGcnjTezhALT02uPMRw7tgDSESgB5MsfKt55+GPWw4ir1kVtMIQ==
-
-ts-pnp@^1.1.6:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92"
- integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==
-
-tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0:
- version "1.13.0"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
- integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==
-
-tslib@^2.0.0:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
- integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
-
-tsutils@^3.17.1:
- version "3.17.1"
- resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
- integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==
- dependencies:
- tslib "^1.8.1"
-
-tty-browserify@0.0.0:
- version "0.0.0"
- resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
- integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=
-
-tunnel-agent@^0.6.0:
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
- integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
- dependencies:
- safe-buffer "^5.0.1"
-
-tweetnacl@^0.14.3, tweetnacl@~0.14.0:
- version "0.14.5"
- resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
- integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
-
-type-check@~0.3.2:
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
- integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
- dependencies:
- prelude-ls "~1.1.2"
-
-type-fest@^0.11.0:
- version "0.11.0"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1"
- integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==
-
-type-fest@^0.13.1:
- version "0.13.1"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934"
- integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==
-
-type-fest@^0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1"
- integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==
-
-type-fest@^0.6.0:
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
- integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
-
-type-fest@^0.8.1:
- version "0.8.1"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
- integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
-
-type-is@~1.6.17, type-is@~1.6.18:
- version "1.6.18"
- resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
- integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
- dependencies:
- media-typer "0.3.0"
- mime-types "~2.1.24"
-
-type@^1.0.1:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
- integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
-
-type@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3"
- integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==
-
-typed-styles@^0.0.7:
- version "0.0.7"
- resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9"
- integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==
-
-typedarray@^0.0.6:
- version "0.0.6"
- resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
- integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
-
-ua-parser-js@^0.7.18:
- version "0.7.21"
- resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777"
- integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==
-
-uglify-js@^3.1.4:
- version "3.9.3"
- resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.9.3.tgz#4a285d1658b8a2ebaef9e51366b3a0f7acd79ec2"
- integrity sha512-r5ImcL6QyzQGVimQoov3aL2ZScywrOgBXGndbWrdehKoSvGe/RmiE5Jpw/v+GvxODt6l2tpBXwA7n+qZVlHBMA==
- dependencies:
- commander "~2.20.3"
-
-uid-number@0.0.6:
- version "0.0.6"
- resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
- integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=
-
-umask@^1.1.0, umask@~1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d"
- integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=
-
-uncontrollable@^7.0.2:
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.1.1.tgz#f67fed3ef93637126571809746323a9db815d556"
- integrity sha512-EcPYhot3uWTS3w00R32R2+vS8Vr53tttrvMj/yA1uYRhf8hbTG2GyugGqWDY0qIskxn0uTTojVd6wPYW9ZEf8Q==
+ "base64-js" "^1.2.0"
+ "classnames" "^2.2.6"
+ "core-js" "^2.5.1"
+ "css.escape" "1.5.1"
+ "deep-extend" "0.6.0"
+ "dompurify" "^2.0.7"
+ "ieee754" "^1.1.13"
+ "immutable" "^3.x.x"
+ "js-file-download" "^0.4.1"
+ "js-yaml" "^3.13.1"
+ "lodash" "^4.17.15"
+ "memoizee" "^0.4.12"
+ "prop-types" "^15.7.2"
+ "randombytes" "^2.1.0"
+ "react" "^15.6.2"
+ "react-debounce-input" "^3.2.0"
+ "react-dom" "^15.6.2"
+ "react-immutable-proptypes" "2.1.0"
+ "react-immutable-pure-component" "^1.1.1"
+ "react-inspector" "^2.3.0"
+ "react-motion" "^0.5.2"
+ "react-redux" "^4.x.x"
+ "redux" "^3.x.x"
+ "redux-immutable" "3.1.0"
+ "remarkable" "^1.7.4"
+ "reselect" "^4.0.0"
+ "serialize-error" "^2.1.0"
+ "sha.js" "^2.4.11"
+ "swagger-client" "^3.10.3"
+ "url-parse" "^1.4.7"
+ "xml-but-prettier" "^1.0.1"
+ "zenscroll" "^4.0.2"
+
+"symbol-observable@^1.0.3", "symbol-observable@^1.2.0":
+ "integrity" "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
+ "resolved" "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz"
+ "version" "1.2.0"
+
+"symbol-tree@^3.2.2":
+ "integrity" "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
+ "resolved" "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz"
+ "version" "3.2.4"
+
+"tabbable@^5.3.2":
+ "integrity" "sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA=="
+ "resolved" "https://registry.npmjs.org/tabbable/-/tabbable-5.3.3.tgz"
+ "version" "5.3.3"
+
+"table-resolver@^3.2.0":
+ "integrity" "sha512-BkdhtKYhWtXK54GeACs0khqlMvJ53puOw01tzIPsPUr3PP2pFeq9AelPUb7Iy7NeHMyIUI6vEfnngoWgEG+rLQ=="
+ "resolved" "https://registry.npmjs.org/table-resolver/-/table-resolver-3.3.0.tgz"
+ "version" "3.3.0"
+
+"table@^5.2.3":
+ "integrity" "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug=="
+ "resolved" "https://registry.npmjs.org/table/-/table-5.4.6.tgz"
+ "version" "5.4.6"
+ dependencies:
+ "ajv" "^6.10.2"
+ "lodash" "^4.17.14"
+ "slice-ansi" "^2.1.0"
+ "string-width" "^3.0.0"
+
+"tapable@^1.0.0", "tapable@^1.1.3":
+ "integrity" "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA=="
+ "resolved" "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz"
+ "version" "1.1.3"
+
+"tar@^4.4.10", "tar@^4.4.12", "tar@^4.4.13":
+ "integrity" "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA=="
+ "resolved" "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz"
+ "version" "4.4.13"
+ dependencies:
+ "chownr" "^1.1.1"
+ "fs-minipass" "^1.2.5"
+ "minipass" "^2.8.6"
+ "minizlib" "^1.2.1"
+ "mkdirp" "^0.5.0"
+ "safe-buffer" "^5.1.2"
+ "yallist" "^3.0.3"
+
+"temp-dir@^1.0.0":
+ "integrity" "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0="
+ "resolved" "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz"
+ "version" "1.0.0"
+
+"tempy@^0.3.0":
+ "integrity" "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ=="
+ "resolved" "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz"
+ "version" "0.3.0"
+ dependencies:
+ "temp-dir" "^1.0.0"
+ "type-fest" "^0.3.1"
+ "unique-string" "^1.0.0"
+
+"term-size@^1.2.0":
+ "integrity" "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk="
+ "resolved" "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz"
+ "version" "1.2.0"
+ dependencies:
+ "execa" "^0.7.0"
+
+"terser-webpack-plugin@^1.4.3":
+ "integrity" "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA=="
+ "resolved" "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz"
+ "version" "1.4.3"
+ dependencies:
+ "cacache" "^12.0.2"
+ "find-cache-dir" "^2.1.0"
+ "is-wsl" "^1.1.0"
+ "schema-utils" "^1.0.0"
+ "serialize-javascript" "^2.1.2"
+ "source-map" "^0.6.1"
+ "terser" "^4.1.2"
+ "webpack-sources" "^1.4.0"
+ "worker-farm" "^1.7.0"
+
+"terser-webpack-plugin@2.3.5":
+ "integrity" "sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w=="
+ "resolved" "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz"
+ "version" "2.3.5"
+ dependencies:
+ "cacache" "^13.0.1"
+ "find-cache-dir" "^3.2.0"
+ "jest-worker" "^25.1.0"
+ "p-limit" "^2.2.2"
+ "schema-utils" "^2.6.4"
+ "serialize-javascript" "^2.1.2"
+ "source-map" "^0.6.1"
+ "terser" "^4.4.3"
+ "webpack-sources" "^1.4.3"
+
+"terser@^4.1.2", "terser@^4.4.3", "terser@^4.6.3":
+ "integrity" "sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw=="
+ "resolved" "https://registry.npmjs.org/terser/-/terser-4.7.0.tgz"
+ "version" "4.7.0"
+ dependencies:
+ "commander" "^2.20.0"
+ "source-map" "~0.6.1"
+ "source-map-support" "~0.5.12"
+
+"test-exclude@^5.2.3":
+ "integrity" "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g=="
+ "resolved" "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz"
+ "version" "5.2.3"
+ dependencies:
+ "glob" "^7.1.3"
+ "minimatch" "^3.0.4"
+ "read-pkg-up" "^4.0.0"
+ "require-main-filename" "^2.0.0"
+
+"text-extensions@^1.0.0":
+ "integrity" "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ=="
+ "resolved" "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz"
+ "version" "1.9.0"
+
+"text-table@^0.2.0", "text-table@0.2.0":
+ "integrity" "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
+ "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
+ "version" "0.2.0"
+
+"text-table@~0.2.0":
+ "integrity" "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
+ "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
+ "version" "0.2.0"
+
+"throat@^4.0.0":
+ "integrity" "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo="
+ "resolved" "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz"
+ "version" "4.1.0"
+
+"through@^2.3.6", "through@>=2.2.7 <3", "through@2":
+ "integrity" "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+ "resolved" "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
+ "version" "2.3.8"
+
+"through2@^2.0.0", "through2@~2.0.0":
+ "integrity" "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ=="
+ "resolved" "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz"
+ "version" "2.0.5"
+ dependencies:
+ "readable-stream" "~2.3.6"
+ "xtend" "~4.0.1"
+
+"through2@^2.0.2":
+ "integrity" "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ=="
+ "resolved" "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz"
+ "version" "2.0.5"
+ dependencies:
+ "readable-stream" "~2.3.6"
+ "xtend" "~4.0.1"
+
+"through2@^3.0.0":
+ "integrity" "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww=="
+ "resolved" "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz"
+ "version" "3.0.1"
+ dependencies:
+ "readable-stream" "2 || 3"
+
+"thunky@^1.0.2":
+ "integrity" "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="
+ "resolved" "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz"
+ "version" "1.1.0"
+
+"timed-out@^4.0.0":
+ "integrity" "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8="
+ "resolved" "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz"
+ "version" "4.0.1"
+
+"timers-browserify@^2.0.4":
+ "integrity" "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ=="
+ "resolved" "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz"
+ "version" "2.0.11"
+ dependencies:
+ "setimmediate" "^1.0.4"
+
+"timers-ext@^0.1.5":
+ "integrity" "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ=="
+ "resolved" "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz"
+ "version" "0.1.7"
+ dependencies:
+ "es5-ext" "~0.10.46"
+ "next-tick" "1"
+
+"timsort@^0.3.0":
+ "integrity" "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q="
+ "resolved" "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz"
+ "version" "0.3.0"
+
+"tiny-invariant@^1.0.2":
+ "integrity" "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw=="
+ "resolved" "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz"
+ "version" "1.1.0"
+
+"tiny-relative-date@^1.3.0":
+ "integrity" "sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A=="
+ "resolved" "https://registry.npmjs.org/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz"
+ "version" "1.3.0"
+
+"tiny-warning@^1.0.0", "tiny-warning@^1.0.3":
+ "integrity" "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
+ "resolved" "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz"
+ "version" "1.0.3"
+
+"tippy.js@5.1.2":
+ "integrity" "sha512-Qtrv2wqbRbaKMUb6bWWBQWPayvcDKNrGlvihxtsyowhT7RLGEh1STWuy6EMXC6QLkfKPB2MLnf8W2mzql9VDAw=="
+ "resolved" "https://registry.npmjs.org/tippy.js/-/tippy.js-5.1.2.tgz"
+ "version" "5.1.2"
+ dependencies:
+ "popper.js" "^1.16.0"
+
+"tmp@^0.0.33":
+ "integrity" "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw=="
+ "resolved" "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz"
+ "version" "0.0.33"
+ dependencies:
+ "os-tmpdir" "~1.0.2"
+
+"tmpl@1.0.x":
+ "integrity" "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE="
+ "resolved" "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz"
+ "version" "1.0.4"
+
+"to-arraybuffer@^1.0.0":
+ "integrity" "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M="
+ "resolved" "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz"
+ "version" "1.0.1"
+
+"to-fast-properties@^2.0.0":
+ "integrity" "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+ "resolved" "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz"
+ "version" "2.0.0"
+
+"to-object-path@^0.3.0":
+ "integrity" "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68="
+ "resolved" "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz"
+ "version" "0.3.0"
+ dependencies:
+ "kind-of" "^3.0.2"
+
+"to-regex-range@^2.1.0":
+ "integrity" "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg="
+ "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz"
+ "version" "2.1.1"
+ dependencies:
+ "is-number" "^3.0.0"
+ "repeat-string" "^1.6.1"
+
+"to-regex-range@^5.0.1":
+ "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="
+ "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz"
+ "version" "5.0.1"
+ dependencies:
+ "is-number" "^7.0.0"
+
+"to-regex@^3.0.1", "to-regex@^3.0.2":
+ "integrity" "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw=="
+ "resolved" "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz"
+ "version" "3.0.2"
+ dependencies:
+ "define-property" "^2.0.2"
+ "extend-shallow" "^3.0.2"
+ "regex-not" "^1.0.2"
+ "safe-regex" "^1.1.0"
+
+"toidentifier@1.0.0":
+ "integrity" "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
+ "resolved" "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz"
+ "version" "1.0.0"
+
+"tough-cookie@^2.3.3", "tough-cookie@^2.3.4", "tough-cookie@^2.5.0", "tough-cookie@~2.5.0":
+ "integrity" "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g=="
+ "resolved" "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz"
+ "version" "2.5.0"
+ dependencies:
+ "psl" "^1.1.28"
+ "punycode" "^2.1.1"
+
+"tough-cookie@~2.4.3":
+ "version" "2.4.3"
+ dependencies:
+ "psl" "^1.1.24"
+ "punycode" "^1.4.1"
+
+"tr46@^1.0.1":
+ "integrity" "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk="
+ "resolved" "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "punycode" "^2.1.0"
+
+"traverse@^0.6.6", "traverse@~0.6.6":
+ "integrity" "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc="
+ "resolved" "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz"
+ "version" "0.6.6"
+
+"trim-newlines@^3.0.0":
+ "integrity" "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA=="
+ "resolved" "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz"
+ "version" "3.0.0"
+
+"trim-off-newlines@^1.0.0":
+ "integrity" "sha1-n5up2e+odkw4dpi8v+sshI8RrbM="
+ "resolved" "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz"
+ "version" "1.0.1"
+
+"ts-pnp@^1.1.6":
+ "integrity" "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw=="
+ "resolved" "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz"
+ "version" "1.2.0"
+
+"ts-pnp@1.1.6":
+ "integrity" "sha512-CrG5GqAAzMT7144Cl+UIFP7mz/iIhiy+xQ6GGcnjTezhALT02uPMRw7tgDSESgB5MsfKt55+GPWw4ir1kVtMIQ=="
+ "resolved" "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.6.tgz"
+ "version" "1.1.6"
+
+"tslib@^1.10.0", "tslib@^1.8.1", "tslib@^1.9.0":
+ "integrity" "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q=="
+ "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz"
+ "version" "1.13.0"
+
+"tslib@^2.0.0":
+ "integrity" "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
+ "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz"
+ "version" "2.3.1"
+
+"tsutils@^3.17.1":
+ "integrity" "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g=="
+ "resolved" "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz"
+ "version" "3.17.1"
+ dependencies:
+ "tslib" "^1.8.1"
+
+"tty-browserify@0.0.0":
+ "integrity" "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY="
+ "resolved" "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz"
+ "version" "0.0.0"
+
+"tunnel-agent@^0.6.0":
+ "integrity" "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0="
+ "resolved" "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz"
+ "version" "0.6.0"
+ dependencies:
+ "safe-buffer" "^5.0.1"
+
+"tweetnacl@^0.14.3", "tweetnacl@~0.14.0":
+ "integrity" "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
+ "resolved" "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz"
+ "version" "0.14.5"
+
+"type-check@~0.3.2":
+ "integrity" "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I="
+ "resolved" "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz"
+ "version" "0.3.2"
+ dependencies:
+ "prelude-ls" "~1.1.2"
+
+"type-fest@^0.11.0":
+ "integrity" "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ=="
+ "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz"
+ "version" "0.11.0"
+
+"type-fest@^0.13.1":
+ "integrity" "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="
+ "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz"
+ "version" "0.13.1"
+
+"type-fest@^0.3.1":
+ "integrity" "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ=="
+ "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz"
+ "version" "0.3.1"
+
+"type-fest@^0.6.0":
+ "integrity" "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="
+ "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz"
+ "version" "0.6.0"
+
+"type-fest@^0.8.1":
+ "integrity" "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
+ "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz"
+ "version" "0.8.1"
+
+"type-is@~1.6.17", "type-is@~1.6.18":
+ "integrity" "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="
+ "resolved" "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz"
+ "version" "1.6.18"
+ dependencies:
+ "media-typer" "0.3.0"
+ "mime-types" "~2.1.24"
+
+"type@^1.0.1":
+ "integrity" "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
+ "resolved" "https://registry.npmjs.org/type/-/type-1.2.0.tgz"
+ "version" "1.2.0"
+
+"type@^2.0.0":
+ "integrity" "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow=="
+ "resolved" "https://registry.npmjs.org/type/-/type-2.0.0.tgz"
+ "version" "2.0.0"
+
+"typed-styles@^0.0.7":
+ "integrity" "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q=="
+ "resolved" "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz"
+ "version" "0.0.7"
+
+"typedarray@^0.0.6":
+ "integrity" "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
+ "resolved" "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz"
+ "version" "0.0.6"
+
+"typescript@^3.2.1", "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta":
+ "integrity" "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q=="
+ "resolved" "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz"
+ "version" "3.9.10"
+
+"ua-parser-js@^0.7.18":
+ "integrity" "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ=="
+ "resolved" "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz"
+ "version" "0.7.21"
+
+"uglify-js@^3.1.4":
+ "integrity" "sha512-r5ImcL6QyzQGVimQoov3aL2ZScywrOgBXGndbWrdehKoSvGe/RmiE5Jpw/v+GvxODt6l2tpBXwA7n+qZVlHBMA=="
+ "resolved" "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.3.tgz"
+ "version" "3.9.3"
+ dependencies:
+ "commander" "~2.20.3"
+
+"uid-number@0.0.6":
+ "integrity" "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE="
+ "resolved" "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz"
+ "version" "0.0.6"
+
+"umask@^1.1.0", "umask@~1.1.0":
+ "integrity" "sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0="
+ "resolved" "https://registry.npmjs.org/umask/-/umask-1.1.0.tgz"
+ "version" "1.1.0"
+
+"unbox-primitive@^1.0.2":
+ "integrity" "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw=="
+ "resolved" "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "has-bigints" "^1.0.2"
+ "has-symbols" "^1.0.3"
+ "which-boxed-primitive" "^1.0.2"
+
+"uncontrollable@^7.0.2":
+ "integrity" "sha512-EcPYhot3uWTS3w00R32R2+vS8Vr53tttrvMj/yA1uYRhf8hbTG2GyugGqWDY0qIskxn0uTTojVd6wPYW9ZEf8Q=="
+ "resolved" "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.1.1.tgz"
+ "version" "7.1.1"
dependencies:
"@babel/runtime" "^7.6.3"
"@types/react" "^16.9.11"
- invariant "^2.2.4"
- react-lifecycles-compat "^3.0.4"
+ "invariant" "^2.2.4"
+ "react-lifecycles-compat" "^3.0.4"
-unicode-canonical-property-names-ecmascript@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
- integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==
+"unicode-canonical-property-names-ecmascript@^1.0.4":
+ "integrity" "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ=="
+ "resolved" "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz"
+ "version" "1.0.4"
-unicode-match-property-ecmascript@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c"
- integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==
+"unicode-match-property-ecmascript@^1.0.4":
+ "integrity" "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg=="
+ "resolved" "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz"
+ "version" "1.0.4"
dependencies:
- unicode-canonical-property-names-ecmascript "^1.0.4"
- unicode-property-aliases-ecmascript "^1.0.4"
+ "unicode-canonical-property-names-ecmascript" "^1.0.4"
+ "unicode-property-aliases-ecmascript" "^1.0.4"
-unicode-match-property-value-ecmascript@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531"
- integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==
+"unicode-match-property-value-ecmascript@^1.2.0":
+ "integrity" "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ=="
+ "resolved" "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz"
+ "version" "1.2.0"
-unicode-property-aliases-ecmascript@^1.0.4:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4"
- integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==
+"unicode-property-aliases-ecmascript@^1.0.4":
+ "integrity" "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg=="
+ "resolved" "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz"
+ "version" "1.1.0"
-union-value@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
- integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
+"union-value@^1.0.0":
+ "integrity" "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg=="
+ "resolved" "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz"
+ "version" "1.0.1"
dependencies:
- arr-union "^3.1.0"
- get-value "^2.0.6"
- is-extendable "^0.1.1"
- set-value "^2.0.1"
+ "arr-union" "^3.1.0"
+ "get-value" "^2.0.6"
+ "is-extendable" "^0.1.1"
+ "set-value" "^2.0.1"
-uniq@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
- integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=
+"uniq@^1.0.1":
+ "integrity" "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8="
+ "resolved" "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz"
+ "version" "1.0.1"
-uniqs@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
- integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI=
+"uniqs@^2.0.0":
+ "integrity" "sha1-/+3ks2slKQaW5uFl1KWe25mOawI="
+ "resolved" "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz"
+ "version" "2.0.0"
-unique-filename@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
- integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
+"unique-filename@^1.1.1":
+ "integrity" "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ=="
+ "resolved" "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz"
+ "version" "1.1.1"
dependencies:
- unique-slug "^2.0.0"
+ "unique-slug" "^2.0.0"
-unique-slug@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c"
- integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==
+"unique-slug@^2.0.0":
+ "integrity" "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w=="
+ "resolved" "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz"
+ "version" "2.0.2"
dependencies:
- imurmurhash "^0.1.4"
+ "imurmurhash" "^0.1.4"
-unique-string@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a"
- integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=
+"unique-string@^1.0.0":
+ "integrity" "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo="
+ "resolved" "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz"
+ "version" "1.0.0"
dependencies:
- crypto-random-string "^1.0.0"
+ "crypto-random-string" "^1.0.0"
-universal-user-agent@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-4.0.1.tgz#fd8d6cb773a679a709e967ef8288a31fcc03e557"
- integrity sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg==
+"universal-user-agent@^4.0.0":
+ "integrity" "sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg=="
+ "resolved" "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.1.tgz"
+ "version" "4.0.1"
dependencies:
- os-name "^3.1.0"
+ "os-name" "^3.1.0"
-universal-user-agent@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-5.0.0.tgz#a3182aa758069bf0e79952570ca757de3579c1d9"
- integrity sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q==
+"universal-user-agent@^5.0.0":
+ "integrity" "sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q=="
+ "resolved" "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz"
+ "version" "5.0.0"
dependencies:
- os-name "^3.1.0"
+ "os-name" "^3.1.0"
-universalify@^0.1.0:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
- integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+"universalify@^0.1.0":
+ "integrity" "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
+ "resolved" "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz"
+ "version" "0.1.2"
-unload@2.3.1:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/unload/-/unload-2.3.1.tgz#9d16862d372a5ce5cb630ad1309c2fd6e35dacfe"
- integrity sha512-MUZEiDqvAN9AIDRbbBnVYVvfcR6DrjCqeU2YQMmliFZl9uaBUjTkhuDQkBiyAy8ad5bx1TXVbqZ3gg7namsWjA==
+"unload@2.3.1":
+ "integrity" "sha512-MUZEiDqvAN9AIDRbbBnVYVvfcR6DrjCqeU2YQMmliFZl9uaBUjTkhuDQkBiyAy8ad5bx1TXVbqZ3gg7namsWjA=="
+ "resolved" "https://registry.npmjs.org/unload/-/unload-2.3.1.tgz"
+ "version" "2.3.1"
dependencies:
"@babel/runtime" "^7.6.2"
- detect-node "2.1.0"
-
-unpipe@1.0.0, unpipe@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
- integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
-
-unquote@~1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544"
- integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=
-
-unset-value@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
- integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
- dependencies:
- has-value "^0.3.1"
- isobject "^3.0.0"
-
-unzip-response@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97"
- integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=
-
-upath@^1.1.1:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
- integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
-
-update-notifier@^2.2.0, update-notifier@^2.3.0, update-notifier@^2.5.0:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6"
- integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==
- dependencies:
- boxen "^1.2.1"
- chalk "^2.0.1"
- configstore "^3.0.0"
- import-lazy "^2.1.0"
- is-ci "^1.0.10"
- is-installed-globally "^0.1.0"
- is-npm "^1.0.0"
- latest-version "^3.0.0"
- semver-diff "^2.0.0"
- xdg-basedir "^3.0.0"
-
-uri-js@^4.2.2:
- version "4.2.2"
- resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
- integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==
- dependencies:
- punycode "^2.1.0"
-
-urix@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
- integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
-
-url-join@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7"
- integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==
-
-url-loader@2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-2.3.0.tgz#e0e2ef658f003efb8ca41b0f3ffbf76bab88658b"
- integrity sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==
- dependencies:
- loader-utils "^1.2.3"
- mime "^2.4.4"
- schema-utils "^2.5.0"
-
-url-parse-lax@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
- integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=
- dependencies:
- prepend-http "^1.0.1"
-
-url-parse@^1.4.3, url-parse@^1.4.7:
- version "1.4.7"
- resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278"
- integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==
- dependencies:
- querystringify "^2.1.1"
- requires-port "^1.0.0"
-
-url@^0.11.0:
- version "0.11.0"
- resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
- integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
- dependencies:
- punycode "1.3.2"
- querystring "0.2.0"
-
-use@^3.1.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
- integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
-
-utf8-bytes@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/utf8-bytes/-/utf8-bytes-0.0.1.tgz#116b025448c9b500081cdfbf1f4d6c6c37d8837d"
- integrity sha1-EWsCVEjJtQAIHN+/H01sbDfYg30=
-
-utfstring@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/utfstring/-/utfstring-2.0.1.tgz#d20f3f82c1a166aa8fd6162f0895b2d5512488d7"
- integrity sha512-x8lx0NGB2OUxOOvFE3z4feOpJWrVrllGRzJq4h6H70bh3sincW+LAlexHBFD5jzV9sZ5qcabZcCwA7ZD6MdUkg==
-
-util-deprecate@^1.0.1, util-deprecate@~1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
- integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
-
-util-extend@^1.0.1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f"
- integrity sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=
-
-util-promisify@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/util-promisify/-/util-promisify-2.1.0.tgz#3c2236476c4d32c5ff3c47002add7c13b9a82a53"
- integrity sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=
- dependencies:
- object.getownpropertydescriptors "^2.0.3"
-
-util.promisify@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
- integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==
- dependencies:
- define-properties "^1.1.2"
- object.getownpropertydescriptors "^2.0.3"
-
-util.promisify@^1.0.0, util.promisify@~1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee"
- integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==
- dependencies:
- define-properties "^1.1.3"
- es-abstract "^1.17.2"
- has-symbols "^1.0.1"
- object.getownpropertydescriptors "^2.1.0"
-
-util@0.10.3:
- version "0.10.3"
- resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
- integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk=
- dependencies:
- inherits "2.0.1"
-
-util@^0.11.0:
- version "0.11.1"
- resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61"
- integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==
- dependencies:
- inherits "2.0.3"
-
-utila@^0.4.0, utila@~0.4:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c"
- integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=
-
-utils-merge@1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
- integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
-
-uuid@^3.0.1, uuid@^3.1.0, uuid@^3.3.2, uuid@^3.3.3:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
- integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
-
-v8-compile-cache@^2.0.3:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e"
- integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==
-
-validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
- integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
- dependencies:
- spdx-correct "^3.0.0"
- spdx-expression-parse "^3.0.0"
-
-validate-npm-package-name@^3.0.0, validate-npm-package-name@~3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e"
- integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34=
- dependencies:
- builtins "^1.0.3"
-
-value-equal@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c"
- integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==
-
-vary@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
- integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
-
-vendors@^1.0.0:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e"
- integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==
-
-verror@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
- integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
- dependencies:
- assert-plus "^1.0.0"
- core-util-is "1.0.2"
- extsprintf "^1.2.0"
-
-victory-area@^36.2.1:
- version "36.3.0"
- resolved "https://registry.yarnpkg.com/victory-area/-/victory-area-36.3.0.tgz#676aa3c96a5d7ac199fcaad8565310fbd6bdfd2f"
- integrity sha512-vf/vR+6k4VyeGOuRvc651fN3ItsU6NoGkHrtafCDmJ/KH9bcwgfQS9uZn0aXHC9Vr9rarbFFTrBC6/gLhBYSRA==
- dependencies:
- d3-shape "^1.2.0"
- lodash "^4.17.19"
- prop-types "^15.5.8"
- victory-core "^36.3.0"
-
-victory-axis@^36.2.1, victory-axis@^36.3.0:
- version "36.3.0"
- resolved "https://registry.yarnpkg.com/victory-axis/-/victory-axis-36.3.0.tgz#d1f76d7c3df5a81be0355b44f21aff2acf2d0894"
- integrity sha512-k4h27pN2RHd1TYLia4SbaFn8NHddf7Mzfmqt4WUCLYmkN+R3xQ3METD+X6kwfZmV6FffclJVoD1Errlar/mGdQ==
- dependencies:
- lodash "^4.17.19"
- prop-types "^15.5.8"
- victory-core "^36.3.0"
-
-victory-bar@^36.2.1:
- version "36.3.0"
- resolved "https://registry.yarnpkg.com/victory-bar/-/victory-bar-36.3.0.tgz#b1adf2471eff72071b729e98c3f47c6dd2348625"
- integrity sha512-8qitdaC2LYzxuQfbmsZLQ8VQksumbofD1ks0PimYM2exnBdo9nKi5GB0zuLVeuxvq36qlXUpPyH1VRUyUnCMPg==
- dependencies:
- d3-shape "^1.2.0"
- lodash "^4.17.19"
- prop-types "^15.5.8"
- victory-core "^36.3.0"
-
-victory-brush-container@^36.3.0:
- version "36.3.0"
- resolved "https://registry.yarnpkg.com/victory-brush-container/-/victory-brush-container-36.3.0.tgz#ab6a11138e80296c0bc2169de3cb8db11a2f3347"
- integrity sha512-iaal/Dn5o113TFZ2i4GIApZq6lsfSx9MwD+1cQ8yEC67/Krzn127AfDXfPYKUiFhD+NvmCTg8OGsryt4MEHbsw==
- dependencies:
- lodash "^4.17.19"
- prop-types "^15.5.8"
- react-fast-compare "^2.0.0"
- victory-core "^36.3.0"
-
-victory-chart@^36.2.1:
- version "36.3.0"
- resolved "https://registry.yarnpkg.com/victory-chart/-/victory-chart-36.3.0.tgz#b08cf4472e07f4d2fc4e041a34f224c2c92f42f9"
- integrity sha512-8BM/xUavO6ineRzhycehHCvf3NT5Z+8YepdvVOVX6PGJUx9rvmZCAVDlB6fDh7kuDdq5mtDFzos+B+BglC1rcA==
- dependencies:
- lodash "^4.17.19"
- prop-types "^15.5.8"
- react-fast-compare "^2.0.0"
- victory-axis "^36.3.0"
- victory-core "^36.3.0"
- victory-polar-axis "^36.3.0"
- victory-shared-events "^36.3.0"
-
-victory-core@^36.2.1, victory-core@^36.3.0:
- version "36.3.0"
- resolved "https://registry.yarnpkg.com/victory-core/-/victory-core-36.3.0.tgz#193dbd7fcd6e8d48ed9a3dbc855cc4e1ac2e8e13"
- integrity sha512-X75h6FvLCO+9u/PbCkHat7CmcOeJrkTLz0uUhLqryofJN81nfZ7VamRDfw5KxDWYlCB5hmxX+dfjzteaqndgeA==
- dependencies:
- d3-ease "^1.0.0"
- d3-interpolate "^1.1.1"
- d3-scale "^1.0.0"
- d3-shape "^1.2.0"
- d3-timer "^1.0.0"
- lodash "^4.17.21"
- prop-types "^15.5.8"
- react-fast-compare "^2.0.0"
-
-victory-create-container@^36.2.1:
- version "36.3.0"
- resolved "https://registry.yarnpkg.com/victory-create-container/-/victory-create-container-36.3.0.tgz#31095eed7e78bcf03bd58f0872bd6164c8ed55e2"
- integrity sha512-9lx966S5tC4yhVUTD7hLG2Pa4RZnKa6D4EV88sNTC73C3JiDAFFPrLschMjIb5849nd30NPdfXa9zcLnkG3F3w==
- dependencies:
- lodash "^4.17.19"
- victory-brush-container "^36.3.0"
- victory-core "^36.3.0"
- victory-cursor-container "^36.3.0"
- victory-selection-container "^36.3.0"
- victory-voronoi-container "^36.3.0"
- victory-zoom-container "^36.3.0"
-
-victory-cursor-container@^36.3.0:
- version "36.3.0"
- resolved "https://registry.yarnpkg.com/victory-cursor-container/-/victory-cursor-container-36.3.0.tgz#3ce87f3ac237818669f21f6b2431209b5b883e98"
- integrity sha512-iR+8R1kEul22tifSxr8lnyR0kJ9Wb4VGCVyLgH3VGiJkmbaTRLt0fvKxP+sFbrVIngxTemiVuFBi+nwi48lpAA==
- dependencies:
- lodash "^4.17.19"
- prop-types "^15.5.8"
- victory-core "^36.3.0"
-
-victory-group@^36.2.1:
- version "36.3.0"
- resolved "https://registry.yarnpkg.com/victory-group/-/victory-group-36.3.0.tgz#e353ce0017abe7b88e32465984f1ff982c82f596"
- integrity sha512-JsO/CMxQrGOv+GK55ssTWtcASVyC2Y9kJ0a6xWyGKAWufGDehvdmwg2HxAcx9QeIu9vQ0qQOYc3Yk2/DwW0bJQ==
- dependencies:
- lodash "^4.17.19"
- prop-types "^15.5.8"
- react-fast-compare "^2.0.0"
- victory-core "^36.3.0"
- victory-shared-events "^36.3.0"
-
-victory-legend@^36.2.1:
- version "36.3.0"
- resolved "https://registry.yarnpkg.com/victory-legend/-/victory-legend-36.3.0.tgz#59442db6cb4068e216f324783df4382a7a8f7d84"
- integrity sha512-5gaUBXQcJfA4BQpatCG1X/evAgrzBfMIHhbEkwH4jCtt9aVU+b2qMYRs7nw+Rnzz5Cicb6cwajHgem9mv3E04w==
- dependencies:
- lodash "^4.17.19"
- prop-types "^15.5.8"
- victory-core "^36.3.0"
-
-victory-line@^36.2.1:
- version "36.3.0"
- resolved "https://registry.yarnpkg.com/victory-line/-/victory-line-36.3.0.tgz#6ffc2cb94a3e3fa82bf38c918923463aacc8fd0d"
- integrity sha512-qLDHBcmFRMytKACgDt3z6ktuqTNKHvVPifoSrAnORfFlXxMJlGB8+XZAGeAP6DeC5jDOb+sc6DFKzSOIvFLnqA==
- dependencies:
- d3-shape "^1.2.0"
- lodash "^4.17.19"
- prop-types "^15.5.8"
- victory-core "^36.3.0"
-
-victory-pie@^36.2.1:
- version "36.3.0"
- resolved "https://registry.yarnpkg.com/victory-pie/-/victory-pie-36.3.0.tgz#4ccb60df9d203af03d60c9dadd1a3cbeb3e571a2"
- integrity sha512-ZApiB4OW2l6vHSxRZpaqklQ9gnOshqqZBCHgcyr2kbx+oLJMeKi+mJbh/YS1btFCPwL7bSSO4EYdBuaGyAX9VA==
- dependencies:
- d3-shape "^1.0.0"
- lodash "^4.17.19"
- prop-types "^15.5.8"
- victory-core "^36.3.0"
-
-victory-polar-axis@^36.3.0:
- version "36.3.0"
- resolved "https://registry.yarnpkg.com/victory-polar-axis/-/victory-polar-axis-36.3.0.tgz#f32c75461a635a518e6d103f5dbc6248192303de"
- integrity sha512-xbxHDMJi3CG1dB8ATiURNg0NVVECk0z82soAwVSA5jPmGRmW4t8ByKBfSsw/ommeDclJ95X8+jtR1Jxd+mjsfw==
- dependencies:
- lodash "^4.17.19"
- prop-types "^15.5.8"
- victory-core "^36.3.0"
-
-victory-scatter@^36.2.1:
- version "36.3.0"
- resolved "https://registry.yarnpkg.com/victory-scatter/-/victory-scatter-36.3.0.tgz#79e35718050de36aa3cb705999186c48bb794e39"
- integrity sha512-PfgM/y7tV/e1Y3ew5R2wvM1O11+EXoToQ2KR0/WTzybwD6R5OghgbcM1xS2NUCtOeubYDkkXjBogZc0rDyyfjA==
- dependencies:
- lodash "^4.17.19"
- prop-types "^15.5.8"
- victory-core "^36.3.0"
-
-victory-selection-container@^36.3.0:
- version "36.3.0"
- resolved "https://registry.yarnpkg.com/victory-selection-container/-/victory-selection-container-36.3.0.tgz#c5b171df47c3706545915a57e2f36cf0b3d58cb3"
- integrity sha512-RdFkmxoy2HkbZ9ebuj5Mlx+/OTtPjoUO+FYXItc/Le+HWcGNvkhzmyfZJ+JZAi7atwevCEQawsdUHslIf9mZig==
- dependencies:
- lodash "^4.17.19"
- prop-types "^15.5.8"
- victory-core "^36.3.0"
-
-victory-shared-events@^36.3.0:
- version "36.3.0"
- resolved "https://registry.yarnpkg.com/victory-shared-events/-/victory-shared-events-36.3.0.tgz#cd8a715f137937865c84f99d9885fd06b2e0a448"
- integrity sha512-XnTzwlRy7uUgBm8NW1tLn4wx3M4lkFO/jA3DHFMYgCVzq+Fu7Tu+BmMPZ8m5DxZFwxKP4HVlYuYKwoQu7yerWA==
- dependencies:
- json-stringify-safe "^5.0.1"
- lodash "^4.17.19"
- prop-types "^15.5.8"
- react-fast-compare "^2.0.0"
- victory-core "^36.3.0"
-
-victory-stack@^36.2.1:
- version "36.3.0"
- resolved "https://registry.yarnpkg.com/victory-stack/-/victory-stack-36.3.0.tgz#c2e5e354640e79e74ae9b57fde390875c2653bd8"
- integrity sha512-QtW+UReATWUojUyv2II+i0d+RonLRcxFIhCFPO4Eo6tHS7ZqvBQWii0N3FRlbl65h2jW4By+xjoNxyHoSsbJJQ==
- dependencies:
- lodash "^4.17.19"
- prop-types "^15.5.8"
- react-fast-compare "^2.0.0"
- victory-core "^36.3.0"
- victory-shared-events "^36.3.0"
-
-victory-tooltip@^36.2.1, victory-tooltip@^36.3.0:
- version "36.3.0"
- resolved "https://registry.yarnpkg.com/victory-tooltip/-/victory-tooltip-36.3.0.tgz#0905c681404e5348c00e3b84505734ef14a493bc"
- integrity sha512-GM8hOmbcKZRQCtWDi9bJrqvjUEryqwXcw8onz5sFGvPPONLu7nYKCO0s6/m3wCHqAWqotPpu6FTtxXSChYJ6kA==
- dependencies:
- lodash "^4.17.19"
- prop-types "^15.5.8"
- victory-core "^36.3.0"
-
-victory-voronoi-container@^36.2.1, victory-voronoi-container@^36.3.0:
- version "36.3.0"
- resolved "https://registry.yarnpkg.com/victory-voronoi-container/-/victory-voronoi-container-36.3.0.tgz#4a937f6d6f6c681b92ea71e7c9ce460fabd297c9"
- integrity sha512-J0RjsvmIAtWlLh5Ryzu/TDN1YwwI32be2axWsuSEo+x0sGHQblAETERpbjhwDtpsyz6xA/dC5h3kbSG8omcQQQ==
- dependencies:
- delaunay-find "0.0.6"
- lodash "^4.17.19"
- prop-types "^15.5.8"
- react-fast-compare "^2.0.0"
- victory-core "^36.3.0"
- victory-tooltip "^36.3.0"
-
-victory-zoom-container@^36.2.1, victory-zoom-container@^36.3.0:
- version "36.3.0"
- resolved "https://registry.yarnpkg.com/victory-zoom-container/-/victory-zoom-container-36.3.0.tgz#9485d4a7bc93ac41268f5903b77b38fccdf78629"
- integrity sha512-FG+nh5pi4xCP7EBI+rtc0q3U6RrkOW+ophOgpGCpNGswvvuREl+DtdS/dPjYk+Ktt45f1qmVrT26ovJ4IiMKEA==
- dependencies:
- lodash "^4.17.19"
- prop-types "^15.5.8"
- victory-core "^36.3.0"
-
-vm-browserify@^1.0.1:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
- integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
-
-w3c-hr-time@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"
- integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==
- dependencies:
- browser-process-hrtime "^1.0.0"
-
-w3c-xmlserializer@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794"
- integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==
- dependencies:
- domexception "^1.0.1"
- webidl-conversions "^4.0.2"
- xml-name-validator "^3.0.0"
-
-walker@^1.0.7, walker@~1.0.5:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb"
- integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=
- dependencies:
- makeerror "1.0.x"
-
-warning@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c"
- integrity sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=
- dependencies:
- loose-envify "^1.0.0"
-
-warning@^4.0.0, warning@^4.0.1, warning@^4.0.2, warning@^4.0.3:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
- integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==
- dependencies:
- loose-envify "^1.0.0"
-
-watchpack-chokidar2@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0"
- integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==
- dependencies:
- chokidar "^2.1.8"
-
-watchpack@^1.6.0:
- version "1.7.2"
- resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.2.tgz#c02e4d4d49913c3e7e122c3325365af9d331e9aa"
- integrity sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==
- dependencies:
- graceful-fs "^4.1.2"
- neo-async "^2.5.0"
+ "detect-node" "2.1.0"
+
+"unpipe@~1.0.0", "unpipe@1.0.0":
+ "integrity" "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
+ "resolved" "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz"
+ "version" "1.0.0"
+
+"unquote@~1.1.1":
+ "integrity" "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ="
+ "resolved" "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz"
+ "version" "1.1.1"
+
+"unset-value@^1.0.0":
+ "integrity" "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk="
+ "resolved" "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "has-value" "^0.3.1"
+ "isobject" "^3.0.0"
+
+"unzip-response@^2.0.1":
+ "integrity" "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c="
+ "resolved" "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz"
+ "version" "2.0.1"
+
+"upath@^1.1.1":
+ "integrity" "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg=="
+ "resolved" "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz"
+ "version" "1.2.0"
+
+"update-browserslist-db@^1.0.5":
+ "integrity" "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q=="
+ "resolved" "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz"
+ "version" "1.0.5"
+ dependencies:
+ "escalade" "^3.1.1"
+ "picocolors" "^1.0.0"
+
+"update-notifier@^2.3.0", "update-notifier@^2.5.0":
+ "integrity" "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw=="
+ "resolved" "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz"
+ "version" "2.5.0"
+ dependencies:
+ "boxen" "^1.2.1"
+ "chalk" "^2.0.1"
+ "configstore" "^3.0.0"
+ "import-lazy" "^2.1.0"
+ "is-ci" "^1.0.10"
+ "is-installed-globally" "^0.1.0"
+ "is-npm" "^1.0.0"
+ "latest-version" "^3.0.0"
+ "semver-diff" "^2.0.0"
+ "xdg-basedir" "^3.0.0"
+
+"uri-js@^4.2.2":
+ "integrity" "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ=="
+ "resolved" "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz"
+ "version" "4.2.2"
+ dependencies:
+ "punycode" "^2.1.0"
+
+"urix@^0.1.0":
+ "integrity" "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
+ "resolved" "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz"
+ "version" "0.1.0"
+
+"url-join@^4.0.0":
+ "integrity" "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA=="
+ "resolved" "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz"
+ "version" "4.0.1"
+
+"url-loader@2.3.0":
+ "integrity" "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog=="
+ "resolved" "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz"
+ "version" "2.3.0"
+ dependencies:
+ "loader-utils" "^1.2.3"
+ "mime" "^2.4.4"
+ "schema-utils" "^2.5.0"
+
+"url-parse-lax@^1.0.0":
+ "integrity" "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM="
+ "resolved" "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "prepend-http" "^1.0.1"
+
+"url-parse@^1.4.3", "url-parse@^1.4.7":
+ "integrity" "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg=="
+ "resolved" "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz"
+ "version" "1.4.7"
+ dependencies:
+ "querystringify" "^2.1.1"
+ "requires-port" "^1.0.0"
+
+"url@^0.11.0":
+ "integrity" "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE="
+ "resolved" "https://registry.npmjs.org/url/-/url-0.11.0.tgz"
+ "version" "0.11.0"
+ dependencies:
+ "punycode" "1.3.2"
+ "querystring" "0.2.0"
+
+"use@^3.1.0":
+ "integrity" "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
+ "resolved" "https://registry.npmjs.org/use/-/use-3.1.1.tgz"
+ "version" "3.1.1"
+
+"utf8-bytes@0.0.1":
+ "integrity" "sha1-EWsCVEjJtQAIHN+/H01sbDfYg30="
+ "resolved" "https://registry.npmjs.org/utf8-bytes/-/utf8-bytes-0.0.1.tgz"
+ "version" "0.0.1"
+
+"utfstring@^2.0.0":
+ "integrity" "sha512-x8lx0NGB2OUxOOvFE3z4feOpJWrVrllGRzJq4h6H70bh3sincW+LAlexHBFD5jzV9sZ5qcabZcCwA7ZD6MdUkg=="
+ "resolved" "https://registry.npmjs.org/utfstring/-/utfstring-2.0.1.tgz"
+ "version" "2.0.1"
+
+"util-deprecate@^1.0.1", "util-deprecate@~1.0.1":
+ "integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
+ "version" "1.0.2"
+
+"util-extend@^1.0.1":
+ "integrity" "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8="
+ "resolved" "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz"
+ "version" "1.0.3"
+
+"util-promisify@^2.1.0":
+ "integrity" "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM="
+ "resolved" "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "object.getownpropertydescriptors" "^2.0.3"
+
+"util.promisify@^1.0.0", "util.promisify@~1.0.0":
+ "integrity" "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA=="
+ "resolved" "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "define-properties" "^1.1.3"
+ "es-abstract" "^1.17.2"
+ "has-symbols" "^1.0.1"
+ "object.getownpropertydescriptors" "^2.1.0"
+
+"util.promisify@1.0.0":
+ "integrity" "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA=="
+ "resolved" "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "define-properties" "^1.1.2"
+ "object.getownpropertydescriptors" "^2.0.3"
+
+"util@^0.11.0":
+ "integrity" "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ=="
+ "resolved" "https://registry.npmjs.org/util/-/util-0.11.1.tgz"
+ "version" "0.11.1"
+ dependencies:
+ "inherits" "2.0.3"
+
+"util@0.10.3":
+ "integrity" "sha1-evsa/lCAUkZInj23/g7TeTNqwPk="
+ "resolved" "https://registry.npmjs.org/util/-/util-0.10.3.tgz"
+ "version" "0.10.3"
+ dependencies:
+ "inherits" "2.0.1"
+
+"utila@^0.4.0", "utila@~0.4":
+ "integrity" "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw="
+ "resolved" "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz"
+ "version" "0.4.0"
+
+"utils-merge@1.0.1":
+ "integrity" "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
+ "resolved" "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz"
+ "version" "1.0.1"
+
+"uuid@^3.0.1", "uuid@^3.1.0", "uuid@^3.3.2":
+ "integrity" "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
+ "resolved" "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz"
+ "version" "3.4.0"
+
+"uuid@^3.3.3":
+ "version" "3.3.3"
+
+"v8-compile-cache@^2.0.3":
+ "integrity" "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g=="
+ "resolved" "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz"
+ "version" "2.1.0"
+
+"validate-npm-package-license@^3.0.1", "validate-npm-package-license@^3.0.4":
+ "integrity" "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="
+ "resolved" "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz"
+ "version" "3.0.4"
+ dependencies:
+ "spdx-correct" "^3.0.0"
+ "spdx-expression-parse" "^3.0.0"
+
+"validate-npm-package-name@^3.0.0", "validate-npm-package-name@~3.0.0":
+ "integrity" "sha1-X6kS2B630MdK/BQN5zF/DKffQ34="
+ "resolved" "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "builtins" "^1.0.3"
+
+"value-equal@^1.0.1":
+ "integrity" "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw=="
+ "resolved" "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz"
+ "version" "1.0.1"
+
+"vary@~1.1.2":
+ "integrity" "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
+ "resolved" "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz"
+ "version" "1.1.2"
+
+"vendors@^1.0.0":
+ "integrity" "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w=="
+ "resolved" "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz"
+ "version" "1.0.4"
+
+"verror@1.10.0":
+ "integrity" "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA="
+ "resolved" "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz"
+ "version" "1.10.0"
+ dependencies:
+ "assert-plus" "^1.0.0"
+ "core-util-is" "1.0.2"
+ "extsprintf" "^1.2.0"
+
+"victory-area@^36.2.1":
+ "integrity" "sha512-vf/vR+6k4VyeGOuRvc651fN3ItsU6NoGkHrtafCDmJ/KH9bcwgfQS9uZn0aXHC9Vr9rarbFFTrBC6/gLhBYSRA=="
+ "resolved" "https://registry.npmjs.org/victory-area/-/victory-area-36.3.0.tgz"
+ "version" "36.3.0"
+ dependencies:
+ "d3-shape" "^1.2.0"
+ "lodash" "^4.17.19"
+ "prop-types" "^15.5.8"
+ "victory-core" "^36.3.0"
+
+"victory-axis@^36.2.1", "victory-axis@^36.3.0":
+ "integrity" "sha512-k4h27pN2RHd1TYLia4SbaFn8NHddf7Mzfmqt4WUCLYmkN+R3xQ3METD+X6kwfZmV6FffclJVoD1Errlar/mGdQ=="
+ "resolved" "https://registry.npmjs.org/victory-axis/-/victory-axis-36.3.0.tgz"
+ "version" "36.3.0"
+ dependencies:
+ "lodash" "^4.17.19"
+ "prop-types" "^15.5.8"
+ "victory-core" "^36.3.0"
+
+"victory-bar@^36.2.1":
+ "integrity" "sha512-8qitdaC2LYzxuQfbmsZLQ8VQksumbofD1ks0PimYM2exnBdo9nKi5GB0zuLVeuxvq36qlXUpPyH1VRUyUnCMPg=="
+ "resolved" "https://registry.npmjs.org/victory-bar/-/victory-bar-36.3.0.tgz"
+ "version" "36.3.0"
+ dependencies:
+ "d3-shape" "^1.2.0"
+ "lodash" "^4.17.19"
+ "prop-types" "^15.5.8"
+ "victory-core" "^36.3.0"
+
+"victory-brush-container@^36.3.0":
+ "integrity" "sha512-iaal/Dn5o113TFZ2i4GIApZq6lsfSx9MwD+1cQ8yEC67/Krzn127AfDXfPYKUiFhD+NvmCTg8OGsryt4MEHbsw=="
+ "resolved" "https://registry.npmjs.org/victory-brush-container/-/victory-brush-container-36.3.0.tgz"
+ "version" "36.3.0"
+ dependencies:
+ "lodash" "^4.17.19"
+ "prop-types" "^15.5.8"
+ "react-fast-compare" "^2.0.0"
+ "victory-core" "^36.3.0"
+
+"victory-chart@^36.2.1":
+ "integrity" "sha512-8BM/xUavO6ineRzhycehHCvf3NT5Z+8YepdvVOVX6PGJUx9rvmZCAVDlB6fDh7kuDdq5mtDFzos+B+BglC1rcA=="
+ "resolved" "https://registry.npmjs.org/victory-chart/-/victory-chart-36.3.0.tgz"
+ "version" "36.3.0"
+ dependencies:
+ "lodash" "^4.17.19"
+ "prop-types" "^15.5.8"
+ "react-fast-compare" "^2.0.0"
+ "victory-axis" "^36.3.0"
+ "victory-core" "^36.3.0"
+ "victory-polar-axis" "^36.3.0"
+ "victory-shared-events" "^36.3.0"
+
+"victory-core@^36.2.1", "victory-core@^36.3.0":
+ "integrity" "sha512-X75h6FvLCO+9u/PbCkHat7CmcOeJrkTLz0uUhLqryofJN81nfZ7VamRDfw5KxDWYlCB5hmxX+dfjzteaqndgeA=="
+ "resolved" "https://registry.npmjs.org/victory-core/-/victory-core-36.3.0.tgz"
+ "version" "36.3.0"
+ dependencies:
+ "d3-ease" "^1.0.0"
+ "d3-interpolate" "^1.1.1"
+ "d3-scale" "^1.0.0"
+ "d3-shape" "^1.2.0"
+ "d3-timer" "^1.0.0"
+ "lodash" "^4.17.21"
+ "prop-types" "^15.5.8"
+ "react-fast-compare" "^2.0.0"
+
+"victory-create-container@^36.2.1":
+ "integrity" "sha512-9lx966S5tC4yhVUTD7hLG2Pa4RZnKa6D4EV88sNTC73C3JiDAFFPrLschMjIb5849nd30NPdfXa9zcLnkG3F3w=="
+ "resolved" "https://registry.npmjs.org/victory-create-container/-/victory-create-container-36.3.0.tgz"
+ "version" "36.3.0"
+ dependencies:
+ "lodash" "^4.17.19"
+ "victory-brush-container" "^36.3.0"
+ "victory-core" "^36.3.0"
+ "victory-cursor-container" "^36.3.0"
+ "victory-selection-container" "^36.3.0"
+ "victory-voronoi-container" "^36.3.0"
+ "victory-zoom-container" "^36.3.0"
+
+"victory-cursor-container@^36.3.0":
+ "integrity" "sha512-iR+8R1kEul22tifSxr8lnyR0kJ9Wb4VGCVyLgH3VGiJkmbaTRLt0fvKxP+sFbrVIngxTemiVuFBi+nwi48lpAA=="
+ "resolved" "https://registry.npmjs.org/victory-cursor-container/-/victory-cursor-container-36.3.0.tgz"
+ "version" "36.3.0"
+ dependencies:
+ "lodash" "^4.17.19"
+ "prop-types" "^15.5.8"
+ "victory-core" "^36.3.0"
+
+"victory-group@^36.2.1":
+ "integrity" "sha512-JsO/CMxQrGOv+GK55ssTWtcASVyC2Y9kJ0a6xWyGKAWufGDehvdmwg2HxAcx9QeIu9vQ0qQOYc3Yk2/DwW0bJQ=="
+ "resolved" "https://registry.npmjs.org/victory-group/-/victory-group-36.3.0.tgz"
+ "version" "36.3.0"
+ dependencies:
+ "lodash" "^4.17.19"
+ "prop-types" "^15.5.8"
+ "react-fast-compare" "^2.0.0"
+ "victory-core" "^36.3.0"
+ "victory-shared-events" "^36.3.0"
+
+"victory-legend@^36.2.1":
+ "integrity" "sha512-5gaUBXQcJfA4BQpatCG1X/evAgrzBfMIHhbEkwH4jCtt9aVU+b2qMYRs7nw+Rnzz5Cicb6cwajHgem9mv3E04w=="
+ "resolved" "https://registry.npmjs.org/victory-legend/-/victory-legend-36.3.0.tgz"
+ "version" "36.3.0"
+ dependencies:
+ "lodash" "^4.17.19"
+ "prop-types" "^15.5.8"
+ "victory-core" "^36.3.0"
+
+"victory-line@^36.2.1":
+ "integrity" "sha512-qLDHBcmFRMytKACgDt3z6ktuqTNKHvVPifoSrAnORfFlXxMJlGB8+XZAGeAP6DeC5jDOb+sc6DFKzSOIvFLnqA=="
+ "resolved" "https://registry.npmjs.org/victory-line/-/victory-line-36.3.0.tgz"
+ "version" "36.3.0"
+ dependencies:
+ "d3-shape" "^1.2.0"
+ "lodash" "^4.17.19"
+ "prop-types" "^15.5.8"
+ "victory-core" "^36.3.0"
+
+"victory-pie@^36.2.1":
+ "integrity" "sha512-ZApiB4OW2l6vHSxRZpaqklQ9gnOshqqZBCHgcyr2kbx+oLJMeKi+mJbh/YS1btFCPwL7bSSO4EYdBuaGyAX9VA=="
+ "resolved" "https://registry.npmjs.org/victory-pie/-/victory-pie-36.3.0.tgz"
+ "version" "36.3.0"
+ dependencies:
+ "d3-shape" "^1.0.0"
+ "lodash" "^4.17.19"
+ "prop-types" "^15.5.8"
+ "victory-core" "^36.3.0"
+
+"victory-polar-axis@^36.3.0":
+ "integrity" "sha512-xbxHDMJi3CG1dB8ATiURNg0NVVECk0z82soAwVSA5jPmGRmW4t8ByKBfSsw/ommeDclJ95X8+jtR1Jxd+mjsfw=="
+ "resolved" "https://registry.npmjs.org/victory-polar-axis/-/victory-polar-axis-36.3.0.tgz"
+ "version" "36.3.0"
+ dependencies:
+ "lodash" "^4.17.19"
+ "prop-types" "^15.5.8"
+ "victory-core" "^36.3.0"
+
+"victory-scatter@^36.2.1":
+ "integrity" "sha512-PfgM/y7tV/e1Y3ew5R2wvM1O11+EXoToQ2KR0/WTzybwD6R5OghgbcM1xS2NUCtOeubYDkkXjBogZc0rDyyfjA=="
+ "resolved" "https://registry.npmjs.org/victory-scatter/-/victory-scatter-36.3.0.tgz"
+ "version" "36.3.0"
+ dependencies:
+ "lodash" "^4.17.19"
+ "prop-types" "^15.5.8"
+ "victory-core" "^36.3.0"
+
+"victory-selection-container@^36.3.0":
+ "integrity" "sha512-RdFkmxoy2HkbZ9ebuj5Mlx+/OTtPjoUO+FYXItc/Le+HWcGNvkhzmyfZJ+JZAi7atwevCEQawsdUHslIf9mZig=="
+ "resolved" "https://registry.npmjs.org/victory-selection-container/-/victory-selection-container-36.3.0.tgz"
+ "version" "36.3.0"
+ dependencies:
+ "lodash" "^4.17.19"
+ "prop-types" "^15.5.8"
+ "victory-core" "^36.3.0"
+
+"victory-shared-events@^36.3.0":
+ "integrity" "sha512-XnTzwlRy7uUgBm8NW1tLn4wx3M4lkFO/jA3DHFMYgCVzq+Fu7Tu+BmMPZ8m5DxZFwxKP4HVlYuYKwoQu7yerWA=="
+ "resolved" "https://registry.npmjs.org/victory-shared-events/-/victory-shared-events-36.3.0.tgz"
+ "version" "36.3.0"
+ dependencies:
+ "json-stringify-safe" "^5.0.1"
+ "lodash" "^4.17.19"
+ "prop-types" "^15.5.8"
+ "react-fast-compare" "^2.0.0"
+ "victory-core" "^36.3.0"
+
+"victory-stack@^36.2.1":
+ "integrity" "sha512-QtW+UReATWUojUyv2II+i0d+RonLRcxFIhCFPO4Eo6tHS7ZqvBQWii0N3FRlbl65h2jW4By+xjoNxyHoSsbJJQ=="
+ "resolved" "https://registry.npmjs.org/victory-stack/-/victory-stack-36.3.0.tgz"
+ "version" "36.3.0"
+ dependencies:
+ "lodash" "^4.17.19"
+ "prop-types" "^15.5.8"
+ "react-fast-compare" "^2.0.0"
+ "victory-core" "^36.3.0"
+ "victory-shared-events" "^36.3.0"
+
+"victory-tooltip@^36.2.1", "victory-tooltip@^36.3.0":
+ "integrity" "sha512-GM8hOmbcKZRQCtWDi9bJrqvjUEryqwXcw8onz5sFGvPPONLu7nYKCO0s6/m3wCHqAWqotPpu6FTtxXSChYJ6kA=="
+ "resolved" "https://registry.npmjs.org/victory-tooltip/-/victory-tooltip-36.3.0.tgz"
+ "version" "36.3.0"
+ dependencies:
+ "lodash" "^4.17.19"
+ "prop-types" "^15.5.8"
+ "victory-core" "^36.3.0"
+
+"victory-voronoi-container@^36.2.1", "victory-voronoi-container@^36.3.0":
+ "integrity" "sha512-J0RjsvmIAtWlLh5Ryzu/TDN1YwwI32be2axWsuSEo+x0sGHQblAETERpbjhwDtpsyz6xA/dC5h3kbSG8omcQQQ=="
+ "resolved" "https://registry.npmjs.org/victory-voronoi-container/-/victory-voronoi-container-36.3.0.tgz"
+ "version" "36.3.0"
+ dependencies:
+ "delaunay-find" "0.0.6"
+ "lodash" "^4.17.19"
+ "prop-types" "^15.5.8"
+ "react-fast-compare" "^2.0.0"
+ "victory-core" "^36.3.0"
+ "victory-tooltip" "^36.3.0"
+
+"victory-zoom-container@^36.2.1", "victory-zoom-container@^36.3.0":
+ "integrity" "sha512-FG+nh5pi4xCP7EBI+rtc0q3U6RrkOW+ophOgpGCpNGswvvuREl+DtdS/dPjYk+Ktt45f1qmVrT26ovJ4IiMKEA=="
+ "resolved" "https://registry.npmjs.org/victory-zoom-container/-/victory-zoom-container-36.3.0.tgz"
+ "version" "36.3.0"
+ dependencies:
+ "lodash" "^4.17.19"
+ "prop-types" "^15.5.8"
+ "victory-core" "^36.3.0"
+
+"viz.js@^1.8.2":
+ "integrity" "sha512-W+1+N/hdzLpQZEcvz79n2IgUE9pfx6JLdHh3Kh8RGvLL8P1LdJVQmi2OsDcLdY4QVID4OUy+FPelyerX0nJxIQ=="
+ "resolved" "https://registry.npmjs.org/viz.js/-/viz.js-1.8.2.tgz"
+ "version" "1.8.2"
+
+"vm-browserify@^1.0.1":
+ "integrity" "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ=="
+ "resolved" "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz"
+ "version" "1.1.2"
+
+"w3c-hr-time@^1.0.1":
+ "integrity" "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ=="
+ "resolved" "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "browser-process-hrtime" "^1.0.0"
+
+"w3c-xmlserializer@^1.1.2":
+ "integrity" "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg=="
+ "resolved" "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz"
+ "version" "1.1.2"
+ dependencies:
+ "domexception" "^1.0.1"
+ "webidl-conversions" "^4.0.2"
+ "xml-name-validator" "^3.0.0"
+
+"walker@^1.0.7", "walker@~1.0.5":
+ "integrity" "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs="
+ "resolved" "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz"
+ "version" "1.0.7"
+ dependencies:
+ "makeerror" "1.0.x"
+
+"warning@^3.0.0":
+ "integrity" "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w="
+ "resolved" "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "loose-envify" "^1.0.0"
+
+"warning@^4.0.0":
+ "integrity" "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w=="
+ "resolved" "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz"
+ "version" "4.0.3"
+ dependencies:
+ "loose-envify" "^1.0.0"
+
+"warning@^4.0.1":
+ "integrity" "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w=="
+ "resolved" "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz"
+ "version" "4.0.3"
+ dependencies:
+ "loose-envify" "^1.0.0"
+
+"warning@^4.0.2":
+ "integrity" "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w=="
+ "resolved" "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz"
+ "version" "4.0.3"
+ dependencies:
+ "loose-envify" "^1.0.0"
+
+"warning@^4.0.3":
+ "integrity" "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w=="
+ "resolved" "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz"
+ "version" "4.0.3"
+ dependencies:
+ "loose-envify" "^1.0.0"
+
+"watchpack-chokidar2@^2.0.0":
+ "integrity" "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA=="
+ "resolved" "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "chokidar" "^2.1.8"
+
+"watchpack@^1.6.0":
+ "integrity" "sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g=="
+ "resolved" "https://registry.npmjs.org/watchpack/-/watchpack-1.7.2.tgz"
+ "version" "1.7.2"
+ dependencies:
+ "graceful-fs" "^4.1.2"
+ "neo-async" "^2.5.0"
optionalDependencies:
- chokidar "^3.4.0"
- watchpack-chokidar2 "^2.0.0"
-
-wbuf@^1.1.0, wbuf@^1.7.3:
- version "1.7.3"
- resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df"
- integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==
- dependencies:
- minimalistic-assert "^1.0.0"
-
-wcwidth@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
- integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=
- dependencies:
- defaults "^1.0.3"
-
-webidl-conversions@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
- integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==
-
-webpack-dev-middleware@^3.7.2:
- version "3.7.2"
- resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3"
- integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==
- dependencies:
- memory-fs "^0.4.1"
- mime "^2.4.4"
- mkdirp "^0.5.1"
- range-parser "^1.2.1"
- webpack-log "^2.0.0"
-
-webpack-dev-server@3.10.3:
- version "3.10.3"
- resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz#f35945036813e57ef582c2420ef7b470e14d3af0"
- integrity sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==
- dependencies:
- ansi-html "0.0.7"
- bonjour "^3.5.0"
- chokidar "^2.1.8"
- compression "^1.7.4"
- connect-history-api-fallback "^1.6.0"
- debug "^4.1.1"
- del "^4.1.1"
- express "^4.17.1"
- html-entities "^1.2.1"
- http-proxy-middleware "0.19.1"
- import-local "^2.0.0"
- internal-ip "^4.3.0"
- ip "^1.1.5"
- is-absolute-url "^3.0.3"
- killable "^1.0.1"
- loglevel "^1.6.6"
- opn "^5.5.0"
- p-retry "^3.0.1"
- portfinder "^1.0.25"
- schema-utils "^1.0.0"
- selfsigned "^1.10.7"
- semver "^6.3.0"
- serve-index "^1.9.1"
- sockjs "0.3.19"
- sockjs-client "1.4.0"
- spdy "^4.0.1"
- strip-ansi "^3.0.1"
- supports-color "^6.1.0"
- url "^0.11.0"
- webpack-dev-middleware "^3.7.2"
- webpack-log "^2.0.0"
- ws "^6.2.1"
- yargs "12.0.5"
-
-webpack-log@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f"
- integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==
- dependencies:
- ansi-colors "^3.0.0"
- uuid "^3.3.2"
-
-webpack-manifest-plugin@2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz#19ca69b435b0baec7e29fbe90fb4015de2de4f16"
- integrity sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==
- dependencies:
- fs-extra "^7.0.0"
- lodash ">=3.5 <5"
- object.entries "^1.1.0"
- tapable "^1.0.0"
-
-webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3:
- version "1.4.3"
- resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933"
- integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
- dependencies:
- source-list-map "^2.0.0"
- source-map "~0.6.1"
-
-webpack@4.42.0:
- version "4.42.0"
- resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.0.tgz#b901635dd6179391d90740a63c93f76f39883eb8"
- integrity sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w==
+ "chokidar" "^3.4.0"
+ "watchpack-chokidar2" "^2.0.0"
+
+"wbuf@^1.1.0", "wbuf@^1.7.3":
+ "integrity" "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA=="
+ "resolved" "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz"
+ "version" "1.7.3"
+ dependencies:
+ "minimalistic-assert" "^1.0.0"
+
+"wcwidth@^1.0.0":
+ "integrity" "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g="
+ "resolved" "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "defaults" "^1.0.3"
+
+"webidl-conversions@^4.0.2":
+ "integrity" "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="
+ "resolved" "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz"
+ "version" "4.0.2"
+
+"webpack-dev-middleware@^3.7.2":
+ "integrity" "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw=="
+ "resolved" "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz"
+ "version" "3.7.2"
+ dependencies:
+ "memory-fs" "^0.4.1"
+ "mime" "^2.4.4"
+ "mkdirp" "^0.5.1"
+ "range-parser" "^1.2.1"
+ "webpack-log" "^2.0.0"
+
+"webpack-dev-server@3.10.3":
+ "integrity" "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ=="
+ "resolved" "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz"
+ "version" "3.10.3"
+ dependencies:
+ "ansi-html" "0.0.7"
+ "bonjour" "^3.5.0"
+ "chokidar" "^2.1.8"
+ "compression" "^1.7.4"
+ "connect-history-api-fallback" "^1.6.0"
+ "debug" "^4.1.1"
+ "del" "^4.1.1"
+ "express" "^4.17.1"
+ "html-entities" "^1.2.1"
+ "http-proxy-middleware" "0.19.1"
+ "import-local" "^2.0.0"
+ "internal-ip" "^4.3.0"
+ "ip" "^1.1.5"
+ "is-absolute-url" "^3.0.3"
+ "killable" "^1.0.1"
+ "loglevel" "^1.6.6"
+ "opn" "^5.5.0"
+ "p-retry" "^3.0.1"
+ "portfinder" "^1.0.25"
+ "schema-utils" "^1.0.0"
+ "selfsigned" "^1.10.7"
+ "semver" "^6.3.0"
+ "serve-index" "^1.9.1"
+ "sockjs" "0.3.19"
+ "sockjs-client" "1.4.0"
+ "spdy" "^4.0.1"
+ "strip-ansi" "^3.0.1"
+ "supports-color" "^6.1.0"
+ "url" "^0.11.0"
+ "webpack-dev-middleware" "^3.7.2"
+ "webpack-log" "^2.0.0"
+ "ws" "^6.2.1"
+ "yargs" "12.0.5"
+
+"webpack-log@^2.0.0":
+ "integrity" "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg=="
+ "resolved" "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "ansi-colors" "^3.0.0"
+ "uuid" "^3.3.2"
+
+"webpack-manifest-plugin@2.2.0":
+ "integrity" "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ=="
+ "resolved" "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz"
+ "version" "2.2.0"
+ dependencies:
+ "fs-extra" "^7.0.0"
+ "lodash" ">=3.5 <5"
+ "object.entries" "^1.1.0"
+ "tapable" "^1.0.0"
+
+"webpack-sources@^1.1.0", "webpack-sources@^1.4.0", "webpack-sources@^1.4.1", "webpack-sources@^1.4.3":
+ "integrity" "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ=="
+ "resolved" "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz"
+ "version" "1.4.3"
+ dependencies:
+ "source-list-map" "^2.0.0"
+ "source-map" "~0.6.1"
+
+"webpack@^2.0.0 || ^3.0.0 || ^4.0.0", "webpack@^4.0.0", "webpack@^4.0.0 || ^5.0.0", "webpack@^4.36.0 || ^5.0.0", "webpack@^4.4.0", "webpack@>=2", "webpack@2 || 3 || 4", "webpack@4.42.0":
+ "integrity" "sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w=="
+ "resolved" "https://registry.npmjs.org/webpack/-/webpack-4.42.0.tgz"
+ "version" "4.42.0"
dependencies:
"@webassemblyjs/ast" "1.8.5"
"@webassemblyjs/helper-module-context" "1.8.5"
"@webassemblyjs/wasm-edit" "1.8.5"
"@webassemblyjs/wasm-parser" "1.8.5"
- acorn "^6.2.1"
- ajv "^6.10.2"
- ajv-keywords "^3.4.1"
- chrome-trace-event "^1.0.2"
- enhanced-resolve "^4.1.0"
- eslint-scope "^4.0.3"
- json-parse-better-errors "^1.0.2"
- loader-runner "^2.4.0"
- loader-utils "^1.2.3"
- memory-fs "^0.4.1"
- micromatch "^3.1.10"
- mkdirp "^0.5.1"
- neo-async "^2.6.1"
- node-libs-browser "^2.2.1"
- schema-utils "^1.0.0"
- tapable "^1.1.3"
- terser-webpack-plugin "^1.4.3"
- watchpack "^1.6.0"
- webpack-sources "^1.4.1"
-
-websocket-driver@>=0.5.1:
- version "0.7.3"
- resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9"
- integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==
- dependencies:
- http-parser-js ">=0.4.0 <0.4.11"
- safe-buffer ">=5.1.0"
- websocket-extensions ">=0.1.1"
-
-websocket-extensions@>=0.1.1:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29"
- integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==
-
-whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
- integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==
- dependencies:
- iconv-lite "0.4.24"
-
-whatwg-fetch@3.0.0, whatwg-fetch@>=0.10.0, whatwg-fetch@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb"
- integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==
-
-whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
- integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
-
-whatwg-url@^6.4.1:
- version "6.5.0"
- resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8"
- integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==
- dependencies:
- lodash.sortby "^4.7.0"
- tr46 "^1.0.1"
- webidl-conversions "^4.0.2"
-
-whatwg-url@^7.0.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06"
- integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==
- dependencies:
- lodash.sortby "^4.7.0"
- tr46 "^1.0.1"
- webidl-conversions "^4.0.2"
-
-which-module@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
- integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
-
-which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
- integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
- dependencies:
- isexe "^2.0.0"
-
-which@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
- integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
- dependencies:
- isexe "^2.0.0"
-
-wide-align@^1.1.0:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
- integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
- dependencies:
- string-width "^1.0.2 || 2"
-
-widest-line@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc"
- integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==
- dependencies:
- string-width "^2.1.1"
-
-windows-release@^3.1.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.3.0.tgz#dce167e9f8be733f21c849ebd4d03fe66b29b9f0"
- integrity sha512-2HetyTg1Y+R+rUgrKeUEhAG/ZuOmTrI1NBb3ZyAGQMYmOJjBBPe4MTodghRkmLJZHwkuPi02anbeGP+Zf401LQ==
- dependencies:
- execa "^1.0.0"
-
-word-wrap@^1.0.3, word-wrap@~1.2.3:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
- integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
-
-wordwrap@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
- integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
+ "acorn" "^6.2.1"
+ "ajv" "^6.10.2"
+ "ajv-keywords" "^3.4.1"
+ "chrome-trace-event" "^1.0.2"
+ "enhanced-resolve" "^4.1.0"
+ "eslint-scope" "^4.0.3"
+ "json-parse-better-errors" "^1.0.2"
+ "loader-runner" "^2.4.0"
+ "loader-utils" "^1.2.3"
+ "memory-fs" "^0.4.1"
+ "micromatch" "^3.1.10"
+ "mkdirp" "^0.5.1"
+ "neo-async" "^2.6.1"
+ "node-libs-browser" "^2.2.1"
+ "schema-utils" "^1.0.0"
+ "tapable" "^1.1.3"
+ "terser-webpack-plugin" "^1.4.3"
+ "watchpack" "^1.6.0"
+ "webpack-sources" "^1.4.1"
+
+"websocket-driver@>=0.5.1":
+ "integrity" "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg=="
+ "resolved" "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz"
+ "version" "0.7.3"
+ dependencies:
+ "http-parser-js" ">=0.4.0 <0.4.11"
+ "safe-buffer" ">=5.1.0"
+ "websocket-extensions" ">=0.1.1"
+
+"websocket-extensions@>=0.1.1":
+ "integrity" "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg=="
+ "resolved" "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz"
+ "version" "0.1.3"
+
+"whatwg-encoding@^1.0.1", "whatwg-encoding@^1.0.3", "whatwg-encoding@^1.0.5":
+ "integrity" "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw=="
+ "resolved" "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz"
+ "version" "1.0.5"
+ dependencies:
+ "iconv-lite" "0.4.24"
+
+"whatwg-fetch@^3.0.0", "whatwg-fetch@>=0.10.0", "whatwg-fetch@3.0.0":
+ "integrity" "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q=="
+ "resolved" "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz"
+ "version" "3.0.0"
+
+"whatwg-mimetype@^2.1.0", "whatwg-mimetype@^2.2.0", "whatwg-mimetype@^2.3.0":
+ "integrity" "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g=="
+ "resolved" "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz"
+ "version" "2.3.0"
+
+"whatwg-url@^6.4.1":
+ "integrity" "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ=="
+ "resolved" "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz"
+ "version" "6.5.0"
+ dependencies:
+ "lodash.sortby" "^4.7.0"
+ "tr46" "^1.0.1"
+ "webidl-conversions" "^4.0.2"
+
+"whatwg-url@^7.0.0":
+ "integrity" "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg=="
+ "resolved" "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz"
+ "version" "7.1.0"
+ dependencies:
+ "lodash.sortby" "^4.7.0"
+ "tr46" "^1.0.1"
+ "webidl-conversions" "^4.0.2"
+
+"which-boxed-primitive@^1.0.2":
+ "integrity" "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg=="
+ "resolved" "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "is-bigint" "^1.0.1"
+ "is-boolean-object" "^1.1.0"
+ "is-number-object" "^1.0.4"
+ "is-string" "^1.0.5"
+ "is-symbol" "^1.0.3"
+
+"which-module@^2.0.0":
+ "integrity" "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+ "resolved" "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz"
+ "version" "2.0.0"
+
+"which@^1.2.14", "which@^1.2.9", "which@^1.3.0", "which@^1.3.1":
+ "integrity" "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="
+ "resolved" "https://registry.npmjs.org/which/-/which-1.3.1.tgz"
+ "version" "1.3.1"
+ dependencies:
+ "isexe" "^2.0.0"
+
+"which@^2.0.1":
+ "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="
+ "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
+ "version" "2.0.2"
+ dependencies:
+ "isexe" "^2.0.0"
+
+"wide-align@^1.1.0":
+ "version" "1.1.2"
+ dependencies:
+ "string-width" "^1.0.2"
+
+"widest-line@^2.0.0":
+ "integrity" "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA=="
+ "resolved" "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz"
+ "version" "2.0.1"
+ dependencies:
+ "string-width" "^2.1.1"
+
+"windows-release@^3.1.0":
+ "integrity" "sha512-2HetyTg1Y+R+rUgrKeUEhAG/ZuOmTrI1NBb3ZyAGQMYmOJjBBPe4MTodghRkmLJZHwkuPi02anbeGP+Zf401LQ=="
+ "resolved" "https://registry.npmjs.org/windows-release/-/windows-release-3.3.0.tgz"
+ "version" "3.3.0"
+ dependencies:
+ "execa" "^1.0.0"
+
+"word-wrap@^1.0.3", "word-wrap@~1.2.3":
+ "integrity" "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
+ "resolved" "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz"
+ "version" "1.2.3"
+
+"wordwrap@^1.0.0":
+ "integrity" "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
+ "resolved" "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz"
+ "version" "1.0.0"
-workbox-background-sync@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz#26821b9bf16e9e37fd1d640289edddc08afd1950"
- integrity sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==
+"workbox-background-sync@^4.3.1":
+ "integrity" "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg=="
+ "resolved" "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz"
+ "version" "4.3.1"
dependencies:
- workbox-core "^4.3.1"
+ "workbox-core" "^4.3.1"
-workbox-broadcast-update@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz#e2c0280b149e3a504983b757606ad041f332c35b"
- integrity sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==
+"workbox-broadcast-update@^4.3.1":
+ "integrity" "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA=="
+ "resolved" "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz"
+ "version" "4.3.1"
dependencies:
- workbox-core "^4.3.1"
+ "workbox-core" "^4.3.1"
-workbox-build@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-4.3.1.tgz#414f70fb4d6de47f6538608b80ec52412d233e64"
- integrity sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==
+"workbox-build@^4.3.1":
+ "integrity" "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw=="
+ "resolved" "https://registry.npmjs.org/workbox-build/-/workbox-build-4.3.1.tgz"
+ "version" "4.3.1"
dependencies:
"@babel/runtime" "^7.3.4"
"@hapi/joi" "^15.0.0"
- common-tags "^1.8.0"
- fs-extra "^4.0.2"
- glob "^7.1.3"
- lodash.template "^4.4.0"
- pretty-bytes "^5.1.0"
- stringify-object "^3.3.0"
- strip-comments "^1.0.2"
- workbox-background-sync "^4.3.1"
- workbox-broadcast-update "^4.3.1"
- workbox-cacheable-response "^4.3.1"
- workbox-core "^4.3.1"
- workbox-expiration "^4.3.1"
- workbox-google-analytics "^4.3.1"
- workbox-navigation-preload "^4.3.1"
- workbox-precaching "^4.3.1"
- workbox-range-requests "^4.3.1"
- workbox-routing "^4.3.1"
- workbox-strategies "^4.3.1"
- workbox-streams "^4.3.1"
- workbox-sw "^4.3.1"
- workbox-window "^4.3.1"
-
-workbox-cacheable-response@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz#f53e079179c095a3f19e5313b284975c91428c91"
- integrity sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==
- dependencies:
- workbox-core "^4.3.1"
-
-workbox-core@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-4.3.1.tgz#005d2c6a06a171437afd6ca2904a5727ecd73be6"
- integrity sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==
-
-workbox-expiration@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-4.3.1.tgz#d790433562029e56837f341d7f553c4a78ebe921"
- integrity sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==
- dependencies:
- workbox-core "^4.3.1"
-
-workbox-google-analytics@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz#9eda0183b103890b5c256e6f4ea15a1f1548519a"
- integrity sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==
- dependencies:
- workbox-background-sync "^4.3.1"
- workbox-core "^4.3.1"
- workbox-routing "^4.3.1"
- workbox-strategies "^4.3.1"
-
-workbox-navigation-preload@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz#29c8e4db5843803b34cd96dc155f9ebd9afa453d"
- integrity sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==
- dependencies:
- workbox-core "^4.3.1"
-
-workbox-precaching@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-4.3.1.tgz#9fc45ed122d94bbe1f0ea9584ff5940960771cba"
- integrity sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==
- dependencies:
- workbox-core "^4.3.1"
-
-workbox-range-requests@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz#f8a470188922145cbf0c09a9a2d5e35645244e74"
- integrity sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==
- dependencies:
- workbox-core "^4.3.1"
-
-workbox-routing@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-4.3.1.tgz#a675841af623e0bb0c67ce4ed8e724ac0bed0cda"
- integrity sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==
- dependencies:
- workbox-core "^4.3.1"
-
-workbox-strategies@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-4.3.1.tgz#d2be03c4ef214c115e1ab29c9c759c9fe3e9e646"
- integrity sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==
- dependencies:
- workbox-core "^4.3.1"
-
-workbox-streams@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-4.3.1.tgz#0b57da70e982572de09c8742dd0cb40a6b7c2cc3"
- integrity sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==
- dependencies:
- workbox-core "^4.3.1"
-
-workbox-sw@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-4.3.1.tgz#df69e395c479ef4d14499372bcd84c0f5e246164"
- integrity sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==
-
-workbox-webpack-plugin@4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz#47ff5ea1cc074b6c40fb5a86108863a24120d4bd"
- integrity sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==
+ "common-tags" "^1.8.0"
+ "fs-extra" "^4.0.2"
+ "glob" "^7.1.3"
+ "lodash.template" "^4.4.0"
+ "pretty-bytes" "^5.1.0"
+ "stringify-object" "^3.3.0"
+ "strip-comments" "^1.0.2"
+ "workbox-background-sync" "^4.3.1"
+ "workbox-broadcast-update" "^4.3.1"
+ "workbox-cacheable-response" "^4.3.1"
+ "workbox-core" "^4.3.1"
+ "workbox-expiration" "^4.3.1"
+ "workbox-google-analytics" "^4.3.1"
+ "workbox-navigation-preload" "^4.3.1"
+ "workbox-precaching" "^4.3.1"
+ "workbox-range-requests" "^4.3.1"
+ "workbox-routing" "^4.3.1"
+ "workbox-strategies" "^4.3.1"
+ "workbox-streams" "^4.3.1"
+ "workbox-sw" "^4.3.1"
+ "workbox-window" "^4.3.1"
+
+"workbox-cacheable-response@^4.3.1":
+ "integrity" "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw=="
+ "resolved" "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz"
+ "version" "4.3.1"
+ dependencies:
+ "workbox-core" "^4.3.1"
+
+"workbox-core@^4.3.1":
+ "integrity" "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg=="
+ "resolved" "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz"
+ "version" "4.3.1"
+
+"workbox-expiration@^4.3.1":
+ "integrity" "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw=="
+ "resolved" "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz"
+ "version" "4.3.1"
+ dependencies:
+ "workbox-core" "^4.3.1"
+
+"workbox-google-analytics@^4.3.1":
+ "integrity" "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg=="
+ "resolved" "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz"
+ "version" "4.3.1"
+ dependencies:
+ "workbox-background-sync" "^4.3.1"
+ "workbox-core" "^4.3.1"
+ "workbox-routing" "^4.3.1"
+ "workbox-strategies" "^4.3.1"
+
+"workbox-navigation-preload@^4.3.1":
+ "integrity" "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw=="
+ "resolved" "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz"
+ "version" "4.3.1"
+ dependencies:
+ "workbox-core" "^4.3.1"
+
+"workbox-precaching@^4.3.1":
+ "integrity" "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ=="
+ "resolved" "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz"
+ "version" "4.3.1"
+ dependencies:
+ "workbox-core" "^4.3.1"
+
+"workbox-range-requests@^4.3.1":
+ "integrity" "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA=="
+ "resolved" "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz"
+ "version" "4.3.1"
+ dependencies:
+ "workbox-core" "^4.3.1"
+
+"workbox-routing@^4.3.1":
+ "integrity" "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g=="
+ "resolved" "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz"
+ "version" "4.3.1"
+ dependencies:
+ "workbox-core" "^4.3.1"
+
+"workbox-strategies@^4.3.1":
+ "integrity" "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw=="
+ "resolved" "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz"
+ "version" "4.3.1"
+ dependencies:
+ "workbox-core" "^4.3.1"
+
+"workbox-streams@^4.3.1":
+ "integrity" "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA=="
+ "resolved" "https://registry.npmjs.org/workbox-streams/-/workbox-streams-4.3.1.tgz"
+ "version" "4.3.1"
+ dependencies:
+ "workbox-core" "^4.3.1"
+
+"workbox-sw@^4.3.1":
+ "integrity" "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w=="
+ "resolved" "https://registry.npmjs.org/workbox-sw/-/workbox-sw-4.3.1.tgz"
+ "version" "4.3.1"
+
+"workbox-webpack-plugin@4.3.1":
+ "integrity" "sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ=="
+ "resolved" "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz"
+ "version" "4.3.1"
dependencies:
"@babel/runtime" "^7.0.0"
- json-stable-stringify "^1.0.1"
- workbox-build "^4.3.1"
+ "json-stable-stringify" "^1.0.1"
+ "workbox-build" "^4.3.1"
-workbox-window@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-4.3.1.tgz#ee6051bf10f06afa5483c9b8dfa0531994ede0f3"
- integrity sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==
+"workbox-window@^4.3.1":
+ "integrity" "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg=="
+ "resolved" "https://registry.npmjs.org/workbox-window/-/workbox-window-4.3.1.tgz"
+ "version" "4.3.1"
dependencies:
- workbox-core "^4.3.1"
+ "workbox-core" "^4.3.1"
-worker-farm@^1.6.0, worker-farm@^1.7.0:
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"
- integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==
+"worker-farm@^1.6.0", "worker-farm@^1.7.0":
+ "integrity" "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw=="
+ "resolved" "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz"
+ "version" "1.7.0"
dependencies:
- errno "~0.1.7"
+ "errno" "~0.1.7"
-worker-rpc@^0.1.0:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5"
- integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==
+"worker-rpc@^0.1.0":
+ "integrity" "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg=="
+ "resolved" "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz"
+ "version" "0.1.1"
dependencies:
- microevent.ts "~0.1.1"
+ "microevent.ts" "~0.1.1"
-wrap-ansi@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
- integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
+"wrap-ansi@^2.0.0":
+ "integrity" "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU="
+ "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz"
+ "version" "2.1.0"
dependencies:
- string-width "^1.0.1"
- strip-ansi "^3.0.1"
+ "string-width" "^1.0.1"
+ "strip-ansi" "^3.0.1"
-wrap-ansi@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
- integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
+"wrap-ansi@^5.1.0":
+ "integrity" "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q=="
+ "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz"
+ "version" "5.1.0"
dependencies:
- ansi-styles "^3.2.0"
- string-width "^3.0.0"
- strip-ansi "^5.0.0"
+ "ansi-styles" "^3.2.0"
+ "string-width" "^3.0.0"
+ "strip-ansi" "^5.0.0"
-wrap-ansi@^6.2.0:
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
- integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
+"wrap-ansi@^6.2.0":
+ "integrity" "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="
+ "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz"
+ "version" "6.2.0"
dependencies:
- ansi-styles "^4.0.0"
- string-width "^4.1.0"
- strip-ansi "^6.0.0"
+ "ansi-styles" "^4.0.0"
+ "string-width" "^4.1.0"
+ "strip-ansi" "^6.0.0"
-wrappy@1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
- integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+"wrappy@1":
+ "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
+ "version" "1.0.2"
-write-file-atomic@2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529"
- integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==
+"write-file-atomic@^2.0.0", "write-file-atomic@^2.3.0", "write-file-atomic@^2.4.3":
+ "integrity" "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ=="
+ "resolved" "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz"
+ "version" "2.4.3"
dependencies:
- graceful-fs "^4.1.11"
- imurmurhash "^0.1.4"
- signal-exit "^3.0.2"
+ "graceful-fs" "^4.1.11"
+ "imurmurhash" "^0.1.4"
+ "signal-exit" "^3.0.2"
-write-file-atomic@^2.0.0, write-file-atomic@^2.3.0, write-file-atomic@^2.4.3:
- version "2.4.3"
- resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481"
- integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==
+"write-file-atomic@2.4.1":
+ "integrity" "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg=="
+ "resolved" "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz"
+ "version" "2.4.1"
dependencies:
- graceful-fs "^4.1.11"
- imurmurhash "^0.1.4"
- signal-exit "^3.0.2"
+ "graceful-fs" "^4.1.11"
+ "imurmurhash" "^0.1.4"
+ "signal-exit" "^3.0.2"
-write@1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
- integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
+"write@1.0.3":
+ "integrity" "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig=="
+ "resolved" "https://registry.npmjs.org/write/-/write-1.0.3.tgz"
+ "version" "1.0.3"
dependencies:
- mkdirp "^0.5.1"
+ "mkdirp" "^0.5.1"
-ws@^5.2.0:
- version "5.2.2"
- resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f"
- integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==
+"ws@^5.2.0":
+ "integrity" "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA=="
+ "resolved" "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz"
+ "version" "5.2.2"
dependencies:
- async-limiter "~1.0.0"
+ "async-limiter" "~1.0.0"
-ws@^6.1.2, ws@^6.2.1:
- version "6.2.1"
- resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb"
- integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==
+"ws@^6.1.2", "ws@^6.2.1":
+ "integrity" "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA=="
+ "resolved" "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz"
+ "version" "6.2.1"
dependencies:
- async-limiter "~1.0.0"
+ "async-limiter" "~1.0.0"
-xdg-basedir@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
- integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=
+"xdg-basedir@^3.0.0":
+ "integrity" "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ="
+ "resolved" "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz"
+ "version" "3.0.0"
-xml-but-prettier@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/xml-but-prettier/-/xml-but-prettier-1.0.1.tgz#f5a33267ed42ccd4e355c62557a5e39b01fb40f3"
- integrity sha1-9aMyZ+1CzNTjVcYlV6XjmwH7QPM=
+"xml-but-prettier@^1.0.1":
+ "integrity" "sha1-9aMyZ+1CzNTjVcYlV6XjmwH7QPM="
+ "resolved" "https://registry.npmjs.org/xml-but-prettier/-/xml-but-prettier-1.0.1.tgz"
+ "version" "1.0.1"
dependencies:
- repeat-string "^1.5.2"
+ "repeat-string" "^1.5.2"
-xml-name-validator@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
- integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
+"xml-name-validator@^3.0.0":
+ "integrity" "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="
+ "resolved" "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz"
+ "version" "3.0.0"
-xmlchars@^2.1.1:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
- integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
+"xmlchars@^2.1.1":
+ "integrity" "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
+ "resolved" "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz"
+ "version" "2.2.0"
-xregexp@^4.3.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50"
- integrity sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==
+"xregexp@^4.3.0":
+ "integrity" "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g=="
+ "resolved" "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz"
+ "version" "4.3.0"
dependencies:
"@babel/runtime-corejs3" "^7.8.3"
-xtend@^4.0.0, xtend@~4.0.1:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
- integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
-
-xterm-addon-fit@^0.5.0:
- version "0.5.0"
- resolved "https://registry.yarnpkg.com/xterm-addon-fit/-/xterm-addon-fit-0.5.0.tgz#2d51b983b786a97dcd6cde805e700c7f913bc596"
- integrity sha512-DsS9fqhXHacEmsPxBJZvfj2la30Iz9xk+UKjhQgnYNkrUIN5CYLbw7WEfz117c7+S86S/tpHPfvNxJsF5/G8wQ==
-
-xterm-addon-search@^0.8.0:
- version "0.8.0"
- resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.8.0.tgz#e33eab918df7eac7e7baf95dd2b3d14133754881"
- integrity sha512-MPJGPVPpHRUw9cLIuqQbrVepmENMOybVUSxIALz5h1ryyQBrVqVujq2hL5aroX5/dZJoHx9lGHQTVLQ07SKgKA==
-
-xterm-addon-web-links@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/xterm-addon-web-links/-/xterm-addon-web-links-0.4.0.tgz#265cbf8221b9b315d0a748e1323bee331cd5da03"
- integrity sha512-xv8GeiINmx0zENO9hf5k+5bnkaE8mRzF+OBAr9WeFq2eLaQSudioQSiT34M1ofKbzcdjSsKiZm19Rw3i4eXamg==
-
-xterm@^4.12.0:
- version "4.12.0"
- resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.12.0.tgz#db09b425b4dcae5b96f8cbbaaa93b3bc60997ca9"
- integrity sha512-K5mF/p3txUV18mjiZFlElagoHFpqXrm5OYHeoymeXSu8GG/nMaOO/+NRcNCwfdjzAbdQ5VLF32hEHiWWKKm0bw==
-
-y18n@^3.2.1:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
- integrity sha1-bRX7qITAhnnA136I53WegR4H+kE=
-
-"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
- integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
-
-yallist@^2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
- integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
-
-yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
- integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
-
-yallist@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
- integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
-
-yaml@^1.7.2:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e"
- integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==
-
-yargs-parser@^11.1.1:
- version "11.1.1"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4"
- integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==
- dependencies:
- camelcase "^5.0.0"
- decamelize "^1.2.0"
-
-yargs-parser@^13.1.2:
- version "13.1.2"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
- integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
- dependencies:
- camelcase "^5.0.0"
- decamelize "^1.2.0"
-
-yargs-parser@^18.1.1, yargs-parser@^18.1.3:
- version "18.1.3"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
- integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
- dependencies:
- camelcase "^5.0.0"
- decamelize "^1.2.0"
-
-yargs-parser@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
- integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k=
- dependencies:
- camelcase "^4.1.0"
-
-yargs-parser@^9.0.2:
- version "9.0.2"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077"
- integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=
- dependencies:
- camelcase "^4.1.0"
-
-yargs@12.0.5:
- version "12.0.5"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13"
- integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==
- dependencies:
- cliui "^4.0.0"
- decamelize "^1.2.0"
- find-up "^3.0.0"
- get-caller-file "^1.0.1"
- os-locale "^3.0.0"
- require-directory "^2.1.1"
- require-main-filename "^1.0.1"
- set-blocking "^2.0.0"
- string-width "^2.0.0"
- which-module "^2.0.0"
- y18n "^3.2.1 || ^4.0.0"
- yargs-parser "^11.1.1"
-
-yargs@^11.0.0:
- version "11.1.1"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.1.tgz#5052efe3446a4df5ed669c995886cc0f13702766"
- integrity sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==
- dependencies:
- cliui "^4.0.0"
- decamelize "^1.1.1"
- find-up "^2.1.0"
- get-caller-file "^1.0.1"
- os-locale "^3.1.0"
- require-directory "^2.1.1"
- require-main-filename "^1.0.1"
- set-blocking "^2.0.0"
- string-width "^2.0.0"
- which-module "^2.0.0"
- y18n "^3.2.1"
- yargs-parser "^9.0.2"
-
-yargs@^13.3.0:
- version "13.3.2"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
- integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
- dependencies:
- cliui "^5.0.0"
- find-up "^3.0.0"
- get-caller-file "^2.0.1"
- require-directory "^2.1.1"
- require-main-filename "^2.0.0"
- set-blocking "^2.0.0"
- string-width "^3.0.0"
- which-module "^2.0.0"
- y18n "^4.0.0"
- yargs-parser "^13.1.2"
-
-yargs@^15.0.1:
- version "15.3.1"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b"
- integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==
- dependencies:
- cliui "^6.0.0"
- decamelize "^1.2.0"
- find-up "^4.1.0"
- get-caller-file "^2.0.1"
- require-directory "^2.1.1"
- require-main-filename "^2.0.0"
- set-blocking "^2.0.0"
- string-width "^4.2.0"
- which-module "^2.0.0"
- y18n "^4.0.0"
- yargs-parser "^18.1.1"
-
-yargs@^8.0.2:
- version "8.0.2"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
- integrity sha1-YpmpBVsc78lp/355wdkY3Osiw2A=
- dependencies:
- camelcase "^4.1.0"
- cliui "^3.2.0"
- decamelize "^1.1.1"
- get-caller-file "^1.0.1"
- os-locale "^2.0.0"
- read-pkg-up "^2.0.0"
- require-directory "^2.1.1"
- require-main-filename "^1.0.1"
- set-blocking "^2.0.0"
- string-width "^2.0.0"
- which-module "^2.0.0"
- y18n "^3.2.1"
- yargs-parser "^7.0.0"
-
-yarn@^1.16.0:
- version "1.22.4"
- resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.4.tgz#01c1197ca5b27f21edc8bc472cd4c8ce0e5a470e"
- integrity sha512-oYM7hi/lIWm9bCoDMEWgffW8aiNZXCWeZ1/tGy0DWrN6vmzjCXIKu2Y21o8DYVBUtiktwKcNoxyGl/2iKLUNGA==
-
-zenscroll@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/zenscroll/-/zenscroll-4.0.2.tgz#e8d5774d1c0738a47bcfa8729f3712e2deddeb25"
- integrity sha1-6NV3TRwHOKR7z6hynzcS4t7d6yU=
+"xtend@^4.0.0", "xtend@~4.0.1":
+ "integrity" "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
+ "resolved" "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz"
+ "version" "4.0.2"
+
+"xterm-addon-fit@^0.5.0":
+ "integrity" "sha512-DsS9fqhXHacEmsPxBJZvfj2la30Iz9xk+UKjhQgnYNkrUIN5CYLbw7WEfz117c7+S86S/tpHPfvNxJsF5/G8wQ=="
+ "resolved" "https://registry.npmjs.org/xterm-addon-fit/-/xterm-addon-fit-0.5.0.tgz"
+ "version" "0.5.0"
+
+"xterm-addon-search@^0.8.0":
+ "integrity" "sha512-MPJGPVPpHRUw9cLIuqQbrVepmENMOybVUSxIALz5h1ryyQBrVqVujq2hL5aroX5/dZJoHx9lGHQTVLQ07SKgKA=="
+ "resolved" "https://registry.npmjs.org/xterm-addon-search/-/xterm-addon-search-0.8.0.tgz"
+ "version" "0.8.0"
+
+"xterm-addon-web-links@^0.4.0":
+ "integrity" "sha512-xv8GeiINmx0zENO9hf5k+5bnkaE8mRzF+OBAr9WeFq2eLaQSudioQSiT34M1ofKbzcdjSsKiZm19Rw3i4eXamg=="
+ "resolved" "https://registry.npmjs.org/xterm-addon-web-links/-/xterm-addon-web-links-0.4.0.tgz"
+ "version" "0.4.0"
+
+"xterm@^4.0.0", "xterm@^4.12.0":
+ "integrity" "sha512-K5mF/p3txUV18mjiZFlElagoHFpqXrm5OYHeoymeXSu8GG/nMaOO/+NRcNCwfdjzAbdQ5VLF32hEHiWWKKm0bw=="
+ "resolved" "https://registry.npmjs.org/xterm/-/xterm-4.12.0.tgz"
+ "version" "4.12.0"
+
+"y18n@^3.2.1 || ^4.0.0", "y18n@^4.0.0":
+ "integrity" "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="
+ "resolved" "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz"
+ "version" "4.0.0"
+
+"y18n@^3.2.1":
+ "integrity" "sha1-bRX7qITAhnnA136I53WegR4H+kE="
+ "resolved" "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz"
+ "version" "3.2.1"
+
+"yallist@^2.1.2":
+ "integrity" "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
+ "resolved" "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz"
+ "version" "2.1.2"
+
+"yallist@^3.0.0", "yallist@^3.0.3":
+ "version" "3.0.3"
+
+"yallist@^3.0.2":
+ "integrity" "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+ "resolved" "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz"
+ "version" "3.1.1"
+
+"yallist@^4.0.0":
+ "integrity" "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ "resolved" "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz"
+ "version" "4.0.0"
+
+"yaml@^1.7.2":
+ "integrity" "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg=="
+ "resolved" "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz"
+ "version" "1.10.0"
+
+"yargs-parser@^11.1.1":
+ "integrity" "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ=="
+ "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz"
+ "version" "11.1.1"
+ dependencies:
+ "camelcase" "^5.0.0"
+ "decamelize" "^1.2.0"
+
+"yargs-parser@^13.1.2":
+ "integrity" "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg=="
+ "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz"
+ "version" "13.1.2"
+ dependencies:
+ "camelcase" "^5.0.0"
+ "decamelize" "^1.2.0"
+
+"yargs-parser@^18.1.1", "yargs-parser@^18.1.3":
+ "integrity" "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ=="
+ "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz"
+ "version" "18.1.3"
+ dependencies:
+ "camelcase" "^5.0.0"
+ "decamelize" "^1.2.0"
+
+"yargs-parser@^9.0.2":
+ "integrity" "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc="
+ "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz"
+ "version" "9.0.2"
+ dependencies:
+ "camelcase" "^4.1.0"
+
+"yargs@^11.0.0":
+ "integrity" "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw=="
+ "resolved" "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz"
+ "version" "11.1.1"
+ dependencies:
+ "cliui" "^4.0.0"
+ "decamelize" "^1.1.1"
+ "find-up" "^2.1.0"
+ "get-caller-file" "^1.0.1"
+ "os-locale" "^3.1.0"
+ "require-directory" "^2.1.1"
+ "require-main-filename" "^1.0.1"
+ "set-blocking" "^2.0.0"
+ "string-width" "^2.0.0"
+ "which-module" "^2.0.0"
+ "y18n" "^3.2.1"
+ "yargs-parser" "^9.0.2"
+
+"yargs@^13.3.0":
+ "integrity" "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw=="
+ "resolved" "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz"
+ "version" "13.3.2"
+ dependencies:
+ "cliui" "^5.0.0"
+ "find-up" "^3.0.0"
+ "get-caller-file" "^2.0.1"
+ "require-directory" "^2.1.1"
+ "require-main-filename" "^2.0.0"
+ "set-blocking" "^2.0.0"
+ "string-width" "^3.0.0"
+ "which-module" "^2.0.0"
+ "y18n" "^4.0.0"
+ "yargs-parser" "^13.1.2"
+
+"yargs@^15.0.1":
+ "integrity" "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA=="
+ "resolved" "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz"
+ "version" "15.3.1"
+ dependencies:
+ "cliui" "^6.0.0"
+ "decamelize" "^1.2.0"
+ "find-up" "^4.1.0"
+ "get-caller-file" "^2.0.1"
+ "require-directory" "^2.1.1"
+ "require-main-filename" "^2.0.0"
+ "set-blocking" "^2.0.0"
+ "string-width" "^4.2.0"
+ "which-module" "^2.0.0"
+ "y18n" "^4.0.0"
+ "yargs-parser" "^18.1.1"
+
+"yargs@12.0.5":
+ "integrity" "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw=="
+ "resolved" "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz"
+ "version" "12.0.5"
+ dependencies:
+ "cliui" "^4.0.0"
+ "decamelize" "^1.2.0"
+ "find-up" "^3.0.0"
+ "get-caller-file" "^1.0.1"
+ "os-locale" "^3.0.0"
+ "require-directory" "^2.1.1"
+ "require-main-filename" "^1.0.1"
+ "set-blocking" "^2.0.0"
+ "string-width" "^2.0.0"
+ "which-module" "^2.0.0"
+ "y18n" "^3.2.1 || ^4.0.0"
+ "yargs-parser" "^11.1.1"
+
+"yarn@^1.16.0":
+ "integrity" "sha512-oYM7hi/lIWm9bCoDMEWgffW8aiNZXCWeZ1/tGy0DWrN6vmzjCXIKu2Y21o8DYVBUtiktwKcNoxyGl/2iKLUNGA=="
+ "resolved" "https://registry.npmjs.org/yarn/-/yarn-1.22.4.tgz"
+ "version" "1.22.4"
+
+"zenscroll@^4.0.2":
+ "integrity" "sha1-6NV3TRwHOKR7z6hynzcS4t7d6yU="
+ "resolved" "https://registry.npmjs.org/zenscroll/-/zenscroll-4.0.2.tgz"
+ "version" "4.0.2"
diff --git a/zuul/ansible/2.7/actiontrusted/__init__.py b/zuul/ansible/2.7/actiontrusted/__init__.py
deleted file mode 120000
index e64650426..000000000
--- a/zuul/ansible/2.7/actiontrusted/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/actiontrusted/__init__.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/actiontrusted/command.py b/zuul/ansible/2.7/actiontrusted/command.py
deleted file mode 120000
index 0eb995eaa..000000000
--- a/zuul/ansible/2.7/actiontrusted/command.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/actiontrusted/command.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/actiontrusted/command.pyi b/zuul/ansible/2.7/actiontrusted/command.pyi
deleted file mode 120000
index 17d0db7f6..000000000
--- a/zuul/ansible/2.7/actiontrusted/command.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/actiontrusted/command.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/add_host.py b/zuul/ansible/2.8/action/add_host.py
deleted file mode 120000
index fdb7f466b..000000000
--- a/zuul/ansible/2.8/action/add_host.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/add_host.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/add_host.pyi b/zuul/ansible/2.8/action/add_host.pyi
deleted file mode 120000
index 9257939ce..000000000
--- a/zuul/ansible/2.8/action/add_host.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/add_host.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/aireos.py b/zuul/ansible/2.8/action/aireos.py
deleted file mode 120000
index f2459ab86..000000000
--- a/zuul/ansible/2.8/action/aireos.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/aireos.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/aireos.pyi b/zuul/ansible/2.8/action/aireos.pyi
deleted file mode 120000
index f58722a86..000000000
--- a/zuul/ansible/2.8/action/aireos.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/aireos.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/aireos_config.py b/zuul/ansible/2.8/action/aireos_config.py
deleted file mode 120000
index acc0dd85e..000000000
--- a/zuul/ansible/2.8/action/aireos_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/aireos_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/aireos_config.pyi b/zuul/ansible/2.8/action/aireos_config.pyi
deleted file mode 120000
index fc7b16cf6..000000000
--- a/zuul/ansible/2.8/action/aireos_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/aireos_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/aruba.py b/zuul/ansible/2.8/action/aruba.py
deleted file mode 120000
index 8784b92ed..000000000
--- a/zuul/ansible/2.8/action/aruba.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/aruba.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/aruba.pyi b/zuul/ansible/2.8/action/aruba.pyi
deleted file mode 120000
index 228b3ecfe..000000000
--- a/zuul/ansible/2.8/action/aruba.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/aruba.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/aruba_config.py b/zuul/ansible/2.8/action/aruba_config.py
deleted file mode 120000
index f50d9082b..000000000
--- a/zuul/ansible/2.8/action/aruba_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/aruba_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/aruba_config.pyi b/zuul/ansible/2.8/action/aruba_config.pyi
deleted file mode 120000
index bab9d28fd..000000000
--- a/zuul/ansible/2.8/action/aruba_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/aruba_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/asa.py b/zuul/ansible/2.8/action/asa.py
deleted file mode 120000
index 3e7e93dc0..000000000
--- a/zuul/ansible/2.8/action/asa.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/asa.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/asa.pyi b/zuul/ansible/2.8/action/asa.pyi
deleted file mode 120000
index e0cdc24b5..000000000
--- a/zuul/ansible/2.8/action/asa.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/asa.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/asa_config.py b/zuul/ansible/2.8/action/asa_config.py
deleted file mode 120000
index 598f400d5..000000000
--- a/zuul/ansible/2.8/action/asa_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/asa_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/asa_config.pyi b/zuul/ansible/2.8/action/asa_config.pyi
deleted file mode 120000
index 86fe03484..000000000
--- a/zuul/ansible/2.8/action/asa_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/asa_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/asa_template.py b/zuul/ansible/2.8/action/asa_template.py
deleted file mode 120000
index e1e8eecbe..000000000
--- a/zuul/ansible/2.8/action/asa_template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/asa_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/asa_template.pyi b/zuul/ansible/2.8/action/asa_template.pyi
deleted file mode 120000
index 0753101f1..000000000
--- a/zuul/ansible/2.8/action/asa_template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/asa_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/assemble.py b/zuul/ansible/2.8/action/assemble.py
deleted file mode 120000
index 22273b123..000000000
--- a/zuul/ansible/2.8/action/assemble.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/assemble.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/assemble.pyi b/zuul/ansible/2.8/action/assemble.pyi
deleted file mode 120000
index 3a7074ec7..000000000
--- a/zuul/ansible/2.8/action/assemble.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/assemble.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/aws_s3.py b/zuul/ansible/2.8/action/aws_s3.py
deleted file mode 120000
index a2dabf9f8..000000000
--- a/zuul/ansible/2.8/action/aws_s3.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/aws_s3.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/aws_s3.pyi b/zuul/ansible/2.8/action/aws_s3.pyi
deleted file mode 120000
index 5ac40a7db..000000000
--- a/zuul/ansible/2.8/action/aws_s3.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/aws_s3.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/ce.py b/zuul/ansible/2.8/action/ce.py
deleted file mode 120000
index db95d9121..000000000
--- a/zuul/ansible/2.8/action/ce.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ce.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/ce.pyi b/zuul/ansible/2.8/action/ce.pyi
deleted file mode 120000
index ba2365f2b..000000000
--- a/zuul/ansible/2.8/action/ce.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ce.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/ce_config.py b/zuul/ansible/2.8/action/ce_config.py
deleted file mode 120000
index ec0319843..000000000
--- a/zuul/ansible/2.8/action/ce_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ce_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/ce_config.pyi b/zuul/ansible/2.8/action/ce_config.pyi
deleted file mode 120000
index b762785d1..000000000
--- a/zuul/ansible/2.8/action/ce_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ce_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/ce_template.py b/zuul/ansible/2.8/action/ce_template.py
deleted file mode 120000
index aa59e80a0..000000000
--- a/zuul/ansible/2.8/action/ce_template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ce_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/ce_template.pyi b/zuul/ansible/2.8/action/ce_template.pyi
deleted file mode 120000
index 75ba2250c..000000000
--- a/zuul/ansible/2.8/action/ce_template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ce_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/copy.py b/zuul/ansible/2.8/action/copy.py
deleted file mode 120000
index 1c0c2291f..000000000
--- a/zuul/ansible/2.8/action/copy.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/copy.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/copy.pyi b/zuul/ansible/2.8/action/copy.pyi
deleted file mode 120000
index 189722f2a..000000000
--- a/zuul/ansible/2.8/action/copy.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/copy.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/dellos10_config.py b/zuul/ansible/2.8/action/dellos10_config.py
deleted file mode 120000
index caf6ce6c3..000000000
--- a/zuul/ansible/2.8/action/dellos10_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/dellos10_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/dellos10_config.pyi b/zuul/ansible/2.8/action/dellos10_config.pyi
deleted file mode 120000
index ede9a927e..000000000
--- a/zuul/ansible/2.8/action/dellos10_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/dellos10_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/dellos6_config.py b/zuul/ansible/2.8/action/dellos6_config.py
deleted file mode 120000
index 080fcce4c..000000000
--- a/zuul/ansible/2.8/action/dellos6_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/dellos6_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/dellos6_config.pyi b/zuul/ansible/2.8/action/dellos6_config.pyi
deleted file mode 120000
index d5cf3ce15..000000000
--- a/zuul/ansible/2.8/action/dellos6_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/dellos6_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/dellos9_config.py b/zuul/ansible/2.8/action/dellos9_config.py
deleted file mode 120000
index c2e79870c..000000000
--- a/zuul/ansible/2.8/action/dellos9_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/dellos9_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/dellos9_config.pyi b/zuul/ansible/2.8/action/dellos9_config.pyi
deleted file mode 120000
index b50389ab4..000000000
--- a/zuul/ansible/2.8/action/dellos9_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/dellos9_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/eos_config.py b/zuul/ansible/2.8/action/eos_config.py
deleted file mode 120000
index 4d1ab53bb..000000000
--- a/zuul/ansible/2.8/action/eos_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/eos_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/eos_config.pyi b/zuul/ansible/2.8/action/eos_config.pyi
deleted file mode 120000
index f6d058ba1..000000000
--- a/zuul/ansible/2.8/action/eos_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/eos_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/eos_template.py b/zuul/ansible/2.8/action/eos_template.py
deleted file mode 120000
index a108bf66f..000000000
--- a/zuul/ansible/2.8/action/eos_template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/eos_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/eos_template.pyi b/zuul/ansible/2.8/action/eos_template.pyi
deleted file mode 120000
index b9cac42e8..000000000
--- a/zuul/ansible/2.8/action/eos_template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/eos_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/fetch.py b/zuul/ansible/2.8/action/fetch.py
deleted file mode 120000
index d53e02548..000000000
--- a/zuul/ansible/2.8/action/fetch.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/fetch.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/fetch.pyi b/zuul/ansible/2.8/action/fetch.pyi
deleted file mode 120000
index b3ae31523..000000000
--- a/zuul/ansible/2.8/action/fetch.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/fetch.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/fortios_config.py b/zuul/ansible/2.8/action/fortios_config.py
deleted file mode 120000
index ef38743bc..000000000
--- a/zuul/ansible/2.8/action/fortios_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/fortios_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/fortios_config.pyi b/zuul/ansible/2.8/action/fortios_config.pyi
deleted file mode 120000
index fa334a059..000000000
--- a/zuul/ansible/2.8/action/fortios_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/fortios_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/include_vars.py b/zuul/ansible/2.8/action/include_vars.py
deleted file mode 120000
index 832d5a27a..000000000
--- a/zuul/ansible/2.8/action/include_vars.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/include_vars.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/include_vars.pyi b/zuul/ansible/2.8/action/include_vars.pyi
deleted file mode 120000
index 4099c1ae6..000000000
--- a/zuul/ansible/2.8/action/include_vars.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/include_vars.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/ios_config.py b/zuul/ansible/2.8/action/ios_config.py
deleted file mode 120000
index f1495d47e..000000000
--- a/zuul/ansible/2.8/action/ios_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ios_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/ios_config.pyi b/zuul/ansible/2.8/action/ios_config.pyi
deleted file mode 120000
index e6af5e34c..000000000
--- a/zuul/ansible/2.8/action/ios_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ios_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/ios_template.py b/zuul/ansible/2.8/action/ios_template.py
deleted file mode 120000
index ef863cedf..000000000
--- a/zuul/ansible/2.8/action/ios_template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ios_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/ios_template.pyi b/zuul/ansible/2.8/action/ios_template.pyi
deleted file mode 120000
index c37247812..000000000
--- a/zuul/ansible/2.8/action/ios_template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ios_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/iosxr_config.py b/zuul/ansible/2.8/action/iosxr_config.py
deleted file mode 120000
index 4eb293626..000000000
--- a/zuul/ansible/2.8/action/iosxr_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/iosxr_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/iosxr_config.pyi b/zuul/ansible/2.8/action/iosxr_config.pyi
deleted file mode 120000
index 70a2d67a3..000000000
--- a/zuul/ansible/2.8/action/iosxr_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/iosxr_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/iosxr_template.py b/zuul/ansible/2.8/action/iosxr_template.py
deleted file mode 120000
index 6a60fa49e..000000000
--- a/zuul/ansible/2.8/action/iosxr_template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/iosxr_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/iosxr_template.pyi b/zuul/ansible/2.8/action/iosxr_template.pyi
deleted file mode 120000
index 918f5a113..000000000
--- a/zuul/ansible/2.8/action/iosxr_template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/iosxr_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/junos_config.py b/zuul/ansible/2.8/action/junos_config.py
deleted file mode 120000
index c50f3bc67..000000000
--- a/zuul/ansible/2.8/action/junos_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/junos_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/junos_config.pyi b/zuul/ansible/2.8/action/junos_config.pyi
deleted file mode 120000
index 31cbba451..000000000
--- a/zuul/ansible/2.8/action/junos_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/junos_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/junos_template.py b/zuul/ansible/2.8/action/junos_template.py
deleted file mode 120000
index a2119b7cd..000000000
--- a/zuul/ansible/2.8/action/junos_template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/junos_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/junos_template.pyi b/zuul/ansible/2.8/action/junos_template.pyi
deleted file mode 120000
index e6ef22ba9..000000000
--- a/zuul/ansible/2.8/action/junos_template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/junos_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_banner.py b/zuul/ansible/2.8/action/net_banner.py
deleted file mode 120000
index 69cc6d5a4..000000000
--- a/zuul/ansible/2.8/action/net_banner.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_banner.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_banner.pyi b/zuul/ansible/2.8/action/net_banner.pyi
deleted file mode 120000
index f926dbf70..000000000
--- a/zuul/ansible/2.8/action/net_banner.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_banner.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_base.py b/zuul/ansible/2.8/action/net_base.py
deleted file mode 120000
index f36b6ecc7..000000000
--- a/zuul/ansible/2.8/action/net_base.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_base.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_base.pyi b/zuul/ansible/2.8/action/net_base.pyi
deleted file mode 120000
index 9f6ce1b7d..000000000
--- a/zuul/ansible/2.8/action/net_base.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_base.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_config.py b/zuul/ansible/2.8/action/net_config.py
deleted file mode 120000
index a817ca518..000000000
--- a/zuul/ansible/2.8/action/net_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_config.pyi b/zuul/ansible/2.8/action/net_config.pyi
deleted file mode 120000
index 412b8110e..000000000
--- a/zuul/ansible/2.8/action/net_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_get.py b/zuul/ansible/2.8/action/net_get.py
deleted file mode 120000
index da3d7be0e..000000000
--- a/zuul/ansible/2.8/action/net_get.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_get.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_get.pyi b/zuul/ansible/2.8/action/net_get.pyi
deleted file mode 120000
index 015c4271b..000000000
--- a/zuul/ansible/2.8/action/net_get.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_get.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_interface.py b/zuul/ansible/2.8/action/net_interface.py
deleted file mode 120000
index 1d24f7821..000000000
--- a/zuul/ansible/2.8/action/net_interface.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_interface.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_interface.pyi b/zuul/ansible/2.8/action/net_interface.pyi
deleted file mode 120000
index 57bb45316..000000000
--- a/zuul/ansible/2.8/action/net_interface.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_interface.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_l2_interface.py b/zuul/ansible/2.8/action/net_l2_interface.py
deleted file mode 120000
index 1f44192c8..000000000
--- a/zuul/ansible/2.8/action/net_l2_interface.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_l2_interface.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_l2_interface.pyi b/zuul/ansible/2.8/action/net_l2_interface.pyi
deleted file mode 120000
index 2b780821d..000000000
--- a/zuul/ansible/2.8/action/net_l2_interface.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_l2_interface.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_l3_interface.py b/zuul/ansible/2.8/action/net_l3_interface.py
deleted file mode 120000
index 97017f4e3..000000000
--- a/zuul/ansible/2.8/action/net_l3_interface.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_l3_interface.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_l3_interface.pyi b/zuul/ansible/2.8/action/net_l3_interface.pyi
deleted file mode 120000
index 9317599a2..000000000
--- a/zuul/ansible/2.8/action/net_l3_interface.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_l3_interface.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_linkagg.py b/zuul/ansible/2.8/action/net_linkagg.py
deleted file mode 120000
index d3fc53dd1..000000000
--- a/zuul/ansible/2.8/action/net_linkagg.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_linkagg.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_linkagg.pyi b/zuul/ansible/2.8/action/net_linkagg.pyi
deleted file mode 120000
index b5fac56b6..000000000
--- a/zuul/ansible/2.8/action/net_linkagg.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_linkagg.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_lldp.py b/zuul/ansible/2.8/action/net_lldp.py
deleted file mode 120000
index 15fc3a859..000000000
--- a/zuul/ansible/2.8/action/net_lldp.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_lldp.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_lldp.pyi b/zuul/ansible/2.8/action/net_lldp.pyi
deleted file mode 120000
index a627fdec7..000000000
--- a/zuul/ansible/2.8/action/net_lldp.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_lldp.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_lldp_interface.py b/zuul/ansible/2.8/action/net_lldp_interface.py
deleted file mode 120000
index f57ec137f..000000000
--- a/zuul/ansible/2.8/action/net_lldp_interface.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_lldp_interface.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_lldp_interface.pyi b/zuul/ansible/2.8/action/net_lldp_interface.pyi
deleted file mode 120000
index fdd97b078..000000000
--- a/zuul/ansible/2.8/action/net_lldp_interface.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_lldp_interface.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_logging.py b/zuul/ansible/2.8/action/net_logging.py
deleted file mode 120000
index 57d9766aa..000000000
--- a/zuul/ansible/2.8/action/net_logging.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_logging.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_logging.pyi b/zuul/ansible/2.8/action/net_logging.pyi
deleted file mode 120000
index 1d6f1b029..000000000
--- a/zuul/ansible/2.8/action/net_logging.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_logging.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_ping.py b/zuul/ansible/2.8/action/net_ping.py
deleted file mode 120000
index 696d9f526..000000000
--- a/zuul/ansible/2.8/action/net_ping.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_ping.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_ping.pyi b/zuul/ansible/2.8/action/net_ping.pyi
deleted file mode 120000
index 03f84e975..000000000
--- a/zuul/ansible/2.8/action/net_ping.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_ping.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_static_route.py b/zuul/ansible/2.8/action/net_static_route.py
deleted file mode 120000
index c22b7f0e0..000000000
--- a/zuul/ansible/2.8/action/net_static_route.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_static_route.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_static_route.pyi b/zuul/ansible/2.8/action/net_static_route.pyi
deleted file mode 120000
index 859c20fec..000000000
--- a/zuul/ansible/2.8/action/net_static_route.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_static_route.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_system.py b/zuul/ansible/2.8/action/net_system.py
deleted file mode 120000
index a03dd93c9..000000000
--- a/zuul/ansible/2.8/action/net_system.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_system.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_system.pyi b/zuul/ansible/2.8/action/net_system.pyi
deleted file mode 120000
index cc159053b..000000000
--- a/zuul/ansible/2.8/action/net_system.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_system.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_template.py b/zuul/ansible/2.8/action/net_template.py
deleted file mode 120000
index 18ba965e4..000000000
--- a/zuul/ansible/2.8/action/net_template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_template.pyi b/zuul/ansible/2.8/action/net_template.pyi
deleted file mode 120000
index 3bfbb6f0f..000000000
--- a/zuul/ansible/2.8/action/net_template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_user.py b/zuul/ansible/2.8/action/net_user.py
deleted file mode 120000
index fcfb3f55a..000000000
--- a/zuul/ansible/2.8/action/net_user.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_user.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_user.pyi b/zuul/ansible/2.8/action/net_user.pyi
deleted file mode 120000
index 267f5da34..000000000
--- a/zuul/ansible/2.8/action/net_user.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_user.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_vlan.py b/zuul/ansible/2.8/action/net_vlan.py
deleted file mode 120000
index df275656f..000000000
--- a/zuul/ansible/2.8/action/net_vlan.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_vlan.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_vlan.pyi b/zuul/ansible/2.8/action/net_vlan.pyi
deleted file mode 120000
index 718074899..000000000
--- a/zuul/ansible/2.8/action/net_vlan.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_vlan.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_vrf.py b/zuul/ansible/2.8/action/net_vrf.py
deleted file mode 120000
index c757d2100..000000000
--- a/zuul/ansible/2.8/action/net_vrf.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_vrf.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/net_vrf.pyi b/zuul/ansible/2.8/action/net_vrf.pyi
deleted file mode 120000
index df043a0cd..000000000
--- a/zuul/ansible/2.8/action/net_vrf.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_vrf.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/netconf_config.py b/zuul/ansible/2.8/action/netconf_config.py
deleted file mode 120000
index 4d13bb82c..000000000
--- a/zuul/ansible/2.8/action/netconf_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/netconf_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/netconf_config.pyi b/zuul/ansible/2.8/action/netconf_config.pyi
deleted file mode 120000
index c75a746b4..000000000
--- a/zuul/ansible/2.8/action/netconf_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/netconf_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/network.py b/zuul/ansible/2.8/action/network.py
deleted file mode 120000
index 9e2d1baa4..000000000
--- a/zuul/ansible/2.8/action/network.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/network.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/network.pyi b/zuul/ansible/2.8/action/network.pyi
deleted file mode 120000
index e1842d197..000000000
--- a/zuul/ansible/2.8/action/network.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/network.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/normal.py b/zuul/ansible/2.8/action/normal.py
deleted file mode 120000
index 4e131d98d..000000000
--- a/zuul/ansible/2.8/action/normal.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/normal.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/normal.pyi b/zuul/ansible/2.8/action/normal.pyi
deleted file mode 120000
index bbbe0704c..000000000
--- a/zuul/ansible/2.8/action/normal.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/normal.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/nxos_config.py b/zuul/ansible/2.8/action/nxos_config.py
deleted file mode 120000
index 0cc233c34..000000000
--- a/zuul/ansible/2.8/action/nxos_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/nxos_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/nxos_config.pyi b/zuul/ansible/2.8/action/nxos_config.pyi
deleted file mode 120000
index b2e63b6e3..000000000
--- a/zuul/ansible/2.8/action/nxos_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/nxos_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/nxos_template.py b/zuul/ansible/2.8/action/nxos_template.py
deleted file mode 120000
index 3d599062a..000000000
--- a/zuul/ansible/2.8/action/nxos_template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/nxos_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/nxos_template.pyi b/zuul/ansible/2.8/action/nxos_template.pyi
deleted file mode 120000
index e36fa4e90..000000000
--- a/zuul/ansible/2.8/action/nxos_template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/nxos_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/ops_config.py b/zuul/ansible/2.8/action/ops_config.py
deleted file mode 120000
index 2abe0669d..000000000
--- a/zuul/ansible/2.8/action/ops_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ops_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/ops_config.pyi b/zuul/ansible/2.8/action/ops_config.pyi
deleted file mode 120000
index 7517f9c7b..000000000
--- a/zuul/ansible/2.8/action/ops_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ops_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/ops_template.py b/zuul/ansible/2.8/action/ops_template.py
deleted file mode 120000
index 5c841ca57..000000000
--- a/zuul/ansible/2.8/action/ops_template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ops_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/ops_template.pyi b/zuul/ansible/2.8/action/ops_template.pyi
deleted file mode 120000
index 4baa28a3f..000000000
--- a/zuul/ansible/2.8/action/ops_template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ops_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/patch.py b/zuul/ansible/2.8/action/patch.py
deleted file mode 120000
index 8996710ba..000000000
--- a/zuul/ansible/2.8/action/patch.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/patch.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/patch.pyi b/zuul/ansible/2.8/action/patch.pyi
deleted file mode 120000
index 577e43600..000000000
--- a/zuul/ansible/2.8/action/patch.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/patch.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/raw.py b/zuul/ansible/2.8/action/raw.py
deleted file mode 120000
index e4962dd8a..000000000
--- a/zuul/ansible/2.8/action/raw.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/raw.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/raw.pyi b/zuul/ansible/2.8/action/raw.pyi
deleted file mode 120000
index 741945ef2..000000000
--- a/zuul/ansible/2.8/action/raw.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/raw.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/script.py b/zuul/ansible/2.8/action/script.py
deleted file mode 120000
index 1cccf5805..000000000
--- a/zuul/ansible/2.8/action/script.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/script.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/script.pyi b/zuul/ansible/2.8/action/script.pyi
deleted file mode 120000
index aff69744b..000000000
--- a/zuul/ansible/2.8/action/script.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/script.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/sros_config.py b/zuul/ansible/2.8/action/sros_config.py
deleted file mode 120000
index 1762874e4..000000000
--- a/zuul/ansible/2.8/action/sros_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/sros_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/sros_config.pyi b/zuul/ansible/2.8/action/sros_config.pyi
deleted file mode 120000
index 453e4b8e1..000000000
--- a/zuul/ansible/2.8/action/sros_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/sros_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/synchronize.py b/zuul/ansible/2.8/action/synchronize.py
deleted file mode 120000
index f2126166c..000000000
--- a/zuul/ansible/2.8/action/synchronize.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/synchronize.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/synchronize.pyi b/zuul/ansible/2.8/action/synchronize.pyi
deleted file mode 120000
index 4ff1a2ee9..000000000
--- a/zuul/ansible/2.8/action/synchronize.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/synchronize.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/template.py b/zuul/ansible/2.8/action/template.py
deleted file mode 120000
index 720717d83..000000000
--- a/zuul/ansible/2.8/action/template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/template.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/template.pyi b/zuul/ansible/2.8/action/template.pyi
deleted file mode 120000
index aed7fb07a..000000000
--- a/zuul/ansible/2.8/action/template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/unarchive.py b/zuul/ansible/2.8/action/unarchive.py
deleted file mode 120000
index 2d7ce5aed..000000000
--- a/zuul/ansible/2.8/action/unarchive.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/unarchive.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/unarchive.pyi b/zuul/ansible/2.8/action/unarchive.pyi
deleted file mode 120000
index fead9ca55..000000000
--- a/zuul/ansible/2.8/action/unarchive.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/unarchive.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/uri.py b/zuul/ansible/2.8/action/uri.py
deleted file mode 120000
index 7c4b15f45..000000000
--- a/zuul/ansible/2.8/action/uri.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/uri.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/uri.pyi b/zuul/ansible/2.8/action/uri.pyi
deleted file mode 120000
index 015bb9fe3..000000000
--- a/zuul/ansible/2.8/action/uri.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/uri.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/vyos_config.py b/zuul/ansible/2.8/action/vyos_config.py
deleted file mode 120000
index 2732fd7a1..000000000
--- a/zuul/ansible/2.8/action/vyos_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/vyos_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/vyos_config.pyi b/zuul/ansible/2.8/action/vyos_config.pyi
deleted file mode 120000
index ac5d76632..000000000
--- a/zuul/ansible/2.8/action/vyos_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/vyos_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/win_copy.py b/zuul/ansible/2.8/action/win_copy.py
deleted file mode 120000
index 80c3f3846..000000000
--- a/zuul/ansible/2.8/action/win_copy.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/win_copy.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/win_copy.pyi b/zuul/ansible/2.8/action/win_copy.pyi
deleted file mode 120000
index 017c792ff..000000000
--- a/zuul/ansible/2.8/action/win_copy.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/win_copy.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/win_template.py b/zuul/ansible/2.8/action/win_template.py
deleted file mode 120000
index f2a8b2d63..000000000
--- a/zuul/ansible/2.8/action/win_template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/win_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/win_template.pyi b/zuul/ansible/2.8/action/win_template.pyi
deleted file mode 120000
index 40825895b..000000000
--- a/zuul/ansible/2.8/action/win_template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/win_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/actiongeneral/__init__.py b/zuul/ansible/2.8/actiongeneral/__init__.py
deleted file mode 120000
index 38d887448..000000000
--- a/zuul/ansible/2.8/actiongeneral/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/actiongeneral/__init__.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/actiongeneral/zuul_return.py b/zuul/ansible/2.8/actiongeneral/zuul_return.py
deleted file mode 120000
index 2f5b2559e..000000000
--- a/zuul/ansible/2.8/actiongeneral/zuul_return.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/actiongeneral/zuul_return.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/actiontrusted/__init__.py b/zuul/ansible/2.8/actiontrusted/__init__.py
deleted file mode 120000
index e64650426..000000000
--- a/zuul/ansible/2.8/actiontrusted/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/actiontrusted/__init__.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/actiontrusted/command.py b/zuul/ansible/2.8/actiontrusted/command.py
deleted file mode 120000
index 0eb995eaa..000000000
--- a/zuul/ansible/2.8/actiontrusted/command.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/actiontrusted/command.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/actiontrusted/command.pyi b/zuul/ansible/2.8/actiontrusted/command.pyi
deleted file mode 120000
index 17d0db7f6..000000000
--- a/zuul/ansible/2.8/actiontrusted/command.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/actiontrusted/command.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/__init__.py b/zuul/ansible/2.8/lookup/__init__.py
deleted file mode 120000
index b008ecb3b..000000000
--- a/zuul/ansible/2.8/lookup/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/__init__.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/_banned.py b/zuul/ansible/2.8/lookup/_banned.py
deleted file mode 120000
index 2e127f4e7..000000000
--- a/zuul/ansible/2.8/lookup/_banned.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/_banned.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/_banned.pyi b/zuul/ansible/2.8/lookup/_banned.pyi
deleted file mode 120000
index d7909135d..000000000
--- a/zuul/ansible/2.8/lookup/_banned.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/_banned.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/chef_databag.py b/zuul/ansible/2.8/lookup/chef_databag.py
deleted file mode 120000
index d4efe7e85..000000000
--- a/zuul/ansible/2.8/lookup/chef_databag.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/chef_databag.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/chef_databag.pyi b/zuul/ansible/2.8/lookup/chef_databag.pyi
deleted file mode 120000
index c06fc3001..000000000
--- a/zuul/ansible/2.8/lookup/chef_databag.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/chef_databag.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/consul_kv.py b/zuul/ansible/2.8/lookup/consul_kv.py
deleted file mode 120000
index 66b6f7617..000000000
--- a/zuul/ansible/2.8/lookup/consul_kv.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/consul_kv.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/consul_kv.pyi b/zuul/ansible/2.8/lookup/consul_kv.pyi
deleted file mode 120000
index 33d848347..000000000
--- a/zuul/ansible/2.8/lookup/consul_kv.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/consul_kv.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/credstash.py b/zuul/ansible/2.8/lookup/credstash.py
deleted file mode 120000
index 2c343a27e..000000000
--- a/zuul/ansible/2.8/lookup/credstash.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/credstash.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/credstash.pyi b/zuul/ansible/2.8/lookup/credstash.pyi
deleted file mode 120000
index 071af9d1a..000000000
--- a/zuul/ansible/2.8/lookup/credstash.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/credstash.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/csvfile.py b/zuul/ansible/2.8/lookup/csvfile.py
deleted file mode 120000
index 981754791..000000000
--- a/zuul/ansible/2.8/lookup/csvfile.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/csvfile.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/csvfile.pyi b/zuul/ansible/2.8/lookup/csvfile.pyi
deleted file mode 120000
index 18ded3684..000000000
--- a/zuul/ansible/2.8/lookup/csvfile.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/csvfile.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/cyberarkpassword.py b/zuul/ansible/2.8/lookup/cyberarkpassword.py
deleted file mode 120000
index a573c0cf3..000000000
--- a/zuul/ansible/2.8/lookup/cyberarkpassword.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/cyberarkpassword.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/cyberarkpassword.pyi b/zuul/ansible/2.8/lookup/cyberarkpassword.pyi
deleted file mode 120000
index 01543847e..000000000
--- a/zuul/ansible/2.8/lookup/cyberarkpassword.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/cyberarkpassword.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/dig.py b/zuul/ansible/2.8/lookup/dig.py
deleted file mode 120000
index 92a628c4a..000000000
--- a/zuul/ansible/2.8/lookup/dig.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/dig.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/dig.pyi b/zuul/ansible/2.8/lookup/dig.pyi
deleted file mode 120000
index 7268b42c3..000000000
--- a/zuul/ansible/2.8/lookup/dig.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/dig.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/dnstxt.py b/zuul/ansible/2.8/lookup/dnstxt.py
deleted file mode 120000
index aa3e0f2d9..000000000
--- a/zuul/ansible/2.8/lookup/dnstxt.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/dnstxt.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/dnstxt.pyi b/zuul/ansible/2.8/lookup/dnstxt.pyi
deleted file mode 120000
index 1c221784c..000000000
--- a/zuul/ansible/2.8/lookup/dnstxt.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/dnstxt.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/env.py b/zuul/ansible/2.8/lookup/env.py
deleted file mode 120000
index 124393630..000000000
--- a/zuul/ansible/2.8/lookup/env.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/env.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/env.pyi b/zuul/ansible/2.8/lookup/env.pyi
deleted file mode 120000
index e0ecae07a..000000000
--- a/zuul/ansible/2.8/lookup/env.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/env.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/etcd.py b/zuul/ansible/2.8/lookup/etcd.py
deleted file mode 120000
index c42007aa6..000000000
--- a/zuul/ansible/2.8/lookup/etcd.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/etcd.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/etcd.pyi b/zuul/ansible/2.8/lookup/etcd.pyi
deleted file mode 120000
index a1d4e0458..000000000
--- a/zuul/ansible/2.8/lookup/etcd.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/etcd.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/file.py b/zuul/ansible/2.8/lookup/file.py
deleted file mode 120000
index d1c0692d7..000000000
--- a/zuul/ansible/2.8/lookup/file.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/file.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/file.pyi b/zuul/ansible/2.8/lookup/file.pyi
deleted file mode 120000
index 588dc50c6..000000000
--- a/zuul/ansible/2.8/lookup/file.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/file.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/fileglob.py b/zuul/ansible/2.8/lookup/fileglob.py
deleted file mode 120000
index 0249540ac..000000000
--- a/zuul/ansible/2.8/lookup/fileglob.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/fileglob.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/fileglob.pyi b/zuul/ansible/2.8/lookup/fileglob.pyi
deleted file mode 120000
index ffce6462b..000000000
--- a/zuul/ansible/2.8/lookup/fileglob.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/fileglob.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/filetree.py b/zuul/ansible/2.8/lookup/filetree.py
deleted file mode 120000
index 96cc789ac..000000000
--- a/zuul/ansible/2.8/lookup/filetree.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/filetree.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/filetree.pyi b/zuul/ansible/2.8/lookup/filetree.pyi
deleted file mode 120000
index ca38966f5..000000000
--- a/zuul/ansible/2.8/lookup/filetree.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/filetree.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/first_found.py b/zuul/ansible/2.8/lookup/first_found.py
deleted file mode 120000
index 0a01ced20..000000000
--- a/zuul/ansible/2.8/lookup/first_found.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/first_found.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/first_found.pyi b/zuul/ansible/2.8/lookup/first_found.pyi
deleted file mode 120000
index a3a92f250..000000000
--- a/zuul/ansible/2.8/lookup/first_found.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/first_found.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/hashi_vault.py b/zuul/ansible/2.8/lookup/hashi_vault.py
deleted file mode 120000
index 6fd3dda3e..000000000
--- a/zuul/ansible/2.8/lookup/hashi_vault.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/hashi_vault.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/hashi_vault.pyi b/zuul/ansible/2.8/lookup/hashi_vault.pyi
deleted file mode 120000
index f0b0ceb19..000000000
--- a/zuul/ansible/2.8/lookup/hashi_vault.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/hashi_vault.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/hiera.py b/zuul/ansible/2.8/lookup/hiera.py
deleted file mode 120000
index 01e1883e3..000000000
--- a/zuul/ansible/2.8/lookup/hiera.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/hiera.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/hiera.pyi b/zuul/ansible/2.8/lookup/hiera.pyi
deleted file mode 120000
index b7756855a..000000000
--- a/zuul/ansible/2.8/lookup/hiera.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/hiera.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/ini.py b/zuul/ansible/2.8/lookup/ini.py
deleted file mode 120000
index 6453943b9..000000000
--- a/zuul/ansible/2.8/lookup/ini.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/ini.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/ini.pyi b/zuul/ansible/2.8/lookup/ini.pyi
deleted file mode 120000
index b66fe999a..000000000
--- a/zuul/ansible/2.8/lookup/ini.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/ini.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/keyring.py b/zuul/ansible/2.8/lookup/keyring.py
deleted file mode 120000
index 864d62d6f..000000000
--- a/zuul/ansible/2.8/lookup/keyring.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/keyring.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/keyring.pyi b/zuul/ansible/2.8/lookup/keyring.pyi
deleted file mode 120000
index 9a0c24b55..000000000
--- a/zuul/ansible/2.8/lookup/keyring.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/keyring.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/lastpass.py b/zuul/ansible/2.8/lookup/lastpass.py
deleted file mode 120000
index a28abff20..000000000
--- a/zuul/ansible/2.8/lookup/lastpass.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/lastpass.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/lastpass.pyi b/zuul/ansible/2.8/lookup/lastpass.pyi
deleted file mode 120000
index dfd6e6b31..000000000
--- a/zuul/ansible/2.8/lookup/lastpass.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/lastpass.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/lines.py b/zuul/ansible/2.8/lookup/lines.py
deleted file mode 120000
index c2cae632b..000000000
--- a/zuul/ansible/2.8/lookup/lines.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/lines.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/lines.pyi b/zuul/ansible/2.8/lookup/lines.pyi
deleted file mode 120000
index 3ddc687f9..000000000
--- a/zuul/ansible/2.8/lookup/lines.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/lines.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/mongodb.py b/zuul/ansible/2.8/lookup/mongodb.py
deleted file mode 120000
index 737037fa1..000000000
--- a/zuul/ansible/2.8/lookup/mongodb.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/mongodb.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/mongodb.pyi b/zuul/ansible/2.8/lookup/mongodb.pyi
deleted file mode 120000
index 4c8f754ef..000000000
--- a/zuul/ansible/2.8/lookup/mongodb.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/mongodb.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/password.py b/zuul/ansible/2.8/lookup/password.py
deleted file mode 120000
index 478e6bee6..000000000
--- a/zuul/ansible/2.8/lookup/password.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/password.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/password.pyi b/zuul/ansible/2.8/lookup/password.pyi
deleted file mode 120000
index 370986cbc..000000000
--- a/zuul/ansible/2.8/lookup/password.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/password.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/passwordstore.py b/zuul/ansible/2.8/lookup/passwordstore.py
deleted file mode 120000
index af4c4aa92..000000000
--- a/zuul/ansible/2.8/lookup/passwordstore.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/passwordstore.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/passwordstore.pyi b/zuul/ansible/2.8/lookup/passwordstore.pyi
deleted file mode 120000
index 9ba9b718a..000000000
--- a/zuul/ansible/2.8/lookup/passwordstore.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/passwordstore.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/pipe.py b/zuul/ansible/2.8/lookup/pipe.py
deleted file mode 120000
index ea688c3a3..000000000
--- a/zuul/ansible/2.8/lookup/pipe.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/pipe.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/pipe.pyi b/zuul/ansible/2.8/lookup/pipe.pyi
deleted file mode 120000
index 01d6b935d..000000000
--- a/zuul/ansible/2.8/lookup/pipe.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/pipe.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/redis_kv.py b/zuul/ansible/2.8/lookup/redis_kv.py
deleted file mode 120000
index a711e2651..000000000
--- a/zuul/ansible/2.8/lookup/redis_kv.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/redis_kv.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/redis_kv.pyi b/zuul/ansible/2.8/lookup/redis_kv.pyi
deleted file mode 120000
index da9acca45..000000000
--- a/zuul/ansible/2.8/lookup/redis_kv.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/redis_kv.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/shelvefile.py b/zuul/ansible/2.8/lookup/shelvefile.py
deleted file mode 120000
index 2c76ec937..000000000
--- a/zuul/ansible/2.8/lookup/shelvefile.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/shelvefile.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/shelvefile.pyi b/zuul/ansible/2.8/lookup/shelvefile.pyi
deleted file mode 120000
index 827f4b076..000000000
--- a/zuul/ansible/2.8/lookup/shelvefile.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/shelvefile.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/template.py b/zuul/ansible/2.8/lookup/template.py
deleted file mode 120000
index ef6565ceb..000000000
--- a/zuul/ansible/2.8/lookup/template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/template.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/template.pyi b/zuul/ansible/2.8/lookup/template.pyi
deleted file mode 120000
index f03685d5c..000000000
--- a/zuul/ansible/2.8/lookup/template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/url.py b/zuul/ansible/2.8/lookup/url.py
deleted file mode 120000
index f936b748e..000000000
--- a/zuul/ansible/2.8/lookup/url.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/url.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/lookup/url.pyi b/zuul/ansible/2.8/lookup/url.pyi
deleted file mode 120000
index fc13f47c5..000000000
--- a/zuul/ansible/2.8/lookup/url.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/url.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/add_host.py b/zuul/ansible/2.9/action/add_host.py
deleted file mode 120000
index fdb7f466b..000000000
--- a/zuul/ansible/2.9/action/add_host.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/add_host.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/add_host.pyi b/zuul/ansible/2.9/action/add_host.pyi
deleted file mode 120000
index 9257939ce..000000000
--- a/zuul/ansible/2.9/action/add_host.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/add_host.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/aireos.py b/zuul/ansible/2.9/action/aireos.py
deleted file mode 120000
index f2459ab86..000000000
--- a/zuul/ansible/2.9/action/aireos.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/aireos.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/aireos.pyi b/zuul/ansible/2.9/action/aireos.pyi
deleted file mode 120000
index f58722a86..000000000
--- a/zuul/ansible/2.9/action/aireos.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/aireos.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/aireos_config.py b/zuul/ansible/2.9/action/aireos_config.py
deleted file mode 120000
index acc0dd85e..000000000
--- a/zuul/ansible/2.9/action/aireos_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/aireos_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/aireos_config.pyi b/zuul/ansible/2.9/action/aireos_config.pyi
deleted file mode 120000
index fc7b16cf6..000000000
--- a/zuul/ansible/2.9/action/aireos_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/aireos_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/aruba.py b/zuul/ansible/2.9/action/aruba.py
deleted file mode 120000
index 8784b92ed..000000000
--- a/zuul/ansible/2.9/action/aruba.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/aruba.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/aruba.pyi b/zuul/ansible/2.9/action/aruba.pyi
deleted file mode 120000
index 228b3ecfe..000000000
--- a/zuul/ansible/2.9/action/aruba.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/aruba.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/aruba_config.py b/zuul/ansible/2.9/action/aruba_config.py
deleted file mode 120000
index f50d9082b..000000000
--- a/zuul/ansible/2.9/action/aruba_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/aruba_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/aruba_config.pyi b/zuul/ansible/2.9/action/aruba_config.pyi
deleted file mode 120000
index bab9d28fd..000000000
--- a/zuul/ansible/2.9/action/aruba_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/aruba_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/asa.py b/zuul/ansible/2.9/action/asa.py
deleted file mode 120000
index 3e7e93dc0..000000000
--- a/zuul/ansible/2.9/action/asa.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/asa.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/asa.pyi b/zuul/ansible/2.9/action/asa.pyi
deleted file mode 120000
index e0cdc24b5..000000000
--- a/zuul/ansible/2.9/action/asa.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/asa.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/asa_config.py b/zuul/ansible/2.9/action/asa_config.py
deleted file mode 120000
index 598f400d5..000000000
--- a/zuul/ansible/2.9/action/asa_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/asa_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/asa_config.pyi b/zuul/ansible/2.9/action/asa_config.pyi
deleted file mode 120000
index 86fe03484..000000000
--- a/zuul/ansible/2.9/action/asa_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/asa_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/asa_template.py b/zuul/ansible/2.9/action/asa_template.py
deleted file mode 120000
index e1e8eecbe..000000000
--- a/zuul/ansible/2.9/action/asa_template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/asa_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/asa_template.pyi b/zuul/ansible/2.9/action/asa_template.pyi
deleted file mode 120000
index 0753101f1..000000000
--- a/zuul/ansible/2.9/action/asa_template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/asa_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/assemble.py b/zuul/ansible/2.9/action/assemble.py
deleted file mode 120000
index 22273b123..000000000
--- a/zuul/ansible/2.9/action/assemble.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/assemble.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/assemble.pyi b/zuul/ansible/2.9/action/assemble.pyi
deleted file mode 120000
index 3a7074ec7..000000000
--- a/zuul/ansible/2.9/action/assemble.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/assemble.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/aws_s3.py b/zuul/ansible/2.9/action/aws_s3.py
deleted file mode 120000
index a2dabf9f8..000000000
--- a/zuul/ansible/2.9/action/aws_s3.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/aws_s3.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/aws_s3.pyi b/zuul/ansible/2.9/action/aws_s3.pyi
deleted file mode 120000
index 5ac40a7db..000000000
--- a/zuul/ansible/2.9/action/aws_s3.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/aws_s3.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/ce.py b/zuul/ansible/2.9/action/ce.py
deleted file mode 120000
index db95d9121..000000000
--- a/zuul/ansible/2.9/action/ce.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ce.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/ce.pyi b/zuul/ansible/2.9/action/ce.pyi
deleted file mode 120000
index ba2365f2b..000000000
--- a/zuul/ansible/2.9/action/ce.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ce.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/ce_config.py b/zuul/ansible/2.9/action/ce_config.py
deleted file mode 120000
index ec0319843..000000000
--- a/zuul/ansible/2.9/action/ce_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ce_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/ce_config.pyi b/zuul/ansible/2.9/action/ce_config.pyi
deleted file mode 120000
index b762785d1..000000000
--- a/zuul/ansible/2.9/action/ce_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ce_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/ce_template.py b/zuul/ansible/2.9/action/ce_template.py
deleted file mode 120000
index aa59e80a0..000000000
--- a/zuul/ansible/2.9/action/ce_template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ce_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/ce_template.pyi b/zuul/ansible/2.9/action/ce_template.pyi
deleted file mode 120000
index 75ba2250c..000000000
--- a/zuul/ansible/2.9/action/ce_template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ce_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/command.py b/zuul/ansible/2.9/action/command.py
deleted file mode 120000
index 56c6b636f..000000000
--- a/zuul/ansible/2.9/action/command.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/command.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/command.pyi b/zuul/ansible/2.9/action/command.pyi
deleted file mode 120000
index a003281ca..000000000
--- a/zuul/ansible/2.9/action/command.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/command.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/copy.py b/zuul/ansible/2.9/action/copy.py
deleted file mode 120000
index 1c0c2291f..000000000
--- a/zuul/ansible/2.9/action/copy.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/copy.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/copy.pyi b/zuul/ansible/2.9/action/copy.pyi
deleted file mode 120000
index 189722f2a..000000000
--- a/zuul/ansible/2.9/action/copy.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/copy.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/dellos10_config.py b/zuul/ansible/2.9/action/dellos10_config.py
deleted file mode 120000
index caf6ce6c3..000000000
--- a/zuul/ansible/2.9/action/dellos10_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/dellos10_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/dellos10_config.pyi b/zuul/ansible/2.9/action/dellos10_config.pyi
deleted file mode 120000
index ede9a927e..000000000
--- a/zuul/ansible/2.9/action/dellos10_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/dellos10_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/dellos6_config.py b/zuul/ansible/2.9/action/dellos6_config.py
deleted file mode 120000
index 080fcce4c..000000000
--- a/zuul/ansible/2.9/action/dellos6_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/dellos6_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/dellos6_config.pyi b/zuul/ansible/2.9/action/dellos6_config.pyi
deleted file mode 120000
index d5cf3ce15..000000000
--- a/zuul/ansible/2.9/action/dellos6_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/dellos6_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/dellos9_config.py b/zuul/ansible/2.9/action/dellos9_config.py
deleted file mode 120000
index c2e79870c..000000000
--- a/zuul/ansible/2.9/action/dellos9_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/dellos9_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/dellos9_config.pyi b/zuul/ansible/2.9/action/dellos9_config.pyi
deleted file mode 120000
index b50389ab4..000000000
--- a/zuul/ansible/2.9/action/dellos9_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/dellos9_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/eos_config.py b/zuul/ansible/2.9/action/eos_config.py
deleted file mode 120000
index 4d1ab53bb..000000000
--- a/zuul/ansible/2.9/action/eos_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/eos_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/eos_config.pyi b/zuul/ansible/2.9/action/eos_config.pyi
deleted file mode 120000
index f6d058ba1..000000000
--- a/zuul/ansible/2.9/action/eos_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/eos_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/eos_template.py b/zuul/ansible/2.9/action/eos_template.py
deleted file mode 120000
index a108bf66f..000000000
--- a/zuul/ansible/2.9/action/eos_template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/eos_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/eos_template.pyi b/zuul/ansible/2.9/action/eos_template.pyi
deleted file mode 120000
index b9cac42e8..000000000
--- a/zuul/ansible/2.9/action/eos_template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/eos_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/fetch.py b/zuul/ansible/2.9/action/fetch.py
deleted file mode 120000
index d53e02548..000000000
--- a/zuul/ansible/2.9/action/fetch.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/fetch.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/fetch.pyi b/zuul/ansible/2.9/action/fetch.pyi
deleted file mode 120000
index b3ae31523..000000000
--- a/zuul/ansible/2.9/action/fetch.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/fetch.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/fortios_config.py b/zuul/ansible/2.9/action/fortios_config.py
deleted file mode 120000
index ef38743bc..000000000
--- a/zuul/ansible/2.9/action/fortios_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/fortios_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/fortios_config.pyi b/zuul/ansible/2.9/action/fortios_config.pyi
deleted file mode 120000
index fa334a059..000000000
--- a/zuul/ansible/2.9/action/fortios_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/fortios_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/include_vars.py b/zuul/ansible/2.9/action/include_vars.py
deleted file mode 120000
index 832d5a27a..000000000
--- a/zuul/ansible/2.9/action/include_vars.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/include_vars.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/include_vars.pyi b/zuul/ansible/2.9/action/include_vars.pyi
deleted file mode 120000
index 4099c1ae6..000000000
--- a/zuul/ansible/2.9/action/include_vars.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/include_vars.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/ios_config.py b/zuul/ansible/2.9/action/ios_config.py
deleted file mode 120000
index f1495d47e..000000000
--- a/zuul/ansible/2.9/action/ios_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ios_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/ios_config.pyi b/zuul/ansible/2.9/action/ios_config.pyi
deleted file mode 120000
index e6af5e34c..000000000
--- a/zuul/ansible/2.9/action/ios_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ios_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/ios_template.py b/zuul/ansible/2.9/action/ios_template.py
deleted file mode 120000
index ef863cedf..000000000
--- a/zuul/ansible/2.9/action/ios_template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ios_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/ios_template.pyi b/zuul/ansible/2.9/action/ios_template.pyi
deleted file mode 120000
index c37247812..000000000
--- a/zuul/ansible/2.9/action/ios_template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ios_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/iosxr_config.py b/zuul/ansible/2.9/action/iosxr_config.py
deleted file mode 120000
index 4eb293626..000000000
--- a/zuul/ansible/2.9/action/iosxr_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/iosxr_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/iosxr_config.pyi b/zuul/ansible/2.9/action/iosxr_config.pyi
deleted file mode 120000
index 70a2d67a3..000000000
--- a/zuul/ansible/2.9/action/iosxr_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/iosxr_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/iosxr_template.py b/zuul/ansible/2.9/action/iosxr_template.py
deleted file mode 120000
index 6a60fa49e..000000000
--- a/zuul/ansible/2.9/action/iosxr_template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/iosxr_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/iosxr_template.pyi b/zuul/ansible/2.9/action/iosxr_template.pyi
deleted file mode 120000
index 918f5a113..000000000
--- a/zuul/ansible/2.9/action/iosxr_template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/iosxr_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/junos_config.py b/zuul/ansible/2.9/action/junos_config.py
deleted file mode 120000
index c50f3bc67..000000000
--- a/zuul/ansible/2.9/action/junos_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/junos_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/junos_config.pyi b/zuul/ansible/2.9/action/junos_config.pyi
deleted file mode 120000
index 31cbba451..000000000
--- a/zuul/ansible/2.9/action/junos_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/junos_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/junos_template.py b/zuul/ansible/2.9/action/junos_template.py
deleted file mode 120000
index a2119b7cd..000000000
--- a/zuul/ansible/2.9/action/junos_template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/junos_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/junos_template.pyi b/zuul/ansible/2.9/action/junos_template.pyi
deleted file mode 120000
index e6ef22ba9..000000000
--- a/zuul/ansible/2.9/action/junos_template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/junos_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_banner.py b/zuul/ansible/2.9/action/net_banner.py
deleted file mode 120000
index 69cc6d5a4..000000000
--- a/zuul/ansible/2.9/action/net_banner.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_banner.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_banner.pyi b/zuul/ansible/2.9/action/net_banner.pyi
deleted file mode 120000
index f926dbf70..000000000
--- a/zuul/ansible/2.9/action/net_banner.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_banner.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_base.py b/zuul/ansible/2.9/action/net_base.py
deleted file mode 120000
index f36b6ecc7..000000000
--- a/zuul/ansible/2.9/action/net_base.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_base.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_base.pyi b/zuul/ansible/2.9/action/net_base.pyi
deleted file mode 120000
index 9f6ce1b7d..000000000
--- a/zuul/ansible/2.9/action/net_base.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_base.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_config.py b/zuul/ansible/2.9/action/net_config.py
deleted file mode 120000
index a817ca518..000000000
--- a/zuul/ansible/2.9/action/net_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_config.pyi b/zuul/ansible/2.9/action/net_config.pyi
deleted file mode 120000
index 412b8110e..000000000
--- a/zuul/ansible/2.9/action/net_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_get.py b/zuul/ansible/2.9/action/net_get.py
deleted file mode 120000
index da3d7be0e..000000000
--- a/zuul/ansible/2.9/action/net_get.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_get.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_get.pyi b/zuul/ansible/2.9/action/net_get.pyi
deleted file mode 120000
index 015c4271b..000000000
--- a/zuul/ansible/2.9/action/net_get.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_get.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_interface.py b/zuul/ansible/2.9/action/net_interface.py
deleted file mode 120000
index 1d24f7821..000000000
--- a/zuul/ansible/2.9/action/net_interface.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_interface.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_interface.pyi b/zuul/ansible/2.9/action/net_interface.pyi
deleted file mode 120000
index 57bb45316..000000000
--- a/zuul/ansible/2.9/action/net_interface.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_interface.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_l2_interface.py b/zuul/ansible/2.9/action/net_l2_interface.py
deleted file mode 120000
index 1f44192c8..000000000
--- a/zuul/ansible/2.9/action/net_l2_interface.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_l2_interface.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_l2_interface.pyi b/zuul/ansible/2.9/action/net_l2_interface.pyi
deleted file mode 120000
index 2b780821d..000000000
--- a/zuul/ansible/2.9/action/net_l2_interface.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_l2_interface.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_l3_interface.py b/zuul/ansible/2.9/action/net_l3_interface.py
deleted file mode 120000
index 97017f4e3..000000000
--- a/zuul/ansible/2.9/action/net_l3_interface.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_l3_interface.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_l3_interface.pyi b/zuul/ansible/2.9/action/net_l3_interface.pyi
deleted file mode 120000
index 9317599a2..000000000
--- a/zuul/ansible/2.9/action/net_l3_interface.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_l3_interface.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_linkagg.py b/zuul/ansible/2.9/action/net_linkagg.py
deleted file mode 120000
index d3fc53dd1..000000000
--- a/zuul/ansible/2.9/action/net_linkagg.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_linkagg.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_linkagg.pyi b/zuul/ansible/2.9/action/net_linkagg.pyi
deleted file mode 120000
index b5fac56b6..000000000
--- a/zuul/ansible/2.9/action/net_linkagg.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_linkagg.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_lldp.py b/zuul/ansible/2.9/action/net_lldp.py
deleted file mode 120000
index 15fc3a859..000000000
--- a/zuul/ansible/2.9/action/net_lldp.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_lldp.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_lldp.pyi b/zuul/ansible/2.9/action/net_lldp.pyi
deleted file mode 120000
index a627fdec7..000000000
--- a/zuul/ansible/2.9/action/net_lldp.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_lldp.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_lldp_interface.py b/zuul/ansible/2.9/action/net_lldp_interface.py
deleted file mode 120000
index f57ec137f..000000000
--- a/zuul/ansible/2.9/action/net_lldp_interface.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_lldp_interface.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_lldp_interface.pyi b/zuul/ansible/2.9/action/net_lldp_interface.pyi
deleted file mode 120000
index fdd97b078..000000000
--- a/zuul/ansible/2.9/action/net_lldp_interface.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_lldp_interface.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_logging.py b/zuul/ansible/2.9/action/net_logging.py
deleted file mode 120000
index 57d9766aa..000000000
--- a/zuul/ansible/2.9/action/net_logging.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_logging.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_logging.pyi b/zuul/ansible/2.9/action/net_logging.pyi
deleted file mode 120000
index 1d6f1b029..000000000
--- a/zuul/ansible/2.9/action/net_logging.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_logging.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_ping.py b/zuul/ansible/2.9/action/net_ping.py
deleted file mode 120000
index 696d9f526..000000000
--- a/zuul/ansible/2.9/action/net_ping.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_ping.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_ping.pyi b/zuul/ansible/2.9/action/net_ping.pyi
deleted file mode 120000
index 03f84e975..000000000
--- a/zuul/ansible/2.9/action/net_ping.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_ping.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_static_route.py b/zuul/ansible/2.9/action/net_static_route.py
deleted file mode 120000
index c22b7f0e0..000000000
--- a/zuul/ansible/2.9/action/net_static_route.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_static_route.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_static_route.pyi b/zuul/ansible/2.9/action/net_static_route.pyi
deleted file mode 120000
index 859c20fec..000000000
--- a/zuul/ansible/2.9/action/net_static_route.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_static_route.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_system.py b/zuul/ansible/2.9/action/net_system.py
deleted file mode 120000
index a03dd93c9..000000000
--- a/zuul/ansible/2.9/action/net_system.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_system.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_system.pyi b/zuul/ansible/2.9/action/net_system.pyi
deleted file mode 120000
index cc159053b..000000000
--- a/zuul/ansible/2.9/action/net_system.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_system.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_template.py b/zuul/ansible/2.9/action/net_template.py
deleted file mode 120000
index 18ba965e4..000000000
--- a/zuul/ansible/2.9/action/net_template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_template.pyi b/zuul/ansible/2.9/action/net_template.pyi
deleted file mode 120000
index 3bfbb6f0f..000000000
--- a/zuul/ansible/2.9/action/net_template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_user.py b/zuul/ansible/2.9/action/net_user.py
deleted file mode 120000
index fcfb3f55a..000000000
--- a/zuul/ansible/2.9/action/net_user.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_user.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_user.pyi b/zuul/ansible/2.9/action/net_user.pyi
deleted file mode 120000
index 267f5da34..000000000
--- a/zuul/ansible/2.9/action/net_user.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_user.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_vlan.py b/zuul/ansible/2.9/action/net_vlan.py
deleted file mode 120000
index df275656f..000000000
--- a/zuul/ansible/2.9/action/net_vlan.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_vlan.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_vlan.pyi b/zuul/ansible/2.9/action/net_vlan.pyi
deleted file mode 120000
index 718074899..000000000
--- a/zuul/ansible/2.9/action/net_vlan.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_vlan.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_vrf.py b/zuul/ansible/2.9/action/net_vrf.py
deleted file mode 120000
index c757d2100..000000000
--- a/zuul/ansible/2.9/action/net_vrf.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_vrf.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/net_vrf.pyi b/zuul/ansible/2.9/action/net_vrf.pyi
deleted file mode 120000
index df043a0cd..000000000
--- a/zuul/ansible/2.9/action/net_vrf.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/net_vrf.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/netconf_config.py b/zuul/ansible/2.9/action/netconf_config.py
deleted file mode 120000
index 4d13bb82c..000000000
--- a/zuul/ansible/2.9/action/netconf_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/netconf_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/netconf_config.pyi b/zuul/ansible/2.9/action/netconf_config.pyi
deleted file mode 120000
index c75a746b4..000000000
--- a/zuul/ansible/2.9/action/netconf_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/netconf_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/network.py b/zuul/ansible/2.9/action/network.py
deleted file mode 120000
index 9e2d1baa4..000000000
--- a/zuul/ansible/2.9/action/network.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/network.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/network.pyi b/zuul/ansible/2.9/action/network.pyi
deleted file mode 120000
index e1842d197..000000000
--- a/zuul/ansible/2.9/action/network.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/network.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/normal.py b/zuul/ansible/2.9/action/normal.py
deleted file mode 120000
index 4e131d98d..000000000
--- a/zuul/ansible/2.9/action/normal.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/normal.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/normal.pyi b/zuul/ansible/2.9/action/normal.pyi
deleted file mode 120000
index bbbe0704c..000000000
--- a/zuul/ansible/2.9/action/normal.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/normal.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/nxos_config.py b/zuul/ansible/2.9/action/nxos_config.py
deleted file mode 120000
index 0cc233c34..000000000
--- a/zuul/ansible/2.9/action/nxos_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/nxos_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/nxos_config.pyi b/zuul/ansible/2.9/action/nxos_config.pyi
deleted file mode 120000
index b2e63b6e3..000000000
--- a/zuul/ansible/2.9/action/nxos_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/nxos_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/nxos_template.py b/zuul/ansible/2.9/action/nxos_template.py
deleted file mode 120000
index 3d599062a..000000000
--- a/zuul/ansible/2.9/action/nxos_template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/nxos_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/nxos_template.pyi b/zuul/ansible/2.9/action/nxos_template.pyi
deleted file mode 120000
index e36fa4e90..000000000
--- a/zuul/ansible/2.9/action/nxos_template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/nxos_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/ops_config.py b/zuul/ansible/2.9/action/ops_config.py
deleted file mode 120000
index 2abe0669d..000000000
--- a/zuul/ansible/2.9/action/ops_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ops_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/ops_config.pyi b/zuul/ansible/2.9/action/ops_config.pyi
deleted file mode 120000
index 7517f9c7b..000000000
--- a/zuul/ansible/2.9/action/ops_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ops_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/ops_template.py b/zuul/ansible/2.9/action/ops_template.py
deleted file mode 120000
index 5c841ca57..000000000
--- a/zuul/ansible/2.9/action/ops_template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ops_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/ops_template.pyi b/zuul/ansible/2.9/action/ops_template.pyi
deleted file mode 120000
index 4baa28a3f..000000000
--- a/zuul/ansible/2.9/action/ops_template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/ops_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/patch.py b/zuul/ansible/2.9/action/patch.py
deleted file mode 120000
index 8996710ba..000000000
--- a/zuul/ansible/2.9/action/patch.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/patch.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/patch.pyi b/zuul/ansible/2.9/action/patch.pyi
deleted file mode 120000
index 577e43600..000000000
--- a/zuul/ansible/2.9/action/patch.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/patch.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/raw.py b/zuul/ansible/2.9/action/raw.py
deleted file mode 120000
index e4962dd8a..000000000
--- a/zuul/ansible/2.9/action/raw.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/raw.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/raw.pyi b/zuul/ansible/2.9/action/raw.pyi
deleted file mode 120000
index 741945ef2..000000000
--- a/zuul/ansible/2.9/action/raw.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/raw.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/script.py b/zuul/ansible/2.9/action/script.py
deleted file mode 120000
index 1cccf5805..000000000
--- a/zuul/ansible/2.9/action/script.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/script.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/script.pyi b/zuul/ansible/2.9/action/script.pyi
deleted file mode 120000
index aff69744b..000000000
--- a/zuul/ansible/2.9/action/script.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/script.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/sros_config.py b/zuul/ansible/2.9/action/sros_config.py
deleted file mode 120000
index 1762874e4..000000000
--- a/zuul/ansible/2.9/action/sros_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/sros_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/sros_config.pyi b/zuul/ansible/2.9/action/sros_config.pyi
deleted file mode 120000
index 453e4b8e1..000000000
--- a/zuul/ansible/2.9/action/sros_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/sros_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/synchronize.py b/zuul/ansible/2.9/action/synchronize.py
deleted file mode 120000
index f2126166c..000000000
--- a/zuul/ansible/2.9/action/synchronize.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/synchronize.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/synchronize.pyi b/zuul/ansible/2.9/action/synchronize.pyi
deleted file mode 120000
index 4ff1a2ee9..000000000
--- a/zuul/ansible/2.9/action/synchronize.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/synchronize.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/template.py b/zuul/ansible/2.9/action/template.py
deleted file mode 120000
index 720717d83..000000000
--- a/zuul/ansible/2.9/action/template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/template.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/template.pyi b/zuul/ansible/2.9/action/template.pyi
deleted file mode 120000
index aed7fb07a..000000000
--- a/zuul/ansible/2.9/action/template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/unarchive.py b/zuul/ansible/2.9/action/unarchive.py
deleted file mode 120000
index 2d7ce5aed..000000000
--- a/zuul/ansible/2.9/action/unarchive.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/unarchive.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/unarchive.pyi b/zuul/ansible/2.9/action/unarchive.pyi
deleted file mode 120000
index fead9ca55..000000000
--- a/zuul/ansible/2.9/action/unarchive.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/unarchive.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/uri.py b/zuul/ansible/2.9/action/uri.py
deleted file mode 120000
index 7c4b15f45..000000000
--- a/zuul/ansible/2.9/action/uri.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/uri.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/uri.pyi b/zuul/ansible/2.9/action/uri.pyi
deleted file mode 120000
index 015bb9fe3..000000000
--- a/zuul/ansible/2.9/action/uri.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/uri.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/vyos_config.py b/zuul/ansible/2.9/action/vyos_config.py
deleted file mode 120000
index 2732fd7a1..000000000
--- a/zuul/ansible/2.9/action/vyos_config.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/vyos_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/vyos_config.pyi b/zuul/ansible/2.9/action/vyos_config.pyi
deleted file mode 120000
index ac5d76632..000000000
--- a/zuul/ansible/2.9/action/vyos_config.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/vyos_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/win_copy.py b/zuul/ansible/2.9/action/win_copy.py
deleted file mode 120000
index 80c3f3846..000000000
--- a/zuul/ansible/2.9/action/win_copy.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/win_copy.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/win_copy.pyi b/zuul/ansible/2.9/action/win_copy.pyi
deleted file mode 120000
index 017c792ff..000000000
--- a/zuul/ansible/2.9/action/win_copy.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/win_copy.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/win_template.py b/zuul/ansible/2.9/action/win_template.py
deleted file mode 120000
index f2a8b2d63..000000000
--- a/zuul/ansible/2.9/action/win_template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/win_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/action/win_template.pyi b/zuul/ansible/2.9/action/win_template.pyi
deleted file mode 120000
index 40825895b..000000000
--- a/zuul/ansible/2.9/action/win_template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/action/win_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/actiongeneral/__init__.py b/zuul/ansible/2.9/actiongeneral/__init__.py
deleted file mode 120000
index 38d887448..000000000
--- a/zuul/ansible/2.9/actiongeneral/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/actiongeneral/__init__.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/actiongeneral/zuul_return.py b/zuul/ansible/2.9/actiongeneral/zuul_return.py
deleted file mode 120000
index 2f5b2559e..000000000
--- a/zuul/ansible/2.9/actiongeneral/zuul_return.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/actiongeneral/zuul_return.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/actiontrusted/__init__.py b/zuul/ansible/2.9/actiontrusted/__init__.py
deleted file mode 120000
index e64650426..000000000
--- a/zuul/ansible/2.9/actiontrusted/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/actiontrusted/__init__.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/actiontrusted/command.py b/zuul/ansible/2.9/actiontrusted/command.py
deleted file mode 120000
index 0eb995eaa..000000000
--- a/zuul/ansible/2.9/actiontrusted/command.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/actiontrusted/command.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/actiontrusted/command.pyi b/zuul/ansible/2.9/actiontrusted/command.pyi
deleted file mode 120000
index 17d0db7f6..000000000
--- a/zuul/ansible/2.9/actiontrusted/command.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/actiontrusted/command.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/__init__.py b/zuul/ansible/2.9/lookup/__init__.py
deleted file mode 120000
index b008ecb3b..000000000
--- a/zuul/ansible/2.9/lookup/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/__init__.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/_banned.py b/zuul/ansible/2.9/lookup/_banned.py
deleted file mode 120000
index 2e127f4e7..000000000
--- a/zuul/ansible/2.9/lookup/_banned.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/_banned.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/_banned.pyi b/zuul/ansible/2.9/lookup/_banned.pyi
deleted file mode 120000
index d7909135d..000000000
--- a/zuul/ansible/2.9/lookup/_banned.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/_banned.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/chef_databag.py b/zuul/ansible/2.9/lookup/chef_databag.py
deleted file mode 120000
index d4efe7e85..000000000
--- a/zuul/ansible/2.9/lookup/chef_databag.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/chef_databag.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/chef_databag.pyi b/zuul/ansible/2.9/lookup/chef_databag.pyi
deleted file mode 120000
index c06fc3001..000000000
--- a/zuul/ansible/2.9/lookup/chef_databag.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/chef_databag.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/consul_kv.py b/zuul/ansible/2.9/lookup/consul_kv.py
deleted file mode 120000
index 66b6f7617..000000000
--- a/zuul/ansible/2.9/lookup/consul_kv.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/consul_kv.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/consul_kv.pyi b/zuul/ansible/2.9/lookup/consul_kv.pyi
deleted file mode 120000
index 33d848347..000000000
--- a/zuul/ansible/2.9/lookup/consul_kv.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/consul_kv.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/credstash.py b/zuul/ansible/2.9/lookup/credstash.py
deleted file mode 120000
index 2c343a27e..000000000
--- a/zuul/ansible/2.9/lookup/credstash.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/credstash.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/credstash.pyi b/zuul/ansible/2.9/lookup/credstash.pyi
deleted file mode 120000
index 071af9d1a..000000000
--- a/zuul/ansible/2.9/lookup/credstash.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/credstash.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/csvfile.py b/zuul/ansible/2.9/lookup/csvfile.py
deleted file mode 120000
index 981754791..000000000
--- a/zuul/ansible/2.9/lookup/csvfile.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/csvfile.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/csvfile.pyi b/zuul/ansible/2.9/lookup/csvfile.pyi
deleted file mode 120000
index 18ded3684..000000000
--- a/zuul/ansible/2.9/lookup/csvfile.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/csvfile.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/cyberarkpassword.py b/zuul/ansible/2.9/lookup/cyberarkpassword.py
deleted file mode 120000
index a573c0cf3..000000000
--- a/zuul/ansible/2.9/lookup/cyberarkpassword.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/cyberarkpassword.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/cyberarkpassword.pyi b/zuul/ansible/2.9/lookup/cyberarkpassword.pyi
deleted file mode 120000
index 01543847e..000000000
--- a/zuul/ansible/2.9/lookup/cyberarkpassword.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/cyberarkpassword.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/dig.py b/zuul/ansible/2.9/lookup/dig.py
deleted file mode 120000
index 92a628c4a..000000000
--- a/zuul/ansible/2.9/lookup/dig.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/dig.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/dig.pyi b/zuul/ansible/2.9/lookup/dig.pyi
deleted file mode 120000
index 7268b42c3..000000000
--- a/zuul/ansible/2.9/lookup/dig.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/dig.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/dnstxt.py b/zuul/ansible/2.9/lookup/dnstxt.py
deleted file mode 120000
index aa3e0f2d9..000000000
--- a/zuul/ansible/2.9/lookup/dnstxt.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/dnstxt.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/dnstxt.pyi b/zuul/ansible/2.9/lookup/dnstxt.pyi
deleted file mode 120000
index 1c221784c..000000000
--- a/zuul/ansible/2.9/lookup/dnstxt.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/dnstxt.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/env.py b/zuul/ansible/2.9/lookup/env.py
deleted file mode 120000
index 124393630..000000000
--- a/zuul/ansible/2.9/lookup/env.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/env.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/env.pyi b/zuul/ansible/2.9/lookup/env.pyi
deleted file mode 120000
index e0ecae07a..000000000
--- a/zuul/ansible/2.9/lookup/env.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/env.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/etcd.py b/zuul/ansible/2.9/lookup/etcd.py
deleted file mode 120000
index c42007aa6..000000000
--- a/zuul/ansible/2.9/lookup/etcd.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/etcd.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/etcd.pyi b/zuul/ansible/2.9/lookup/etcd.pyi
deleted file mode 120000
index a1d4e0458..000000000
--- a/zuul/ansible/2.9/lookup/etcd.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/etcd.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/file.py b/zuul/ansible/2.9/lookup/file.py
deleted file mode 120000
index d1c0692d7..000000000
--- a/zuul/ansible/2.9/lookup/file.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/file.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/file.pyi b/zuul/ansible/2.9/lookup/file.pyi
deleted file mode 120000
index 588dc50c6..000000000
--- a/zuul/ansible/2.9/lookup/file.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/file.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/fileglob.py b/zuul/ansible/2.9/lookup/fileglob.py
deleted file mode 120000
index 0249540ac..000000000
--- a/zuul/ansible/2.9/lookup/fileglob.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/fileglob.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/fileglob.pyi b/zuul/ansible/2.9/lookup/fileglob.pyi
deleted file mode 120000
index ffce6462b..000000000
--- a/zuul/ansible/2.9/lookup/fileglob.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/fileglob.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/filetree.py b/zuul/ansible/2.9/lookup/filetree.py
deleted file mode 120000
index 96cc789ac..000000000
--- a/zuul/ansible/2.9/lookup/filetree.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/filetree.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/filetree.pyi b/zuul/ansible/2.9/lookup/filetree.pyi
deleted file mode 120000
index ca38966f5..000000000
--- a/zuul/ansible/2.9/lookup/filetree.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/filetree.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/first_found.py b/zuul/ansible/2.9/lookup/first_found.py
deleted file mode 120000
index 0a01ced20..000000000
--- a/zuul/ansible/2.9/lookup/first_found.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/first_found.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/first_found.pyi b/zuul/ansible/2.9/lookup/first_found.pyi
deleted file mode 120000
index a3a92f250..000000000
--- a/zuul/ansible/2.9/lookup/first_found.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/first_found.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/hashi_vault.py b/zuul/ansible/2.9/lookup/hashi_vault.py
deleted file mode 120000
index 6fd3dda3e..000000000
--- a/zuul/ansible/2.9/lookup/hashi_vault.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/hashi_vault.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/hashi_vault.pyi b/zuul/ansible/2.9/lookup/hashi_vault.pyi
deleted file mode 120000
index f0b0ceb19..000000000
--- a/zuul/ansible/2.9/lookup/hashi_vault.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/hashi_vault.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/hiera.py b/zuul/ansible/2.9/lookup/hiera.py
deleted file mode 120000
index 01e1883e3..000000000
--- a/zuul/ansible/2.9/lookup/hiera.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/hiera.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/hiera.pyi b/zuul/ansible/2.9/lookup/hiera.pyi
deleted file mode 120000
index b7756855a..000000000
--- a/zuul/ansible/2.9/lookup/hiera.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/hiera.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/ini.py b/zuul/ansible/2.9/lookup/ini.py
deleted file mode 120000
index 6453943b9..000000000
--- a/zuul/ansible/2.9/lookup/ini.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/ini.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/ini.pyi b/zuul/ansible/2.9/lookup/ini.pyi
deleted file mode 120000
index b66fe999a..000000000
--- a/zuul/ansible/2.9/lookup/ini.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/ini.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/keyring.py b/zuul/ansible/2.9/lookup/keyring.py
deleted file mode 120000
index 864d62d6f..000000000
--- a/zuul/ansible/2.9/lookup/keyring.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/keyring.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/keyring.pyi b/zuul/ansible/2.9/lookup/keyring.pyi
deleted file mode 120000
index 9a0c24b55..000000000
--- a/zuul/ansible/2.9/lookup/keyring.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/keyring.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/lastpass.py b/zuul/ansible/2.9/lookup/lastpass.py
deleted file mode 120000
index a28abff20..000000000
--- a/zuul/ansible/2.9/lookup/lastpass.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/lastpass.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/lastpass.pyi b/zuul/ansible/2.9/lookup/lastpass.pyi
deleted file mode 120000
index dfd6e6b31..000000000
--- a/zuul/ansible/2.9/lookup/lastpass.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/lastpass.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/lines.py b/zuul/ansible/2.9/lookup/lines.py
deleted file mode 120000
index c2cae632b..000000000
--- a/zuul/ansible/2.9/lookup/lines.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/lines.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/lines.pyi b/zuul/ansible/2.9/lookup/lines.pyi
deleted file mode 120000
index 3ddc687f9..000000000
--- a/zuul/ansible/2.9/lookup/lines.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/lines.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/mongodb.py b/zuul/ansible/2.9/lookup/mongodb.py
deleted file mode 120000
index 737037fa1..000000000
--- a/zuul/ansible/2.9/lookup/mongodb.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/mongodb.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/mongodb.pyi b/zuul/ansible/2.9/lookup/mongodb.pyi
deleted file mode 120000
index 4c8f754ef..000000000
--- a/zuul/ansible/2.9/lookup/mongodb.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/mongodb.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/password.py b/zuul/ansible/2.9/lookup/password.py
deleted file mode 120000
index 478e6bee6..000000000
--- a/zuul/ansible/2.9/lookup/password.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/password.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/password.pyi b/zuul/ansible/2.9/lookup/password.pyi
deleted file mode 120000
index 370986cbc..000000000
--- a/zuul/ansible/2.9/lookup/password.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/password.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/passwordstore.py b/zuul/ansible/2.9/lookup/passwordstore.py
deleted file mode 120000
index af4c4aa92..000000000
--- a/zuul/ansible/2.9/lookup/passwordstore.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/passwordstore.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/passwordstore.pyi b/zuul/ansible/2.9/lookup/passwordstore.pyi
deleted file mode 120000
index 9ba9b718a..000000000
--- a/zuul/ansible/2.9/lookup/passwordstore.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/passwordstore.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/pipe.py b/zuul/ansible/2.9/lookup/pipe.py
deleted file mode 120000
index ea688c3a3..000000000
--- a/zuul/ansible/2.9/lookup/pipe.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/pipe.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/pipe.pyi b/zuul/ansible/2.9/lookup/pipe.pyi
deleted file mode 120000
index 01d6b935d..000000000
--- a/zuul/ansible/2.9/lookup/pipe.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/pipe.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/redis_kv.py b/zuul/ansible/2.9/lookup/redis_kv.py
deleted file mode 120000
index a711e2651..000000000
--- a/zuul/ansible/2.9/lookup/redis_kv.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/redis_kv.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/redis_kv.pyi b/zuul/ansible/2.9/lookup/redis_kv.pyi
deleted file mode 120000
index da9acca45..000000000
--- a/zuul/ansible/2.9/lookup/redis_kv.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/redis_kv.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/shelvefile.py b/zuul/ansible/2.9/lookup/shelvefile.py
deleted file mode 120000
index 2c76ec937..000000000
--- a/zuul/ansible/2.9/lookup/shelvefile.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/shelvefile.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/shelvefile.pyi b/zuul/ansible/2.9/lookup/shelvefile.pyi
deleted file mode 120000
index 827f4b076..000000000
--- a/zuul/ansible/2.9/lookup/shelvefile.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/shelvefile.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/template.py b/zuul/ansible/2.9/lookup/template.py
deleted file mode 120000
index ef6565ceb..000000000
--- a/zuul/ansible/2.9/lookup/template.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/template.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/template.pyi b/zuul/ansible/2.9/lookup/template.pyi
deleted file mode 120000
index f03685d5c..000000000
--- a/zuul/ansible/2.9/lookup/template.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/url.py b/zuul/ansible/2.9/lookup/url.py
deleted file mode 120000
index f936b748e..000000000
--- a/zuul/ansible/2.9/lookup/url.py
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/url.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/lookup/url.pyi b/zuul/ansible/2.9/lookup/url.pyi
deleted file mode 120000
index fc13f47c5..000000000
--- a/zuul/ansible/2.9/lookup/url.pyi
+++ /dev/null
@@ -1 +0,0 @@
-../../base/lookup/url.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.8/action/__init__.py b/zuul/ansible/5/action/__init__.py
index 4048e7ac1..4048e7ac1 120000
--- a/zuul/ansible/2.8/action/__init__.py
+++ b/zuul/ansible/5/action/__init__.py
diff --git a/zuul/ansible/2.7/action/command.py b/zuul/ansible/5/action/command.py
index 56c6b636f..56c6b636f 120000
--- a/zuul/ansible/2.7/action/command.py
+++ b/zuul/ansible/5/action/command.py
diff --git a/zuul/ansible/2.7/action/command.pyi b/zuul/ansible/5/action/command.pyi
index a003281ca..a003281ca 120000
--- a/zuul/ansible/2.7/action/command.pyi
+++ b/zuul/ansible/5/action/command.pyi
diff --git a/zuul/ansible/5/action/zuul_return.py b/zuul/ansible/5/action/zuul_return.py
new file mode 120000
index 000000000..83c2fc619
--- /dev/null
+++ b/zuul/ansible/5/action/zuul_return.py
@@ -0,0 +1 @@
+../../base/action/zuul_return.py \ No newline at end of file
diff --git a/zuul/ansible/2.8/callback/__init__.py b/zuul/ansible/5/callback/__init__.py
index 00b974388..00b974388 120000
--- a/zuul/ansible/2.8/callback/__init__.py
+++ b/zuul/ansible/5/callback/__init__.py
diff --git a/zuul/ansible/2.8/callback/zuul_json.py b/zuul/ansible/5/callback/zuul_json.py
index b0a07779b..b0a07779b 120000
--- a/zuul/ansible/2.8/callback/zuul_json.py
+++ b/zuul/ansible/5/callback/zuul_json.py
diff --git a/zuul/ansible/2.8/callback/zuul_stream.py b/zuul/ansible/5/callback/zuul_stream.py
index f75561bf4..f75561bf4 120000
--- a/zuul/ansible/2.8/callback/zuul_stream.py
+++ b/zuul/ansible/5/callback/zuul_stream.py
diff --git a/zuul/ansible/2.8/callback/zuul_unreachable.py b/zuul/ansible/5/callback/zuul_unreachable.py
index 205baca6f..205baca6f 120000
--- a/zuul/ansible/2.8/callback/zuul_unreachable.py
+++ b/zuul/ansible/5/callback/zuul_unreachable.py
diff --git a/zuul/ansible/2.8/filter/__init__.py b/zuul/ansible/5/filter/__init__.py
index f80a4da61..f80a4da61 120000
--- a/zuul/ansible/2.8/filter/__init__.py
+++ b/zuul/ansible/5/filter/__init__.py
diff --git a/zuul/ansible/2.8/filter/zuul_filters.py b/zuul/ansible/5/filter/zuul_filters.py
index d406e5fe6..d406e5fe6 120000
--- a/zuul/ansible/2.8/filter/zuul_filters.py
+++ b/zuul/ansible/5/filter/zuul_filters.py
diff --git a/zuul/ansible/2.8/library/__init__.py b/zuul/ansible/5/library/__init__.py
index 0b68ce0f4..0b68ce0f4 120000
--- a/zuul/ansible/2.8/library/__init__.py
+++ b/zuul/ansible/5/library/__init__.py
diff --git a/zuul/ansible/2.8/library/command.py b/zuul/ansible/5/library/command.py
index 9c7633169..9c7633169 120000
--- a/zuul/ansible/2.8/library/command.py
+++ b/zuul/ansible/5/library/command.py
diff --git a/zuul/ansible/2.8/library/zuul_console.py b/zuul/ansible/5/library/zuul_console.py
index 7c905e0f9..7c905e0f9 120000
--- a/zuul/ansible/2.8/library/zuul_console.py
+++ b/zuul/ansible/5/library/zuul_console.py
diff --git a/zuul/ansible/2.8/logconfig.py b/zuul/ansible/5/logconfig.py
index 767cb2e81..767cb2e81 120000
--- a/zuul/ansible/2.8/logconfig.py
+++ b/zuul/ansible/5/logconfig.py
diff --git a/zuul/ansible/2.8/paths.py b/zuul/ansible/5/paths.py
index dbdb1858e..dbdb1858e 120000
--- a/zuul/ansible/2.8/paths.py
+++ b/zuul/ansible/5/paths.py
diff --git a/zuul/ansible/2.9/action/__init__.py b/zuul/ansible/6/action/__init__.py
index 4048e7ac1..4048e7ac1 120000
--- a/zuul/ansible/2.9/action/__init__.py
+++ b/zuul/ansible/6/action/__init__.py
diff --git a/zuul/ansible/2.8/action/command.py b/zuul/ansible/6/action/command.py
index 56c6b636f..56c6b636f 120000
--- a/zuul/ansible/2.8/action/command.py
+++ b/zuul/ansible/6/action/command.py
diff --git a/zuul/ansible/2.8/action/command.pyi b/zuul/ansible/6/action/command.pyi
index a003281ca..a003281ca 120000
--- a/zuul/ansible/2.8/action/command.pyi
+++ b/zuul/ansible/6/action/command.pyi
diff --git a/zuul/ansible/6/action/zuul_return.py b/zuul/ansible/6/action/zuul_return.py
new file mode 120000
index 000000000..83c2fc619
--- /dev/null
+++ b/zuul/ansible/6/action/zuul_return.py
@@ -0,0 +1 @@
+../../base/action/zuul_return.py \ No newline at end of file
diff --git a/zuul/ansible/2.9/callback/__init__.py b/zuul/ansible/6/callback/__init__.py
index 00b974388..00b974388 120000
--- a/zuul/ansible/2.9/callback/__init__.py
+++ b/zuul/ansible/6/callback/__init__.py
diff --git a/zuul/ansible/2.9/callback/zuul_json.py b/zuul/ansible/6/callback/zuul_json.py
index b0a07779b..b0a07779b 120000
--- a/zuul/ansible/2.9/callback/zuul_json.py
+++ b/zuul/ansible/6/callback/zuul_json.py
diff --git a/zuul/ansible/2.9/callback/zuul_stream.py b/zuul/ansible/6/callback/zuul_stream.py
index f75561bf4..f75561bf4 120000
--- a/zuul/ansible/2.9/callback/zuul_stream.py
+++ b/zuul/ansible/6/callback/zuul_stream.py
diff --git a/zuul/ansible/2.9/callback/zuul_unreachable.py b/zuul/ansible/6/callback/zuul_unreachable.py
index 205baca6f..205baca6f 120000
--- a/zuul/ansible/2.9/callback/zuul_unreachable.py
+++ b/zuul/ansible/6/callback/zuul_unreachable.py
diff --git a/zuul/ansible/2.9/filter/__init__.py b/zuul/ansible/6/filter/__init__.py
index f80a4da61..f80a4da61 120000
--- a/zuul/ansible/2.9/filter/__init__.py
+++ b/zuul/ansible/6/filter/__init__.py
diff --git a/zuul/ansible/2.9/filter/zuul_filters.py b/zuul/ansible/6/filter/zuul_filters.py
index d406e5fe6..d406e5fe6 120000
--- a/zuul/ansible/2.9/filter/zuul_filters.py
+++ b/zuul/ansible/6/filter/zuul_filters.py
diff --git a/zuul/ansible/2.9/library/__init__.py b/zuul/ansible/6/library/__init__.py
index 0b68ce0f4..0b68ce0f4 120000
--- a/zuul/ansible/2.9/library/__init__.py
+++ b/zuul/ansible/6/library/__init__.py
diff --git a/zuul/ansible/2.9/library/command.py b/zuul/ansible/6/library/command.py
index 9c7633169..9c7633169 120000
--- a/zuul/ansible/2.9/library/command.py
+++ b/zuul/ansible/6/library/command.py
diff --git a/zuul/ansible/2.9/library/zuul_console.py b/zuul/ansible/6/library/zuul_console.py
index 7c905e0f9..7c905e0f9 120000
--- a/zuul/ansible/2.9/library/zuul_console.py
+++ b/zuul/ansible/6/library/zuul_console.py
diff --git a/zuul/ansible/2.9/logconfig.py b/zuul/ansible/6/logconfig.py
index 767cb2e81..767cb2e81 120000
--- a/zuul/ansible/2.9/logconfig.py
+++ b/zuul/ansible/6/logconfig.py
diff --git a/zuul/ansible/2.9/paths.py b/zuul/ansible/6/paths.py
index dbdb1858e..dbdb1858e 120000
--- a/zuul/ansible/2.9/paths.py
+++ b/zuul/ansible/6/paths.py
diff --git a/zuul/ansible/base/action/add_host.py b/zuul/ansible/base/action/add_host.py
deleted file mode 100644
index 864e53fac..000000000
--- a/zuul/ansible/base/action/add_host.py
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2018 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-from zuul.ansible import paths
-add_host = paths._import_ansible_action_plugin("add_host")
-
-
-class ActionModule(add_host.ActionModule):
-
- def run(self, tmp=None, task_vars=None):
- safe_args = set((
- 'ansible_connection',
- 'ansible_python_interpreter',
- 'ansible_host',
- 'ansible_port',
- 'ansible_user',
- 'ansible_user_dir',
- 'ansible_password',
- 'ansible_ssh_host',
- 'ansible_ssh_port',
- 'ansible_ssh_user',
- 'ansible_ssh_pass',
- 'ansible_fqdn',
- 'ansible_private_key_file',
- 'ansible_kubectl_namespace',
- ))
- args = set(filter(
- lambda x: x.startswith('ansible_'), self._task.args.keys()))
- conn = self._task.args.get('ansible_connection', 'ssh')
- if args.issubset(safe_args) and conn in ('kubectl', 'ssh'):
- return super(ActionModule, self).run(tmp, task_vars)
-
- return dict(
- failed=True,
- msg="Adding hosts %s with %s to the inventory is prohibited" % (
- conn, " ".join(args.difference(safe_args))))
diff --git a/zuul/ansible/base/action/add_host.pyi b/zuul/ansible/base/action/add_host.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/add_host.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/aireos.py b/zuul/ansible/base/action/aireos.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/aireos.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/aireos.pyi b/zuul/ansible/base/action/aireos.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/aireos.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/aireos_config.py b/zuul/ansible/base/action/aireos_config.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/aireos_config.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/aireos_config.pyi b/zuul/ansible/base/action/aireos_config.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/aireos_config.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/aruba.py b/zuul/ansible/base/action/aruba.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/aruba.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/aruba.pyi b/zuul/ansible/base/action/aruba.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/aruba.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/aruba_config.py b/zuul/ansible/base/action/aruba_config.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/aruba_config.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/aruba_config.pyi b/zuul/ansible/base/action/aruba_config.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/aruba_config.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/asa.py b/zuul/ansible/base/action/asa.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/asa.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/asa.pyi b/zuul/ansible/base/action/asa.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/asa.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/asa_config.py b/zuul/ansible/base/action/asa_config.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/asa_config.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/asa_config.pyi b/zuul/ansible/base/action/asa_config.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/asa_config.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/asa_template.py b/zuul/ansible/base/action/asa_template.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/asa_template.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/asa_template.pyi b/zuul/ansible/base/action/asa_template.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/asa_template.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/assemble.py b/zuul/ansible/base/action/assemble.py
deleted file mode 100644
index 139ed7da4..000000000
--- a/zuul/ansible/base/action/assemble.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2016 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-
-from zuul.ansible import paths
-assemble = paths._import_ansible_action_plugin("assemble")
-
-
-class ActionModule(assemble.ActionModule):
-
- def _find_needle(self, dirname, needle):
- return paths._safe_find_needle(
- super(ActionModule, self), dirname, needle)
-
- def run(self, tmp=None, task_vars=None):
-
- if not paths._is_official_module(self):
- return paths._fail_module_dict(self._task.action)
-
- if paths._is_localhost_task(self):
- paths._fail_if_unsafe(self._task.args['dest'])
-
- return super(ActionModule, self).run(tmp, task_vars)
diff --git a/zuul/ansible/base/action/assemble.pyi b/zuul/ansible/base/action/assemble.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/assemble.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/aws_s3.py b/zuul/ansible/base/action/aws_s3.py
deleted file mode 100644
index ff7c81403..000000000
--- a/zuul/ansible/base/action/aws_s3.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2016 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-
-from zuul.ansible import paths
-aws_s3 = paths._import_ansible_action_plugin("aws_s3")
-
-
-class ActionModule(aws_s3.ActionModule):
-
- def _find_needle(self, dirname, needle):
- return paths._safe_find_needle(
- super(ActionModule, self), dirname, needle)
-
- def run(self, tmp=None, task_vars=None):
-
- if not paths._is_official_module(self):
- return paths._fail_module_dict(self._task.action)
-
- if paths._is_localhost_task(self):
- paths._fail_if_unsafe(self._task.args['dest'])
-
- return super(ActionModule, self).run(tmp, task_vars)
diff --git a/zuul/ansible/base/action/aws_s3.pyi b/zuul/ansible/base/action/aws_s3.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/aws_s3.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/ce.py b/zuul/ansible/base/action/ce.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/ce.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/ce.pyi b/zuul/ansible/base/action/ce.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/ce.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/ce_config.py b/zuul/ansible/base/action/ce_config.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/ce_config.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/ce_config.pyi b/zuul/ansible/base/action/ce_config.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/ce_config.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/ce_template.py b/zuul/ansible/base/action/ce_template.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/ce_template.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/ce_template.pyi b/zuul/ansible/base/action/ce_template.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/ce_template.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/command.py b/zuul/ansible/base/action/command.py
index bf2debc96..3bb88d8e5 100644
--- a/zuul/ansible/base/action/command.py
+++ b/zuul/ansible/base/action/command.py
@@ -15,19 +15,31 @@
from zuul.ansible import paths
-from ansible.errors import AnsibleError
command = paths._import_ansible_action_plugin("command")
class ActionModule(command.ActionModule):
def run(self, tmp=None, task_vars=None):
- if paths._is_localhost_task(self):
- raise AnsibleError("Executing local code is prohibited")
-
# we need the zuul_log_id on shell and command tasks
- host = paths._sanitize_filename(task_vars.get('inventory_hostname'))
- if self._task.action in ('command', 'shell'):
- self._task.args['zuul_log_id'] = "%s-%s" % (self._task._uuid, host)
-
+ if self._task.action in (
+ 'command', 'shell',
+ 'ansible.builtin.command', 'ansible.builtin.shell'):
+ # This is a bit lame, but we do not log loops in the
+ # zuul_stream.py callback. This allows us to not write
+ # out command.py output to files that will never be read.
+ if 'ansible_loop_var' in task_vars:
+ self._task.args['zuul_log_id'] = 'in-loop-ignore'
+ else:
+ # Get a unique key for ZUUL_LOG_ID_MAP. ZUUL_LOG_ID_MAP
+ # is read-only since we are forked. Use it to add a
+ # counter to the log id so that if we run the same task
+ # more than once, we get a unique log file. See comments
+ # in paths.py for details.
+ log_host = paths._sanitize_filename(
+ task_vars.get('inventory_hostname'))
+ key = "%s-%s" % (self._task._uuid, log_host)
+ count = paths.ZUUL_LOG_ID_MAP.get(key, 0)
+ self._task.args['zuul_log_id'] = "%s-%s-%s" % (
+ self._task._uuid, count, log_host)
return super(ActionModule, self).run(tmp, task_vars)
diff --git a/zuul/ansible/base/action/copy.py b/zuul/ansible/base/action/copy.py
deleted file mode 100644
index e8927ce9e..000000000
--- a/zuul/ansible/base/action/copy.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2016 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-
-from zuul.ansible import paths
-copy = paths._import_ansible_action_plugin("copy")
-
-
-class ActionModule(copy.ActionModule):
-
- def _find_needle(self, dirname, needle):
- return paths._safe_find_needle(
- super(ActionModule, self), dirname, needle)
-
- def run(self, tmp=None, task_vars=None):
-
- if not paths._is_official_module(self):
- return paths._fail_module_dict(self._task.action)
-
- if paths._is_localhost_task(self):
- paths._fail_if_unsafe(self._task.args['dest'])
-
- return super(ActionModule, self).run(tmp, task_vars)
diff --git a/zuul/ansible/base/action/copy.pyi b/zuul/ansible/base/action/copy.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/copy.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/dellos10_config.py b/zuul/ansible/base/action/dellos10_config.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/dellos10_config.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/dellos10_config.pyi b/zuul/ansible/base/action/dellos10_config.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/dellos10_config.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/dellos6_config.py b/zuul/ansible/base/action/dellos6_config.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/dellos6_config.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/dellos6_config.pyi b/zuul/ansible/base/action/dellos6_config.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/dellos6_config.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/dellos9_config.py b/zuul/ansible/base/action/dellos9_config.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/dellos9_config.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/dellos9_config.pyi b/zuul/ansible/base/action/dellos9_config.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/dellos9_config.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/eos_config.py b/zuul/ansible/base/action/eos_config.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/eos_config.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/eos_config.pyi b/zuul/ansible/base/action/eos_config.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/eos_config.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/eos_template.py b/zuul/ansible/base/action/eos_template.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/eos_template.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/eos_template.pyi b/zuul/ansible/base/action/eos_template.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/eos_template.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/fetch.py b/zuul/ansible/base/action/fetch.py
deleted file mode 100644
index 0d35846e2..000000000
--- a/zuul/ansible/base/action/fetch.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2016 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-
-from zuul.ansible import paths
-fetch = paths._import_ansible_action_plugin("fetch")
-
-
-class ActionModule(fetch.ActionModule):
-
- def run(self, tmp=None, task_vars=None):
- if not paths._is_official_module(self):
- return paths._fail_module_dict(self._task.action)
-
- dest = self._task.args.get('dest', None)
-
- if dest and not paths._is_safe_path(dest):
- return paths._fail_dict(dest)
- return super(ActionModule, self).run(tmp, task_vars)
diff --git a/zuul/ansible/base/action/fetch.pyi b/zuul/ansible/base/action/fetch.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/fetch.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/fortios_config.py b/zuul/ansible/base/action/fortios_config.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/fortios_config.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/fortios_config.pyi b/zuul/ansible/base/action/fortios_config.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/fortios_config.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/include_vars.py b/zuul/ansible/base/action/include_vars.py
deleted file mode 100644
index 930e54d50..000000000
--- a/zuul/ansible/base/action/include_vars.py
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright 2016 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-
-from zuul.ansible import paths
-include_vars = paths._import_ansible_action_plugin("include_vars")
-
-
-class ActionModule(include_vars.ActionModule):
-
- def _find_needle(self, dirname, needle):
- return paths._safe_find_needle(
- super(ActionModule, self), dirname, needle)
-
- def run(self, tmp=None, task_vars=None):
- if not paths._is_official_module(self):
- return paths._fail_module_dict(self._task.action)
-
- source_dir = self._task.args.get('dir', None)
-
- # This is the handling for source_dir. The source_file is handled by
- # the _find_needle override.
- if source_dir:
- self._set_args()
- self._set_root_dir()
- if not paths._is_safe_path(self.source_dir, allow_trusted=True):
- return paths._fail_dict(self.source_dir)
- return super(ActionModule, self).run(tmp, task_vars)
diff --git a/zuul/ansible/base/action/include_vars.pyi b/zuul/ansible/base/action/include_vars.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/include_vars.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/ios_config.py b/zuul/ansible/base/action/ios_config.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/ios_config.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/ios_config.pyi b/zuul/ansible/base/action/ios_config.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/ios_config.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/ios_template.py b/zuul/ansible/base/action/ios_template.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/ios_template.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/ios_template.pyi b/zuul/ansible/base/action/ios_template.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/ios_template.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/iosxr_config.py b/zuul/ansible/base/action/iosxr_config.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/iosxr_config.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/iosxr_config.pyi b/zuul/ansible/base/action/iosxr_config.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/iosxr_config.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/iosxr_template.py b/zuul/ansible/base/action/iosxr_template.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/iosxr_template.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/iosxr_template.pyi b/zuul/ansible/base/action/iosxr_template.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/iosxr_template.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/junos_config.py b/zuul/ansible/base/action/junos_config.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/junos_config.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/junos_config.pyi b/zuul/ansible/base/action/junos_config.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/junos_config.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/junos_template.py b/zuul/ansible/base/action/junos_template.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/junos_template.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/junos_template.pyi b/zuul/ansible/base/action/junos_template.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/junos_template.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/net_banner.py b/zuul/ansible/base/action/net_banner.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/net_banner.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/net_banner.pyi b/zuul/ansible/base/action/net_banner.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/net_banner.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/net_base.py b/zuul/ansible/base/action/net_base.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/net_base.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/net_base.pyi b/zuul/ansible/base/action/net_base.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/net_base.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/net_config.py b/zuul/ansible/base/action/net_config.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/net_config.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/net_config.pyi b/zuul/ansible/base/action/net_config.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/net_config.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/net_get.py b/zuul/ansible/base/action/net_get.py
deleted file mode 100644
index 8254fd47d..000000000
--- a/zuul/ansible/base/action/net_get.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2016 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-
-from zuul.ansible import paths
-net_get = paths._import_ansible_action_plugin("net_get")
-
-
-class ActionModule(net_get.ActionModule):
-
- def run(self, tmp=None, task_vars=None):
-
- if not paths._is_official_module(self):
- return paths._fail_module_dict(self._task.action)
-
- if paths._is_localhost_task(self):
- paths._fail_if_unsafe(self._task.args['dest'])
-
- return super(ActionModule, self).run(tmp, task_vars)
diff --git a/zuul/ansible/base/action/net_get.pyi b/zuul/ansible/base/action/net_get.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/net_get.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/net_interface.py b/zuul/ansible/base/action/net_interface.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/net_interface.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/net_interface.pyi b/zuul/ansible/base/action/net_interface.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/net_interface.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/net_l2_interface.py b/zuul/ansible/base/action/net_l2_interface.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/net_l2_interface.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/net_l2_interface.pyi b/zuul/ansible/base/action/net_l2_interface.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/net_l2_interface.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/net_l3_interface.py b/zuul/ansible/base/action/net_l3_interface.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/net_l3_interface.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/net_l3_interface.pyi b/zuul/ansible/base/action/net_l3_interface.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/net_l3_interface.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/net_linkagg.py b/zuul/ansible/base/action/net_linkagg.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/net_linkagg.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/net_linkagg.pyi b/zuul/ansible/base/action/net_linkagg.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/net_linkagg.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/net_lldp.py b/zuul/ansible/base/action/net_lldp.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/net_lldp.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/net_lldp.pyi b/zuul/ansible/base/action/net_lldp.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/net_lldp.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/net_lldp_interface.py b/zuul/ansible/base/action/net_lldp_interface.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/net_lldp_interface.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/net_lldp_interface.pyi b/zuul/ansible/base/action/net_lldp_interface.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/net_lldp_interface.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/net_logging.py b/zuul/ansible/base/action/net_logging.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/net_logging.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/net_logging.pyi b/zuul/ansible/base/action/net_logging.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/net_logging.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/net_ping.py b/zuul/ansible/base/action/net_ping.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/net_ping.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/net_ping.pyi b/zuul/ansible/base/action/net_ping.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/net_ping.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/net_static_route.py b/zuul/ansible/base/action/net_static_route.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/net_static_route.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/net_static_route.pyi b/zuul/ansible/base/action/net_static_route.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/net_static_route.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/net_system.py b/zuul/ansible/base/action/net_system.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/net_system.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/net_system.pyi b/zuul/ansible/base/action/net_system.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/net_system.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/net_template.py b/zuul/ansible/base/action/net_template.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/net_template.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/net_template.pyi b/zuul/ansible/base/action/net_template.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/net_template.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/net_user.py b/zuul/ansible/base/action/net_user.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/net_user.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/net_user.pyi b/zuul/ansible/base/action/net_user.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/net_user.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/net_vlan.py b/zuul/ansible/base/action/net_vlan.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/net_vlan.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/net_vlan.pyi b/zuul/ansible/base/action/net_vlan.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/net_vlan.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/net_vrf.py b/zuul/ansible/base/action/net_vrf.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/net_vrf.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/net_vrf.pyi b/zuul/ansible/base/action/net_vrf.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/net_vrf.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/netconf_config.py b/zuul/ansible/base/action/netconf_config.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/netconf_config.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/netconf_config.pyi b/zuul/ansible/base/action/netconf_config.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/netconf_config.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/network.pyi b/zuul/ansible/base/action/network.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/network.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/normal.py b/zuul/ansible/base/action/normal.py
deleted file mode 100644
index d0329aed4..000000000
--- a/zuul/ansible/base/action/normal.py
+++ /dev/null
@@ -1,117 +0,0 @@
-# Copyright 2017 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-from ansible.errors import AnsibleError
-
-from zuul.ansible import paths
-normal = paths._import_ansible_action_plugin('normal')
-
-
-class ActionModule(normal.ActionModule):
- '''Override the normal action plugin
-
- :py:class:`ansible.plugins.normal.ActionModule` is run for every
- module that does not have a more specific matching action plugin.
-
- Our overridden version of it wraps the execution with checks to block
- undesired actions on localhost.
- '''
-
- def run(self, tmp=None, task_vars=None):
- '''Overridden primary method from the base class.'''
-
- if paths._is_localhost_task(self):
- if not self.dispatch_handler():
- raise AnsibleError("Executing local code is prohibited")
- return super(ActionModule, self).run(tmp, task_vars)
-
- def dispatch_handler(self):
- '''Run per-action handler if one exists.'''
- handler_name = 'handle_{action}'.format(action=self._task.action)
- handler = getattr(self, handler_name, None)
- if handler:
- paths._fail_if_local_module(self)
- handler()
- return True
- return False
-
- def handle_zuul_return(self):
- '''Allow zuul_return module on localhost.'''
- pass
-
- def handle_stat(self):
- '''Allow stat module on localhost if it doesn't touch unsafe files.
-
- The :ansible:module:`stat` can be useful in jobs for manipulating logs
- and artifacts.
-
- Block any access of files outside the zuul work dir.
- '''
- if self._task.args.get('get_mime'):
- raise AnsibleError("get_mime on localhost is forbidden")
- paths._fail_if_unsafe(self._task.args['path'])
-
- def handle_file(self):
- '''Allow file module on localhost if it doesn't touch unsafe files.
-
- The :ansible:module:`file` can be useful in jobs for manipulating logs
- and artifacts.
-
- Block any access of files outside the zuul work dir.
- '''
- for arg in ('path', 'dest', 'name'):
- dest = self._task.args.get(arg)
- if dest:
- paths._fail_if_unsafe(dest)
-
- def handle_known_hosts(self):
- '''Allow known_hosts on localhost
-
- The :ansible:module:`known_hosts` can be used to add SSH host keys of
- a remote system. When run from a executor it can be used with the
- add_host task to access remote servers. This is needed because ansible
- on the executor is configured to check host keys by default.
-
- Block any access of files outside the zuul work dir.
- '''
- if paths._is_localhost_task(self):
- path = self._task.args.get('path')
- if path:
- paths._fail_if_unsafe(path)
-
- def handle_k8s(self):
- '''Allow k8s module on localhost if it doesn't touch unsafe files.
-
- The :ansible:module:`k8s` can be used from the executor to modify
- k8s resources. Several options refer to local paths; check that
- they are constrained to the work dir.
- '''
- for arg in ('src', 'ca_cert', 'client_cert',
- 'client_key', 'kubeconfig'):
- path = self._task.args.get(arg)
- if path:
- paths._fail_if_unsafe(path)
-
- def handle_find(self):
- '''Allow find module on localhost if it doesn't traverse unsafe files.
-
- The :ansible:module:`find` can be used from the executor to
- gather a list of files.
- '''
- find_paths = self._task.args.get('paths')
- if not isinstance(find_paths, list):
- find_paths = (find_paths,)
- for path in find_paths:
- paths._fail_if_unsafe(path)
diff --git a/zuul/ansible/base/action/normal.pyi b/zuul/ansible/base/action/normal.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/normal.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/nxos_config.py b/zuul/ansible/base/action/nxos_config.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/nxos_config.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/nxos_config.pyi b/zuul/ansible/base/action/nxos_config.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/nxos_config.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/nxos_template.py b/zuul/ansible/base/action/nxos_template.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/nxos_template.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/nxos_template.pyi b/zuul/ansible/base/action/nxos_template.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/nxos_template.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/ops_config.py b/zuul/ansible/base/action/ops_config.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/ops_config.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/ops_config.pyi b/zuul/ansible/base/action/ops_config.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/ops_config.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/ops_template.py b/zuul/ansible/base/action/ops_template.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/ops_template.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/ops_template.pyi b/zuul/ansible/base/action/ops_template.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/ops_template.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/patch.py b/zuul/ansible/base/action/patch.py
deleted file mode 100644
index 098d4819c..000000000
--- a/zuul/ansible/base/action/patch.py
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2016 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-from zuul.ansible import paths
-patch = paths._import_ansible_action_plugin("patch")
-
-
-class ActionModule(patch.ActionModule):
-
- def _find_needle(self, dirname, needle):
- return paths._safe_find_needle(
- super(ActionModule, self), dirname, needle)
-
- def run(self, tmp=None, task_vars=None):
- if not paths._is_official_module(self):
- return paths._fail_module_dict(self._task.action)
-
- if paths._is_localhost_task(self):
- # The patch module has two possibilities of describing where to
- # operate, basedir and dest. We need to perform the safe path check
- # for both.
- dirs_to_check = [
- self._task.args.get('basedir'),
- self._task.args.get('dest'),
- ]
-
- for directory in dirs_to_check:
- if directory is not None:
- paths._fail_if_unsafe(directory)
-
- return super(ActionModule, self).run(tmp, task_vars)
diff --git a/zuul/ansible/base/action/patch.pyi b/zuul/ansible/base/action/patch.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/patch.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/raw.py b/zuul/ansible/base/action/raw.py
deleted file mode 100644
index fb1e1a6e3..000000000
--- a/zuul/ansible/base/action/raw.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2019 BMW Group
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-
-from ansible.errors import AnsibleError
-from zuul.ansible import paths
-raw = paths._import_ansible_action_plugin("raw")
-
-
-class ActionModule(raw.ActionModule):
-
- def run(self, tmp=None, task_vars=None):
-
- if not paths._is_official_module(self):
- return paths._fail_module_dict(self._task.action)
-
- if paths._is_localhost_task(self):
- raise AnsibleError("Executing local code is prohibited")
-
- return super(ActionModule, self).run(tmp, task_vars)
diff --git a/zuul/ansible/base/action/raw.pyi b/zuul/ansible/base/action/raw.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/raw.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/script.py b/zuul/ansible/base/action/script.py
deleted file mode 100644
index 9fc38cc96..000000000
--- a/zuul/ansible/base/action/script.py
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright 2016 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-
-from ansible.errors import AnsibleError
-from zuul.ansible import paths
-script = paths._import_ansible_action_plugin("script")
-
-
-class ActionModule(script.ActionModule):
-
- def _find_needle(self, dirname, needle):
- return paths._safe_find_needle(
- super(ActionModule, self), dirname, needle)
-
- def run(self, tmp=None, task_vars=None):
-
- if not paths._is_official_module(self):
- return paths._fail_module_dict(self._task.action)
-
- if paths._is_localhost_task(self):
- raise AnsibleError("Executing local code is prohibited")
-
- return super(ActionModule, self).run(tmp, task_vars)
diff --git a/zuul/ansible/base/action/script.pyi b/zuul/ansible/base/action/script.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/script.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/sros_config.py b/zuul/ansible/base/action/sros_config.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/sros_config.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/sros_config.pyi b/zuul/ansible/base/action/sros_config.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/sros_config.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/synchronize.py b/zuul/ansible/base/action/synchronize.py
deleted file mode 100644
index c9f275e71..000000000
--- a/zuul/ansible/base/action/synchronize.py
+++ /dev/null
@@ -1,75 +0,0 @@
-# Copyright 2016 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-
-from zuul.ansible import paths
-synchronize = paths._import_ansible_action_plugin("synchronize")
-
-
-def is_opt_prohibited(rsync_arg):
- prohibited_opts = (
- "--rsh",
- "-e",
- )
- return any(filter(lambda opt: rsync_arg.startswith(opt), prohibited_opts))
-
-
-def is_env_prohibited(env_keys):
- prohibited_env = (
- "RSYNC_RSH",
- )
- return any(filter(lambda env: env in prohibited_env, env_keys))
-
-
-def is_prohibited(rsync_opts, environment):
- return (any(filter(is_opt_prohibited, list(map(str.strip, rsync_opts)))) or
- any(filter(is_env_prohibited, list(map(dict.keys, environment)))))
-
-
-class ActionModule(synchronize.ActionModule):
-
- def run(self, tmp=None, task_vars=None):
- if not paths._is_official_module(self):
- return paths._fail_module_dict(self._task.action)
-
- try:
- delegate_to = self._task.delegate_to
- except (AttributeError, KeyError):
- delegate_to = None
-
- if delegate_to and not paths._is_localhost_task(self):
- return super(ActionModule, self).run(tmp, task_vars)
-
- source = self._task.args.get('src', None)
- dest = self._task.args.get('dest', None)
- mode = self._task.args.get('mode', 'push')
-
- if 'rsync_opts' not in self._task.args:
- self._task.args['rsync_opts'] = []
- if '--safe-links' not in self._task.args['rsync_opts']:
- self._task.args['rsync_opts'].append('--safe-links')
- if is_prohibited(
- self._task.args.get('rsync_opts', []),
- self._task.environment if self._task.environment else {}):
- return dict(
- failed=True,
- msg="Using custom synchronize rsh is prohibited")
-
- if mode == 'push' and not paths._is_safe_path(
- source, allow_trusted=True):
- return paths._fail_dict(source, prefix='Syncing files from')
- if mode == 'pull' and not paths._is_safe_path(dest):
- return paths._fail_dict(dest, prefix='Syncing files to')
- return super(ActionModule, self).run(tmp, task_vars)
diff --git a/zuul/ansible/base/action/synchronize.pyi b/zuul/ansible/base/action/synchronize.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/synchronize.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/template.py b/zuul/ansible/base/action/template.py
deleted file mode 100644
index 5f0e5602c..000000000
--- a/zuul/ansible/base/action/template.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2016 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-
-from zuul.ansible import paths
-template = paths._import_ansible_action_plugin("template")
-
-
-class ActionModule(template.ActionModule):
-
- def _find_needle(self, dirname, needle):
- return paths._safe_find_needle(
- super(ActionModule, self), dirname, needle)
-
- def run(self, tmp=None, task_vars=None):
- if not paths._is_official_module(self):
- return paths._fail_module_dict(self._task.action)
-
- return super(ActionModule, self).run(tmp, task_vars)
diff --git a/zuul/ansible/base/action/template.pyi b/zuul/ansible/base/action/template.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/template.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/unarchive.py b/zuul/ansible/base/action/unarchive.py
deleted file mode 100644
index 9eb9bb544..000000000
--- a/zuul/ansible/base/action/unarchive.py
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright 2016 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-
-from zuul.ansible import paths
-unarchive = paths._import_ansible_action_plugin("unarchive")
-
-
-class ActionModule(unarchive.ActionModule):
-
- def _find_needle(self, dirname, needle):
- return paths._safe_find_needle(
- super(ActionModule, self), dirname, needle)
-
- def run(self, tmp=None, task_vars=None):
- if not paths._is_official_module(self):
- return paths._fail_module_dict(self._task.action)
-
- # Note: The unarchive module reuses the copy module to copy the archive
- # to the remote. Thus we don't need to check the dest here if we run
- # against localhost. We also have tests that would break if this
- # changes in the future.
-
- return super(ActionModule, self).run(tmp, task_vars)
diff --git a/zuul/ansible/base/action/unarchive.pyi b/zuul/ansible/base/action/unarchive.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/unarchive.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/uri.py b/zuul/ansible/base/action/uri.py
deleted file mode 100644
index 44f60882c..000000000
--- a/zuul/ansible/base/action/uri.py
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright 2016 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-from ansible.errors import AnsibleError
-from ansible.module_utils.six.moves.urllib.parse import urlparse
-
-from zuul.ansible import paths
-uri = paths._import_ansible_action_plugin("uri")
-
-ALLOWED_URL_SCHEMES = ('https', 'http', 'ftp')
-
-
-class ActionModule(uri.ActionModule):
-
- def _find_needle(self, dirname, needle):
- return paths._safe_find_needle(
- super(ActionModule, self), dirname, needle)
-
- def run(self, tmp=None, task_vars=None):
-
- if not paths._is_official_module(self):
- return paths._fail_module_dict(self._task.action)
-
- if paths._is_localhost_task(self):
- for arg in ('src', 'dest'):
- dest = self._task.args.get(arg)
- if dest:
- paths._fail_if_unsafe(dest)
- scheme = urlparse(self._task.args['url']).scheme
- if scheme not in ALLOWED_URL_SCHEMES:
- raise AnsibleError(
- "{scheme} urls are not allowed from localhost."
- " Only {allowed_schemes} are allowed".format(
- scheme=scheme,
- allowed_schemes=ALLOWED_URL_SCHEMES))
-
- return super(ActionModule, self).run(tmp, task_vars)
diff --git a/zuul/ansible/base/action/uri.pyi b/zuul/ansible/base/action/uri.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/uri.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/vyos_config.py b/zuul/ansible/base/action/vyos_config.py
deleted file mode 120000
index 7a739baa2..000000000
--- a/zuul/ansible/base/action/vyos_config.py
+++ /dev/null
@@ -1 +0,0 @@
-network.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/vyos_config.pyi b/zuul/ansible/base/action/vyos_config.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/vyos_config.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/win_copy.py b/zuul/ansible/base/action/win_copy.py
deleted file mode 100644
index d9dbe4dc8..000000000
--- a/zuul/ansible/base/action/win_copy.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2016 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-
-from zuul.ansible import paths
-win_copy = paths._import_ansible_action_plugin("win_copy")
-
-
-class ActionModule(win_copy.ActionModule):
-
- def _find_needle(self, dirname, needle):
- return paths._safe_find_needle(
- super(ActionModule, self), dirname, needle)
-
- def run(self, tmp=None, task_vars=None):
- if not paths._is_official_module(self):
- return paths._fail_module_dict(self._task.action)
-
- return super(ActionModule, self).run(tmp, task_vars)
diff --git a/zuul/ansible/base/action/win_copy.pyi b/zuul/ansible/base/action/win_copy.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/win_copy.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/action/win_template.py b/zuul/ansible/base/action/win_template.py
deleted file mode 100644
index 36b475aea..000000000
--- a/zuul/ansible/base/action/win_template.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2016 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-
-from zuul.ansible import paths
-win_template = paths._import_ansible_action_plugin("win_template")
-
-
-class ActionModule(win_template.ActionModule):
-
- def _find_needle(self, dirname, needle):
- return paths._safe_find_needle(
- super(ActionModule, self), dirname, needle)
-
- def run(self, tmp=None, task_vars=None):
- if not paths._is_official_module(self):
- return paths._fail_module_dict(self._task.action)
-
- return super(ActionModule, self).run(tmp, task_vars)
diff --git a/zuul/ansible/base/action/win_template.pyi b/zuul/ansible/base/action/win_template.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/action/win_template.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/actiongeneral/zuul_return.py b/zuul/ansible/base/action/zuul_return.py
index 216ec20f2..ba6c5cc31 100644
--- a/zuul/ansible/base/actiongeneral/zuul_return.py
+++ b/zuul/ansible/base/action/zuul_return.py
@@ -20,8 +20,6 @@ from copy import deepcopy
from ansible.plugins.action import ActionBase
-from zuul.ansible import paths
-
def merge_dict(dict_a, dict_b):
"""
@@ -56,6 +54,7 @@ def merge_data(dict_a, dict_b):
artifacts = merge_zuul_list(dict_a, dict_b, 'artifacts')
file_comments = merge_file_comments(dict_a, dict_b)
warnings = merge_zuul_list(dict_a, dict_b, 'warnings')
+ retry = dict_a.get('zuul', {}).get('retry')
merge_dict(dict_a, dict_b)
if artifacts:
dict_b.setdefault('zuul', {})['artifacts'] = artifacts
@@ -63,6 +62,9 @@ def merge_data(dict_a, dict_b):
dict_b.setdefault("zuul", {})["file_comments"] = file_comments
if warnings:
dict_b.setdefault('zuul', {})['warnings'] = warnings
+ if retry:
+ dict_b.setdefault('zuul', {})['retry'] = retry
+
return dict_b
@@ -163,9 +165,6 @@ class ActionModule(ActionBase):
path = os.path.join(os.environ['ZUUL_JOBDIR'], 'work',
'results.json')
- if not paths._is_safe_path(path, allow_trusted=False):
- return paths._fail_dict(path)
-
set_value(
path,
self._task.args.get('data'),
diff --git a/zuul/ansible/base/actiongeneral/__init__.py b/zuul/ansible/base/actiongeneral/__init__.py
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/actiongeneral/__init__.py
+++ /dev/null
diff --git a/zuul/ansible/base/actiontrusted/__init__.py b/zuul/ansible/base/actiontrusted/__init__.py
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/actiontrusted/__init__.py
+++ /dev/null
diff --git a/zuul/ansible/base/actiontrusted/command.py b/zuul/ansible/base/actiontrusted/command.py
deleted file mode 100644
index f9b976ca0..000000000
--- a/zuul/ansible/base/actiontrusted/command.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2018 BMW Car IT GmbH
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-
-from zuul.ansible import paths
-command = paths._import_ansible_action_plugin("command")
-
-
-class ActionModule(command.ActionModule):
-
- def run(self, tmp=None, task_vars=None):
- # we need the zuul_log_id on shell and command tasks
- host = paths._sanitize_filename(task_vars.get('inventory_hostname'))
- if self._task.action in ('command', 'shell'):
- self._task.args['zuul_log_id'] = "%s-%s" % (self._task._uuid, host)
-
- return super(ActionModule, self).run(tmp, task_vars)
diff --git a/zuul/ansible/base/actiontrusted/command.pyi b/zuul/ansible/base/actiontrusted/command.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/actiontrusted/command.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/callback/zuul_json.py b/zuul/ansible/base/callback/zuul_json.py
index 4ed2d01b4..aff9ad2e2 100644
--- a/zuul/ansible/base/callback/zuul_json.py
+++ b/zuul/ansible/base/callback/zuul_json.py
@@ -27,6 +27,7 @@ import datetime
import json
import os
+from ansible.plugins.loader import PluginLoader
from ansible.plugins.callback import CallbackBase
try:
# It's here in 2.3
@@ -134,26 +135,12 @@ class CallbackModule(CallbackBase):
def v2_runner_on_ok(self, result, **kwargs):
host = result._host
action = result._task.action
- if result._result.get('_ansible_no_log', False) or result._task.no_log:
- self.results[-1]['tasks'][-1]['hosts'][host.name] = dict(
- censored="the output has been hidden due to the fact that"
- " 'no_log: true' was specified for this result")
- else:
- # strip_internal_keys makes a deep copy of dict items, but
- # not lists, so we need to create our own complete deep
- # copy first so we don't modify the original.
- myresult = copy.deepcopy(result._result)
- clean_result = strip_internal_keys(myresult)
-
- for index, item_result in enumerate(
- clean_result.get('results', [])):
- if not item_result.get('_ansible_no_log', False):
- continue
- clean_result['results'][index] = dict(
- censored="the output has been hidden due to the fact that"
- " 'no_log: true' was specified for this result")
-
- self.results[-1]['tasks'][-1]['hosts'][host.name] = clean_result
+ # strip_internal_keys makes a deep copy of dict items, but
+ # not lists, so we need to create our own complete deep
+ # copy first so we don't modify the original.
+ myresult = copy.deepcopy(result._result)
+ clean_result = strip_internal_keys(myresult)
+ self.results[-1]['tasks'][-1]['hosts'][host.name] = clean_result
end_time = current_time()
self.results[-1]['tasks'][-1]['task']['duration']['end'] = end_time
self.results[-1]['play']['duration']['end'] = end_time
@@ -202,3 +189,37 @@ class CallbackModule(CallbackBase):
outfile.write('\n]\n')
v2_runner_on_unreachable = v2_runner_on_ok
+
+
+# Using 'ansible.builtin.command' instead of 'command' bypasses our
+# custom plugins, so rewrite any uses of ansible.builtin.X to just X.
+# This workaround is temporary until we remove our custom plugins.
+
+# This happens here because Ansible will load the zuul_json plugin for
+# any invocation where we care about restricting access, and this is
+# the earliest in the Ansible startup procedure we can access.
+
+# Monkepatch some PluginLoader methods to rewrite the modules it is
+# loading.
+orig_get = PluginLoader.get
+orig_find_plugin = PluginLoader.find_plugin
+
+
+def mp_get(self, name, *args, **kwargs):
+ if (name.startswith('ansible.builtin.') or
+ name.startswith('ansible.legacy.')):
+ name = name.rsplit('.', 1)[-1]
+ ret = orig_get(self, name, *args, **kwargs)
+ return ret
+
+
+def mp_find_plugin(self, name, *args, **kwargs):
+ if (name.startswith('ansible.builtin.') or
+ name.startswith('ansible.legacy.')):
+ name = name.rsplit('.', 1)[-1]
+ ret = orig_find_plugin(self, name, *args, **kwargs)
+ return ret
+
+
+PluginLoader.get = mp_get
+PluginLoader.find_plugin = mp_find_plugin
diff --git a/zuul/ansible/base/callback/zuul_stream.py b/zuul/ansible/base/callback/zuul_stream.py
index be407c03d..b5c14691b 100644
--- a/zuul/ansible/base/callback/zuul_stream.py
+++ b/zuul/ansible/base/callback/zuul_stream.py
@@ -43,10 +43,16 @@ import threading
import time
from ansible.plugins.callback import default
+from ansible.module_utils._text import to_text
from zuul.ansible import paths
from zuul.ansible import logconfig
+LOG_STREAM_VERSION = 0
+
+# This is intended to be only used for testing where we change the
+# port so we can run another instance that doesn't conflict with one
+# setup by the test environment
LOG_STREAM_PORT = int(os.environ.get("ZUUL_CONSOLE_PORT", 19885))
@@ -103,6 +109,7 @@ class CallbackModule(default.CallbackModule):
self._items_done = False
self._deferred_result = None
self._playbook_name = None
+ self._zuul_console_version = 0
def configure_logger(self):
# ansible appends timestamp, user and pid to the log lines emitted
@@ -119,6 +126,21 @@ class CallbackModule(default.CallbackModule):
self._logger = logging.getLogger('zuul.executor.ansible')
def _log(self, msg, ts=None, job=True, executor=False, debug=False):
+ # With the default "linear" strategy (and likely others),
+ # Ansible will send the on_task_start callback, and then fork
+ # a worker process to execute that task. Since we spawn a
+ # thread in the on_task_start callback, we can end up emitting
+ # a log message in this method while Ansible is forking. If a
+ # forked process inherits a Python file object (i.e., stdout)
+ # that is locked by a thread that doesn't exist in the fork
+ # (i.e., this one), it can deadlock when trying to flush the
+ # file object. To minimize the chances of that happening, we
+ # should avoid using _display outside the main thread.
+ # Therefore:
+
+ # Do not set executor=True from any calls from a thread
+ # spawned in this callback.
+
msg = msg.rstrip()
if job:
now = ts or datetime.datetime.now()
@@ -129,9 +151,7 @@ class CallbackModule(default.CallbackModule):
else:
self._display.display(msg)
- def _read_log(self, host, ip, port, log_id, task_name, hosts):
- self._log("[%s] Starting to log %s for task %s"
- % (host, log_id, task_name), job=False, executor=True)
+ def _read_log_connect(self, host, ip, port):
logger_retries = 0
while True:
try:
@@ -141,49 +161,85 @@ class CallbackModule(default.CallbackModule):
# logs continously. Without this we can easily trip the 5
# second timeout.
s.settimeout(None)
+ return s
except socket.timeout:
- self._log(
- "Timeout exception waiting for the logger. "
- "Please check connectivity to [%s:%s]"
- % (ip, port), executor=True)
self._log_streamline(
"localhost",
"Timeout exception waiting for the logger. "
"Please check connectivity to [%s:%s]"
% (ip, port))
- return
+ return None
except Exception:
if logger_retries % 10 == 0:
- self._log("[%s] Waiting on logger" % host,
- executor=True, debug=True)
+ self._log("[%s] Waiting on logger" % host)
logger_retries += 1
time.sleep(0.1)
continue
- msg = "%s\n" % log_id
- s.send(msg.encode("utf-8"))
- buff = s.recv(4096)
- buffering = True
- while buffering:
- if b'\n' in buff:
- (line, buff) = buff.split(b'\n', 1)
- # We can potentially get binary data here. In order to
- # being able to handle that use the backslashreplace
- # error handling method. This decodes unknown utf-8
- # code points to escape sequences which exactly represent
- # the correct data without throwing a decoding exception.
- done = self._log_streamline(
- host, line.decode("utf-8", "backslashreplace"))
- if done:
- return
+
+ def _read_log(self, host, ip, port, log_id, task_name, hosts):
+ s = self._read_log_connect(host, ip, port)
+ if s is None:
+ # Can't connect; _read_log_connect() already logged an
+ # error for us, just bail
+ return
+
+ # Find out what version we are running against
+ s.send(f'v:{LOG_STREAM_VERSION}\n'.encode('utf-8'))
+ buff = s.recv(1024).decode('utf-8').strip()
+
+ # NOTE(ianw) 2022-07-21 : zuul_console from < 6.3.0 do not
+ # understand this protocol. They will assume the send
+ # above is a log request and send back the not found
+ # message in a loop. So to handle this we disconnect and
+ # reconnect. When we decide to remove this, we can remove
+ # anything in the "version 0" path.
+ if buff == '[Zuul] Log not found':
+ s.close()
+ s = self._read_log_connect(host, ip, port)
+ if s is None:
+ return
+ else:
+ self._zuul_console_version = int(buff)
+
+ if self._zuul_console_version >= 1:
+ msg = 's:%s\n' % log_id
+ else:
+ msg = '%s\n' % log_id
+
+ s.send(msg.encode("utf-8"))
+ buff = s.recv(4096)
+ buffering = True
+ while buffering:
+ if b'\n' in buff:
+ (line, buff) = buff.split(b'\n', 1)
+ # We can potentially get binary data here. In order to
+ # being able to handle that use the backslashreplace
+ # error handling method. This decodes unknown utf-8
+ # code points to escape sequences which exactly represent
+ # the correct data without throwing a decoding exception.
+ done = self._log_streamline(
+ host, line.decode("utf-8", "backslashreplace"))
+ if done:
+ if self._zuul_console_version > 0:
+ try:
+ # reestablish connection and tell console to
+ # clean up
+ s = self._read_log_connect(host, ip, port)
+ s.send(f'f:{log_id}\n'.encode('utf-8'))
+ s.close()
+ except Exception:
+ # Don't worry if this fails
+ pass
+ return
+ else:
+ more = s.recv(4096)
+ if not more:
+ buffering = False
else:
- more = s.recv(4096)
- if not more:
- buffering = False
- else:
- buff += more
- if buff:
- self._log_streamline(
- host, buff.decode("utf-8", "backslashreplace"))
+ buff += more
+ if buff:
+ self._log_streamline(
+ host, buff.decode("utf-8", "backslashreplace"))
def _log_streamline(self, host, line):
if "[Zuul] Task exit code" in line:
@@ -255,24 +311,28 @@ class CallbackModule(default.CallbackModule):
else:
task_name = task.get_name().strip()
- if task.action in ('command', 'shell'):
+ if task.loop:
+ # Don't try to stream from loops
+ return
+ if task.async_val:
+ # Don't try to stream from async tasks
+ return
+ if task.action in ('command', 'shell',
+ 'ansible.builtin.command', 'ansible.builtin.shell'):
play_vars = self._play._variable_manager._hostvars
hosts = self._get_task_hosts(task)
for host, inventory_hostname in hosts:
port = LOG_STREAM_PORT
- if host in ('localhost', '127.0.0.1'):
+ if (host in ('localhost', '127.0.0.1')):
# Don't try to stream from localhost
continue
ip = play_vars[host].get(
'ansible_host', play_vars[host].get(
'ansible_inventory_host'))
- if ip in ('localhost', '127.0.0.1'):
+ if (ip in ('localhost', '127.0.0.1')):
# Don't try to stream from localhost
continue
- if task.loop:
- # Don't try to stream from loops
- continue
if play_vars[host].get('ansible_connection') in ('winrm',):
# The winrm connections don't support streaming for now
continue
@@ -287,8 +347,20 @@ class CallbackModule(default.CallbackModule):
continue
ip = '127.0.0.1'
- log_id = "%s-%s" % (
- task._uuid, paths._sanitize_filename(inventory_hostname))
+ # Get a unique key for ZUUL_LOG_ID_MAP. Use it to add
+ # a counter to the log id so that if we run the same
+ # task more than once, we get a unique log file. See
+ # comments in paths.py for details.
+ log_host = paths._sanitize_filename(inventory_hostname)
+ key = "%s-%s" % (self._task._uuid, log_host)
+ count = paths.ZUUL_LOG_ID_MAP.get(key, 0) + 1
+ paths.ZUUL_LOG_ID_MAP[key] = count
+ log_id = "%s-%s-%s" % (
+ self._task._uuid, count, log_host)
+
+ self._log("[%s] Starting to log %s for task %s"
+ % (host, log_id, task_name),
+ job=False, executor=True)
streamer = threading.Thread(
target=self._read_log, args=(
host, ip, port, log_id, task_name, hosts))
@@ -309,7 +381,7 @@ class CallbackModule(default.CallbackModule):
streamer.join(30)
if streamer.is_alive():
msg = "[Zuul] Log Stream did not terminate"
- self._log(msg, job=True, executor=True)
+ self._log(msg)
self._streamers_stop = False
def _process_result_for_localhost(self, result, is_task=True):
@@ -432,8 +504,7 @@ class CallbackModule(default.CallbackModule):
if result._task.loop and 'results' in result_dict:
# items have their own events
pass
-
- elif result_dict.get('msg', '').startswith('MODULE FAILURE'):
+ elif to_text(result_dict.get('msg', '')).startswith('MODULE FAILURE'):
self._log_module_failure(result, result_dict)
elif result._task.action == 'debug':
# this is a debug statement, handle it special
@@ -452,7 +523,7 @@ class CallbackModule(default.CallbackModule):
# user provided. Note that msg may be a multi line block quote
# so we handle that here as well.
if keyname == 'msg':
- msg_lines = result_dict['msg'].rstrip().split('\n')
+ msg_lines = to_text(result_dict['msg']).rstrip().split('\n')
for msg_line in msg_lines:
self._log(msg=msg_line)
else:
@@ -475,10 +546,18 @@ class CallbackModule(default.CallbackModule):
elif result_dict.get('msg') == 'All items completed':
self._log_message(result, result_dict['msg'])
else:
- self._log_message(
- result,
- "Runtime: {delta}".format(
- **result_dict))
+ if 'delta' in result_dict:
+ self._log_message(
+ result,
+ "Runtime: {delta}".format(
+ **result_dict))
+ else:
+ # NOTE(ianw) 2022-08-24 : *Fairly* sure that you only
+ # fall into here when the call actually fails (and has
+ # not start/end time), but it is ignored by
+ # failed_when matching.
+ self._log_message(result, msg='ERROR (ignored)',
+ result_dict=result_dict)
def v2_runner_item_on_ok(self, result):
result_dict = dict(result._result)
@@ -489,7 +568,12 @@ class CallbackModule(default.CallbackModule):
else:
status = 'ok'
- if result_dict.get('msg', '').startswith('MODULE FAILURE'):
+ # This fallback may not be strictly necessary. 'item' is the
+ # default and we'll avoid problems in the common case if ansible
+ # changes.
+ loop_var = result_dict.get('ansible_loop_var', 'item')
+
+ if to_text(result_dict.get('msg', '')).startswith('MODULE FAILURE'):
self._log_module_failure(result, result_dict)
elif result._task.action not in ('command', 'shell',
'win_command', 'win_shell'):
@@ -499,7 +583,7 @@ class CallbackModule(default.CallbackModule):
else:
self._log_message(
result=result,
- msg=json.dumps(result_dict['item'],
+ msg=json.dumps(result_dict[loop_var],
indent=2, sort_keys=True),
status=status)
else:
@@ -508,10 +592,12 @@ class CallbackModule(default.CallbackModule):
hostname = self._get_hostname(result)
self._log("%s | %s " % (hostname, line))
- if isinstance(result_dict['item'], str):
+ if isinstance(result_dict[loop_var], str):
self._log_message(
result,
- "Item: {item} Runtime: {delta}".format(**result_dict))
+ "Item: {loop_var} Runtime: {delta}".format(
+ loop_var=result_dict[loop_var],
+ delta=result_dict['delta']))
else:
self._log_message(
result,
@@ -525,13 +611,18 @@ class CallbackModule(default.CallbackModule):
result_dict = dict(result._result)
self._process_result_for_localhost(result, is_task=False)
- if result_dict.get('msg', '').startswith('MODULE FAILURE'):
+ # This fallback may not be strictly necessary. 'item' is the
+ # default and we'll avoid problems in the common case if ansible
+ # changes.
+ loop_var = result_dict.get('ansible_loop_var', 'item')
+
+ if to_text(result_dict.get('msg', '')).startswith('MODULE FAILURE'):
self._log_module_failure(result, result_dict)
elif result._task.action not in ('command', 'shell',
'win_command', 'win_shell'):
self._log_message(
result=result,
- msg="Item: {item}".format(item=result_dict['item']),
+ msg="Item: {loop_var}".format(loop_var=result_dict[loop_var]),
status='ERROR',
result_dict=result_dict)
else:
@@ -542,7 +633,8 @@ class CallbackModule(default.CallbackModule):
# self._log("Result: %s" % (result_dict))
self._log_message(
- result, "Item: {item} Result: {rc}".format(**result_dict))
+ result, "Item: {loop_var} Result: {rc}".format(
+ loop_var=result_dict[loop_var], rc=result_dict['rc']))
if self._deferred_result:
self._process_deferred(result)
@@ -657,7 +749,13 @@ class CallbackModule(default.CallbackModule):
msg = result_dict['msg']
result_dict = None
if msg:
- msg_lines = msg.rstrip().split('\n')
+ # ensure msg is a string; e.g.
+ #
+ # debug:
+ # msg: '{{ var }}'
+ #
+ # may not be!
+ msg_lines = to_text(msg).rstrip().split('\n')
if len(msg_lines) > 1:
self._log("{host} | {status}:".format(
host=hostname, status=status))
diff --git a/zuul/ansible/base/library/command.py b/zuul/ansible/base/library/command.py
index f4511ad18..3c22849ae 100755
--- a/zuul/ansible/base/library/command.py
+++ b/zuul/ansible/base/library/command.py
@@ -3,18 +3,12 @@
# Copyright: (c) 2012, Michael DeHaan <michael.dehaan@gmail.com>, and others
# Copyright: (c) 2016, Toshio Kuratomi <tkuratomi@ansible.com>
-#
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
__metaclass__ = type
-ANSIBLE_METADATA = {'metadata_version': '1.1',
- 'status': ['stableinterface'],
- 'supported_by': 'core'}
-
-
# flake8: noqa
# This file shares a significant chunk of code with an upstream ansible
# function, run_command. The goal is to not have to fork quite so much
@@ -24,115 +18,215 @@ ANSIBLE_METADATA = {'metadata_version': '1.1',
# would remove our ability to easily have a discussion with our friends
# upstream
-DOCUMENTATION = '''
+DOCUMENTATION = r'''
---
module: command
-short_description: Executes a command on a remote node
+short_description: Execute commands on targets
version_added: historical
description:
- The C(command) module takes the command name followed by a list of space-delimited arguments.
- - The given command will be executed on all selected nodes. It will not be
- processed through the shell, so variables like C($HOME) and operations
- like C("<"), C(">"), C("|"), C(";") and C("&") will not work (use the M(shell)
- module if you need these features).
- - For Windows targets, use the M(win_command) module instead.
+ - The given command will be executed on all selected nodes.
+ - The command(s) will not be
+ processed through the shell, so variables like C($HOSTNAME) and operations
+ like C("*"), C("<"), C(">"), C("|"), C(";") and C("&") will not work.
+ Use the M(ansible.builtin.shell) module if you need these features.
+ - To create C(command) tasks that are easier to read than the ones using space-delimited
+ arguments, pass parameters using the C(args) L(task keyword,../reference_appendices/playbooks_keywords.html#task)
+ or use C(cmd) parameter.
+ - Either a free form command or C(cmd) parameter is required, see the examples.
+ - For Windows targets, use the M(ansible.windows.win_command) module instead.
+extends_documentation_fragment:
+ - action_common_attributes
+ - action_common_attributes.raw
+attributes:
+ check_mode:
+ details: while the command itself is arbitrary and cannot be subject to the check mode semantics it adds C(creates)/C(removes) options as a workaround
+ support: partial
+ diff_mode:
+ support: none
+ platform:
+ support: full
+ platforms: posix
+ raw:
+ support: full
options:
free_form:
description:
- - The command module takes a free form command to run. There is no parameter actually named 'free form'.
- See the examples!
- required: yes
+ - The command module takes a free form string as a command to run.
+ - There is no actual parameter named 'free form'.
+ cmd:
+ type: str
+ description:
+ - The command to run.
argv:
+ type: list
+ elements: str
description:
- - Allows the user to provide the command as a list vs. a string. Only the string or the list form can be
- provided, not both. One or the other must be provided.
+ - Passes the command as a list rather than a string.
+ - Use C(argv) to avoid quoting values that would otherwise be interpreted incorrectly (for example "user name").
+ - Only the string (free form) or the list (argv) form can be provided, not both. One or the other must be provided.
version_added: "2.6"
creates:
+ type: path
description:
- - A filename or (since 2.0) glob pattern, when it already exists, this step will B(not) be run.
+ - A filename or (since 2.0) glob pattern. If a matching file already exists, this step B(will not) be run.
+ - This is checked before I(removes) is checked.
removes:
+ type: path
description:
- - A filename or (since 2.0) glob pattern, when it does not exist, this step will B(not) be run.
+ - A filename or (since 2.0) glob pattern. If a matching file exists, this step B(will) be run.
+ - This is checked after I(creates) is checked.
version_added: "0.8"
chdir:
+ type: path
description:
- Change into this directory before running the command.
version_added: "0.6"
warn:
description:
- - If command_warnings are on in ansible.cfg, do not warn about this particular line if set to C(no).
+ - (deprecated) Enable or disable task warnings.
+ - This feature is deprecated and will be removed in 2.14.
+ - As of version 2.11, this option is now disabled by default.
type: bool
- default: 'yes'
+ default: no
version_added: "1.8"
stdin:
- version_added: "2.4"
description:
- Set the stdin of the command directly to the specified value.
+ type: str
+ version_added: "2.4"
+ stdin_add_newline:
+ type: bool
+ default: yes
+ description:
+ - If set to C(yes), append a newline to stdin data.
+ version_added: "2.8"
+ strip_empty_ends:
+ description:
+ - Strip empty lines from the end of stdout/stderr in result.
+ version_added: "2.8"
+ type: bool
+ default: yes
notes:
- - If you want to run a command through the shell (say you are using C(<), C(>), C(|), etc), you actually want the M(shell) module instead.
+ - If you want to run a command through the shell (say you are using C(<), C(>), C(|), and so on),
+ you actually want the M(ansible.builtin.shell) module instead.
Parsing shell metacharacters can lead to unexpected commands being executed if quoting is not done correctly so it is more secure to
use the C(command) module when possible.
- - " C(creates), C(removes), and C(chdir) can be specified after the command.
- For instance, if you only want to run a command if a certain file does not exist, use this."
- - The C(executable) parameter is removed since version 2.4. If you have a need for this parameter, use the M(shell) module instead.
- - For Windows targets, use the M(win_command) module instead.
+ - C(creates), C(removes), and C(chdir) can be specified after the command.
+ For instance, if you only want to run a command if a certain file does not exist, use this.
+ - Check mode is supported when passing C(creates) or C(removes). If running in check mode and either of these are specified, the module will
+ check for the existence of the file and report the correct changed status. If these are not supplied, the task will be skipped.
+ - The C(executable) parameter is removed since version 2.4. If you have a need for this parameter, use the M(ansible.builtin.shell) module instead.
+ - For Windows targets, use the M(ansible.windows.win_command) module instead.
+ - For rebooting systems, use the M(ansible.builtin.reboot) or M(ansible.windows.win_reboot) module.
+seealso:
+- module: ansible.builtin.raw
+- module: ansible.builtin.script
+- module: ansible.builtin.shell
+- module: ansible.windows.win_command
author:
- Ansible Core Team
- Michael DeHaan
'''
-EXAMPLES = '''
-- name: return motd to registered var
- command: cat /etc/motd
+EXAMPLES = r'''
+- name: Return motd to registered var
+ ansible.builtin.command: cat /etc/motd
register: mymotd
-- name: Run the command if the specified file does not exist.
- command: /usr/bin/make_database.sh arg1 arg2
+# free-form (string) arguments, all arguments on one line
+- name: Run command if /path/to/database does not exist (without 'args')
+ ansible.builtin.command: /usr/bin/make_database.sh db_user db_name creates=/path/to/database
+
+# free-form (string) arguments, some arguments on separate lines with the 'args' keyword
+# 'args' is a task keyword, passed at the same level as the module
+- name: Run command if /path/to/database does not exist (with 'args' keyword)
+ ansible.builtin.command: /usr/bin/make_database.sh db_user db_name
args:
creates: /path/to/database
-# You can also use the 'args' form to provide the options.
-- name: This command will change the working directory to somedir/ and will only run when /path/to/database doesn't exist.
- command: /usr/bin/make_database.sh arg1 arg2
+# 'cmd' is module parameter
+- name: Run command if /path/to/database does not exist (with 'cmd' parameter)
+ ansible.builtin.command:
+ cmd: /usr/bin/make_database.sh db_user db_name
+ creates: /path/to/database
+
+- name: Change the working directory to somedir/ and run the command as db_owner if /path/to/database does not exist
+ ansible.builtin.command: /usr/bin/make_database.sh db_user db_name
+ become: yes
+ become_user: db_owner
args:
chdir: somedir/
creates: /path/to/database
-- name: use argv to send the command as a list. Be sure to leave command empty
- command:
- args:
+# argv (list) arguments, each argument on a separate line, 'args' keyword not necessary
+# 'argv' is a parameter, indented one level from the module
+- name: Use 'argv' to send a command as a list - leave 'command' empty
+ ansible.builtin.command:
argv:
- - echo
- - testing
+ - /usr/bin/make_database.sh
+ - Username with whitespace
+ - dbname with whitespace
+ creates: /path/to/database
-- name: safely use templated variable to run command. Always use the quote filter to avoid injection issues.
- command: cat {{ myfile|quote }}
+- name: Safely use templated variable to run command. Always use the quote filter to avoid injection issues
+ ansible.builtin.command: cat {{ myfile|quote }}
register: myoutput
'''
-RETURN = '''
+RETURN = r'''
+msg:
+ description: changed
+ returned: always
+ type: bool
+ sample: True
+start:
+ description: The command execution start time.
+ returned: always
+ type: str
+ sample: '2017-09-29 22:03:48.083128'
+end:
+ description: The command execution end time.
+ returned: always
+ type: str
+ sample: '2017-09-29 22:03:48.084657'
+delta:
+ description: The command execution delta time.
+ returned: always
+ type: str
+ sample: '0:00:00.001529'
+stdout:
+ description: The command standard output.
+ returned: always
+ type: str
+ sample: 'Clustering node rabbit@slave1 with rabbit@master …'
+stderr:
+ description: The command standard error.
+ returned: always
+ type: str
+ sample: 'ls cannot access foo: No such file or directory'
cmd:
- description: the cmd that was run on the remote machine
+ description: The command executed by the task.
returned: always
type: list
sample:
- echo
- hello
-delta:
- description: cmd end time - cmd start time
+rc:
+ description: The command return code (0 means success).
returned: always
- type: string
- sample: 0:00:00.001529
-end:
- description: cmd end time
+ type: int
+ sample: 0
+stdout_lines:
+ description: The command standard output split in lines.
returned: always
- type: string
- sample: '2017-09-29 22:03:48.084657'
-start:
- description: cmd start time
+ type: list
+ sample: [u'Clustering node rabbit@slave1 with rabbit@master …']
+stderr_lines:
+ description: The command standard error split in lines.
returned: always
- type: string
- sample: '2017-09-29 22:03:48.083128'
+ type: list
+ sample: [u'ls cannot access foo: No such file or directory', u'ls …']
'''
import datetime
@@ -141,6 +235,8 @@ import os
import shlex
from ansible.module_utils.basic import AnsibleModule
+from ansible.module_utils._text import to_native, to_bytes, to_text
+from ansible.module_utils.common.collections import is_iterable
# Imports needed for Zuul things
import re
@@ -157,7 +253,6 @@ from ansible.module_utils.six import (
text_type,
)
from ansible.module_utils.six.moves import shlex_quote
-from ansible.module_utils._text import to_native, to_bytes, to_text
LOG_STREAM_FILE = '/tmp/console-{log_uuid}.log'
@@ -168,7 +263,15 @@ _log_lines = []
class Console(object):
def __init__(self, log_uuid):
- self.logfile_name = LOG_STREAM_FILE.format(log_uuid=log_uuid)
+ # The streamer currently will not ask us for output from
+ # loops. This flag uuid was set in the action plugin if this
+ # call was part of a loop. This avoids us leaving behind
+ # files that will never be read, but also means no other
+ # special-casing for any of this path.
+ if log_uuid == 'in-loop-ignore':
+ self.logfile_name = os.devnull
+ else:
+ self.logfile_name = LOG_STREAM_FILE.format(log_uuid=log_uuid)
def __enter__(self):
self.logfile = open(self.logfile_name, 'ab', buffering=0)
@@ -211,7 +314,8 @@ def follow(fd, log_uuid):
# Taken from ansible/module_utils/basic.py ... forking the method for now
# so that we can dive in and figure out how to make appropriate hook points
def zuul_run_command(self, args, zuul_log_id, check_rc=False, close_fds=True, executable=None, data=None, binary_data=False, path_prefix=None, cwd=None,
- use_unsafe_shell=False, prompt_regex=None, environ_update=None, umask=None, encoding='utf-8', errors='surrogate_or_strict'):
+ use_unsafe_shell=False, prompt_regex=None, environ_update=None, umask=None, encoding='utf-8', errors='surrogate_or_strict',
+ expand_user_and_vars=True, pass_fds=None, before_communicate_callback=None, ignore_invalid_cwd=True):
'''
Execute a command, returns rc, stdout, and stderr.
@@ -226,14 +330,14 @@ def zuul_run_command(self, args, zuul_log_id, check_rc=False, close_fds=True, ex
:kw data: If given, information to write to the stdin of the command
:kw binary_data: If False, append a newline to the data. Default False
:kw path_prefix: If given, additional path to find the command in.
- This adds to the PATH environment vairable so helper commands in
+ This adds to the PATH environment variable so helper commands in
the same directory can also be found
:kw cwd: If given, working directory to run the command inside
:kw use_unsafe_shell: See `args` parameter. Default False
:kw prompt_regex: Regex string (not a compiled regex) which can be
used to detect prompts in the stdout which would otherwise cause
the execution to hang (especially if no input data is specified)
- :kw environ_update: dictionary to *update* os.environ with
+ :kw environ_update: dictionary to *update* environ variables with
:kw umask: Umask to be used when running the command. Default None
:kw encoding: Since we return native strings, on python3 we need to
know the encoding to use to transform from bytes to text. If you
@@ -249,12 +353,30 @@ def zuul_run_command(self, args, zuul_log_id, check_rc=False, close_fds=True, ex
python3 versions we support) otherwise a UnicodeError traceback
will be raised. This does not affect transformations of strings
given as args.
+ :kw expand_user_and_vars: When ``use_unsafe_shell=False`` this argument
+ dictates whether ``~`` is expanded in paths and environment variables
+ are expanded before running the command. When ``True`` a string such as
+ ``$SHELL`` will be expanded regardless of escaping. When ``False`` and
+ ``use_unsafe_shell=False`` no path or variable expansion will be done.
+ :kw pass_fds: When running on Python 3 this argument
+ dictates which file descriptors should be passed
+ to an underlying ``Popen`` constructor. On Python 2, this will
+ set ``close_fds`` to False.
+ :kw before_communicate_callback: This function will be called
+ after ``Popen`` object will be created
+ but before communicating to the process.
+ (``Popen`` object will be passed to callback as a first argument)
+ :kw ignore_invalid_cwd: This flag indicates whether an invalid ``cwd``
+ (non-existent or not a directory) should be ignored or should raise
+ an exception.
:returns: A 3-tuple of return code (integer), stdout (native string),
and stderr (native string). On python2, stdout and stderr are both
byte strings. On python3, stdout and stderr are text strings converted
according to the encoding and errors parameters. If you want byte
strings on python3, use encoding=None to turn decoding to text off.
'''
+ # used by clean args later on
+ self._clean = None
if not isinstance(args, (list, binary_type, text_type)):
msg = "Argument 'args' to run_command must be list or string"
@@ -265,13 +387,16 @@ def zuul_run_command(self, args, zuul_log_id, check_rc=False, close_fds=True, ex
# stringify args for unsafe/direct shell usage
if isinstance(args, list):
- args = " ".join([shlex_quote(x) for x in args])
+ args = b" ".join([to_bytes(shlex_quote(x), errors='surrogate_or_strict') for x in args])
+ else:
+ args = to_bytes(args, errors='surrogate_or_strict')
# not set explicitly, check if set by controller
if executable:
- args = [executable, '-c', args]
+ executable = to_bytes(executable, errors='surrogate_or_strict')
+ args = [executable, b'-c', args]
elif self._shell not in (None, '/bin/sh'):
- args = [self._shell, '-c', args]
+ args = [to_bytes(self._shell, errors='surrogate_or_strict'), b'-c', args]
else:
shell = True
else:
@@ -285,8 +410,11 @@ def zuul_run_command(self, args, zuul_log_id, check_rc=False, close_fds=True, ex
args = to_text(args, errors='surrogateescape')
args = shlex.split(args)
- # expand shellisms
- args = [os.path.expanduser(os.path.expandvars(x)) for x in args if x is not None]
+ # expand ``~`` in paths, and all environment vars
+ if expand_user_and_vars:
+ args = [to_bytes(os.path.expanduser(os.path.expandvars(x)), errors='surrogate_or_strict') for x in args if x is not None]
+ else:
+ args = [to_bytes(x, errors='surrogate_or_strict') for x in args if x is not None]
prompt_re = None
if prompt_regex:
@@ -304,69 +432,39 @@ def zuul_run_command(self, args, zuul_log_id, check_rc=False, close_fds=True, ex
msg = None
st_in = None
- # Manipulate the environ we'll send to the new process
- old_env_vals = {}
+ env = os.environ.copy()
# We can set this from both an attribute and per call
- for key, val in self.run_command_environ_update.items():
- old_env_vals[key] = os.environ.get(key, None)
- os.environ[key] = val
- if environ_update:
- for key, val in environ_update.items():
- old_env_vals[key] = os.environ.get(key, None)
- os.environ[key] = val
+ env.update(self.run_command_environ_update or {})
+ env.update(environ_update or {})
if path_prefix:
- old_env_vals['PATH'] = os.environ['PATH']
- os.environ['PATH'] = "%s:%s" % (path_prefix, os.environ['PATH'])
+ path = env.get('PATH', '')
+ if path:
+ env['PATH'] = "%s:%s" % (path_prefix, path)
+ else:
+ env['PATH'] = path_prefix
- # If using test-module and explode, the remote lib path will resemble ...
+ # If using test-module.py and explode, the remote lib path will resemble:
# /tmp/test_module_scratch/debug_dir/ansible/module_utils/basic.py
- # If using ansible or ansible-playbook with a remote system ...
+ # If using ansible or ansible-playbook with a remote system:
# /tmp/ansible_vmweLQ/ansible_modlib.zip/ansible/module_utils/basic.py
# Clean out python paths set by ansiballz
- if 'PYTHONPATH' in os.environ:
- pypaths = os.environ['PYTHONPATH'].split(':')
- pypaths = [x for x in pypaths
- if not x.endswith('/ansible_modlib.zip') and
+ if 'PYTHONPATH' in env:
+ pypaths = [x for x in env['PYTHONPATH'].split(':')
+ if x and
+ not x.endswith('/ansible_modlib.zip') and
not x.endswith('/debug_dir')]
- os.environ['PYTHONPATH'] = ':'.join(pypaths)
- if not os.environ['PYTHONPATH']:
- del os.environ['PYTHONPATH']
-
- # create a printable version of the command for use
- # in reporting later, which strips out things like
- # passwords from the args list
- to_clean_args = args
- if PY2:
- if isinstance(args, text_type):
- to_clean_args = to_bytes(args)
- else:
- if isinstance(args, binary_type):
- to_clean_args = to_text(args)
- if isinstance(args, (text_type, binary_type)):
- to_clean_args = shlex.split(to_clean_args)
-
- clean_args = []
- is_passwd = False
- for arg in (to_native(a) for a in to_clean_args):
- if is_passwd:
- is_passwd = False
- clean_args.append('********')
- continue
- if PASSWD_ARG_RE.match(arg):
- sep_idx = arg.find('=')
- if sep_idx > -1:
- clean_args.append('%s=********' % arg[:sep_idx])
- continue
- else:
- is_passwd = True
- arg = heuristic_log_sanitize(arg, self.no_log_values)
- clean_args.append(arg)
- clean_args = ' '.join(shlex_quote(arg) for arg in clean_args)
+ if pypaths and any(pypaths):
+ env['PYTHONPATH'] = ':'.join(pypaths)
if data:
st_in = subprocess.PIPE
+ def preexec():
+ self._restore_signal_handlers()
+ if umask:
+ os.umask(umask)
+
# ZUUL: changed stderr to follow stdout
kwargs = dict(
executable=executable,
@@ -375,35 +473,35 @@ def zuul_run_command(self, args, zuul_log_id, check_rc=False, close_fds=True, ex
stdin=st_in,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
+ preexec_fn=preexec,
+ env=env,
)
-
- # store the pwd
- prev_dir = os.getcwd()
+ if PY3 and pass_fds:
+ kwargs["pass_fds"] = pass_fds
+ elif PY2 and pass_fds:
+ kwargs['close_fds'] = False
# make sure we're in the right working directory
- if cwd and os.path.isdir(cwd):
- cwd = os.path.abspath(os.path.expanduser(cwd))
- kwargs['cwd'] = cwd
- try:
- os.chdir(cwd)
- except (OSError, IOError) as e:
- self.fail_json(rc=e.errno, msg="Could not open %s, %s" % (cwd, to_native(e)),
- exception=traceback.format_exc())
-
- old_umask = None
- if umask:
- old_umask = os.umask(umask)
+ if cwd:
+ cwd = to_bytes(os.path.abspath(os.path.expanduser(cwd)), errors='surrogate_or_strict')
+ if os.path.isdir(cwd):
+ kwargs['cwd'] = cwd
+ elif not ignore_invalid_cwd:
+ self.fail_json(msg="Provided cwd is not a valid directory: %s" % cwd)
t = None
fail_json_kwargs = None
try:
if self._debug:
- self.log('Executing: ' + clean_args)
+ self.log('Executing: ' + self._clean_args(args))
# ZUUL: Replaced the execution loop with the zuul_runner run function
cmd = subprocess.Popen(args, **kwargs)
+ if before_communicate_callback:
+ before_communicate_callback(cmd)
+
if self.no_log:
t = None
else:
@@ -413,15 +511,6 @@ def zuul_run_command(self, args, zuul_log_id, check_rc=False, close_fds=True, ex
# ZUUL: Our log thread will catch the output so don't do that here.
- # # the communication logic here is essentially taken from that
- # # of the _communicate() function in ssh.py
- #
- # stdout = b('')
- # stderr = b('')
- #
- # # ZUUL: stderr follows stdout
- # rpipes = [cmd.stdout]
-
if data:
if not binary_data:
data += '\n'
@@ -430,35 +519,6 @@ def zuul_run_command(self, args, zuul_log_id, check_rc=False, close_fds=True, ex
cmd.stdin.write(data)
cmd.stdin.close()
- # while True:
- # rfds, wfds, efds = select.select(rpipes, [], rpipes, 1)
- # stdout += self._read_from_pipes(rpipes, rfds, cmd.stdout)
- #
- # # ZUUL: stderr follows stdout
- # # stderr += self._read_from_pipes(rpipes, rfds, cmd.stderr)
- #
- # # if we're checking for prompts, do it now
- # if prompt_re:
- # if prompt_re.search(stdout) and not data:
- # if encoding:
- # stdout = to_native(stdout, encoding=encoding, errors=errors)
- # else:
- # stdout = stdout
- # return (257, stdout, "A prompt was encountered while running a command, but no input data was specified")
- # # only break out if no pipes are left to read or
- # # the pipes are completely read and
- # # the process is terminated
- # if (not rpipes or not rfds) and cmd.poll() is not None:
- # break
- # # No pipes are left to read but process is not yet terminated
- # # Only then it is safe to wait for the process to be finished
- # # NOTE: Actually cmd.poll() is always None here if rpipes is empty
- # elif not rpipes and cmd.poll() is None:
- # cmd.wait()
- # # The process is terminated. Since no pipes to read from are
- # # left, there is no need to call select() again.
- # break
-
# ZUUL: If the console log follow thread *is* stuck in readline,
# we can't close stdout (attempting to do so raises an
# exception) , so this is disabled.
@@ -467,10 +527,10 @@ def zuul_run_command(self, args, zuul_log_id, check_rc=False, close_fds=True, ex
rc = cmd.wait()
- # Give the thread that is writing the console log up to 10 seconds
- # to catch up and exit. If it hasn't done so by then, it is very
- # likely stuck in readline() because it spawed a child that is
- # holding stdout or stderr open.
+ # ZUUL: Give the thread that is writing the console log up to
+ # 10 seconds to catch up and exit. If it hasn't done so by
+ # then, it is very likely stuck in readline() because it
+ # spawed a child that is holding stdout or stderr open.
if t:
t.join(10)
with Console(zuul_log_id) as console:
@@ -485,49 +545,36 @@ def zuul_run_command(self, args, zuul_log_id, check_rc=False, close_fds=True, ex
stderr = b('')
except (OSError, IOError) as e:
- self.log("Error Executing CMD:%s Exception:%s" % (clean_args, to_native(e)))
+ self.log("Error Executing CMD:%s Exception:%s" % (self._clean_args(args), to_native(e)))
# ZUUL: store fail_json_kwargs and fail later in finally
- fail_json_kwargs = dict(rc=e.errno, msg=to_native(e), cmd=clean_args)
+ fail_json_kwargs = dict(rc=e.errno, stdout=b'', stderr=b'', msg=to_native(e), cmd=self._clean_args(args))
except Exception as e:
- self.log("Error Executing CMD:%s Exception:%s" % (clean_args, to_native(traceback.format_exc())))
+ self.log("Error Executing CMD:%s Exception:%s" % (self._clean_args(args), to_native(traceback.format_exc())))
# ZUUL: store fail_json_kwargs and fail later in finally
- fail_json_kwargs = dict(rc=257, msg=to_native(e), exception=traceback.format_exc(), cmd=clean_args)
+ fail_json_kwargs = dict(rc=257, stdout=b'', stderr=b'', msg=to_native(e), exception=traceback.format_exc(), cmd=self._clean_args(args))
finally:
- if t:
- with Console(zuul_log_id) as console:
- if t.is_alive():
- console.addLine("[Zuul] standard output/error still open "
- "after child exited")
- if fail_json_kwargs:
- # we hit an exception and need to use the rc from
- # fail_json_kwargs
- rc = fail_json_kwargs['rc']
+ with Console(zuul_log_id) as console:
+ if t and t.is_alive():
+ console.addLine("[Zuul] standard output/error still open "
+ "after child exited")
+ if fail_json_kwargs:
+ # we hit an exception and need to use the rc from
+ # fail_json_kwargs
+ rc = fail_json_kwargs['rc']
- console.addLine("[Zuul] Task exit code: %s\n" % rc)
+ console.addLine("[Zuul] Task exit code: %s\n" % rc)
if fail_json_kwargs:
self.fail_json(**fail_json_kwargs)
- # Restore env settings
- for key, val in old_env_vals.items():
- if val is None:
- del os.environ[key]
- else:
- os.environ[key] = val
-
- if old_umask:
- os.umask(old_umask)
-
if rc != 0 and check_rc:
msg = heuristic_log_sanitize(stderr.rstrip(), self.no_log_values)
- self.fail_json(cmd=clean_args, rc=rc, stdout=stdout, stderr=stderr, msg=msg)
-
- # reset the pwd
- os.chdir(prev_dir)
+ self.fail_json(cmd=self._clean_args(args), rc=rc, stdout=stdout, stderr=stderr, msg=msg)
if encoding is not None:
return (rc, to_native(stdout, encoding=encoding, errors=errors),
to_native(stderr, encoding=encoding, errors=errors))
+
return (rc, stdout, stderr)
@@ -547,19 +594,19 @@ def check_command(module, commandline):
command = commandline.split()[0]
command = os.path.basename(command)
- disable_suffix = "If you need to use command because {mod} is insufficient you can add" \
- " warn=False to this command task or set command_warnings=False in" \
- " ansible.cfg to get rid of this message."
+ disable_suffix = "If you need to use '{cmd}' because the {mod} module is insufficient you can add" \
+ " 'warn: false' to this command task or set 'command_warnings=False' in" \
+ " the defaults section of ansible.cfg to get rid of this message."
substitutions = {'mod': None, 'cmd': command}
if command in arguments:
- msg = "Consider using the {mod} module with {subcmd} rather than running {cmd}. " + disable_suffix
+ msg = "Consider using the {mod} module with {subcmd} rather than running '{cmd}'. " + disable_suffix
substitutions['mod'] = 'file'
substitutions['subcmd'] = arguments[command]
module.warn(msg.format(**substitutions))
if command in commands:
- msg = "Consider using the {mod} module rather than running {cmd}. " + disable_suffix
+ msg = "Consider using the {mod} module rather than running '{cmd}'. " + disable_suffix
substitutions['mod'] = commands[command]
module.warn(msg.format(**substitutions))
@@ -571,20 +618,24 @@ def main():
# the command module is the one ansible module that does not take key=value args
# hence don't copy this one if you are looking to build others!
+ # NOTE: ensure splitter.py is kept in sync for exceptions
module = AnsibleModule(
argument_spec=dict(
_raw_params=dict(),
_uses_shell=dict(type='bool', default=False),
- argv=dict(type='list'),
+ argv=dict(type='list', elements='str'),
chdir=dict(type='path'),
executable=dict(),
creates=dict(type='path'),
removes=dict(type='path'),
# The default for this really comes from the action plugin
- warn=dict(type='bool', default=True),
+ warn=dict(type='bool', default=False, removed_in_version='2.14', removed_from_collection='ansible.builtin'),
stdin=dict(required=False),
+ stdin_add_newline=dict(type='bool', default=True),
+ strip_empty_ends=dict(type='bool', default=True),
zuul_log_id=dict(type='str'),
- )
+ ),
+ supports_check_mode=True,
)
shell = module.params['_uses_shell']
chdir = module.params['chdir']
@@ -595,8 +646,13 @@ def main():
removes = module.params['removes']
warn = module.params['warn']
stdin = module.params['stdin']
+ stdin_add_newline = module.params['stdin_add_newline']
+ strip = module.params['strip_empty_ends']
zuul_log_id = module.params['zuul_log_id']
+ # we promissed these in 'always' ( _lines get autoaded on action plugin)
+ r = {'changed': False, 'stdout': '', 'stderr': '', 'rc': None, 'cmd': None, 'start': None, 'end': None, 'delta': None, 'msg': ''}
+
if not shell and executable:
module.warn("As of Ansible 2.4, the parameter 'executable' is no longer supported with the 'command' module. Not using '%s'." % executable)
executable = None
@@ -605,70 +661,92 @@ def main():
module.fail_json(rc=256, msg="zuul_log_id missing: %s" % module.params)
if (not args or args.strip() == '') and not argv:
- module.fail_json(rc=256, msg="no command given")
+ r['rc'] = 256
+ r['msg'] = "no command given"
+ module.fail_json(**r)
if args and argv:
- module.fail_json(rc=256, msg="only command or argv can be given, not both")
+ r['rc'] = 256
+ r['msg'] = "only command or argv can be given, not both"
+ module.fail_json(**r)
if not shell and args:
args = shlex.split(args)
args = args or argv
+ # All args must be strings
+ if is_iterable(args, include_strings=False):
+ args = [to_native(arg, errors='surrogate_or_strict', nonstring='simplerepr') for arg in args]
- if chdir:
- chdir = os.path.abspath(chdir)
- os.chdir(chdir)
-
- if creates:
- # do not run the command if the line contains creates=filename
- # and the filename already exists. This allows idempotence
- # of command executions.
- if glob.glob(creates):
- module.exit_json(
- cmd=args,
- stdout="skipped, since %s exists" % creates,
- changed=False,
- rc=0
- )
-
- if removes:
- # do not run the command if the line contains removes=filename
- # and the filename does not exist. This allows idempotence
- # of command executions.
- if not glob.glob(removes):
- module.exit_json(
- cmd=args,
- stdout="skipped, since %s does not exist" % removes,
- changed=False,
- rc=0
- )
-
+ r['cmd'] = args
if warn:
+ # nany telling you to use module instead!
check_command(module, args)
- startd = datetime.datetime.now()
-
- rc, out, err = zuul_run_command(module, args, zuul_log_id, executable=executable, use_unsafe_shell=shell, encoding=None, data=stdin)
+ if chdir:
+ chdir = to_bytes(chdir, errors='surrogate_or_strict')
- endd = datetime.datetime.now()
- delta = endd - startd
+ try:
+ os.chdir(chdir)
+ except (IOError, OSError) as e:
+ r['msg'] = 'Unable to change directory before execution: %s' % to_text(e)
+ module.fail_json(**r)
+
+ # check_mode partial support, since it only really works in checking creates/removes
+ if module.check_mode:
+ shoulda = "Would"
+ else:
+ shoulda = "Did"
- result = dict(
- cmd=args,
- stdout=out.rstrip(b"\r\n"),
- stderr=err.rstrip(b"\r\n"),
- rc=rc,
- start=str(startd),
- end=str(endd),
- delta=str(delta),
- changed=True,
- zuul_log_id=zuul_log_id
- )
+ # special skips for idempotence if file exists (assumes command creates)
+ if creates:
+ if glob.glob(creates):
+ r['msg'] = "%s not run command since '%s' exists" % (shoulda, creates)
+ r['stdout'] = "skipped, since %s exists" % creates # TODO: deprecate
- if rc != 0:
- module.fail_json(msg='non-zero return code', **result)
+ r['rc'] = 0
- module.exit_json(**result)
+ # special skips for idempotence if file does not exist (assumes command removes)
+ if not r['msg'] and removes:
+ if not glob.glob(removes):
+ r['msg'] = "%s not run command since '%s' does not exist" % (shoulda, removes)
+ r['stdout'] = "skipped, since %s does not exist" % removes # TODO: deprecate
+ r['rc'] = 0
+
+ if r['msg']:
+ module.exit_json(**r)
+
+ # actually executes command (or not ...)
+ if not module.check_mode:
+ r['start'] = datetime.datetime.now()
+ r['rc'], r['stdout'], r['stderr'] = zuul_run_command(module, args, zuul_log_id, executable=executable, use_unsafe_shell=shell, encoding=None,
+ data=stdin, binary_data=(not stdin_add_newline))
+ r['end'] = datetime.datetime.now()
+ else:
+ # this is partial check_mode support, since we end up skipping if we get here
+ r['rc'] = 0
+ r['msg'] = "Command would have run if not in check mode"
+ r['skipped'] = True
+
+ r['changed'] = True
+ r['zuul_log_id'] = zuul_log_id
+
+ # convert to text for jsonization and usability
+ if r['start'] is not None and r['end'] is not None:
+ # these are datetime objects, but need them as strings to pass back
+ r['delta'] = to_text(r['end'] - r['start'])
+ r['end'] = to_text(r['end'])
+ r['start'] = to_text(r['start'])
+
+ if strip:
+ r['stdout'] = to_text(r['stdout']).rstrip("\r\n")
+ r['stderr'] = to_text(r['stderr']).rstrip("\r\n")
+
+ if r['rc'] != 0:
+ r['msg'] = 'non-zero return code'
+ module.fail_json(**r)
+
+ module.exit_json(**r)
if __name__ == '__main__':
diff --git a/zuul/ansible/base/library/zuul_console.py b/zuul/ansible/base/library/zuul_console.py
index 9dffbbc3a..aa999cac1 100755
--- a/zuul/ansible/base/library/zuul_console.py
+++ b/zuul/ansible/base/library/zuul_console.py
@@ -24,6 +24,14 @@ import subprocess
import threading
import time
+# This is the version we report to the zuul_stream callback. It is
+# expected that this (zuul_console) process can be long-lived, so if
+# there are updates this ensures a later streaming callback can still
+# talk to us.
+ZUUL_CONSOLE_PROTO_VERSION = 1
+# This is the template for the file name of the log-file written out
+# by the command.py override command in the executor's Ansible
+# install.
LOG_STREAM_FILE = '/tmp/console-{log_uuid}.log'
LOG_STREAM_PORT = 19885
@@ -162,15 +170,49 @@ class Server(object):
ret = buffer.decode('utf-8')
x = ret.find('\n')
if x > 0:
- return ret[:x]
+ return ret[:x].strip()
except UnicodeDecodeError:
pass
- def handleOneConnection(self, conn):
- log_uuid = self.get_command(conn)
+ def _clean_uuid(self, log_uuid):
# use path split to make use the input isn't trying to be clever
# and construct some path like /tmp/console-/../../something
- log_uuid = os.path.split(log_uuid.rstrip())[-1]
+ return os.path.split(log_uuid)[-1]
+
+ def handleOneConnection(self, conn):
+ # V1 protocol
+ # -----------
+ # v:<ver> get version number, <ver> is remote version
+ # s:<uuid> send logs for <uuid>
+ # f:<uuid> finalise/cleanup <uuid>
+ while True:
+ command = self.get_command(conn)
+ if command.startswith('v:'):
+ # NOTE(ianw) : remote sends its version. We currently
+ # don't have anything to do with this value, so ignore
+ # for now.
+ cmd = '%s\n' % (ZUUL_CONSOLE_PROTO_VERSION)
+ conn.send(cmd.encode('utf-8'))
+ continue
+ elif command.startswith('f:'):
+ log_uuid = self._clean_uuid(command[2:])
+ try:
+ os.unlink(self.path.format(log_uuid=log_uuid))
+ except Exception:
+ # something might have cleaned /tmp
+ pass
+ continue
+ elif command.startswith('s:'):
+ log_uuid = self._clean_uuid(command[2:])
+ break
+ else:
+ # NOTE(ianw): 2022-07-21 In releases < 6.3.0 the streaming
+ # side would just send a raw uuid and nothing else; so by
+ # default assume that is what is coming in here. We can
+ # remove this fallback when we decide it is no longer
+ # necessary.
+ log_uuid = self._clean_uuid(command)
+ break
# FIXME: this won't notice disconnects until it tries to send
console = None
diff --git a/zuul/ansible/base/lookup/__init__.py b/zuul/ansible/base/lookup/__init__.py
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/__init__.py
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/_banned.py b/zuul/ansible/base/lookup/_banned.py
deleted file mode 100644
index 65708f80d..000000000
--- a/zuul/ansible/base/lookup/_banned.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2017 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-from ansible.errors import AnsibleError
-from ansible.plugins.lookup import LookupBase
-
-
-class LookupModule(LookupBase):
-
- def run(self, *args, **kwargs):
- raise AnsibleError(
- "Use of lookup modules that perform local actions on the executor"
- " is forbidden.")
diff --git a/zuul/ansible/base/lookup/_banned.pyi b/zuul/ansible/base/lookup/_banned.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/_banned.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/chef_databag.py b/zuul/ansible/base/lookup/chef_databag.py
deleted file mode 120000
index d45b9c405..000000000
--- a/zuul/ansible/base/lookup/chef_databag.py
+++ /dev/null
@@ -1 +0,0 @@
-_banned.py \ No newline at end of file
diff --git a/zuul/ansible/base/lookup/chef_databag.pyi b/zuul/ansible/base/lookup/chef_databag.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/chef_databag.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/consul_kv.py b/zuul/ansible/base/lookup/consul_kv.py
deleted file mode 120000
index d45b9c405..000000000
--- a/zuul/ansible/base/lookup/consul_kv.py
+++ /dev/null
@@ -1 +0,0 @@
-_banned.py \ No newline at end of file
diff --git a/zuul/ansible/base/lookup/consul_kv.pyi b/zuul/ansible/base/lookup/consul_kv.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/consul_kv.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/credstash.py b/zuul/ansible/base/lookup/credstash.py
deleted file mode 120000
index d45b9c405..000000000
--- a/zuul/ansible/base/lookup/credstash.py
+++ /dev/null
@@ -1 +0,0 @@
-_banned.py \ No newline at end of file
diff --git a/zuul/ansible/base/lookup/credstash.pyi b/zuul/ansible/base/lookup/credstash.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/credstash.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/csvfile.py b/zuul/ansible/base/lookup/csvfile.py
deleted file mode 100644
index 0d5136931..000000000
--- a/zuul/ansible/base/lookup/csvfile.py
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2017 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-import csv
-
-from ansible.errors import AnsibleError
-from ansible.module_utils._text import to_native
-
-from zuul.ansible import paths
-csvfile = paths._import_ansible_lookup_plugin("csvfile")
-
-
-class LookupModule(csvfile.LookupModule):
-
- def read_csv(
- self, filename, key, delimiter, encoding='utf-8',
- dflt=None, col=1):
- paths._fail_if_unsafe(filename, allow_trusted=True)
-
- # upstream csvfile read_csv does not work with python3 so
- # carry our own version.
- try:
- f = open(filename, 'r')
- creader = csv.reader(f, dialect=csv.excel, delimiter=delimiter)
-
- for row in creader:
- if row[0] == key:
- return row[int(col)]
- except Exception as e:
- raise AnsibleError("csvfile: %s" % to_native(e))
-
- return dflt
diff --git a/zuul/ansible/base/lookup/csvfile.pyi b/zuul/ansible/base/lookup/csvfile.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/csvfile.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/cyberarkpassword.py b/zuul/ansible/base/lookup/cyberarkpassword.py
deleted file mode 120000
index d45b9c405..000000000
--- a/zuul/ansible/base/lookup/cyberarkpassword.py
+++ /dev/null
@@ -1 +0,0 @@
-_banned.py \ No newline at end of file
diff --git a/zuul/ansible/base/lookup/cyberarkpassword.pyi b/zuul/ansible/base/lookup/cyberarkpassword.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/cyberarkpassword.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/dig.py b/zuul/ansible/base/lookup/dig.py
deleted file mode 120000
index d45b9c405..000000000
--- a/zuul/ansible/base/lookup/dig.py
+++ /dev/null
@@ -1 +0,0 @@
-_banned.py \ No newline at end of file
diff --git a/zuul/ansible/base/lookup/dig.pyi b/zuul/ansible/base/lookup/dig.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/dig.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/dnstxt.py b/zuul/ansible/base/lookup/dnstxt.py
deleted file mode 120000
index d45b9c405..000000000
--- a/zuul/ansible/base/lookup/dnstxt.py
+++ /dev/null
@@ -1 +0,0 @@
-_banned.py \ No newline at end of file
diff --git a/zuul/ansible/base/lookup/dnstxt.pyi b/zuul/ansible/base/lookup/dnstxt.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/dnstxt.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/env.py b/zuul/ansible/base/lookup/env.py
deleted file mode 120000
index d45b9c405..000000000
--- a/zuul/ansible/base/lookup/env.py
+++ /dev/null
@@ -1 +0,0 @@
-_banned.py \ No newline at end of file
diff --git a/zuul/ansible/base/lookup/env.pyi b/zuul/ansible/base/lookup/env.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/env.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/etcd.py b/zuul/ansible/base/lookup/etcd.py
deleted file mode 120000
index d45b9c405..000000000
--- a/zuul/ansible/base/lookup/etcd.py
+++ /dev/null
@@ -1 +0,0 @@
-_banned.py \ No newline at end of file
diff --git a/zuul/ansible/base/lookup/etcd.pyi b/zuul/ansible/base/lookup/etcd.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/etcd.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/file.py b/zuul/ansible/base/lookup/file.py
deleted file mode 100644
index 904837003..000000000
--- a/zuul/ansible/base/lookup/file.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright 2017 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-
-from zuul.ansible import paths
-file_mod = paths._import_ansible_lookup_plugin("file")
-
-
-class LookupModule(file_mod.LookupModule):
-
- def run(self, terms, variables=None, **kwargs):
- for term in terms:
- lookupfile = self.find_file_in_search_path(
- variables, 'files', term)
- paths._fail_if_unsafe(lookupfile, allow_trusted=True)
- return super(LookupModule, self).run(terms, variables, **kwargs)
diff --git a/zuul/ansible/base/lookup/file.pyi b/zuul/ansible/base/lookup/file.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/file.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/fileglob.py b/zuul/ansible/base/lookup/fileglob.py
deleted file mode 100644
index 8d6b88120..000000000
--- a/zuul/ansible/base/lookup/fileglob.py
+++ /dev/null
@@ -1,45 +0,0 @@
-# (c) 2012, Michael DeHaan <michael.dehaan@gmail.com>
-# Copyright 2017 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-# Forked from lib/ansible/plugins/lookup/fileglob.py in ansible
-
-import os
-import glob
-
-from zuul.ansible import paths
-
-from ansible.plugins.lookup import LookupBase
-from ansible.module_utils._text import to_bytes, to_text
-
-
-class LookupModule(LookupBase):
-
- def run(self, terms, variables=None, **kwargs):
-
- ret = []
- for term in terms:
- term_file = os.path.basename(term)
- dwimmed_path = self.find_file_in_search_path(
- variables, 'files', os.path.dirname(term))
- if dwimmed_path:
- paths._fail_if_unsafe(dwimmed_path, allow_trusted=True)
- globbed = glob.glob(to_bytes(
- os.path.join(dwimmed_path, term_file),
- errors='surrogate_or_strict'))
- ret.extend(
- to_text(g, errors='surrogate_or_strict')
- for g in globbed if os.path.isfile(g))
- return ret
diff --git a/zuul/ansible/base/lookup/fileglob.pyi b/zuul/ansible/base/lookup/fileglob.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/fileglob.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/filetree.py b/zuul/ansible/base/lookup/filetree.py
deleted file mode 100644
index 490dc384c..000000000
--- a/zuul/ansible/base/lookup/filetree.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2017 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-import os
-
-from zuul.ansible import paths
-filetree = paths._import_ansible_lookup_plugin("filetree")
-
-
-class LookupModule(filetree.LookupModule):
-
- def run(self, terms, variables=None, **kwargs):
- basedir = self.get_basedir(variables)
- for term in terms:
- term_file = os.path.basename(term)
- dwimmed_path = self._loader.path_dwim_relative(
- basedir, 'files', os.path.dirname(term))
- path = os.path.join(dwimmed_path, term_file)
- paths._fail_if_unsafe(path, allow_trusted=True)
- return super(LookupModule, self).run(terms, variables, **kwargs)
diff --git a/zuul/ansible/base/lookup/filetree.pyi b/zuul/ansible/base/lookup/filetree.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/filetree.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/first_found.py b/zuul/ansible/base/lookup/first_found.py
deleted file mode 100644
index 264296ebf..000000000
--- a/zuul/ansible/base/lookup/first_found.py
+++ /dev/null
@@ -1,201 +0,0 @@
-# (c) 2013, seth vidal <skvidal@fedoraproject.org> red hat, inc
-# Copyright 2017 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-# take a list of files and (optionally) a list of paths
-# return the first existing file found in the paths
-# [file1, file2, file3], [path1, path2, path3]
-# search order is:
-# path1/file1
-# path1/file2
-# path1/file3
-# path2/file1
-# path2/file2
-# path2/file3
-# path3/file1
-# path3/file2
-# path3/file3
-
-# first file found with os.path.exists() is returned
-# no file matches raises ansibleerror
-# EXAMPLES
-# - name: copy first existing file found to /some/file
-# action: copy src=$item dest=/some/file
-# with_first_found:
-# - files: foo ${inventory_hostname} bar
-# paths: /tmp/production /tmp/staging
-
-# that will look for files in this order:
-# /tmp/production/foo
-# ${inventory_hostname}
-# bar
-# /tmp/staging/foo
-# ${inventory_hostname}
-# bar
-
-# - name: copy first existing file found to /some/file
-# action: copy src=$item dest=/some/file
-# with_first_found:
-# - files: /some/place/foo ${inventory_hostname} /some/place/else
-
-# that will look for files in this order:
-# /some/place/foo
-# $relative_path/${inventory_hostname}
-# /some/place/else
-
-# example - including tasks:
-# tasks:
-# - include: $item
-# with_first_found:
-# - files: generic
-# paths: tasks/staging tasks/production
-# this will include the tasks in the file generic where it is found first
-# (staging or production)
-
-# example simple file lists
-# tasks:
-# - name: first found file
-# action: copy src=$item dest=/etc/file.cfg
-# with_first_found:
-# - files: foo.${inventory_hostname} foo
-
-
-# example skipping if no matched files
-# First_found also offers the ability to control whether or not failing
-# to find a file returns an error or not
-#
-# - name: first found file - or skip
-# action: copy src=$item dest=/etc/file.cfg
-# with_first_found:
-# - files: foo.${inventory_hostname}
-# skip: true
-
-# example a role with default configuration and configuration per host
-# you can set multiple terms with their own files and paths to look through.
-# consider a role that sets some configuration per host falling back on a
-# default config.
-#
-# - name: some configuration template
-# template: src={{ item }} dest=/etc/file.cfg mode=0444 owner=root group=root
-# with_first_found:
-# - files:
-# - ${inventory_hostname}/etc/file.cfg
-# paths:
-# - ../../../templates.overwrites
-# - ../../../templates
-# - files:
-# - etc/file.cfg
-# paths:
-# - templates
-
-# the above will return an empty list if the files cannot be found at all
-# if skip is unspecificed or if it is set to false then it will return a list
-# error which can be caught bye ignore_errors: true for that action.
-
-# finally - if you want you can use it, in place to replace
-# first_available_file:
-# you simply cannot use the - files, path or skip options. simply replace
-# first_available_file with with_first_found and leave the file listing in
-# place
-#
-#
-# - name: with_first_found like first_available_file
-# action: copy src=$item dest=/tmp/faftest
-# with_first_found:
-# - ../files/foo
-# - ../files/bar
-# - ../files/baz
-# ignore_errors: true
-
-import os
-
-from jinja2.exceptions import UndefinedError
-
-from ansible.constants import mk_boolean as boolean
-from ansible.errors import AnsibleLookupError
-from ansible.errors import AnsibleUndefinedVariable
-from ansible.module_utils.six import string_types
-from ansible.plugins.lookup import LookupBase
-
-from zuul.ansible import paths as zuul_paths
-
-
-class LookupModule(LookupBase):
-
- def run(self, terms, variables, **kwargs):
-
- anydict = False
- skip = False
-
- for term in terms:
- if isinstance(term, dict):
- anydict = True
-
- total_search = []
- if anydict:
- for term in terms:
- if isinstance(term, dict):
- files = term.get('files', [])
- paths = term.get('paths', [])
- skip = boolean(term.get('skip', False))
-
- filelist = files
- if isinstance(files, string_types):
- files = files.replace(',', ' ')
- files = files.replace(';', ' ')
- filelist = files.split(' ')
-
- pathlist = paths
- if paths:
- if isinstance(paths, string_types):
- paths = paths.replace(',', ' ')
- paths = paths.replace(':', ' ')
- paths = paths.replace(';', ' ')
- pathlist = paths.split(' ')
-
- if not pathlist:
- total_search = filelist
- else:
- for path in pathlist:
- for fn in filelist:
- f = os.path.join(path, fn)
- total_search.append(f)
- else:
- total_search.append(term)
- else:
- total_search = self._flatten(terms)
-
- for fn in total_search:
- zuul_paths._fail_if_unsafe(fn, allow_trusted=True)
- try:
- fn = self._templar.template(fn)
- except (AnsibleUndefinedVariable, UndefinedError):
- continue
-
- # get subdir if set by task executor, default to files otherwise
- subdir = getattr(self, '_subdir', 'files')
- path = None
- path = self.find_file_in_search_path(
- variables, subdir, fn, ignore_missing=True)
- if path is not None:
- return [path]
- else:
- if skip:
- return []
- else:
- raise AnsibleLookupError(
- "No file was found when using with_first_found. Use the"
- " 'skip: true' option to allow this task to be skipped if"
- " no files are found")
diff --git a/zuul/ansible/base/lookup/first_found.pyi b/zuul/ansible/base/lookup/first_found.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/first_found.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/hashi_vault.py b/zuul/ansible/base/lookup/hashi_vault.py
deleted file mode 120000
index d45b9c405..000000000
--- a/zuul/ansible/base/lookup/hashi_vault.py
+++ /dev/null
@@ -1 +0,0 @@
-_banned.py \ No newline at end of file
diff --git a/zuul/ansible/base/lookup/hashi_vault.pyi b/zuul/ansible/base/lookup/hashi_vault.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/hashi_vault.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/hiera.py b/zuul/ansible/base/lookup/hiera.py
deleted file mode 120000
index d45b9c405..000000000
--- a/zuul/ansible/base/lookup/hiera.py
+++ /dev/null
@@ -1 +0,0 @@
-_banned.py \ No newline at end of file
diff --git a/zuul/ansible/base/lookup/hiera.pyi b/zuul/ansible/base/lookup/hiera.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/hiera.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/ini.py b/zuul/ansible/base/lookup/ini.py
deleted file mode 100644
index 83d7b144a..000000000
--- a/zuul/ansible/base/lookup/ini.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2017 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-
-from zuul.ansible import paths
-ini = paths._import_ansible_lookup_plugin("ini")
-
-
-class LookupModule(ini.LookupModule):
-
- def read_properties(self, filename, *args, **kwargs):
- paths._fail_if_unsafe(filename, allow_trusted=True)
- return super(LookupModule, self).read_properties(
- filename, *args, **kwargs)
-
- def read_ini(self, filename, *args, **kwargs):
- paths._fail_if_unsafe(filename, allow_trusted=True)
- return super(LookupModule, self).read_ini(
- filename, *args, **kwargs)
diff --git a/zuul/ansible/base/lookup/ini.pyi b/zuul/ansible/base/lookup/ini.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/ini.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/keyring.py b/zuul/ansible/base/lookup/keyring.py
deleted file mode 120000
index d45b9c405..000000000
--- a/zuul/ansible/base/lookup/keyring.py
+++ /dev/null
@@ -1 +0,0 @@
-_banned.py \ No newline at end of file
diff --git a/zuul/ansible/base/lookup/keyring.pyi b/zuul/ansible/base/lookup/keyring.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/keyring.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/lastpass.py b/zuul/ansible/base/lookup/lastpass.py
deleted file mode 120000
index d45b9c405..000000000
--- a/zuul/ansible/base/lookup/lastpass.py
+++ /dev/null
@@ -1 +0,0 @@
-_banned.py \ No newline at end of file
diff --git a/zuul/ansible/base/lookup/lastpass.pyi b/zuul/ansible/base/lookup/lastpass.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/lastpass.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/lines.py b/zuul/ansible/base/lookup/lines.py
deleted file mode 120000
index d45b9c405..000000000
--- a/zuul/ansible/base/lookup/lines.py
+++ /dev/null
@@ -1 +0,0 @@
-_banned.py \ No newline at end of file
diff --git a/zuul/ansible/base/lookup/lines.pyi b/zuul/ansible/base/lookup/lines.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/lines.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/mongodb.py b/zuul/ansible/base/lookup/mongodb.py
deleted file mode 120000
index d45b9c405..000000000
--- a/zuul/ansible/base/lookup/mongodb.py
+++ /dev/null
@@ -1 +0,0 @@
-_banned.py \ No newline at end of file
diff --git a/zuul/ansible/base/lookup/mongodb.pyi b/zuul/ansible/base/lookup/mongodb.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/mongodb.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/password.py b/zuul/ansible/base/lookup/password.py
deleted file mode 100644
index 0fdf898d4..000000000
--- a/zuul/ansible/base/lookup/password.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright 2019 OpenStack Foundation
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-
-from zuul.ansible import paths
-password = paths._import_ansible_lookup_plugin("password")
-
-
-class LookupModule(password.LookupModule):
-
- def run(self, terms, variables, **kwargs):
- for term in terms:
- relpath = password._parse_parameters(term)[0]
- # /dev/null is whitelisted because it's interpreted specially
- if relpath != "/dev/null":
- path = self._loader.path_dwim(relpath)
- paths._fail_if_unsafe(path, allow_trusted=True)
- return super(LookupModule, self).run(terms, variables, **kwargs)
diff --git a/zuul/ansible/base/lookup/password.pyi b/zuul/ansible/base/lookup/password.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/password.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/passwordstore.py b/zuul/ansible/base/lookup/passwordstore.py
deleted file mode 120000
index d45b9c405..000000000
--- a/zuul/ansible/base/lookup/passwordstore.py
+++ /dev/null
@@ -1 +0,0 @@
-_banned.py \ No newline at end of file
diff --git a/zuul/ansible/base/lookup/passwordstore.pyi b/zuul/ansible/base/lookup/passwordstore.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/passwordstore.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/pipe.py b/zuul/ansible/base/lookup/pipe.py
deleted file mode 120000
index d45b9c405..000000000
--- a/zuul/ansible/base/lookup/pipe.py
+++ /dev/null
@@ -1 +0,0 @@
-_banned.py \ No newline at end of file
diff --git a/zuul/ansible/base/lookup/pipe.pyi b/zuul/ansible/base/lookup/pipe.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/pipe.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/redis_kv.py b/zuul/ansible/base/lookup/redis_kv.py
deleted file mode 120000
index d45b9c405..000000000
--- a/zuul/ansible/base/lookup/redis_kv.py
+++ /dev/null
@@ -1 +0,0 @@
-_banned.py \ No newline at end of file
diff --git a/zuul/ansible/base/lookup/redis_kv.pyi b/zuul/ansible/base/lookup/redis_kv.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/redis_kv.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/shelvefile.py b/zuul/ansible/base/lookup/shelvefile.py
deleted file mode 120000
index d45b9c405..000000000
--- a/zuul/ansible/base/lookup/shelvefile.py
+++ /dev/null
@@ -1 +0,0 @@
-_banned.py \ No newline at end of file
diff --git a/zuul/ansible/base/lookup/shelvefile.pyi b/zuul/ansible/base/lookup/shelvefile.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/shelvefile.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/template.py b/zuul/ansible/base/lookup/template.py
deleted file mode 100644
index fef56570a..000000000
--- a/zuul/ansible/base/lookup/template.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright 2017 Red Hat, Inc.
-#
-# This module is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software. If not, see <http://www.gnu.org/licenses/>.
-
-from zuul.ansible import paths
-template_mod = paths._import_ansible_lookup_plugin("template")
-
-
-class LookupModule(template_mod.LookupModule):
-
- def run(self, terms, variables=None, **kwargs):
- for term in terms:
- lookupfile = self.find_file_in_search_path(
- variables, 'templates', term)
- paths._fail_if_unsafe(lookupfile, allow_trusted=True)
- return super(LookupModule, self).run(terms, variables, **kwargs)
diff --git a/zuul/ansible/base/lookup/template.pyi b/zuul/ansible/base/lookup/template.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/template.pyi
+++ /dev/null
diff --git a/zuul/ansible/base/lookup/url.py b/zuul/ansible/base/lookup/url.py
deleted file mode 120000
index d45b9c405..000000000
--- a/zuul/ansible/base/lookup/url.py
+++ /dev/null
@@ -1 +0,0 @@
-_banned.py \ No newline at end of file
diff --git a/zuul/ansible/base/lookup/url.pyi b/zuul/ansible/base/lookup/url.pyi
deleted file mode 100644
index e69de29bb..000000000
--- a/zuul/ansible/base/lookup/url.pyi
+++ /dev/null
diff --git a/zuul/ansible/paths.py b/zuul/ansible/paths.py
index da031ea49..895e31403 100644
--- a/zuul/ansible/paths.py
+++ b/zuul/ansible/paths.py
@@ -16,78 +16,13 @@
import imp
import os
-from ansible import constants as C
-from ansible.errors import AnsibleError
-import ansible.modules
import ansible.plugins.action
-import ansible.plugins.lookup
-
-
-def _safe_find_needle(super, dirname, needle):
- result = super._find_needle(dirname, needle)
- # find_needle is only used for source files so it is safe to allow the
- # trusted folder where trusted roles reside
- if not _is_safe_path(result, allow_trusted=True):
- fail_dict = _fail_dict(_full_path(result))
- raise AnsibleError("{msg}. Invalid path: {path}".format(
- msg=fail_dict['msg'], path=fail_dict['path']))
- return result
def _full_path(path):
return os.path.realpath(os.path.abspath(os.path.expanduser(path)))
-def _is_safe_path(path, allow_trusted=False):
-
- home_path = os.path.abspath(os.path.expanduser('~'))
- allowed_paths = [home_path]
- if allow_trusted:
- allowed_paths.append(
- os.path.abspath(os.path.join(home_path, '../trusted')))
- allowed_paths.append(
- os.path.abspath(os.path.join(home_path, '../untrusted')))
-
- def _is_safe(path_to_check):
- for allowed_path in allowed_paths:
- if path_to_check.startswith(allowed_path):
- return True
- return False
-
- # We need to really check the whole subtree starting from path. So first
- # start with the root and do an os.walk if path resolves to a directory.
- full_path = _full_path(path)
- if not _is_safe(full_path):
- return False
-
- # Walk the whole tree and check dirs and files. In order to mitigate
- # chained symlink attacks we also need to follow symlinks.
- visited = set()
- for root, dirs, files in os.walk(full_path, followlinks=True):
-
- # We recurse with follow links so check root first, then the files.
- # The dirs will be checked during recursion.
- full_root = _full_path(root)
- if not _is_safe(full_root):
- return False
-
- # NOTE: os.walk can lead to infinite recursion when following links
- # so filter out the dirs for further processing if we already checked
- # this one.
- if full_root in visited:
- del dirs[:]
- # we already checked the files here so we can just continue to the
- # next iteration
- continue
- visited.add(full_root)
-
- for entry in files:
- full_path = _full_path(os.path.join(root, entry))
- if not _is_safe(full_path):
- return False
- return True
-
-
def _fail_dict(path, prefix='Accessing files from'):
return dict(
failed=True,
@@ -97,12 +32,6 @@ def _fail_dict(path, prefix='Accessing files from'):
curdir=os.path.abspath(os.path.curdir)))
-def _fail_if_unsafe(path, allow_trusted=False):
- if not _is_safe_path(path, allow_trusted):
- msg_dict = _fail_dict(path)
- raise AnsibleError(msg_dict['msg'])
-
-
def _import_ansible_action_plugin(name):
# Ansible forces the import of our action plugins
# (zuul.ansible.action.foo) as ansible.plugins.action.foo, which
@@ -121,68 +50,22 @@ def _import_ansible_action_plugin(name):
*imp.find_module(name, ansible.plugins.action.__path__))
-def _import_ansible_lookup_plugin(name):
- # See _import_ansible_action_plugin
-
- return imp.load_module(
- 'zuul.ansible.protected.lookup.' + name,
- *imp.find_module(name, ansible.plugins.lookup.__path__))
-
-
-def _is_official_module(module):
- task_module_path = module._shared_loader_obj.module_loader.find_plugin(
- module._task.action)
- ansible_module_paths = [os.path.dirname(ansible.modules.__file__)]
- # Also check library path in ansible.cfg for action plugins like
- # zuul_return.
- ansible_module_paths.extend(C.DEFAULT_MODULE_PATH)
-
- # If the module is not beneath the main ansible library path that means
- # someone has included a module with a playbook or a role that has the
- # same name as one of the builtin modules. Normally we don't care, but for
- # local execution it's a problem because their version could subvert our
- # path checks and/or do other things on the local machine that we don't
- # want them to do.
- for path in ansible_module_paths:
- if task_module_path.startswith(path):
- return True
- return False
-
-
-def _fail_module_dict(module_name):
- return dict(
- failed=True,
- msg="Local execution of overridden module {name} is forbidden".format(
- name=module_name))
-
-
-def _fail_if_local_module(module):
- if not _is_official_module(module):
- msg_dict = _fail_module_dict(module._task.action)
- raise AnsibleError(msg_dict['msg'])
-
-
-def _is_localhost_task(task):
-
- # remote_addr is what's in the value of ansible_host and/or the opposite
- # side of a mapping. So if you had an inventory with:
- #
- # all:
- # hosts:
- # ubuntu-xenial:
- # ansible_connection: ssh
- # ansible_host: 23.253.109.74
- # remote_addr would be 23.253.109.74.
- #
- # localhost is special, since it's not in the inventory but instead is
- # added directly by ansible.
-
- if (task._play_context.connection == 'local'
- or task._play_context.remote_addr == 'localhost'
- or task._task.delegate_to == 'localhost'):
- return True
- return False
-
-
def _sanitize_filename(name):
return ''.join(c for c in name if c.isalnum())
+
+
+# Ansible assigns a unique id to every task (Task._uuid). However, if
+# a role is included more than once, the task object is re-used. In
+# order to provide unique log ids for the Zuul command log streaming
+# system, this global dictionary is used to map keys that are derived
+# from tasks (task._uuid concatenated with the host name) to a counter
+# which is incremented each time the task+host combination is
+# encountered. Ansible will not run more than one task on a host
+# simultaneously, so this should be sufficiently unique to avoid
+# collisions.
+#
+# We use a global dictionary defined here so that zuul_stream can
+# write to it and zuul.ansible.command modules can read it. Note that
+# the command module operates after a fork and therefore it should be
+# treated as read-only there.
+ZUUL_LOG_ID_MAP = {}
diff --git a/zuul/change_matcher.py b/zuul/change_matcher.py
index 7d045894d..0a347bc72 100644
--- a/zuul/change_matcher.py
+++ b/zuul/change_matcher.py
@@ -58,13 +58,13 @@ class ProjectMatcher(AbstractChangeMatcher):
class BranchMatcher(AbstractChangeMatcher):
- fullmatch = False
+ exactmatch = False
def matches(self, change):
if hasattr(change, 'branch'):
# an implied branch matcher must do a fullmatch to work correctly
- if self.fullmatch:
- if self.regex.fullmatch(change.branch):
+ if self.exactmatch:
+ if self._regex == change.branch:
return True
else:
if self.regex.match(change.branch):
@@ -74,13 +74,28 @@ class BranchMatcher(AbstractChangeMatcher):
return True
if hasattr(change, 'containing_branches'):
for branch in change.containing_branches:
- if self.regex.fullmatch(branch):
- return True
+ if self.exactmatch:
+ if self._regex == branch:
+ return True
+ else:
+ if self.regex.fullmatch(branch):
+ return True
return False
+ def serialize(self):
+ return {
+ "implied": self.exactmatch,
+ "regex": self._regex,
+ }
+
+ @classmethod
+ def deserialize(cls, data):
+ o = cls.__new__(cls, data['regex'])
+ return o
+
class ImpliedBranchMatcher(BranchMatcher):
- fullmatch = True
+ exactmatch = True
class FileMatcher(AbstractChangeMatcher):
diff --git a/zuul/cmd/client.py b/zuul/cmd/client.py
index fc1ea6a2e..6d6f16968 100755
--- a/zuul/cmd/client.py
+++ b/zuul/cmd/client.py
@@ -1,5 +1,6 @@
# Copyright 2012 Hewlett-Packard Development Company, L.P.
# Copyright 2013 OpenStack Foundation
+# Copyright 2022 Acme Gating, LLC
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
@@ -16,6 +17,8 @@
import argparse
import babel.dates
import datetime
+import dateutil.parser
+import dateutil.tz
import json
import jwt
import logging
@@ -40,6 +43,28 @@ from zuul.zk.layout import LayoutState, LayoutStateStore
from zuul.zk.components import COMPONENT_REGISTRY
+def parse_cutoff(now, before, older_than):
+ if before and not older_than:
+ cutoff = dateutil.parser.parse(before)
+ if cutoff.tzinfo and cutoff.tzinfo != dateutil.tz.tzutc():
+ raise RuntimeError("Timestamp must be specified as UTC")
+ cutoff = cutoff.replace(tzinfo=dateutil.tz.tzutc())
+ return cutoff
+ elif older_than and not before:
+ value = older_than[:-1]
+ suffix = older_than[-1]
+ if suffix == 'd':
+ delta = datetime.timedelta(days=int(value))
+ elif suffix == 'h':
+ delta = datetime.timedelta(hours=int(value))
+ else:
+ raise RuntimeError("Unsupported relative time")
+ return now - delta
+ else:
+ raise RuntimeError(
+ "Either --before or --older-than must be supplied")
+
+
# todo This should probably live somewhere else
class ZuulRESTClient(object):
"""Basic client for Zuul's REST API"""
@@ -189,7 +214,8 @@ class Client(zuul.cmd.ZuulApp):
# Autohold
cmd_autohold = subparsers.add_parser(
- 'autohold', help='hold nodes for failed job')
+ 'autohold', help='[DEPRECATED - use zuul-client] '
+ 'hold nodes for failed job')
cmd_autohold.add_argument('--tenant', help='tenant name',
required=True)
cmd_autohold.add_argument('--project', help='project name',
@@ -214,25 +240,30 @@ class Client(zuul.cmd.ZuulApp):
cmd_autohold.set_defaults(func=self.autohold)
cmd_autohold_delete = subparsers.add_parser(
- 'autohold-delete', help='delete autohold request')
+ 'autohold-delete', help='[DEPRECATED - use zuul-client] '
+ 'delete autohold request')
cmd_autohold_delete.set_defaults(func=self.autohold_delete)
cmd_autohold_delete.add_argument('id', metavar='REQUEST_ID',
help='the hold request ID')
cmd_autohold_info = subparsers.add_parser(
- 'autohold-info', help='retrieve autohold request detailed info')
+ 'autohold-info', help='[DEPRECATED - use zuul-client] '
+ 'retrieve autohold request detailed info')
cmd_autohold_info.set_defaults(func=self.autohold_info)
cmd_autohold_info.add_argument('id', metavar='REQUEST_ID',
help='the hold request ID')
cmd_autohold_list = subparsers.add_parser(
- 'autohold-list', help='list autohold requests')
+ 'autohold-list', help='[DEPRECATED - use zuul-client] '
+ 'list autohold requests')
cmd_autohold_list.add_argument('--tenant', help='tenant name',
required=True)
cmd_autohold_list.set_defaults(func=self.autohold_list)
# Enqueue/Dequeue
- cmd_enqueue = subparsers.add_parser('enqueue', help='enqueue a change')
+ cmd_enqueue = subparsers.add_parser(
+ 'enqueue',
+ help='[DEPRECATED - use zuul-client] enqueue a change')
cmd_enqueue.add_argument('--tenant', help='tenant name',
required=True)
# TODO(mhu) remove in a few releases
@@ -249,7 +280,8 @@ class Client(zuul.cmd.ZuulApp):
cmd_enqueue.set_defaults(func=self.enqueue)
cmd_enqueue = subparsers.add_parser(
- 'enqueue-ref', help='enqueue a ref',
+ 'enqueue-ref',
+ help='[DEPRECATED - use zuul-client] enqueue a ref',
formatter_class=argparse.RawDescriptionHelpFormatter,
description=textwrap.dedent('''\
Submit a trigger event
@@ -273,9 +305,11 @@ class Client(zuul.cmd.ZuulApp):
'--newrev', help='new revision', default=None)
cmd_enqueue.set_defaults(func=self.enqueue_ref)
- cmd_dequeue = subparsers.add_parser('dequeue',
- help='dequeue a buildset by its '
- 'change or ref')
+ cmd_dequeue = subparsers.add_parser(
+ 'dequeue',
+ help='[DEPRECATED - use zuul-client] '
+ 'dequeue a buildset by its '
+ 'change or ref')
cmd_dequeue.add_argument('--tenant', help='tenant name',
required=True)
cmd_dequeue.add_argument('--pipeline', help='pipeline name',
@@ -289,8 +323,10 @@ class Client(zuul.cmd.ZuulApp):
cmd_dequeue.set_defaults(func=self.dequeue)
# Promote
- cmd_promote = subparsers.add_parser('promote',
- help='promote one or more changes')
+ cmd_promote = subparsers.add_parser(
+ 'promote',
+ help='[DEPRECATED - use zuul-client] '
+ 'promote one or more changes')
cmd_promote.add_argument('--tenant', help='tenant name',
required=True)
cmd_promote.add_argument('--pipeline', help='pipeline name',
@@ -300,8 +336,10 @@ class Client(zuul.cmd.ZuulApp):
cmd_promote.set_defaults(func=self.promote)
# Show
- cmd_show = subparsers.add_parser('show',
- help='show current statuses')
+ cmd_show = subparsers.add_parser(
+ 'show',
+ help='[DEPRECATED - use zuul-client] '
+ 'show current statuses')
cmd_show.set_defaults(func=self.show_running_jobs)
show_subparsers = cmd_show.add_subparsers(title='show')
show_running_jobs = show_subparsers.add_parser(
@@ -485,6 +523,27 @@ class Client(zuul.cmd.ZuulApp):
help='tenant name')
cmd_delete_pipeline_state.add_argument('pipeline', type=str,
help='pipeline name')
+
+ # DB Maintenance
+ cmd_prune_database = subparsers.add_parser(
+ 'prune-database',
+ help='prune old database entries',
+ formatter_class=argparse.RawDescriptionHelpFormatter,
+ description=textwrap.dedent('''\
+ Prune old database entries
+
+ This command will delete database entries older than the
+ specified cutoff (which can be specified as either an
+ absolute or relative time).'''))
+ cmd_prune_database.set_defaults(command='prune-database')
+ cmd_prune_database.add_argument(
+ '--before',
+ help='absolute timestamp (e.g., "2022-01-31 12:00:00")')
+ cmd_prune_database.add_argument(
+ '--older-than',
+ help='relative time (e.g., "24h" or "180d")')
+ cmd_prune_database.set_defaults(func=self.prune_database)
+
return parser
def parseArguments(self, args=None):
@@ -521,7 +580,13 @@ class Client(zuul.cmd.ZuulApp):
if not self.args.zuul_url:
self.readConfig()
self.setup_logging()
-
+ if self.args.func in [self.autohold, self.autohold_delete,
+ self.enqueue, self.enqueue_ref,
+ self.dequeue, self.promote]:
+ print(
+ "Warning: this command is deprecated with zuul-admin, "
+ "please use `zuul-client` instead",
+ file=sys.stderr)
if self.args.func():
sys.exit(0)
else:
@@ -544,7 +609,7 @@ class Client(zuul.cmd.ZuulApp):
self.args.auth_token)
else:
print('Unable to find a way to connect to Zuul, add a '
- '"web" section to your configuration file')
+ '"webclient" section to your configuration file')
sys.exit(1)
if server is None:
print('Missing "server" configuration value')
@@ -979,6 +1044,7 @@ class Client(zuul.cmd.ZuulApp):
tenant_name=args.tenant,
hostname='admin command',
last_reconfigured=int(time.time()),
+ last_reconfigure_event_ltime=-1,
uuid=uuid4().hex,
branch_cache_min_ltimes={},
ltime=ps._zstat.last_modified_transaction_id,
@@ -988,6 +1054,21 @@ class Client(zuul.cmd.ZuulApp):
sys.exit(0)
+ def prune_database(self):
+ logging.basicConfig(level=logging.INFO)
+ args = self.args
+ now = datetime.datetime.now(dateutil.tz.tzutc())
+ cutoff = parse_cutoff(now, args.before, args.older_than)
+ self.configure_connections(source_only=False, require_sql=True)
+ connection = self.connections.getSqlConnection()
+ connection.deleteBuildsets(cutoff)
+ sys.exit(0)
+
def main():
+ if sys.argv[0].endswith('zuul'):
+ print(
+ "Warning: this command name is deprecated, "
+ "use `zuul-admin` instead",
+ file=sys.stderr)
Client().main()
diff --git a/zuul/cmd/executor.py b/zuul/cmd/executor.py
index 3c98ecd4a..eb463348e 100755
--- a/zuul/cmd/executor.py
+++ b/zuul/cmd/executor.py
@@ -67,12 +67,16 @@ class Executor(zuul.cmd.ZuulDaemonApp):
# Keep running until the parent dies:
pipe_read = os.fdopen(pipe_read)
- pipe_read.read()
+ try:
+ pipe_read.read()
+ except KeyboardInterrupt:
+ pass
self.log.info("Stopping log streamer")
streamer.stop()
os._exit(0)
else:
os.close(pipe_read)
+ self.log_streamer_pipe = pipe_write
self.log_streamer_pid = child_pid
def run(self):
@@ -113,7 +117,16 @@ class Executor(zuul.cmd.ZuulDaemonApp):
if self.args.nodaemon:
signal.signal(signal.SIGTERM, self.exit_handler)
- self.executor.join()
+ while True:
+ try:
+ self.executor.join()
+ break
+ except KeyboardInterrupt:
+ print("Ctrl + C: asking executor to exit nicely...\n")
+ self.exit_handler(signal.SIGINT, None)
+
+ os.close(self.log_streamer_pipe)
+ os.waitpid(self.log_streamer_pid, 0)
def main():
diff --git a/zuul/cmd/fingergw.py b/zuul/cmd/fingergw.py
index 04e0d5cc8..2f7dbdb59 100644
--- a/zuul/cmd/fingergw.py
+++ b/zuul/cmd/fingergw.py
@@ -38,6 +38,10 @@ class FingerGatewayApp(zuul.cmd.ZuulDaemonApp):
self.addSubCommands(parser, fingergw.COMMANDS)
return parser
+ def exit_handler(self, signum, frame):
+ if self.gateway:
+ self.gateway.stop()
+
def run(self):
'''
Main entry point for the FingerGatewayApp.
@@ -59,28 +63,18 @@ class FingerGatewayApp(zuul.cmd.ZuulDaemonApp):
self.getPidFile(),
)
- self.log.info('Starting Zuul finger gateway app')
self.gateway.start()
if self.args.nodaemon:
- # NOTE(Shrews): When running in non-daemon mode, although sending
- # the 'stop' command via the command socket will shutdown the
- # gateway, it's still necessary to Ctrl+C to stop the app.
- while True:
- try:
- signal.pause()
- except KeyboardInterrupt:
- print("Ctrl + C: asking gateway to exit nicely...\n")
- self.stop()
- break
- else:
- self.gateway.wait()
-
- self.log.info('Stopped Zuul finger gateway app')
-
- def stop(self):
- if self.gateway:
- self.gateway.stop()
+ signal.signal(signal.SIGTERM, self.exit_handler)
+
+ while True:
+ try:
+ self.gateway.join()
+ break
+ except KeyboardInterrupt:
+ print("Ctrl + C: asking gateway to exit nicely...\n")
+ self.exit_handler(signal.SIGINT, None)
def main():
diff --git a/zuul/cmd/merger.py b/zuul/cmd/merger.py
index 659399c85..f1e0bea88 100755
--- a/zuul/cmd/merger.py
+++ b/zuul/cmd/merger.py
@@ -49,19 +49,15 @@ class Merger(zuul.cmd.ZuulDaemonApp):
if self.args.nodaemon:
signal.signal(signal.SIGTERM, self.exit_handler)
- while True:
- try:
- signal.pause()
- except KeyboardInterrupt:
- print("Ctrl + C: asking merger to exit nicely...\n")
- self.exit_handler(signal.SIGINT, None)
- else:
- self.merger.join()
+
+ while True:
+ try:
+ self.merger.join()
+ break
+ except KeyboardInterrupt:
+ print("Ctrl + C: asking merger to exit nicely...\n")
+ self.exit_handler(signal.SIGINT, None)
def main():
Merger().main()
-
-
-if __name__ == "__main__":
- main()
diff --git a/zuul/cmd/scheduler.py b/zuul/cmd/scheduler.py
index 176466cfe..7ed30b68e 100755
--- a/zuul/cmd/scheduler.py
+++ b/zuul/cmd/scheduler.py
@@ -39,6 +39,10 @@ class Scheduler(zuul.cmd.ZuulDaemonApp):
'listed, all tenants will be validated. '
'Note: this requires ZooKeeper and '
'will distribute work to mergers.')
+ parser.add_argument('--wait-for-init', dest='wait_for_init',
+ action='store_true',
+ help='Wait until all tenants are fully loaded '
+ 'before beginning to process events.')
self.addSubCommands(parser, zuul.scheduler.COMMANDS)
return parser
@@ -82,7 +86,8 @@ class Scheduler(zuul.cmd.ZuulDaemonApp):
self.configure_connections(require_sql=True)
self.sched = zuul.scheduler.Scheduler(self.config,
- self.connections, self)
+ self.connections, self,
+ self.args.wait_for_init)
if self.args.validate_tenants is None:
self.connections.registerScheduler(self.sched)
self.connections.load(self.sched.zk_client,
@@ -109,14 +114,14 @@ class Scheduler(zuul.cmd.ZuulDaemonApp):
if self.args.nodaemon:
signal.signal(signal.SIGTERM, self.exit_handler)
- while True:
- try:
- signal.pause()
- except KeyboardInterrupt:
- print("Ctrl + C: asking scheduler to exit nicely...\n")
- self.exit_handler(signal.SIGINT, None)
- else:
- self.sched.join()
+
+ while True:
+ try:
+ self.sched.join()
+ break
+ except KeyboardInterrupt:
+ print("Ctrl + C: asking scheduler to exit nicely...\n")
+ self.exit_handler(signal.SIGINT, None)
def main():
diff --git a/zuul/configloader.py b/zuul/configloader.py
index 68612d4ee..a92f5337c 100644
--- a/zuul/configloader.py
+++ b/zuul/configloader.py
@@ -12,6 +12,7 @@
import collections
from contextlib import contextmanager
+from concurrent.futures import ThreadPoolExecutor, as_completed
import copy
import itertools
import os
@@ -23,7 +24,9 @@ import subprocess
import voluptuous as vs
+from zuul import change_matcher
from zuul import model
+from zuul.connection import ReadOnlyBranchCacheError
from zuul.lib import yamlutil as yaml
import zuul.manager.dependent
import zuul.manager.independent
@@ -32,9 +35,12 @@ import zuul.manager.serial
from zuul.lib.logutil import get_annotated_logger
from zuul.lib.re2util import filter_allowed_disallowed
from zuul.lib.varnames import check_varnames
+from zuul.zk.components import COMPONENT_REGISTRY
from zuul.zk.config_cache import UnparsedConfigCache
from zuul.zk.semaphore import SemaphoreHandler
+ZUUL_CONF_ROOT = ('zuul.yaml', 'zuul.d', '.zuul.yaml', '.zuul.d')
+
# Several forms accept either a single item or a list, this makes
# specifying that in the schema easy (and explicit).
@@ -185,6 +191,16 @@ class ProjectNotPermittedError(Exception):
super(ProjectNotPermittedError, self).__init__(message)
+class GlobalSemaphoreNotFoundError(Exception):
+ def __init__(self, semaphore):
+ message = textwrap.dedent("""\
+ The global semaphore "{semaphore}" was not found. All
+ global semaphores must be added to the main configuration
+ file by the Zuul administrator.""")
+ message = textwrap.fill(message.format(semaphore=semaphore))
+ super(GlobalSemaphoreNotFoundError, self).__init__(message)
+
+
class YAMLDuplicateKeyError(ConfigurationSyntaxError):
def __init__(self, key, node, context, start_mark):
intro = textwrap.fill(textwrap.dedent("""\
@@ -229,6 +245,8 @@ def project_configuration_exceptions(context, accumulator):
yield
except ConfigurationSyntaxError:
raise
+ except ReadOnlyBranchCacheError:
+ raise
except Exception as e:
intro = textwrap.fill(textwrap.dedent("""\
Zuul encountered an error while accessing the repo {repo}. The error
@@ -444,7 +462,14 @@ class PragmaParser(object):
branches = conf.get('implied-branches')
if branches is not None:
- source_context.implied_branches = as_list(branches)
+ # This is a BranchMatcher (not an ImpliedBranchMatcher)
+ # because as user input, we allow/expect this to be
+ # regular expressions. Only truly implicit branch names
+ # (automatically generated from source file branches) are
+ # ImpliedBranchMatchers.
+ source_context.implied_branches = [
+ change_matcher.BranchMatcher(x)
+ for x in as_list(branches)]
class NodeSetParser(object):
@@ -463,14 +488,26 @@ class NodeSetParser(object):
vs.Required('nodes'): to_list(str),
}
- nodeset = {vs.Required('nodes'): to_list(node),
- 'groups': to_list(group),
- '_source_context': model.SourceContext,
- '_start_mark': model.ZuulMark,
- }
+ real_nodeset = {vs.Required('nodes'): to_list(node),
+ 'groups': to_list(group),
+ }
+
+ alt_nodeset = {vs.Required('alternatives'):
+ [vs.Any(real_nodeset, str)]}
+ top_nodeset = {'_source_context': model.SourceContext,
+ '_start_mark': model.ZuulMark,
+ }
if not anonymous:
- nodeset[vs.Required('name')] = str
+ top_nodeset[vs.Required('name')] = str
+
+ top_real_nodeset = real_nodeset.copy()
+ top_real_nodeset.update(top_nodeset)
+ top_alt_nodeset = alt_nodeset.copy()
+ top_alt_nodeset.update(top_nodeset)
+
+ nodeset = vs.Any(top_real_nodeset, top_alt_nodeset)
+
return vs.Schema(nodeset)
def fromYaml(self, conf, anonymous=False):
@@ -478,6 +515,24 @@ class NodeSetParser(object):
self.anon_schema(conf)
else:
self.schema(conf)
+
+ if 'alternatives' in conf:
+ return self.loadAlternatives(conf)
+ else:
+ return self.loadNodeset(conf)
+
+ def loadAlternatives(self, conf):
+ ns = model.NodeSet(conf.get('name'))
+ ns.source_context = conf.get('_source_context')
+ ns.start_mark = conf.get('_start_mark')
+ for alt in conf['alternatives']:
+ if isinstance(alt, str):
+ ns.addAlternative(alt)
+ else:
+ ns.addAlternative(self.loadNodeset(alt))
+ return ns
+
+ def loadNodeset(self, conf):
ns = model.NodeSet(conf.get('name'))
ns.source_context = conf.get('_source_context')
ns.start_mark = conf.get('_start_mark')
@@ -604,7 +659,7 @@ class JobParser(object):
'post-run': to_list(str),
'run': to_list(str),
'cleanup-run': to_list(str),
- 'ansible-version': vs.Any(str, float),
+ 'ansible-version': vs.Any(str, float, int),
'_source_context': model.SourceContext,
'_start_mark': model.ZuulMark,
'roles': to_list(role),
@@ -621,7 +676,8 @@ class JobParser(object):
'variant-description': str,
'post-review': bool,
'match-on-config-updates': bool,
- 'workspace-scheme': vs.Any('golang', 'flat'),
+ 'workspace-scheme': vs.Any('golang', 'flat', 'unique'),
+ 'deduplicate': vs.Any(bool, 'auto'),
}
job_name = {vs.Required('name'): str}
@@ -647,6 +703,7 @@ class JobParser(object):
'override-checkout',
'match-on-config-updates',
'workspace-scheme',
+ 'deduplicate',
]
def __init__(self, pcontext):
@@ -742,8 +799,8 @@ class JobParser(object):
# Configure and validate ansible version
if 'ansible-version' in conf:
- # The ansible-version can be treated by yaml as a float so convert
- # it to a string.
+ # The ansible-version can be treated by yaml as a float or
+ # int so convert it to a string.
ansible_version = str(conf['ansible-version'])
self.pcontext.ansible_manager.requestVersion(ansible_version)
job.ansible_version = ansible_version
@@ -907,14 +964,13 @@ class JobParser(object):
job.allowed_projects = frozenset(allowed)
branches = None
- implied = False
if 'branches' in conf:
- branches = as_list(conf['branches'])
+ branches = [change_matcher.BranchMatcher(x)
+ for x in as_list(conf['branches'])]
elif not project_pipeline:
branches = self.pcontext.getImpliedBranches(job.source_context)
- implied = True
if branches:
- job.setBranchMatcher(branches, implied=implied)
+ job.setBranchMatcher(branches)
if 'files' in conf:
job.setFileMatcher(as_list(conf['files']))
if 'irrelevant-files' in conf:
@@ -955,8 +1011,6 @@ class ProjectTemplateParser(object):
job_list = [vs.Any(str, job)]
pipeline_contents = {
- # TODO(tobiash): Remove pipeline specific queue after deprecation
- 'queue': str,
'debug': bool,
'fail-fast': bool,
'jobs': job_list
@@ -988,8 +1042,6 @@ class ProjectTemplateParser(object):
continue
project_pipeline = model.ProjectPipelineConfig()
project_template.pipelines[pipeline_name] = project_pipeline
- # TODO(tobiash): Remove pipeline specific queue after deprecation
- project_pipeline.queue_name = conf_pipeline.get('queue')
project_pipeline.debug = conf_pipeline.get('debug')
project_pipeline.fail_fast = conf_pipeline.get(
'fail-fast')
@@ -1044,8 +1096,6 @@ class ProjectParser(object):
job_list = [vs.Any(str, job)]
pipeline_contents = {
- # TODO(tobiash): Remove pipeline specific queue after deprecation
- 'queue': str,
'debug': bool,
'fail-fast': bool,
'jobs': job_list
@@ -1114,7 +1164,8 @@ class ProjectParser(object):
project_config.setImpliedBranchMatchers([])
else:
project_config.setImpliedBranchMatchers(
- [source_context.branch])
+ [change_matcher.ImpliedBranchMatcher(
+ source_context.branch)])
# Add templates
for name in conf.get('templates', []):
@@ -1149,6 +1200,7 @@ class PipelineParser(object):
'success': 'success_actions',
'failure': 'failure_actions',
'merge-conflict': 'merge_conflict_actions',
+ 'config-error': 'config_error_actions',
'no-jobs': 'no_jobs_actions',
'disabled': 'disabled_actions',
'dequeue': 'dequeue_actions',
@@ -1199,7 +1251,7 @@ class PipelineParser(object):
'failure-message': str,
'start-message': str,
'merge-conflict-message': str,
- 'merge-failure-message': str,
+ 'enqueue-message': str,
'no-jobs-message': str,
'footer-message': str,
'dequeue-message': str,
@@ -1221,8 +1273,8 @@ class PipelineParser(object):
pipeline['reject'] = self.getDriverSchema('reject')
pipeline['trigger'] = vs.Required(self.getDriverSchema('trigger'))
for action in ['enqueue', 'start', 'success', 'failure',
- 'merge-conflict', 'merge-failure', 'no-jobs',
- 'disabled', 'dequeue']:
+ 'merge-conflict', 'no-jobs', 'disabled',
+ 'dequeue', 'config-error']:
pipeline[action] = self.getDriverSchema('reporter')
return vs.Schema(pipeline)
@@ -1238,15 +1290,12 @@ class PipelineParser(object):
pipeline.precedence = precedence
pipeline.failure_message = conf.get('failure-message',
"Build failed.")
- # TODO: Remove in Zuul v6.0
- backwards_compat_merge_message = conf.get(
- 'merge-failure-message', "Merge Failed.\n\nThis change or one "
+ pipeline.merge_conflict_message = conf.get(
+ 'merge-conflict-message', "Merge Failed.\n\nThis change or one "
"of its cross-repo dependencies was unable to be "
"automatically merged with the current state of its "
"repository. Please rebase the change and upload a new "
"patchset.")
- pipeline.merge_conflict_message = conf.get(
- 'merge-conflict-message', backwards_compat_merge_message)
pipeline.success_message = conf.get('success-message',
"Build succeeded.")
@@ -1268,8 +1317,6 @@ class PipelineParser(object):
# TODO: Remove in Zuul v6.0
# Make a copy to manipulate for backwards compat.
conf_copy = conf.copy()
- if 'merge-failure' in conf_copy and 'merge-conflict' not in conf_copy:
- conf_copy['merge-conflict'] = conf_copy['merge-failure']
for conf_key, action in self.reporter_actions.items():
reporter_set = []
@@ -1290,6 +1337,10 @@ class PipelineParser(object):
if not pipeline.merge_conflict_actions:
pipeline.merge_conflict_actions = pipeline.failure_actions
+ # If config-error actions aren't explicit, use the failure actions
+ if not pipeline.config_error_actions:
+ pipeline.config_error_actions = pipeline.failure_actions
+
pipeline.disable_at = conf.get(
'disable-after-consecutive-failures', None)
@@ -1379,6 +1430,7 @@ class QueueParser:
queue = {vs.Required('name'): str,
'per-branch': bool,
'allow-circular-dependencies': bool,
+ 'dependencies-by-topic': bool,
'_source_context': model.SourceContext,
'_start_mark': model.ZuulMark,
}
@@ -1390,7 +1442,12 @@ class QueueParser:
conf['name'],
conf.get('per-branch', False),
conf.get('allow-circular-dependencies', False),
+ conf.get('dependencies-by-topic', False),
)
+ if (queue.dependencies_by_topic and not
+ queue.allow_circular_dependencies):
+ raise Exception("The 'allow-circular-dependencies' setting must be"
+ "enabled in order to use dependencies-by-topic")
queue.source_context = conf.get('_source_context')
queue.start_mark = conf.get('_start_mark')
queue.freeze()
@@ -1431,6 +1488,26 @@ class AuthorizationRuleParser(object):
return a
+class GlobalSemaphoreParser(object):
+ def __init__(self):
+ self.log = logging.getLogger("zuul.GlobalSemaphoreParser")
+ self.schema = self.getSchema()
+
+ def getSchema(self):
+ semaphore = {vs.Required('name'): str,
+ 'max': int,
+ }
+
+ return vs.Schema(semaphore)
+
+ def fromYaml(self, conf):
+ self.schema(conf)
+ semaphore = model.Semaphore(conf['name'], conf.get('max', 1),
+ global_scope=True)
+ semaphore.freeze()
+ return semaphore
+
+
class ParseContext(object):
"""Hold information about a particular run of the parser"""
@@ -1455,7 +1532,7 @@ class ParseContext(object):
if source_context.implied_branch_matchers is True:
if source_context.implied_branches is not None:
return source_context.implied_branches
- return [source_context.branch]
+ return [change_matcher.ImpliedBranchMatcher(source_context.branch)]
elif source_context.implied_branch_matchers is False:
return None
@@ -1473,7 +1550,7 @@ class ParseContext(object):
if source_context.implied_branches is not None:
return source_context.implied_branches
- return [source_context.branch]
+ return [change_matcher.ImpliedBranchMatcher(source_context.branch)]
class TenantParser(object):
@@ -1499,6 +1576,9 @@ class TenantParser(object):
'exclude-unprotected-branches': bool,
'extra-config-paths': no_dup_config_paths,
'load-branch': str,
+ 'include-branches': to_list(str),
+ 'exclude-branches': to_list(str),
+ 'always-dynamic-branches': to_list(str),
'allow-circular-dependencies': bool,
}}
@@ -1544,6 +1624,7 @@ class TenantParser(object):
'default-parent': str,
'default-ansible-version': vs.Any(str, float),
'admin-rules': to_list(str),
+ 'semaphores': to_list(str),
'authentication-realm': str,
# TODO: Ignored, allowed for backwards compat, remove for v5.
'report-build-page': bool,
@@ -1551,8 +1632,9 @@ class TenantParser(object):
}
return vs.Schema(tenant)
- def fromYaml(self, abide, conf, ansible_manager, min_ltimes=None,
- layout_uuid=None, branch_cache_min_ltimes=None):
+ def fromYaml(self, abide, conf, ansible_manager, executor, min_ltimes=None,
+ layout_uuid=None, branch_cache_min_ltimes=None,
+ ignore_cat_exception=True):
# Note: This vs schema validation is not necessary in most cases as we
# verify the schema when loading tenant configs into zookeeper.
# However, it is theoretically possible in a multi scheduler setup that
@@ -1575,6 +1657,11 @@ class TenantParser(object):
tenant.authorization_rules = conf['admin-rules']
if conf.get('authentication-realm') is not None:
tenant.default_auth_realm = conf['authentication-realm']
+ if conf.get('semaphores') is not None:
+ tenant.global_semaphores = set(as_list(conf['semaphores']))
+ for semaphore_name in tenant.global_semaphores:
+ if semaphore_name not in abide.semaphores:
+ raise GlobalSemaphoreNotFoundError(semaphore_name)
tenant.web_root = conf.get('web-root', self.globals.web_root)
if tenant.web_root and not tenant.web_root.endswith('/'):
tenant.web_root += '/'
@@ -1596,7 +1683,15 @@ class TenantParser(object):
# We prepare a stack to store config loading issues
loading_errors = model.LoadingErrors()
+ # Get branches in parallel
+ branch_futures = {}
for tpc in config_tpcs + untrusted_tpcs:
+ future = executor.submit(self._getProjectBranches,
+ tenant, tpc, branch_cache_min_ltimes)
+ branch_futures[future] = tpc
+
+ for branch_future in as_completed(branch_futures.keys()):
+ tpc = branch_futures[branch_future]
source_context = model.ProjectContext(
tpc.project.canonical_name, tpc.project.name)
with project_configuration_exceptions(source_context,
@@ -1618,7 +1713,8 @@ class TenantParser(object):
# Start by fetching any YAML needed by this tenant which isn't
# already cached. Full reconfigurations start with an empty
# cache.
- self._cacheTenantYAML(abide, tenant, loading_errors, min_ltimes)
+ self._cacheTenantYAML(abide, tenant, loading_errors, min_ltimes,
+ executor, ignore_cat_exception)
# Then collect the appropriate YAML based on this tenant
# config.
@@ -1643,10 +1739,17 @@ class TenantParser(object):
tenant.layout = self._parseLayout(
tenant, parsed_config, loading_errors, layout_uuid)
+
+ tenant.semaphore_handler = SemaphoreHandler(
+ self.zk_client, self.statsd, tenant.name, tenant.layout, abide,
+ read_only=(not bool(self.scheduler))
+ )
if self.scheduler:
- tenant.semaphore_handler = SemaphoreHandler(
- self.zk_client, self.statsd, tenant.name, tenant.layout
- )
+ # Only call the postConfig hook if we have a scheduler as this will
+ # change data in ZooKeeper. In case we are in a zuul-web context,
+ # we don't want to do that.
+ for pipeline in tenant.layout.pipelines.values():
+ pipeline.manager._postConfig()
return tenant
@@ -1676,7 +1779,15 @@ class TenantParser(object):
if 'master' in branches:
branches.remove('master')
branches = ['master'] + branches
- tpc.branches = branches
+ static_branches = []
+ always_dynamic_branches = []
+ for b in branches:
+ if tpc.includesBranch(b):
+ static_branches.append(b)
+ elif tpc.isAlwaysDynamicBranch(b):
+ always_dynamic_branches.append(b)
+ tpc.branches = static_branches
+ tpc.dynamic_branches = always_dynamic_branches
def _loadProjectKeys(self, connection_name, project):
project.private_secrets_key, project.public_secrets_key = (
@@ -1700,6 +1811,9 @@ class TenantParser(object):
project_include = current_include
shadow_projects = []
project_exclude_unprotected_branches = None
+ project_include_branches = None
+ project_exclude_branches = None
+ project_always_dynamic_branches = None
project_load_branch = None
else:
project_name = list(conf.keys())[0]
@@ -1718,6 +1832,34 @@ class TenantParser(object):
project_include = frozenset(project_include - project_exclude)
project_exclude_unprotected_branches = conf[project_name].get(
'exclude-unprotected-branches', None)
+ project_include_branches = conf[project_name].get(
+ 'include-branches', None)
+ if project_include_branches is not None:
+ project_include_branches = [
+ re.compile(b) for b in as_list(project_include_branches)
+ ]
+ exclude_branches = conf[project_name].get(
+ 'exclude-branches', None)
+ if exclude_branches is not None:
+ project_exclude_branches = [
+ re.compile(b) for b in as_list(exclude_branches)
+ ]
+ else:
+ project_exclude_branches = None
+ always_dynamic_branches = conf[project_name].get(
+ 'always-dynamic-branches', None)
+ if always_dynamic_branches is not None:
+ if project_exclude_branches is None:
+ project_exclude_branches = []
+ exclude_branches = []
+ project_always_dynamic_branches = []
+ for b in always_dynamic_branches:
+ rb = re.compile(b)
+ if b not in exclude_branches:
+ project_exclude_branches.append(rb)
+ project_always_dynamic_branches.append(rb)
+ else:
+ project_always_dynamic_branches = None
if conf[project_name].get('extra-config-paths') is not None:
extra_config_paths = as_list(
conf[project_name]['extra-config-paths'])
@@ -1733,6 +1875,10 @@ class TenantParser(object):
tenant_project_config.shadow_projects = shadow_projects
tenant_project_config.exclude_unprotected_branches = \
project_exclude_unprotected_branches
+ tenant_project_config.include_branches = project_include_branches
+ tenant_project_config.exclude_branches = project_exclude_branches
+ tenant_project_config.always_dynamic_branches = \
+ project_always_dynamic_branches
tenant_project_config.extra_config_files = extra_config_files
tenant_project_config.extra_config_dirs = extra_config_dirs
tenant_project_config.load_branch = project_load_branch
@@ -1766,7 +1912,7 @@ class TenantParser(object):
raise Exception("Unable to parse project %s", conf)
return projects
- def loadTenantProjects(self, conf_tenant):
+ def loadTenantProjects(self, conf_tenant, executor):
config_projects = []
untrusted_projects = []
@@ -1774,6 +1920,7 @@ class TenantParser(object):
'secret', 'project-template', 'nodeset',
'queue'])
+ futures = []
for source_name, conf_source in conf_tenant.get('source', {}).items():
source = self.connections.getSource(source_name)
@@ -1782,7 +1929,8 @@ class TenantParser(object):
# tpcs = TenantProjectConfigs
tpcs = self._getProjects(source, conf_repo, current_include)
for tpc in tpcs:
- self._loadProjectKeys(source_name, tpc.project)
+ futures.append(executor.submit(
+ self._loadProjectKeys, source_name, tpc.project))
config_projects.append(tpc)
current_include = frozenset(default_include - set(['pipeline']))
@@ -1790,13 +1938,80 @@ class TenantParser(object):
tpcs = self._getProjects(source, conf_repo,
current_include)
for tpc in tpcs:
- self._loadProjectKeys(source_name, tpc.project)
+ futures.append(executor.submit(
+ self._loadProjectKeys, source_name, tpc.project))
untrusted_projects.append(tpc)
+ for f in futures:
+ f.result()
return config_projects, untrusted_projects
- def _cacheTenantYAML(self, abide, tenant, loading_errors, min_ltimes):
+ def _cacheTenantYAML(self, abide, tenant, loading_errors, min_ltimes,
+ executor, ignore_cat_exception=True):
+ # min_ltimes can be the following: None (that means that we
+ # should not use the file cache at all) or a nested dict of
+ # project and branch to ltime. A value of None usually means
+ # we are being called from the command line config validator.
+ # However, if the model api is old, we may be operating in
+ # compatibility mode and are loading a layout without a stored
+ # min_ltimes. In that case, we treat it as if min_ltimes is a
+ # defaultdict of -1.
+
+ # If min_ltimes is not None, then it is mutated and returned
+ # with the actual ltimes of each entry in the unparsed branch
+ # cache.
+
+ if min_ltimes is None and COMPONENT_REGISTRY.model_api < 6:
+ min_ltimes = collections.defaultdict(
+ lambda: collections.defaultdict(lambda: -1))
+
+ # If the ltime is -1, then we should consider the file cache
+ # valid. If we have an unparsed branch cache entry for the
+ # project-branch, we should use it, otherwise we should update
+ # our unparsed branch cache from whatever is in the file
+ # cache.
+
+ # If the ltime is otherwise, then if our unparsed branch cache
+ # is valid for that ltime, we should use the contents.
+ # Otherwise if the files cache is valid for the ltime, we
+ # should update our unparsed branch cache from the files cache
+ # and use that. Otherwise, we should run a cat job to update
+ # the files cache, then update our unparsed branch cache from
+ # that.
+
+ # The circumstances under which this method is called are:
+
+ # Prime:
+ # min_ltimes is None: backwards compat from old model api
+ # which we treat as a universal ltime of -1.
+ # We'll either get an actual min_ltimes dict from the last
+ # reconfig, or -1 if this is a new tenant.
+ # In all cases, our unparsed branch cache will be empty, so
+ # we will always either load data from zk or issue a cat job
+ # as appropriate.
+
+ # Background layout update:
+ # min_ltimes is None: backwards compat from old model api
+ # which we treat as a universal ltime of -1.
+ # Otherwise, min_ltimes will always be the actual min_ltimes
+ # from the last reconfig. No cat jobs should be needed; we
+ # either have an unparsed branch cache valid for the ltime,
+ # or we update it from ZK which should be valid.
+
+ # Smart or full reconfigure:
+ # min_ltime is -1: a smart reconfig: consider the caches valid
+ # min_ltime is the event time: a full reconfig; we update
+ # both of the ccahes as necessary.
+
+ # Tenant reconfigure:
+ # min_ltime is -1: this project-branch is unchanged by the
+ # tenant reconfig event, so consider the caches valid.
+ # min_ltime is the event time: this project-branch was updated
+ # so check the caches.
+
jobs = []
+
+ futures = []
for project in itertools.chain(
tenant.config_projects, tenant.untrusted_projects):
tpc = tenant.project_configs[project.canonical_name]
@@ -1810,58 +2025,16 @@ class TenantParser(object):
# If all config classes are excluded then do not
# request any getFiles jobs.
continue
+ futures.append(executor.submit(self._cacheTenantYAMLBranch,
+ abide, tenant, loading_errors,
+ min_ltimes, tpc, project,
+ branch, jobs))
+ for future in futures:
+ future.result()
- source_context = model.SourceContext(
- project.canonical_name, project.name,
- project.connection_name, branch, '', False)
- if min_ltimes is not None:
- files_cache = self.unparsed_config_cache.getFilesCache(
- project.canonical_name, branch)
- with self.unparsed_config_cache.readLock(
- project.canonical_name):
- pb_ltime = min_ltimes[project.canonical_name][branch]
- if files_cache.isValidFor(tpc, pb_ltime):
- self.log.debug(
- "Using files from cache for project "
- "%s @%s: %s",
- project.canonical_name, branch,
- list(files_cache.keys()))
- branch_cache = abide.getUnparsedBranchCache(
- project.canonical_name, branch)
- if branch_cache.isValidFor(tpc, files_cache.ltime):
- # Unparsed branch cache is already up-to-date
- continue
- self._updateUnparsedBranchCache(
- abide, tenant, source_context, files_cache,
- loading_errors, files_cache.ltime)
- continue
-
- extra_config_files = abide.getExtraConfigFiles(project.name)
- extra_config_dirs = abide.getExtraConfigDirs(project.name)
- if not self.merger:
- with project_configuration_exceptions(source_context,
- loading_errors):
- raise Exception(
- "Configuration files missing from cache. "
- "Check Zuul scheduler logs for more information.")
- continue
- ltime = self.zk_client.getCurrentLtime()
- job = self.merger.getFiles(
- project.source.connection.connection_name,
- project.name, branch,
- files=(['zuul.yaml', '.zuul.yaml'] +
- list(extra_config_files)),
- dirs=['zuul.d', '.zuul.d'] + list(extra_config_dirs))
- self.log.debug("Submitting cat job %s for %s %s %s" % (
- job, project.source.connection.connection_name,
- project.name, branch))
- job.extra_config_files = extra_config_files
- job.extra_config_dirs = extra_config_dirs
- job.ltime = ltime
- job.source_context = source_context
- jobs.append(job)
try:
- self._processCatJobs(abide, tenant, loading_errors, jobs)
+ self._processCatJobs(abide, tenant, loading_errors, jobs,
+ min_ltimes)
except Exception:
self.log.exception("Error processing cat jobs, canceling")
for job in jobs:
@@ -1870,12 +2043,85 @@ class TenantParser(object):
self.merger.cancel(job)
except Exception:
self.log.exception("Unable to cancel job %s", job)
-
- def _processCatJobs(self, abide, tenant, loading_errors, jobs):
+ if not ignore_cat_exception:
+ raise
+ if not ignore_cat_exception:
+ raise
+
+ def _cacheTenantYAMLBranch(self, abide, tenant, loading_errors, min_ltimes,
+ tpc, project, branch, jobs):
+ # This is the middle section of _cacheTenantYAML, called for
+ # each project-branch. It's a separate method so we can
+ # execute it in parallel. The "jobs" argument is mutated and
+ # accumulates a list of all merger jobs submitted.
+ source_context = model.SourceContext(
+ project.canonical_name, project.name,
+ project.connection_name, branch, '', False)
+ if min_ltimes is not None:
+ files_cache = self.unparsed_config_cache.getFilesCache(
+ project.canonical_name, branch)
+ branch_cache = abide.getUnparsedBranchCache(
+ project.canonical_name, branch)
+ try:
+ pb_ltime = min_ltimes[project.canonical_name][branch]
+ except KeyError:
+ self.log.exception(
+ "Min. ltime missing for project/branch")
+ pb_ltime = -1
+
+ # If our unparsed branch cache is valid for the
+ # time, then we don't need to do anything else.
+ if branch_cache.isValidFor(tpc, pb_ltime):
+ min_ltimes[project.canonical_name][branch] =\
+ branch_cache.ltime
+ return
+
+ with self.unparsed_config_cache.readLock(
+ project.canonical_name):
+ if files_cache.isValidFor(tpc, pb_ltime):
+ self.log.debug(
+ "Using files from cache for project "
+ "%s @%s: %s",
+ project.canonical_name, branch,
+ list(files_cache.keys()))
+ self._updateUnparsedBranchCache(
+ abide, tenant, source_context, files_cache,
+ loading_errors, files_cache.ltime,
+ min_ltimes)
+ return
+
+ extra_config_files = abide.getExtraConfigFiles(project.name)
+ extra_config_dirs = abide.getExtraConfigDirs(project.name)
+ if not self.merger:
+ with project_configuration_exceptions(source_context,
+ loading_errors):
+ raise Exception(
+ "Configuration files missing from cache. "
+ "Check Zuul scheduler logs for more information.")
+ return
+ ltime = self.zk_client.getCurrentLtime()
+ job = self.merger.getFiles(
+ project.source.connection.connection_name,
+ project.name, branch,
+ files=(['zuul.yaml', '.zuul.yaml'] +
+ list(extra_config_files)),
+ dirs=['zuul.d', '.zuul.d'] + list(extra_config_dirs))
+ self.log.debug("Submitting cat job %s for %s %s %s" % (
+ job, project.source.connection.connection_name,
+ project.name, branch))
+ job.extra_config_files = extra_config_files
+ job.extra_config_dirs = extra_config_dirs
+ job.ltime = ltime
+ job.source_context = source_context
+ jobs.append(job)
+
+ def _processCatJobs(self, abide, tenant, loading_errors, jobs, min_ltimes):
+ # Called at the end of _cacheTenantYAML after all cat jobs
+ # have been submitted
for job in jobs:
self.log.debug("Waiting for cat job %s" % (job,))
- job.wait(self.merger.git_timeout)
- if not hasattr(job, 'updated'):
+ res = job.wait(self.merger.git_timeout)
+ if not res:
# We timed out
raise Exception("Cat job %s timed out; consider setting "
"merger.git_timeout in zuul.conf" % (job,))
@@ -1886,7 +2132,7 @@ class TenantParser(object):
self._updateUnparsedBranchCache(abide, tenant, job.source_context,
job.files, loading_errors,
- job.ltime)
+ job.ltime, min_ltimes)
# Save all config files in Zookeeper (not just for the current tpc)
files_cache = self.unparsed_config_cache.getFilesCache(
@@ -1908,7 +2154,7 @@ class TenantParser(object):
job.ltime)
def _updateUnparsedBranchCache(self, abide, tenant, source_context, files,
- loading_errors, ltime):
+ loading_errors, ltime, min_ltimes):
loaded = False
tpc = tenant.project_configs[source_context.project_canonical_name]
# Make sure we are clearing the local cache before updating it.
@@ -1917,17 +2163,20 @@ class TenantParser(object):
branch_cache = abide.getUnparsedBranchCache(
source_context.project_canonical_name,
source_context.branch)
- for conf_root in (
- ('zuul.yaml', 'zuul.d', '.zuul.yaml', '.zuul.d') +
- tpc.extra_config_files + tpc.extra_config_dirs):
+ valid_dirs = ("zuul.d", ".zuul.d") + tpc.extra_config_dirs
+ for conf_root in (ZUUL_CONF_ROOT + tpc.extra_config_files
+ + tpc.extra_config_dirs):
for fn in sorted(files.keys()):
- fn_root = fn.split('/')[0]
- if fn_root != conf_root or not files.get(fn):
+ if not files.get(fn):
+ continue
+ if not (fn == conf_root
+ or (conf_root in valid_dirs
+ and fn.startswith(f"{conf_root}/"))):
continue
# Don't load from more than one configuration in a
# project-branch (unless an "extra" file/dir).
- if (conf_root not in tpc.extra_config_files and
- conf_root not in tpc.extra_config_dirs):
+ fn_root = fn.split('/')[0]
+ if (fn_root in ZUUL_CONF_ROOT):
if (loaded and loaded != conf_root):
self.log.warning("Multiple configuration files in %s",
source_context)
@@ -1943,6 +2192,9 @@ class TenantParser(object):
files[fn], source_context, loading_errors)
branch_cache.put(source_context.path, incdata)
branch_cache.setValidFor(tpc, ltime)
+ if min_ltimes is not None:
+ min_ltimes[source_context.project_canonical_name][
+ source_context.branch] = branch_cache.ltime
def _loadTenantYAML(self, abide, tenant, loading_errors):
config_projects_config = model.UnparsedConfig()
@@ -2167,6 +2419,10 @@ class TenantParser(object):
# Now that all the jobs are loaded, verify references to other
# config objects.
+ for nodeset in layout.nodesets.values():
+ with reference_exceptions('nodeset', nodeset,
+ layout.loading_errors):
+ nodeset.validateReferences(layout)
for jobs in layout.jobs.values():
for job in jobs:
with reference_exceptions('job', job, layout.loading_errors):
@@ -2256,16 +2512,7 @@ class TenantParser(object):
layout = model.Layout(tenant, layout_uuid)
layout.loading_errors = loading_errors
self.log.debug("Created layout id %s", layout.uuid)
-
self._addLayoutItems(layout, tenant, data)
-
- # Only call the postConfig hook if we have a scheduler as this will
- # change data in ZooKeeper. In case we are in a zuul-web context,
- # we don't want to do that.
- if self.scheduler:
- for pipeline in layout.pipelines.values():
- pipeline.manager._postConfig(layout)
-
return layout
@@ -2284,6 +2531,7 @@ class ConfigLoader(object):
connections, zk_client, scheduler, merger, keystorage,
zuul_globals, statsd)
self.admin_rule_parser = AuthorizationRuleParser()
+ self.global_semaphore_parser = GlobalSemaphoreParser()
def expandConfigPath(self, config_path):
if config_path:
@@ -2340,6 +2588,12 @@ class ConfigLoader(object):
admin_rule = self.admin_rule_parser.fromYaml(conf_admin_rule)
abide.admin_rules[admin_rule.name] = admin_rule
+ def loadSemaphores(self, abide, unparsed_abide):
+ abide.semaphores.clear()
+ for conf_semaphore in unparsed_abide.semaphores:
+ semaphore = self.global_semaphore_parser.fromYaml(conf_semaphore)
+ abide.semaphores[semaphore.name] = semaphore
+
def loadTPCs(self, abide, unparsed_abide, tenants=None):
if tenants:
tenants_to_load = {t: unparsed_abide.tenants[t] for t in tenants
@@ -2349,19 +2603,21 @@ class ConfigLoader(object):
# Pre-load TenantProjectConfigs so we can get and cache all of a
# project's config files (incl. tenant specific extra config) at once.
- for tenant_name, unparsed_config in tenants_to_load.items():
- config_tpcs, untrusted_tpcs = (
- self.tenant_parser.loadTenantProjects(unparsed_config)
- )
- abide.clearTPCs(tenant_name)
- for tpc in config_tpcs:
- abide.addConfigTPC(tenant_name, tpc)
- for tpc in untrusted_tpcs:
- abide.addUntrustedTPC(tenant_name, tpc)
+ with ThreadPoolExecutor(max_workers=4) as executor:
+ for tenant_name, unparsed_config in tenants_to_load.items():
+ config_tpcs, untrusted_tpcs = (
+ self.tenant_parser.loadTenantProjects(unparsed_config,
+ executor)
+ )
+ abide.clearTPCs(tenant_name)
+ for tpc in config_tpcs:
+ abide.addConfigTPC(tenant_name, tpc)
+ for tpc in untrusted_tpcs:
+ abide.addUntrustedTPC(tenant_name, tpc)
def loadTenant(self, abide, tenant_name, ansible_manager, unparsed_abide,
min_ltimes=None, layout_uuid=None,
- branch_cache_min_ltimes=None):
+ branch_cache_min_ltimes=None, ignore_cat_exception=True):
"""(Re-)load a single tenant.
Description of cache stages:
@@ -2436,9 +2692,11 @@ class ConfigLoader(object):
return None
unparsed_config = unparsed_abide.tenants[tenant_name]
- new_tenant = self.tenant_parser.fromYaml(
- abide, unparsed_config, ansible_manager, min_ltimes, layout_uuid,
- branch_cache_min_ltimes)
+ with ThreadPoolExecutor(max_workers=4) as executor:
+ new_tenant = self.tenant_parser.fromYaml(
+ abide, unparsed_config, ansible_manager, executor,
+ min_ltimes, layout_uuid, branch_cache_min_ltimes,
+ ignore_cat_exception)
# Copy tenants dictionary to not break concurrent iterations.
tenants = abide.tenants.copy()
tenants[tenant_name] = new_tenant
@@ -2462,7 +2720,8 @@ class ConfigLoader(object):
else:
# Use the cached branch list; since this is a dynamic
# reconfiguration there should not be any branch changes.
- branches = tenant.getProjectBranches(project.canonical_name)
+ branches = tenant.getProjectBranches(project.canonical_name,
+ include_always_dynamic=True)
for branch in branches:
fns1 = []
@@ -2509,8 +2768,7 @@ class ConfigLoader(object):
# Don't load from more than one configuration in a
# project-branch (unless an "extra" file/dir).
- if (conf_root not in tpc.extra_config_files and
- conf_root not in tpc.extra_config_dirs):
+ if (conf_root in ZUUL_CONF_ROOT):
if loaded and loaded != conf_root:
self.log.warning(
"Configuration in %s ignored because "
diff --git a/zuul/connection/__init__.py b/zuul/connection/__init__.py
index 03562102f..53be27d38 100644
--- a/zuul/connection/__init__.py
+++ b/zuul/connection/__init__.py
@@ -21,6 +21,10 @@ from zuul.lib.logutil import get_annotated_logger
from zuul.model import Project
+class ReadOnlyBranchCacheError(RuntimeError):
+ pass
+
+
class BaseConnection(object, metaclass=abc.ABCMeta):
"""Base class for connections.
@@ -204,9 +208,9 @@ class ZKBranchCacheMixin:
"""
# Figure out which queries we have a cache for
protected_branches = self._branch_cache.getProjectBranches(
- project.name, True)
+ project.name, True, default=None)
all_branches = self._branch_cache.getProjectBranches(
- project.name, False)
+ project.name, False, default=None)
# Update them if we have them
if protected_branches is not None:
@@ -234,22 +238,42 @@ class ZKBranchCacheMixin:
:returns: The list of branch names.
"""
exclude_unprotected = tenant.getExcludeUnprotectedBranches(project)
+ branches = None
+
if self._branch_cache:
- branches = self._branch_cache.getProjectBranches(
- project.name, exclude_unprotected, min_ltime)
- else:
- # Handle the case where tenant validation doesn't use the cache
- branches = None
+ try:
+ branches = self._branch_cache.getProjectBranches(
+ project.name, exclude_unprotected, min_ltime)
+ except LookupError:
+ if self.read_only:
+ # A scheduler hasn't attempted to fetch them yet
+ raise ReadOnlyBranchCacheError(
+ "Will not fetch project branches as read-only is set")
+ else:
+ branches = None
if branches is not None:
return sorted(branches)
-
- if self.read_only:
+ elif self.read_only:
+ # A scheduler has previously attempted a fetch, but got
+ # the None due to an error; we can't retry since we're
+ # read-only.
raise RuntimeError(
"Will not fetch project branches as read-only is set")
# We need to perform a query
- branches = self._fetchProjectBranches(project, exclude_unprotected)
+ try:
+ branches = self._fetchProjectBranches(project, exclude_unprotected)
+ except Exception:
+ # We weren't able to get the branches. We need to tell
+ # future schedulers to try again but tell zuul-web that we
+ # tried and failed. Set the branches to None to indicate
+ # that we have performed a fetch and retrieved no data. Any
+ # time we encounter None in the cache, we will try again.
+ if self._branch_cache:
+ self._branch_cache.setProjectBranches(
+ project.name, exclude_unprotected, None)
+ raise
self.log.info("Got branches for %s" % project.name)
if self._branch_cache:
@@ -289,7 +313,8 @@ class ZKBranchCacheMixin:
# cache, so we never clear it.
branches = self._branch_cache.getProjectBranches(
- project_name, True)
+ project_name, True, default=None)
+
if not branches:
branches = []
@@ -315,14 +340,14 @@ class ZKBranchCacheMixin:
# again.
event.branch_protected = True
- def clearBranchCache(self):
+ def clearBranchCache(self, projects=None):
"""Clear the branch cache
In case the branch cache gets out of sync with the source,
this method can be called to clear it and force querying the
source the next time the cache is used.
"""
- self._branch_cache.clear()
+ self._branch_cache.clear(projects)
class ZKChangeCacheMixin:
diff --git a/zuul/driver/auth/jwt.py b/zuul/driver/auth/jwt.py
index 7fe23f2ff..de2fca501 100644
--- a/zuul/driver/auth/jwt.py
+++ b/zuul/driver/auth/jwt.py
@@ -22,10 +22,34 @@ from urllib.parse import urljoin
from zuul import exceptions
from zuul.driver import AuthenticatorInterface
+from zuul.lib.config import any_to_bool
logger = logging.getLogger("zuul.auth.jwt")
+# A few notes on differences between the OpenID Connect specification
+# and OIDC as implemented by Microsoft, which necessitates several
+# extra configuration options:
+#
+# 1) The issuer (iss) returned in the JWT is not the authority, but
+# rather a URL referring to the AD instance, therefore authority must
+# be specified separately.
+# 2) The audience (aud) returned in the JWT is not the client_id, but
+# rather a URL constructed from the client_id, therefore must also be
+# specified separately.
+# 3) By default, the JWT is simply a forwarded copy of a token from
+# the Microsoft Graph service. It is signed by the graph service and
+# not the authority as requested, it therefore fails signature
+# validation. In order to cause the authority to generate its own
+# token signed by the expected keys, we must create a new scope
+# (api://.../zuul) and request that scope with the token.
+# 4) The userinfo service referred to by the JWT is the Microsoft
+# Graph service, which means that once our token is signed by the
+# Microsoft login keys (see item #3) the graph service is then unable
+# to validate the token. Therefore we must configure the javascript
+# oidc library not to request userinfo and rely only on what is
+# supplied in the token.
+
class JWTAuthenticator(AuthenticatorInterface):
"""The base class for JWT-based authentication."""
@@ -34,19 +58,17 @@ class JWTAuthenticator(AuthenticatorInterface):
# Common configuration for all authenticators
self.uid_claim = conf.get('uid_claim', 'sub')
self.issuer_id = conf.get('issuer_id')
- self.audience = conf.get('client_id')
+ self.authority = conf.get('authority', self.issuer_id)
+ self.client_id = conf.get('client_id')
+ self.audience = conf.get('audience', self.client_id)
self.realm = conf.get('realm')
- self.allow_authz_override = conf.get('allow_authz_override', False)
+ self.allow_authz_override = any_to_bool(
+ conf.get('allow_authz_override', False))
try:
self.skew = int(conf.get('skew', 0))
except Exception:
raise ValueError(
'skew must be an integer, got %s' % conf.get('skew'))
- if isinstance(self.allow_authz_override, str):
- if self.allow_authz_override.lower() == 'true':
- self.allow_authz_override = True
- else:
- self.allow_authz_override = False
try:
self.max_validity_time = float(conf.get('max_validity_time',
math.inf))
@@ -56,8 +78,8 @@ class JWTAuthenticator(AuthenticatorInterface):
def get_capabilities(self):
return {
self.realm: {
- 'authority': self.issuer_id,
- 'client_id': self.audience,
+ 'authority': self.authority,
+ 'client_id': self.client_id,
'type': 'JWT',
'driver': getattr(self, 'name', 'N/A'),
}
@@ -190,6 +212,8 @@ class OpenIDConnectAuthenticator(JWTAuthenticator):
super(OpenIDConnectAuthenticator, self).__init__(**conf)
self.keys_url = conf.get('keys_url', None)
self.scope = conf.get('scope', 'openid profile')
+ self.load_user_info = any_to_bool(
+ conf.get('load_user_info', True))
def get_key(self, key_id):
keys_url = self.keys_url
@@ -235,6 +259,7 @@ class OpenIDConnectAuthenticator(JWTAuthenticator):
def get_capabilities(self):
d = super(OpenIDConnectAuthenticator, self).get_capabilities()
d[self.realm]['scope'] = self.scope
+ d[self.realm]['load_user_info'] = self.load_user_info
return d
def _decode(self, rawToken):
diff --git a/zuul/driver/bubblewrap/__init__.py b/zuul/driver/bubblewrap/__init__.py
index 71919eb7b..69ade4748 100644
--- a/zuul/driver/bubblewrap/__init__.py
+++ b/zuul/driver/bubblewrap/__init__.py
@@ -22,7 +22,6 @@ import os
import psutil
import pwd
import shlex
-import sys
import threading
import re
import struct
@@ -41,17 +40,11 @@ class WrappedPopen(object):
def __call__(self, args, *sub_args, **kwargs):
try:
args = self.command + args
- if kwargs.get('close_fds') or sys.version_info.major >= 3:
- # The default in py3 is close_fds=True, so we need to pass
- # our open fds in. However, this can only work right in
- # py3.2 or later due to the lack of 'pass_fds' in prior
- # versions. So until we are py3 only we can only bwrap
- # things that are close_fds=False
- pass_fds = list(kwargs.get('pass_fds', []))
- for fd in self.fds:
- if fd not in pass_fds:
- pass_fds.append(fd)
- kwargs['pass_fds'] = pass_fds
+ pass_fds = list(kwargs.get('pass_fds', []))
+ for fd in self.fds:
+ if fd not in pass_fds:
+ pass_fds.append(fd)
+ kwargs['pass_fds'] = pass_fds
proc = psutil.Popen(args, *sub_args, **kwargs)
finally:
self.__del__()
diff --git a/zuul/driver/elasticsearch/connection.py b/zuul/driver/elasticsearch/connection.py
index e1ba50b37..eda15089f 100644
--- a/zuul/driver/elasticsearch/connection.py
+++ b/zuul/driver/elasticsearch/connection.py
@@ -95,7 +95,7 @@ class ElasticsearchConnection(BaseConnection):
def setIndex(self, index):
settings = {
'mappings': {
- 'zuul': {
+ '_doc': {
"properties": self.properties
}
}
@@ -113,7 +113,6 @@ class ElasticsearchConnection(BaseConnection):
source['@timestamp'] = datetime.utcfromtimestamp(
int(source['start_time'])).strftime("%Y-%m-%dT%H:%M:%S.%fZ")
d['_index'] = index
- d['_type'] = 'zuul'
d['_op_type'] = 'index'
d['_source'] = source
yield d
diff --git a/zuul/driver/elasticsearch/reporter.py b/zuul/driver/elasticsearch/reporter.py
index e35bbcd48..7802cb609 100644
--- a/zuul/driver/elasticsearch/reporter.py
+++ b/zuul/driver/elasticsearch/reporter.py
@@ -30,8 +30,10 @@ class ElasticsearchReporter(BaseReporter):
self.index_vars = self.config.get('index-vars')
self.index_returned_vars = self.config.get('index-returned-vars')
- def report(self, item):
+ def report(self, item, phase1=True, phase2=True):
"""Create an entry into a database."""
+ if not phase1:
+ return
docs = []
index = '%s.%s-%s' % (self.index, item.pipeline.tenant.name,
time.strftime("%Y.%m.%d"))
diff --git a/zuul/driver/gerrit/auth.py b/zuul/driver/gerrit/auth.py
index 61836e347..a826114b0 100644
--- a/zuul/driver/gerrit/auth.py
+++ b/zuul/driver/gerrit/auth.py
@@ -15,7 +15,7 @@
import logging
import requests
-from urllib.parse import urlparse
+from urllib.parse import urlparse, urlunparse
class FormAuth(requests.auth.AuthBase):
@@ -29,9 +29,8 @@ class FormAuth(requests.auth.AuthBase):
adapter = requests.adapters.HTTPAdapter()
request = _copy_request(response.request)
- u = urlparse.urlparse(response.url)
- url = urlparse.urlunparse([u.scheme, u.netloc, '/login',
- None, None, None])
+ u = urlparse(response.url)
+ url = urlunparse([u.scheme, u.netloc, '/login', None, None, None])
auth = {'username': self.username,
'password': self.password}
request2 = requests.Request('POST', url, data=auth).prepare()
diff --git a/zuul/driver/gerrit/gerritconnection.py b/zuul/driver/gerrit/gerritconnection.py
index 704ca2d2b..d8e4df586 100644
--- a/zuul/driver/gerrit/gerritconnection.py
+++ b/zuul/driver/gerrit/gerritconnection.py
@@ -103,10 +103,12 @@ class GerritChangeData(object):
SSH = 1
HTTP = 2
- def __init__(self, fmt, data, related=None, files=None):
+ def __init__(self, fmt, data, related=None, files=None,
+ zuul_query_ltime=None):
self.format = fmt
self.data = data
self.files = files
+ self.zuul_query_ltime = zuul_query_ltime
if fmt == self.SSH:
self.parseSSH(data)
@@ -197,7 +199,13 @@ class GerritEventConnector(threading.Thread):
time.sleep(1)
def _run(self):
+ self.log.info("Won connection event queue election for %s",
+ self.connection.connection_name)
while not self._stopped and self.event_queue.election.is_still_valid():
+ qlen = len(self.event_queue)
+ if qlen:
+ self.log.debug("Connection event queue length for %s: %s",
+ self.connection.connection_name, qlen)
for event in self.event_queue:
try:
self._handleEvent(event)
@@ -207,27 +215,35 @@ class GerritEventConnector(threading.Thread):
return
self._connector_wake_event.wait(10)
self._connector_wake_event.clear()
+ self.log.info("Terminating connection event queue processing for %s",
+ self.connection.connection_name)
def _handleEvent(self, connection_event):
timestamp = connection_event["timestamp"]
data = connection_event["payload"]
+ if "zuul_event_id" in connection_event:
+ zuul_event_id = connection_event["zuul_event_id"]
+ else:
+ # TODO: This is for backwards compat; Remove after 7.0.0
+ zuul_event_id = str(uuid4().hex)
+ log = get_annotated_logger(self.log, zuul_event_id)
+ now = time.time()
+ delay = max((timestamp + self.delay) - now, 0.0)
# Gerrit can produce inconsistent data immediately after an
# event, So ensure that we do not deliver the event to Zuul
# until at least a certain amount of time has passed. Note
# that if we receive several events in succession, we will
# only need to delay for the first event. In essence, Zuul
# should always be a constant number of seconds behind Gerrit.
- now = time.time()
- time.sleep(max((timestamp + self.delay) - now, 0.0))
+
+ log.debug("Handling event received %ss ago, delaying %ss",
+ now - timestamp, delay)
+ time.sleep(delay)
event = GerritTriggerEvent()
event.timestamp = timestamp
event.connection_name = self.connection.connection_name
-
- # Gerrit events don't have an event id that could be used to globally
- # identify this event in the system so we have to generate one.
- event.zuul_event_id = str(uuid4().hex)
- log = get_annotated_logger(self.log, event)
+ event.zuul_event_id = zuul_event_id
event.type = data.get('type')
event.uuid = data.get('uuid')
@@ -315,19 +331,20 @@ class GerritEventConnector(threading.Thread):
self.connection.clearConnectionCacheOnBranchEvent(event)
- self._getChange(event)
+ self._getChange(event, connection_event.zuul_event_ltime)
self.connection.logEvent(event)
self.connection.sched.addTriggerEvent(
self.connection.driver_name, event
)
- def _getChange(self, event):
+ def _getChange(self, event, connection_event_ltime):
# Grab the change if we are managing the project or if it exists in the
# cache as it may be a dependency
if event.change_number:
refresh = True
change_key = self.connection.source.getChangeKey(event)
- if self.connection._change_cache.get(change_key) is None:
+ change = self.connection._change_cache.get(change_key)
+ if change is None:
refresh = False
for tenant in self.connection.sched.abide.tenants.values():
# TODO(fungi): it would be better to have some simple means
@@ -339,6 +356,13 @@ class GerritEventConnector(threading.Thread):
event.project_name))):
refresh = True
break
+ else:
+ # We have a cache entry for this change Get the
+ # query ltime for the cache entry; if it's after the
+ # event ltime, we don't need to refresh.
+ if (change.zuul_query_ltime and
+ change.zuul_query_ltime > connection_event_ltime):
+ refresh = False
if refresh:
# Call _getChange for the side effect of updating the
@@ -565,6 +589,7 @@ class GerritConnection(ZKChangeCacheMixin, ZKBranchCacheMixin, BaseConnection):
_poller_class = GerritPoller
_ref_watcher_class = GitWatcher
ref_watcher_poll_interval = 60
+ submit_retry_backoff = 10
def __init__(self, driver, connection_name, connection_config):
super(GerritConnection, self).__init__(driver, connection_name,
@@ -578,6 +603,7 @@ class GerritConnection(ZKChangeCacheMixin, ZKBranchCacheMixin, BaseConnection):
self.user = self.connection_config.get('user')
self.server = self.connection_config.get('server')
+ self.ssh_server = self.connection_config.get('ssh_server', self.server)
self.canonical_hostname = self.connection_config.get(
'canonical_hostname', self.server)
self.port = int(self.connection_config.get('port', 29418))
@@ -680,6 +706,7 @@ class GerritConnection(ZKChangeCacheMixin, ZKBranchCacheMixin, BaseConnection):
"baseurl": self.baseurl,
"canonical_hostname": self.canonical_hostname,
"server": self.server,
+ "ssh_server": self.ssh_server,
"port": self.port,
})
return d
@@ -727,7 +754,8 @@ class GerritConnection(ZKChangeCacheMixin, ZKBranchCacheMixin, BaseConnection):
if r.status_code == 400:
raise HTTPBadRequestException('Received response 400: %s' % r.text)
elif r.status_code != 200:
- raise Exception("Received response %s" % (r.status_code,))
+ raise Exception("Received response %s: %s" % (
+ r.status_code, r.text))
ret = None
if r.text and len(r.text) > 4:
try:
@@ -881,6 +909,32 @@ class GerritConnection(ZKChangeCacheMixin, ZKBranchCacheMixin, BaseConnection):
records.append(result)
return [(x.number, x.current_patchset) for x in records]
+ def _getSubmittedTogether(self, change, event):
+ if not self.session:
+ return []
+ # We could probably ask for everything in one query, but it
+ # might be extremely large, so just get the change ids here
+ # and then query the individual changes.
+ log = get_annotated_logger(self.log, event)
+ log.debug("Updating %s: Looking for changes submitted together",
+ change)
+ ret = []
+ try:
+ data = self.get(f'changes/{change.number}/submitted_together')
+ except Exception:
+ log.error("Unable to find changes submitted together for %s",
+ change)
+ return ret
+ for c in data:
+ dep_change = c['_number']
+ dep_ps = c['revisions'][c['current_revision']]['_number']
+ if str(dep_change) == str(change.number):
+ continue
+ log.debug("Updating %s: Found change %s,%s submitted together",
+ change, dep_change, dep_ps)
+ ret.append((dep_change, dep_ps))
+ return ret
+
def _updateChange(self, key, change, event, history):
log = get_annotated_logger(self.log, event)
@@ -922,8 +976,6 @@ class GerritConnection(ZKChangeCacheMixin, ZKBranchCacheMixin, BaseConnection):
def _updateChangeDependencies(self, log, change, data, event, history):
if history is None:
history = []
- else:
- history = history[:]
history.append((change.number, change.patchset))
needs_changes = set()
@@ -999,6 +1051,41 @@ class GerritConnection(ZKChangeCacheMixin, ZKBranchCacheMixin, BaseConnection):
log.exception("Failed to get commit-needed change %s,%s",
dep_num, dep_ps)
+ for (dep_num, dep_ps) in self._getSubmittedTogether(change, event):
+ try:
+ log.debug("Updating %s: Getting submitted-together "
+ "change %s,%s",
+ change, dep_num, dep_ps)
+ # Because a submitted-together change may be a cross-repo
+ # dependency, cause that change to refresh so that it will
+ # reference the latest patchset of its Depends-On (this
+ # change). In case the dep is already in history we already
+ # refreshed this change so refresh is not needed in this case.
+ refresh = (dep_num, dep_ps) not in history
+ dep_key = ChangeKey(self.connection_name, None,
+ 'GerritChange', str(dep_num), str(dep_ps))
+ dep = self._getChange(
+ dep_key, refresh=refresh, history=history,
+ event=event)
+ # Gerrit changes to be submitted together do not
+ # necessarily get posted with dependency cycles using
+ # git trees and depends-on. However, they are
+ # functionally equivalent to a stack of changes with
+ # cycles using those methods. Here we set
+ # needs_changes and needed_by_changes as if there were
+ # a cycle. This ensures Zuul's cycle handling manages
+ # the submitted together changes properly.
+ if dep.open and dep not in needs_changes:
+ compat_needs_changes.append(dep.cache_key)
+ needs_changes.add(dep.cache_key)
+ if (dep.open and dep.is_current_patchset
+ and dep not in needed_by_changes):
+ compat_needed_by_changes.append(dep.cache_key)
+ needed_by_changes.add(dep.cache_key)
+ except Exception:
+ log.exception("Failed to get commit-needed change %s,%s",
+ dep_num, dep_ps)
+
self.updateChangeAttributes(
change,
git_needs_changes=git_needs_changes,
@@ -1137,23 +1224,27 @@ class GerritConnection(ZKChangeCacheMixin, ZKBranchCacheMixin, BaseConnection):
if data.get('type') in GerritEventConnector.IGNORED_EVENTS:
return
+ # Gerrit events don't have an event id that could be used to globally
+ # identify this event in the system so we have to generate one.
event = {
"timestamp": time.time(),
+ "zuul_event_id": str(uuid4().hex),
"payload": data
}
self.event_queue.put(event)
def review(self, item, message, submit, labels, checks_api,
- file_comments, zuul_event_id=None):
+ file_comments, phase1, phase2, zuul_event_id=None):
if self.session:
meth = self.review_http
else:
meth = self.review_ssh
return meth(item, message, submit, labels, checks_api,
- file_comments, zuul_event_id=zuul_event_id)
+ file_comments, phase1, phase2,
+ zuul_event_id=zuul_event_id)
def review_ssh(self, item, message, submit, labels, checks_api,
- file_comments, zuul_event_id=None):
+ file_comments, phase1, phase2, zuul_event_id=None):
log = get_annotated_logger(self.log, zuul_event_id)
if checks_api:
log.error("Zuul is configured to report to the checks API, "
@@ -1162,23 +1253,24 @@ class GerritConnection(ZKChangeCacheMixin, ZKBranchCacheMixin, BaseConnection):
change = item.change
project = change.project.name
cmd = 'gerrit review --project %s' % project
- if message:
- b_len = len(message.encode('utf-8'))
- if b_len >= GERRIT_HUMAN_MESSAGE_LIMIT:
- log.info("Message truncated %d > %d" %
- (b_len, GERRIT_HUMAN_MESSAGE_LIMIT))
- message = ("%s... (truncated)" %
- message[:GERRIT_HUMAN_MESSAGE_LIMIT - 20])
- cmd += ' --message %s' % shlex.quote(message)
- if submit:
+ if phase1:
+ if message:
+ b_len = len(message.encode('utf-8'))
+ if b_len >= GERRIT_HUMAN_MESSAGE_LIMIT:
+ log.info("Message truncated %d > %d" %
+ (b_len, GERRIT_HUMAN_MESSAGE_LIMIT))
+ message = ("%s... (truncated)" %
+ message[:GERRIT_HUMAN_MESSAGE_LIMIT - 20])
+ cmd += ' --message %s' % shlex.quote(message)
+ for key, val in labels.items():
+ if val is True:
+ cmd += ' --%s' % key
+ else:
+ cmd += ' --label %s=%s' % (key, val)
+ if self.version >= (2, 13, 0):
+ cmd += ' --tag autogenerated:zuul:%s' % (item.pipeline.name)
+ if phase2 and submit:
cmd += ' --submit'
- for key, val in labels.items():
- if val is True:
- cmd += ' --%s' % key
- else:
- cmd += ' --label %s=%s' % (key, val)
- if self.version >= (2, 13, 0):
- cmd += ' --tag autogenerated:zuul:%s' % (item.pipeline.name)
changeid = '%s,%s' % (change.number, change.patchset)
cmd += ' %s' % changeid
out, err = self._ssh(cmd, zuul_event_id=zuul_event_id)
@@ -1225,14 +1317,19 @@ class GerritConnection(ZKChangeCacheMixin, ZKBranchCacheMixin, BaseConnection):
log.exception(
"Bad request submitting check data to gerrit.")
break
- except Exception:
- log.exception("Error submitting check data to gerrit, "
- "attempt %s", x)
- time.sleep(x * 10)
+ except Exception as e:
+ log.exception("Error submitting check data to gerrit on "
+ "attempt %s: %s", x, e)
+ time.sleep(x * self.submit_retry_backoff)
def review_http(self, item, message, submit, labels,
- checks_api, file_comments, zuul_event_id=None):
+ checks_api, file_comments, phase1, phase2,
+ zuul_event_id=None):
change = item.change
+ changeid = "%s~%s~%s" % (
+ urllib.parse.quote(str(change.project), safe=''),
+ urllib.parse.quote(str(change.branch), safe=''),
+ change.id)
log = get_annotated_logger(self.log, zuul_event_id)
b_len = len(message.encode('utf-8'))
if b_len >= GERRIT_HUMAN_MESSAGE_LIMIT:
@@ -1240,68 +1337,70 @@ class GerritConnection(ZKChangeCacheMixin, ZKBranchCacheMixin, BaseConnection):
(b_len, GERRIT_HUMAN_MESSAGE_LIMIT))
message = ("%s... (truncated)" %
message[:GERRIT_HUMAN_MESSAGE_LIMIT - 20])
- data = dict(message=message,
- strict_labels=False)
- if change.is_current_patchset:
- if labels:
- data['labels'] = labels
- if file_comments:
- if self.version >= (2, 15, 0):
- file_comments = copy.deepcopy(file_comments)
- url = item.formatStatusUrl()
- for comments in itertools.chain(file_comments.values()):
- for comment in comments:
- comment['robot_id'] = 'zuul'
- comment['robot_run_id'] = \
- item.current_build_set.uuid
- if url:
- comment['url'] = url
- data['robot_comments'] = file_comments
- else:
- data['comments'] = file_comments
- if self.version >= (2, 13, 0):
- data['tag'] = 'autogenerated:zuul:%s' % (item.pipeline.name)
- changeid = "%s~%s~%s" % (
- urllib.parse.quote(str(change.project), safe=''),
- urllib.parse.quote(str(change.branch), safe=''),
- change.id)
- if checks_api:
- self.report_checks(log, item, changeid, checks_api)
- if (message or data.get('labels') or data.get('comments')
- or data.get('robot_comments')):
- for x in range(1, 4):
- try:
- self.post('changes/%s/revisions/%s/review' %
- (changeid, change.commit),
- data)
- break
- except HTTPConflictException:
- log.exception("Conflict submitting data to gerrit.")
- break
- except HTTPBadRequestException:
- log.exception(
- "Bad request submitting check data to gerrit.")
- break
- except Exception:
- log.exception(
- "Error submitting data to gerrit, attempt %s", x)
- time.sleep(x * 10)
- if change.is_current_patchset and submit:
+ data = dict(strict_labels=False)
+ if phase1:
+ data['message'] = message
+ if change.is_current_patchset:
+ if labels:
+ data['labels'] = labels
+ if file_comments:
+ if self.version >= (2, 15, 0):
+ file_comments = copy.deepcopy(file_comments)
+ url = item.formatStatusUrl()
+ for comments in itertools.chain(
+ file_comments.values()):
+ for comment in comments:
+ comment['robot_id'] = 'zuul'
+ comment['robot_run_id'] = \
+ item.current_build_set.uuid
+ if url:
+ comment['url'] = url
+ data['robot_comments'] = file_comments
+ else:
+ data['comments'] = file_comments
+ if self.version >= (2, 13, 0):
+ data['tag'] = 'autogenerated:zuul:%s' % (item.pipeline.name)
+ if checks_api:
+ self.report_checks(log, item, changeid, checks_api)
+ if (message or data.get('labels') or data.get('comments')
+ or data.get('robot_comments')):
+ for x in range(1, 4):
+ try:
+ self.post('changes/%s/revisions/%s/review' %
+ (changeid, change.commit),
+ data)
+ break
+ except HTTPConflictException:
+ log.exception("Conflict submitting data to gerrit.")
+ break
+ except HTTPBadRequestException:
+ log.exception(
+ "Bad request submitting check data to gerrit.")
+ break
+ except Exception as e:
+ log.exception(
+ "Error submitting data to gerrit "
+ "on attempt %s: %s",
+ x, e)
+ time.sleep(x * self.submit_retry_backoff)
+ if phase2 and change.is_current_patchset and submit:
for x in range(1, 4):
try:
self.post('changes/%s/submit' % (changeid,), {})
break
except HTTPConflictException:
- log.exception("Conflict submitting data to gerrit.")
+ log.info("Conflict submitting data to gerrit, "
+ "change may already be merged")
break
except HTTPBadRequestException:
log.exception(
"Bad request submitting check data to gerrit.")
break
- except Exception:
+ except Exception as e:
log.exception(
- "Error submitting data to gerrit, attempt %s", x)
- time.sleep(x * 10)
+ "Error submitting data to gerrit on attempt %s: %s",
+ x, e)
+ time.sleep(x * self.submit_retry_backoff)
def queryChangeSSH(self, number, event=None):
args = '--all-approvals --comments --commit-message'
@@ -1334,15 +1433,20 @@ class GerritConnection(ZKChangeCacheMixin, ZKBranchCacheMixin, BaseConnection):
def queryChange(self, number, event=None):
for attempt in range(3):
+ # Get a query ltime -- any events before this point should be
+ # included in our change data.
+ zuul_query_ltime = self.sched.zk_client.getCurrentLtime()
try:
if self.session:
data, related, files = self.queryChangeHTTP(
number, event=event)
return GerritChangeData(GerritChangeData.HTTP,
- data, related, files)
+ data, related, files,
+ zuul_query_ltime=zuul_query_ltime)
else:
data = self.queryChangeSSH(number, event=event)
- return GerritChangeData(GerritChangeData.SSH, data)
+ return GerritChangeData(GerritChangeData.SSH, data,
+ zuul_query_ltime=zuul_query_ltime)
except Exception:
if attempt >= 3:
raise
@@ -1386,7 +1490,7 @@ class GerritConnection(ZKChangeCacheMixin, ZKBranchCacheMixin, BaseConnection):
# for large projects like nova
alldata = []
chunk, more_changes = _query_chunk(query, event)
- while(chunk):
+ while chunk:
alldata.extend(chunk)
if more_changes is None:
# continue sortKey based (before Gerrit 2.9)
@@ -1475,7 +1579,7 @@ class GerritConnection(ZKChangeCacheMixin, ZKBranchCacheMixin, BaseConnection):
client.set_missing_host_key_policy(paramiko.WarningPolicy())
# SSH banner, handshake, and auth timeouts default to 15
# seconds, so we only set the socket timeout here.
- client.connect(self.server,
+ client.connect(self.ssh_server,
username=self.user,
port=self.port,
key_filename=self.keyfile,
@@ -1566,7 +1670,7 @@ class GerritConnection(ZKChangeCacheMixin, ZKBranchCacheMixin, BaseConnection):
baseurl = urllib.parse.urlunparse(baseurl)
url = ('%s/a/%s' % (baseurl, project.name))
else:
- url = 'ssh://%s@%s:%s/%s' % (self.user, self.server, self.port,
+ url = 'ssh://%s@%s:%s/%s' % (self.user, self.ssh_server, self.port,
project.name)
return url
@@ -1657,7 +1761,7 @@ class GerritConnection(ZKChangeCacheMixin, ZKBranchCacheMixin, BaseConnection):
self.watcher_thread = GerritWatcher(
self,
self.user,
- self.server,
+ self.ssh_server,
self.port,
keyfile=self.keyfile,
keepalive=self.keepalive)
diff --git a/zuul/driver/gerrit/gerritmodel.py b/zuul/driver/gerrit/gerritmodel.py
index 1cdf77ccc..0ac3e7f9d 100644
--- a/zuul/driver/gerrit/gerritmodel.py
+++ b/zuul/driver/gerrit/gerritmodel.py
@@ -35,8 +35,10 @@ class GerritChange(Change):
self.approvals = []
self.missing_labels = set()
self.commit = None
+ self.zuul_query_ltime = None
def update(self, data, connection):
+ self.zuul_query_ltime = data.zuul_query_ltime
if data.format == data.SSH:
self.updateFromSSH(data.data, connection)
else:
@@ -51,6 +53,7 @@ class GerritChange(Change):
"approvals": self.approvals,
"missing_labels": list(self.missing_labels),
"commit": self.commit,
+ "zuul_query_ltime": self.zuul_query_ltime,
})
return d
@@ -62,6 +65,7 @@ class GerritChange(Change):
self.approvals = data["approvals"]
self.missing_labels = set(data["missing_labels"])
self.commit = data.get("commit")
+ self.zuul_query_ltime = data.get("zuul_query_ltime")
def updateFromSSH(self, data, connection):
if self.patchset is None:
@@ -114,6 +118,7 @@ class GerritChange(Change):
self.wip = data.get('wip', False)
self.owner = data['owner'].get('username')
self.message = data['commitMessage']
+ self.topic = data.get('topic')
self.missing_labels = set()
for sr in data.get('submitRecords', []):
@@ -189,6 +194,7 @@ class GerritChange(Change):
self.wip = data.get('work_in_progress', False)
self.owner = data['owner'].get('username')
self.message = current_revision['commit']['message']
+ self.topic = data.get('topic')
class GerritTriggerEvent(TriggerEvent):
@@ -489,7 +495,7 @@ class GerritEventFilter(EventFilter, GerritApprovalFilter):
class GerritRefFilter(RefFilter, GerritApprovalFilter):
def __init__(self, connection_name, open=None, current_patchset=None,
- statuses=[], required_approvals=[],
+ wip=None, statuses=[], required_approvals=[],
reject_approvals=[]):
RefFilter.__init__(self, connection_name)
@@ -498,6 +504,7 @@ class GerritRefFilter(RefFilter, GerritApprovalFilter):
reject_approvals=reject_approvals)
self.open = open
+ self.wip = wip
self.current_patchset = current_patchset
self.statuses = statuses
@@ -522,23 +529,30 @@ class GerritRefFilter(RefFilter, GerritApprovalFilter):
return ret
def matches(self, change):
- if self.open is not None:
- # if a "change" has no number, it's not a change, but a push
- # and cannot possibly pass this test.
- if hasattr(change, 'number'):
- if self.open != change.open:
- return False
- else:
- return False
- if self.current_patchset is not None:
- # if a "change" has no number, it's not a change, but a push
- # and cannot possibly pass this test.
- if hasattr(change, 'number'):
- if self.current_patchset != change.is_current_patchset:
- return False
- else:
+ filters = [
+ {
+ "required": self.open,
+ "value": change.open
+ },
+ {
+ "required": self.current_patchset,
+ "value": change.is_current_patchset
+ },
+ {
+ "required": self.wip,
+ "value": change.wip
+ },
+ ]
+ configured = filter(lambda x: x["required"] is not None, filters)
+
+ # if a "change" has no number, it's not a change, but a push
+ # and cannot possibly pass this test.
+ if hasattr(change, 'number'):
+ if any(map(lambda x: x["required"] != x["value"], configured)):
return False
+ elif configured:
+ return False
if self.statuses:
if change.status not in self.statuses:
diff --git a/zuul/driver/gerrit/gerritreporter.py b/zuul/driver/gerrit/gerritreporter.py
index fbee0e0ec..c38a9484a 100644
--- a/zuul/driver/gerrit/gerritreporter.py
+++ b/zuul/driver/gerrit/gerritreporter.py
@@ -16,6 +16,7 @@ import logging
import voluptuous as v
from zuul.driver.gerrit.gerritsource import GerritSource
+from zuul.driver.gerrit.gerritmodel import GerritChange
from zuul.lib.logutil import get_annotated_logger
from zuul.model import Change
from zuul.reporter import BaseReporter
@@ -35,7 +36,10 @@ class GerritReporter(BaseReporter):
self._checks_api = action.pop('checks-api', None)
self._labels = action
- def report(self, item):
+ def __repr__(self):
+ return f"<GerritReporter: {self._action}>"
+
+ def report(self, item, phase1=True, phase2=True):
"""Send a message to gerrit."""
log = get_annotated_logger(self.log, item.event)
@@ -65,12 +69,33 @@ class GerritReporter(BaseReporter):
log.debug("Report change %s, params %s, message: %s, comments: %s",
item.change, self.config, message, comments)
- item.change._ref_sha = item.change.project.source.getRefSha(
- item.change.project, 'refs/heads/' + item.change.branch)
+ if phase2 and self._submit and not hasattr(item.change, '_ref_sha'):
+ # If we're starting to submit a bundle, save the current
+ # ref sha for every item in the bundle.
+ changes = set([item.change])
+ if item.bundle:
+ for i in item.bundle.items:
+ changes.add(i.change)
+
+ # Store a dict of project,branch -> sha so that if we have
+ # duplicate project/branches, we only query once.
+ ref_shas = {}
+ for other_change in changes:
+ if not isinstance(other_change, GerritChange):
+ continue
+ key = (other_change.project, other_change.branch)
+ ref_sha = ref_shas.get(key)
+ if not ref_sha:
+ ref_sha = other_change.project.source.getRefSha(
+ other_change.project,
+ 'refs/heads/' + other_change.branch)
+ ref_shas[key] = ref_sha
+ other_change._ref_sha = ref_sha
return self.connection.review(item, message, self._submit,
self._labels, self._checks_api,
- comments, zuul_event_id=item.event)
+ comments, phase1, phase2,
+ zuul_event_id=item.event)
def getSubmitAllowNeeds(self):
"""Get a list of code review labels that are allowed to be
diff --git a/zuul/driver/gerrit/gerritsource.py b/zuul/driver/gerrit/gerritsource.py
index 086323e3c..f1d74037e 100644
--- a/zuul/driver/gerrit/gerritsource.py
+++ b/zuul/driver/gerrit/gerritsource.py
@@ -143,6 +143,36 @@ class GerritSource(BaseSource):
changes.append(change)
return changes
+ def getChangesByTopic(self, topic, changes=None):
+ if not topic:
+ return []
+
+ if changes is None:
+ changes = {}
+
+ query = 'status:open topic:%s' % topic
+ results = self.connection.simpleQuery(query)
+ for result in results:
+ change_key = ChangeKey(self.connection.connection_name, None,
+ 'GerritChange',
+ str(result.number),
+ str(result.current_patchset))
+ if change_key in changes:
+ continue
+
+ change = self.connection._getChange(change_key)
+ changes[change_key] = change
+
+ for change in changes.values():
+ for git_key in change.git_needs_changes:
+ if git_key in changes:
+ continue
+ git_change = self.getChange(git_key)
+ if not git_change.topic or git_change.topic == topic:
+ continue
+ self.getChangesByTopic(git_change.topic, changes)
+ return list(changes.values())
+
def getCachedChanges(self):
yield from self.connection._change_cache
@@ -173,6 +203,7 @@ class GerritSource(BaseSource):
connection_name=self.connection.connection_name,
open=config.get('open'),
current_patchset=config.get('current-patchset'),
+ wip=config.get('wip'),
statuses=to_list(config.get('status')),
required_approvals=to_list(config.get('approval')),
)
@@ -204,6 +235,7 @@ def getRequireSchema():
require = {'approval': scalar_or_list(approval),
'open': bool,
'current-patchset': bool,
+ 'wip': bool,
'status': scalar_or_list(str)}
return require
diff --git a/zuul/driver/gerrit/gerrittrigger.py b/zuul/driver/gerrit/gerrittrigger.py
index 3f78b86c1..dc8a7db68 100644
--- a/zuul/driver/gerrit/gerrittrigger.py
+++ b/zuul/driver/gerrit/gerrittrigger.py
@@ -85,7 +85,8 @@ def getSchema():
'comment-added',
'ref-updated',
'pending-check',
- 'vote-deleted')),
+ 'vote-deleted',
+ 'wip-state-changed')),
'uuid': str,
'scheme': str,
'comment_filter': scalar_or_list(str),
diff --git a/zuul/driver/github/githubconnection.py b/zuul/driver/github/githubconnection.py
index ae7e951e3..04759c15f 100644
--- a/zuul/driver/github/githubconnection.py
+++ b/zuul/driver/github/githubconnection.py
@@ -334,7 +334,9 @@ class GithubEventProcessor(object):
self.zuul_event_id = self.delivery
self.log = get_annotated_logger(logger, self.zuul_event_id)
self.connection_event = connection_event
- self.event = None
+ # We typically return a list of one event, but we can return
+ # multiple Zuul events from a single Github event.
+ self.events = []
def run(self):
self.log.debug("Starting event processing")
@@ -344,7 +346,7 @@ class GithubEventProcessor(object):
self.log.exception("Exception when processing event:")
finally:
self.log.debug("Finished event processing")
- return self.event, self.connection_event
+ return self.events, self.connection_event
def _process_event(self):
if self.connector._stopped:
@@ -377,17 +379,20 @@ class GithubEventProcessor(object):
return
self.log.debug("Handling %s event", self.event_type)
- event = None
+ events = []
try:
- event = method()
+ events = method()
+ if not events:
+ events = []
+ elif not isinstance(events, list):
+ events = [events]
except Exception:
# NOTE(pabelanger): We should report back to the PR we could
# not process the event, to give the user a chance to
# retrigger.
self.log.exception('Exception when handling event:')
- if event:
-
+ for event in events:
# Note we limit parallel requests per installation id to avoid
# triggering abuse detection.
with self.connection.get_request_lock(installation_id):
@@ -418,7 +423,7 @@ class GithubEventProcessor(object):
protected=protected)
event.project_hostname = self.connection.canonical_hostname
- self.event = event
+ self.events = events
def _event_push(self):
base_repo = self.body.get('repository')
@@ -601,6 +606,64 @@ class GithubEventProcessor(object):
event.check_run = check_run_tuple
return event
+ def _event_branch_protection_rule(self):
+ # This method can return any number of events depending on
+ # which branches changed their protection status.
+ project_name = self.body.get('repository').get('full_name')
+ project = self.connection.source.getProject(project_name)
+
+ # Save all protected branches
+ cached_branches = self.connection._branch_cache.getProjectBranches(
+ project_name, True, default=None)
+
+ if cached_branches is None:
+ raise RuntimeError(f"No branches for project {project_name}")
+ old_protected_branches = set(cached_branches)
+
+ # Update the project banches
+ self.log.debug('Updating branches for %s after '
+ 'branch protection rule "%s" was %s',
+ project,
+ self.body.get('rule').get('name'),
+ self.body.get('action'))
+ self.connection.updateProjectBranches(project)
+
+ # Get all protected branches
+ new_protected_branches = set(
+ self.connection._branch_cache.getProjectBranches(
+ project_name, True))
+
+ newly_protected = new_protected_branches - old_protected_branches
+ newly_unprotected = old_protected_branches - new_protected_branches
+ # Emit events for changed branches
+
+ events = []
+ for branch in newly_protected:
+ self.log.debug("Generating synthetic event for newly "
+ "protected branch %s in %s",
+ branch, project_name)
+ events.append(
+ self._branch_protection_rule_to_event(project_name, branch))
+ for branch in newly_unprotected:
+ self.log.debug("Generating synthetic event for newly "
+ "unprotected branch %s in %s",
+ branch, project_name)
+ events.append(
+ self._branch_protection_rule_to_event(project_name, branch))
+ return events
+
+ def _branch_protection_rule_to_event(self, project_name, branch):
+ event = GithubTriggerEvent()
+ event.connection_name = self.connection.connection_name
+ event.trigger_name = 'github'
+ event.project_name = project_name
+ event.branch_protection_changed = True
+ event.type = 'branch_protection_rule'
+
+ event.ref = f'refs/heads/{branch}'
+ event.branch = branch
+ return event
+
def _check_run_action_to_event(self, check_run, project):
# Extract necessary values from the check's external id to dequeue
# the corresponding change in Zuul
@@ -771,17 +834,17 @@ class GithubEventConnector:
if not self._event_forward_queue[0].done():
return
future = self._event_forward_queue.popleft()
- event, connection_event = future.result()
+ events, connection_event = future.result()
try:
- if not event:
- continue
- self.connection.logEvent(event)
- if isinstance(event, DequeueEvent):
- self.connection.sched.addChangeManagementEvent(event)
- else:
- self.connection.sched.addTriggerEvent(
- self.connection.driver_name, event
- )
+ for event in events:
+ self.connection.logEvent(event)
+ if isinstance(event, DequeueEvent):
+ self.connection.sched.addChangeManagementEvent(
+ event)
+ else:
+ self.connection.sched.addTriggerEvent(
+ self.connection.driver_name, event
+ )
finally:
# Ack event in Zookeeper
self.event_queue.ack(connection_event)
@@ -1208,6 +1271,21 @@ class GithubConnection(ZKChangeCacheMixin, ZKBranchCacheMixin, BaseConnection):
self.server = self.connection_config.get('server', 'github.com')
self.canonical_hostname = self.connection_config.get(
'canonical_hostname', self.server)
+ self.repo_cache = self.connection_config.get('repo_cache')
+ if self.git_ssh_key and self.repo_cache:
+ self.log.warning("Both sshkey and repo_cache specified "
+ "but are incompatible; "
+ "repo_cache will be ignored")
+ self.repo_cache = None
+ if self.repo_cache:
+ rrt = self.connection_config.get('repo_retry_timeout')
+ if rrt:
+ self.repo_retry_timeout = int(rrt)
+ else:
+ self.repo_retry_timeout = None
+ else:
+ self.repo_retry_timeout = None
+
self.source = driver.getSource(self)
self._sha_pr_cache = GithubShaCache()
@@ -1229,6 +1307,7 @@ class GithubConnection(ZKChangeCacheMixin, ZKBranchCacheMixin, BaseConnection):
"baseurl": self._github_client_manager.base_url,
"canonical_hostname": self.canonical_hostname,
"server": self.server,
+ "repo_cache": self.repo_cache,
})
return d
@@ -1506,6 +1585,7 @@ class GithubConnection(ZKChangeCacheMixin, ZKBranchCacheMixin, BaseConnection):
change.patchset)
change.ref = "refs/pull/%s/head" % change.number
change.branch = change.pr.get('base').get('ref')
+ change.base_sha = change.pr.get('base').get('sha')
change.commit_id = change.pr.get('head').get('sha')
change.owner = change.pr.get('user').get('login')
# Don't overwrite the files list. The change object is bound to a
@@ -1607,6 +1687,11 @@ class GithubConnection(ZKChangeCacheMixin, ZKBranchCacheMixin, BaseConnection):
if not self._github_client_manager.initialized:
self._github_client_manager.initialize()
+ if self.repo_cache:
+ server = self.repo_cache
+ else:
+ server = self.server
+
if self._github_client_manager.usesAppAuthentication:
# We may be in the context of a merger or executor here. The
# mergers and executors don't receive webhook events so they miss
@@ -1616,10 +1701,10 @@ class GithubConnection(ZKChangeCacheMixin, ZKBranchCacheMixin, BaseConnection):
self._github_client_manager.get_installation_key(
project.name, reprime=True)
return 'https://x-access-token:%s@%s/%s' % (installation_key,
- self.server,
+ server,
project.name)
- return 'https://%s/%s' % (self.server, project.name)
+ return 'https://%s/%s' % (server, project.name)
def getGitwebUrl(self, project, sha=None, tag=None):
url = 'https://%s/%s' % (self.server, project)
diff --git a/zuul/driver/github/githubmodel.py b/zuul/driver/github/githubmodel.py
index 7c24b95a9..5fa076316 100644
--- a/zuul/driver/github/githubmodel.py
+++ b/zuul/driver/github/githubmodel.py
@@ -108,6 +108,7 @@ class GithubTriggerEvent(TriggerEvent):
self.status = None
self.commits = []
self.body_edited = None
+ self.branch_protection_changed = None
def toDict(self):
d = super().toDict()
@@ -120,6 +121,7 @@ class GithubTriggerEvent(TriggerEvent):
d["status"] = self.status
d["commits"] = self.commits
d["body_edited"] = self.body_edited
+ d["branch_protection_changed"] = self.branch_protection_changed
return d
def updateFromDict(self, d):
@@ -133,6 +135,10 @@ class GithubTriggerEvent(TriggerEvent):
self.status = d["status"]
self.commits = d["commits"]
self.body_edited = d["body_edited"]
+ self.branch_protection_changed = d.get("branch_protection_changed")
+
+ def isBranchProtectionChanged(self):
+ return bool(self.branch_protection_changed)
def isPatchsetCreated(self):
if self.type == 'pull_request':
diff --git a/zuul/driver/github/githubreporter.py b/zuul/driver/github/githubreporter.py
index fe93727b9..8c5e8944c 100644
--- a/zuul/driver/github/githubreporter.py
+++ b/zuul/driver/github/githubreporter.py
@@ -55,7 +55,7 @@ class GithubReporter(BaseReporter):
self._unlabels = [self._unlabels]
self.context = "{}/{}".format(pipeline.tenant.name, pipeline.name)
- def report(self, item):
+ def report(self, item, phase1=True, phase2=True):
"""Report on an event."""
# If the source is not GithubSource we cannot report anything here.
if not isinstance(item.change.project.source, GithubSource):
@@ -69,7 +69,7 @@ class GithubReporter(BaseReporter):
# order is important for github branch protection.
# A status should be set before a merge attempt
- if self._commit_status is not None:
+ if phase1 and self._commit_status is not None:
if (hasattr(item.change, 'patchset') and
item.change.patchset is not None):
self.setCommitStatus(item)
@@ -80,22 +80,24 @@ class GithubReporter(BaseReporter):
# If the change is not a pull request (e.g. a push) skip them.
if hasattr(item.change, 'number'):
errors_received = False
- if self._labels or self._unlabels:
- self.setLabels(item)
- if self._review:
- self.addReview(item)
- if self._check:
- check_errors = self.updateCheck(item)
- # TODO (felix): We could use this mechanism to also report back
- # errors from label and review actions
- if check_errors:
- item.current_build_set.warning_messages.extend(
- check_errors
- )
- errors_received = True
- if self._create_comment or errors_received:
- self.addPullComment(item)
- if (self._merge):
+ if phase1:
+ if self._labels or self._unlabels:
+ self.setLabels(item)
+ if self._review:
+ self.addReview(item)
+ if self._check:
+ check_errors = self.updateCheck(item)
+ # TODO (felix): We could use this mechanism to
+ # also report back errors from label and review
+ # actions
+ if check_errors:
+ item.current_build_set.warning_messages.extend(
+ check_errors
+ )
+ errors_received = True
+ if self._create_comment or errors_received:
+ self.addPullComment(item)
+ if phase2 and self._merge:
try:
self.mergePull(item)
except Exception as e:
@@ -133,9 +135,12 @@ class GithubReporter(BaseReporter):
def _formatItemReportJobs(self, item):
# Return the list of jobs portion of the report
ret = ''
- jobs_fields = self._getItemReportJobsFields(item)
+ jobs_fields, skipped = self._getItemReportJobsFields(item)
for job_fields in jobs_fields:
ret += self._formatJobResult(job_fields)
+ if skipped:
+ jobtext = 'job' if skipped == 1 else 'jobs'
+ ret += 'Skipped %i %s\n' % (skipped, jobtext)
return ret
def addPullComment(self, item, comment=None):
diff --git a/zuul/driver/github/githubsource.py b/zuul/driver/github/githubsource.py
index ebf3abae0..7d4815237 100644
--- a/zuul/driver/github/githubsource.py
+++ b/zuul/driver/github/githubsource.py
@@ -150,6 +150,10 @@ class GithubSource(BaseSource):
"""Get the git url for a project."""
return self.connection.getGitUrl(project)
+ def getRetryTimeout(self, project):
+ """Get the retry timeout for a project."""
+ return self.connection.repo_retry_timeout
+
def getGitwebUrl(self, project, sha=None):
"""Get the git-web url for a project."""
return self.connection.getGitwebUrl(project, sha)
diff --git a/zuul/driver/gitlab/gitlabconnection.py b/zuul/driver/gitlab/gitlabconnection.py
index 1175c136a..71c5488a8 100644
--- a/zuul/driver/gitlab/gitlabconnection.py
+++ b/zuul/driver/gitlab/gitlabconnection.py
@@ -431,7 +431,8 @@ class GitlabAPIClient():
params = {}
if method == "squash":
params['squash'] = True
- resp = self.put(self.baseurl + path, zuul_event_id=zuul_event_id)
+ resp = self.put(
+ self.baseurl + path, params, zuul_event_id=zuul_event_id)
try:
self._manage_error(*resp, zuul_event_id=zuul_event_id)
if resp[0]['state'] != 'merged':
@@ -660,6 +661,7 @@ class GitlabConnection(ZKChangeCacheMixin, ZKBranchCacheMixin, BaseConnection):
change.ref = "refs/merge-requests/%s/head" % change.number
change.branch = change.mr['target_branch']
change.is_current_patchset = (change.mr['sha'] == change.patchset)
+ change.base_sha = change.mr['diff_refs'].get('base_sha')
change.commit_id = change.mr['diff_refs'].get('head_sha')
change.owner = change.mr['author'].get('username')
# Files changes are not part of the Merge Request data
diff --git a/zuul/driver/gitlab/gitlabreporter.py b/zuul/driver/gitlab/gitlabreporter.py
index f364521f5..819c89c47 100644
--- a/zuul/driver/gitlab/gitlabreporter.py
+++ b/zuul/driver/gitlab/gitlabreporter.py
@@ -50,7 +50,7 @@ class GitlabReporter(BaseReporter):
if not isinstance(self._unlabels, list):
self._unlabels = [self._unlabels]
- def report(self, item):
+ def report(self, item, phase1=True, phase2=True):
"""Report on an event."""
if not isinstance(item.change.project.source, GitlabSource):
return
@@ -60,13 +60,14 @@ class GitlabReporter(BaseReporter):
return
if hasattr(item.change, 'number'):
- if self._create_comment:
- self.addMRComment(item)
- if self._approval is not None:
- self.setApproval(item)
- if self._labels or self._unlabels:
- self.setLabels(item)
- if self._merge:
+ if phase1:
+ if self._create_comment:
+ self.addMRComment(item)
+ if self._approval is not None:
+ self.setApproval(item)
+ if self._labels or self._unlabels:
+ self.setLabels(item)
+ if phase2 and self._merge:
self.mergeMR(item)
if not item.change.is_merged:
msg = self._formatItemReportMergeConflict(item)
diff --git a/zuul/driver/mqtt/mqttreporter.py b/zuul/driver/mqtt/mqttreporter.py
index a53389337..5c95a19ea 100644
--- a/zuul/driver/mqtt/mqttreporter.py
+++ b/zuul/driver/mqtt/mqttreporter.py
@@ -27,7 +27,10 @@ class MQTTReporter(BaseReporter):
name = 'mqtt'
log = logging.getLogger("zuul.MQTTReporter")
- def report(self, item):
+ def report(self, item, phase1=True, phase2=True):
+ if not phase1:
+ return
+ include_returned_data = self.config.get('include-returned-data')
log = get_annotated_logger(self.log, item.event)
log.debug("Report change %s, params %s", item.change, self.config)
message = {
@@ -78,6 +81,10 @@ class MQTTReporter(BaseReporter):
'artifacts': get_artifacts_from_result_data(
build.result_data, logger=log)
})
+ if include_returned_data:
+ rdata = build.result_data.copy()
+ rdata.pop('zuul', None)
+ job_informations['returned_data'] = rdata
# Report build data of retried builds if available
retry_builds = item.current_build_set.getRetryBuildsForJob(
@@ -142,4 +149,8 @@ def qosValue(value):
def getSchema():
- return v.Schema({v.Required('topic'): topicValue, 'qos': qosValue})
+ return v.Schema({
+ v.Required('topic'): topicValue,
+ 'qos': qosValue,
+ 'include-returned-data': bool,
+ })
diff --git a/zuul/driver/pagure/pagurereporter.py b/zuul/driver/pagure/pagurereporter.py
index 918a31b6b..b38035752 100644
--- a/zuul/driver/pagure/pagurereporter.py
+++ b/zuul/driver/pagure/pagurereporter.py
@@ -34,7 +34,7 @@ class PagureReporter(BaseReporter):
self._merge = self.config.get('merge', False)
self.context = "{}/{}".format(pipeline.tenant.name, pipeline.name)
- def report(self, item):
+ def report(self, item, phase1=True, phase2=True):
"""Report on an event."""
# If the source is not PagureSource we cannot report anything here.
@@ -47,17 +47,18 @@ class PagureReporter(BaseReporter):
self.connection.canonical_hostname:
return
- if self._commit_status is not None:
- if (hasattr(item.change, 'patchset') and
- item.change.patchset is not None):
- self.setCommitStatus(item)
- elif (hasattr(item.change, 'newrev') and
- item.change.newrev is not None):
- self.setCommitStatus(item)
- if hasattr(item.change, 'number'):
- if self._create_comment:
- self.addPullComment(item)
- if self._merge:
+ if phase1:
+ if self._commit_status is not None:
+ if (hasattr(item.change, 'patchset') and
+ item.change.patchset is not None):
+ self.setCommitStatus(item)
+ elif (hasattr(item.change, 'newrev') and
+ item.change.newrev is not None):
+ self.setCommitStatus(item)
+ if hasattr(item.change, 'number'):
+ if self._create_comment:
+ self.addPullComment(item)
+ if phase2 and self._merge:
self.mergePull(item)
if not item.change.is_merged:
msg = self._formatItemReportMergeConflict(item)
@@ -66,9 +67,12 @@ class PagureReporter(BaseReporter):
def _formatItemReportJobs(self, item):
# Return the list of jobs portion of the report
ret = ''
- jobs_fields = self._getItemReportJobsFields(item)
+ jobs_fields, skipped = self._getItemReportJobsFields(item)
for job_fields in jobs_fields:
ret += '- [%s](%s) : %s%s%s%s\n' % job_fields[:6]
+ if skipped:
+ jobtext = 'job' if skipped == 1 else 'jobs'
+ ret += 'Skipped %i %s\n' % (skipped, jobtext)
return ret
def addPullComment(self, item, comment=None):
diff --git a/zuul/driver/smtp/smtpreporter.py b/zuul/driver/smtp/smtpreporter.py
index 58bd25cef..a5d8938c1 100644
--- a/zuul/driver/smtp/smtpreporter.py
+++ b/zuul/driver/smtp/smtpreporter.py
@@ -25,8 +25,10 @@ class SMTPReporter(BaseReporter):
name = 'smtp'
log = logging.getLogger("zuul.SMTPReporter")
- def report(self, item):
+ def report(self, item, phase1=True, phase2=True):
"""Send the compiled report message via smtp."""
+ if not phase1:
+ return
log = get_annotated_logger(self.log, item.event)
message = self._formatItemReport(item)
@@ -40,7 +42,7 @@ class SMTPReporter(BaseReporter):
if 'subject' in self.config:
subject = self.config['subject'].format(
- change=item.change)
+ change=item.change, pipeline=item.pipeline.getSafeAttributes())
else:
subject = "Report for change {change} against {ref}".format(
change=item.change, ref=item.change.ref)
diff --git a/zuul/driver/sql/alembic/versions/c7467b642498_buildset_updated.py b/zuul/driver/sql/alembic/versions/c7467b642498_buildset_updated.py
new file mode 100644
index 000000000..abfba7247
--- /dev/null
+++ b/zuul/driver/sql/alembic/versions/c7467b642498_buildset_updated.py
@@ -0,0 +1,47 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+"""buildset_updated
+
+Revision ID: c7467b642498
+Revises: 4647def24b32
+Create Date: 2022-05-28 16:21:50.035877
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = 'c7467b642498'
+down_revision = '4647def24b32'
+branch_labels = None
+depends_on = None
+
+from alembic import op
+import sqlalchemy as sa
+
+
+def upgrade(table_prefix=''):
+ op.add_column(
+ table_prefix + "zuul_buildset", sa.Column('updated', sa.DateTime))
+
+ connection = op.get_bind()
+ connection.execute(
+ """
+ UPDATE {buildset_table}
+ SET updated=greatest(
+ coalesce(first_build_start_time, '1970-01-01 00:00:00'),
+ coalesce(last_build_end_time, '1970-01-01 00:00:00'),
+ coalesce(event_timestamp, '1970-01-01 00:00:00'))
+ """.format(buildset_table=table_prefix + "zuul_buildset"))
+
+
+def downgrade():
+ raise Exception("Downgrades not supported")
diff --git a/zuul/driver/sql/sqlconnection.py b/zuul/driver/sql/sqlconnection.py
index 8dd5f9d44..1af50b2f7 100644
--- a/zuul/driver/sql/sqlconnection.py
+++ b/zuul/driver/sql/sqlconnection.py
@@ -173,6 +173,7 @@ class DatabaseSession(object):
def getBuildsets(self, tenant=None, project=None, pipeline=None,
change=None, branch=None, patchset=None, ref=None,
newrev=None, uuid=None, result=None, complete=None,
+ updated_max=None,
limit=50, offset=0, idx_min=None, idx_max=None):
buildset_table = self.connection.zuul_buildset_table
@@ -202,6 +203,9 @@ class DatabaseSession(object):
elif complete is False:
q = q.filter(buildset_table.c.result == None) # noqa
+ if updated_max:
+ q = q.filter(buildset_table.c.updated < updated_max)
+
q = q.order_by(buildset_table.c.id.desc()).\
limit(limit).\
offset(offset)
@@ -232,6 +236,13 @@ class DatabaseSession(object):
except sqlalchemy.orm.exc.MultipleResultsFound:
raise Exception("Multiple buildset found with uuid %s", uuid)
+ def deleteBuildsets(self, cutoff):
+ """Delete buildsets before the cutoff"""
+
+ # delete buildsets updated before the cutoff
+ for buildset in self.getBuildsets(updated_max=cutoff):
+ self.session().delete(buildset)
+
class SQLConnection(BaseConnection):
driver_name = 'sql'
@@ -349,6 +360,7 @@ class SQLConnection(BaseConnection):
event_timestamp = sa.Column(sa.DateTime, nullable=True)
first_build_start_time = sa.Column(sa.DateTime, nullable=True)
last_build_end_time = sa.Column(sa.DateTime, nullable=True)
+ updated = sa.Column(sa.DateTime, nullable=True)
sa.Index(self.table_prefix + 'project_pipeline_idx',
project, pipeline)
@@ -472,3 +484,8 @@ class SQLConnection(BaseConnection):
"""Return a BuildSet objects"""
with self.getSession() as db:
return db.getBuildset(*args, **kw)
+
+ def deleteBuildsets(self, *args, **kw):
+ """Delete buildsets"""
+ with self.getSession() as db:
+ return db.deleteBuildsets(*args, **kw)
diff --git a/zuul/driver/sql/sqlreporter.py b/zuul/driver/sql/sqlreporter.py
index ea0f35945..d16f50fcb 100644
--- a/zuul/driver/sql/sqlreporter.py
+++ b/zuul/driver/sql/sqlreporter.py
@@ -18,6 +18,8 @@ import logging
import time
import voluptuous as v
+import sqlalchemy.exc
+
from zuul.lib.result_data import get_artifacts_from_result_data
from zuul.reporter import BaseReporter
@@ -27,6 +29,8 @@ class SQLReporter(BaseReporter):
name = 'sql'
log = logging.getLogger("zuul.SQLReporter")
+ retry_count = 3
+ retry_delay = 5
def _getBuildData(self, item, job, build):
(result, _) = item.formatJobResult(job, build)
@@ -41,10 +45,7 @@ class SQLReporter(BaseReporter):
tz=datetime.timezone.utc)
return result, build.log_url, start, end
- def reportBuildsetStart(self, buildset):
- """Create the initial buildset entry in the db"""
- if not buildset.uuid:
- return
+ def _createBuildset(self, db, buildset):
event_id = None
event_timestamp = None
item = buildset.item
@@ -52,25 +53,40 @@ class SQLReporter(BaseReporter):
event_id = getattr(item.event, "zuul_event_id", None)
event_timestamp = datetime.datetime.fromtimestamp(
item.event.timestamp, tz=datetime.timezone.utc)
+ db_buildset = db.createBuildSet(
+ uuid=buildset.uuid,
+ tenant=item.pipeline.tenant.name,
+ pipeline=item.pipeline.name,
+ project=item.change.project.name,
+ change=getattr(item.change, 'number', None),
+ patchset=getattr(item.change, 'patchset', None),
+ ref=getattr(item.change, 'ref', ''),
+ oldrev=getattr(item.change, 'oldrev', ''),
+ newrev=getattr(item.change, 'newrev', ''),
+ branch=getattr(item.change, 'branch', ''),
+ zuul_ref=buildset.ref,
+ ref_url=item.change.url,
+ event_id=event_id,
+ event_timestamp=event_timestamp,
+ updated=datetime.datetime.utcnow(),
+ )
+ return db_buildset
+
+ def reportBuildsetStart(self, buildset):
+ """Create the initial buildset entry in the db"""
+ if not buildset.uuid:
+ return
- with self.connection.getSession() as db:
- db_buildset = db.createBuildSet(
- uuid=buildset.uuid,
- tenant=item.pipeline.tenant.name,
- pipeline=item.pipeline.name,
- project=item.change.project.name,
- change=getattr(item.change, 'number', None),
- patchset=getattr(item.change, 'patchset', None),
- ref=getattr(item.change, 'ref', ''),
- oldrev=getattr(item.change, 'oldrev', ''),
- newrev=getattr(item.change, 'newrev', ''),
- branch=getattr(item.change, 'branch', ''),
- zuul_ref=buildset.ref,
- ref_url=item.change.url,
- event_id=event_id,
- event_timestamp=event_timestamp,
- )
- return db_buildset
+ for retry_count in range(self.retry_count):
+ try:
+ with self.connection.getSession() as db:
+ return self._createBuildset(db, buildset)
+ except sqlalchemy.exc.DBAPIError:
+ if retry_count < self.retry_count - 1:
+ self.log.error("Unable to create buildset, will retry")
+ time.sleep(self.retry_delay)
+ else:
+ self.log.exception("Unable to create buildset")
def reportBuildsetEnd(self, buildset, action, final, result=None):
if not buildset.uuid:
@@ -80,63 +96,93 @@ class SQLReporter(BaseReporter):
buildset.item, with_jobs=False, action=action)
else:
message = None
- with self.connection.getSession() as db:
- db_buildset = db.getBuildset(
- tenant=buildset.item.pipeline.tenant.name, uuid=buildset.uuid)
- if db_buildset:
- db_buildset.result = buildset.result or result
- db_buildset.message = message
- end_time = db_buildset.first_build_start_time
- for build in db_buildset.builds:
- if (build.end_time and end_time
- and build.end_time > end_time):
- end_time = build.end_time
- db_buildset.last_build_end_time = end_time
- elif buildset.builds:
- self.log.error("Unable to find buildset "
- f"{buildset.uuid} in DB")
+ for retry_count in range(self.retry_count):
+ try:
+ with self.connection.getSession() as db:
+ db_buildset = db.getBuildset(
+ tenant=buildset.item.pipeline.tenant.name,
+ uuid=buildset.uuid)
+ if not db_buildset:
+ db_buildset = self._createBuildset(db, buildset)
+ db_buildset.result = buildset.result or result
+ db_buildset.message = message
+ end_time = db_buildset.first_build_start_time
+ for build in db_buildset.builds:
+ if (build.end_time and end_time
+ and build.end_time > end_time):
+ end_time = build.end_time
+ db_buildset.last_build_end_time = end_time
+ db_buildset.updated = datetime.datetime.utcnow()
+ return
+ except sqlalchemy.exc.DBAPIError:
+ if retry_count < self.retry_count - 1:
+ self.log.error("Unable to update buildset, will retry")
+ time.sleep(self.retry_delay)
+ else:
+ self.log.exception("Unable to update buildset")
def reportBuildStart(self, build):
- with self.connection.getSession() as db:
- db_build = self._createBuild(db, build)
- return db_build
+ for retry_count in range(self.retry_count):
+ try:
+ with self.connection.getSession() as db:
+ db_build = self._createBuild(db, build)
+ return db_build
+ except sqlalchemy.exc.DBAPIError:
+ if retry_count < self.retry_count - 1:
+ self.log.error("Unable to create build, will retry")
+ time.sleep(self.retry_delay)
+ else:
+ self.log.exception("Unable to create build")
def reportBuildEnd(self, build, tenant, final):
- with self.connection.getSession() as db:
- db_build = db.getBuild(tenant=tenant, uuid=build.uuid)
- if not db_build:
- db_build = self._createBuild(db, build)
-
- end_time = build.end_time or time.time()
- end = datetime.datetime.fromtimestamp(
- end_time, tz=datetime.timezone.utc)
-
- db_build.result = build.result
- db_build.end_time = end
- db_build.log_url = build.log_url
- db_build.error_detail = build.error_detail
- db_build.final = final
- db_build.held = build.held
-
- for provides in build.job.provides:
- db_build.createProvides(name=provides)
-
- for artifact in get_artifacts_from_result_data(
- build.result_data,
- logger=self.log):
- if 'metadata' in artifact:
- artifact['metadata'] = json.dumps(artifact['metadata'])
- db_build.createArtifact(**artifact)
-
- return db_build
+ for retry_count in range(self.retry_count):
+ try:
+ with self.connection.getSession() as db:
+ db_build = db.getBuild(tenant=tenant, uuid=build.uuid)
+ if not db_build:
+ db_build = self._createBuild(db, build)
+
+ end_time = build.end_time or time.time()
+ end = datetime.datetime.fromtimestamp(
+ end_time, tz=datetime.timezone.utc)
+
+ db_build.result = build.result
+ db_build.end_time = end
+ db_build.log_url = build.log_url
+ db_build.error_detail = build.error_detail
+ db_build.final = final
+ db_build.held = build.held
+
+ for provides in build.job.provides:
+ db_build.createProvides(name=provides)
+
+ for artifact in get_artifacts_from_result_data(
+ build.result_data,
+ logger=self.log):
+ if 'metadata' in artifact:
+ artifact['metadata'] = json.dumps(
+ artifact['metadata'])
+ db_build.createArtifact(**artifact)
+ return db_build
+ except sqlalchemy.exc.DBAPIError:
+ if retry_count < self.retry_count - 1:
+ self.log.error("Unable to update build, will retry")
+ time.sleep(self.retry_delay)
+ else:
+ self.log.exception("Unable to update build")
def _createBuild(self, db, build):
start_time = build.start_time or time.time()
start = datetime.datetime.fromtimestamp(start_time,
tz=datetime.timezone.utc)
buildset = build.build_set
+ if not buildset:
+ return
db_buildset = db.getBuildset(
tenant=buildset.item.pipeline.tenant.name, uuid=buildset.uuid)
+ if not db_buildset:
+ self.log.warning("Creating missing buildset %s", buildset.uuid)
+ db_buildset = self._createBuildset(db, buildset)
if db_buildset.first_build_start_time is None:
db_buildset.first_build_start_time = start
diff --git a/zuul/driver/timer/__init__.py b/zuul/driver/timer/__init__.py
index 4f11a583b..619b1a8ff 100644
--- a/zuul/driver/timer/__init__.py
+++ b/zuul/driver/timer/__init__.py
@@ -130,6 +130,24 @@ class TimerDriver(Driver, TriggerInterface):
pipeline.name)
continue
+ self._addJobsInner(tenant, pipeline, trigger, timespec,
+ jobs)
+
+ def _addJobsInner(self, tenant, pipeline, trigger, timespec, jobs):
+ # jobs is a list that we mutate
+ for project_name, pcs in tenant.layout.project_configs.items():
+ # timer operates on branch heads and doesn't need
+ # speculative layouts to decide if it should be
+ # enqueued or not. So it can be decided on cached
+ # data if it needs to run or not.
+ pcst = tenant.layout.getAllProjectConfigs(project_name)
+ if not [True for pc in pcst if pipeline.name in pc.pipelines]:
+ continue
+
+ (trusted, project) = tenant.getProject(project_name)
+ try:
+ for branch in project.source.getProjectBranches(
+ project, tenant):
# The 'misfire_grace_time' argument is set to None to
# disable checking if the job missed its run time window.
# This ensures we don't miss a trigger when the job is
@@ -137,11 +155,17 @@ class TimerDriver(Driver, TriggerInterface):
# delays are not a problem for our trigger use-case.
job = self.apsched.add_job(
self._onTrigger, trigger=trigger,
- args=(tenant, pipeline.name, timespec,),
+ args=(tenant, pipeline.name, project_name,
+ branch, timespec,),
misfire_grace_time=None)
jobs.append(job)
+ except Exception:
+ self.log.exception("Unable to create APScheduler job for "
+ "%s %s %s",
+ tenant, pipeline, project)
- def _onTrigger(self, tenant, pipeline_name, timespec):
+ def _onTrigger(self, tenant, pipeline_name, project_name, branch,
+ timespec):
if not self.election_won:
return
@@ -150,55 +174,43 @@ class TimerDriver(Driver, TriggerInterface):
return
try:
- self._dispatchEvent(tenant, pipeline_name, timespec)
+ self._dispatchEvent(tenant, pipeline_name, project_name,
+ branch, timespec)
except Exception:
self.stop_event.set()
self.log.exception("Error when dispatching timer event")
- def _dispatchEvent(self, tenant, pipeline_name, timespec):
- self.log.debug('Got trigger for tenant %s and pipeline %s with '
- 'timespec %s', tenant.name, pipeline_name, timespec)
- for project_name, pcs in tenant.layout.project_configs.items():
- try:
- # timer operates on branch heads and doesn't need
- # speculative layouts to decide if it should be
- # enqueued or not. So it can be decided on cached
- # data if it needs to run or not.
- pcst = tenant.layout.getAllProjectConfigs(project_name)
- if not [True for pc in pcst if pipeline_name in pc.pipelines]:
- continue
-
- (trusted, project) = tenant.getProject(project_name)
- for branch in project.source.getProjectBranches(
- project, tenant):
- try:
- event = TimerTriggerEvent()
- event.type = 'timer'
- event.timespec = timespec
- event.forced_pipeline = pipeline_name
- event.project_hostname = project.canonical_hostname
- event.project_name = project.name
- event.ref = 'refs/heads/%s' % branch
- event.branch = branch
- event.zuul_event_id = str(uuid4().hex)
- event.timestamp = time.time()
- # Refresh the branch in order to update the item in the
- # change cache.
- change_key = project.source.getChangeKey(event)
- with self.project_update_locks[project.canonical_name]:
- project.source.getChange(change_key, refresh=True,
- event=event)
- log = get_annotated_logger(self.log, event)
- log.debug("Adding event")
- self.sched.addTriggerEvent(self.name, event)
- except Exception:
- self.log.exception("Error dispatching timer event for "
- "project %s branch %s",
- project, branch)
- except Exception:
- self.log.exception("Error dispatching timer event for "
- "project %s",
- project)
+ def _dispatchEvent(self, tenant, pipeline_name, project_name,
+ branch, timespec):
+ self.log.debug('Got trigger for tenant %s and pipeline %s '
+ 'project %s branch %s with timespec %s',
+ tenant.name, pipeline_name, project_name,
+ branch, timespec)
+ try:
+ (trusted, project) = tenant.getProject(project_name)
+ event = TimerTriggerEvent()
+ event.type = 'timer'
+ event.timespec = timespec
+ event.forced_pipeline = pipeline_name
+ event.project_hostname = project.canonical_hostname
+ event.project_name = project.name
+ event.ref = 'refs/heads/%s' % branch
+ event.branch = branch
+ event.zuul_event_id = str(uuid4().hex)
+ event.timestamp = time.time()
+ # Refresh the branch in order to update the item in the
+ # change cache.
+ change_key = project.source.getChangeKey(event)
+ with self.project_update_locks[project.canonical_name]:
+ project.source.getChange(change_key, refresh=True,
+ event=event)
+ log = get_annotated_logger(self.log, event)
+ log.debug("Adding event")
+ self.sched.addTriggerEvent(self.name, event)
+ except Exception:
+ self.log.exception("Error dispatching timer event for "
+ "tenant %s project %s branch %s",
+ tenant, project_name, branch)
def stop(self):
self.stopped = True
diff --git a/zuul/exceptions.py b/zuul/exceptions.py
index ec1e5cdaf..a332ba1af 100644
--- a/zuul/exceptions.py
+++ b/zuul/exceptions.py
@@ -82,11 +82,11 @@ class AuthTokenUnauthorizedException(AuthTokenException):
class AuthTokenUndecodedException(AuthTokenUnauthorizedException):
- default_msg = 'Auth Token could not be decoded'
+ defaultMsg = 'Auth Token could not be decoded'
class AuthTokenInvalidSignatureException(AuthTokenUnauthorizedException):
- default_msg = 'Invalid signature'
+ defaultMsg = 'Invalid signature'
class BearerTokenRequiredError(AuthTokenUnauthorizedException):
diff --git a/zuul/executor/server.py b/zuul/executor/server.py
index 85519e69b..89f93b8c5 100644
--- a/zuul/executor/server.py
+++ b/zuul/executor/server.py
@@ -74,6 +74,7 @@ import zuul.model
from zuul.nodepool import Nodepool
from zuul.version import get_version_string
from zuul.zk.event_queues import PipelineResultEventQueue
+from zuul.zk.blob_store import BlobStore
from zuul.zk.components import ExecutorComponent, COMPONENT_REGISTRY
from zuul.zk.exceptions import JobRequestNotFound
from zuul.zk.executor import ExecutorApi
@@ -152,10 +153,6 @@ class RoleNotFoundError(ExecutorError):
pass
-class PluginFoundError(ExecutorError):
- pass
-
-
class DiskAccountant(object):
''' A single thread to periodically run du and monitor a base directory
@@ -1029,13 +1026,8 @@ class AnsibleJob(object):
plugin_dir = self.executor_server.ansible_manager.getAnsiblePluginDir(
self.ansible_version)
- self.ara_callbacks = \
- self.executor_server.ansible_manager.getAraCallbackPlugin(
- self.ansible_version)
self.library_dir = os.path.join(plugin_dir, 'library')
self.action_dir = os.path.join(plugin_dir, 'action')
- self.action_dir_general = os.path.join(plugin_dir, 'actiongeneral')
- self.action_dir_trusted = os.path.join(plugin_dir, 'actiontrusted')
self.callback_dir = os.path.join(plugin_dir, 'callback')
self.lookup_dir = os.path.join(plugin_dir, 'lookup')
self.filter_dir = os.path.join(plugin_dir, 'filter')
@@ -1718,7 +1710,12 @@ class AnsibleJob(object):
self.original_hostvars)
freeze_status, freeze_code = self.runAnsibleFreeze(
self.jobdir.freeze_playbook, self.ansible_version)
- if freeze_status != self.RESULT_NORMAL or setup_code != 0:
+ # We ignore the return code because we run this playbook on
+ # all hosts, even ones which we didn't run the setup playbook
+ # on. If a host is unreachable, we should still proceed (a
+ # later playbook may cause it to become reachable). We just
+ # won't have all of the variables set.
+ if freeze_status != self.RESULT_NORMAL:
return result
self.loadFrozenHostvars()
@@ -1829,12 +1826,22 @@ class AnsibleJob(object):
if run_unreachable or post_unreachable:
return None
+ # Report a failure if pre-run failed and the user reported to
+ # zuul that the job should not retry.
+ if result_data.get('zuul', {}).get('retry') is False and not result:
+ result = "FAILURE"
+
return result
def runCleanupPlaybooks(self, success):
if not self.jobdir.cleanup_playbooks:
return
+ if not self.frozen_hostvars:
+ # Job failed before we could load the frozen hostvars.
+ # This means we can't run any cleanup playbooks.
+ return
+
# TODO: make this configurable
cleanup_timeout = 300
@@ -1972,58 +1979,8 @@ class AnsibleJob(object):
host_keys=host_keys))
return hosts
- def _blockPluginDirs(self, path):
- '''Prevent execution of playbooks or roles with plugins
-
- Plugins are loaded from roles and also if there is a plugin
- dir adjacent to the playbook. Throw an error if the path
- contains a location that would cause a plugin to get loaded.
-
- '''
- for entry in os.listdir(path):
- entry = os.path.join(path, entry)
- if os.path.isdir(entry) and entry.endswith('_plugins'):
- raise PluginFoundError(
- "Ansible plugin dir %s found adjacent to playbook %s in "
- "non-trusted repo." % (entry, path))
-
def findPlaybook(self, path, trusted=False):
if os.path.exists(path):
- if not trusted:
- # Plugins can be defined in multiple locations within the
- # playbook's subtree.
- #
- # 1. directly within the playbook:
- # block playbook_dir/*_plugins
- #
- # 2. within a role defined in playbook_dir/<rolename>:
- # block playbook_dir/*/*_plugins
- #
- # 3. within a role defined in playbook_dir/roles/<rolename>:
- # block playbook_dir/roles/*/*_plugins
-
- playbook_dir = os.path.dirname(os.path.abspath(path))
- paths_to_check = []
-
- def addPathsToCheck(root_dir):
- if os.path.isdir(root_dir):
- for entry in os.listdir(root_dir):
- entry = os.path.join(root_dir, entry)
- if os.path.isdir(entry):
- paths_to_check.append(entry)
-
- # handle case 1
- paths_to_check.append(playbook_dir)
-
- # handle case 2
- addPathsToCheck(playbook_dir)
-
- # handle case 3
- addPathsToCheck(os.path.join(playbook_dir, 'roles'))
-
- for path_to_check in paths_to_check:
- self._blockPluginDirs(path_to_check)
-
return path
raise ExecutorError("Unable to find playbook %s" % path)
@@ -2116,8 +2073,14 @@ class AnsibleJob(object):
"""
ret = {}
+ blobstore = BlobStore(self.executor_server.zk_context)
for secret_name, secret_index in secrets.items():
- frozen_secret = self.job.secrets[secret_index]
+ if isinstance(secret_index, dict):
+ key = secret_index['blob']
+ data = blobstore.get(key)
+ frozen_secret = json.loads(data.decode('utf-8'))
+ else:
+ frozen_secret = self.job.secrets[secret_index]
secret = zuul.model.Secret(secret_name, None)
secret.secret_data = yaml.encrypted_load(
frozen_secret['encrypted_data'])
@@ -2262,20 +2225,11 @@ class AnsibleJob(object):
def findRole(self, path, trusted=False):
d = os.path.join(path, 'tasks')
if os.path.isdir(d):
- # This is a bare role
- if not trusted:
- self._blockPluginDirs(path)
# None signifies that the repo is a bare role
return None
d = os.path.join(path, 'roles')
if os.path.isdir(d):
# This repo has a collection of roles
- if not trusted:
- self._blockPluginDirs(d)
- for entry in os.listdir(d):
- entry_path = os.path.join(d, entry)
- if os.path.isdir(entry_path):
- self._blockPluginDirs(entry_path)
return d
# It is neither a bare role, nor a collection of roles
raise RoleNotFoundError("Unable to find role in %s" % (path,))
@@ -2344,12 +2298,6 @@ class AnsibleJob(object):
self.log.debug("Implicit role not found in %s", link)
return
raise
- except PluginFoundError:
- if role['implicit']:
- self.log.info("Not adding implicit role %s due to "
- "plugin", link)
- return
- raise
if role_path is None:
# In the case of a bare role, add the containing directory
role_path = role_info.root
@@ -2500,6 +2448,7 @@ class AnsibleJob(object):
work_root=self.jobdir.work_root,
result_data_file=self.jobdir.result_data_file,
inventory_file=self.jobdir.inventory)
+ zuul_vars['ansible_version'] = self.ansible_version
# Add playbook_context info
zuul_vars['playbook_context'] = dict(
@@ -2555,6 +2504,11 @@ class AnsibleJob(object):
with open(path) as f:
facts = json.loads(f.read())
self.frozen_hostvars[host['name']] = facts.pop('_zuul_frozen', {})
+ # Always include the nodepool vars, even if we didn't run
+ # the playbook for this host.
+ if 'host_vars' in host:
+ self.frozen_hostvars[host['name']]['nodepool'] =\
+ host['host_vars']['nodepool']
with open(path, 'w') as f:
f.write(json.dumps(facts))
@@ -2613,17 +2567,7 @@ class AnsibleJob(object):
logging_config.writeJson(self.jobdir.logging_json)
def writeAnsibleConfig(self, jobdir_playbook):
- trusted = jobdir_playbook.trusted
-
- # TODO(mordred) This should likely be extracted into a more generalized
- # mechanism for deployers being able to add callback
- # plugins.
- if self.ara_callbacks:
- callback_path = '%s:%s' % (
- self.callback_dir,
- os.path.dirname(self.ara_callbacks))
- else:
- callback_path = self.callback_dir
+ callback_path = self.callback_dir
with open(jobdir_playbook.ansible_config, 'w') as config:
config.write('[defaults]\n')
config.write('inventory = %s\n' % jobdir_playbook.inventory)
@@ -2648,25 +2592,11 @@ class AnsibleJob(object):
# 10s to respond
config.write('timeout = 30\n')
- # We need the general action dir to make the zuul_return plugin
- # available to every job.
- action_dirs = [self.action_dir_general]
- if not trusted:
- # Untrusted jobs add the action dir which makes sure localhost
- # modules are restricted where needed. Further the command
- # plugin needs to be restricted and also inject zuul_log_id
- # to make log streaming work.
- action_dirs.append(self.action_dir)
- config.write('lookup_plugins = %s\n'
- % self.lookup_dir)
- else:
- # Trusted jobs add the actiontrusted dir which adds the
- # unrestricted command plugin to inject zuul_log_id to make
- # log streaming work.
- action_dirs.append(self.action_dir_trusted)
-
+ # We need the action dir to make the zuul_return plugin
+ # available to every job, and a customized command plugin
+ # to inject zuul_log_id to make log streaming work.
config.write('action_plugins = %s\n'
- % ':'.join(action_dirs))
+ % self.action_dir)
if jobdir_playbook.roles_path:
config.write('roles_path = %s\n' % ':'.join(
@@ -2743,8 +2673,6 @@ class AnsibleJob(object):
for key, value in os.environ.copy().items()
if not key.startswith("ZUUL_")}
env_copy.update(self.ssh_agent.env)
- if self.ara_callbacks:
- env_copy['ARA_LOG_CONFIG'] = self.jobdir.logging_json
env_copy['ZUUL_JOB_LOG_CONFIG'] = self.jobdir.logging_json
env_copy['ZUUL_JOBDIR'] = self.jobdir.root
if self.executor_server.log_console_port != DEFAULT_STREAM_PORT:
@@ -2824,6 +2752,8 @@ class AnsibleJob(object):
stdin=subprocess.DEVNULL,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
+ # Either this must be present, or we need the
+ # --new-session argument for bwrap.
start_new_session=True,
env=env_copy,
)
@@ -3233,6 +3163,10 @@ class ExecutorServer(BaseMergeServer):
self.allow_unzoned = get_default(self.config, 'executor',
'allow_unzoned', False)
+ # If this executor has no zone configured it is implicitly unzoned
+ if self.zone is None:
+ self.allow_unzoned = True
+
# Those attributes won't change, so it's enough to set them once on the
# component info.
self.component_info.zone = self.zone
@@ -3696,6 +3630,15 @@ class ExecutorServer(BaseMergeServer):
break
if not self._running:
break
+
+ # Delay our response to running a new job based on
+ # the number of jobs we're currently running, in
+ # an attempt to spread load evenly among
+ # executors.
+ workers = len(self.job_workers)
+ delay = (workers ** 2) / 1000.0
+ time.sleep(delay)
+
self._runBuildWorker(build_request)
except Exception:
self.log.exception("Error in build loop:")
@@ -3802,7 +3745,7 @@ class ExecutorServer(BaseMergeServer):
sensor.reportStats(self.statsd, base_key)
def finishJob(self, unique):
- del(self.job_workers[unique])
+ del self.job_workers[unique]
self.log.debug(
"Finishing Job: %s, queue(%d): %s",
unique,
diff --git a/zuul/lib/ansible-config.conf b/zuul/lib/ansible-config.conf
index ab073d5a4..2f4ccd76b 100644
--- a/zuul/lib/ansible-config.conf
+++ b/zuul/lib/ansible-config.conf
@@ -1,13 +1,11 @@
# This file describes the currently supported ansible versions
[common]
-default_version = 2.9
-requirements = ara>=0.16.5,<1.0.0 openstacksdk openshift jmespath google-cloud-storage pywinrm boto3
+default_version = 5
+# OpenStackSDK 0.99.0 coincides with CORS header problems in some providers
+requirements = openstacksdk<0.99 openshift jmespath google-cloud-storage pywinrm boto3 azure-storage-blob ibm-cos-sdk netaddr passlib
-[2.8]
-# Ansible 2.8.16 breaks the k8s connection plugin
-requirements = ansible>=2.8,<2.9,!=2.8.16
+[5]
+requirements = ansible>=5.0,<6.0
-[2.9]
-# Ansible 2.9.14 breaks the k8s connection plugin
-# https://github.com/ansible/ansible/issues/72171
-requirements = ansible>=2.9,<2.10,!=2.9.14
+[6]
+requirements = ansible>=6.0,<7.0
diff --git a/zuul/lib/ansible.py b/zuul/lib/ansible.py
index 0e4e416cd..9d104cfe4 100644
--- a/zuul/lib/ansible.py
+++ b/zuul/lib/ansible.py
@@ -14,7 +14,6 @@
import concurrent.futures
import configparser
-import functools
import logging
import os
import shutil
@@ -277,23 +276,6 @@ class AnsibleManager:
raise Exception('Requested ansible version %s not found' % version)
return ansible
- @functools.lru_cache(maxsize=10)
- def getAraCallbackPlugin(self, version):
- result = None
- try:
- _python = self.getAnsibleCommand(version, 'python')
- result = subprocess.run(
- [_python, '-m', 'ara.setup.callback_plugins'],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
- check=True).stdout.decode().strip()
- self.log.info(
- 'Ansible version %s ARA callback plugin: %s', version, result)
- except Exception:
- self.log.exception(
- 'Ansible version %s ARA not installed' % version)
- return result
-
def getAnsibleCommand(self, version, command='ansible-playbook'):
ansible = self._getAnsible(version)
venv_path = ansible.venv_path
diff --git a/zuul/lib/auth.py b/zuul/lib/auth.py
index a5866e908..db37d56fa 100644
--- a/zuul/lib/auth.py
+++ b/zuul/lib/auth.py
@@ -74,10 +74,14 @@ class AuthenticatorRegistry(object):
cpb.capabilities_registry.register_capabilities('auth', capabilities)
def authenticate(self, rawToken):
- unverified = jwt.decode(rawToken, options={'verify_signature': False})
- for auth_name in self.authenticators:
- authenticator = self.authenticators[auth_name]
- if authenticator.issuer_id == unverified.get('iss', ''):
- return authenticator.authenticate(rawToken)
+ try:
+ unverified = jwt.decode(rawToken,
+ options={'verify_signature': False})
+ for auth_name in self.authenticators:
+ authenticator = self.authenticators[auth_name]
+ if authenticator.issuer_id == unverified.get('iss', ''):
+ return authenticator.authenticate(rawToken)
+ except jwt.exceptions.DecodeError:
+ raise exceptions.AuthTokenUndecodedException(self.default_realm)
# No known issuer found, use default realm
raise exceptions.IssuerUnknownError(self.default_realm)
diff --git a/zuul/lib/encryption.py b/zuul/lib/encryption.py
index 5720b9cee..79e92e366 100644
--- a/zuul/lib/encryption.py
+++ b/zuul/lib/encryption.py
@@ -20,6 +20,18 @@ from cryptography.hazmat.primitives import hashes
from functools import lru_cache
+# OpenSSL 3.0.0 performs key validation in a very slow manner. Since
+# our keys are internally generated and securely stored, we can skip
+# validation. See https://github.com/pyca/cryptography/issues/7236
+backend = default_backend()
+if hasattr(backend, '_rsa_skip_check_key'):
+ backend._rsa_skip_check_key = True
+else:
+ import logging
+ logging.warning("Cryptography backend lacks _rsa_skip_check_key flag, "
+ "key loading may be slow")
+
+
# https://cryptography.io/en/latest/hazmat/primitives/asymmetric/rsa/#generation
def generate_rsa_keypair():
"""Generate an RSA keypair.
@@ -30,7 +42,7 @@ def generate_rsa_keypair():
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=4096,
- backend=default_backend()
+ backend=backend,
)
public_key = private_key.public_key()
return (private_key, public_key)
@@ -98,7 +110,7 @@ def deserialize_rsa_keypair(data, password=None):
private_key = serialization.load_pem_private_key(
data,
password=password,
- backend=default_backend()
+ backend=backend,
)
public_key = private_key.public_key()
return (private_key, public_key)
diff --git a/zuul/lib/fingergw.py b/zuul/lib/fingergw.py
index 90eb032ea..ad945c1b7 100644
--- a/zuul/lib/fingergw.py
+++ b/zuul/lib/fingergw.py
@@ -217,6 +217,7 @@ class FingerGateway(object):
raise
def start(self):
+ self.log.info("Starting finger gateway")
kwargs = dict(
user=self.user,
pid_file=self.pid_file,
@@ -260,6 +261,7 @@ class FingerGateway(object):
self.log.info("Finger gateway is started")
def stop(self):
+ self.log.info("Stopping finger gateway")
self.component_info.state = self.component_info.STOPPED
if self.server:
@@ -283,7 +285,7 @@ class FingerGateway(object):
self.log.info("Finger gateway is stopped")
- def wait(self):
+ def join(self):
'''
Wait on the gateway to shutdown.
'''
diff --git a/zuul/lib/tracing.py b/zuul/lib/tracing.py
new file mode 100644
index 000000000..42b2681f3
--- /dev/null
+++ b/zuul/lib/tracing.py
@@ -0,0 +1,291 @@
+# Copyright 2022 Acme Gating, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import grpc
+from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import \
+ OTLPSpanExporter as GRPCExporter
+from opentelemetry.exporter.otlp.proto.http.trace_exporter import \
+ OTLPSpanExporter as HTTPExporter
+from opentelemetry.sdk.resources import SERVICE_NAME, Resource
+from opentelemetry.sdk.trace import TracerProvider, Span
+from opentelemetry.sdk.trace.export import BatchSpanProcessor
+from opentelemetry import trace
+from opentelemetry.sdk import trace as trace_sdk
+
+from zuul.lib.config import get_default, any_to_bool
+
+
+class ZuulSpan(Span):
+ """An implementation of Span which accepts floating point
+ times and converts them to the expected nanoseconds."""
+
+ def start(self, start_time=None, parent_context=None):
+ if isinstance(start_time, float):
+ start_time = int(start_time * (10**9))
+ return super().start(start_time, parent_context)
+
+ def end(self, end_time=None):
+ if isinstance(end_time, float):
+ end_time = int(end_time * (10**9))
+ return super().end(end_time)
+
+
+# Patch the OpenTelemetry SDK Span class to return a ZuulSpan so that
+# we can supply floating point timestamps.
+trace_sdk._Span = ZuulSpan
+
+
+def _formatContext(context):
+ return {
+ 'trace_id': context.trace_id,
+ 'span_id': context.span_id,
+ }
+
+
+def _formatAttributes(attrs):
+ if attrs is None:
+ return None
+ return attrs.copy()
+
+
+def getSpanInfo(span, include_attributes=False):
+ """Return a dict for use in serializing a Span."""
+ links = [{'context': _formatContext(l.context),
+ 'attributes': _formatAttributes(l.attributes)}
+ for l in span.links]
+ attrs = _formatAttributes(span.attributes)
+ context = span.get_span_context()
+ ret = {
+ 'name': span.name,
+ 'trace_id': context.trace_id,
+ 'span_id': context.span_id,
+ 'trace_flags': context.trace_flags,
+ 'start_time': span.start_time,
+ }
+ if links:
+ ret['links'] = links
+ if attrs:
+ if not include_attributes:
+ # Avoid setting attributes when we start saved spans
+ # because we have to store them in ZooKeeper and we should
+ # minimize what we store there (especially since it is
+ # usually duplicative). If you really need to set
+ # attributes at the start of a span (because the info is
+ # not available later), set include_attributes to True.
+ # Otherwise, we raise an error here to remind ourselves to
+ # avoid that programming pattern.
+ raise RuntimeError("Attributes were set on a saved span; "
+ "either set them when ending the span, "
+ "or set include_attributes=True")
+ ret['attributes'] = attrs
+ return ret
+
+
+def restoreSpan(span_info, is_remote=True):
+ """Restore a Span from the serialized dict provided by getSpanInfo
+
+ Return None if unable to serialize the span.
+ """
+ tracer = trace.get_tracer("zuul")
+ if span_info is None:
+ return trace.INVALID_SPAN
+ required_keys = {'name', 'trace_id', 'span_id', 'trace_flags'}
+ if not required_keys <= set(span_info.keys()):
+ return trace.INVALID_SPAN
+ span_context = trace.SpanContext(
+ span_info['trace_id'],
+ span_info['span_id'],
+ is_remote=is_remote,
+ trace_flags=trace.TraceFlags(span_info['trace_flags']),
+ )
+ links = []
+ for link_info in span_info.get('links', []):
+ link_context = trace.SpanContext(
+ link_info['context']['trace_id'],
+ link_info['context']['span_id'])
+ link = trace.Link(link_context, link_info['attributes'])
+ links.append(link)
+ attributes = span_info.get('attributes', {})
+
+ span = ZuulSpan(
+ name=span_info['name'],
+ context=span_context,
+ parent=None,
+ sampler=tracer.sampler,
+ resource=tracer.resource,
+ attributes=attributes,
+ span_processor=tracer.span_processor,
+ kind=trace.SpanKind.INTERNAL,
+ links=links,
+ instrumentation_info=tracer.instrumentation_info,
+ record_exception=False,
+ set_status_on_exception=True,
+ limits=tracer._span_limits,
+ instrumentation_scope=tracer._instrumentation_scope,
+ )
+ span.start(start_time=span_info['start_time'])
+
+ return span
+
+
+def startSavedSpan(*args, **kw):
+ """Start a span and serialize it
+
+ This is a convenience method which starts a span (either root
+ or child) and immediately serializes it.
+
+ Most spans in Zuul should use this method.
+ """
+ tracer = trace.get_tracer("zuul")
+ include_attributes = kw.pop('include_attributes', False)
+ span = tracer.start_span(*args, **kw)
+ return getSpanInfo(span, include_attributes)
+
+
+def endSavedSpan(span_info, end_time=None, attributes=None):
+ """End a saved span.
+
+ This is a convenience method to restore a saved span and
+ immediately end it.
+
+ Most spans in Zuul should use this method.
+ """
+ span = restoreSpan(span_info, is_remote=False)
+ if span:
+ if attributes:
+ span.set_attributes(attributes)
+ span.end(end_time=end_time)
+
+
+def getSpanContext(span):
+ """Return a dict for use in serializing a Span Context.
+
+ The span context information used here is a lightweight
+ encoding of the span information so that remote child spans
+ can be started without access to a fully restored parent.
+ This is equivalent to (but not the same format) as the
+ OpenTelemetry trace context propogator.
+ """
+ context = span.get_span_context()
+ return {
+ 'trace_id': context.trace_id,
+ 'span_id': context.span_id,
+ 'trace_flags': context.trace_flags,
+ }
+
+
+def restoreSpanContext(span_context):
+ """Return a span with remote context information from getSpanContext.
+
+ This returns a non-recording span to use as a parent span. It
+ avoids the necessity of fully restoring the parent span.
+ """
+ if span_context:
+ span_context = trace.SpanContext(
+ trace_id=span_context['trace_id'],
+ span_id=span_context['span_id'],
+ is_remote=True,
+ trace_flags=trace.TraceFlags(span_context['trace_flags'])
+ )
+ else:
+ span_context = trace.INVALID_SPAN_CONTEXT
+ parent = trace.NonRecordingSpan(span_context)
+ return parent
+
+
+def startSpanInContext(span_context, *args, **kw):
+ """Start a span in a saved context.
+
+ This restores a span from a saved context and starts a new child span.
+ """
+ tracer = trace.get_tracer("zuul")
+ parent = restoreSpanContext(span_context)
+ with trace.use_span(parent):
+ return tracer.start_span(*args, **kw)
+
+
+class Tracing:
+ PROTOCOL_GRPC = 'grpc'
+ PROTOCOL_HTTP_PROTOBUF = 'http/protobuf'
+ processor_class = BatchSpanProcessor
+
+ def __init__(self, config):
+ service_name = get_default(config, "tracing", "service_name", "zuul")
+ resource = Resource(attributes={SERVICE_NAME: service_name})
+ provider = TracerProvider(resource=resource)
+ trace.set_tracer_provider(provider)
+ enabled = get_default(config, "tracing", "enabled")
+ if not any_to_bool(enabled):
+ self.processor = None
+ return
+
+ protocol = get_default(config, "tracing", "protocol",
+ self.PROTOCOL_GRPC)
+ endpoint = get_default(config, "tracing", "endpoint")
+ tls_key = get_default(config, "tracing", "tls_key")
+ tls_cert = get_default(config, "tracing", "tls_cert")
+ tls_ca = get_default(config, "tracing", "tls_ca")
+ certificate_file = get_default(config, "tracing", "certificate_file")
+ insecure = get_default(config, "tracing", "insecure")
+ if insecure is not None:
+ insecure = any_to_bool(insecure)
+ timeout = get_default(config, "tracing", "timeout")
+ if timeout is not None:
+ timeout = int(timeout)
+ compression = get_default(config, "tracing", "compression")
+
+ if protocol == self.PROTOCOL_GRPC:
+ if certificate_file:
+ raise Exception("The certificate_file tracing option "
+ f"is not valid for {protocol} endpoints")
+ if any([tls_ca, tls_key, tls_cert]):
+ if tls_ca:
+ tls_ca = open(tls_ca, 'rb').read()
+ if tls_key:
+ tls_key = open(tls_key, 'rb').read()
+ if tls_cert:
+ tls_cert = open(tls_cert, 'rb').read()
+ creds = grpc.ssl_channel_credentials(
+ root_certificates=tls_ca,
+ private_key=tls_key,
+ certificate_chain=tls_cert)
+ else:
+ creds = None
+ exporter = GRPCExporter(
+ endpoint=endpoint,
+ insecure=insecure,
+ credentials=creds,
+ timeout=timeout,
+ compression=compression)
+ elif protocol == self.PROTOCOL_HTTP_PROTOBUF:
+ if insecure:
+ raise Exception("The insecure tracing option "
+ f"is not valid for {protocol} endpoints")
+ if any([tls_ca, tls_key, tls_cert]):
+ raise Exception("The tls_* tracing options "
+ f"are not valid for {protocol} endpoints")
+ exporter = HTTPExporter(
+ endpoint=endpoint,
+ certificate_file=certificate_file,
+ timeout=timeout,
+ compression=compression)
+ else:
+ raise Exception(f"Unknown tracing protocol {protocol}")
+ self.processor = self.processor_class(exporter)
+ provider.add_span_processor(self.processor)
+
+ def stop(self):
+ if not self.processor:
+ return
+ self.processor.shutdown()
diff --git a/zuul/manager/__init__.py b/zuul/manager/__init__.py
index 18ff8dc9d..cd9b2381d 100644
--- a/zuul/manager/__init__.py
+++ b/zuul/manager/__init__.py
@@ -22,6 +22,7 @@ from zuul import model
from zuul.lib.dependson import find_dependency_headers
from zuul.lib.logutil import get_annotated_logger
from zuul.lib.tarjan import strongly_connected_components
+import zuul.lib.tracing as tracing
from zuul.model import (
Change, DequeueEvent, PipelineState, PipelineChangeList, QueueItem,
PipelinePostConfigEvent,
@@ -30,6 +31,8 @@ from zuul.zk.change_cache import ChangeKey
from zuul.zk.components import COMPONENT_REGISTRY
from zuul.zk.locks import pipeline_lock
+from opentelemetry import trace
+
class DynamicChangeQueueContextManager(object):
def __init__(self, change_queue):
@@ -91,7 +94,8 @@ class PipelineManager(metaclass=ABCMeta):
finally:
self.current_context = None
- def _postConfig(self, layout):
+ def _postConfig(self):
+ layout = self.pipeline.tenant.layout
# If our layout UUID already matches the UUID in ZK, we don't
# need to make any changes in ZK. But we do still need to
# update our local object pointers. Note that our local queue
@@ -132,26 +136,19 @@ class PipelineManager(metaclass=ABCMeta):
for project_name, project_configs in layout_project_configs.items():
(trusted, project) = tenant.getProject(project_name)
- project_queue_name = None
- pipeline_queue_name = None
+ queue_name = None
project_in_pipeline = False
for project_config in layout.getAllProjectConfigs(project_name):
project_pipeline_config = project_config.pipelines.get(
self.pipeline.name)
+ if not queue_name:
+ queue_name = project_config.queue_name
if project_pipeline_config is None:
continue
project_in_pipeline = True
- if not pipeline_queue_name:
- pipeline_queue_name = project_pipeline_config.queue_name
- if not project_queue_name:
- project_queue_name = project_config.queue_name
if not project_in_pipeline:
continue
- # Note: we currently support queue name per pipeline and per
- # project while project has precedence.
- queue_name = project_queue_name or pipeline_queue_name
-
if not queue_name:
continue
if queue_name in change_queues:
@@ -221,16 +218,22 @@ class PipelineManager(metaclass=ABCMeta):
def resolveChangeKeys(self, change_keys):
resolved_changes = []
for key in change_keys:
- change = self._change_cache.get(key)
+ change = self._change_cache.get(key.reference)
if change is None:
source = self.sched.connections.getSource(key.connection_name)
change = source.getChange(key)
if change is None:
self.log.error("Unable to resolve change from key %s", key)
+ if (isinstance(change, model.Change)
+ and change.commit_needs_changes is None):
+ self.updateCommitDependencies(change, None, event=None)
self._change_cache[change.cache_key] = change
resolved_changes.append(change)
return resolved_changes
+ def clearCache(self):
+ self._change_cache.clear()
+
def _maintainCache(self):
active_layout_uuids = set()
referenced_change_keys = set()
@@ -284,6 +287,8 @@ class PipelineManager(metaclass=ABCMeta):
change_in_pipeline = False
for item in self.pipeline.getAllItems():
+ if not isinstance(change, model.Change):
+ continue
for dep_change_ref in item.change.commit_needs_changes:
if item.change.equals(change):
change_in_pipeline = True
@@ -312,6 +317,14 @@ class PipelineManager(metaclass=ABCMeta):
self.log.error("Reporting item start %s received: %s" %
(item, ret))
+ def reportNormalBuildsetEnd(self, build_set, action, final, result=None):
+ # Report a buildset end if there are jobs or errors
+ if ((build_set.job_graph and len(build_set.job_graph.jobs) > 0) or
+ build_set.config_errors or
+ build_set.unable_to_merge):
+ self.sql.reportBuildsetEnd(build_set, action,
+ final, result)
+
def reportDequeue(self, item):
if not self.pipeline.state.disabled:
self.log.info(
@@ -326,21 +339,22 @@ class PipelineManager(metaclass=ABCMeta):
)
# This might be called after canceljobs, which also sets a
# non-final 'cancel' result.
- self.sql.reportBuildsetEnd(item.current_build_set, 'dequeue',
- final=False)
+ self.reportNormalBuildsetEnd(item.current_build_set, 'dequeue',
+ final=False)
- def sendReport(self, action_reporters, item, message=None):
+ def sendReport(self, action_reporters, item, phase1=True, phase2=True):
"""Sends the built message off to configured reporters.
- Takes the action_reporters, item, message and extra options and
- sends them to the pluggable reporters.
+ Takes the action_reporters and item and sends them to the
+ pluggable reporters.
+
"""
log = get_annotated_logger(self.log, item.event)
report_errors = []
if len(action_reporters) > 0:
for reporter in action_reporters:
try:
- ret = reporter.report(item)
+ ret = reporter.report(item, phase1=phase1, phase2=phase2)
if ret:
report_errors.append(ret)
except Exception as e:
@@ -353,7 +367,8 @@ class PipelineManager(metaclass=ABCMeta):
return True
def enqueueChangesAhead(self, change, event, quiet, ignore_requirements,
- change_queue, history=None, dependency_graph=None):
+ change_queue, history=None, dependency_graph=None,
+ warnings=None):
return True
def enqueueChangesBehind(self, change, event, quiet, ignore_requirements,
@@ -361,9 +376,16 @@ class PipelineManager(metaclass=ABCMeta):
dependency_graph=None):
return True
- def checkForChangesNeededBy(self, change, change_queue, event,
+ def getMissingNeededChanges(self, change, change_queue, event,
dependency_graph=None):
- return True
+ """Check that all needed changes are ahead in the queue.
+
+ Return a list of any that are missing. If it is not possible
+ to correct the missing changes, "abort" will be true.
+
+ :returns: (abort, needed_changes)
+ """
+ return False, []
def getFailingDependentItems(self, item, nnfi):
return None
@@ -459,6 +481,8 @@ class PipelineManager(metaclass=ABCMeta):
item.setConfigErrors(item.getConfigErrors())
if item.dequeued_needing_change:
item.setDequeuedNeedingChange()
+ if item.dequeued_missing_requirements:
+ item.setDequeuedMissingRequirements()
# It can happen that all in-flight builds have been removed
# which would lead to paused parent jobs not being resumed.
@@ -525,13 +549,18 @@ class PipelineManager(metaclass=ABCMeta):
(change, change.project))
return False
+ warnings = []
if not self.enqueueChangesAhead(change, event, quiet,
ignore_requirements,
change_queue, history=history,
- dependency_graph=dependency_graph):
+ dependency_graph=dependency_graph,
+ warnings=warnings):
self.dequeueIncompleteCycle(change, dependency_graph, event,
change_queue)
log.debug("Failed to enqueue changes ahead of %s" % change)
+ if warnings:
+ self._reportNonEqueuedItem(change_queue, change,
+ event, warnings)
return False
log.debug("History after enqueuing changes ahead: %s", history)
@@ -546,27 +575,20 @@ class PipelineManager(metaclass=ABCMeta):
if cycle and not self.canProcessCycle(change.project):
log.info("Dequeing change %s since at least one project "
"does not allow circular dependencies", change)
- actions = self.pipeline.failure_actions
- ci = change_queue.enqueueChange(cycle[-1], event)
- ci.warning("Dependency cycle detected")
- ci.setReportedResult('FAILURE')
-
- # Only report the cycle if the project is in the current
- # pipeline. Otherwise the change could be spammed by
- # reports from unrelated pipelines.
- if self.pipeline.tenant.layout.getProjectPipelineConfig(
- ci
- ):
- self.sendReport(actions, ci)
- self.dequeueItem(ci)
- self.sql.reportBuildsetEnd(ci.current_build_set,
- 'failure', final=True)
-
+ warnings = ["Dependency cycle detected"]
+ self._reportNonEqueuedItem(change_queue,
+ cycle[-1], event, warnings)
return False
log.info("Adding change %s to queue %s in %s" %
(change, change_queue, self.pipeline))
- item = change_queue.enqueueChange(change, event)
+ if enqueue_time is None:
+ enqueue_time = time.time()
+ span_info = tracing.startSavedSpan(
+ 'QueueItem', start_time=enqueue_time)
+ item = change_queue.enqueueChange(change, event,
+ span_info=span_info,
+ enqueue_time=enqueue_time)
self.updateBundle(item, change_queue, cycle)
with item.activeContext(self.current_context):
@@ -600,6 +622,26 @@ class PipelineManager(metaclass=ABCMeta):
self.dequeueSupercededItems(item)
return True
+ def _reportNonEqueuedItem(self, change_queue, change, event, warnings):
+ # Enqueue an item which otherwise can not be enqueued in order
+ # to report a message to the user.
+ actions = self.pipeline.failure_actions
+ ci = change_queue.enqueueChange(change, event)
+ for w in warnings:
+ ci.warning(w)
+ ci.setReportedResult('FAILURE')
+
+ # Only report the item if the project is in the current
+ # pipeline. Otherwise the change could be spammed by
+ # reports from unrelated pipelines.
+ if self.pipeline.tenant.layout.getProjectPipelineConfig(ci):
+ self.sendReport(actions, ci)
+ self.dequeueItem(ci)
+ # We don't use reportNormalBuildsetEnd here because we want to
+ # report even with no jobs.
+ self.sql.reportBuildsetEnd(ci.current_build_set,
+ 'failure', final=True)
+
def cycleForChange(self, change, dependency_graph, event):
log = get_annotated_logger(self.log, event)
log.debug("Running Tarjan's algorithm on current dependencies: %s",
@@ -616,15 +658,14 @@ class PipelineManager(metaclass=ABCMeta):
return scc
return []
- def canProcessCycle(self, project):
+ def getQueueConfig(self, project):
layout = self.pipeline.tenant.layout
- pipeline_queue_name = None
- project_queue_name = None
+ queue_name = None
for project_config in layout.getAllProjectConfigs(
project.canonical_name
):
- if not project_queue_name:
- project_queue_name = project_config.queue_name
+ if not queue_name:
+ queue_name = project_config.queue_name
project_pipeline_config = project_config.pipelines.get(
self.pipeline.name)
@@ -632,25 +673,27 @@ class PipelineManager(metaclass=ABCMeta):
if project_pipeline_config is None:
continue
- # TODO(simonw): Remove pipeline_queue_name after deprecation
- if not pipeline_queue_name:
- pipeline_queue_name = project_pipeline_config.queue_name
+ return layout.queues.get(queue_name)
- # Note: we currently support queue name per pipeline and per
- # project while project has precedence.
- queue_name = project_queue_name or pipeline_queue_name
- if queue_name is None:
+ def canProcessCycle(self, project):
+ queue_config = self.getQueueConfig(project)
+ if queue_config is None:
return False
- queue_config = layout.queues.get(queue_name)
- return (
- queue_config is not None and
- queue_config.allow_circular_dependencies
- )
+ return queue_config.allow_circular_dependencies
- def canMergeCycle(self, bundle):
- """Check if the cycle still fulfills the pipeline's ready criteria."""
- return True
+ def useDependenciesByTopic(self, project):
+ queue_config = self.getQueueConfig(project)
+ if queue_config is None:
+ return False
+
+ return queue_config.dependencies_by_topic
+
+ def getNonMergeableCycleChanges(self, bundle):
+
+ """Return changes in the cycle that do not fulfill
+ the pipeline's ready criteria."""
+ return []
def updateBundle(self, item, change_queue, cycle):
if not cycle:
@@ -705,6 +748,15 @@ class PipelineManager(metaclass=ABCMeta):
self.reportDequeue(item)
item.queue.dequeueItem(item)
+ span_attrs = {
+ 'zuul_event_id': item.event.zuul_event_id,
+ }
+ for k, v in item.change.getSafeAttributes().toDict().items():
+ span_attrs['ref_' + k] = v
+ tracing.endSavedSpan(item.current_build_set.span_info)
+ tracing.endSavedSpan(item.span_info,
+ attributes=span_attrs)
+
def removeItem(self, item):
log = get_annotated_logger(self.log, item.event)
# Remove an item from the queue, probably because it has been
@@ -798,12 +850,23 @@ class PipelineManager(metaclass=ABCMeta):
log.debug(" Adding dependency: %s", dep)
dependencies.append(dep)
new_commit_needs_changes = [d.cache_key for d in dependencies]
- if change.commit_needs_changes != new_commit_needs_changes:
- source = self.sched.connections.getSource(
- change.project.connection_name)
- source.setChangeAttributes(
- change,
- commit_needs_changes=new_commit_needs_changes)
+
+ update_attrs = dict(commit_needs_changes=new_commit_needs_changes)
+
+ # Ask the source for any tenant-specific changes (this allows
+ # drivers to implement their own way of collecting deps):
+ source = self.sched.connections.getSource(
+ change.project.connection_name)
+ if self.useDependenciesByTopic(change.project):
+ log.debug(" Updating topic dependencies for %s", change)
+ new_topic_needs_changes = []
+ for dep in source.getChangesByTopic(change.topic):
+ if dep and (not dep.is_merged):
+ log.debug(" Adding dependency: %s", dep)
+ new_topic_needs_changes.append(dep.cache_key)
+ update_attrs['topic_needs_changes'] = new_topic_needs_changes
+
+ source.setChangeAttributes(change, **update_attrs)
def provisionNodes(self, item):
log = item.annotateLogger(self.log)
@@ -817,23 +880,28 @@ class PipelineManager(metaclass=ABCMeta):
else:
relative_priority = 0
for job in jobs:
- provider = self._getPausedParentProvider(build_set, job)
- priority = self._calculateNodeRequestPriority(build_set, job)
- tenant_name = build_set.item.pipeline.tenant.name
- pipeline_name = build_set.item.pipeline.name
- req = self.sched.nodepool.requestNodes(
- build_set.uuid, job, tenant_name, pipeline_name, provider,
- priority, relative_priority, event=item.event)
- log.debug("Adding node request %s for job %s to item %s",
- req, job, item)
- build_set.setJobNodeRequestID(job.name, req.id)
- if req.fulfilled:
- nodeset = self.sched.nodepool.getNodeSet(req, job.nodeset)
- build_set.jobNodeRequestComplete(req.job_name, nodeset)
- else:
- job.setWaitingStatus(f'node request: {req.id}')
+ self._makeNodepoolRequest(log, build_set, job, relative_priority)
return True
+ def _makeNodepoolRequest(self, log, build_set, job, relative_priority,
+ alternative=0):
+ provider = self._getPausedParentProvider(build_set, job)
+ priority = self._calculateNodeRequestPriority(build_set, job)
+ tenant_name = build_set.item.pipeline.tenant.name
+ pipeline_name = build_set.item.pipeline.name
+ item = build_set.item
+ req = self.sched.nodepool.requestNodes(
+ build_set.uuid, job, tenant_name, pipeline_name, provider,
+ priority, relative_priority, event=item.event)
+ log.debug("Adding node request %s for job %s to item %s",
+ req, job, item)
+ build_set.setJobNodeRequestID(job.name, req.id)
+ if req.fulfilled:
+ nodeset = self.sched.nodepool.getNodeSet(req, job.nodeset)
+ build_set.jobNodeRequestComplete(req.job_name, nodeset)
+ else:
+ job.setWaitingStatus(f'node request: {req.id}')
+
def _getPausedParent(self, build_set, job):
job_graph = build_set.job_graph
if job_graph:
@@ -902,7 +970,7 @@ class PipelineManager(metaclass=ABCMeta):
jobs_to_cancel = item.getJobs()
for job in jobs_to_cancel:
- self.sched.cancelJob(old_build_set, job)
+ self.sched.cancelJob(old_build_set, job, final=True)
# Don't reset builds for a failing bundle when it has already started
# reporting, to keep available build results. Those items will be
@@ -911,9 +979,10 @@ class PipelineManager(metaclass=ABCMeta):
item.didBundleStartReporting()):
# Force a dequeued result here because we haven't actually
# reported the item, but we are done with this buildset.
- self.sql.reportBuildsetEnd(
+ self.reportNormalBuildsetEnd(
item.current_build_set, 'dequeue', final=False,
result='DEQUEUED')
+ tracing.endSavedSpan(item.current_build_set.span_info)
item.resetAllBuilds()
for item_behind in item.items_behind:
@@ -1210,7 +1279,10 @@ class PipelineManager(metaclass=ABCMeta):
log.debug("Scheduling fileschanged for item %s", item)
build_set = item.current_build_set
- to_sha = getattr(item.change, "branch", None)
+ # if base_sha is not available, fallback to branch
+ to_sha = getattr(item.change, "base_sha",
+ getattr(item.change, "branch", None))
+
self.sched.merger.getFilesChanges(
item.change.project.connection_name, item.change.project.name,
item.change.ref, to_sha, build_set=build_set,
@@ -1284,7 +1356,9 @@ class PipelineManager(metaclass=ABCMeta):
# isn't already set.
tpc = tenant.project_configs.get(item.change.project.canonical_name)
if not build_set.ref:
- build_set.setConfiguration(self.current_context)
+ with trace.use_span(tracing.restoreSpan(item.span_info)):
+ span_info = tracing.startSavedSpan('BuildSet')
+ build_set.setConfiguration(self.current_context, span_info)
# Next, if a change ahead has a broken config, then so does
# this one. Record that and don't do anything else.
@@ -1319,12 +1393,23 @@ class PipelineManager(metaclass=ABCMeta):
item.bundle and
item.bundle.updatesConfig(tenant) and tpc is not None
):
+ extra_config_files = set(tpc.extra_config_files)
+ extra_config_dirs = set(tpc.extra_config_dirs)
+ # Merge extra_config_files and extra_config_dirs of the
+ # dependent change
+ for item_ahead in item.items_ahead:
+ tpc_ahead = tenant.project_configs.get(
+ item_ahead.change.project.canonical_name)
+ if tpc_ahead:
+ extra_config_files.update(tpc_ahead.extra_config_files)
+ extra_config_dirs.update(tpc_ahead.extra_config_dirs)
+
ready = self.scheduleMerge(
item,
files=(['zuul.yaml', '.zuul.yaml'] +
- list(tpc.extra_config_files)),
+ list(extra_config_files)),
dirs=(['zuul.d', '.zuul.d'] +
- list(tpc.extra_config_dirs)))
+ list(extra_config_dirs)))
if build_set.merge_state == build_set.PENDING:
ready = False
@@ -1385,6 +1470,7 @@ class PipelineManager(metaclass=ABCMeta):
if build_set.repo_state_state == build_set.PENDING:
return False
+ item.deduplicateJobs(log)
return True
def _processOneItem(self, item, nnfi):
@@ -1399,16 +1485,31 @@ class PipelineManager(metaclass=ABCMeta):
item_ahead = None
change_queue = item.queue
- if self.checkForChangesNeededBy(item.change, change_queue,
- item.event) is not True:
+ if COMPONENT_REGISTRY.model_api > 3:
+ # This sets a QueueItem flag which is only understood by
+ # api 4.
+ meets_reqs = self.isChangeReadyToBeEnqueued(
+ item.change, item.event)
+ else:
+ meets_reqs = True
+ abort, needs_changes = self.getMissingNeededChanges(
+ item.change, change_queue, item.event)
+ if not (meets_reqs and not needs_changes):
# It's not okay to enqueue this change, we should remove it.
log.info("Dequeuing change %s because "
"it can no longer merge" % item.change)
self.cancelJobs(item)
if item.isBundleFailing():
item.setDequeuedBundleFailing()
+ elif not meets_reqs:
+ item.setDequeuedMissingRequirements()
else:
- item.setDequeuedNeedingChange()
+ clist = ', '.join([c.url for c in needs_changes])
+ if len(needs_changes) > 1:
+ msg = f'Changes {clist} are needed.'
+ else:
+ msg = f'Change {clist} is needed.'
+ item.setDequeuedNeedingChange(msg)
if item.live:
try:
self.reportItem(item)
@@ -1480,22 +1581,42 @@ class PipelineManager(metaclass=ABCMeta):
)
# Before starting to merge the cycle items, make sure they
# can still be merged, to reduce the chance of a partial merge.
- if (
- can_report
- and not item.bundle.started_reporting
- and not self.canMergeCycle(item.bundle)
- ):
- item.bundle.cannot_merge = True
- failing_reasons.append("cycle can not be merged")
- log.debug(
- "Dequeuing item %s because cycle can no longer merge",
- item
- )
+ if can_report and not item.bundle.started_reporting:
+ non_mergeable_cycle_changes = self.getNonMergeableCycleChanges(
+ item.bundle)
+ if non_mergeable_cycle_changes:
+ clist = ', '.join([
+ c.url for c in non_mergeable_cycle_changes])
+ if len(non_mergeable_cycle_changes) > 1:
+ msg = f'Changes {clist} can not be merged.'
+ else:
+ msg = f'Change {clist} can not be merged.'
+ item.bundle.cannot_merge = msg
+ failing_reasons.append("cycle can not be merged")
+ log.debug(
+ "Dequeuing item %s because cycle can no longer merge",
+ item
+ )
item.bundle.started_reporting = can_report
if can_report:
+ # If we're starting to report a successful bundle, enable
+ # two-phase reporting. Report the first phase for every item
+ # in the bundle, then the second.
+ phase1 = True
+ phase2 = True
+ if (self.changes_merge
+ and item.bundle
+ and (not item.cannotMergeBundle())
+ and (not item.isBundleFailing())):
+ for i in item.bundle.items:
+ if not i.reported:
+ self.log.debug("Report phase1 for bundle item %s", i)
+ self.reportItem(i, phase1=True, phase2=False)
+ phase1 = False
+
try:
- self.reportItem(item)
+ self.reportItem(item, phase1=phase1, phase2=phase2)
except exceptions.MergeFailure:
failing_reasons.append("it did not merge")
for item_behind in item.items_behind:
@@ -1503,7 +1624,7 @@ class PipelineManager(metaclass=ABCMeta):
"item ahead, %s, failed to merge" %
(item_behind.change, item))
self.cancelJobs(item_behind)
- # Only re-reported items in the cycle when we encounter a merge
+ # Only re-report items in the cycle when we encounter a merge
# failure for a successful bundle.
if (item.bundle and not (
item.isBundleFailing() or item.cannotMergeBundle())):
@@ -1527,9 +1648,9 @@ class PipelineManager(metaclass=ABCMeta):
request_id, cached=True)
if not node_request:
continue
- if node_request.fulfilled:
- # If the node request is already fulfilled, there is no
- # need to update the relative priority.
+ if node_request.state != model.STATE_REQUESTED:
+ # If the node request was locked and accepted by a
+ # provider, we can no longer update the relative priority.
continue
if node_request.relative_priority != priority:
self.sched.nodepool.reviseRequest(
@@ -1551,8 +1672,8 @@ class PipelineManager(metaclass=ABCMeta):
# Don't override the reported sql result for the item
# that "really" failed.
ri.setReportedResult('FAILURE')
- self.sql.reportBuildsetEnd(ri.current_build_set,
- 'failure', final=True)
+ self.reportNormalBuildsetEnd(ri.current_build_set,
+ 'failure', final=True)
def processQueue(self):
# Do whatever needs to be done for each change in the queue
@@ -1673,25 +1794,49 @@ class PipelineManager(metaclass=ABCMeta):
build, item)
return
- item.setResult(build)
- log.debug("Item %s status is now:\n %s", item, item.formatStatus())
+ # If the build was for deduplicated jobs, apply the results to
+ # all the items that use this build.
+ build_in_items = [item]
+ if item.bundle:
+ for other_item in item.bundle.items:
+ if other_item in build_in_items:
+ continue
+ other_build = other_item.current_build_set.getBuild(
+ build.job.name)
+ if other_build is not None and other_build is build:
+ build_in_items.append(other_item)
+ for item in build_in_items:
+ # We don't care about some actions below if this build
+ # isn't in the current buildset, so determine that before
+ # it is potentially removed with setResult.
+ if item.current_build_set.getBuild(build.job.name) is not build:
+ current = False
+ else:
+ current = True
+ item.setResult(build)
+ log.debug("Item %s status is now:\n %s", item, item.formatStatus())
- if build.retry:
- if build.build_set.getJobNodeSetInfo(build.job.name):
- build.build_set.removeJobNodeSetInfo(build.job.name)
+ if not current:
+ continue
+ build_set = item.current_build_set
- # in case this was a paused build we need to retry all child jobs
- self._resetDependentBuilds(build.build_set, build)
+ if build.retry:
+ if build_set.getJobNodeSetInfo(build.job.name):
+ build_set.removeJobNodeSetInfo(build.job.name)
- self._resumeBuilds(build.build_set)
+ # in case this was a paused build we need to retry all
+ # child jobs
+ self._resetDependentBuilds(build_set, build)
+
+ self._resumeBuilds(build_set)
- if (item.current_build_set.fail_fast and
- build.failed and build.job.voting and not build.retry):
- # If fail-fast is set and the build is not successful
- # cancel all remaining jobs.
- log.debug("Build %s failed and fail-fast enabled, canceling "
- "running builds", build)
- self._cancelRunningBuilds(build.build_set)
+ if (build_set.fail_fast and
+ build.failed and build.job.voting and not build.retry):
+ # If fail-fast is set and the build is not successful
+ # cancel all remaining jobs.
+ log.debug("Build %s failed and fail-fast enabled, canceling "
+ "running builds", build)
+ self._cancelRunningBuilds(build_set)
return True
@@ -1706,18 +1851,27 @@ class PipelineManager(metaclass=ABCMeta):
# We're the second of the files/merger pair, report the stat
self.reportPipelineTiming('merge_request_time',
build_set.configured_time)
+ if event.elapsed_time:
+ self.reportPipelineTiming('merger_files_changes_op_time',
+ event.elapsed_time, elapsed=True)
def onMergeCompleted(self, event, build_set):
if build_set.merge_state == build_set.COMPLETE:
self._onGlobalRepoStateCompleted(event, build_set)
self.reportPipelineTiming('repo_state_time',
build_set.repo_state_request_time)
+ if event.elapsed_time:
+ self.reportPipelineTiming('merger_repo_state_op_time',
+ event.elapsed_time, elapsed=True)
else:
self._onMergeCompleted(event, build_set)
if build_set.files_state == build_set.COMPLETE:
# We're the second of the files/merger pair, report the stat
self.reportPipelineTiming('merge_request_time',
build_set.configured_time)
+ if event.elapsed_time:
+ self.reportPipelineTiming('merger_merge_op_time',
+ event.elapsed_time, elapsed=True)
def _onMergeCompleted(self, event, build_set):
@@ -1763,17 +1917,46 @@ class PipelineManager(metaclass=ABCMeta):
build_set.setExtraRepoState(event.repo_state)
build_set.repo_state_state = build_set.COMPLETE
+ def _handleNodeRequestFallback(self, log, build_set, job, old_request):
+ if len(job.nodeset_alternatives) <= job.nodeset_index + 1:
+ # No alternatives to fall back upon
+ return False
+
+ # Increment the nodeset index and remove the old request
+ with job.activeContext(self.current_context):
+ job.nodeset_index = job.nodeset_index + 1
+
+ log.info("Re-attempting node request for job "
+ f"{job.name} of item {build_set.item} "
+ f"with nodeset alternative {job.nodeset_index}")
+
+ build_set.removeJobNodeRequestID(job.name)
+
+ # Make a new request
+ if self.sched.globals.use_relative_priority:
+ relative_priority = build_set.item.getNodePriority()
+ else:
+ relative_priority = 0
+ log = build_set.item.annotateLogger(self.log)
+ self._makeNodepoolRequest(log, build_set, job, relative_priority)
+ return True
+
def onNodesProvisioned(self, request, nodeset, build_set):
- # TODOv3(jeblair): handle provisioning failure here
log = get_annotated_logger(self.log, request.event_id)
self.reportPipelineTiming('node_request_time', request.created_time)
- if nodeset is not None:
- build_set.jobNodeRequestComplete(request.job_name, nodeset)
+ job = build_set.item.getJob(request.job_name)
+ # First see if we need to retry the request
if not request.fulfilled:
log.info("Node request %s: failure for %s",
request, request.job_name)
- job = build_set.item.getJob(request.job_name)
+ if self._handleNodeRequestFallback(log, build_set, job, request):
+ return
+ # No more fallbacks -- tell the buildset the request is complete
+ if nodeset is not None:
+ build_set.jobNodeRequestComplete(request.job_name, nodeset)
+ # Put a fake build through the cycle to clean it up.
+ if not request.fulfilled:
fakebuild = build_set.item.setNodeRequestFailure(job)
try:
self.sql.reportBuildEnd(
@@ -1790,13 +1973,19 @@ class PipelineManager(metaclass=ABCMeta):
"with nodes %s",
request, request.job_name, build_set.item, request.nodes)
- def reportItem(self, item):
+ def reportItem(self, item, phase1=True, phase2=True):
log = get_annotated_logger(self.log, item.event)
action = None
- if not item.reported:
- action, reported = self._reportItem(item)
+
+ already_reported = item.reported
+ if phase2 and not phase1:
+ already_reported = False
+ if not already_reported:
+ action, reported = self._reportItem(item, phase1, phase2)
item.updateAttributes(self.current_context,
reported=reported)
+ if not phase2:
+ return
if self.changes_merge:
succeeded = item.didAllJobsSucceed() and not item.isBundleFailing()
merged = item.reported
@@ -1809,8 +1998,8 @@ class PipelineManager(metaclass=ABCMeta):
item.change)
action = 'merge-failure'
item.setReportedResult('MERGE_FAILURE')
- self.sql.reportBuildsetEnd(item.current_build_set,
- action, final=True)
+ self.reportNormalBuildsetEnd(item.current_build_set,
+ action, final=True)
change_queue = item.queue
if not (succeeded and merged):
if (not item.current_build_set.job_graph or
@@ -1820,7 +2009,7 @@ class PipelineManager(metaclass=ABCMeta):
error_reason = "failed tests"
else:
error_reason = "failed to merge"
- log.info("Reported change %s did not merge because it %s,"
+ log.info("Reported change %s did not merge because it %s, "
"status: all-succeeded: %s, merged: %s",
item.change, error_reason, succeeded, merged)
if not succeeded:
@@ -1830,8 +2019,8 @@ class PipelineManager(metaclass=ABCMeta):
raise exceptions.MergeFailure(
"Change %s failed to merge" % item.change)
else:
- self.sql.reportBuildsetEnd(item.current_build_set,
- action, final=True)
+ self.reportNormalBuildsetEnd(item.current_build_set,
+ action, final=True)
log.info("Reported change %s status: all-succeeded: %s, "
"merged: %s", item.change, succeeded, merged)
change_queue.increaseWindowSize()
@@ -1842,12 +2031,13 @@ class PipelineManager(metaclass=ABCMeta):
tenant = self.pipeline.tenant
zuul_driver.onChangeMerged(tenant, item.change, source)
elif action:
- self.sql.reportBuildsetEnd(item.current_build_set,
- action, final=True)
+ self.reportNormalBuildsetEnd(item.current_build_set,
+ action, final=True)
- def _reportItem(self, item):
+ def _reportItem(self, item, phase1, phase2):
log = get_annotated_logger(self.log, item.event)
- log.debug("Reporting change %s", item.change)
+ log.debug("Reporting phase1: %s phase2: %s change: %s",
+ phase1, phase2, item.change)
ret = True # Means error as returned by trigger.report
# In the case of failure, we may not have completed an initial
@@ -1880,9 +2070,8 @@ class PipelineManager(metaclass=ABCMeta):
item.setReportedResult('NO_JOBS')
elif item.getConfigErrors():
log.debug("Invalid config for change %s", item.change)
- # TODOv3(jeblair): consider a new reporter action for this
- action = 'merge-conflict'
- actions = self.pipeline.merge_conflict_actions
+ action = 'config-error'
+ actions = self.pipeline.config_error_actions
item.setReportedResult('CONFIG_ERROR')
elif item.didMergerFail():
log.debug("Merge conflict")
@@ -1894,6 +2083,11 @@ class PipelineManager(metaclass=ABCMeta):
action = 'failure'
actions = self.pipeline.failure_actions
item.setReportedResult('FAILURE')
+ elif item.wasDequeuedMissingRequirements():
+ log.debug("Dequeued missing merge requirements")
+ action = 'failure'
+ actions = self.pipeline.failure_actions
+ item.setReportedResult('FAILURE')
elif not item.getJobs():
# We don't send empty reports with +1
log.debug("No jobs for change %s", item.change)
@@ -1938,7 +2132,7 @@ class PipelineManager(metaclass=ABCMeta):
self.current_context, disabled=True)
if actions:
log.info("Reporting item %s, actions: %s", item, actions)
- ret = self.sendReport(actions, item)
+ ret = self.sendReport(actions, item, phase1, phase2)
if ret:
log.error("Reporting item %s received: %s", item, ret)
return action, (not ret)
@@ -1997,7 +2191,7 @@ class PipelineManager(metaclass=ABCMeta):
except Exception:
self.log.exception("Exception reporting pipeline stats")
- def reportPipelineTiming(self, key, start, end=None):
+ def reportPipelineTiming(self, key, start, end=None, elapsed=False):
if not self.sched.statsd:
return
if not start:
@@ -2007,5 +2201,8 @@ class PipelineManager(metaclass=ABCMeta):
pipeline = self.pipeline
tenant = pipeline.tenant
stats_key = f'zuul.tenant.{tenant.name}.pipeline.{pipeline.name}'
- dt = (end - start) * 1000
+ if elapsed:
+ dt = start
+ else:
+ dt = (end - start) * 1000
self.sched.statsd.timing(f'{stats_key}.{key}', dt)
diff --git a/zuul/manager/dependent.py b/zuul/manager/dependent.py
index 30b7c97bc..db1bf48b1 100644
--- a/zuul/manager/dependent.py
+++ b/zuul/manager/dependent.py
@@ -56,8 +56,10 @@ class DependentPipelineManager(SharedQueuePipelineManager):
return False
return True
- def canMergeCycle(self, bundle):
- """Check if the cycle still fulfills the pipeline's ready criteria."""
+ def getNonMergeableCycleChanges(self, bundle):
+ """Return changes in the cycle that do not fulfill
+ the pipeline's ready criteria."""
+ changes = []
for item in bundle.items:
source = item.change.project.source
if not source.canMerge(
@@ -68,8 +70,8 @@ class DependentPipelineManager(SharedQueuePipelineManager):
):
log = get_annotated_logger(self.log, item.event)
log.debug("Change %s can no longer be merged", item.change)
- return False
- return True
+ changes.append(item.change)
+ return changes
def enqueueChangesBehind(self, change, event, quiet, ignore_requirements,
change_queue, history=None,
@@ -138,7 +140,8 @@ class DependentPipelineManager(SharedQueuePipelineManager):
dependency_graph=dependency_graph)
def enqueueChangesAhead(self, change, event, quiet, ignore_requirements,
- change_queue, history=None, dependency_graph=None):
+ change_queue, history=None, dependency_graph=None,
+ warnings=None):
log = get_annotated_logger(self.log, event)
history = history if history is not None else []
@@ -148,12 +151,17 @@ class DependentPipelineManager(SharedQueuePipelineManager):
# Don't enqueue dependencies ahead of a non-change ref.
return True
- ret = self.checkForChangesNeededBy(change, change_queue, event,
- dependency_graph=dependency_graph)
- if ret in [True, False]:
- return ret
- log.debug(" Changes %s must be merged ahead of %s", ret, change)
- for needed_change in ret:
+ abort, needed_changes = self.getMissingNeededChanges(
+ change, change_queue, event,
+ dependency_graph=dependency_graph,
+ warnings=warnings)
+ if abort:
+ return False
+ if not needed_changes:
+ return True
+ log.debug(" Changes %s must be merged ahead of %s",
+ needed_changes, change)
+ for needed_change in needed_changes:
# If the change is already in the history, but the change also has
# a git level dependency, we need to enqueue it before the current
# change.
@@ -167,8 +175,8 @@ class DependentPipelineManager(SharedQueuePipelineManager):
return False
return True
- def checkForChangesNeededBy(self, change, change_queue, event,
- dependency_graph=None):
+ def getMissingNeededChanges(self, change, change_queue, event,
+ dependency_graph=None, warnings=None):
log = get_annotated_logger(self.log, event)
# Return true if okay to proceed enqueing this change,
@@ -176,11 +184,12 @@ class DependentPipelineManager(SharedQueuePipelineManager):
log.debug("Checking for changes needed by %s:" % change)
if not hasattr(change, 'needs_changes'):
log.debug(" %s does not support dependencies", type(change))
- return True
+ return False, []
if not change.needs_changes:
log.debug(" No changes needed")
- return True
+ return False, []
changes_needed = []
+ abort = False
# Ignore supplied change_queue
with self.getChangeQueue(change, event) as change_queue:
for needed_change in self.resolveChangeReferences(
@@ -200,15 +209,22 @@ class DependentPipelineManager(SharedQueuePipelineManager):
with self.getChangeQueue(needed_change,
event) as needed_change_queue:
if needed_change_queue != change_queue:
- log.debug(" Change %s in project %s does not "
- "share a change queue with %s "
- "in project %s",
- needed_change, needed_change.project,
- change, change.project)
- return False
+ msg = ("Change %s in project %s does not "
+ "share a change queue with %s "
+ "in project %s" %
+ (needed_change.number,
+ needed_change.project,
+ change.number,
+ change.project))
+ log.debug(" " + msg)
+ if warnings is not None:
+ warnings.append(msg)
+ changes_needed.append(needed_change)
+ abort = True
if not needed_change.is_current_patchset:
log.debug(" Needed change is not the current patchset")
- return False
+ changes_needed.append(needed_change)
+ abort = True
if self.isChangeAlreadyInQueue(needed_change, change_queue):
log.debug(" Needed change is already ahead in the queue")
continue
@@ -222,10 +238,9 @@ class DependentPipelineManager(SharedQueuePipelineManager):
# The needed change can't be merged.
log.debug(" Change %s is needed but can not be merged",
needed_change)
- return False
- if changes_needed:
- return changes_needed
- return True
+ changes_needed.append(needed_change)
+ abort = True
+ return abort, changes_needed
def getFailingDependentItems(self, item, nnfi):
if not hasattr(item.change, 'needs_changes'):
diff --git a/zuul/manager/independent.py b/zuul/manager/independent.py
index 4405c4481..b70e9184b 100644
--- a/zuul/manager/independent.py
+++ b/zuul/manager/independent.py
@@ -38,7 +38,8 @@ class IndependentPipelineManager(PipelineManager):
return DynamicChangeQueueContextManager(change_queue)
def enqueueChangesAhead(self, change, event, quiet, ignore_requirements,
- change_queue, history=None, dependency_graph=None):
+ change_queue, history=None, dependency_graph=None,
+ warnings=None):
log = get_annotated_logger(self.log, event)
history = history if history is not None else []
@@ -48,12 +49,16 @@ class IndependentPipelineManager(PipelineManager):
# Don't enqueue dependencies ahead of a non-change ref.
return True
- ret = self.checkForChangesNeededBy(change, change_queue, event,
- dependency_graph=dependency_graph)
- if ret in [True, False]:
- return ret
- log.debug(" Changes %s must be merged ahead of %s" % (ret, change))
- for needed_change in ret:
+ abort, needed_changes = self.getMissingNeededChanges(
+ change, change_queue, event,
+ dependency_graph=dependency_graph)
+ if abort:
+ return False
+ if not needed_changes:
+ return True
+ log.debug(" Changes %s must be merged ahead of %s" % (
+ needed_changes, change))
+ for needed_change in needed_changes:
# This differs from the dependent pipeline by enqueuing
# changes ahead as "not live", that is, not intended to
# have jobs run. Also, pipeline requirements are always
@@ -68,22 +73,23 @@ class IndependentPipelineManager(PipelineManager):
return False
return True
- def checkForChangesNeededBy(self, change, change_queue, event,
+ def getMissingNeededChanges(self, change, change_queue, event,
dependency_graph=None):
log = get_annotated_logger(self.log, event)
if self.pipeline.ignore_dependencies:
- return True
+ return False, []
log.debug("Checking for changes needed by %s:" % change)
# Return true if okay to proceed enqueing this change,
# false if the change should not be enqueued.
if not hasattr(change, 'needs_changes'):
log.debug(" %s does not support dependencies" % type(change))
- return True
+ return False, []
if not change.needs_changes:
log.debug(" No changes needed")
- return True
+ return False, []
changes_needed = []
+ abort = False
for needed_change in self.resolveChangeReferences(
change.needs_changes):
log.debug(" Change %s needs change %s:" % (
@@ -107,9 +113,7 @@ class IndependentPipelineManager(PipelineManager):
continue
# This differs from the dependent pipeline check in not
# verifying that the dependent change is mergable.
- if changes_needed:
- return changes_needed
- return True
+ return abort, changes_needed
def dequeueItem(self, item):
super(IndependentPipelineManager, self).dequeueItem(item)
diff --git a/zuul/manager/shared.py b/zuul/manager/shared.py
index db8735289..4be107db9 100644
--- a/zuul/manager/shared.py
+++ b/zuul/manager/shared.py
@@ -71,27 +71,19 @@ class SharedQueuePipelineManager(PipelineManager, metaclass=ABCMeta):
for project_name, project_configs in layout_project_configs.items():
(trusted, project) = tenant.getProject(project_name)
- project_queue_name = None
- pipeline_queue_name = None
+ queue_name = None
project_in_pipeline = False
for project_config in layout.getAllProjectConfigs(project_name):
project_pipeline_config = project_config.pipelines.get(
self.pipeline.name)
- if not project_queue_name:
- project_queue_name = project_config.queue_name
+ if not queue_name:
+ queue_name = project_config.queue_name
if project_pipeline_config is None:
continue
project_in_pipeline = True
- # TODO(tobiash): Remove pipeline_queue_name after deprecation
- if not pipeline_queue_name:
- pipeline_queue_name = project_pipeline_config.queue_name
if not project_in_pipeline:
continue
- # Note: we currently support queue name per pipeline and per
- # project while project has precedence.
- queue_name = project_queue_name or pipeline_queue_name
-
# Check if the queue is global or per branch
queue = layout.queues.get(queue_name)
per_branch = queue and queue.per_branch
diff --git a/zuul/merger/client.py b/zuul/merger/client.py
index 362644b98..29fa39aaf 100644
--- a/zuul/merger/client.py
+++ b/zuul/merger/client.py
@@ -159,7 +159,9 @@ class MergeClient(object):
"via result event for %s", merge_request)
if merge_request.job_type == MergeRequest.FILES_CHANGES:
event = FilesChangesCompletedEvent(
- merge_request.build_set_uuid, files=None
+ merge_request.build_set_uuid,
+ files=None,
+ elapsed_time=None,
)
else:
event = MergeCompletedEvent(
@@ -172,6 +174,7 @@ class MergeClient(object):
repo_state=None,
item_in_branches=None,
errors=None,
+ elapsed_time=None,
)
try:
self.result_events[merge_request.tenant_name][
diff --git a/zuul/merger/merger.py b/zuul/merger/merger.py
index 4cef32a2c..34b495fcc 100644
--- a/zuul/merger/merger.py
+++ b/zuul/merger/merger.py
@@ -19,10 +19,12 @@ from typing import Optional
from urllib.parse import urlsplit, urlunsplit, urlparse
import hashlib
import logging
+import math
import os
import re
import shutil
import time
+from concurrent.futures.process import BrokenProcessPool
import git
import gitdb
@@ -73,7 +75,7 @@ class Repo(object):
def __init__(self, remote, local, email, username, speed_limit, speed_time,
sshkey=None, cache_path=None, logger=None, git_timeout=300,
- zuul_event_id=None):
+ zuul_event_id=None, retry_timeout=None):
if logger is None:
self.log = logging.getLogger("zuul.Repo")
else:
@@ -84,6 +86,9 @@ class Repo(object):
'GIT_HTTP_LOW_SPEED_TIME': speed_time,
}
self.git_timeout = git_timeout
+ if retry_timeout:
+ self.retry_attempts = math.ceil(
+ retry_timeout / self.retry_interval)
self.sshkey = sshkey
if sshkey:
self.env['GIT_SSH_COMMAND'] = 'ssh -i %s' % (sshkey,)
@@ -400,13 +405,18 @@ class Repo(object):
log.debug("Resetting repository %s", self.local_path)
self.createRepoObject(zuul_event_id, build=build)
- if process_worker is None:
- self._reset(self.local_path, self.env, log)
- else:
- job = process_worker.submit(Repo._reset, self.local_path, self.env)
- messages = job.result()
- for message in messages:
- log.debug(message)
+ try:
+ if process_worker is None:
+ self._reset(self.local_path, self.env, log)
+ else:
+ job = process_worker.submit(
+ Repo._reset, self.local_path, self.env)
+ messages = job.result()
+ for message in messages:
+ log.debug(message)
+ except Exception:
+ shutil.rmtree(self.local_path)
+ raise
def getBranchHead(self, branch, zuul_event_id=None):
repo = self.createRepoObject(zuul_event_id)
@@ -508,12 +518,11 @@ class Repo(object):
log = get_annotated_logger(self.log, zuul_event_id)
repo = self.createRepoObject(zuul_event_id)
try:
- origin_ref = repo.remotes.origin.refs[branch]
+ log.debug("Updating remote reference origin/%s to %s", branch, rev)
+ repo.remotes.origin.refs[branch].commit = rev
except IndexError:
- log.warning("No remote ref found for branch %s", branch)
- return
- log.debug("Updating remote reference %s to %s", origin_ref, rev)
- origin_ref.commit = rev
+ log.warning("No remote ref found for branch %s, creating", branch)
+ Repo._setRef(f"refs/remotes/origin/{branch}", str(rev), repo)
def deleteRef(self, path, repo=None, zuul_event_id=None):
ref_log = get_annotated_logger(
@@ -550,9 +559,15 @@ class Repo(object):
def cherryPick(self, ref, zuul_event_id=None):
log = get_annotated_logger(self.log, zuul_event_id)
repo = self.createRepoObject(zuul_event_id)
- log.debug("Cherry-picking %s", ref)
self.fetch(ref, zuul_event_id=zuul_event_id)
- repo.git.cherry_pick("FETCH_HEAD")
+ if len(repo.commit("FETCH_HEAD").parents) > 1:
+ args = ["-s", "resolve", "FETCH_HEAD"]
+ log.debug("Merging %s with args %s instead of cherry-picking",
+ ref, args)
+ repo.git.merge(*args)
+ else:
+ log.debug("Cherry-picking %s", ref)
+ repo.git.cherry_pick("FETCH_HEAD")
return repo.head.commit
def merge(self, ref, strategy=None, zuul_event_id=None):
@@ -652,7 +667,12 @@ class Repo(object):
ret[fn] = None
if dirs:
for dn in dirs:
- if dn not in tree:
+ try:
+ sub_tree = tree[dn]
+ except KeyError:
+ continue
+
+ if sub_tree.type != "tree":
continue
# Some people like to keep playbooks, etc. grouped
@@ -660,7 +680,7 @@ class Repo(object):
# directories of any .zuul.ignore files and prune them
# from the config read.
to_ignore = []
- for blob in tree[dn].traverse():
+ for blob in sub_tree.traverse():
if blob.path.endswith(".zuul.ignore"):
to_ignore.append(os.path.split(blob.path)[0])
@@ -670,7 +690,7 @@ class Repo(object):
return True
return False
- for blob in tree[dn].traverse():
+ for blob in sub_tree.traverse():
if not _ignored(blob) and blob.path.endswith(".yaml"):
ret[blob.path] = blob.data_stream.read().decode(
'utf-8')
@@ -684,9 +704,22 @@ class Repo(object):
files = set()
if tosha:
+ # When "tosha" is the target branch, the result of diff() correctly
+ # excluds the files whose changes are reverted between the commits.
+ # But it may also include the files that are not changed in the
+ # referenced commit(s). This can happen, e.g. if the target branch
+ # has diverged from the feature branch.
+ # The idea is to use this result to filter out the files whose
+ # changes are reverted between the commits.
+ diff_files = set()
+ head_commit = repo.commit(head.hexsha)
+ diff_index = head_commit.diff(tosha)
+ diff_files.update((item.a_path for item in diff_index))
+
commit_diff = "{}..{}".format(tosha, head.hexsha)
for cmt in repo.iter_commits(commit_diff, no_merges=True):
- files.update(cmt.stats.files.keys())
+ files.update(f for f in cmt.stats.files.keys()
+ if f in diff_files)
else:
files.update(head.stats.files.keys())
return list(files)
@@ -700,10 +733,8 @@ class Repo(object):
return
log = get_annotated_logger(self.log, zuul_event_id)
log.debug("Set remote url to %s", redact_url(url))
+ self._git_set_remote_url(self.createRepoObject(zuul_event_id), url)
self.remote_url = url
- self._git_set_remote_url(
- self.createRepoObject(zuul_event_id),
- self.remote_url)
def mapLine(self, commit, filename, lineno, zuul_event_id=None):
repo = self.createRepoObject(zuul_event_id)
@@ -836,7 +867,7 @@ class Merger(object):
f.write(self.scheme)
def _addProject(self, hostname, connection_name, project_name, url, sshkey,
- zuul_event_id, process_worker=None):
+ zuul_event_id, process_worker=None, retry_timeout=None):
repo = None
key = '/'.join([hostname, project_name])
try:
@@ -855,7 +886,7 @@ class Merger(object):
url, path, self.email, self.username, self.speed_limit,
self.speed_time, sshkey=sshkey, cache_path=cache_path,
logger=self.logger, git_timeout=self.git_timeout,
- zuul_event_id=zuul_event_id)
+ zuul_event_id=zuul_event_id, retry_timeout=retry_timeout)
self.repos[key] = repo
except Exception:
@@ -870,6 +901,7 @@ class Merger(object):
project = source.getProject(project_name)
hostname = project.canonical_hostname
url = source.getGitUrl(project)
+ retry_timeout = source.getRetryTimeout(project)
key = '/'.join([hostname, project_name])
if key in self.repos:
repo = self.repos[key]
@@ -883,7 +915,8 @@ class Merger(object):
(connection_name, project_name,))
return self._addProject(hostname, connection_name, project_name, url,
sshkey, zuul_event_id,
- process_worker=process_worker)
+ process_worker=process_worker,
+ retry_timeout=retry_timeout)
def updateRepo(self, connection_name, project_name, repo_state=None,
zuul_event_id=None, build=None, process_worker=None):
@@ -1053,6 +1086,8 @@ class Merger(object):
try:
repo.reset(zuul_event_id=zuul_event_id,
process_worker=process_worker)
+ except BrokenProcessPool:
+ raise
except Exception:
log.exception("Unable to reset repo %s" % repo)
return None, None
@@ -1130,6 +1165,8 @@ class Merger(object):
item, recent, repo_state, zuul_event_id,
branches=branches,
process_worker=process_worker)
+ except BrokenProcessPool:
+ raise
except Exception:
self.log.exception("Error merging item %s", item)
if errors is not None:
@@ -1205,11 +1242,13 @@ class Merger(object):
item['connection'], item['project'], repo_state,
item['ref'], item['newrev'])
item = items[-1]
- repo = self.getRepo(item['connection'], item['project'])
# A list of branch names the last item appears in.
item_in_branches = []
if item.get('newrev'):
- item_in_branches = repo.contains(item['newrev'])
+ lock = repo_locks.getRepoLock(item['connection'], item['project'])
+ with lock:
+ repo = self.getRepo(item['connection'], item['project'])
+ item_in_branches = repo.contains(item['newrev'])
return (True, repo_state, item_in_branches)
def getFiles(self, connection_name, project_name, branch, files, dirs=[]):
diff --git a/zuul/merger/server.py b/zuul/merger/server.py
index 91597714f..fe5b938a1 100644
--- a/zuul/merger/server.py
+++ b/zuul/merger/server.py
@@ -256,6 +256,7 @@ class BaseMergeServer(metaclass=ABCMeta):
def executeMergeJob(self, merge_request, params):
result = None
+ start = time.monotonic()
if merge_request.job_type == MergeRequest.MERGE:
result = self.merge(merge_request, params)
elif merge_request.job_type == MergeRequest.CAT:
@@ -264,6 +265,8 @@ class BaseMergeServer(metaclass=ABCMeta):
result = self.refstate(merge_request, params)
elif merge_request.job_type == MergeRequest.FILES_CHANGES:
result = self.fileschanges(merge_request, params)
+ end = time.monotonic()
+ result['elapsed_time'] = end - start
return result
def cat(self, merge_request, args):
@@ -376,6 +379,7 @@ class BaseMergeServer(metaclass=ABCMeta):
item_in_branches = result.get("item_in_branches", [])
files = result.get("files", {})
errors = result.get("errors", [])
+ elapsed_time = result.get("elapsed_time")
log.info(
"Merge %s complete, merged: %s, updated: %s, commit: %s, "
@@ -407,7 +411,9 @@ class BaseMergeServer(metaclass=ABCMeta):
)
if merge_request.job_type == MergeRequest.FILES_CHANGES:
event = FilesChangesCompletedEvent(
- merge_request.build_set_uuid, files
+ merge_request.build_set_uuid,
+ files,
+ elapsed_time,
)
else:
event = MergeCompletedEvent(
@@ -420,6 +426,7 @@ class BaseMergeServer(metaclass=ABCMeta):
repo_state,
item_in_branches,
errors,
+ elapsed_time,
)
def put_complete_event(log, merge_request, event):
diff --git a/zuul/model.py b/zuul/model.py
index 14da24fa8..254556fda 100644
--- a/zuul/model.py
+++ b/zuul/model.py
@@ -46,11 +46,9 @@ from zuul.lib.logutil import get_annotated_logger
from zuul.lib.capabilities import capabilities_registry
from zuul.lib.jsonutil import json_dumps
from zuul.zk import zkobject
+from zuul.zk.blob_store import BlobStore
from zuul.zk.change_cache import ChangeKey
-
-# When making ZK schema changes, increment this and add a record to
-# docs/developer/model-changelog.rst
-MODEL_API = 3
+from zuul.zk.components import COMPONENT_REGISTRY
MERGER_MERGE = 1 # "git merge"
MERGER_MERGE_RESOLVE = 2 # "git merge -s resolve"
@@ -108,7 +106,7 @@ NODE_STATES = set([STATE_BUILDING,
# Workspace scheme
SCHEME_GOLANG = 'golang'
SCHEME_FLAT = 'flat'
-SCHEME_UNIQUE = 'unique' # Internal use only
+SCHEME_UNIQUE = 'unique'
def add_debug_line(debug_messages, msg, indent=0):
@@ -331,6 +329,9 @@ class Attributes(object):
def __init__(self, **kw):
setattr(self, '__dict__', kw)
+ def toDict(self):
+ return self.__dict__
+
class Freezable(object):
"""A mix-in class so that an object can be made immutable"""
@@ -527,6 +528,13 @@ class Pipeline(object):
self.queues.remove(queue)
queue.delete(self.manager.current_context)
+ def promoteQueue(self, queue):
+ if queue not in self.queues:
+ return
+ with self.state.activeContext(self.manager.current_context):
+ self.queues.remove(queue)
+ self.queues.insert(0, queue)
+
def getChangesInQueue(self):
changes = []
for shared_queue in self.queues:
@@ -654,6 +662,13 @@ class PipelineState(zkobject.ZKObject):
safe_pipeline = urllib.parse.quote_plus(pipeline.name)
return f"/zuul/tenant/{safe_tenant}/pipeline/{safe_pipeline}"
+ @classmethod
+ def parsePath(self, path):
+ """Return path components for use by the REST API"""
+ root, safe_tenant, pipeline, safe_pipeline = path.rsplit('/', 3)
+ return (urllib.parse.unquote_plus(safe_tenant),
+ urllib.parse.unquote_plus(safe_pipeline))
+
def _dirtyPath(self):
return f'{self.getPath()}/dirty'
@@ -689,6 +704,11 @@ class PipelineState(zkobject.ZKObject):
return json.dumps(data, sort_keys=True).encode("utf8")
def deserialize(self, raw, context):
+ # We may have old change objects in the pipeline cache, so
+ # make sure they are the same objects we would get from the
+ # source change cache.
+ self.pipeline.manager.clearCache()
+
data = super().deserialize(raw, context)
existing_queues = {
q.getPath(): q for q in self.queues + self.old_queues
@@ -737,8 +757,56 @@ class PipelineState(zkobject.ZKObject):
"queues": queues,
"old_queues": old_queues,
})
+ if context.build_references:
+ self._fixBuildReferences(data, context)
+ context.build_references = False
return data
+ def _fixBuildReferences(self, data, context):
+ # Reconcile duplicate builds; if we find any BuildReference
+ # objects, look up the actual builds and replace
+ log = context.log
+ build_map = {}
+ to_replace_dicts = []
+ to_replace_lists = []
+ for queue in data['queues'] + data['old_queues']:
+ for item in queue.queue:
+ buildset = item.current_build_set
+ for build_job, build in buildset.builds.items():
+ if isinstance(build, BuildReference):
+ to_replace_dicts.append((item,
+ buildset.builds,
+ build_job,
+ build._path))
+ else:
+ build_map[build.getPath()] = build
+ for job_name, build_list in buildset.retry_builds.items():
+ for build in build_list:
+ if isinstance(build, BuildReference):
+ to_replace_lists.append((item,
+ build_list,
+ build,
+ build._path))
+ else:
+ build_map[build.getPath()] = build
+ for (item, build_dict, build_job, build_path) in to_replace_dicts:
+ orig_build = build_map.get(build_path)
+ if orig_build:
+ build_dict[build_job] = orig_build
+ else:
+ log.warning("Unable to find deduplicated build %s for %s",
+ build_path, item)
+ del build_dict[build_job]
+ for (item, build_list, build, build_path) in to_replace_lists:
+ idx = build_list.index(build)
+ orig_build = build_map.get(build_path)
+ if orig_build:
+ build_list[idx] = build_map[build_path]
+ else:
+ log.warning("Unable to find deduplicated build %s for %s",
+ build_path, item)
+ del build_list[idx]
+
def _getKnownItems(self):
items = []
for queue in (*self.old_queues, *self.queues):
@@ -881,6 +949,9 @@ class PipelineSummary(zkobject.ShardedZKObject):
# while zuul-web tries to read it.
try:
super().refresh(context)
+ except NoNodeError:
+ self.log.warning("No pipeline summary found "
+ "(may not be created yet)")
except Exception:
self.log.exception("Failed to refresh data")
return self.status
@@ -1026,13 +1097,16 @@ class ChangeQueue(zkobject.ZKObject):
def matches(self, project_cname, branch):
return (project_cname, branch) in self.project_branches
- def enqueueChange(self, change, event):
+ def enqueueChange(self, change, event, span_info=None, enqueue_time=None):
+ if enqueue_time is None:
+ enqueue_time = time.time()
item = QueueItem.new(self.zk_context,
queue=self,
pipeline=self.pipeline,
change=change,
event=event,
- enqueue_time=time.time())
+ span_info=span_info,
+ enqueue_time=enqueue_time)
self.enqueueItem(item)
return item
@@ -1208,6 +1282,8 @@ class Node(ConfigObject):
self.resources = None
self.allocated_to = None
self.attributes = {}
+ self.tenant_name = None
+ self.requestor = None
@property
def state(self):
@@ -1240,6 +1316,8 @@ class Node(ConfigObject):
d['hold_job'] = self.hold_job
d['comment'] = self.comment
d['user_data'] = self.user_data
+ d['tenant_name'] = self.tenant_name
+ d['requestor'] = self.requestor
for k in self._keys:
d[k] = getattr(self, k)
if internal_attributes:
@@ -1318,6 +1396,7 @@ class NodeSet(ConfigObject):
self.name = name or ''
self.nodes = OrderedDict()
self.groups = OrderedDict()
+ self.alternatives = []
def __ne__(self, other):
return not self.__eq__(other)
@@ -1326,7 +1405,9 @@ class NodeSet(ConfigObject):
if not isinstance(other, NodeSet):
return False
return (self.name == other.name and
- self.nodes == other.nodes)
+ self.nodes == other.nodes and
+ self.groups == other.groups and
+ self.alternatives == other.alternatives)
def toDict(self):
d = {}
@@ -1337,6 +1418,12 @@ class NodeSet(ConfigObject):
d['groups'] = []
for group in self.groups.values():
d['groups'].append(group.toDict())
+ d['alternatives'] = []
+ for alt in self.alternatives:
+ if isinstance(alt, NodeSet):
+ d['alternatives'].append(alt.toDict())
+ else:
+ d['alternatives'].append(alt)
return d
@classmethod
@@ -1346,6 +1433,12 @@ class NodeSet(ConfigObject):
nodeset.addNode(Node.fromDict(node))
for group in data["groups"]:
nodeset.addGroup(Group.fromDict(group))
+ for alt in data.get('alternatives', []):
+ if isinstance(alt, str):
+ if isinstance(alt, str):
+ nodeset.addAlternative(alt)
+ else:
+ nodeset.addAlternative(NodeSet.fromDict(alt))
return nodeset
def copy(self):
@@ -1354,6 +1447,11 @@ class NodeSet(ConfigObject):
n.addNode(Node(node.name, node.label))
for name, group in self.groups.items():
n.addGroup(Group(group.name, group.nodes[:]))
+ for alt in self.alternatives:
+ if isinstance(alt, str):
+ n.addAlternative(alt)
+ else:
+ n.addAlternative(alt.copy())
return n
def addNode(self, node):
@@ -1373,6 +1471,36 @@ class NodeSet(ConfigObject):
def getGroups(self):
return list(self.groups.values())
+ def addAlternative(self, alt):
+ self.alternatives.append(alt)
+
+ def flattenAlternatives(self, layout):
+ alts = []
+ history = []
+ self._flattenAlternatives(layout, self, alts, history)
+ return alts
+
+ def _flattenAlternatives(self, layout, nodeset,
+ alternatives, history):
+ if isinstance(nodeset, str):
+ # This references an existing named nodeset in the layout.
+ ns = layout.nodesets.get(nodeset)
+ if ns is None:
+ raise Exception(f'The nodeset "{nodeset}" was not found.')
+ else:
+ ns = nodeset
+ if ns in history:
+ raise Exception(f'Nodeset cycle detected on "{nodeset}"')
+ history.append(ns)
+ if ns.alternatives:
+ for alt in ns.alternatives:
+ self._flattenAlternatives(layout, alt, alternatives, history)
+ else:
+ alternatives.append(ns)
+
+ def validateReferences(self, layout):
+ self.flattenAlternatives(layout)
+
def __repr__(self):
if self.name:
name = self.name + ' '
@@ -1686,6 +1814,9 @@ class SourceContext(ConfigObject):
self.trusted == other.trusted)
def serialize(self):
+ ibs = None
+ if self.implied_branches:
+ ibs = [ibm.serialize() for ibm in self.implied_branches]
return {
"project_canonical_name": self.project_canonical_name,
"project_name": self.project_name,
@@ -1694,12 +1825,22 @@ class SourceContext(ConfigObject):
"path": self.path,
"trusted": self.trusted,
"implied_branch_matchers": self.implied_branch_matchers,
- "implied_branches": self.implied_branches,
+ "implied_branches": ibs,
}
@classmethod
def deserialize(cls, data):
o = cls.__new__(cls)
+ ibs = data.get('implied_branches')
+ if ibs:
+ data['implied_branches'] = []
+ for matcher_data in ibs:
+ if matcher_data['implied']:
+ cls = change_matcher.ImpliedBranchMatcher
+ else:
+ cls = change_matcher.BranchMatcher
+ data['implied_branches'].append(
+ cls.deserialize(matcher_data))
o.__dict__.update(data)
return o
@@ -1960,7 +2101,8 @@ class FrozenJob(zkobject.ZKObject):
'dependencies',
'inheritance_path',
'name',
- 'nodeset',
+ 'nodeset_alternatives',
+ 'nodeset_index',
'override_branch',
'override_checkout',
'post_timeout',
@@ -1983,6 +2125,7 @@ class FrozenJob(zkobject.ZKObject):
'requires',
'workspace_scheme',
'config_hash',
+ 'deduplicate',
)
job_data_attributes = ('artifact_data',
@@ -1996,9 +2139,33 @@ class FrozenJob(zkobject.ZKObject):
'affected_projects',
)
+ def __init__(self):
+ super().__init__()
+ self._set(_ready_to_run=False)
+
def __repr__(self):
return '<FrozenJob %s>' % (self.name)
+ def isEqual(self, other):
+ # Compare two frozen jobs to determine whether they are
+ # effectively equal. The inheritance path will always be
+ # different, so it is ignored. But if otherwise they have the
+ # same attributes, they will probably produce the same
+ # results.
+ if not isinstance(other, FrozenJob):
+ return False
+ if self.name != other.name:
+ return False
+ for k in self.attributes:
+ if k in ['inheritance_path', 'waiting_status', 'queued']:
+ continue
+ if getattr(self, k) != getattr(other, k):
+ return False
+ for k in self.job_data_attributes:
+ if getattr(self, k) != getattr(other, k):
+ return False
+ return True
+
@classmethod
def new(klass, context, **kw):
obj = klass()
@@ -2046,8 +2213,8 @@ class FrozenJob(zkobject.ZKObject):
if not hasattr(self, k):
continue
v = getattr(self, k)
- if k == 'nodeset':
- v = v.toDict()
+ if k == 'nodeset_alternatives':
+ v = [alt.toDict() for alt in v]
elif k == 'dependencies':
# frozenset of JobDependency
v = [dep.toDict() for dep in v]
@@ -2070,19 +2237,31 @@ class FrozenJob(zkobject.ZKObject):
v = {'storage': 'local', 'data': v}
data[k] = v
+ if (COMPONENT_REGISTRY.model_api < 9):
+ data['nodeset'] = data['nodeset_alternatives'][0]
+
# Use json_dumps to strip any ZuulMark entries
return json_dumps(data, sort_keys=True).encode("utf8")
def deserialize(self, raw, context):
data = super().deserialize(raw, context)
- if hasattr(self, 'nodeset'):
- nodeset = self.nodeset
+ # MODEL_API < 8
+ if 'deduplicate' not in data:
+ data['deduplicate'] = 'auto'
+
+ # MODEL_API < 9
+ if data.get('nodeset'):
+ data['nodeset_alternatives'] = [data['nodeset']]
+ data['nodeset_index'] = 0
+ del data['nodeset']
+
+ if hasattr(self, 'nodeset_alternatives'):
+ alts = self.nodeset_alternatives
else:
- nodeset = data.get('nodeset')
- if nodeset:
- nodeset = NodeSet.fromDict(nodeset)
- data['nodeset'] = nodeset
+ alts = data.get('nodeset_alternatives', [])
+ alts = [NodeSet.fromDict(alt) for alt in alts]
+ data['nodeset_alternatives'] = alts
if hasattr(self, 'dependencies'):
data['dependencies'] = self.dependencies
@@ -2143,6 +2322,12 @@ class FrozenJob(zkobject.ZKObject):
return val
@property
+ def nodeset(self):
+ if self.nodeset_alternatives:
+ return self.nodeset_alternatives[self.nodeset_index]
+ return None
+
+ @property
def parent_data(self):
return self._getJobData('_parent_data')
@@ -2272,6 +2457,12 @@ class FrozenJob(zkobject.ZKObject):
_artifact_data=self._makeJobData(
context, 'artifact_data', artifact_data))
+ @property
+ def all_playbooks(self):
+ for k in ('pre_run', 'run', 'post_run', 'cleanup_run'):
+ playbooks = getattr(self, k)
+ yield from playbooks
+
class Job(ConfigObject):
"""A Job represents the defintion of actions to perform.
@@ -2290,6 +2481,8 @@ class Job(ConfigObject):
empty_nodeset = NodeSet()
BASE_JOB_MARKER = object()
+ # Secrets larger than this size will be put in the blob store
+ SECRET_BLOB_SIZE = 10 * 1024
def isBase(self):
return self.parent is self.BASE_JOB_MARKER
@@ -2337,18 +2530,18 @@ class Job(ConfigObject):
self.cleanup_run))
d['post_review'] = self.post_review
d['match_on_config_updates'] = self.match_on_config_updates
+ d['deduplicate'] = self.deduplicate
if self.isBase():
d['parent'] = None
elif self.parent:
d['parent'] = self.parent
else:
d['parent'] = tenant.default_base_job
- if isinstance(self.nodeset, str):
- ns = tenant.layout.nodesets.get(self.nodeset)
- else:
- ns = self.nodeset
- if ns:
- d['nodeset'] = ns.toDict()
+ alts = self.flattenNodesetAlternatives(tenant.layout)
+ if len(alts) == 1 and len(alts[0]):
+ d['nodeset'] = alts[0].toDict()
+ elif len(alts) > 1:
+ d['nodeset_alternatives'] = [x.toDict() for x in alts]
if self.ansible_version:
d['ansible_version'] = self.ansible_version
else:
@@ -2374,6 +2567,7 @@ class Job(ConfigObject):
irrelevant_file_matcher=None, # skip-if
_irrelevant_files=(),
match_on_config_updates=True,
+ deduplicate='auto',
tags=frozenset(),
provides=frozenset(),
requires=frozenset(),
@@ -2482,17 +2676,46 @@ class Job(ConfigObject):
role['project'] = role_project.name
return d
- def _deduplicateSecrets(self, secrets, playbook):
+ def _deduplicateSecrets(self, context, secrets, playbook):
# secrets is a list of secrets accumulated so far
# playbook is a frozen playbook from _freezePlaybook
+ # At the end of this method, the values in the playbook
+ # secrets dictionary will be mutated to either be an integer
+ # (which is an index into the job's secret list) or a dict
+ # (which contains a pointer to a key in the global blob
+ # store).
+
+ blobstore = BlobStore(context)
+
# Cast to list so we can modify in place
for secret_key, secret_value in list(playbook['secrets'].items()):
- if secret_value in secrets:
- playbook['secrets'][secret_key] = secrets.index(secret_value)
+ secret_serialized = json_dumps(
+ secret_value, sort_keys=True).encode("utf8")
+ if (COMPONENT_REGISTRY.model_api >= 6 and
+ len(secret_serialized) > self.SECRET_BLOB_SIZE):
+ # If the secret is large, store it in the blob store
+ # and store the key in the playbook secrets dict.
+ blob_key = blobstore.put(secret_serialized)
+ playbook['secrets'][secret_key] = {'blob': blob_key}
else:
- secrets.append(secret_value)
- playbook['secrets'][secret_key] = len(secrets) - 1
+ if secret_value in secrets:
+ playbook['secrets'][secret_key] =\
+ secrets.index(secret_value)
+ else:
+ secrets.append(secret_value)
+ playbook['secrets'][secret_key] = len(secrets) - 1
+
+ def flattenNodesetAlternatives(self, layout):
+ nodeset = self.nodeset
+ if isinstance(nodeset, str):
+ # This references an existing named nodeset in the layout.
+ ns = layout.nodesets.get(nodeset)
+ if ns is None:
+ raise Exception(f'The nodeset "{nodeset}" was not found.')
+ else:
+ ns = nodeset
+ return ns.flattenAlternatives(layout)
def freezeJob(self, context, tenant, layout, item,
redact_secrets_and_keys):
@@ -2505,6 +2728,9 @@ class Job(ConfigObject):
attributes.discard('secrets')
attributes.discard('affected_projects')
attributes.discard('config_hash')
+ # Nodeset alternatives are flattened at this point
+ attributes.discard('nodeset_alternatives')
+ attributes.discard('nodeset_index')
secrets = []
for k in attributes:
# If this is a config object, it's frozen, so it's
@@ -2526,8 +2752,10 @@ class Job(ConfigObject):
# it's clear that the value ("REDACTED") is
# redacted.
for pb in v:
- self._deduplicateSecrets(secrets, pb)
+ self._deduplicateSecrets(context, secrets, pb)
kw[k] = v
+ kw['nodeset_alternatives'] = self.flattenNodesetAlternatives(layout)
+ kw['nodeset_index'] = 0
kw['secrets'] = secrets
kw['affected_projects'] = self._getAffectedProjects(tenant)
kw['config_hash'] = self.getConfigHash(tenant)
@@ -2600,7 +2828,7 @@ class Job(ConfigObject):
if self._get('cleanup_run') is not None:
self.cleanup_run = self.freezePlaybooks(self.cleanup_run, layout)
- def getNodeSet(self, layout):
+ def getNodeset(self, layout):
if isinstance(self.nodeset, str):
# This references an existing named nodeset in the layout.
ns = layout.nodesets.get(self.nodeset)
@@ -2617,15 +2845,17 @@ class Job(ConfigObject):
if not self.isBase() and self.parent:
layout.getJob(self.parent)
- ns = self.getNodeSet(layout)
- if layout.tenant.max_nodes_per_job != -1 and \
- len(ns) > layout.tenant.max_nodes_per_job:
- raise Exception(
- 'The job "{job}" exceeds tenant '
- 'max-nodes-per-job {maxnodes}.'.format(
- job=self.name,
- maxnodes=layout.tenant.max_nodes_per_job))
+ for ns in self.flattenNodesetAlternatives(layout):
+ if layout.tenant.max_nodes_per_job != -1 and \
+ len(ns) > layout.tenant.max_nodes_per_job:
+ raise Exception(
+ 'The job "{job}" exceeds tenant '
+ 'max-nodes-per-job {maxnodes}.'.format(
+ job=self.name,
+ maxnodes=layout.tenant.max_nodes_per_job))
+ for dependency in self.dependencies:
+ layout.getJob(dependency.name)
for pb in self.pre_run + self.run + self.post_run + self.cleanup_run:
pb.validateReferences(layout)
@@ -2660,16 +2890,9 @@ class Job(ConfigObject):
# Return the raw branch list that match this job
return self._branches
- def setBranchMatcher(self, branches, implied=False):
+ def setBranchMatcher(self, matchers):
# Set the branch matcher to match any of the supplied branches
- self._branches = branches
- matchers = []
- if implied:
- matcher_class = change_matcher.ImpliedBranchMatcher
- else:
- matcher_class = change_matcher.BranchMatcher
- for branch in branches:
- matchers.append(matcher_class(branch))
+ self._branches = [x._regex for x in matchers]
self.branch_matcher = change_matcher.MatchAny(matchers)
def setFileMatcher(self, files):
@@ -2826,7 +3049,7 @@ class Job(ConfigObject):
self.addRoles(other.roles)
# Freeze the nodeset
- self.nodeset = self.getNodeSet(layout)
+ self.nodeset = self.getNodeset(layout)
# Pass secrets to parents
secrets_for_parents = [s for s in other.secrets if s.pass_to_parent]
@@ -3000,6 +3223,16 @@ class JobDependency(ConfigObject):
self.name = name
self.soft = soft
+ def __ne__(self, other):
+ return not self.__eq__(other)
+
+ def __eq__(self, other):
+ if not isinstance(other, JobDependency):
+ return False
+ return self.toDict() == other.toDict()
+
+ __hash__ = object.__hash__
+
def toDict(self):
return {'name': self.name,
'soft': self.soft}
@@ -3337,24 +3570,9 @@ class BuildRequest(JobRequest):
)
-class ResultData(zkobject.ShardedZKObject):
- # If the node exists already, it is probably a half-written state
- # from a crash; truncate it and continue.
- truncate_on_create = True
-
- def __init__(self):
- super().__init__()
- self._set(data={})
-
- def getPath(self):
- return self._path
-
- def serialize(self, context):
- data = {
- "data": self.data,
- "_path": self._path,
- }
- return json.dumps(data, sort_keys=True).encode("utf8")
+class BuildReference:
+ def __init__(self, _path):
+ self._path = _path
class Build(zkobject.ZKObject):
@@ -3365,8 +3583,16 @@ class Build(zkobject.ZKObject):
Job (related builds are grouped together in a BuildSet).
"""
+ # If data/variables are more than 10k, we offload them to another
+ # object, otherwise we store them on this one.
+ MAX_DATA_LEN = 10 * 1024
+
log = logging.getLogger("zuul.Build")
+ job_data_attributes = ('result_data',
+ 'secret_result_data',
+ )
+
def __init__(self):
super().__init__()
self._set(
@@ -3395,10 +3621,6 @@ class Build(zkobject.ZKObject):
"uuid": self.uuid,
"url": self.url,
"result": self.result,
- "_result_data": (self._result_data.getPath()
- if self._result_data else None),
- "_secret_result_data": (self._secret_result_data.getPath()
- if self._secret_result_data else None),
"error_detail": self.error_detail,
"execute_time": self.execute_time,
"start_time": self.start_time,
@@ -3411,20 +3633,61 @@ class Build(zkobject.ZKObject):
"zuul_event_id": self.zuul_event_id,
"build_request_ref": self.build_request_ref,
}
+ if COMPONENT_REGISTRY.model_api < 5:
+ data["_result_data"] = (self._result_data.getPath()
+ if self._result_data else None)
+ data["_secret_result_data"] = (
+ self._secret_result_data.getPath()
+ if self._secret_result_data else None)
+ else:
+ for k in self.job_data_attributes:
+ v = getattr(self, '_' + k)
+ if isinstance(v, JobData):
+ v = {'storage': 'offload', 'path': v.getPath(),
+ 'hash': v.hash}
+ else:
+ v = {'storage': 'local', 'data': v}
+ data[k] = v
+
return json.dumps(data, sort_keys=True).encode("utf8")
def deserialize(self, raw, context):
data = super().deserialize(raw, context)
# Result data can change (between a pause and build
- # completion) so de-serialize it every time.
+ # completion).
+
+ # MODEL_API < 5
for k in ('_result_data', '_secret_result_data'):
try:
- if data[k]:
- data[k] = ResultData.fromZK(context, data[k])
+ if data.get(k):
+ data[k] = JobData.fromZK(context, data[k])
+ # This used to be a ResultData object, which is
+ # the same as a JobData but without a hash, so
+ # generate one.
+ data[k]._set(hash=JobData.getHash(data[k].data))
except Exception:
self.log.exception("Failed to restore result data")
data[k] = None
+
+ # MODEL_API >= 5; override with this if present.
+ for job_data_key in self.job_data_attributes:
+ job_data = data.pop(job_data_key, None)
+ if job_data:
+ # This is a dict which tells us where the actual data is.
+ if job_data['storage'] == 'local':
+ # The data are stored locally in this dict
+ data['_' + job_data_key] = job_data['data']
+ elif job_data['storage'] == 'offload':
+ existing_job_data = getattr(self, job_data_key, None)
+ if (getattr(existing_job_data, 'hash', None) ==
+ job_data['hash']):
+ # Re-use the existing object since it's the same
+ data['_' + job_data_key] = existing_job_data
+ else:
+ # Load the object from ZK
+ data['_' + job_data_key] = JobData.fromZK(
+ context, job_data['path'])
return data
def getPath(self):
@@ -3434,27 +3697,29 @@ class Build(zkobject.ZKObject):
return ('<Build %s of %s voting:%s>' %
(self.uuid, self.job.name, self.job.voting))
+ def _getJobData(self, name):
+ val = getattr(self, name)
+ if isinstance(val, JobData):
+ return val.data
+ return val
+
@property
def result_data(self):
- if self._result_data:
- return self._result_data.data
- return {}
+ return self._getJobData('_result_data') or {}
@property
def secret_result_data(self):
- if self._secret_result_data:
- return self._secret_result_data.data
- return {}
+ return self._getJobData('_secret_result_data') or {}
def setResultData(self, result_data, secret_result_data):
if not self._active_context:
raise Exception(
"setResultData must be used with a context manager")
- self._result_data = ResultData.new(
+ self._result_data = JobData.new(
self._active_context,
data=result_data,
_path=self.getPath() + '/result_data')
- self._secret_result_data = ResultData.new(
+ self._secret_result_data = JobData.new(
self._active_context,
data=secret_result_data,
_path=self.getPath() + '/secret_result_data')
@@ -3623,6 +3888,7 @@ class BuildSet(zkobject.ZKObject):
tries={},
files_state=self.NEW,
repo_state_state=self.NEW,
+ span_info=None,
configured=False,
configured_time=None, # When setConfigured was called
start_time=None, # When the buildset reported start
@@ -3630,6 +3896,7 @@ class BuildSet(zkobject.ZKObject):
fail_fast=False,
job_graph=None,
jobs={},
+ deduplicated_jobs=[],
# Cached job graph of previous layout; not serialized
_old_job_graph=None,
_old_jobs={},
@@ -3698,6 +3965,13 @@ class BuildSet(zkobject.ZKObject):
def getPath(self):
return f"{self.item.getPath()}/buildset/{self.uuid}"
+ @classmethod
+ def parsePath(self, path):
+ """Return path components for use by the REST API"""
+ item_path, bs, uuid = path.rsplit('/', 2)
+ tenant, pipeline, item_uuid = QueueItem.parsePath(item_path)
+ return (tenant, pipeline, item_uuid, uuid)
+
def serialize(self, context):
data = {
# "item": self.item,
@@ -3730,6 +4004,7 @@ class BuildSet(zkobject.ZKObject):
"fail_fast": self.fail_fast,
"job_graph": (self.job_graph.toDict()
if self.job_graph else None),
+ "span_info": self.span_info,
"configured_time": self.configured_time,
"start_time": self.start_time,
"repo_state_request_time": self.repo_state_request_time,
@@ -3737,6 +4012,13 @@ class BuildSet(zkobject.ZKObject):
}
return json.dumps(data, sort_keys=True).encode("utf8")
+ def _isMyBuild(self, build_path):
+ parts = build_path.split('/')
+ buildset_uuid = parts[-5]
+ if buildset_uuid == self.uuid:
+ return True
+ return False
+
def deserialize(self, raw, context):
data = super().deserialize(raw, context)
# Set our UUID so that getPath() returns the correct path for
@@ -3806,31 +4088,49 @@ class BuildSet(zkobject.ZKObject):
# jobs (deserialize as separate objects)
if data['job_graph']:
for job_name in data['job_graph'].jobs:
+ # If we have a current build before refreshing, we may
+ # be able to skip refreshing some items since they
+ # will not have changed.
+ build_path = data["builds"].get(job_name)
+ old_build = self.builds.get(job_name)
+ old_build_exists = (old_build
+ and old_build.getPath() == build_path)
+
if job_name in self.jobs:
job = self.jobs[job_name]
- job.refresh(context)
+ if not old_build_exists:
+ job.refresh(context)
else:
job_path = FrozenJob.jobPath(job_name, self.getPath())
job = FrozenJob.fromZK(context, job_path, buildset=self)
self.jobs[job_name] = job
- build_path = data["builds"].get(job_name)
if build_path:
build = self.builds.get(job_name)
if build and build.getPath() == build_path:
- build.refresh(context)
+ if not build.result:
+ build.refresh(context)
else:
- build = Build.fromZK(
- context, build_path, job=job, build_set=self)
+ if not self._isMyBuild(build_path):
+ build = BuildReference(build_path)
+ context.build_references = True
+ else:
+ build = Build.fromZK(
+ context, build_path, job=job, build_set=self)
builds[job_name] = build
for retry_path in data["retry_builds"].get(job_name, []):
retry_build = existing_retry_builds.get(retry_path)
if retry_build and retry_build.getPath() == retry_path:
- retry_build.refresh(context)
+ # Retry builds never change.
+ pass
else:
- retry_build = Build.fromZK(
- context, retry_path, job=job, build_set=self)
+ if not self._isMyBuild(retry_path):
+ retry_build = BuildReference(retry_path)
+ context.build_references = True
+ else:
+ retry_build = Build.fromZK(
+ context, retry_path, job=job, build_set=self)
retry_builds[job_name].append(retry_build)
data.update({
@@ -3855,7 +4155,7 @@ class BuildSet(zkobject.ZKObject):
len(self.builds),
self.getStateName(self.merge_state))
- def setConfiguration(self, context):
+ def setConfiguration(self, context, span_info):
with self.activeContext(context):
# The change isn't enqueued until after it's created
# so we don't know what the other changes ahead will be
@@ -3871,10 +4171,19 @@ class BuildSet(zkobject.ZKObject):
if i not in items)
items.reverse()
- self.dependent_changes = [i.change.toDict() for i in items]
+ self.dependent_changes = [self._toChangeDict(i) for i in items]
self.merger_items = [i.makeMergerItem() for i in items]
self.configured = True
self.configured_time = time.time()
+ self.span_info = span_info
+
+ def _toChangeDict(self, item):
+ # Inject bundle_id to dict if available, this can be used to decide
+ # if changes belongs to the same bunbdle
+ change_dict = item.change.toDict()
+ if item.bundle:
+ change_dict['bundle_id'] = item.bundle.uuid
+ return change_dict
def getStateName(self, state_num):
return self.states_map.get(
@@ -3944,7 +4253,22 @@ class BuildSet(zkobject.ZKObject):
def removeJobNodeRequestID(self, job_name):
if job_name in self.node_requests:
- del self.node_requests[job_name]
+ with self.activeContext(
+ self.item.pipeline.manager.current_context):
+ del self.node_requests[job_name]
+
+ def setJobNodeRequestDuplicate(self, job_name, other_item):
+ with self.activeContext(
+ self.item.pipeline.manager.current_context):
+ self.node_requests[job_name] = {
+ 'deduplicated_item': other_item.uuid}
+
+ def setJobNodeSetInfoDuplicate(self, job_name, other_item):
+ # Nothing uses this value yet; we just need an entry in the
+ # nodset_info dict.
+ with self.activeContext(self.item.pipeline.manager.current_context):
+ self.nodeset_info[job_name] = {
+ 'deduplicated_item': other_item.uuid}
def jobNodeRequestComplete(self, job_name, nodeset):
if job_name in self.nodeset_info:
@@ -4016,10 +4340,12 @@ class QueueItem(zkobject.ZKObject):
pipeline=None,
queue=None,
change=None, # a ref
- dequeued_needing_change=False,
+ dequeued_needing_change=None,
+ dequeued_missing_requirements=False,
current_build_set=None,
item_ahead=None,
items_behind=[],
+ span_info=None,
enqueue_time=None,
report_time=None,
dequeue_time=None,
@@ -4063,6 +4389,13 @@ class QueueItem(zkobject.ZKObject):
def itemPath(cls, pipeline_path, item_uuid):
return f"{pipeline_path}/item/{item_uuid}"
+ @classmethod
+ def parsePath(self, path):
+ """Return path components for use by the REST API"""
+ pipeline_path, item, uuid = path.rsplit('/', 2)
+ tenant, pipeline = PipelineState.parsePath(pipeline_path)
+ return (tenant, pipeline, uuid)
+
def serialize(self, context):
if isinstance(self.event, TriggerEvent):
event_type = "TriggerEvent"
@@ -4076,10 +4409,13 @@ class QueueItem(zkobject.ZKObject):
# This needs change cache and the API to resolve change by key.
"change": self.change.cache_key,
"dequeued_needing_change": self.dequeued_needing_change,
+ "dequeued_missing_requirements":
+ self.dequeued_missing_requirements,
"current_build_set": (self.current_build_set and
self.current_build_set.getPath()),
"item_ahead": self.item_ahead and self.item_ahead.getPath(),
"items_behind": [i.getPath() for i in self.items_behind],
+ "span_info": self.span_info,
"enqueue_time": self.enqueue_time,
"report_time": self.report_time,
"dequeue_time": self.dequeue_time,
@@ -4181,11 +4517,14 @@ class QueueItem(zkobject.ZKObject):
self.current_build_set.updateAttributes(
self.pipeline.manager.current_context, result=result)
- def warning(self, msg):
+ def warning(self, msgs):
with self.current_build_set.activeContext(
self.pipeline.manager.current_context):
- self.current_build_set.warning_messages.append(msg)
- self.log.info(msg)
+ if not isinstance(msgs, list):
+ msgs = [msgs]
+ for msg in msgs:
+ self.current_build_set.warning_messages.append(msg)
+ self.log.info(msg)
def freezeJobGraph(self, layout, context,
skip_file_matcher,
@@ -4328,7 +4667,7 @@ class QueueItem(zkobject.ZKObject):
continue
build = self.current_build_set.getBuild(job.name)
if (build and build.result and
- build.result not in ['SUCCESS', 'SKIPPED']):
+ build.result not in ['SUCCESS', 'SKIPPED', 'RETRY']):
return True
return False
@@ -4359,7 +4698,7 @@ class QueueItem(zkobject.ZKObject):
def cannotMergeBundle(self):
if self.bundle:
- return self.bundle.cannot_merge
+ return bool(self.bundle.cannot_merge)
return False
def didMergerFail(self):
@@ -4371,7 +4710,10 @@ class QueueItem(zkobject.ZKObject):
return []
def wasDequeuedNeedingChange(self):
- return self.dequeued_needing_change
+ return bool(self.dequeued_needing_change)
+
+ def wasDequeuedMissingRequirements(self):
+ return self.dequeued_missing_requirements
def includesConfigUpdates(self):
includes_trusted = False
@@ -4536,7 +4878,8 @@ class QueueItem(zkobject.ZKObject):
data = []
ret = self.item_ahead.providesRequirements(job, data)
data.reverse()
- job.setArtifactData(data)
+ if data:
+ job.setArtifactData(data)
except RequirementsError as e:
self.warning(str(e))
fakebuild = Build.new(self.pipeline.manager.current_context,
@@ -4547,24 +4890,36 @@ class QueueItem(zkobject.ZKObject):
ret = False
return ret
- def findJobsToRun(self, semaphore_handler):
- torun = []
- if not self.live:
- return []
- if not self.current_build_set.job_graph:
- return []
- if self.item_ahead:
- # Only run jobs if any 'hold' jobs on the change ahead
- # have completed successfully.
- if self.item_ahead.isHoldingFollowingChanges():
- return []
+ def findDuplicateJob(self, job):
+ """
+ If another item in the bundle has a duplicate job,
+ return the other item
+ """
+ if not self.bundle:
+ return None
+ if job.deduplicate is False:
+ return None
+ for other_item in self.bundle.items:
+ if other_item is self:
+ continue
+ for other_job in other_item.getJobs():
+ if other_job.isEqual(job):
+ if job.deduplicate == 'auto':
+ # Deduplicate if there are required projects
+ # or the item project is the same.
+ if (not job.required_projects and
+ self.change.project != other_item.change.project):
+ continue
+ return other_item
+ def updateJobParentData(self):
job_graph = self.current_build_set.job_graph
failed_job_names = set() # Jobs that run and failed
ignored_job_names = set() # Jobs that were skipped or canceled
unexecuted_job_names = set() # Jobs that were not started yet
jobs_not_started = set()
for job in job_graph.getJobs():
+ job._set(_ready_to_run=False)
build = self.current_build_set.getBuild(job.name)
if build:
if build.result == 'SUCCESS' or build.paused:
@@ -4577,8 +4932,6 @@ class QueueItem(zkobject.ZKObject):
unexecuted_job_names.add(job.name)
jobs_not_started.add(job)
- # Attempt to run jobs in the order they appear in
- # configuration.
for job in job_graph.getJobs():
if job not in jobs_not_started:
continue
@@ -4629,7 +4982,91 @@ class QueueItem(zkobject.ZKObject):
job.setParentData(new_parent_data,
new_secret_parent_data,
new_artifact_data)
+ job._set(_ready_to_run=True)
+
+ def deduplicateJobs(self, log):
+ """Sync node request and build info with deduplicated jobs"""
+ if not self.live:
+ return
+ if not self.current_build_set.job_graph:
+ return
+ if self.item_ahead:
+ # Only run jobs if any 'hold' jobs on the change ahead
+ # have completed successfully.
+ if self.item_ahead.isHoldingFollowingChanges():
+ return
+
+ self.updateJobParentData()
+
+ if COMPONENT_REGISTRY.model_api < 8:
+ return
+ if not self.bundle:
+ return
+
+ build_set = self.current_build_set
+ job_graph = build_set.job_graph
+ for job in job_graph.getJobs():
+ this_request = build_set.getJobNodeRequestID(job.name)
+ this_nodeset = build_set.getJobNodeSetInfo(job.name)
+ this_build = build_set.getBuild(job.name)
+
+ if this_build:
+ # Nothing more possible for this job
+ continue
+
+ other_item = self.findDuplicateJob(job)
+ if not other_item:
+ continue
+ other_build_set = other_item.current_build_set
+
+ # Handle node requests
+ other_request = other_build_set.getJobNodeRequestID(job.name)
+ if (isinstance(other_request, dict) and
+ other_request.get('deduplicated_item') == self.uuid):
+ # We're the original, but we're probably in the middle
+ # of a retry
+ return
+ if other_request is not None and this_request is None:
+ log.info("Deduplicating request of bundle job %s for item %s "
+ "with item %s", job, self, other_item)
+ build_set.setJobNodeRequestDuplicate(job.name, other_item)
+
+ # Handle provisioned nodes
+ other_nodeset = other_build_set.getJobNodeSetInfo(job.name)
+ if (isinstance(other_nodeset, dict) and
+ other_nodeset.get('deduplicated_item') == self.uuid):
+ # We're the original, but we're probably in the middle
+ # of a retry
+ return
+ if other_nodeset is not None and this_nodeset is None:
+ log.info("Deduplicating nodeset of bundle job %s for item %s "
+ "with item %s", job, self, other_item)
+ build_set.setJobNodeSetInfoDuplicate(job.name, other_item)
+
+ # Handle builds
+ other_build = other_build_set.getBuild(job.name)
+ if other_build and not this_build:
+ log.info("Deduplicating build of bundle job %s for item %s "
+ "with item %s", job, self, other_item)
+ self.addBuild(other_build)
+ job._set(_ready_to_run=False)
+
+ def findJobsToRun(self, semaphore_handler):
+ torun = []
+ if not self.live:
+ return []
+ if not self.current_build_set.job_graph:
+ return []
+ if self.item_ahead:
+ # Only run jobs if any 'hold' jobs on the change ahead
+ # have completed successfully.
+ if self.item_ahead.isHoldingFollowingChanges():
+ return []
+
+ job_graph = self.current_build_set.job_graph
+ for job in job_graph.getJobs():
+ if job._ready_to_run:
nodeset = self.current_build_set.getJobNodeSetInfo(job.name)
if nodeset is None:
# The nodes for this job are not ready, skip
@@ -4769,7 +5206,7 @@ class QueueItem(zkobject.ZKObject):
skip, skip_soft=True)
skipped += to_skip
- elif build.result != 'SUCCESS' and not build.paused:
+ elif build.result not in ('SUCCESS', 'SKIPPED') and not build.paused:
to_skip = job_graph.getDependentJobsRecursively(
build.job.name)
skipped += to_skip
@@ -4796,10 +5233,16 @@ class QueueItem(zkobject.ZKObject):
self.setResult(fakebuild)
return fakebuild
- def setDequeuedNeedingChange(self):
+ def setDequeuedNeedingChange(self, msg):
+ self.updateAttributes(
+ self.pipeline.manager.current_context,
+ dequeued_needing_change=msg)
+ self._setAllJobsSkipped()
+
+ def setDequeuedMissingRequirements(self):
self.updateAttributes(
self.pipeline.manager.current_context,
- dequeued_needing_change=True)
+ dequeued_missing_requirements=True)
self._setAllJobsSkipped()
def setDequeuedBundleFailing(self):
@@ -5143,6 +5586,20 @@ class QueueItem(zkobject.ZKObject):
return True # This job's configuration has changed
return False
+ def getBlobKeys(self):
+ job_graph = self.current_build_set.job_graph
+ if not job_graph:
+ return set()
+ # Return a set of blob keys used by this item
+ # for each job in the frozen job graph
+ keys = set()
+ for job in job_graph.getJobs():
+ for pb in job.all_playbooks:
+ for secret in pb['secrets'].values():
+ if isinstance(secret, dict) and 'blob' in secret:
+ keys.add(secret['blob'])
+ return keys
+
class Bundle:
"""Identifies a collection of changes that must be treated as one unit."""
@@ -5152,7 +5609,7 @@ class Bundle:
self.items = []
self.started_reporting = False
self.failed_reporting = False
- self.cannot_merge = False
+ self.cannot_merge = None
def __repr__(self):
return '<Bundle 0x{:x} {}'.format(id(self), self.items)
@@ -5279,6 +5736,9 @@ class Ref(object):
tpc = tenant.project_configs.get(self.project.canonical_name)
if tpc is None:
return False
+ if hasattr(self, 'branch'):
+ if tpc.isAlwaysDynamicBranch(self.branch):
+ return True
if self.files is None:
# If self.files is None we don't know if this change updates the
# config so assume it does as this is a safe default if we don't
@@ -5385,12 +5845,18 @@ class Change(Branch):
# to Depends-On headers (all drivers):
self.commit_needs_changes = None
+ # Needed changes by topic (all
+ # drivers in theory, but Gerrit only in practice for
+ # emulate-submit-whole-topic):
+ self.topic_needs_changes = None
+
self.is_current_patchset = True
self.can_merge = False
self.is_merged = False
self.failed_to_merge = False
self.open = None
self.owner = None
+ self.topic = None
# This may be the commit message, or it may be a cover message
# in the case of a PR. Either way, it's the place where we
@@ -5399,6 +5865,9 @@ class Change(Branch):
# This can be the commit id of the patchset enqueued or
# in the case of a PR the id of HEAD of the branch.
self.commit_id = None
+ # The sha of the base commit, e.g. the sha of the target branch
+ # from which the feature branch is created.
+ self.base_sha = None
def deserialize(self, data):
super().deserialize(data)
@@ -5414,6 +5883,7 @@ class Change(Branch):
None if data.get("commit_needs_changes") is None
else data.get("commit_needs_changes", [])
)
+ self.topic_needs_changes = data.get("topic_needs_changes")
self.is_current_patchset = data.get("is_current_patchset", True)
self.can_merge = data.get("can_merge", False)
self.is_merged = data.get("is_merged", False)
@@ -5422,6 +5892,7 @@ class Change(Branch):
self.owner = data.get("owner")
self.message = data.get("message")
self.commit_id = data.get("commit_id")
+ self.base_sha = data.get("base_sha")
def serialize(self):
d = super().serialize()
@@ -5434,6 +5905,7 @@ class Change(Branch):
"compat_needs_changes": self.compat_needs_changes,
"compat_needed_by_changes": self.git_needed_by_changes,
"commit_needs_changes": self.commit_needs_changes,
+ "topic_needs_changes": self.topic_needs_changes,
"is_current_patchset": self.is_current_patchset,
"can_merge": self.can_merge,
"is_merged": self.is_merged,
@@ -5442,6 +5914,7 @@ class Change(Branch):
"owner": self.owner,
"message": self.message,
"commit_id": self.commit_id,
+ "base_sha": self.base_sha,
})
return d
@@ -5464,12 +5937,19 @@ class Change(Branch):
@property
def needs_changes(self):
commit_needs_changes = self.commit_needs_changes or []
- return (self.git_needs_changes + self.compat_needs_changes +
- commit_needs_changes)
+ topic_needs_changes = self.topic_needs_changes or []
+ r = OrderedDict()
+ for x in (self.git_needs_changes + self.compat_needs_changes +
+ commit_needs_changes + topic_needs_changes):
+ r[x] = None
+ return tuple(r.keys())
@property
def needed_by_changes(self):
- return (self.git_needed_by_changes + self.compat_needed_by_changes)
+ r = OrderedDict()
+ for x in (self.git_needed_by_changes + self.compat_needed_by_changes):
+ r[x] = None
+ return tuple(r.keys())
def isUpdateOf(self, other):
if (self.project == other.project and
@@ -5618,6 +6098,7 @@ class TenantReconfigureEvent(ManagementEvent):
self.tenant_name = tenant_name
self.project_branches = set([(project_name, branch_name)])
self.branch_cache_ltimes = {}
+ self.trigger_event_ltime = -1
self.merged_events = []
def __ne__(self, other):
@@ -5639,6 +6120,8 @@ class TenantReconfigureEvent(ManagementEvent):
self.branch_cache_ltimes.get(connection_name, ltime), ltime)
self.zuul_event_ltime = max(self.zuul_event_ltime,
other.zuul_event_ltime)
+ self.trigger_event_ltime = max(self.trigger_event_ltime,
+ other.trigger_event_ltime)
self.merged_events.append(other)
def toDict(self):
@@ -5646,6 +6129,7 @@ class TenantReconfigureEvent(ManagementEvent):
d["tenant_name"] = self.tenant_name
d["project_branches"] = list(self.project_branches)
d["branch_cache_ltimes"] = self.branch_cache_ltimes
+ d["trigger_event_ltime"] = self.trigger_event_ltime
return d
@classmethod
@@ -5661,6 +6145,7 @@ class TenantReconfigureEvent(ManagementEvent):
tuple(pb) for pb in data["project_branches"]
)
event.branch_cache_ltimes = data.get("branch_cache_ltimes", {})
+ event.trigger_event_ltime = data.get("trigger_event_ltime", -1)
return event
@@ -5883,12 +6368,13 @@ class MergeCompletedEvent(ResultEvent):
:arg dict repo_state: The starting repo state before the merge.
:arg list item_in_branches: A list of branches in which the final
commit in the merge list appears (changes without refs).
- :arg list errors: A list of error message strings
+ :arg list errors: A list of error message strings.
+ :arg float elapsed_time: Elapsed time of merge op in seconds.
"""
def __init__(self, request_uuid, build_set_uuid, merged, updated,
commit, files, repo_state, item_in_branches,
- errors):
+ errors, elapsed_time):
self.request_uuid = request_uuid
self.build_set_uuid = build_set_uuid
self.merged = merged
@@ -5898,6 +6384,7 @@ class MergeCompletedEvent(ResultEvent):
self.repo_state = repo_state or {}
self.item_in_branches = item_in_branches or []
self.errors = errors or []
+ self.elapsed_time = elapsed_time
def __repr__(self):
return ('<MergeCompletedEvent job: %s buildset: %s merged: %s '
@@ -5917,6 +6404,7 @@ class MergeCompletedEvent(ResultEvent):
"repo_state": dict(self.repo_state),
"item_in_branches": list(self.item_in_branches),
"errors": list(self.errors),
+ "elapsed_time": self.elapsed_time,
}
@classmethod
@@ -5931,6 +6419,7 @@ class MergeCompletedEvent(ResultEvent):
dict(data.get("repo_state", {})),
list(data.get("item_in_branches", [])),
list(data.get("errors", [])),
+ data.get("elapsed_time"),
)
@@ -5939,16 +6428,19 @@ class FilesChangesCompletedEvent(ResultEvent):
:arg BuildSet build_set: The build_set which is ready.
:arg list files: List of files changed.
+ :arg float elapsed_time: Elapsed time of merge op in seconds.
"""
- def __init__(self, build_set_uuid, files):
+ def __init__(self, build_set_uuid, files, elapsed_time):
self.build_set_uuid = build_set_uuid
self.files = files or []
+ self.elapsed_time = elapsed_time
def toDict(self):
return {
"build_set_uuid": self.build_set_uuid,
"files": list(self.files),
+ "elapsed_time": self.elapsed_time,
}
@classmethod
@@ -5956,6 +6448,7 @@ class FilesChangesCompletedEvent(ResultEvent):
return cls(
data.get("build_set_uuid"),
list(data.get("files", [])),
+ data.get("elapsed_time"),
)
@@ -5997,6 +6490,9 @@ class TriggerEvent(AbstractEvent):
self.branch_deleted = False
self.branch_protected = True
self.ref = None
+ # For reconfiguration sequencing
+ self.min_reconfigure_ltime = -1
+ self.zuul_event_ltime = None
# For management events (eg: enqueue / promote)
self.tenant_name = None
self.project_hostname = None
@@ -6034,6 +6530,8 @@ class TriggerEvent(AbstractEvent):
"branch_deleted": self.branch_deleted,
"branch_protected": self.branch_protected,
"ref": self.ref,
+ "min_reconfigure_ltime": self.min_reconfigure_ltime,
+ "zuul_event_ltime": self.zuul_event_ltime,
"tenant_name": self.tenant_name,
"project_hostname": self.project_hostname,
"project_name": self.project_name,
@@ -6066,6 +6564,8 @@ class TriggerEvent(AbstractEvent):
self.branch_deleted = d["branch_deleted"]
self.branch_protected = d["branch_protected"]
self.ref = d["ref"]
+ self.min_reconfigure_ltime = d.get("min_reconfigure_ltime", -1)
+ self.zuul_event_ltime = d.get("zuul_event_ltime", None)
self.tenant_name = d["tenant_name"]
self.project_hostname = d["project_hostname"]
self.project_name = d["project_name"]
@@ -6102,6 +6602,9 @@ class TriggerEvent(AbstractEvent):
def isChangeAbandoned(self):
return False
+ def isBranchProtectionChanged(self):
+ return False
+
def _repr(self):
flags = [str(self.type)]
if self.project_name:
@@ -6178,9 +6681,13 @@ class TenantProjectConfig(object):
self.load_classes = set()
self.shadow_projects = set()
self.branches = []
+ self.dynamic_branches = []
# The tenant's default setting of exclude_unprotected_branches will
# be overridden by this one if not None.
self.exclude_unprotected_branches = None
+ self.include_branches = None
+ self.exclude_branches = None
+ self.always_dynamic_branches = None
self.parsed_branch_config = {} # branch -> ParsedConfig
# The list of paths to look for extra zuul config files
self.extra_config_files = ()
@@ -6189,13 +6696,41 @@ class TenantProjectConfig(object):
# Load config from a different branch if this is a config project
self.load_branch = None
+ def isAlwaysDynamicBranch(self, branch):
+ if self.always_dynamic_branches is None:
+ return False
+ for r in self.always_dynamic_branches:
+ if r.fullmatch(branch):
+ return True
+
+ def includesBranch(self, branch):
+ if self.include_branches is not None:
+ included = False
+ for r in self.include_branches:
+ if r.fullmatch(branch):
+ included = True
+ break
+ else:
+ included = True
+ if not included:
+ return False
+
+ excluded = False
+ if self.exclude_branches is not None:
+ for r in self.exclude_branches:
+ if r.fullmatch(branch):
+ excluded = True
+ break
+ if excluded:
+ return False
+ return True
+
class ProjectPipelineConfig(ConfigObject):
# Represents a project cofiguration in the context of a pipeline
def __init__(self):
super(ProjectPipelineConfig, self).__init__()
self.job_list = JobList()
- self.queue_name = None
self.debug = False
self.debug_messages = []
self.fail_fast = None
@@ -6207,8 +6742,6 @@ class ProjectPipelineConfig(ConfigObject):
def update(self, other):
if not isinstance(other, ProjectPipelineConfig):
raise Exception("Unable to update from %s" % (other,))
- if self.queue_name is None:
- self.queue_name = other.queue_name
if other.debug:
self.debug = other.debug
if self.fail_fast is None:
@@ -6223,7 +6756,6 @@ class ProjectPipelineConfig(ConfigObject):
def toDict(self):
d = {}
- d['queue_name'] = self.queue_name
return d
@@ -6262,16 +6794,13 @@ class ProjectConfig(ConfigObject):
r.queue_name = self.queue_name
return r
- def setImpliedBranchMatchers(self, branches):
- if len(branches) == 0:
+ def setImpliedBranchMatchers(self, matchers):
+ if len(matchers) == 0:
self.branch_matcher = None
- elif len(branches) > 1:
- matchers = [change_matcher.ImpliedBranchMatcher(branch)
- for branch in branches]
+ elif len(matchers) > 1:
self.branch_matcher = change_matcher.MatchAny(matchers)
else:
- self.branch_matcher = change_matcher.ImpliedBranchMatcher(
- branches[0])
+ self.branch_matcher = matchers[0]
def changeMatches(self, change):
if self.branch_matcher and not self.branch_matcher.matches(change):
@@ -6522,11 +7051,13 @@ class UnparsedAbideConfig(object):
self.ltime = -1
self.tenants = {}
self.admin_rules = []
+ self.semaphores = []
def extend(self, conf):
if isinstance(conf, UnparsedAbideConfig):
self.tenants.update(conf.tenants)
self.admin_rules.extend(conf.admin_rules)
+ self.semaphores.extend(conf.semaphores)
return
if not isinstance(conf, list):
@@ -6545,6 +7076,8 @@ class UnparsedAbideConfig(object):
self.tenants[value["name"]] = value
elif key == 'admin-rule':
self.admin_rules.append(value)
+ elif key == 'global-semaphore':
+ self.semaphores.append(value)
else:
raise ConfigItemUnknownError(item)
@@ -6553,6 +7086,7 @@ class UnparsedAbideConfig(object):
"uuid": self.uuid,
"tenants": self.tenants,
"admin_rules": self.admin_rules,
+ "semaphores": self.semaphores,
}
@classmethod
@@ -6562,6 +7096,7 @@ class UnparsedAbideConfig(object):
unparsed_abide.ltime = ltime
unparsed_abide.tenants = data["tenants"]
unparsed_abide.admin_rules = data["admin_rules"]
+ unparsed_abide.semaphores = data.get("semaphores", [])
return unparsed_abide
@@ -6636,6 +7171,8 @@ class UnparsedConfig(object):
if len(item.keys()) > 1:
raise ConfigItemMultipleKeysError(item)
key, value = list(item.items())[0]
+ if not isinstance(value, dict):
+ raise ConfigItemNotDictError(item)
if key == 'project':
self.projects.append(value)
elif key == 'job':
@@ -6733,6 +7270,7 @@ class Layout(object):
noop = Job('noop')
noop.description = 'A job that will always succeed, no operation.'
noop.parent = noop.BASE_JOB_MARKER
+ noop.deduplicate = False
noop.run = (PlaybookContext(None, 'noop.yaml', [], []),)
self.jobs = {'noop': [noop]}
self.nodesets = {}
@@ -6831,6 +7369,9 @@ class Layout(object):
# It's ok to have a duplicate semaphore definition, but only if
# they are in different branches of the same repo, and have
# the same values.
+ if semaphore.name in self.tenant.global_semaphores:
+ raise Exception("Semaphore %s shadows a global semaphore and "
+ "will be ignored" % (semaphore.name))
other = self.semaphores.get(semaphore.name)
if other is not None:
if not semaphore.source_context.isSameProject(
@@ -6850,6 +7391,19 @@ class Layout(object):
return
self.semaphores[semaphore.name] = semaphore
+ def getSemaphore(self, abide, semaphore_name):
+ if semaphore_name in self.tenant.global_semaphores:
+ return abide.semaphores[semaphore_name]
+ semaphore = self.semaphores.get(semaphore_name)
+ if semaphore:
+ return semaphore
+ # Return an implied semaphore with max=1
+ # TODO: consider deprecating implied semaphores to avoid typo
+ # config errors
+ semaphore = Semaphore(semaphore_name)
+ semaphore.freeze()
+ return semaphore
+
def addQueue(self, queue):
# Change queues must be unique and cannot be overridden.
if queue.name in self.queues:
@@ -7234,9 +7788,10 @@ class Layout(object):
class Semaphore(ConfigObject):
- def __init__(self, name, max=1):
+ def __init__(self, name, max=1, global_scope=False):
super(Semaphore, self).__init__()
self.name = name
+ self.global_scope = global_scope
self.max = int(max)
def __ne__(self, other):
@@ -7251,11 +7806,13 @@ class Semaphore(ConfigObject):
class Queue(ConfigObject):
def __init__(self, name, per_branch=False,
- allow_circular_dependencies=False):
+ allow_circular_dependencies=False,
+ dependencies_by_topic=False):
super().__init__()
self.name = name
self.per_branch = per_branch
self.allow_circular_dependencies = allow_circular_dependencies
+ self.dependencies_by_topic = dependencies_by_topic
def __ne__(self, other):
return not self.__eq__(other)
@@ -7267,7 +7824,9 @@ class Queue(ConfigObject):
self.name == other.name and
self.per_branch == other.per_branch and
self.allow_circular_dependencies ==
- other.allow_circular_dependencies
+ other.allow_circular_dependencies and
+ self.dependencies_by_topic ==
+ other.dependencies_by_topic
)
@@ -7308,6 +7867,7 @@ class Tenant(object):
self.authorization_rules = []
self.default_auth_realm = None
+ self.global_semaphores = set()
def __repr__(self):
return f"<Tenant {self.name}>"
@@ -7388,8 +7948,7 @@ class Tenant(object):
:arg str regex: The regex to match
:returns: A list of tuples (trusted, project) describing the found
- projects. Raises an exception if the same project name is found
- several times across multiple hostnames.
+ projects.
"""
matcher = re2.compile(regex)
@@ -7397,18 +7956,12 @@ class Tenant(object):
result = []
for name, hostname_dict in self.projects.items():
-
if matcher.fullmatch(name):
- # validate that this match is unambiguous
- values = list(hostname_dict.values())
- if len(values) > 1:
- raise Exception("Project name '%s' is ambiguous, "
- "please fully qualify the project "
- "with a hostname. Valid hostnames "
- "are %s." % (name, hostname_dict.keys()))
- projects.append(values[0])
+ projects.extend(hostname_dict.values())
else:
- # try to match canonical project names
+ # It is possible for the regex to match specific connection
+ # prefixes. Check these more specific names if we didn't add
+ # all of the possible canonical names already.
for project in hostname_dict.values():
if matcher.fullmatch(project.canonical_name):
projects.append(project)
@@ -7423,16 +7976,21 @@ class Tenant(object):
(project,))
return result
- def getProjectBranches(self, project_canonical_name):
+ def getProjectBranches(self, project_canonical_name,
+ include_always_dynamic=False):
"""Return a project's branches (filtered by this tenant config)
:arg str project_canonical: The project's canonical name.
+ :arg bool include_always_dynamic: Whether to include
+ always-dynamic-branches
:returns: A list of branch names.
:rtype: [str]
"""
tpc = self.project_configs[project_canonical_name]
+ if include_always_dynamic:
+ return tpc.branches + tpc.dynamic_branches
return tpc.branches
def getExcludeUnprotectedBranches(self, project):
@@ -7518,6 +8076,7 @@ class UnparsedBranchCache(object):
class Abide(object):
def __init__(self):
self.admin_rules = {}
+ self.semaphores = {}
self.tenants = {}
# tenant -> project -> list(tpcs)
# The project TPCs are stored as a list as we don't check for
diff --git a/zuul/model_api.py b/zuul/model_api.py
new file mode 100644
index 000000000..27d4a2b07
--- /dev/null
+++ b/zuul/model_api.py
@@ -0,0 +1,17 @@
+# Copyright 2022 Acme Gating, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+# When making ZK schema changes, increment this and add a record to
+# docs/developer/model-changelog.rst
+MODEL_API = 9
diff --git a/zuul/nodepool.py b/zuul/nodepool.py
index 57a885ea9..61b0417c8 100644
--- a/zuul/nodepool.py
+++ b/zuul/nodepool.py
@@ -167,11 +167,11 @@ class Nodepool(object):
return
for resource, value in resources.items():
- key = 'zuul.nodepool.resources.tenant.{tenant}.{resource}'
+ key = 'zuul.nodepool.resources.in_use.tenant.{tenant}.{resource}'
self.statsd.incr(
key, value * duration, tenant=tenant, resource=resource)
for resource, value in resources.items():
- key = 'zuul.nodepool.resources.project.' \
+ key = 'zuul.nodepool.resources.in_use.project.' \
'{project}.{resource}'
self.statsd.incr(
key, value * duration, project=project, resource=resource)
@@ -315,7 +315,6 @@ class Nodepool(object):
log.info("Setting nodeset %s in use", nodeset)
user_data = dict(
zuul_system=self.system_id,
- tenant_name=tenant_name,
project_name=project_name,
)
for node in nodeset.getNodes():
@@ -483,16 +482,19 @@ class Nodepool(object):
total_requests = 0
tenant_requests = defaultdict(int)
- resources_by_tenant = {}
- resources_by_project = {}
+ in_use_resources_by_project = {}
+ in_use_resources_by_tenant = {}
+ total_resources_by_tenant = {}
empty_resource_dict = dict([(k, 0) for k in self.resource_types])
# Initialize zero values for gauges
for tenant in abide.tenants.values():
tenant_requests[tenant.name] = 0
- resources_by_tenant[tenant.name] = empty_resource_dict.copy()
+ in_use_resources_by_tenant[tenant.name] =\
+ empty_resource_dict.copy()
+ total_resources_by_tenant[tenant.name] = empty_resource_dict.copy()
for project in tenant.all_projects:
- resources_by_project[project.canonical_name] =\
+ in_use_resources_by_project[project.canonical_name] =\
empty_resource_dict.copy()
# Count node requests
@@ -511,34 +513,52 @@ class Nodepool(object):
tenant=tenant)
# Count nodes
- for node in self.getNodes():
+ for node in self.zk_nodepool.nodeIterator(cached=True):
if not node.resources:
continue
- project_name = node.user_data.get('project_name')
- tenant_name = node.user_data.get('tenant_name')
- if not (project_name and tenant_name):
- continue
+
+ tenant_name = node.tenant_name
+ if tenant_name in total_resources_by_tenant and \
+ node.requestor == self.system_id:
+ self.addResources(
+ total_resources_by_tenant[tenant_name],
+ node.resources)
+
+ # below here, we are only interested in nodes which are either
+ # in-use, used, or currently held by this zuul system
if node.state not in {model.STATE_IN_USE,
model.STATE_USED,
model.STATE_HOLD}:
continue
- if tenant_name not in resources_by_tenant:
+ if not node.user_data:
continue
- self.addResources(resources_by_tenant[tenant_name],
- node.resources)
- if project_name not in resources_by_project:
+ if node.user_data.get('zuul_system') != self.system_id:
continue
- self.addResources(resources_by_project[project_name],
- node.resources)
- for tenant, resources in resources_by_tenant.items():
+ if tenant_name in in_use_resources_by_tenant:
+ self.addResources(
+ in_use_resources_by_tenant[tenant_name],
+ node.resources)
+
+ project_name = node.user_data.get('project_name')
+ if project_name in in_use_resources_by_project:
+ self.addResources(
+ in_use_resources_by_project[project_name],
+ node.resources)
+
+ for tenant, resources in total_resources_by_tenant.items():
+ for resource, value in resources.items():
+ key = 'zuul.nodepool.resources.total.tenant.' \
+ '{tenant}.{resource}'
+ self.statsd.gauge(key, value, tenant=tenant, resource=resource)
+ for tenant, resources in in_use_resources_by_tenant.items():
for resource, value in resources.items():
- key = 'zuul.nodepool.resources.tenant.' \
+ key = 'zuul.nodepool.resources.in_use.tenant.' \
'{tenant}.{resource}'
self.statsd.gauge(key, value, tenant=tenant, resource=resource)
- for project, resources in resources_by_project.items():
+ for project, resources in in_use_resources_by_project.items():
for resource, value in resources.items():
- key = 'zuul.nodepool.resources.project.' \
+ key = 'zuul.nodepool.resources.in_use.project.' \
'{project}.{resource}'
self.statsd.gauge(
key, value, project=project, resource=resource)
diff --git a/zuul/reporter/__init__.py b/zuul/reporter/__init__.py
index 164d5619f..5af48abc6 100644
--- a/zuul/reporter/__init__.py
+++ b/zuul/reporter/__init__.py
@@ -35,8 +35,19 @@ class BaseReporter(object, metaclass=abc.ABCMeta):
self._action = action
@abc.abstractmethod
- def report(self, item):
- """Send the compiled report message."""
+ def report(self, item, phase1=True, phase2=True):
+ """Send the compiled report message
+
+ Two-phase reporting may be enabled if one or the other of the
+ `phase1` or `phase2` arguments is False.
+
+ Phase1 should report everything except the actual merge action.
+ Phase2 should report only the merge action.
+
+ :arg phase1 bool: Whether to enable phase1 reporting
+ :arg phase2 bool: Whether to enable phase2 reporting
+
+ """
def getSubmitAllowNeeds(self):
"""Get a list of code review labels that are allowed to be
@@ -124,6 +135,7 @@ class BaseReporter(object, metaclass=abc.ABCMeta):
'failure': self._formatItemReportFailure,
'merge-conflict': self._formatItemReportMergeConflict,
'merge-failure': self._formatItemReportMergeFailure,
+ 'config-error': self._formatItemReportConfigError,
'no-jobs': self._formatItemReportNoJobs,
'disabled': self._formatItemReportDisabled,
'dequeue': self._formatItemReportDequeue,
@@ -172,14 +184,24 @@ class BaseReporter(object, metaclass=abc.ABCMeta):
def _formatItemReportSuccess(self, item, with_jobs=True):
msg = item.pipeline.success_message
if with_jobs:
+ status_url = item.formatStatusUrl()
+ if status_url is not None:
+ msg += '\n' + status_url
msg += '\n\n' + self._formatItemReportJobs(item)
return msg
def _formatItemReportFailure(self, item, with_jobs=True):
if item.cannotMergeBundle():
- msg = 'This change is part of a bundle that failed to merge.\n'
+ msg = 'This change is part of a bundle that can not merge.\n'
+ if isinstance(item.bundle.cannot_merge, str):
+ msg += '\n' + item.bundle.cannot_merge + '\n'
elif item.dequeued_needing_change:
msg = 'This change depends on a change that failed to merge.\n'
+ if isinstance(item.dequeued_needing_change, str):
+ msg += '\n' + item.dequeued_needing_change + '\n'
+ elif item.dequeued_missing_requirements:
+ msg = ('This change is unable to merge '
+ 'due to a missing merge requirement.\n')
elif item.isBundleFailing():
msg = 'This change is part of a bundle that failed.\n'
if with_jobs:
@@ -193,6 +215,9 @@ class BaseReporter(object, metaclass=abc.ABCMeta):
else:
msg = item.pipeline.failure_message
if with_jobs:
+ status_url = item.formatStatusUrl()
+ if status_url is not None:
+ msg += '\n' + status_url
msg += '\n\n' + self._formatItemReportJobs(item)
return msg
@@ -202,6 +227,13 @@ class BaseReporter(object, metaclass=abc.ABCMeta):
def _formatItemReportMergeFailure(self, item, with_jobs=True):
return 'This change was not merged by the code review system.\n'
+ def _formatItemReportConfigError(self, item, with_jobs=True):
+ if item.getConfigErrors():
+ msg = str(item.getConfigErrors()[0].error)
+ else:
+ msg = "Unknown configuration error"
+ return msg
+
def _formatItemReportNoJobs(self, item, with_jobs=True):
status_url = get_default(self.connection.sched.config,
'web', 'status_url', '')
@@ -230,16 +262,20 @@ class BaseReporter(object, metaclass=abc.ABCMeta):
def _formatItemReportOtherBundleItems(self, item):
related_changes = item.pipeline.manager.resolveChangeReferences(
item.change.needs_changes)
- return "Related changes:\n{}".format("\n".join(
- c.url for c in related_changes if c is not item.change))
+ return "Related changes:\n{}\n".format("\n".join(
+ f' - {c.url}' for c in related_changes if c is not item.change))
def _getItemReportJobsFields(self, item):
# Extract the report elements from an item
config = self.connection.sched.config
jobs_fields = []
+ skipped = 0
for job in item.getJobs():
build = item.current_build_set.getBuild(job.name)
(result, url) = item.formatJobResult(job)
+ if result == 'SKIPPED':
+ skipped += 1
+ continue
if not job.voting:
voting = ' (non-voting)'
else:
@@ -280,12 +316,15 @@ class BaseReporter(object, metaclass=abc.ABCMeta):
success_message = job.success_message
jobs_fields.append(
(name, url, result, error, elapsed, voting, success_message))
- return jobs_fields
+ return jobs_fields, skipped
def _formatItemReportJobs(self, item):
# Return the list of jobs portion of the report
ret = ''
- jobs_fields = self._getItemReportJobsFields(item)
+ jobs_fields, skipped = self._getItemReportJobsFields(item)
for job_fields in jobs_fields:
ret += '- %s%s : %s%s%s%s\n' % job_fields[:6]
+ if skipped:
+ jobtext = 'job' if skipped == 1 else 'jobs'
+ ret += 'Skipped %i %s\n' % (skipped, jobtext)
return ret
diff --git a/zuul/scheduler.py b/zuul/scheduler.py
index 349613832..134b9d35a 100644
--- a/zuul/scheduler.py
+++ b/zuul/scheduler.py
@@ -16,6 +16,7 @@
# License for the specific language governing permissions and limitations
# under the License.
+import itertools
import logging
import socket
import sys
@@ -25,7 +26,7 @@ import traceback
import uuid
from contextlib import suppress
from zuul.vendor.contextlib import nullcontext
-from collections import defaultdict
+from collections import defaultdict, OrderedDict
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.interval import IntervalTrigger
@@ -41,6 +42,7 @@ from zuul.lib.monitoring import MonitoringServer
from zuul.lib.queue import NamedQueue
from zuul.lib.times import Times
from zuul.lib.statsd import get_statsd, normalize_statsd_name
+from zuul.lib.tracing import Tracing
import zuul.lib.queue
import zuul.lib.repl
from zuul import nodepool
@@ -74,6 +76,7 @@ from zuul.model import (
)
from zuul.version import get_version_string
from zuul.zk import ZooKeeperClient
+from zuul.zk.blob_store import BlobStore
from zuul.zk.cleanup import (
SemaphoreCleanupLock,
BuildRequestCleanupLock,
@@ -182,10 +185,13 @@ class Scheduler(threading.Thread):
_merger_client_class = MergeClient
_executor_client_class = ExecutorClient
- def __init__(self, config, connections, app, testonly=False):
+ def __init__(self, config, connections, app, wait_for_init,
+ testonly=False):
threading.Thread.__init__(self)
self.daemon = True
+ self.wait_for_init = wait_for_init
self.hostname = socket.getfqdn()
+ self.tracing = Tracing(config)
self.primed_event = threading.Event()
# Wake up the main run loop
self.wake_event = threading.Event()
@@ -379,7 +385,10 @@ class Scheduler(threading.Thread):
self.log.debug("Stopping monitoring server")
self.monitoring_server.stop()
self.monitoring_server.join()
+ self.log.debug("Disconnecting from ZooKeeper")
self.zk_client.disconnect()
+ self.log.debug("Stopping tracing")
+ self.tracing.stop()
def runCommand(self):
while self._command_running:
@@ -434,12 +443,12 @@ class Scheduler(threading.Thread):
mergers_online = 0
for executor_component in self.component_registry.all("executor"):
- if executor_component.allow_unzoned or not executor_component.zone:
+ if executor_component.allow_unzoned:
if executor_component.state == BaseComponent.RUNNING:
executors_unzoned_online += 1
if executor_component.accepting_work:
executors_unzoned_accepting += 1
- else:
+ if executor_component.zone:
zone_stats = zoned_executor_stats.setdefault(
executor_component.zone,
executor_stats_default.copy())
@@ -678,6 +687,8 @@ class Scheduler(threading.Thread):
self._runConfigCacheCleanup()
self._runExecutorApiCleanup()
self._runMergerApiCleanup()
+ self._runLayoutDataCleanup()
+ self._runBlobStoreCleanup()
self.maintainConnectionCache()
except Exception:
self.log.exception("Error in general cleanup:")
@@ -714,6 +725,46 @@ class Scheduler(threading.Thread):
except Exception:
self.log.exception("Error in merger API cleanup:")
+ def _runLayoutDataCleanup(self):
+ try:
+ self.tenant_layout_state.cleanup()
+ except Exception:
+ self.log.exception("Error in layout data cleanup:")
+
+ def _runBlobStoreCleanup(self):
+ self.log.debug("Starting blob store cleanup")
+ try:
+ live_blobs = set()
+ with self.layout_lock:
+ # get the start ltime so that we can filter out any
+ # blobs used since this point
+ start_ltime = self.zk_client.getCurrentLtime()
+ # lock and refresh the pipeline
+ for tenant in self.abide.tenants.values():
+ for pipeline in tenant.layout.pipelines.values():
+ with pipeline_lock(
+ self.zk_client, tenant.name, pipeline.name,
+ ) as lock:
+ ctx = self.createZKContext(lock, self.log)
+ pipeline.state.refresh(ctx)
+ # add any blobstore references
+ for item in pipeline.getAllItems(include_old=True):
+ live_blobs.update(item.getBlobKeys())
+ ctx = self.createZKContext(None, self.log)
+ blobstore = BlobStore(ctx)
+ # get the set of blob keys unused since the start time
+ # (ie, we have already filtered any newly added keys)
+ unused_blobs = blobstore.getKeysLastUsedBefore(start_ltime)
+ # remove the current refences
+ unused_blobs -= live_blobs
+ # delete what's left
+ for key in unused_blobs:
+ self.log.debug("Deleting unused blob: %s", key)
+ blobstore.delete(key, start_ltime)
+ self.log.debug("Finished blob store cleanup")
+ except Exception:
+ self.log.exception("Error in blob store cleanup:")
+
def _runBuildRequestCleanup(self):
# If someone else is running the cleanup, skip it.
if self.build_request_cleanup_lock.acquire(blocking=False):
@@ -798,7 +849,9 @@ class Scheduler(threading.Thread):
jobkey,
'RETRY' if build.result is None else build.result
)
- if build.result in ['SUCCESS', 'FAILURE'] and build.start_time:
+ results_with_runtime = ['SUCCESS', 'FAILURE',
+ 'POST_FAILURE', 'TIMED_OUT']
+ if build.result in results_with_runtime and build.start_time:
dt = (build.end_time - build.start_time) * 1000
self.statsd.timing(key, dt)
self.statsd.incr(key)
@@ -812,9 +865,14 @@ class Scheduler(threading.Thread):
self.log.exception("Exception reporting runtime stats")
def reconfigureTenant(self, tenant, project, trigger_event):
+ if trigger_event:
+ trigger_event_ltime = trigger_event.zuul_event_ltime
+ else:
+ trigger_event_ltime = None
self.log.debug("Submitting tenant reconfiguration event for "
- "%s due to event %s in project %s",
- tenant.name, trigger_event, project)
+ "%s due to event %s in project %s, ltime %s",
+ tenant.name, trigger_event, project,
+ trigger_event_ltime)
branch = trigger_event and trigger_event.branch
event = TenantReconfigureEvent(
tenant.name, project.canonical_name, branch,
@@ -822,6 +880,7 @@ class Scheduler(threading.Thread):
if trigger_event:
event.branch_cache_ltimes[trigger_event.connection_name] = (
trigger_event.branch_cache_ltime)
+ event.trigger_event_ltime = trigger_event_ltime
self.management_events[tenant.name].put(event, needs_result=False)
def fullReconfigureCommandHandler(self):
@@ -894,8 +953,6 @@ class Scheduler(threading.Thread):
lock_ctx = tenant_read_lock(self.zk_client, tenant_name)
timer_ctx = nullcontext()
- # Consider all caches valid (min. ltime -1)
- min_ltimes = defaultdict(lambda: defaultdict(lambda: -1))
with lock_ctx as tlock, timer_ctx:
# Refresh the layout state now that we are holding the lock
# and we can be sure it won't be changed concurrently.
@@ -903,14 +960,18 @@ class Scheduler(threading.Thread):
layout_uuid = layout_state and layout_state.uuid
if layout_state:
+ # Get the ltimes from the previous reconfiguration.
+ min_ltimes = self.tenant_layout_state.getMinLtimes(
+ layout_state)
branch_cache_min_ltimes = (
layout_state.branch_cache_min_ltimes)
else:
- # Consider all project branch caches valid if
- # we don't have a layout state.
+ # Consider all caches valid if we don't have a
+ # layout state.
+ min_ltimes = defaultdict(
+ lambda: defaultdict(lambda: -1))
branch_cache_min_ltimes = defaultdict(lambda: -1)
- # This load validates the entire tenant config
tenant = loader.loadTenant(
self.abide, tenant_name, self.ansible_manager,
self.unparsed_abide, min_ltimes=min_ltimes,
@@ -920,7 +981,7 @@ class Scheduler(threading.Thread):
if layout_state is None:
# Reconfigure only tenants w/o an existing layout state
ctx = self.createZKContext(tlock, self.log)
- self._reconfigureTenant(ctx, tenant)
+ self._reconfigureTenant(ctx, min_ltimes, -1, tenant)
self._reportInitialStats(tenant)
else:
self.local_layout_state[tenant_name] = layout_state
@@ -1161,8 +1222,6 @@ class Scheduler(threading.Thread):
def updateTenantLayout(self, log, tenant_name):
log.debug("Updating layout of tenant %s", tenant_name)
- # Consider all caches valid (min. ltime -1)
- min_ltimes = defaultdict(lambda: defaultdict(lambda: -1))
loader = configloader.ConfigLoader(
self.connections, self.zk_client, self.globals, self.statsd, self,
self.merger, self.keystore)
@@ -1179,6 +1238,14 @@ class Scheduler(threading.Thread):
else:
# We don't need the cache ltimes as the tenant was deleted
branch_cache_min_ltimes = None
+
+ # Get the ltimes from the previous reconfiguration.
+ if layout_state:
+ min_ltimes = self.tenant_layout_state.getMinLtimes(
+ layout_state)
+ else:
+ min_ltimes = None
+
loader.loadTPCs(self.abide, self.unparsed_abide,
[tenant_name])
tenant = loader.loadTenant(
@@ -1244,10 +1311,12 @@ class Scheduler(threading.Thread):
try:
abide = Abide()
loader.loadAdminRules(abide, unparsed_abide)
+ loader.loadSemaphores(abide, unparsed_abide)
loader.loadTPCs(abide, unparsed_abide)
for tenant_name in tenants_to_load:
loader.loadTenant(abide, tenant_name, self.ansible_manager,
- unparsed_abide, min_ltimes=None)
+ unparsed_abide, min_ltimes=None,
+ ignore_cat_exception=False)
finally:
self.zk_client.client.delete(validate_root, recursive=True)
@@ -1300,8 +1369,9 @@ class Scheduler(threading.Thread):
for tenant_name in deleted_tenants:
self.abide.clearTPCs(tenant_name)
- loader.loadTPCs(self.abide, self.unparsed_abide)
loader.loadAdminRules(self.abide, self.unparsed_abide)
+ loader.loadSemaphores(self.abide, self.unparsed_abide)
+ loader.loadTPCs(self.abide, self.unparsed_abide)
if event.smart:
# Consider caches always valid
@@ -1313,10 +1383,27 @@ class Scheduler(threading.Thread):
# Consider caches valid if the cache ltime >= event ltime
min_ltimes = defaultdict(
lambda: defaultdict(lambda: event.zuul_event_ltime))
- # Invalidate the branch cache for all connections
+ # Invalidate the branch cache
for connection in self.connections.connections.values():
if hasattr(connection, 'clearBranchCache'):
- connection.clearBranchCache()
+ if event.tenants:
+ # Only clear the projects used by this
+ # tenant (zuul-web won't be able to load
+ # any tenants that we don't immediately
+ # reconfigure after clearing)
+ for tenant_name in event.tenants:
+ projects = [
+ tpc.project.name for tpc in
+ itertools.chain(
+ self.abide.getConfigTPCs(tenant_name),
+ self.abide.getUntrustedTPCs(
+ tenant_name))
+ ]
+ connection.clearBranchCache(projects)
+ else:
+ # Clear all projects since we're reloading
+ # all tenants.
+ connection.clearBranchCache()
ltime = self.zk_client.getCurrentLtime()
# Consider the branch cache valid only after we
# cleared it
@@ -1345,7 +1432,9 @@ class Scheduler(threading.Thread):
reconfigured_tenants.append(tenant_name)
ctx = self.createZKContext(lock, self.log)
if tenant is not None:
- self._reconfigureTenant(ctx, tenant, old_tenant)
+ self._reconfigureTenant(ctx, min_ltimes,
+ -1,
+ tenant, old_tenant)
else:
self._reconfigureDeleteTenant(ctx, old_tenant)
with suppress(KeyError):
@@ -1407,7 +1496,9 @@ class Scheduler(threading.Thread):
branch_cache_min_ltimes=branch_cache_min_ltimes)
tenant = self.abide.tenants[event.tenant_name]
ctx = self.createZKContext(lock, self.log)
- self._reconfigureTenant(ctx, tenant, old_tenant)
+ self._reconfigureTenant(ctx, min_ltimes,
+ event.trigger_event_ltime,
+ tenant, old_tenant)
duration = round(time.monotonic() - start, 3)
self.log.info("Tenant reconfiguration complete for %s (duration: %s "
"seconds)", event.tenant_name, duration)
@@ -1561,7 +1652,9 @@ class Scheduler(threading.Thread):
request)
self.cancelJob(build_set, request_job)
- def _reconfigureTenant(self, context, tenant, old_tenant=None):
+ def _reconfigureTenant(self, context, min_ltimes,
+ last_reconfigure_event_ltime, tenant,
+ old_tenant=None):
# This is called from _doReconfigureEvent while holding the
# layout lock
if old_tenant:
@@ -1587,13 +1680,35 @@ class Scheduler(threading.Thread):
for s in self.connections.getSources()
}
+ # Make sure last_reconfigure_event_ltime never goes backward
+ old_layout_state = self.tenant_layout_state.get(tenant.name)
+ if old_layout_state:
+ if (old_layout_state.last_reconfigure_event_ltime >
+ last_reconfigure_event_ltime):
+ self.log.debug("Setting layout state last reconfigure ltime "
+ "to previous ltime %s which is newer than %s",
+ old_layout_state.last_reconfigure_event_ltime,
+ last_reconfigure_event_ltime)
+ last_reconfigure_event_ltime =\
+ old_layout_state.last_reconfigure_event_ltime
+ if last_reconfigure_event_ltime < 0:
+ last_reconfigure_event_ltime = self.zk_client.getCurrentLtime()
+ self.log.debug("Setting layout state last reconfigure ltime "
+ "to current ltime %s", last_reconfigure_event_ltime)
+ else:
+ self.log.debug("Setting layout state last reconfigure ltime "
+ "to %s", last_reconfigure_event_ltime)
layout_state = LayoutState(
tenant_name=tenant.name,
hostname=self.hostname,
last_reconfigured=int(time.time()),
+ last_reconfigure_event_ltime=last_reconfigure_event_ltime,
uuid=tenant.layout.uuid,
branch_cache_min_ltimes=branch_cache_min_ltimes,
)
+ # Save the min_ltimes which are sharded before we atomically
+ # update the layout state.
+ self.tenant_layout_state.setMinLtimes(layout_state, min_ltimes)
# We need to update the local layout state before the remote state,
# to avoid race conditions in the layout changed callback.
self.local_layout_state[tenant.name] = layout_state
@@ -1667,39 +1782,60 @@ class Scheduler(threading.Thread):
change_ids = [c.split(',') for c in event.change_ids]
items_to_enqueue = []
change_queue = None
- for shared_queue in pipeline.queues:
- if change_queue:
- break
- for item in shared_queue.queue:
- if (item.change.number == change_ids[0][0] and
- item.change.patchset == change_ids[0][1]):
- change_queue = shared_queue
- break
- if not change_queue:
- raise Exception("Unable to find shared change queue for %s" %
- event.change_ids[0])
+
+ # A list of (queue, items); the queue should be promoted
+ # within the pipeline, and the items should be promoted within
+ # the queue.
+ promote_operations = OrderedDict()
for number, patchset in change_ids:
found = False
- for item in change_queue.queue:
- if (item.change.number == number and
+ for shared_queue in pipeline.queues:
+ for item in shared_queue.queue:
+ if not item.live:
+ continue
+ if (item.change.number == number and
item.change.patchset == patchset):
- found = True
- items_to_enqueue.append(item)
+ promote_operations.setdefault(
+ shared_queue, []).append(item)
+ found = True
+ break
+ if found:
break
if not found:
- raise Exception("Unable to find %s,%s in queue %s" %
- (number, patchset, change_queue))
- for item in change_queue.queue[:]:
- if item not in items_to_enqueue:
- items_to_enqueue.append(item)
- pipeline.manager.cancelJobs(item)
- pipeline.manager.dequeueItem(item)
- for item in items_to_enqueue:
- pipeline.manager.addChange(
- item.change, event,
- enqueue_time=item.enqueue_time,
- quiet=True,
- ignore_requirements=True)
+ raise Exception("Unable to find %s,%s" % (number, patchset))
+
+ # Reverse the promote operations so that we promote the first
+ # change queue last (which will put it at the top).
+ for change_queue, items_to_enqueue in\
+ reversed(promote_operations.items()):
+ # We can leave changes in the pipeline as long as the head
+ # remains identical; as soon as we make a change, we have
+ # to re-enqueue everything behind it in order to ensure
+ # dependencies are correct.
+ head_same = True
+ for item in change_queue.queue[:]:
+ if item.live and item == items_to_enqueue[0] and head_same:
+ # We can skip this one and leave it in place
+ items_to_enqueue.pop(0)
+ continue
+ elif not item.live:
+ # Ignore this; if the actual item behind it is
+ # dequeued, it will get cleaned up eventually.
+ continue
+ if item not in items_to_enqueue:
+ items_to_enqueue.append(item)
+ head_same = False
+ pipeline.manager.cancelJobs(item)
+ pipeline.manager.dequeueItem(item)
+
+ for item in items_to_enqueue:
+ pipeline.manager.addChange(
+ item.change, item.event,
+ enqueue_time=item.enqueue_time,
+ quiet=True,
+ ignore_requirements=True)
+ # Regardless, move this shared change queue to the head.
+ pipeline.promoteQueue(change_queue)
def _doDequeueEvent(self, event):
tenant = self.abide.tenants.get(event.tenant_name)
@@ -1804,6 +1940,9 @@ class Scheduler(threading.Thread):
self.log.debug("Statsd enabled")
else:
self.log.debug("Statsd not configured")
+ if self.wait_for_init:
+ self.log.debug("Waiting for tenant initialization")
+ self.primed_event.wait()
while True:
self.log.debug("Run handler sleeping")
self.wake_event.wait()
@@ -1902,8 +2041,9 @@ class Scheduler(threading.Thread):
tenant_config, from_script=script)
self.system_config_cache.set(self.unparsed_abide, self.globals)
- loader.loadTPCs(self.abide, self.unparsed_abide)
loader.loadAdminRules(self.abide, self.unparsed_abide)
+ loader.loadSemaphores(self.abide, self.unparsed_abide)
+ loader.loadTPCs(self.abide, self.unparsed_abide)
def updateSystemConfig(self):
with self.layout_lock:
@@ -1922,8 +2062,9 @@ class Scheduler(threading.Thread):
for tenant_name in deleted_tenants:
self.abide.clearTPCs(tenant_name)
- loader.loadTPCs(self.abide, self.unparsed_abide)
loader.loadAdminRules(self.abide, self.unparsed_abide)
+ loader.loadSemaphores(self.abide, self.unparsed_abide)
+ loader.loadTPCs(self.abide, self.unparsed_abide)
def process_pipelines(self, tenant, tenant_lock):
for pipeline in tenant.layout.pipelines.values():
@@ -2070,6 +2211,8 @@ class Scheduler(threading.Thread):
"Unable to refresh pipeline change list for %s",
pipeline.name)
+ # Get the ltime of the last reconfiguration event
+ self.trigger_events[tenant.name].refreshMetadata()
for event in self.trigger_events[tenant.name]:
log = get_annotated_logger(self.log, event.zuul_event_id)
log.debug("Forwarding trigger event %s", event)
@@ -2135,13 +2278,38 @@ class Scheduler(threading.Thread):
reconfigure_tenant = False
+ # If all config classes are excluded for this project we don't need
+ # to trigger a reconfiguration.
+ tpc = tenant.project_configs.get(project.canonical_name)
+ if tpc and not tpc.load_classes:
+ reconfigure_tenant = False
+
+ # If we are listing included branches and this branch
+ # is not included, skip reconfig.
+ if (reconfigure_tenant and
+ not tpc.includesBranch(event.branch)):
+ reconfigure_tenant = False
+
+ # But if the event is that branch protection status has
+ # changed, do reconfigure.
+ if (event.isBranchProtectionChanged()):
+ reconfigure_tenant = True
+
if reconfigure_tenant:
# The change that just landed updates the config
# or a branch was just created or deleted. Clear
# out cached data for this project and perform a
# reconfiguration.
self.reconfigureTenant(tenant, change.project, event)
-
+ # This will become the new required minimum event ltime
+ # for every trigger event processed after the
+ # reconfiguration, so make sure we update it after having
+ # submitted the reconfiguration event.
+ self.trigger_events[tenant.name].last_reconfigure_event_ltime =\
+ event.zuul_event_ltime
+
+ event.min_reconfigure_ltime = self.trigger_events[
+ tenant.name].last_reconfigure_event_ltime
for pipeline in tenant.layout.pipelines.values():
if (
pipeline.manager.eventMatches(event, change)
@@ -2156,6 +2324,21 @@ class Scheduler(threading.Thread):
if self._stopped:
return
log = get_annotated_logger(self.log, event.zuul_event_id)
+ if not isinstance(event, SupercedeEvent):
+ local_state = self.local_layout_state[tenant.name]
+ last_ltime = local_state.last_reconfigure_event_ltime
+ # The event tells us the ltime of the most recent
+ # reconfiguration event up to that point. If our local
+ # layout state wasn't generated by an event after that
+ # time, then we are too out of date to process this event.
+ # Abort now and wait for an update.
+ if (event.min_reconfigure_ltime > -1 and
+ event.min_reconfigure_ltime > last_ltime):
+ log.debug("Trigger event minimum reconfigure ltime of %s "
+ "newer than current reconfigure ltime of %s, "
+ "aborting early",
+ event.min_reconfigure_ltime, last_ltime)
+ return
log.debug("Processing trigger event %s", event)
try:
if isinstance(event, SupercedeEvent):
diff --git a/zuul/source/__init__.py b/zuul/source/__init__.py
index a66107eef..5ccfa07b6 100644
--- a/zuul/source/__init__.py
+++ b/zuul/source/__init__.py
@@ -126,6 +126,20 @@ class BaseSource(object, metaclass=abc.ABCMeta):
search scope.
"""
+ def getChangesByTopic(self, topic):
+ """Return changes in the same topic.
+
+ This should return changes under the same topic, as well as
+ changes under the same topic of any git-dependent changes,
+ recursively.
+
+ This is only implemented by the Gerrit driver, however if
+ other systems have a similar "topic" functionality, it could
+ be added to other drivers.
+ """
+
+ return []
+
@abc.abstractmethod
def getProjectOpenChanges(self, project):
"""Get the open changes for a project."""
@@ -134,6 +148,15 @@ class BaseSource(object, metaclass=abc.ABCMeta):
def getGitUrl(self, project):
"""Get the git url for a project."""
+ def getRetryTimeout(self, project):
+ """Get the retry timeout for a project in seconds.
+
+ This is used by the mergers to potentially increase the number
+ of git fetch retries before giving up. Return None to use the
+ default.
+ """
+ return None
+
@abc.abstractmethod
def getProject(self, name):
"""Get a project."""
diff --git a/zuul/web/__init__.py b/zuul/web/__init__.py
index d12f8835e..c2b6a4ddf 100755
--- a/zuul/web/__init__.py
+++ b/zuul/web/__init__.py
@@ -32,11 +32,12 @@ import ssl
import threading
import uuid
import prometheus_client
+import urllib.parse
import zuul.executor.common
from zuul import exceptions
from zuul.configloader import ConfigLoader
-from zuul.connection import BaseConnection
+from zuul.connection import BaseConnection, ReadOnlyBranchCacheError
import zuul.lib.repl
from zuul.lib import commandsocket, encryption, streamer_utils
from zuul.lib.ansible import AnsibleManager
@@ -46,6 +47,7 @@ from zuul.lib.monitoring import MonitoringServer
from zuul.lib.re2util import filter_allowed_disallowed
from zuul.model import (
Abide,
+ BuildSet,
Branch,
ChangeQueue,
DequeueEvent,
@@ -360,11 +362,15 @@ class ZuulWebAPI(object):
self.system = ZuulSystem(self.zk_client)
self.zk_nodepool = ZooKeeperNodepool(self.zk_client,
enable_node_cache=True)
- self.cache = {}
- self.cache_time = {}
+ self.status_caches = {}
+ self.status_cache_times = {}
+ self.status_cache_locks = defaultdict(threading.Lock)
+ self.tenants_cache = []
+ self.tenants_cache_time = 0
+ self.tenants_cache_lock = threading.Lock()
+
self.cache_expiry = 1
self.static_cache_expiry = zuulweb.static_cache_expiry
- self.status_lock = threading.Lock()
@property
def log(self):
@@ -569,6 +575,7 @@ class ZuulWebAPI(object):
@cherrypy.tools.json_out(content_type='application/json; charset=utf-8')
def autohold_list(self, tenant_name, *args, **kwargs):
# we don't use json_in because a payload is not mandatory with GET
+ _ = self._getTenantOrRaise(tenant_name)
if cherrypy.request.method != 'GET':
raise cherrypy.HTTPError(405)
# filter by project if passed as a query string
@@ -582,6 +589,7 @@ class ZuulWebAPI(object):
# we don't use json_in because a payload is not mandatory with GET
# Note: GET handling is redundant with autohold_list
# and could be removed.
+ tenant = self._getTenantOrRaise(tenant_name)
if cherrypy.request.method == 'GET':
return self._autohold_list(tenant_name, project_name)
elif cherrypy.request.method == 'POST':
@@ -593,6 +601,8 @@ class ZuulWebAPI(object):
if token_error is not None:
return token_error
self.isAuthorizedOrRaise(claims, tenant_name)
+ project = self._getProjectOrRaise(tenant, project_name)
+
msg = 'User "%s" requesting "%s" on %s/%s'
self.log.info(
msg % (claims['__zuul_uid_claim'], 'autohold',
@@ -619,9 +629,6 @@ class ZuulWebAPI(object):
if count < 0:
raise cherrypy.HTTPError(400, "Count must be greater 0")
- tenant = self._getTenantOrRaise(tenant_name)
- project = self._getProjectOrRaise(tenant, project_name)
-
project_name = project.canonical_name
if jbody['change']:
@@ -790,6 +797,7 @@ class ZuulWebAPI(object):
'project/{project:.*}/branch/{branch:.*}/'
'freeze-jobs',
'pipelines': '/api/tenant/{tenant}/pipelines',
+ 'semaphores': '/api/tenant/{tenant}/semaphores',
'labels': '/api/tenant/{tenant}/labels',
'nodes': '/api/tenant/{tenant}/nodes',
'key': '/api/tenant/{tenant}/key/{project:.*}.pub',
@@ -940,9 +948,7 @@ class ZuulWebAPI(object):
return [n for n, t in self.zuulweb.abide.tenants.items()
if self._is_authorized(t, claims)]
- @cherrypy.expose
- @cherrypy.tools.json_out(content_type='application/json; charset=utf-8')
- def tenants(self):
+ def _tenants(self):
result = []
for tenant_name, tenant in sorted(self.zuulweb.abide.tenants.items()):
queue_size = 0
@@ -959,10 +965,26 @@ class ZuulWebAPI(object):
'projects': len(tenant.untrusted_projects),
'queue': queue_size,
})
+ return result
+
+ @cherrypy.expose
+ @cherrypy.tools.json_out(content_type='application/json; charset=utf-8')
+ def tenants(self):
+ cache_time = self.tenants_cache_time
+ if time.time() - cache_time > self.cache_expiry:
+ with self.tenants_cache_lock:
+ self.tenants_cache = self._tenants()
+ self.tenants_cache_time = time.time()
resp = cherrypy.response
+ resp.headers["Cache-Control"] = f"public, max-age={self.cache_expiry}"
+ last_modified = datetime.utcfromtimestamp(
+ self.tenants_cache_time
+ )
+ last_modified_header = last_modified.strftime('%a, %d %b %Y %X GMT')
+ resp.headers["Last-modified"] = last_modified_header
resp.headers['Access-Control-Allow-Origin'] = '*'
- return result
+ return self.tenants_cache
@cherrypy.expose
@cherrypy.tools.json_out(content_type='application/json; charset=utf-8')
@@ -991,16 +1013,32 @@ class ZuulWebAPI(object):
def _getStatus(self, tenant_name):
tenant = self._getTenantOrRaise(tenant_name)
- with self.status_lock:
- if tenant not in self.cache or \
- (time.time() - self.cache_time[tenant]) > self.cache_expiry:
- self.cache[tenant_name] = self.formatStatus(tenant)
- self.cache_time[tenant_name] = time.time()
-
- payload = self.cache[tenant_name]
+ cache_time = self.status_cache_times.get(tenant_name, 0)
+ if tenant_name not in self.status_cache_locks or \
+ (time.time() - cache_time) > self.cache_expiry:
+ if self.status_cache_locks[tenant_name].acquire(
+ blocking=False
+ ):
+ try:
+ self.status_caches[tenant_name] =\
+ self.formatStatus(tenant)
+ self.status_cache_times[tenant_name] =\
+ time.time()
+ finally:
+ self.status_cache_locks[tenant_name].release()
+ if not self.status_caches.get(tenant_name):
+ # If the cache is empty at this point it means that we didn't
+ # get the lock but another thread is initializing the cache
+ # for the first time. In this case we just wait for the lock
+ # to wait for it to finish.
+ with self.status_cache_locks[tenant_name]:
+ pass
+ payload = self.status_caches[tenant_name]
resp = cherrypy.response
resp.headers["Cache-Control"] = f"public, max-age={self.cache_expiry}"
- last_modified = datetime.utcfromtimestamp(self.cache_time[tenant_name])
+ last_modified = datetime.utcfromtimestamp(
+ self.status_cache_times[tenant_name]
+ )
last_modified_header = last_modified.strftime('%a, %d %b %Y %X GMT')
resp.headers["Last-modified"] = last_modified_header
resp.headers['Access-Control-Allow-Origin'] = '*'
@@ -1135,6 +1173,7 @@ class ZuulWebAPI(object):
@cherrypy.tools.json_out(
content_type='application/json; charset=utf-8', handler=json_handler)
def job(self, tenant_name, job_name):
+ job_name = urllib.parse.unquote_plus(job_name)
tenant = self._getTenantOrRaise(tenant_name)
job_variants = tenant.layout.jobs.get(job_name)
result = []
@@ -1250,7 +1289,7 @@ class ZuulWebAPI(object):
isinstance(node.user_data, dict) and
node.user_data.get('zuul_system') ==
self.system.system_id and
- node.user_data.get('tenant_name') == tenant):
+ node.tenant_name == tenant):
continue
node_data = {}
for key in ("id", "type", "connection_type", "external_id",
@@ -1498,6 +1537,44 @@ class ZuulWebAPI(object):
@cherrypy.expose
@cherrypy.tools.save_params()
+ @cherrypy.tools.json_out(
+ content_type='application/json; charset=utf-8', handler=json_handler,
+ )
+ def semaphores(self, tenant_name):
+ tenant = self._getTenantOrRaise(tenant_name)
+ result = []
+ names = set(tenant.layout.semaphores.keys())
+ names = names.union(tenant.global_semaphores)
+ for semaphore_name in sorted(names):
+ semaphore = tenant.layout.getSemaphore(
+ self.zuulweb.abide, semaphore_name)
+ holders = tenant.semaphore_handler.semaphoreHolders(semaphore_name)
+ this_tenant = []
+ other_tenants = 0
+ for holder in holders:
+ (holder_tenant, holder_pipeline,
+ holder_item_uuid, holder_buildset_uuid
+ ) = BuildSet.parsePath(holder['buildset_path'])
+ if holder_tenant != tenant_name:
+ other_tenants += 1
+ continue
+ this_tenant.append({'buildset_uuid': holder_buildset_uuid,
+ 'job_name': holder['job_name']})
+ sem_out = {'name': semaphore.name,
+ 'global': semaphore.global_scope,
+ 'max': semaphore.max,
+ 'holders': {
+ 'count': len(this_tenant) + other_tenants,
+ 'this_tenant': this_tenant,
+ 'other_tenants': other_tenants},
+ }
+ result.append(sem_out)
+ resp = cherrypy.response
+ resp.headers['Access-Control-Allow-Origin'] = '*'
+ return result
+
+ @cherrypy.expose
+ @cherrypy.tools.save_params()
@cherrypy.tools.websocket(handler_cls=LogStreamHandler)
def console_stream(self, tenant):
cherrypy.request.ws_handler.zuulweb = self.zuulweb
@@ -1810,6 +1887,7 @@ class ZuulWeb(object):
route_map = cherrypy.dispatch.RoutesDispatcher()
api = ZuulWebAPI(self)
+ self.api = api
route_map.connect('api', '/api',
controller=api, action='index')
route_map.connect('api', '/api/info',
@@ -1826,6 +1904,8 @@ class ZuulWeb(object):
controller=api, action='status')
route_map.connect('api', '/api/tenant/{tenant}/status/change/{change}',
controller=api, action='status_change')
+ route_map.connect('api', '/api/tenant/{tenant_name}/semaphores',
+ controller=api, action='semaphores')
route_map.connect('api', '/api/tenant/{tenant_name}/jobs',
controller=api, action='jobs')
route_map.connect('api', '/api/tenant/{tenant_name}/job/{job_name}',
@@ -2039,7 +2119,11 @@ class ZuulWeb(object):
if not self._system_config_running:
return
self.updateSystemConfig()
- self.updateLayout()
+ if not self.updateLayout():
+ # Branch cache errors with at least one tenant,
+ # try again.
+ time.sleep(10)
+ self.system_config_cache_wake_event.set()
except Exception:
self.log.exception("Exception while updating system config")
@@ -2061,8 +2145,9 @@ class ZuulWeb(object):
for tenant_name in deleted_tenants:
self.abide.clearTPCs(tenant_name)
- loader.loadTPCs(self.abide, self.unparsed_abide)
loader.loadAdminRules(self.abide, self.unparsed_abide)
+ loader.loadSemaphores(self.abide, self.unparsed_abide)
+ loader.loadTPCs(self.abide, self.unparsed_abide)
def updateLayout(self):
self.log.debug("Updating layout state")
@@ -2075,35 +2160,51 @@ class ZuulWeb(object):
tenant_names = set(self.abide.tenants)
tenant_names.update(self.unparsed_abide.tenants.keys())
- min_ltimes = defaultdict(lambda: defaultdict(lambda: -1))
+ success = True
for tenant_name in tenant_names:
# Reload the tenant if the layout changed.
- if (self.local_layout_state.get(tenant_name)
- == self.tenant_layout_state.get(tenant_name)):
- continue
- self.log.debug("Reloading tenant %s", tenant_name)
- with tenant_read_lock(self.zk_client, tenant_name):
- layout_state = self.tenant_layout_state.get(tenant_name)
- layout_uuid = layout_state and layout_state.uuid
-
- if layout_state:
- branch_cache_min_ltimes = (
- layout_state.branch_cache_min_ltimes)
- else:
- # Consider all project branch caches valid if
- # we don't have a layout state.
- branch_cache_min_ltimes = defaultdict(lambda: -1)
-
- # The tenant will be stored in self.abide.tenants after
- # it was loaded.
- tenant = loader.loadTenant(
- self.abide, tenant_name, self.ansible_manager,
- self.unparsed_abide, min_ltimes=min_ltimes,
- layout_uuid=layout_uuid,
- branch_cache_min_ltimes=branch_cache_min_ltimes)
- if tenant is not None:
- self.local_layout_state[tenant_name] = layout_state
- else:
- with suppress(KeyError):
- del self.local_layout_state[tenant_name]
+ try:
+ self._updateTenantLayout(loader, tenant_name)
+ except ReadOnlyBranchCacheError:
+ self.log.info(
+ "Unable to update layout due to incomplete branch "
+ "cache, possibly due to in-progress tenant "
+ "reconfiguration; will retry")
+ success = False
self.log.debug("Done updating layout state")
+ return success
+
+ def _updateTenantLayout(self, loader, tenant_name):
+ # Reload the tenant if the layout changed.
+ if (self.local_layout_state.get(tenant_name)
+ == self.tenant_layout_state.get(tenant_name)):
+ return
+ self.log.debug("Reloading tenant %s", tenant_name)
+ with tenant_read_lock(self.zk_client, tenant_name):
+ layout_state = self.tenant_layout_state.get(tenant_name)
+ layout_uuid = layout_state and layout_state.uuid
+
+ if layout_state:
+ min_ltimes = self.tenant_layout_state.getMinLtimes(
+ layout_state)
+ branch_cache_min_ltimes = (
+ layout_state.branch_cache_min_ltimes)
+ else:
+ # Consider all project branch caches valid if
+ # we don't have a layout state.
+ min_ltimes = defaultdict(
+ lambda: defaultdict(lambda: -1))
+ branch_cache_min_ltimes = defaultdict(lambda: -1)
+
+ # The tenant will be stored in self.abide.tenants after
+ # it was loaded.
+ tenant = loader.loadTenant(
+ self.abide, tenant_name, self.ansible_manager,
+ self.unparsed_abide, min_ltimes=min_ltimes,
+ layout_uuid=layout_uuid,
+ branch_cache_min_ltimes=branch_cache_min_ltimes)
+ if tenant is not None:
+ self.local_layout_state[tenant_name] = layout_state
+ else:
+ with suppress(KeyError):
+ del self.local_layout_state[tenant_name]
diff --git a/zuul/zk/__init__.py b/zuul/zk/__init__.py
index 195197c5f..8ddc7511d 100644
--- a/zuul/zk/__init__.py
+++ b/zuul/zk/__init__.py
@@ -17,7 +17,7 @@ from threading import Thread
from typing import List, Callable
from kazoo.client import KazooClient
-from kazoo.exceptions import NoNodeError
+from kazoo.exceptions import NoNodeError, NodeExistsError
from kazoo.handlers.threading import KazooTimeoutError
from kazoo.protocol.states import KazooState
@@ -211,8 +211,11 @@ class ZooKeeperClient(object):
try:
zstat = self.client.set("/zuul/ltime", b"")
except NoNodeError:
- self.client.create("/zuul/ltime", b"", makepath=True)
- zstat = self.client.set("/zuul/ltime", b"")
+ try:
+ self.client.create("/zuul/ltime", b"", makepath=True)
+ zstat = self.client.set("/zuul/ltime", b"")
+ except NodeExistsError:
+ zstat = self.client.set("/zuul/ltime", b"")
return zstat.last_modified_transaction_id
diff --git a/zuul/zk/blob_store.py b/zuul/zk/blob_store.py
new file mode 100644
index 000000000..5547faff6
--- /dev/null
+++ b/zuul/zk/blob_store.py
@@ -0,0 +1,201 @@
+# Copyright 2020 BMW Group
+# Copyright 2022 Acme Gating, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import hashlib
+
+from kazoo.exceptions import NoNodeError
+from kazoo.retry import KazooRetry
+
+from zuul.zk.locks import locked, SessionAwareLock
+from zuul.zk.zkobject import LocalZKContext, ZKContext
+from zuul.zk import sharding
+
+
+class BlobStore:
+ _retry_interval = 5
+ data_root = "/zuul/cache/blob/data"
+ lock_root = "/zuul/cache/blob/lock"
+
+ def __init__(self, context):
+ self.context = context
+
+ def _getRootPath(self, key):
+ return f"{self.data_root}/{key[0:2]}/{key}"
+
+ def _getPath(self, key):
+ root = self._getRootPath(key)
+ return f"{root}/data"
+
+ def _getFlagPath(self, key):
+ root = self._getRootPath(key)
+ return f"{root}/complete"
+
+ def _retry(self, context, func, *args, max_tries=-1, **kw):
+ kazoo_retry = KazooRetry(max_tries=max_tries,
+ interrupt=context.sessionIsInvalid,
+ delay=self._retry_interval, backoff=0,
+ ignore_expire=False)
+ try:
+ return kazoo_retry(func, *args, **kw)
+ except InterruptedError:
+ pass
+
+ @staticmethod
+ def _retryableLoad(context, key, path, flag):
+ if not context.client.exists(flag):
+ raise KeyError(key)
+ with sharding.BufferedShardReader(context.client, path) as stream:
+ data = stream.read()
+ compressed_size = stream.compressed_bytes_read
+ context.cumulative_read_time += stream.cumulative_read_time
+ context.cumulative_read_objects += 1
+ context.cumulative_read_znodes += stream.znodes_read
+ context.cumulative_read_bytes += compressed_size
+ return data, compressed_size
+
+ def get(self, key):
+ path = self._getPath(key)
+ flag = self._getFlagPath(key)
+
+ if self.context.sessionIsInvalid():
+ raise Exception("ZooKeeper session or lock not valid")
+
+ data, compressed_size = self._retry(self.context, self._retryableLoad,
+ self.context, key, path, flag)
+ return data
+
+ def _checkKey(self, key):
+ # This returns whether the key is in the store. If it is in
+ # the store, it also touches the flag file so that the cleanup
+ # routine can know the last time an entry was used.
+ flag = self._getFlagPath(key)
+
+ if self.context.sessionIsInvalid():
+ raise Exception("ZooKeeper session or lock not valid")
+
+ ret = self._retry(self.context, self.context.client.exists,
+ flag)
+ if not ret:
+ return False
+ self._retry(self.context, self.context.client.set,
+ flag, b'')
+ return True
+
+ @staticmethod
+ def _retryableSave(context, path, flag, data):
+ with sharding.BufferedShardWriter(context.client, path) as stream:
+ stream.truncate(0)
+ stream.write(data)
+ stream.flush()
+ context.client.ensure_path(flag)
+ compressed_size = stream.compressed_bytes_written
+ context.cumulative_write_time += stream.cumulative_write_time
+ context.cumulative_write_objects += 1
+ context.cumulative_write_znodes += stream.znodes_written
+ context.cumulative_write_bytes += compressed_size
+ return compressed_size
+
+ def put(self, data):
+ if isinstance(self.context, LocalZKContext):
+ return None
+
+ if self.context.sessionIsInvalid():
+ raise Exception("ZooKeeper session or lock not valid")
+
+ hasher = hashlib.sha256()
+ hasher.update(data)
+ key = hasher.hexdigest()
+
+ path = self._getPath(key)
+ flag = self._getFlagPath(key)
+
+ if self._checkKey(key):
+ return key
+
+ with locked(
+ SessionAwareLock(
+ self.context.client,
+ f"{self.lock_root}/{key}"),
+ blocking=True
+ ) as lock:
+ if self._checkKey(key):
+ return key
+
+ # make a new context based on the old one
+ locked_context = ZKContext(self.context.client, lock,
+ self.context.stop_event,
+ self.context.log)
+
+ self._retry(
+ locked_context,
+ self._retryableSave,
+ locked_context, path, flag, data)
+ self.context.updateStatsFromOtherContext(locked_context)
+ return key
+
+ def delete(self, key, ltime):
+ path = self._getRootPath(key)
+ flag = self._getFlagPath(key)
+ if self.context.sessionIsInvalid():
+ raise Exception("ZooKeeper session or lock not valid")
+ try:
+ with locked(
+ SessionAwareLock(
+ self.context.client,
+ f"{self.lock_root}/{key}"),
+ blocking=True
+ ) as lock:
+ # make a new context based on the old one
+ locked_context = ZKContext(self.context.client, lock,
+ self.context.stop_event,
+ self.context.log)
+
+ # Double check that it hasn't been used since we
+ # decided to delete it
+ data, zstat = self._retry(locked_context,
+ self.context.client.get,
+ flag)
+ if zstat.last_modified_transaction_id < ltime:
+ self._retry(locked_context, self.context.client.delete,
+ path, recursive=True)
+ except NoNodeError:
+ raise KeyError(key)
+
+ def __iter__(self):
+ try:
+ hashdirs = self.context.client.get_children(self.data_root)
+ except NoNodeError:
+ return
+
+ for hashdir in hashdirs:
+ try:
+ for key in self.context.client.get_children(
+ f'{self.data_root}/{hashdir}'):
+ yield key
+ except NoNodeError:
+ pass
+
+ def __len__(self):
+ return len([x for x in self])
+
+ def getKeysLastUsedBefore(self, ltime):
+ ret = set()
+ for key in self:
+ flag = self._getFlagPath(key)
+ data, zstat = self._retry(self.context, self.context.client.get,
+ flag)
+ if zstat.last_modified_transaction_id < ltime:
+ ret.add(key)
+ return ret
diff --git a/zuul/zk/branch_cache.py b/zuul/zk/branch_cache.py
index 5600802e9..35d0c69cd 100644
--- a/zuul/zk/branch_cache.py
+++ b/zuul/zk/branch_cache.py
@@ -21,6 +21,9 @@ from zuul.zk.locks import SessionAwareReadLock, SessionAwareWriteLock, locked
from kazoo.exceptions import NoNodeError
+# Default marker to raise an exception on cache miss in getProjectBranches()
+RAISE_EXCEPTION = object()
+
class BranchCacheZKObject(ShardedZKObject):
"""Store the branch cache in ZK
@@ -42,6 +45,9 @@ class BranchCacheZKObject(ShardedZKObject):
If a project is absent from the dict, it needs to be queried from
the source.
+ If there was an error fetching the branches, None will be stored
+ as a sentinel value.
+
When performing an exclude_unprotected query, remove any duplicate
branches from remaider to save space. When determining the full
list of branches, combine both lists.
@@ -104,52 +110,91 @@ class BranchCache:
self.cache = BranchCacheZKObject.new(
self.zk_context, _path=data_path)
- def clear(self):
+ def clear(self, projects=None):
"""Clear the cache"""
with locked(self.wlock):
with self.cache.activeContext(self.zk_context):
- self.cache.protected.clear()
- self.cache.remainder.clear()
+ if projects is None:
+ self.cache.protected.clear()
+ self.cache.remainder.clear()
+ else:
+ for p in projects:
+ self.cache.protected.pop(p, None)
+ self.cache.remainder.pop(p, None)
def getProjectBranches(self, project_name, exclude_unprotected,
- min_ltime=-1):
+ min_ltime=-1, default=RAISE_EXCEPTION):
"""Get the branch names for the given project.
+ Checking the branch cache we need to distinguish three different
+ cases:
+
+ 1. cache miss (not queried yet)
+ 2. cache hit (including empty list of branches)
+ 3. error when fetching branches
+
+ If the cache doesn't contain any branches for the project and no
+ default value is provided a LookupError is raised.
+
+ If there was an error fetching the branches, the return value
+ will be None.
+
+ Otherwise the list of branches will be returned.
+
:param str project_name:
The project for which the branches are returned.
:param bool exclude_unprotected:
Whether to return all or only protected branches.
:param int min_ltime:
The minimum cache ltime to consider the cache valid.
+ :param any default:
+ Optional default value to return if no cache entry exits.
- :returns: The list of branch names, or None if the cache
- cannot satisfy the request.
+ :returns: The list of branch names, or None if there was
+ an error when fetching the branches.
"""
if self.ltime < min_ltime:
with locked(self.rlock):
self.cache.refresh(self.zk_context)
- protected_branches = self.cache.protected.get(project_name)
- remainder_branches = self.cache.remainder.get(project_name)
+ protected_branches = None
+ try:
+ protected_branches = self.cache.protected[project_name]
+ except KeyError:
+ if exclude_unprotected:
+ if default is RAISE_EXCEPTION:
+ raise LookupError(
+ f"No branches for project {project_name}")
+ else:
+ return default
+
+ if not exclude_unprotected:
+ try:
+ remainder_branches = self.cache.remainder[project_name]
+ except KeyError:
+ if default is RAISE_EXCEPTION:
+ raise LookupError(
+ f"No branches for project {project_name}")
+ else:
+ return default
- if exclude_unprotected:
- if protected_branches is not None:
- return protected_branches
- else:
if remainder_branches is not None:
return (protected_branches or []) + remainder_branches
- return None
+ return protected_branches
def setProjectBranches(self, project_name, exclude_unprotected, branches):
"""Set the branch names for the given project.
+ Use None as a sentinel value for the branches to indicate that
+ there was a fetch error.
+
:param str project_name:
The project for the branches.
:param bool exclude_unprotected:
Whether this is a list of all or only protected branches.
:param list[str] branches:
- The list of branches
+ The list of branches or None to indicate a fetch error.
"""
with locked(self.wlock):
@@ -157,13 +202,13 @@ class BranchCache:
if exclude_unprotected:
self.cache.protected[project_name] = branches
remainder_branches = self.cache.remainder.get(project_name)
- if remainder_branches:
+ if remainder_branches and branches:
remainder = list(set(remainder_branches) -
set(branches))
self.cache.remainder[project_name] = remainder
else:
protected_branches = self.cache.protected.get(project_name)
- if protected_branches:
+ if protected_branches and branches:
remainder = list(set(branches) -
set(protected_branches))
else:
diff --git a/zuul/zk/components.py b/zuul/zk/components.py
index 6554297e1..f538ed43c 100644
--- a/zuul/zk/components.py
+++ b/zuul/zk/components.py
@@ -21,7 +21,7 @@ from kazoo.exceptions import NoNodeError
from kazoo.protocol.states import EventType
from zuul.zk import ZooKeeperBase
-from zuul import model
+from zuul.model_api import MODEL_API
COMPONENTS_ROOT = "/zuul/components"
@@ -123,7 +123,7 @@ class BaseComponent(ZooKeeperBase):
except NoNodeError:
self.log.error("Could not update %s in ZooKeeper", self)
- def register(self, model_api=model.MODEL_API):
+ def register(self, model_api=MODEL_API):
self.content['model_api'] = model_api
with self.register_lock:
path = "/".join([COMPONENTS_ROOT, self.kind, self.hostname])
@@ -346,7 +346,7 @@ class ComponentRegistry(ZooKeeperBase):
# Start with our own version in case we're the only component
# and we haven't registered.
- version = model.MODEL_API
+ version = MODEL_API
for kind, components in self.all():
for component in components:
version = min(version, component.model_api)
@@ -358,28 +358,28 @@ class ComponentRegistry(ZooKeeperBase):
version = self.getMinimumModelApi()
if version != self.model_api:
self.log.info(f"System minimum data model version {version}; "
- f"this component {model.MODEL_API}")
+ f"this component {MODEL_API}")
if self.model_api is None:
- if version < model.MODEL_API:
+ if version < MODEL_API:
self.log.info("The data model version of this component is "
"newer than the rest of the system; this "
"component will operate in compatability mode "
"until the system is upgraded")
- elif version > model.MODEL_API:
+ elif version > MODEL_API:
self.log.error("The data model version of this component is "
"older than the rest of the system; "
"exiting to prevent data corruption")
sys.exit(1)
else:
if version > self.model_api:
- if version > model.MODEL_API:
+ if version > MODEL_API:
self.log.info("The data model version of this component "
"is older than other components in the "
"system, so other components will operate "
"in a compability mode; upgrade this "
"component as soon as possible to complete "
"the system upgrade")
- elif version == model.MODEL_API:
+ elif version == MODEL_API:
self.log.info("The rest of the system has been upgraded "
"to the data model version of this "
"component")
diff --git a/zuul/zk/event_queues.py b/zuul/zk/event_queues.py
index 06127b041..ad7529791 100644
--- a/zuul/zk/event_queues.py
+++ b/zuul/zk/event_queues.py
@@ -28,6 +28,7 @@ from kazoo.protocol.states import EventType
from zuul import model
from zuul.lib.collections import DefaultKeyDict
+from zuul.lib.logutil import get_annotated_logger
from zuul.zk import ZooKeeperSimpleBase, sharding
from zuul.zk.election import SessionAwareElection
@@ -47,6 +48,8 @@ MANAGEMENT_EVENT_TYPE_MAP = {
"PromoteEvent": model.PromoteEvent,
"ReconfigureEvent": model.ReconfigureEvent,
"TenantReconfigureEvent": model.TenantReconfigureEvent,
+ "PipelinePostConfigEvent": model.PipelinePostConfigEvent,
+ "PipelineSemaphoreReleaseEvent": model.PipelineSemaphoreReleaseEvent,
}
# /zuul/events/tenant TENANT_ROOT
@@ -420,7 +423,7 @@ class ZooKeeperEventQueue(ZooKeeperSimpleBase, Iterable):
self.log.error("Removing side channel data: %s", path)
self.kazoo_client.delete(path, recursive=True)
except Exception:
- self.log.execption(
+ self.log.exception(
"Unable to delete side channel data %s", path)
except Exception:
self.log.exception("Error cleaning up event queue %s", self)
@@ -773,7 +776,7 @@ class TriggerEventQueue(ZooKeeperEventQueue):
self._put(data)
def __iter__(self):
- for data, ack_ref, _ in self._iterEvents():
+ for data, ack_ref, zstat in self._iterEvents():
try:
if (data["driver_name"] is None and
data["event_type"] == "SupercedeEvent"):
@@ -790,6 +793,9 @@ class TriggerEventQueue(ZooKeeperEventQueue):
event = event_class.fromDict(event_data)
event.ack_ref = ack_ref
event.driver_name = data["driver_name"]
+ # Initialize the logical timestamp if not valid
+ if event.zuul_event_ltime is None:
+ event.zuul_event_ltime = zstat.creation_transaction_id
yield event
@@ -800,6 +806,28 @@ class TenantTriggerEventQueue(TriggerEventQueue):
queue_root = TENANT_TRIGGER_ROOT.format(
tenant=tenant_name)
super().__init__(client, queue_root, connections)
+ self.metadata = {}
+
+ def _setQueueMetadata(self):
+ encoded_data = json.dumps(
+ self.metadata, sort_keys=True).encode("utf-8")
+ self.kazoo_client.set(self.queue_root, encoded_data)
+
+ def refreshMetadata(self):
+ data, zstat = self.kazoo_client.get(self.queue_root)
+ try:
+ self.metadata = json.loads(data)
+ except json.JSONDecodeError:
+ self.metadata = {}
+
+ @property
+ def last_reconfigure_event_ltime(self):
+ return self.metadata.get('last_reconfigure_event_ltime', -1)
+
+ @last_reconfigure_event_ltime.setter
+ def last_reconfigure_event_ltime(self, val):
+ self.metadata['last_reconfigure_event_ltime'] = val
+ self._setQueueMetadata()
@classmethod
def createRegistry(cls, client, connections):
@@ -851,7 +879,7 @@ class PipelineTriggerEventQueue(TriggerEventQueue):
class ConnectionEventQueue(ZooKeeperEventQueue):
"""Connection events via ZooKeeper"""
- log = logging.getLogger("zuul.zk.event_queues.ConnectionEventQueue")
+ log = logging.getLogger("zuul.ConnectionEventQueue")
def __init__(self, client, connection_name):
queue_root = "/".join((CONNECTION_ROOT, connection_name, "events"))
@@ -873,12 +901,15 @@ class ConnectionEventQueue(ZooKeeperEventQueue):
)
def put(self, data):
- self.log.debug("Submitting connection event to queue %s: %s",
- self.event_root, data)
+ log = self.log
+ if "zuul_event_id" in data:
+ log = get_annotated_logger(log, data["zuul_event_id"])
+ log.debug("Submitting connection event to queue %s: %s",
+ self.event_root, data)
self._put({'event_data': data})
def __iter__(self):
- for data, ack_ref, _ in self._iterEvents():
+ for data, ack_ref, zstat in self._iterEvents():
if not data:
self.log.warning("Malformed event found: %s", data)
self._remove(ack_ref.path)
@@ -887,6 +918,7 @@ class ConnectionEventQueue(ZooKeeperEventQueue):
event = model.ConnectionEvent.fromDict(
data.get('event_data', data))
event.ack_ref = ack_ref
+ event.zuul_event_ltime = zstat.creation_transaction_id
yield event
diff --git a/zuul/zk/job_request_queue.py b/zuul/zk/job_request_queue.py
index bd2b05f32..175c57b90 100644
--- a/zuul/zk/job_request_queue.py
+++ b/zuul/zk/job_request_queue.py
@@ -528,6 +528,9 @@ class JobRequestQueue(ZooKeeperSimpleBase):
for data_id in self.kazoo_client.get_children(self.PARAM_ROOT):
data_path = self._getParamsPath(data_id)
data_zstat = self.kazoo_client.exists(data_path)
+ if not data_zstat:
+ # Node was deleted in the meantime
+ continue
if now - data_zstat.mtime > age:
data_nodes[data_id] = data_path
@@ -569,7 +572,7 @@ class JobRequestQueue(ZooKeeperSimpleBase):
self.log.error("Removing request params: %s", path)
self.kazoo_client.delete(path, recursive=True)
except Exception:
- self.log.execption(
+ self.log.exception(
"Unable to delete request params %s", path)
except Exception:
self.log.exception(
@@ -582,7 +585,7 @@ class JobRequestQueue(ZooKeeperSimpleBase):
self.log.error("Removing request result: %s", path)
self.kazoo_client.delete(path, recursive=True)
except Exception:
- self.log.execption(
+ self.log.exception(
"Unable to delete request params %s", result_id)
for result_id in lost_data:
try:
@@ -591,7 +594,7 @@ class JobRequestQueue(ZooKeeperSimpleBase):
"Removing request result data: %s", path)
self.kazoo_client.delete(path, recursive=True)
except Exception:
- self.log.execption(
+ self.log.exception(
"Unable to delete request params %s", result_id)
except Exception:
self.log.exception(
@@ -605,7 +608,7 @@ class JobRequestQueue(ZooKeeperSimpleBase):
self.log.error("Removing stale lock: %s", lock_path)
self.kazoo_client.delete(lock_path, recursive=True)
except Exception:
- self.log.execption(
+ self.log.exception(
"Unable to delete lock %s", path)
except Exception:
self.log.exception("Error cleaning up locks %s", self)
diff --git a/zuul/zk/layout.py b/zuul/zk/layout.py
index e4369b8af..533226767 100644
--- a/zuul/zk/layout.py
+++ b/zuul/zk/layout.py
@@ -1,4 +1,5 @@
# Copyright 2020 BMW Group
+# Copyright 2022 Acme Gating, LLC
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
@@ -14,11 +15,15 @@
import json
from collections.abc import MutableMapping
+from contextlib import suppress
from functools import total_ordering
+import logging
+import time
from kazoo.exceptions import NoNodeError
-from zuul.zk import ZooKeeperBase
+from zuul.zk.components import COMPONENT_REGISTRY
+from zuul.zk import sharding, ZooKeeperBase
@total_ordering
@@ -44,12 +49,15 @@ class LayoutState:
"""
def __init__(self, tenant_name, hostname, last_reconfigured, uuid,
- branch_cache_min_ltimes, ltime=-1):
+ branch_cache_min_ltimes, last_reconfigure_event_ltime,
+ ltime=-1):
self.uuid = uuid
self.ltime = ltime
self.tenant_name = tenant_name
self.hostname = hostname
self.last_reconfigured = last_reconfigured
+ self.last_reconfigure_event_ltime =\
+ last_reconfigure_event_ltime
self.branch_cache_min_ltimes = branch_cache_min_ltimes
def toDict(self):
@@ -57,6 +65,8 @@ class LayoutState:
"tenant_name": self.tenant_name,
"hostname": self.hostname,
"last_reconfigured": self.last_reconfigured,
+ "last_reconfigure_event_ltime":
+ self.last_reconfigure_event_ltime,
"uuid": self.uuid,
"branch_cache_min_ltimes": self.branch_cache_min_ltimes,
}
@@ -69,6 +79,7 @@ class LayoutState:
data["last_reconfigured"],
data.get("uuid"),
data.get("branch_cache_min_ltimes"),
+ data.get("last_reconfigure_event_ltime", -1),
data.get("ltime", -1),
)
@@ -92,8 +103,10 @@ class LayoutState:
class LayoutStateStore(ZooKeeperBase, MutableMapping):
+ log = logging.getLogger("zuul.LayoutStore")
layout_root = "/zuul/layout"
+ layout_data_root = "/zuul/layout-data"
def __init__(self, client, callback):
super().__init__(client)
@@ -154,3 +167,55 @@ class LayoutStateStore(ZooKeeperBase, MutableMapping):
if zstat is None:
return 0
return zstat.children_count
+
+ def getMinLtimes(self, layout_state):
+ if COMPONENT_REGISTRY.model_api < 6:
+ return None
+ try:
+ path = f"{self.layout_data_root}/{layout_state.uuid}"
+ with sharding.BufferedShardReader(
+ self.kazoo_client, path) as stream:
+ data = stream.read()
+ except NoNodeError:
+ return None
+
+ try:
+ return json.loads(data)['min_ltimes']
+ except Exception:
+ return None
+
+ def setMinLtimes(self, layout_state, min_ltimes):
+ data = dict(min_ltimes=min_ltimes)
+ encoded_data = json.dumps(data).encode("utf-8")
+
+ path = f"{self.layout_data_root}/{layout_state.uuid}"
+ with sharding.BufferedShardWriter(
+ self.kazoo_client, path) as stream:
+ stream.write(encoded_data)
+
+ def cleanup(self, delay=300):
+ self.log.debug("Starting layout data cleanup")
+ known_layouts = set()
+ for tenant in self.kazoo_client.get_children(
+ self.layout_root):
+ state = self.get(tenant)
+ if state:
+ known_layouts.add(state.uuid)
+
+ for layout_uuid in self.kazoo_client.get_children(
+ self.layout_data_root):
+ if layout_uuid in known_layouts:
+ continue
+
+ path = f"{self.layout_data_root}/{layout_uuid}"
+ zstat = self.kazoo_client.exists(path)
+ if zstat is None:
+ continue
+
+ now = time.time()
+ if now - zstat.created >= delay:
+ self.log.debug("Deleting unused layout data for %s",
+ layout_uuid)
+ with suppress(NoNodeError):
+ self.kazoo_client.delete(path, recursive=True)
+ self.log.debug("Finished layout data cleanup")
diff --git a/zuul/zk/nodepool.py b/zuul/zk/nodepool.py
index 482585149..1be4dc2b5 100644
--- a/zuul/zk/nodepool.py
+++ b/zuul/zk/nodepool.py
@@ -12,6 +12,7 @@
import json
import logging
+import os
import time
from enum import Enum
from typing import Optional, List
@@ -43,7 +44,7 @@ class ZooKeeperNodepool(ZooKeeperBase):
Class implementing Nodepool related ZooKeeper interface.
"""
NODES_ROOT = "/nodepool/nodes"
- LAUNCHER_ROOT = "/nodepool/launchers"
+ COMPONENT_ROOT = "/nodepool/components"
REQUEST_ROOT = '/nodepool/requests'
REQUEST_LOCK_ROOT = "/nodepool/requests-lock"
HOLD_REQUEST_ROOT = '/zuul/hold-requests'
@@ -95,9 +96,6 @@ class ZooKeeperNodepool(ZooKeeperBase):
self._node_tree.close()
self._node_tree = None
- def _launcherPath(self, launcher):
- return "%s/%s" % (self.LAUNCHER_ROOT, launcher)
-
def _nodePath(self, node):
return "%s/%s" % (self.NODES_ROOT, node)
@@ -113,15 +111,15 @@ class ZooKeeperNodepool(ZooKeeperBase):
:returns: A list of Launcher objects, or empty list if none are found.
"""
+ root_path = os.path.join(self.COMPONENT_ROOT, 'pool')
try:
- launcher_ids = self.kazoo_client\
- .get_children(self.LAUNCHER_ROOT)
+ pools = self.kazoo_client.get_children(root_path)
except NoNodeError:
return []
objs = []
- for launcher in launcher_ids:
- path = self._launcherPath(launcher)
+ for pool in pools:
+ path = os.path.join(root_path, pool)
try:
data, _ = self.kazoo_client.get(path)
except NoNodeError:
@@ -193,11 +191,11 @@ class ZooKeeperNodepool(ZooKeeperBase):
node.stat = stat
return node
- def nodeIterator(self):
+ def nodeIterator(self, cached=False):
"""
Utility generator method for iterating through all nodes.
"""
- for node_id in self.getNodes():
+ for node_id in self.getNodes(cached):
node = self.getNode(node_id)
if node:
yield node
diff --git a/zuul/zk/semaphore.py b/zuul/zk/semaphore.py
index bffc3ea8a..b45612c04 100644
--- a/zuul/zk/semaphore.py
+++ b/zuul/zk/semaphore.py
@@ -39,14 +39,27 @@ class SemaphoreHandler(ZooKeeperSimpleBase):
log = logging.getLogger("zuul.zk.SemaphoreHandler")
semaphore_root = "/zuul/semaphores"
+ global_semaphore_root = "/zuul/global-semaphores"
- def __init__(self, client, statsd, tenant_name, layout):
+ def __init__(self, client, statsd, tenant_name, layout, abide,
+ read_only=False):
super().__init__(client)
+ if read_only:
+ statsd = None
+ self.read_only = read_only
+ self.abide = abide
self.layout = layout
self.statsd = statsd
self.tenant_name = tenant_name
self.tenant_root = f"{self.semaphore_root}/{tenant_name}"
+ def _makePath(self, semaphore):
+ semaphore_key = quote_plus(semaphore.name)
+ if semaphore.global_scope:
+ return f"{self.global_semaphore_root}/{semaphore_key}"
+ else:
+ return f"{self.tenant_root}/{semaphore_key}"
+
def _emitStats(self, semaphore_path, num_holders):
if self.statsd is None:
return
@@ -62,6 +75,8 @@ class SemaphoreHandler(ZooKeeperSimpleBase):
self.log.exception("Unable to send semaphore stats:")
def acquire(self, item, job, request_resources):
+ if self.read_only:
+ raise RuntimeError("Read-only semaphore handler")
if not job.semaphores:
return True
@@ -80,8 +95,8 @@ class SemaphoreHandler(ZooKeeperSimpleBase):
return False
return True
- def _acquire_one(self, log, item, job, request_resources, semaphore):
- if semaphore.resources_first and request_resources:
+ def _acquire_one(self, log, item, job, request_resources, job_semaphore):
+ if job_semaphore.resources_first and request_resources:
# We're currently in the resource request phase and want to get the
# resources before locking. So we don't need to do anything here.
return True
@@ -92,8 +107,8 @@ class SemaphoreHandler(ZooKeeperSimpleBase):
# the resources phase.
pass
- semaphore_key = quote_plus(semaphore.name)
- semaphore_path = f"{self.tenant_root}/{semaphore_key}"
+ semaphore = self.layout.getSemaphore(self.abide, job_semaphore.name)
+ semaphore_path = self._makePath(semaphore)
semaphore_handle = {
"buildset_path": item.current_build_set.getPath(),
"job_name": job.name,
@@ -139,10 +154,13 @@ class SemaphoreHandler(ZooKeeperSimpleBase):
return holdersFromData(data), zstat
def getSemaphores(self):
- try:
- return self.kazoo_client.get_children(self.tenant_root)
- except NoNodeError:
- return []
+ ret = []
+ for root in (self.global_semaphore_root, self.tenant_root):
+ try:
+ ret.extend(self.kazoo_client.get_children(root))
+ except NoNodeError:
+ pass
+ return ret
def _release(self, log, semaphore_path, semaphore_handle, quiet,
legacy_handle=None):
@@ -178,28 +196,38 @@ class SemaphoreHandler(ZooKeeperSimpleBase):
break
def release(self, sched, item, job, quiet=False):
+ if self.read_only:
+ raise RuntimeError("Read-only semaphore handler")
if not job.semaphores:
return
log = get_annotated_logger(self.log, item.event)
- for semaphore in job.semaphores:
- self._release_one(log, item, job, semaphore, quiet)
+ for job_semaphore in job.semaphores:
+ self._release_one(log, item, job, job_semaphore, quiet)
# If a scheduler has been provided (which it is except in the
# case of a rollback from acquire in this class), broadcast an
# event to trigger pipeline runs.
if sched is None:
return
- for pipeline_name in self.layout.pipelines.keys():
- event = PipelineSemaphoreReleaseEvent()
- sched.pipeline_management_events[
- self.tenant_name][pipeline_name].put(
- event, needs_result=False)
- def _release_one(self, log, item, job, semaphore, quiet):
- semaphore_key = quote_plus(semaphore.name)
- semaphore_path = f"{self.tenant_root}/{semaphore_key}"
+ semaphore = self.layout.getSemaphore(self.abide, job_semaphore.name)
+ if semaphore.global_scope:
+ tenants = [t for t in self.abide.tenants.values()
+ if job_semaphore.name in t.global_semaphores]
+ else:
+ tenants = [self.abide.tenants[self.tenant_name]]
+ for tenant in tenants:
+ for pipeline_name in tenant.layout.pipelines.keys():
+ event = PipelineSemaphoreReleaseEvent()
+ sched.pipeline_management_events[
+ tenant.name][pipeline_name].put(
+ event, needs_result=False)
+
+ def _release_one(self, log, item, job, job_semaphore, quiet):
+ semaphore = self.layout.getSemaphore(self.abide, job_semaphore.name)
+ semaphore_path = self._makePath(semaphore)
semaphore_handle = {
"buildset_path": item.current_build_set.getPath(),
"job_name": job.name,
@@ -209,19 +237,21 @@ class SemaphoreHandler(ZooKeeperSimpleBase):
legacy_handle)
def semaphoreHolders(self, semaphore_name):
- semaphore_key = quote_plus(semaphore_name)
- semaphore_path = f"{self.tenant_root}/{semaphore_key}"
+ semaphore = self.layout.getSemaphore(self.abide, semaphore_name)
+ semaphore_path = self._makePath(semaphore)
try:
holders, _ = self.getHolders(semaphore_path)
except NoNodeError:
holders = []
return holders
- def _max_count(self, semaphore_name: str) -> int:
- semaphore = self.layout.semaphores.get(semaphore_name)
+ def _max_count(self, semaphore_name):
+ semaphore = self.layout.getSemaphore(self.abide, semaphore_name)
return 1 if semaphore is None else semaphore.max
def cleanupLeaks(self):
+ if self.read_only:
+ raise RuntimeError("Read-only semaphore handler")
# MODEL_API: >1
if COMPONENT_REGISTRY.model_api < 2:
self.log.warning("Skipping semaphore cleanup since minimum model "
@@ -240,8 +270,9 @@ class SemaphoreHandler(ZooKeeperSimpleBase):
is not None):
continue
- semaphore_key = quote_plus(semaphore_name)
- semaphore_path = f"{self.tenant_root}/{semaphore_key}"
+ semaphore = self.layout.getSemaphore(
+ self.abide, semaphore_name)
+ semaphore_path = self._makePath(semaphore)
self.log.error("Releasing leaked semaphore %s held by %s",
semaphore_path, holder)
self._release(self.log, semaphore_path, holder, quiet=False)
diff --git a/zuul/zk/zkobject.py b/zuul/zk/zkobject.py
index 3905e254c..8de3f34ba 100644
--- a/zuul/zk/zkobject.py
+++ b/zuul/zk/zkobject.py
@@ -22,11 +22,16 @@ from kazoo.exceptions import NodeExistsError, NoNodeError
from kazoo.retry import KazooRetry
from zuul.zk import sharding
+from zuul.zk import ZooKeeperClient
class ZKContext:
def __init__(self, zk_client, lock, stop_event, log):
- self.client = zk_client.client
+ if isinstance(zk_client, ZooKeeperClient):
+ client = zk_client.client
+ else:
+ client = zk_client
+ self.client = client
self.lock = lock
self.stop_event = stop_event
self.log = log
@@ -38,6 +43,7 @@ class ZKContext:
self.cumulative_write_znodes = 0
self.cumulative_read_bytes = 0
self.cumulative_write_bytes = 0
+ self.build_references = False
def sessionIsValid(self):
return ((not self.lock or self.lock.is_still_valid()) and
@@ -46,6 +52,16 @@ class ZKContext:
def sessionIsInvalid(self):
return not self.sessionIsValid()
+ def updateStatsFromOtherContext(self, other):
+ self.cumulative_read_time += other.cumulative_read_time
+ self.cumulative_write_time += other.cumulative_write_time
+ self.cumulative_read_objects += other.cumulative_read_objects
+ self.cumulative_write_objects += other.cumulative_write_objects
+ self.cumulative_read_znodes += other.cumulative_read_znodes
+ self.cumulative_write_znodes += other.cumulative_write_znodes
+ self.cumulative_read_bytes += other.cumulative_read_bytes
+ self.cumulative_write_bytes += other.cumulative_write_bytes
+
class LocalZKContext:
"""A Local ZKContext that means don't actually write anything to ZK"""