diff --git a/.github/workflows/selfdrive_tests.yaml b/.github/workflows/selfdrive_tests.yaml index 9653a18fdd3743..aa217735bfb4a5 100644 --- a/.github/workflows/selfdrive_tests.yaml +++ b/.github/workflows/selfdrive_tests.yaml @@ -146,13 +146,6 @@ jobs: if: github.ref == 'refs/heads/master' && github.event_name != 'pull_request' && github.repository == 'commaai/openpilot' needs: static_analysis # hack to ensure slow tests run first since this and static_analysis are fast steps: - - name: Get current date - id: date - run: echo "::set-output name=time::$(date +'%s')" - - name: Output timestamp - run: echo $TIMESTAMP - env: - TIMESTAMP: ${{ steps.date.outputs.time }} - uses: actions/checkout@v2 with: submodules: true @@ -217,6 +210,13 @@ jobs: runs-on: ubuntu-20.04 timeout-minutes: 50 steps: + - name: Get current date + id: date + run: echo "::set-output name=time::$(date +'%s')" + - name: Output timestamp + run: echo $TIMESTAMP + env: + TIMESTAMP: ${{ steps.date.outputs.time }} - uses: actions/checkout@v2 with: submodules: true diff --git a/Jenkinsfile b/Jenkinsfile index 29edbeb1726e2b..64ca4bfa24f5e8 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -37,7 +37,7 @@ EOF""" def phone_steps(String device_type, steps) { lock(resource: "", label: device_type, inversePrecedence: true, variable: 'device_ip', quantity: 1) { - timeout(time: 150, unit: 'MINUTES') { + timeout(time: 60, unit: 'MINUTES') { phone(device_ip, "git checkout", readFile("selfdrive/test/setup_device_ci.sh"),) steps.each { item -> phone(device_ip, item[0], item[1]) @@ -53,7 +53,7 @@ pipeline { SOURCE_DIR = "/data/openpilot_source/" } options { - timeout(time: 3, unit: 'HOURS') + timeout(time: 4, unit: 'HOURS') } stages { diff --git a/Pipfile b/Pipfile index 6949c5c52e6459..3fc26b363bd7cf 100644 --- a/Pipfile +++ b/Pipfile @@ -4,82 +4,33 @@ url = "https://pypi.org/simple" verify_ssl = true [dev-packages] -aenum = "*" -aiohttp = "*" -azure-cli-core = "*" -azure-common = "*" -azure-core = "*" -azure-nspkg = "~=3.0" -azure-storage-blob = "~=2.1" -azure-storage-common = "~=2.1" -azure-storage-nspkg = "~=3.1" -"backports.lzma" = "*" -boto = "*" -boto3 = "*" control = "*" coverage = "*" -datadog = "*" dictdiffer = "*" -elasticsearch = "*" fastcluster = "*" -Flask-Cors = "*" -Flask-SocketIO = "*" -ft4222 = "*" -GeoAlchemy2 = "*" -git-pylint-commit-hook = "*" -gunicorn = "*" -h5py = "*" hexdump = "*" hypothesis = "*" -imageio = "*" inputs = "*" -ipykernel = "*" -ipython = "*" -joblib = "*" -json-logging-py = "*" -jupyter = "*" -jupyterlab = "*" -jupyterlab-vim = "*" -keras_applications = "*" lru-dict = "*" markdown-it-py = "*" matplotlib = "*" -mock = "*" -mpld3 = "*" -msgpack-python = "*" mypy = "*" myst-parser = "*" -networkx = "~=2.3" numpy = "*" opencv-python-headless = "*" -osmium = "*" parameterized = "*" paramiko = "*" pprofile = "*" pre-commit = "*" pycurl = "*" pygame = "*" -Pygments = "*" -pymongo = "*" -PyMySQL = "~=0.9" -pynmea2 = "*" pyprof2calltree = "*" -pyproj = "*" -python-logstash = "*" -redis = "*" reverse_geocoder = "*" -s2sphere = "*" -scikit-image = "*" scipy = "*" -seaborn = "*" -Shapely = "*" -simplejson = "*" sphinx = "*" sphinx-rtd-theme = "*" -SQLAlchemy = "*" subprocess32 = "*" tenacity = "*" -Werkzeug = "*" [packages] atomicwrites = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 8aacbcbd72bdcd..a1aaeb8766e477 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "5c7313dae29ab23058c6045053416ab27993a827b4b19c0fc1d7fbf1cb9c9fd3" + "sha256": "c0f1a46ca2ccdc208a392c5ce78d9d928f82d40afd46a33da7b99b895798fce2" }, "pipfile-spec": 6, "requires": { @@ -18,11 +18,11 @@ "default": { "astroid": { "hashes": [ - "sha256:0755c998e7117078dcb7d0bda621391dd2a85da48052d948c7411ab187325346", - "sha256:1e83a69fd51b013ebf5912d26b9338d6643a55fec2f20c787792680610eed4a2" + "sha256:11f7356737b624c42e21e71fe85eea6875cb94c03c82ac76bd535a0ff10b0f25", + "sha256:abc423a1e85bc1553954a14f2053473d2b7f8baf32eae62a328be24f436b5107" ], "markers": "python_version ~= '3.6'", - "version": "==2.8.4" + "version": "==2.8.5" }, "atomicwrites": { "hashes": [ @@ -292,11 +292,11 @@ }, "isort": { "hashes": [ - "sha256:1a18ccace2ed8910bd9458b74a3ecbafd7b2f581301b0ab65cfdd4338272d76f", - "sha256:e52ff6d38012b131628cf0f26c51e7bd3a7c81592eefe3ac71411e692f1b9345" + "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7", + "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951" ], "markers": "python_version < '4' and python_full_version >= '3.6.1'", - "version": "==5.10.0" + "version": "==5.10.1" }, "itsdangerous": { "hashes": [ @@ -308,11 +308,11 @@ }, "jinja2": { "hashes": [ - "sha256:827a0e32839ab1600d4eb1c4c33ec5a8edfbc5cb42dafa13b81f182f97784b45", - "sha256:8569982d3f0889eed11dd620c706d39b60c36d6d25843961f33f77fb6bc6b20c" + "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8", + "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7" ], "index": "pypi", - "version": "==3.0.2" + "version": "==3.0.3" }, "json-rpc": { "hashes": [ @@ -974,12 +974,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e", - "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7", - "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34" + "sha256:2cdf80e4e04866a9b3689a51869016d36db0814d84b8d8a568d22781d45d27ed", + "sha256:829704698b22e13ec9eaf959122315eabb370b0884400e9818334d8b677023d9" ], "markers": "python_version < '3.10'", - "version": "==3.10.0.2" + "version": "==4.0.0" }, "urllib3": { "hashes": [ @@ -1071,101 +1070,6 @@ } }, "develop": { - "aenum": { - "hashes": [ - "sha256:1d494e4d3b3e3e95389aee420203d945776d2430ee9a3d4f162e267b3a7ec3a6", - "sha256:a3e86312ca58611236900b77e863d2b9034dfe8956a089a2935b55974eb33f1f", - "sha256:c3dba3d5482d09ea371651d8da08cb21e0b8a826970bb08a3b30789b4a7b91a9" - ], - "index": "pypi", - "version": "==3.1.3" - }, - "aiohttp": { - "hashes": [ - "sha256:09754a0d5eaab66c37591f2f8fac8f9781a5f61d51aa852a3261c4805ca6b984", - "sha256:097ecf52f6b9859b025c1e36401f8aa4573552e887d1b91b4b999d68d0b5a3b3", - "sha256:0a96473a1f61d7920a9099bc8e729dc8282539d25f79c12573ee0fdb9c8b66a8", - "sha256:0af379221975054162959e00daf21159ff69a712fc42ed0052caddbd70d52ff4", - "sha256:0d7b056fd3972d353cb4bc305c03f9381583766b7f8c7f1c44478dba69099e33", - "sha256:14a6f026eca80dfa3d52e86be89feb5cd878f6f4a6adb34457e2c689fd85229b", - "sha256:15a660d06092b7c92ed17c1dbe6c1eab0a02963992d60e3e8b9d5fa7fa81f01e", - "sha256:1fa9f50aa1f114249b7963c98e20dc35c51be64096a85bc92433185f331de9cc", - "sha256:257f4fad1714d26d562572095c8c5cd271d5a333252795cb7a002dca41fdbad7", - "sha256:28369fe331a59d80393ec82df3d43307c7461bfaf9217999e33e2acc7984ff7c", - "sha256:2bdd655732e38b40f8a8344d330cfae3c727fb257585df923316aabbd489ccb8", - "sha256:2f44d1b1c740a9e2275160d77c73a11f61e8a916191c572876baa7b282bcc934", - "sha256:3ba08a71caa42eef64357257878fb17f3fba3fba6e81a51d170e32321569e079", - "sha256:3c5e9981e449d54308c6824f172ec8ab63eb9c5f922920970249efee83f7e919", - "sha256:3f58aa995b905ab82fe228acd38538e7dc1509e01508dcf307dad5046399130f", - "sha256:48c996eb91bfbdab1e01e2c02e7ff678c51e2b28e3a04e26e41691991cc55795", - "sha256:48f218a5257b6bc16bcf26a91d97ecea0c7d29c811a90d965f3dd97c20f016d6", - "sha256:4a6551057a846bf72c7a04f73de3fcaca269c0bd85afe475ceb59d261c6a938c", - "sha256:51f90dabd9933b1621260b32c2f0d05d36923c7a5a909eb823e429dba0fd2f3e", - "sha256:577cc2c7b807b174814dac2d02e673728f2e46c7f90ceda3a70ea4bb6d90b769", - "sha256:5d79174d96446a02664e2bffc95e7b6fa93b9e6d8314536c5840dff130d0878b", - "sha256:5e3f81fbbc170418e22918a9585fd7281bbc11d027064d62aa4b507552c92671", - "sha256:5ecffdc748d3b40dd3618ede0170e4f5e1d3c9647cfb410d235d19e62cb54ee0", - "sha256:63fa57a0708573d3c059f7b5527617bd0c291e4559298473df238d502e4ab98c", - "sha256:67ca7032dfac8d001023fadafc812d9f48bf8a8c3bb15412d9cdcf92267593f4", - "sha256:688a1eb8c1a5f7e795c7cb67e0fe600194e6723ba35f138dfae0db20c0cb8f94", - "sha256:6a038cb1e6e55b26bb5520ccffab7f539b3786f5553af2ee47eb2ec5cbd7084e", - "sha256:6b79f6c31e68b6dafc0317ec453c83c86dd8db1f8f0c6f28e97186563fca87a0", - "sha256:6d3e027fe291b77f6be9630114a0200b2c52004ef20b94dc50ca59849cd623b3", - "sha256:6f1d39a744101bf4043fa0926b3ead616607578192d0a169974fb5265ab1e9d2", - "sha256:707adc30ea6918fba725c3cb3fe782d271ba352b22d7ae54a7f9f2e8a8488c41", - "sha256:730b7c2b7382194d9985ffdc32ab317e893bca21e0665cb1186bdfbb4089d990", - "sha256:764c7c6aa1f78bd77bd9674fc07d1ec44654da1818d0eef9fb48aa8371a3c847", - "sha256:78d51e35ed163783d721b6f2ce8ce3f82fccfe471e8e50a10fba13a766d31f5a", - "sha256:7a315ceb813208ef32bdd6ec3a85cbe3cb3be9bbda5fd030c234592fa9116993", - "sha256:7ba09bb3dcb0b7ec936a485db2b64be44fe14cdce0a5eac56f50e55da3627385", - "sha256:7d76e8a83396e06abe3df569b25bd3fc88bf78b7baa2c8e4cf4aaf5983af66a3", - "sha256:84fe1732648c1bc303a70faa67cbc2f7f2e810c8a5bca94f6db7818e722e4c0a", - "sha256:871d4fdc56288caa58b1094c20f2364215f7400411f76783ea19ad13be7c8e19", - "sha256:88d4917c30fcd7f6404fb1dc713fa21de59d3063dcc048f4a8a1a90e6bbbd739", - "sha256:8a50150419b741ee048b53146c39c47053f060cb9d98e78be08fdbe942eaa3c4", - "sha256:90a97c2ed2830e7974cbe45f0838de0aefc1c123313f7c402e21c29ec063fbb4", - "sha256:949a605ef3907254b122f845baa0920407080cdb1f73aa64f8d47df4a7f4c4f9", - "sha256:9689af0f0a89e5032426c143fa3683b0451f06c83bf3b1e27902bd33acfae769", - "sha256:98b1ea2763b33559dd9ec621d67fc17b583484cb90735bfb0ec3614c17b210e4", - "sha256:9951c2696c4357703001e1fe6edc6ae8e97553ac630492ea1bf64b429cb712a3", - "sha256:9a52b141ff3b923a9166595de6e3768a027546e75052ffba267d95b54267f4ab", - "sha256:9e8723c3256641e141cd18f6ce478d54a004138b9f1a36e41083b36d9ecc5fc5", - "sha256:a2fee4d656a7cc9ab47771b2a9e8fad8a9a33331c1b59c3057ecf0ac858f5bfe", - "sha256:a4759e85a191de58e0ea468ab6fd9c03941986eee436e0518d7a9291fab122c8", - "sha256:a5399a44a529083951b55521cf4ecbf6ad79fd54b9df57dbf01699ffa0549fc9", - "sha256:a6074a3b2fa2d0c9bf0963f8dfc85e1e54a26114cc8594126bc52d3fa061c40e", - "sha256:a84c335337b676d832c1e2bc47c3a97531b46b82de9f959dafb315cbcbe0dfcd", - "sha256:adf0cb251b1b842c9dee5cfcdf880ba0aae32e841b8d0e6b6feeaef002a267c5", - "sha256:b76669b7c058b8020b11008283c3b8e9c61bfd978807c45862956119b77ece45", - "sha256:bda75d73e7400e81077b0910c9a60bf9771f715420d7e35fa7739ae95555f195", - "sha256:be03a7483ad9ea60388f930160bb3728467dd0af538aa5edc60962ee700a0bdc", - "sha256:c62d4791a8212c885b97a63ef5f3974b2cd41930f0cd224ada9c6ee6654f8150", - "sha256:cb751ef712570d3bda9a73fd765ff3e1aba943ec5d52a54a0c2e89c7eef9da1e", - "sha256:d3b19d8d183bcfd68b25beebab8dc3308282fe2ca3d6ea3cb4cd101b3c279f8d", - "sha256:d3f90ee275b1d7c942e65b5c44c8fb52d55502a0b9a679837d71be2bd8927661", - "sha256:d5f8c04574efa814a24510122810e3a3c77c0552f9f6ff65c9862f1f046be2c3", - "sha256:d6a1a66bb8bac9bc2892c2674ea363486bfb748b86504966a390345a11b1680e", - "sha256:d7715daf84f10bcebc083ad137e3eced3e1c8e7fa1f096ade9a8d02b08f0d91c", - "sha256:dafc01a32b4a1d7d3ef8bfd3699406bb44f7b2e0d3eb8906d574846e1019b12f", - "sha256:dcc4d5dd5fba3affaf4fd08f00ef156407573de8c63338787614ccc64f96b321", - "sha256:de42f513ed7a997bc821bddab356b72e55e8396b1b7ba1bf39926d538a76a90f", - "sha256:e27cde1e8d17b09730801ce97b6e0c444ba2a1f06348b169fd931b51d3402f0d", - "sha256:ecb314e59bedb77188017f26e6b684b1f6d0465e724c3122a726359fa62ca1ba", - "sha256:f348ebd20554e8bc26e8ef3ed8a134110c0f4bf015b3b4da6a4ddf34e0515b19", - "sha256:fa818609357dde5c4a94a64c097c6404ad996b1d38ca977a72834b682830a722", - "sha256:fe4a327da0c6b6e59f2e474ae79d6ee7745ac3279fd15f200044602fa31e3d79" - ], - "index": "pypi", - "version": "==3.8.0" - }, - "aiosignal": { - "hashes": [ - "sha256:26e62109036cd181df6e6ad646f91f0dcfd05fe16d0cb924138ff2ab75d64e3a", - "sha256:78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2" - ], - "markers": "python_version >= '3.6'", - "version": "==1.2.0" - }, "alabaster": { "hashes": [ "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359", @@ -1173,61 +1077,6 @@ ], "version": "==0.7.12" }, - "anyio": { - "hashes": [ - "sha256:4fd09a25ab7fa01d34512b7249e366cd10358cdafc95022c7ff8c8f8a5026d66", - "sha256:67da67b5b21f96b9d3d65daa6ea99f5d5282cb09f50eb4456f8fb51dffefc3ff" - ], - "markers": "python_full_version >= '3.6.2'", - "version": "==3.3.4" - }, - "applicationinsights": { - "hashes": [ - "sha256:0b761f3ef0680acf4731906dfc1807faa6f2a57168ae74592db0084a6099f7b3", - "sha256:e89a890db1c6906b6a7d0bcfd617dac83974773c64573147c8d6654f9cf2a6ea" - ], - "version": "==0.11.10" - }, - "argcomplete": { - "hashes": [ - "sha256:291f0beca7fd49ce285d2f10e4c1c77e9460cf823eef2de54df0c0fec88b0d81", - "sha256:2c7dbffd8c045ea534921e63b0be6fe65e88599990d8dc408ac8c542b72a5445" - ], - "version": "==1.12.3" - }, - "argon2-cffi": { - "hashes": [ - "sha256:165cadae5ac1e26644f5ade3bd9c18d89963be51d9ea8817bd671006d7909057", - "sha256:217b4f0f853ccbbb5045242946ad2e162e396064575860141b71a85eb47e475a", - "sha256:245f64a203012b144b7b8c8ea6d468cb02b37caa5afee5ba4a10c80599334f6a", - "sha256:4ad152c418f7eb640eac41ac815534e6aa61d1624530b8e7779114ecfbf327f8", - "sha256:566ffb581bbd9db5562327aee71b2eda24a1c15b23a356740abe3c011bbe0dcb", - "sha256:65213a9174320a1aee03fe826596e0620783966b49eb636955958b3074e87ff9", - "sha256:bc513db2283c385ea4da31a2cd039c33380701f376f4edd12fe56db118a3b21a", - "sha256:c7a7c8cc98ac418002090e4add5bebfff1b915ea1cb459c578cd8206fef10378", - "sha256:e4d8f0ae1524b7b0372a3e574a2561cbdddb3fdb6c28b70a72868189bda19659", - "sha256:f710b61103d1a1f692ca3ecbd1373e28aa5e545ac625ba067ff2feca1b2bb870", - "sha256:fa7e7d1fc22514a32b1761fdfa1882b6baa5c36bb3ef557bdd69e6fc9ba14a41" - ], - "markers": "python_version >= '3.5'", - "version": "==21.1.0" - }, - "astroid": { - "hashes": [ - "sha256:0755c998e7117078dcb7d0bda621391dd2a85da48052d948c7411ab187325346", - "sha256:1e83a69fd51b013ebf5912d26b9338d6643a55fec2f20c787792680610eed4a2" - ], - "markers": "python_version ~= '3.6'", - "version": "==2.8.4" - }, - "async-timeout": { - "hashes": [ - "sha256:7d87a4e8adba8ededb52e579ce6bc8276985888913620c935094c2276fd83382", - "sha256:f3303dddf6cafa748a92747ab6c2ecf60e0aeca769aee4c151adfce243a05d9b" - ], - "markers": "python_version >= '3.6'", - "version": "==4.0.0" - }, "attrs": { "hashes": [ "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1", @@ -1236,77 +1085,6 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", "version": "==21.2.0" }, - "azure-cli-core": { - "hashes": [ - "sha256:259f2721c85a19f3d1285289121702d7388dd1dc8df99a3eee804ef08b06275d", - "sha256:d074c21b591036cdac1f7df1e1912145a646165710ce5ac54526423aee4951eb" - ], - "index": "pypi", - "version": "==2.30.0" - }, - "azure-cli-telemetry": { - "hashes": [ - "sha256:05c11939b8ed9a98b8bad1d0201909ff7c33671aaa4a98932069594e815aefbe", - "sha256:fc6cadf59f14f3bbd6c01d1b4d6ad54cfc1456303510d8bdb6206db08c40e661" - ], - "version": "==1.0.6" - }, - "azure-common": { - "hashes": [ - "sha256:426673962740dbe9aab052a4b52df39c07767decd3f25fdc87c9d4c566a04934", - "sha256:9f3f5d991023acbd93050cf53c4e863c6973ded7e236c69e99c8ff5c7bad41ef" - ], - "index": "pypi", - "version": "==1.1.27" - }, - "azure-core": { - "hashes": [ - "sha256:1202c6600e991193d79ff1fdcdcc914e347746609404f960ce7e1bb8df1bec32", - "sha256:7a1654d08b568abe847c72d9b084e7fdfff6baf11afa2cd1905f73cdf2f15447" - ], - "index": "pypi", - "version": "==1.20.0" - }, - "azure-mgmt-core": { - "hashes": [ - "sha256:3ffb7352b39e5495dccc2d2b47254f4d82747aff4735e8bf3267c335b0c9bb40", - "sha256:7b7fa952aeb9d3eaa13eff905880f3d3b62200f7be7a8ba5a50c8b2e7295322a" - ], - "version": "==1.3.0" - }, - "azure-nspkg": { - "hashes": [ - "sha256:1d0bbb2157cf57b1bef6c8c8e5b41133957364456c43b0a43599890023cca0a8", - "sha256:31a060caca00ed1ebd369fc7fe01a56768c927e404ebc92268f4d9d636435e28", - "sha256:e7d3cea6af63e667d87ba1ca4f8cd7cb4dfca678e4c55fc1cedb320760e39dd0" - ], - "index": "pypi", - "version": "==3.0.2" - }, - "azure-storage-blob": { - "hashes": [ - "sha256:a8e91a51d4f62d11127c7fd8ba0077385c5b11022f0269f8a2a71b9fc36bef31", - "sha256:b90323aad60f207f9f90a0c4cf94c10acc313c20b39403398dfba51f25f7b454" - ], - "index": "pypi", - "version": "==2.1.0" - }, - "azure-storage-common": { - "hashes": [ - "sha256:b01a491a18839b9d05a4fe3421458a0ddb5ab9443c14e487f40d16f9a1dc2fbe", - "sha256:ccedef5c67227bc4d6670ffd37cec18fb529a1b7c3a5e53e4096eb0cf23dc73f" - ], - "index": "pypi", - "version": "==2.1.0" - }, - "azure-storage-nspkg": { - "hashes": [ - "sha256:6f3bbe8652d5f542767d8433e7f96b8df7f518774055ac7c92ed7ca85f653811", - "sha256:7da3bd6c73b8c464a57f53ae9af8328490d2267c66430d8a7621997e52a9703e" - ], - "index": "pypi", - "version": "==3.1.0" - }, "babel": { "hashes": [ "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9", @@ -1315,27 +1093,13 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.9.1" }, - "backcall": { - "hashes": [ - "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e", - "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255" - ], - "version": "==0.2.0" - }, "backports.entry-points-selectable": { "hashes": [ - "sha256:988468260ec1c196dab6ae1149260e2f5472c9110334e5d51adcb77867361f6a", - "sha256:a6d9a871cde5e15b4c4a53e3d43ba890cc6861ec1332c9c2428c92f977192acc" + "sha256:7fceed9532a7aa2bd888654a7314f864a3c16a4e710b34a58cfc0f08114c663b", + "sha256:914b21a479fde881635f7af5adc7f6e38d6b274be32269070c53b698c60d5386" ], "markers": "python_version >= '2.7'", - "version": "==1.1.0" - }, - "backports.lzma": { - "hashes": [ - "sha256:16d8b68e4d3cd4e6c9ddb059850452946da3914c8a8e197a7f2b0954559f2df4" - ], - "index": "pypi", - "version": "==0.0.14" + "version": "==1.1.1" }, "bcrypt": { "hashes": [ @@ -1350,46 +1114,6 @@ "markers": "python_version >= '3.6'", "version": "==3.2.0" }, - "bidict": { - "hashes": [ - "sha256:3ac67daa353ecf853a1df9d3e924f005e729227a60a8dbada31a4c31aba7f654", - "sha256:42c84ffbe6f8de898af6073b4be9ea7ccedcd78d3474aa844c54e49d5a079f6f" - ], - "markers": "python_version >= '3.6'", - "version": "==0.21.4" - }, - "bleach": { - "hashes": [ - "sha256:0900d8b37eba61a802ee40ac0061f8c2b5dee29c1927dd1d233e075ebf5a71da", - "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994" - ], - "markers": "python_version >= '3.6'", - "version": "==4.1.0" - }, - "boto": { - "hashes": [ - "sha256:147758d41ae7240dc989f0039f27da8ca0d53734be0eb869ef16e3adcfa462e8", - "sha256:ea0d3b40a2d852767be77ca343b58a9e3a4b00d9db440efb8da74b4e58025e5a" - ], - "index": "pypi", - "version": "==2.49.0" - }, - "boto3": { - "hashes": [ - "sha256:182a2b756a2c2180b473bc8452227062394a24e3701548be23ebc30d85976c64", - "sha256:b9105554477978e80fda1103ff21ecf07502080667730e45383e1d3951c87954" - ], - "index": "pypi", - "version": "==1.19.12" - }, - "botocore": { - "hashes": [ - "sha256:1d1094fb53ebe4535d8840fbd7c14aadb65bde7ff03a65f9a4f1d76bd03e16ff", - "sha256:fc59b55e8c5dde64b017b2f114c25f8cce397b667e812aea7eafb4b59b49d7cb" - ], - "markers": "python_version >= '3.6'", - "version": "==1.22.12" - }, "certifi": { "hashes": [ "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872", @@ -1461,14 +1185,6 @@ "markers": "python_full_version >= '3.6.1'", "version": "==3.3.1" }, - "chardet": { - "hashes": [ - "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa", - "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==4.0.0" - }, "charset-normalizer": { "hashes": [ "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0", @@ -1477,22 +1193,6 @@ "markers": "python_version >= '3'", "version": "==2.0.7" }, - "click": { - "hashes": [ - "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3", - "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b" - ], - "markers": "python_version >= '3.6'", - "version": "==8.0.3" - }, - "colorama": { - "hashes": [ - "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b", - "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==0.4.4" - }, "control": { "hashes": [ "sha256:34eeca077cf002a2f22a9334c8998ec5b3bcc0fdae2aac790a923cf8bc80245a" @@ -1502,55 +1202,56 @@ }, "coverage": { "hashes": [ - "sha256:0147f7833c41927d84f5af9219d9b32f875c0689e5e74ac8ca3cb61e73a698f9", - "sha256:04a92a6cf9afd99f9979c61348ec79725a9f9342fb45e63c889e33c04610d97b", - "sha256:10ab138b153e4cc408b43792cb7f518f9ee02f4ff55cd1ab67ad6fd7e9905c7e", - "sha256:2e5b9c17a56b8bf0c0a9477fcd30d357deb486e4e1b389ed154f608f18556c8a", - "sha256:326d944aad0189603733d646e8d4a7d952f7145684da973c463ec2eefe1387c2", - "sha256:359a32515e94e398a5c0fa057e5887a42e647a9502d8e41165cf5cb8d3d1ca67", - "sha256:35cd2230e1ed76df7d0081a997f0fe705be1f7d8696264eb508076e0d0b5a685", - "sha256:3b270c6b48d3ff5a35deb3648028ba2643ad8434b07836782b1139cf9c66313f", - "sha256:42a1fb5dee3355df90b635906bb99126faa7936d87dfc97eacc5293397618cb7", - "sha256:479228e1b798d3c246ac89b09897ee706c51b3e5f8f8d778067f38db73ccc717", - "sha256:4cd919057636f63ab299ccb86ea0e78b87812400c76abab245ca385f17d19fb5", - "sha256:4d8b453764b9b26b0dd2afb83086a7c3f9379134e340288d2a52f8a91592394b", - "sha256:51a441011a30d693e71dea198b2a6f53ba029afc39f8e2aeb5b77245c1b282ef", - "sha256:557594a50bfe3fb0b1b57460f6789affe8850ad19c1acf2d14a3e12b2757d489", - "sha256:572f917267f363101eec375c109c9c1118037c7cc98041440b5eabda3185ac7b", - "sha256:62512c0ec5d307f56d86504c58eace11c1bc2afcdf44e3ff20de8ca427ca1d0e", - "sha256:65ad3ff837c89a229d626b8004f0ee32110f9bfdb6a88b76a80df36ccc60d926", - "sha256:666c6b32b69e56221ad1551d377f718ed00e6167c7a1b9257f780b105a101271", - "sha256:6e994003e719458420e14ffb43c08f4c14990e20d9e077cb5cad7a3e419bbb54", - "sha256:72bf437d54186d104388cbae73c9f2b0f8a3e11b6e8d7deb593bd14625c96026", - "sha256:738e823a746841248b56f0f3bd6abf3b73af191d1fd65e4c723b9c456216f0ad", - "sha256:78287731e3601ea5ce9d6468c82d88a12ef8fe625d6b7bdec9b45d96c1ad6533", - "sha256:7833c872718dc913f18e51ee97ea0dece61d9930893a58b20b3daf09bb1af6b6", - "sha256:7e083d32965d2eb6638a77e65b622be32a094fdc0250f28ce6039b0732fbcaa8", - "sha256:8186b5a4730c896cbe1e4b645bdc524e62d874351ae50e1db7c3e9f5dc81dc26", - "sha256:8605add58e6a960729aa40c0fd9a20a55909dd9b586d3e8104cc7f45869e4c6b", - "sha256:977ce557d79577a3dd510844904d5d968bfef9489f512be65e2882e1c6eed7d8", - "sha256:994ce5a7b3d20981b81d83618aa4882f955bfa573efdbef033d5632b58597ba9", - "sha256:9ad5895938a894c368d49d8470fe9f519909e5ebc6b8f8ea5190bd0df6aa4271", - "sha256:9eb0a1923354e0fdd1c8a6f53f5db2e6180d670e2b587914bf2e79fa8acfd003", - "sha256:a00284dbfb53b42e35c7dd99fc0e26ef89b4a34efff68078ed29d03ccb28402a", - "sha256:a11a2c019324fc111485e79d55907e7289e53d0031275a6c8daed30690bc50c0", - "sha256:ab6a0fe4c96f8058d41948ddf134420d3ef8c42d5508b5a341a440cce7a37a1d", - "sha256:b1d0a1bce919de0dd8da5cff4e616b2d9e6ebf3bd1410ff645318c3dd615010a", - "sha256:b8e4f15b672c9156c1154249a9c5746e86ac9ae9edc3799ee3afebc323d9d9e0", - "sha256:bbca34dca5a2d60f81326d908d77313816fad23d11b6069031a3d6b8c97a54f9", - "sha256:bf656cd74ff7b4ed7006cdb2a6728150aaad69c7242b42a2a532f77b63ea233f", - "sha256:c95257aa2ccf75d3d91d772060538d5fea7f625e48157f8ca44594f94d41cb33", - "sha256:dc5023be1c2a8b0a0ab5e31389e62c28b2453eb31dd069f4b8d1a0f9814d951a", - "sha256:e14bceb1f3ae8a14374be2b2d7bc12a59226872285f91d66d301e5f41705d4d6", - "sha256:e3c4f5211394cd0bf6874ac5d29684a495f9c374919833dcfff0bd6d37f96201", - "sha256:e76f017b6d4140a038c5ff12be1581183d7874e41f1c0af58ecf07748d36a336", - "sha256:e7d5606b9240ed4def9cbdf35be4308047d11e858b9c88a6c26974758d6225ce", - "sha256:f0f80e323a17af63eac6a9db0c9188c10f1fd815c3ab299727150cc0eb92c7a4", - "sha256:fb2fa2f6506c03c48ca42e3fe5a692d7470d290c047ee6de7c0f3e5fa7639ac9", - "sha256:ffa8fee2b1b9e60b531c4c27cf528d6b5d5da46b1730db1f4d6eee56ff282e07" - ], - "index": "pypi", - "version": "==6.1.1" + "sha256:046647b96969fda1ae0605f61288635209dd69dcd27ba3ec0bf5148bc157f954", + "sha256:06d009e8a29483cbc0520665bc46035ffe9ae0e7484a49f9782c2a716e37d0a0", + "sha256:0cde7d9fe2fb55ff68ebe7fb319ef188e9b88e0a3d1c9c5db7dd829cd93d2193", + "sha256:1de9c6f5039ee2b1860b7bad2c7bc3651fbeb9368e4c4d93e98a76358cdcb052", + "sha256:24ed38ec86754c4d5a706fbd5b52b057c3df87901a8610d7e5642a08ec07087e", + "sha256:27a3df08a855522dfef8b8635f58bab81341b2fb5f447819bc252da3aa4cf44c", + "sha256:310c40bed6b626fd1f463e5a83dba19a61c4eb74e1ac0d07d454ebbdf9047e9d", + "sha256:3348865798c077c695cae00da0924136bb5cc501f236cfd6b6d9f7a3c94e0ec4", + "sha256:35b246ae3a2c042dc8f410c94bcb9754b18179cdb81ff9477a9089dbc9ecc186", + "sha256:3f546f48d5d80a90a266769aa613bc0719cb3e9c2ef3529d53f463996dd15a9d", + "sha256:586d38dfc7da4a87f5816b203ff06dd7c1bb5b16211ccaa0e9788a8da2b93696", + "sha256:5d3855d5d26292539861f5ced2ed042fc2aa33a12f80e487053aed3bcb6ced13", + "sha256:610c0ba11da8de3a753dc4b1f71894f9f9debfdde6559599f303286e70aeb0c2", + "sha256:62646d98cf0381ffda301a816d6ac6c35fc97aa81b09c4c52d66a15c4bef9d7c", + "sha256:66af99c7f7b64d050d37e795baadf515b4561124f25aae6e1baa482438ecc388", + "sha256:675adb3b3380967806b3cbb9c5b00ceb29b1c472692100a338730c1d3e59c8b9", + "sha256:6e5a8c947a2a89c56655ecbb789458a3a8e3b0cbf4c04250331df8f647b3de59", + "sha256:7a39590d1e6acf6a3c435c5d233f72f5d43b585f5be834cff1f21fec4afda225", + "sha256:80cb70264e9a1d04b519cdba3cd0dc42847bf8e982a4d55c769b9b0ee7cdce1e", + "sha256:82fdcb64bf08aa5db881db061d96db102c77397a570fbc112e21c48a4d9cb31b", + "sha256:8492d37acdc07a6eac6489f6c1954026f2260a85a4c2bb1e343fe3d35f5ee21a", + "sha256:94f558f8555e79c48c422045f252ef41eb43becdd945e9c775b45ebfc0cbd78f", + "sha256:958ac66272ff20e63d818627216e3d7412fdf68a2d25787b89a5c6f1eb7fdd93", + "sha256:95a58336aa111af54baa451c33266a8774780242cab3704b7698d5e514840758", + "sha256:96129e41405887a53a9cc564f960d7f853cc63d178f3a182fdd302e4cab2745b", + "sha256:97ef6e9119bd39d60ef7b9cd5deea2b34869c9f0b9777450a7e3759c1ab09b9b", + "sha256:98d44a8136eebbf544ad91fef5bd2b20ef0c9b459c65a833c923d9aa4546b204", + "sha256:9d2c2e3ce7b8cc932a2f918186964bd44de8c84e2f9ef72dc616f5bb8be22e71", + "sha256:a300b39c3d5905686c75a369d2a66e68fd01472ea42e16b38c948bd02b29e5bd", + "sha256:a34fccb45f7b2d890183a263578d60a392a1a218fdc12f5bce1477a6a68d4373", + "sha256:a4d48e42e17d3de212f9af44f81ab73b9378a4b2b8413fd708d0d9023f2bbde4", + "sha256:af45eea024c0e3a25462fade161afab4f0d9d9e0d5a5d53e86149f74f0a35ecc", + "sha256:ba6125d4e55c0b8e913dad27b22722eac7abdcb1f3eab1bd090eee9105660266", + "sha256:bc1ee1318f703bc6c971da700d74466e9b86e0c443eb85983fb2a1bd20447263", + "sha256:c18725f3cffe96732ef96f3de1939d81215fd6d7d64900dcc4acfe514ea4fcbf", + "sha256:c8e9c4bcaaaa932be581b3d8b88b677489975f845f7714efc8cce77568b6711c", + "sha256:cc799916b618ec9fd00135e576424165691fec4f70d7dc12cfaef09268a2478c", + "sha256:cd2d11a59afa5001ff28073ceca24ae4c506da4355aba30d1e7dd2bd0d2206dc", + "sha256:d0a595a781f8e186580ff8e3352dd4953b1944289bec7705377c80c7e36c4d6c", + "sha256:d3c5f49ce6af61154060640ad3b3281dbc46e2e0ef2fe78414d7f8a324f0b649", + "sha256:d9a635114b88c0ab462e0355472d00a180a5fbfd8511e7f18e4ac32652e7d972", + "sha256:e5432d9c329b11c27be45ee5f62cf20a33065d482c8dec1941d6670622a6fb8f", + "sha256:eab14fdd410500dae50fd14ccc332e65543e7b39f6fc076fe90603a0e5d2f929", + "sha256:ebcc03e1acef4ff44f37f3c61df478d6e469a573aa688e5a162f85d7e4c3860d", + "sha256:fae3fe111670e51f1ebbc475823899524e3459ea2db2cb88279bbfb2a0b8a3de", + "sha256:fd92ece726055e80d4e3f01fff3b91f54b18c9c357c48fcf6119e87e2461a091", + "sha256:ffa545230ca2ad921ad066bf8fd627e7be43716b6e0fcf8e32af1b8188ccb0ab" + ], + "index": "pypi", + "version": "==6.1.2" }, "cryptography": { "hashes": [ @@ -1586,57 +1287,6 @@ "markers": "python_version >= '3.6'", "version": "==0.11.0" }, - "datadog": { - "hashes": [ - "sha256:140b51f5db3f46d6f3ec022c05830c6b3e13e4f62c19c823e1227ac322b26667", - "sha256:7a6fac17a7d09f1883ab9a45ce4ff7a16aa1a5eb3cc4c6cddac7f8c53e7d1e9b" - ], - "index": "pypi", - "version": "==0.42.0" - }, - "debugpy": { - "hashes": [ - "sha256:01e98c594b3e66d529e40edf314f849cd1a21f7a013298df58cd8e263bf8e184", - "sha256:16db27b4b91991442f91d73604d32080b30de655aca9ba821b1972ea8171021b", - "sha256:17a25ce9d7714f92fc97ef00cc06269d7c2b163094990ada30156ed31d9a5030", - "sha256:194f95dd3e84568b5489aab5689a3a2c044e8fdc06f1890b8b4f70b6b89f2778", - "sha256:1ec3a086e14bba6c472632025b8fe5bdfbaef2afa1ebd5c6615ce6ed8d89bc67", - "sha256:23df67fc56d59e386c342428a7953c2c06cc226d8525b11319153e96afb65b0c", - "sha256:26fbe53cca45a608679094791ce587b6e2798acd1d4777a8b303b07622e85182", - "sha256:2b073ad5e8d8c488fbb6a116986858bab0c9c4558f28deb8832c7a5a27405bd6", - "sha256:318f81f37341e4e054b4267d39896b73cddb3612ca13b39d7eea45af65165e1d", - "sha256:3a457ad9c0059a21a6c7d563c1f18e924f5cf90278c722bd50ede6f56b77c7fe", - "sha256:4404a62fb5332ea5c8c9132290eef50b3a0ba38cecacad5529e969a783bcbdd7", - "sha256:5d76a4fd028d8009c3faf1185b4b78ceb2273dd2499447664b03939e0368bb90", - "sha256:70b422c63a833630c33e3f9cdbd9b6971f8c5afd452697e464339a21bbe862ba", - "sha256:82f5f9ce93af6861a0713f804e62ab390bb12a17f113153e47fea8bbb1dfbe36", - "sha256:a2aa64f6d2ca7ded8a7e8a4e7cae3bc71866b09876b7b05cecad231779cb9156", - "sha256:b2df2c373e85871086bd55271c929670cd4e1dba63e94a08d442db830646203b", - "sha256:b5b3157372e0e0a1297a8b6b5280bcf1d35a40f436c7973771c972726d1e32d5", - "sha256:d2b09e91fbd1efa4f4fda121d49af89501beda50c18ed7499712c71a4bf3452e", - "sha256:d876db8c312eeb02d85611e0f696abe66a2c1515e6405943609e725d5ff36f2a", - "sha256:f3a3dca9104aa14fd4210edcce6d9ce2b65bd9618c0b222135a40b9d6e2a9eeb", - "sha256:f73988422b17f071ad3c4383551ace1ba5ed810cbab5f9c362783d22d40a08dc" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.5.1" - }, - "decorator": { - "hashes": [ - "sha256:7b12e7c3c6ab203a29e157335e9122cb03de9ab7264b137594103fd4a683b374", - "sha256:e59913af105b9860aa2c8d3272d9de5a56a4e608db9a2f167a8480b323d529a7" - ], - "markers": "python_version >= '3.5'", - "version": "==5.1.0" - }, - "defusedxml": { - "hashes": [ - "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", - "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==0.7.1" - }, "dictdiffer": { "hashes": [ "sha256:17bacf5fbfe613ccf1b6d512bd766e6b21fb798822a133aa86098b8ac9997578", @@ -1660,22 +1310,6 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", "version": "==0.17.1" }, - "elasticsearch": { - "hashes": [ - "sha256:1e9a6302945d98046899a7c9b3d345c881ac7b05ba176d3a49c9d2702b1e8bc8", - "sha256:b728a3cdde3a4d3a93b9e92f0e7f0fe636226d236219913db32311ccaf8a9d16" - ], - "index": "pypi", - "version": "==7.15.1" - }, - "entrypoints": { - "hashes": [ - "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19", - "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451" - ], - "markers": "python_version >= '2.7'", - "version": "==0.3" - }, "fastcluster": { "hashes": [ "sha256:181af434d47c0628a98182f6d1483d0fd1da2a65ed4acd5f04f9bd1038098e63", @@ -1701,240 +1335,19 @@ }, "filelock": { "hashes": [ - "sha256:7afc856f74fa7006a289fd10fa840e1eebd8bbff6bffb69c26c54a0512ea8cf8", - "sha256:bb2a1c717df74c48a2d00ed625e5a66f8572a3a30baacb7657add1d7bac4097b" - ], - "markers": "python_version >= '3.6'", - "version": "==3.3.2" - }, - "flask": { - "hashes": [ - "sha256:7b2fb8e934ddd50731893bdcdb00fc8c0315916f9fcd50d22c7cc1a95ab634e2", - "sha256:cb90f62f1d8e4dc4621f52106613488b5ba826b2e1e10a33eac92f723093ab6a" - ], - "index": "pypi", - "version": "==2.0.2" - }, - "flask-cors": { - "hashes": [ - "sha256:74efc975af1194fc7891ff5cd85b0f7478be4f7f59fe158102e91abb72bb4438", - "sha256:b60839393f3b84a0f3746f6cdca56c1ad7426aa738b70d6c61375857823181de" - ], - "index": "pypi", - "version": "==3.0.10" - }, - "flask-socketio": { - "hashes": [ - "sha256:07e1899e3b4851978b2ac8642080156c6294f8d0fc5212b4e4bcca713830306a", - "sha256:1efdaacc7a26e94f2b197a80079b1058f6aa644a6094c0a322349e2b9c41f6b1" - ], - "index": "pypi", - "version": "==5.1.1" - }, - "frozenlist": { - "hashes": [ - "sha256:01d79515ed5aa3d699b05f6bdcf1fe9087d61d6b53882aa599a10853f0479c6c", - "sha256:0a7c7cce70e41bc13d7d50f0e5dd175f14a4f1837a8549b0936ed0cbe6170bf9", - "sha256:11ff401951b5ac8c0701a804f503d72c048173208490c54ebb8d7bb7c07a6d00", - "sha256:14a5cef795ae3e28fb504b73e797c1800e9249f950e1c964bb6bdc8d77871161", - "sha256:16eef427c51cb1203a7c0ab59d1b8abccaba9a4f58c4bfca6ed278fc896dc193", - "sha256:16ef7dd5b7d17495404a2e7a49bac1bc13d6d20c16d11f4133c757dd94c4144c", - "sha256:181754275d5d32487431a0a29add4f897968b7157204bc1eaaf0a0ce80c5ba7d", - "sha256:1cf63243bc5f5c19762943b0aa9e0d3fb3723d0c514d820a18a9b9a5ef864315", - "sha256:1cfe6fef507f8bac40f009c85c7eddfed88c1c0d38c75e72fe10476cef94e10f", - "sha256:1fef737fd1388f9b93bba8808c5f63058113c10f4e3c0763ced68431773f72f9", - "sha256:25b358aaa7dba5891b05968dd539f5856d69f522b6de0bf34e61f133e077c1a4", - "sha256:26f602e380a5132880fa245c92030abb0fc6ff34e0c5500600366cedc6adb06a", - "sha256:28e164722ea0df0cf6d48c4d5bdf3d19e87aaa6dfb39b0ba91153f224b912020", - "sha256:2de5b931701257d50771a032bba4e448ff958076380b049fd36ed8738fdb375b", - "sha256:3457f8cf86deb6ce1ba67e120f1b0128fcba1332a180722756597253c465fc1d", - "sha256:351686ca020d1bcd238596b1fa5c8efcbc21bffda9d0efe237aaa60348421e2a", - "sha256:406aeb340613b4b559db78d86864485f68919b7141dec82aba24d1477fd2976f", - "sha256:41de4db9b9501679cf7cddc16d07ac0f10ef7eb58c525a1c8cbff43022bddca4", - "sha256:41f62468af1bd4e4b42b5508a3fe8cc46a693f0cdd0ca2f443f51f207893d837", - "sha256:4766632cd8a68e4f10f156a12c9acd7b1609941525569dd3636d859d79279ed3", - "sha256:47b2848e464883d0bbdcd9493c67443e5e695a84694efff0476f9059b4cb6257", - "sha256:4a495c3d513573b0b3f935bfa887a85d9ae09f0627cf47cad17d0cc9b9ba5c38", - "sha256:4ad065b2ebd09f32511ff2be35c5dfafee6192978b5a1e9d279a5c6e121e3b03", - "sha256:4c457220468d734e3077580a3642b7f682f5fd9507f17ddf1029452450912cdc", - "sha256:4f52d0732e56906f8ddea4bd856192984650282424049c956857fed43697ea43", - "sha256:54a1e09ab7a69f843cd28fefd2bcaf23edb9e3a8d7680032c8968b8ac934587d", - "sha256:5a72eecf37eface331636951249d878750db84034927c997d47f7f78a573b72b", - "sha256:5df31bb2b974f379d230a25943d9bf0d3bc666b4b0807394b131a28fca2b0e5f", - "sha256:66a518731a21a55b7d3e087b430f1956a36793acc15912e2878431c7aec54210", - "sha256:6790b8d96bbb74b7a6f4594b6f131bd23056c25f2aa5d816bd177d95245a30e3", - "sha256:68201be60ac56aff972dc18085800b6ee07973c49103a8aba669dee3d71079de", - "sha256:6e105013fa84623c057a4381dc8ea0361f4d682c11f3816cc80f49a1f3bc17c6", - "sha256:705c184b77565955a99dc360f359e8249580c6b7eaa4dc0227caa861ef46b27a", - "sha256:72cfbeab7a920ea9e74b19aa0afe3b4ad9c89471e3badc985d08756efa9b813b", - "sha256:735f386ec522e384f511614c01d2ef9cf799f051353876b4c6fb93ef67a6d1ee", - "sha256:82d22f6e6f2916e837c91c860140ef9947e31194c82aaeda843d6551cec92f19", - "sha256:83334e84a290a158c0c4cc4d22e8c7cfe0bba5b76d37f1c2509dabd22acafe15", - "sha256:84e97f59211b5b9083a2e7a45abf91cfb441369e8bb6d1f5287382c1c526def3", - "sha256:87521e32e18a2223311afc2492ef2d99946337da0779ddcda77b82ee7319df59", - "sha256:878ebe074839d649a1cdb03a61077d05760624f36d196884a5cafb12290e187b", - "sha256:89fdfc84c6bf0bff2ff3170bb34ecba8a6911b260d318d377171429c4be18c73", - "sha256:8b4c7665a17c3a5430edb663e4ad4e1ad457614d1b2f2b7f87052e2ef4fa45ca", - "sha256:8b54cdd2fda15467b9b0bfa78cee2ddf6dbb4585ef23a16e14926f4b076dfae4", - "sha256:94728f97ddf603d23c8c3dd5cae2644fa12d33116e69f49b1644a71bb77b89ae", - "sha256:954b154a4533ef28bd3e83ffdf4eadf39deeda9e38fb8feaf066d6069885e034", - "sha256:977a1438d0e0d96573fd679d291a1542097ea9f4918a8b6494b06610dfeefbf9", - "sha256:9ade70aea559ca98f4b1b1e5650c45678052e76a8ab2f76d90f2ac64180215a2", - "sha256:9b6e21e5770df2dea06cb7b6323fbc008b13c4a4e3b52cb54685276479ee7676", - "sha256:a0d3ffa8772464441b52489b985d46001e2853a3b082c655ec5fad9fb6a3d618", - "sha256:a37594ad6356e50073fe4f60aa4187b97d15329f2138124d252a5a19c8553ea4", - "sha256:a8d86547a5e98d9edd47c432f7a14b0c5592624b496ae9880fb6332f34af1edc", - "sha256:aa44c4740b4e23fcfa259e9dd52315d2b1770064cde9507457e4c4a65a04c397", - "sha256:acc4614e8d1feb9f46dd829a8e771b8f5c4b1051365d02efb27a3229048ade8a", - "sha256:af2a51c8a381d76eabb76f228f565ed4c3701441ecec101dd18be70ebd483cfd", - "sha256:b2ae2f5e9fa10805fb1c9adbfefaaecedd9e31849434be462c3960a0139ed729", - "sha256:b46f997d5ed6d222a863b02cdc9c299101ee27974d9bbb2fd1b3c8441311c408", - "sha256:bc93f5f62df3bdc1f677066327fc81f92b83644852a31c6aa9b32c2dde86ea7d", - "sha256:bfbaa08cf1452acad9cb1c1d7b89394a41e712f88df522cea1a0f296b57782a0", - "sha256:c1e8e9033d34c2c9e186e58279879d78c94dd365068a3607af33f2bc99357a53", - "sha256:c5328ed53fdb0a73c8a50105306a3bc013e5ca36cca714ec4f7bd31d38d8a97f", - "sha256:c6a9d84ee6427b65a81fc24e6ef589cb794009f5ca4150151251c062773e7ed2", - "sha256:c98d3c04701773ad60d9545cd96df94d955329efc7743fdb96422c4b669c633b", - "sha256:cb3957c39668d10e2b486acc85f94153520a23263b6401e8f59422ef65b9520d", - "sha256:e63ad0beef6ece06475d29f47d1f2f29727805376e09850ebf64f90777962792", - "sha256:e74f8b4d8677ebb4015ac01fcaf05f34e8a1f22775db1f304f497f2f88fdc697", - "sha256:e7d0dd3e727c70c2680f5f09a0775525229809f1a35d8552b92ff10b2b14f2c2", - "sha256:ec6cf345771cdb00791d271af9a0a6fbfc2b6dd44cb753f1eeaa256e21622adb", - "sha256:ed58803563a8c87cf4c0771366cf0ad1aa265b6b0ae54cbbb53013480c7ad74d", - "sha256:f0081a623c886197ff8de9e635528fd7e6a387dccef432149e25c13946cb0cd0", - "sha256:f025f1d6825725b09c0038775acab9ae94264453a696cc797ce20c0769a7b367", - "sha256:f5f3b2942c3b8b9bfe76b408bbaba3d3bb305ee3693e8b1d631fe0a0d4f93673", - "sha256:fbd4844ff111449f3bbe20ba24fbb906b5b1c2384d0f3287c9f7da2354ce6d23" + "sha256:2e139a228bcf56dd8b2274a65174d005c4a6b68540ee0bdbb92c76f43f29f7e8", + "sha256:93d512b32a23baf4cac44ffd72ccf70732aeff7b8050fcaf6d3ec406d954baf4" ], "markers": "python_version >= '3.6'", - "version": "==1.2.0" - }, - "ft4222": { - "hashes": [ - "sha256:03faa3f02e260e9b14c34d39dcde9b78c98bc9fc443362b5bbbc25b69c46db0a", - "sha256:045ad976d3d45b82091484c0aa9c796edfed3b1fee867748c182d84dc8824cc1", - "sha256:22e81b897103a27dc750b3cfe7381a03264d1167b576da2167a7f2f96bd851d7", - "sha256:295571f5fe9a8934733396184b67b5e0acadcf8d8461b9c8d6ddef46cc9a0764", - "sha256:4edae5040de78dc0fc7339e1f6b1c0098031d3c8fde356d23af79f264dec3954", - "sha256:53f2e92ef231813594e9c3f75f9ed9b0c1392cd0a14341afc46327b48ccdbfb9", - "sha256:646986616a0f86f990956b756d3ef747c1acf30576d5c47f36d735d0e3f930a1", - "sha256:652d1041f9d23a29d856857cbbc8c471af66582693aa35fc6962f214666b2db5", - "sha256:66268671f263a9a65cf163ef6d711afad2eaa1cedafe85f851d5d7538e2ee4bf", - "sha256:6bf1c0c23eb3e8cd85b30651536f995783330782b1d3b294b9d82a0ddda27645", - "sha256:8951cc546425840fd6d271aa70c51997fa4e673a0bf32e2d2767edd3d6df5d76", - "sha256:8aa62413cdd6f6f059c2b5bd14eb02b97911d3cfb674cc975435d5c3e8554975", - "sha256:99a1a832e132135dc98d286f1ba063cbd34a9caecd15500834bcb2674de60c66", - "sha256:9c883fe2501013ee41a91116599187e25a6c62c33ad244c2423498512f56ab7a", - "sha256:9ec3cd7f18af44f3fee7b66f3c7bf3584eab605cb1634898a90d14c6fa41811a", - "sha256:9fa18401fb903b91cc5456f81a07be318670f51aa61220dd4a1bf88041c780ac", - "sha256:c5563cfd4c581d9f20e488b0312304f1f325d6dadaa953469b10c4e628c53614", - "sha256:f0526054a4b1e36a6c134e6d8a2b7846719446ded8d6ec9cd350c49a458f884c", - "sha256:f1505475010ff96b784c92169a5d6fbaf5db658fcd07e30b8dae89b090537587" - ], - "index": "pypi", - "version": "==1.3.0" - }, - "future": { - "hashes": [ - "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.18.2" - }, - "geoalchemy2": { - "hashes": [ - "sha256:2e3323a8442d4b1f8de69106315c17d8ce729fc127a38a5d7e2b53e1a19b9dd5", - "sha256:b0e56d4a945bdc0f8fa9edd50ecc912889ea68e0e3558a19160dcb0d5b1b65fc" - ], - "index": "pypi", - "version": "==0.9.4" - }, - "git-pylint-commit-hook": { - "hashes": [ - "sha256:e1d39e7856b3ef0a0269121ca210dc3f5a97da158b322411e8e1185918a91b3c" - ], - "index": "pypi", - "version": "==2.5.1" - }, - "greenlet": { - "hashes": [ - "sha256:00e44c8afdbe5467e4f7b5851be223be68adb4272f44696ee71fe46b7036a711", - "sha256:013d61294b6cd8fe3242932c1c5e36e5d1db2c8afb58606c5a67efce62c1f5fd", - "sha256:049fe7579230e44daef03a259faa24511d10ebfa44f69411d99e6a184fe68073", - "sha256:14d4f3cd4e8b524ae9b8aa567858beed70c392fdec26dbdb0a8a418392e71708", - "sha256:166eac03e48784a6a6e0e5f041cfebb1ab400b394db188c48b3a84737f505b67", - "sha256:17ff94e7a83aa8671a25bf5b59326ec26da379ace2ebc4411d690d80a7fbcf23", - "sha256:1e12bdc622676ce47ae9abbf455c189e442afdde8818d9da983085df6312e7a1", - "sha256:21915eb821a6b3d9d8eefdaf57d6c345b970ad722f856cd71739493ce003ad08", - "sha256:288c6a76705dc54fba69fbcb59904ae4ad768b4c768839b8ca5fdadec6dd8cfd", - "sha256:32ca72bbc673adbcfecb935bb3fb1b74e663d10a4b241aaa2f5a75fe1d1f90aa", - "sha256:356b3576ad078c89a6107caa9c50cc14e98e3a6c4874a37c3e0273e4baf33de8", - "sha256:40b951f601af999a8bf2ce8c71e8aaa4e8c6f78ff8afae7b808aae2dc50d4c40", - "sha256:572e1787d1460da79590bf44304abbc0a2da944ea64ec549188fa84d89bba7ab", - "sha256:58df5c2a0e293bf665a51f8a100d3e9956febfbf1d9aaf8c0677cf70218910c6", - "sha256:64e6175c2e53195278d7388c454e0b30997573f3f4bd63697f88d855f7a6a1fc", - "sha256:7227b47e73dedaa513cdebb98469705ef0d66eb5a1250144468e9c3097d6b59b", - "sha256:7418b6bfc7fe3331541b84bb2141c9baf1ec7132a7ecd9f375912eca810e714e", - "sha256:7cbd7574ce8e138bda9df4efc6bf2ab8572c9aff640d8ecfece1b006b68da963", - "sha256:7ff61ff178250f9bb3cd89752df0f1dd0e27316a8bd1465351652b1b4a4cdfd3", - "sha256:833e1551925ed51e6b44c800e71e77dacd7e49181fdc9ac9a0bf3714d515785d", - "sha256:8639cadfda96737427330a094476d4c7a56ac03de7265622fcf4cfe57c8ae18d", - "sha256:8c790abda465726cfb8bb08bd4ca9a5d0a7bd77c7ac1ca1b839ad823b948ea28", - "sha256:8d2f1fb53a421b410751887eb4ff21386d119ef9cde3797bf5e7ed49fb51a3b3", - "sha256:903bbd302a2378f984aef528f76d4c9b1748f318fe1294961c072bdc7f2ffa3e", - "sha256:93f81b134a165cc17123626ab8da2e30c0455441d4ab5576eed73a64c025b25c", - "sha256:95e69877983ea39b7303570fa6760f81a3eec23d0e3ab2021b7144b94d06202d", - "sha256:9633b3034d3d901f0a46b7939f8c4d64427dfba6bbc5a36b1a67364cf148a1b0", - "sha256:97e5306482182170ade15c4b0d8386ded995a07d7cc2ca8f27958d34d6736497", - "sha256:9f3cba480d3deb69f6ee2c1825060177a22c7826431458c697df88e6aeb3caee", - "sha256:aa5b467f15e78b82257319aebc78dd2915e4c1436c3c0d1ad6f53e47ba6e2713", - "sha256:abb7a75ed8b968f3061327c433a0fbd17b729947b400747c334a9c29a9af6c58", - "sha256:aec52725173bd3a7b56fe91bc56eccb26fbdff1386ef123abb63c84c5b43b63a", - "sha256:b11548073a2213d950c3f671aa88e6f83cda6e2fb97a8b6317b1b5b33d850e06", - "sha256:b1692f7d6bc45e3200844be0dba153612103db241691088626a33ff1f24a0d88", - "sha256:b92e29e58bef6d9cfd340c72b04d74c4b4e9f70c9fa7c78b674d1fec18896dc4", - "sha256:be5f425ff1f5f4b3c1e33ad64ab994eed12fc284a6ea71c5243fd564502ecbe5", - "sha256:dd0b1e9e891f69e7675ba5c92e28b90eaa045f6ab134ffe70b52e948aa175b3c", - "sha256:e30f5ea4ae2346e62cedde8794a56858a67b878dd79f7df76a0767e356b1744a", - "sha256:e6a36bb9474218c7a5b27ae476035497a6990e21d04c279884eb10d9b290f1b1", - "sha256:e859fcb4cbe93504ea18008d1df98dee4f7766db66c435e4882ab35cf70cac43", - "sha256:eb6ea6da4c787111adf40f697b4e58732ee0942b5d3bd8f435277643329ba627", - "sha256:ec8c433b3ab0419100bd45b47c9c8551248a5aee30ca5e9d399a0b57ac04651b", - "sha256:eff9d20417ff9dcb0d25e2defc2574d10b491bf2e693b4e491914738b7908168", - "sha256:f0214eb2a23b85528310dad848ad2ac58e735612929c8072f6093f3585fd342d", - "sha256:f276df9830dba7a333544bd41070e8175762a7ac20350786b322b714b0e654f5", - "sha256:f3acda1924472472ddd60c29e5b9db0cec629fbe3c5c5accb74d6d6d14773478", - "sha256:f70a9e237bb792c7cc7e44c531fd48f5897961701cdaa06cf22fc14965c496cf", - "sha256:f9d29ca8a77117315101425ec7ec2a47a22ccf59f5593378fc4077ac5b754fce", - "sha256:fa877ca7f6b48054f847b61d6fa7bed5cebb663ebc55e018fda12db09dcc664c", - "sha256:fdcec0b8399108577ec290f55551d926d9a1fa6cad45882093a7a07ac5ec147b" - ], - "markers": "python_version >= '3' and platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", - "version": "==1.1.2" - }, - "gunicorn": { - "hashes": [ - "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e", - "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8" - ], - "index": "pypi", - "version": "==20.1.0" + "version": "==3.4.0" }, - "h5py": { + "fonttools": { "hashes": [ - "sha256:320f5810e058dcea73529dc98ae42263d34004bcc9209d7bf44eac5136716c3f", - "sha256:3f9518c37a8b9cd067927a8cbc6fe96846d5d28c32e10baf49c8a1d012c9b0a6", - "sha256:40fe8572511c317ec7598271b5dce9c25957cc373af733e53ea246bbf0244958", - "sha256:77c7be4001ac7d3ed80477de5b6942501d782de1bbe4886597bdfec2a7ab821f", - "sha256:834a53178fc558c9832081fd18bc22f6f2585edcc06c802adfa4afb07ff884b4", - "sha256:c99329ebe346a73bd13bf3fc3d54ee9421f6ee00de6ea085c64a856a9acee7b3", - "sha256:cdff848353e2d20d5f66535957595c79932851f51e496623a96186d02ba0cf30", - "sha256:d15e1556ff9591b3f3d8c7b3b66085f3867e5500528663bf11c499ab71c9c6b6", - "sha256:f75d7bdaba8d3537490b0f53adcd043991ada3597f88e772969172c45145a8f6", - "sha256:fc763e707aa631fdc200878c7b5c13ea5b5d1f9772696871dcd6f0f5932fcd35" + "sha256:68071406009e7ef6a5fdcd85d95975cd6963867bb226f2b786bfffe15d1959ef", + "sha256:8c8f84131bf04f3b1dcf99b9763cec35c347164ab6ad006e18d2f99fcab05529" ], - "index": "pypi", - "version": "==3.5.0" + "markers": "python_version >= '3.7'", + "version": "==4.28.1" }, "hexdump": { "hashes": [ @@ -1943,29 +1356,21 @@ "index": "pypi", "version": "==3.3" }, - "humanfriendly": { - "hashes": [ - "sha256:332da98c24cc150efcc91b5508b19115209272bfdf4b0764a56795932f854271", - "sha256:f7dba53ac7935fd0b4a2fc9a29e316ddd9ea135fb3052d3d0279d10c18ff9c48" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==9.2" - }, "hypothesis": { "hashes": [ - "sha256:4030f88ae0a8d3339a41dd7589c78d3ba0a3a270f729c12aceddaea7c60b224b", - "sha256:f6b7b3b693fe00121a6c9edc04bedf6c48a75ea5ab02251e6023c4357a5369a5" + "sha256:8f7318839b64bae1410704933fe01f3db5f80f20f2ba8d4ea3520443ae3a001d", + "sha256:f1627022f75306c653115fbd169ba6a4322804f60533a7b46625fd0eecba43d5" ], "index": "pypi", - "version": "==6.24.2" + "version": "==6.24.5" }, "identify": { "hashes": [ - "sha256:4de55a93e0ba72bf917c840b3794eb1055a67272a1732351c557c88ec42011b1", - "sha256:595283a1c3a078ac5774ad4dc4d1bdd0c1602f60bcf11ae673b64cb2b1945762" + "sha256:4f85f9bd8e6e5e2d61b2f8de5ff5313d8a1cfac4c88822d74406de45ad10bd82", + "sha256:8cb609a671d2f861ae7fe583711a43fd2faab0c892f39cbc4568b0c51b354238" ], "markers": "python_full_version >= '3.6.1'", - "version": "==2.3.4" + "version": "==2.3.6" }, "idna": { "hashes": [ @@ -1975,29 +1380,13 @@ "markers": "python_version >= '3'", "version": "==3.3" }, - "imageio": { - "hashes": [ - "sha256:469c59fe71c81cdc41c84f842d62dd2739a08fac8cb85f5a518a92a6227e2ed6", - "sha256:93ee376a8dc96182ead8d773c3ac2becf79c6f2b93d38f31d7ac036c62a6c72e" - ], - "index": "pypi", - "version": "==2.10.3" - }, "imagesize": { "hashes": [ - "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1", - "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1" + "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c", + "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.2.0" - }, - "importlib-resources": { - "hashes": [ - "sha256:33a95faed5fc19b4bc16b29a6eeae248a3fe69dd55d4d229d2b480e23eeaad45", - "sha256:d756e2f85dd4de2ba89be0b21dba2a3bbec2e871a42a3a16719258a11f87506b" - ], - "markers": "python_version < '3.9'", - "version": "==5.4.0" + "version": "==1.3.0" }, "inputs": { "hashes": [ @@ -2007,287 +1396,72 @@ "index": "pypi", "version": "==0.5" }, - "ipykernel": { + "jinja2": { "hashes": [ - "sha256:299795cca2c4aed7e233e3ad5360e1c73627fd0dcec11a9e75d5b2df43629353", - "sha256:f43de132feea90f86d68c51013afe9694f9415f440053ec9909dd656c75b04b5" + "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8", + "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7" ], "index": "pypi", - "version": "==6.5.0" + "version": "==3.0.3" }, - "ipython": { + "kiwisolver": { "hashes": [ - "sha256:4f69d7423a5a1972f6347ff233e38bbf4df6a150ef20fbb00c635442ac3060aa", - "sha256:a658beaf856ce46bc453366d5dc6b2ddc6c481efd3540cb28aa3943819caac9f" + "sha256:0007840186bacfaa0aba4466d5890334ea5938e0bb7e28078a0eb0e63b5b59d5", + "sha256:19554bd8d54cf41139f376753af1a644b63c9ca93f8f72009d50a2080f870f77", + "sha256:1d45d1c74f88b9f41062716c727f78f2a59a5476ecbe74956fafb423c5c87a76", + "sha256:1d819553730d3c2724582124aee8a03c846ec4362ded1034c16fb3ef309264e6", + "sha256:2210f28778c7d2ee13f3c2a20a3a22db889e75f4ec13a21072eabb5693801e84", + "sha256:22521219ca739654a296eea6d4367703558fba16f98688bd8ce65abff36eaa84", + "sha256:25405f88a37c5f5bcba01c6e350086d65e7465fd1caaf986333d2a045045a223", + "sha256:2b65bd35f3e06a47b5c30ea99e0c2b88f72c6476eedaf8cfbc8e66adb5479dcf", + "sha256:2ddb500a2808c100e72c075cbb00bf32e62763c82b6a882d403f01a119e3f402", + "sha256:2f8f6c8f4f1cff93ca5058d6ec5f0efda922ecb3f4c5fb76181f327decff98b8", + "sha256:30fa008c172355c7768159983a7270cb23838c4d7db73d6c0f6b60dde0d432c6", + "sha256:3dbb3cea20b4af4f49f84cffaf45dd5f88e8594d18568e0225e6ad9dec0e7967", + "sha256:4116ba9a58109ed5e4cb315bdcbff9838f3159d099ba5259c7c7fb77f8537492", + "sha256:44e6adf67577dbdfa2d9f06db9fbc5639afefdb5bf2b4dfec25c3a7fbc619536", + "sha256:5326ddfacbe51abf9469fe668944bc2e399181a2158cb5d45e1d40856b2a0589", + "sha256:70adc3658138bc77a36ce769f5f183169bc0a2906a4f61f09673f7181255ac9b", + "sha256:72be6ebb4e92520b9726d7146bc9c9b277513a57a38efcf66db0620aec0097e0", + "sha256:7843b1624d6ccca403a610d1277f7c28ad184c5aa88a1750c1a999754e65b439", + "sha256:7ba5a1041480c6e0a8b11a9544d53562abc2d19220bfa14133e0cdd9967e97af", + "sha256:80efd202108c3a4150e042b269f7c78643420cc232a0a771743bb96b742f838f", + "sha256:82f49c5a79d3839bc8f38cb5f4bfc87e15f04cbafa5fbd12fb32c941cb529cfb", + "sha256:83d2c9db5dfc537d0171e32de160461230eb14663299b7e6d18ca6dca21e4977", + "sha256:8d93a1095f83e908fc253f2fb569c2711414c0bfd451cab580466465b235b470", + "sha256:8dc3d842fa41a33fe83d9f5c66c0cc1f28756530cd89944b63b072281e852031", + "sha256:9661a04ca3c950a8ac8c47f53cbc0b530bce1b52f516a1e87b7736fec24bfff0", + "sha256:a498bcd005e8a3fedd0022bb30ee0ad92728154a8798b703f394484452550507", + "sha256:a7a4cf5bbdc861987a7745aed7a536c6405256853c94abc9f3287c3fa401b174", + "sha256:b5074fb09429f2b7bc82b6fb4be8645dcbac14e592128beeff5461dcde0af09f", + "sha256:b6a5431940f28b6de123de42f0eb47b84a073ee3c3345dc109ad550a3307dd28", + "sha256:ba677bcaff9429fd1bf01648ad0901cea56c0d068df383d5f5856d88221fe75b", + "sha256:bcadb05c3d4794eb9eee1dddf1c24215c92fb7b55a80beae7a60530a91060560", + "sha256:bf7eb45d14fc036514c09554bf983f2a72323254912ed0c3c8e697b62c4c158f", + "sha256:c358721aebd40c243894298f685a19eb0491a5c3e0b923b9f887ef1193ddf829", + "sha256:c4550a359c5157aaf8507e6820d98682872b9100ce7607f8aa070b4b8af6c298", + "sha256:c6572c2dab23c86a14e82c245473d45b4c515314f1f859e92608dcafbd2f19b8", + "sha256:cba430db673c29376135e695c6e2501c44c256a81495da849e85d1793ee975ad", + "sha256:dedc71c8eb9c5096037766390172c34fb86ef048b8e8958b4e484b9e505d66bc", + "sha256:e6f5eb2f53fac7d408a45fbcdeda7224b1cfff64919d0f95473420a931347ae9", + "sha256:ec2eba188c1906b05b9b49ae55aae4efd8150c61ba450e6721f64620c50b59eb", + "sha256:ee040a7de8d295dbd261ef2d6d3192f13e2b08ec4a954de34a6fb8ff6422e24c", + "sha256:eedd3b59190885d1ebdf6c5e0ca56828beb1949b4dfe6e5d0256a461429ac386", + "sha256:f441422bb313ab25de7b3dbfd388e790eceb76ce01a18199ec4944b369017009", + "sha256:f8eb7b6716f5b50e9c06207a14172cf2de201e41912ebe732846c02c830455b9", + "sha256:fc4453705b81d03568d5b808ad8f09c77c47534f6ac2e72e733f9ca4714aa75c" ], - "index": "pypi", - "version": "==7.29.0" + "markers": "python_version >= '3.7'", + "version": "==1.3.2" }, - "ipython-genutils": { + "lru-dict": { "hashes": [ - "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8", - "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8" + "sha256:45b81f67d75341d4433abade799a47e9c42a9e22a118531dcb5e549864032d7c" ], - "version": "==0.2.0" + "index": "pypi", + "version": "==1.1.7" }, - "ipywidgets": { - "hashes": [ - "sha256:00974f7cb4d5f8d494c19810fedb9fa9b64bffd3cda7c2be23c133a1ad3c99c5", - "sha256:d258f582f915c62ea91023299603be095de19afb5ee271698f88327b9fe9bf43" - ], - "version": "==7.6.5" - }, - "isort": { - "hashes": [ - "sha256:1a18ccace2ed8910bd9458b74a3ecbafd7b2f581301b0ab65cfdd4338272d76f", - "sha256:e52ff6d38012b131628cf0f26c51e7bd3a7c81592eefe3ac71411e692f1b9345" - ], - "markers": "python_version < '4' and python_full_version >= '3.6.1'", - "version": "==5.10.0" - }, - "itsdangerous": { - "hashes": [ - "sha256:5174094b9637652bdb841a3029700391451bd092ba3db90600dea710ba28e97c", - "sha256:9e724d68fc22902a1435351f84c3fb8623f303fffcc566a4cb952df8c572cff0" - ], - "markers": "python_version >= '3.6'", - "version": "==2.0.1" - }, - "jedi": { - "hashes": [ - "sha256:18456d83f65f400ab0c2d3319e48520420ef43b23a086fdc05dff34132f0fb93", - "sha256:92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707" - ], - "markers": "python_version >= '3.6'", - "version": "==0.18.0" - }, - "jinja2": { - "hashes": [ - "sha256:827a0e32839ab1600d4eb1c4c33ec5a8edfbc5cb42dafa13b81f182f97784b45", - "sha256:8569982d3f0889eed11dd620c706d39b60c36d6d25843961f33f77fb6bc6b20c" - ], - "index": "pypi", - "version": "==3.0.2" - }, - "jmespath": { - "hashes": [ - "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9", - "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.10.0" - }, - "joblib": { - "hashes": [ - "sha256:4158fcecd13733f8be669be0683b96ebdbbd38d23559f54dca7205aea1bf1e35", - "sha256:f21f109b3c7ff9d95f8387f752d0d9c34a02aa2f7060c2135f465da0e5160ff6" - ], - "index": "pypi", - "version": "==1.1.0" - }, - "json-logging-py": { - "hashes": [ - "sha256:118b1fe1f4eacaea6370e5b9710d0f6d0c0a4599aef9d5b9875a6a579974fc9a" - ], - "index": "pypi", - "version": "==0.2" - }, - "json5": { - "hashes": [ - "sha256:823e510eb355949bed817e1f3e2d682455dc6af9daf6066d5698d6a2ca4481c2", - "sha256:9175ad1bc248e22bb8d95a8e8d765958bf0008fef2fe8abab5bc04e0f1ac8302" - ], - "version": "==0.9.6" - }, - "jsonschema": { - "hashes": [ - "sha256:2a0f162822a64d95287990481b45d82f096e99721c86534f48201b64ebca6e8c", - "sha256:390713469ae64b8a58698bb3cbc3859abe6925b565a973f87323ef21b09a27a8" - ], - "markers": "python_version >= '3.7'", - "version": "==4.2.1" - }, - "jupyter": { - "hashes": [ - "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7", - "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78", - "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f" - ], - "index": "pypi", - "version": "==1.0.0" - }, - "jupyter-client": { - "hashes": [ - "sha256:074bdeb1ffaef4a3095468ee16313938cfdc48fc65ca95cc18980b956c2e5d79", - "sha256:8b6e06000eb9399775e0a55c52df6c1be4766666209c22f90c2691ded0e338dc" - ], - "markers": "python_full_version >= '3.6.1'", - "version": "==7.0.6" - }, - "jupyter-console": { - "hashes": [ - "sha256:242248e1685039cd8bff2c2ecb7ce6c1546eb50ee3b08519729e6e881aec19c7", - "sha256:7799c4ea951e0e96ba8260575423cb323ea5a03fcf5503560fa3e15748869e27" - ], - "markers": "python_version >= '3.6'", - "version": "==6.4.0" - }, - "jupyter-core": { - "hashes": [ - "sha256:1c091f3bbefd6f2a8782f2c1db662ca8478ac240e962ae2c66f0b87c818154ea", - "sha256:dce8a7499da5a53ae3afd5a9f4b02e5df1d57250cf48f3ad79da23b4778cd6fa" - ], - "markers": "python_version >= '3.6'", - "version": "==4.9.1" - }, - "jupyter-server": { - "hashes": [ - "sha256:c1f32e0c1807ab2de37bf70af97a36b4436db0bc8af3124632b1f4441038bf95", - "sha256:eb247b555f5bdfb4a219d78e86bc8769456a1a712d8e30a4dbe06e3fe7e8a278" - ], - "markers": "python_version >= '3.6'", - "version": "==1.11.2" - }, - "jupyterlab": { - "hashes": [ - "sha256:215dcbc2674bf1c74eca16b30eac49b882d41503c522ed337fb0053c89565ec8", - "sha256:c970ed2e703831e02171d7bacae35b1e42a227b154bb3684a88ddf64167278bc" - ], - "index": "pypi", - "version": "==3.2.2" - }, - "jupyterlab-pygments": { - "hashes": [ - "sha256:abfb880fd1561987efaefcb2d2ac75145d2a5d0139b1876d5be806e32f630008", - "sha256:cfcda0873626150932f438eccf0f8bf22bfa92345b814890ab360d666b254146" - ], - "version": "==0.1.2" - }, - "jupyterlab-server": { - "hashes": [ - "sha256:26d813c8162c83d466df7d155865987dabe70aa452f9187dfb79fd88afc8fa0b", - "sha256:9507f059ddb3d088674ed76fd3d751cedd940f8a74055e2250bf44babcc2ea1f" - ], - "markers": "python_version >= '3.6'", - "version": "==2.8.2" - }, - "jupyterlab-vim": { - "hashes": [ - "sha256:6722fa3c35425ccca207eddf5f636058d28b8e75fabdb1f680a56762f9921afd", - "sha256:74794f2f298d19c9c362301ef63333681204fc90a18bec0b220c29383749e282" - ], - "index": "pypi", - "version": "==0.14.5" - }, - "jupyterlab-widgets": { - "hashes": [ - "sha256:7885092b2b96bf189c3a705cc3c412a4472ec5e8382d0b47219a66cccae73cfa", - "sha256:f5d9efface8ec62941173ba1cffb2edd0ecddc801c11ae2931e30b50492eb8f7" - ], - "markers": "python_version >= '3.6'", - "version": "==1.0.2" - }, - "keras-applications": { - "hashes": [ - "sha256:5579f9a12bcde9748f4a12233925a59b93b73ae6947409ff34aa2ba258189fe5", - "sha256:df4323692b8c1174af821bf906f1e442e63fa7589bf0f1230a0b6bdc5a810c95" - ], - "index": "pypi", - "version": "==1.0.8" - }, - "kiwisolver": { - "hashes": [ - "sha256:0007840186bacfaa0aba4466d5890334ea5938e0bb7e28078a0eb0e63b5b59d5", - "sha256:19554bd8d54cf41139f376753af1a644b63c9ca93f8f72009d50a2080f870f77", - "sha256:1d45d1c74f88b9f41062716c727f78f2a59a5476ecbe74956fafb423c5c87a76", - "sha256:1d819553730d3c2724582124aee8a03c846ec4362ded1034c16fb3ef309264e6", - "sha256:2210f28778c7d2ee13f3c2a20a3a22db889e75f4ec13a21072eabb5693801e84", - "sha256:22521219ca739654a296eea6d4367703558fba16f98688bd8ce65abff36eaa84", - "sha256:25405f88a37c5f5bcba01c6e350086d65e7465fd1caaf986333d2a045045a223", - "sha256:2b65bd35f3e06a47b5c30ea99e0c2b88f72c6476eedaf8cfbc8e66adb5479dcf", - "sha256:2ddb500a2808c100e72c075cbb00bf32e62763c82b6a882d403f01a119e3f402", - "sha256:2f8f6c8f4f1cff93ca5058d6ec5f0efda922ecb3f4c5fb76181f327decff98b8", - "sha256:30fa008c172355c7768159983a7270cb23838c4d7db73d6c0f6b60dde0d432c6", - "sha256:3dbb3cea20b4af4f49f84cffaf45dd5f88e8594d18568e0225e6ad9dec0e7967", - "sha256:4116ba9a58109ed5e4cb315bdcbff9838f3159d099ba5259c7c7fb77f8537492", - "sha256:44e6adf67577dbdfa2d9f06db9fbc5639afefdb5bf2b4dfec25c3a7fbc619536", - "sha256:5326ddfacbe51abf9469fe668944bc2e399181a2158cb5d45e1d40856b2a0589", - "sha256:70adc3658138bc77a36ce769f5f183169bc0a2906a4f61f09673f7181255ac9b", - "sha256:72be6ebb4e92520b9726d7146bc9c9b277513a57a38efcf66db0620aec0097e0", - "sha256:7843b1624d6ccca403a610d1277f7c28ad184c5aa88a1750c1a999754e65b439", - "sha256:7ba5a1041480c6e0a8b11a9544d53562abc2d19220bfa14133e0cdd9967e97af", - "sha256:80efd202108c3a4150e042b269f7c78643420cc232a0a771743bb96b742f838f", - "sha256:82f49c5a79d3839bc8f38cb5f4bfc87e15f04cbafa5fbd12fb32c941cb529cfb", - "sha256:83d2c9db5dfc537d0171e32de160461230eb14663299b7e6d18ca6dca21e4977", - "sha256:8d93a1095f83e908fc253f2fb569c2711414c0bfd451cab580466465b235b470", - "sha256:8dc3d842fa41a33fe83d9f5c66c0cc1f28756530cd89944b63b072281e852031", - "sha256:9661a04ca3c950a8ac8c47f53cbc0b530bce1b52f516a1e87b7736fec24bfff0", - "sha256:a498bcd005e8a3fedd0022bb30ee0ad92728154a8798b703f394484452550507", - "sha256:a7a4cf5bbdc861987a7745aed7a536c6405256853c94abc9f3287c3fa401b174", - "sha256:b5074fb09429f2b7bc82b6fb4be8645dcbac14e592128beeff5461dcde0af09f", - "sha256:b6a5431940f28b6de123de42f0eb47b84a073ee3c3345dc109ad550a3307dd28", - "sha256:ba677bcaff9429fd1bf01648ad0901cea56c0d068df383d5f5856d88221fe75b", - "sha256:bcadb05c3d4794eb9eee1dddf1c24215c92fb7b55a80beae7a60530a91060560", - "sha256:bf7eb45d14fc036514c09554bf983f2a72323254912ed0c3c8e697b62c4c158f", - "sha256:c358721aebd40c243894298f685a19eb0491a5c3e0b923b9f887ef1193ddf829", - "sha256:c4550a359c5157aaf8507e6820d98682872b9100ce7607f8aa070b4b8af6c298", - "sha256:c6572c2dab23c86a14e82c245473d45b4c515314f1f859e92608dcafbd2f19b8", - "sha256:cba430db673c29376135e695c6e2501c44c256a81495da849e85d1793ee975ad", - "sha256:dedc71c8eb9c5096037766390172c34fb86ef048b8e8958b4e484b9e505d66bc", - "sha256:e6f5eb2f53fac7d408a45fbcdeda7224b1cfff64919d0f95473420a931347ae9", - "sha256:ec2eba188c1906b05b9b49ae55aae4efd8150c61ba450e6721f64620c50b59eb", - "sha256:ee040a7de8d295dbd261ef2d6d3192f13e2b08ec4a954de34a6fb8ff6422e24c", - "sha256:eedd3b59190885d1ebdf6c5e0ca56828beb1949b4dfe6e5d0256a461429ac386", - "sha256:f441422bb313ab25de7b3dbfd388e790eceb76ce01a18199ec4944b369017009", - "sha256:f8eb7b6716f5b50e9c06207a14172cf2de201e41912ebe732846c02c830455b9", - "sha256:fc4453705b81d03568d5b808ad8f09c77c47534f6ac2e72e733f9ca4714aa75c" - ], - "markers": "python_version >= '3.7'", - "version": "==1.3.2" - }, - "knack": { - "hashes": [ - "sha256:4eaa50a1c5e79d1c5c8e5e1705b661721b0b83a089695e59e229cc26c64963b9", - "sha256:5239f85873f524e213e81af7b784bfc08b654006eb418ae0042b9019552399e9" - ], - "version": "==0.8.2" - }, - "lazy-object-proxy": { - "hashes": [ - "sha256:17e0967ba374fc24141738c69736da90e94419338fd4c7c7bef01ee26b339653", - "sha256:1fee665d2638491f4d6e55bd483e15ef21f6c8c2095f235fef72601021e64f61", - "sha256:22ddd618cefe54305df49e4c069fa65715be4ad0e78e8d252a33debf00f6ede2", - "sha256:24a5045889cc2729033b3e604d496c2b6f588c754f7a62027ad4437a7ecc4837", - "sha256:410283732af311b51b837894fa2f24f2c0039aa7f220135192b38fcc42bd43d3", - "sha256:4732c765372bd78a2d6b2150a6e99d00a78ec963375f236979c0626b97ed8e43", - "sha256:489000d368377571c6f982fba6497f2aa13c6d1facc40660963da62f5c379726", - "sha256:4f60460e9f1eb632584c9685bccea152f4ac2130e299784dbaf9fae9f49891b3", - "sha256:5743a5ab42ae40caa8421b320ebf3a998f89c85cdc8376d6b2e00bd12bd1b587", - "sha256:85fb7608121fd5621cc4377a8961d0b32ccf84a7285b4f1d21988b2eae2868e8", - "sha256:9698110e36e2df951c7c36b6729e96429c9c32b3331989ef19976592c5f3c77a", - "sha256:9d397bf41caad3f489e10774667310d73cb9c4258e9aed94b9ec734b34b495fd", - "sha256:b579f8acbf2bdd9ea200b1d5dea36abd93cabf56cf626ab9c744a432e15c815f", - "sha256:b865b01a2e7f96db0c5d12cfea590f98d8c5ba64ad222300d93ce6ff9138bcad", - "sha256:bf34e368e8dd976423396555078def5cfc3039ebc6fc06d1ae2c5a65eebbcde4", - "sha256:c6938967f8528b3668622a9ed3b31d145fab161a32f5891ea7b84f6b790be05b", - "sha256:d1c2676e3d840852a2de7c7d5d76407c772927addff8d742b9808fe0afccebdf", - "sha256:d7124f52f3bd259f510651450e18e0fd081ed82f3c08541dffc7b94b883aa981", - "sha256:d900d949b707778696fdf01036f58c9876a0d8bfe116e8d220cfd4b15f14e741", - "sha256:ebfd274dcd5133e0afae738e6d9da4323c3eb021b3e13052d8cbd0e457b1256e", - "sha256:ed361bb83436f117f9917d282a456f9e5009ea12fd6de8742d1a4752c3017e93", - "sha256:f5144c75445ae3ca2057faac03fda5a902eff196702b0a24daf1d6ce0650514b" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.6.0" - }, - "lru-dict": { - "hashes": [ - "sha256:45b81f67d75341d4433abade799a47e9c42a9e22a118531dcb5e549864032d7c" - ], - "index": "pypi", - "version": "==1.1.7" - }, - "markdown-it-py": { + "markdown-it-py": { "hashes": [ "sha256:36be6bb3ad987bfdb839f5ba78ddf094552ca38ccbd784ae4f74a4e1419fc6e3", "sha256:98080fc0bc34c4f2bcf0846a096a9429acbd9d5d8e67ed34026c03c61c464389" @@ -2372,45 +1546,44 @@ }, "matplotlib": { "hashes": [ - "sha256:01c9de93a2ca0d128c9064f23709362e7fefb34910c7c9e0b8ab0de8258d5eda", - "sha256:41b6e307458988891fcdea2d8ecf84a8c92d53f84190aa32da65f9505546e684", - "sha256:48e1e0859b54d5f2e29bb78ca179fd59b971c6ceb29977fb52735bfd280eb0f5", - "sha256:54a026055d5f8614f184e588f6e29064019a0aa8448450214c0b60926d62d919", - "sha256:556965514b259204637c360d213de28d43a1f4aed1eca15596ce83f768c5a56f", - "sha256:5c988bb43414c7c2b0a31bd5187b4d27fd625c080371b463a6d422047df78913", - "sha256:6a724e3a48a54b8b6e7c4ae38cd3d07084508fa47c410c8757e9db9791421838", - "sha256:6be8df61b1626e1a142c57e065405e869e9429b4a6dab4a324757d0dc4d42235", - "sha256:844a7b0233e4ff7fba57e90b8799edaa40b9e31e300b8d5efc350937fa8b1bea", - "sha256:85f0c9cf724715e75243a7b3087cf4a3de056b55e05d4d76cc58d610d62894f3", - "sha256:a78a3b51f29448c7f4d4575e561f6b0dbb8d01c13c2046ab6c5220eb25c06506", - "sha256:b884715a59fec9ad3b6048ecf3860f3b2ce965e676ef52593d6fa29abcf7d330", - "sha256:b8b53f336a4688cfce615887505d7e41fd79b3594bf21dd300531a4f5b4f746a", - "sha256:c70b6311dda3e27672f1bf48851a0de816d1ca6aaf3d49365fbdd8e959b33d2b", - "sha256:ebfb01a65c3f5d53a8c2a8133fec2b5221281c053d944ae81ff5822a68266617", - "sha256:eeb1859efe7754b1460e1d4991bbd4a60a56f366bc422ef3a9c5ae05f0bc70b5", - "sha256:f15edcb0629a0801738925fe27070480f446fcaa15de65946ff946ad99a59a40", - "sha256:f1c5efc278d996af8a251b2ce0b07bbeccb821f25c8c9846bdcb00ffc7f158aa", - "sha256:f72657f1596199dc1e4e7a10f52a4784ead8a711f4e5b59bea95bdb97cf0e4fd", - "sha256:fc4f526dfdb31c9bd6b8ca06bf9fab663ca12f3ec9cdf4496fb44bc680140318", - "sha256:fcd6f1954943c0c192bfbebbac263f839d7055409f1173f80d8b11a224d236da" + "sha256:0abf8b51cc6d3ba34d1b15b26e329f23879848a0cf1216954c1f432ffc7e1af7", + "sha256:0e020a42f3338823a393dd2f80e39a2c07b9f941dfe2c778eb104eeb33d60bb5", + "sha256:13930a0c9bec0fd25f43c448b047a21af1353328b946f044a8fc3be077c6b1a8", + "sha256:153a0cf6a6ff4f406a0600d2034710c49988bacc6313d193b32716f98a697580", + "sha256:18f6e52386300db5cc4d1e9019ad9da2e80658bab018834d963ebb0aa5355095", + "sha256:2089b9014792dcc87bb1d620cde847913338abf7d957ef05587382b0cb76d44e", + "sha256:2eea16883aa7724c95eea0eb473ab585c6cf66f0e28f7f13e63deb38f4fd6d0f", + "sha256:38892a254420d95594285077276162a5e9e9c30b6da08bdc2a4d53331ad9a6fa", + "sha256:4b018ea6f26424a0852eb60eb406420d9f0d34f65736ea7bbfbb104946a66d86", + "sha256:65f877882b7ddede7090c7d87be27a0f4720fe7fc6fddd4409c06e1aa0f1ae8d", + "sha256:666d717a4798eb9c5d3ae83fe80c7bc6ed696b93e879cb01cb24a74155c73612", + "sha256:66b172610db0ececebebb09d146f54205f87c7b841454e408fba854764f91bdd", + "sha256:6db02c5605f063b67780f4d5753476b6a4944343284aa4e93c5e8ff6e9ec7f76", + "sha256:6e0e6b2111165522ad336705499b1f968c34a9e84d05d498ee5af0b5697d1efe", + "sha256:71a1851111f23f82fc43d2b6b2bfdd3f760579a664ebc939576fe21cc6133d01", + "sha256:7a7cb59ebd63a8ac4542ec1c61dd08724f82ec3aa7bb6b4b9e212d43c611ce3d", + "sha256:7baf23adb698d8c6ca7339c9dde00931bc47b2dd82fa912827fef9f93db77f5e", + "sha256:970aa97297537540369d05fe0fd1bb952593f9ab696c9b427c06990a83e2418b", + "sha256:9bac8eb1eccef540d7f4e844b6313d9f7722efd48c07e1b4bfec1056132127fd", + "sha256:a07ff2565da72a7b384a9e000b15b6b8270d81370af8a3531a16f6fbcee023cc", + "sha256:a0dcaf5648cecddc328e81a0421821a1f65a1d517b20746c94a1f0f5c36fb51a", + "sha256:a0ea10faa3bab0714d3a19c7e0921279a68d57552414d6eceaea99f97d7735db", + "sha256:a5b62d1805cc83d755972033c05cea78a1e177a159fc84da5c9c4ab6303ccbd9", + "sha256:a6cef5b31e27c31253c0f852b629a38d550ae66ec6850129c49d872f9ee428cb", + "sha256:a7bf8b05c214d32fb7ca7c001fde70b9b426378e897b0adbf77b85ea3569d56a", + "sha256:ac17a7e7b06ee426a4989f0b7f24ab1a592e39cdf56353a90f4e998bc0bf44d6", + "sha256:b3b687e905da32e5f2e5f16efa713f5d1fcd9fb8b8c697895de35c91fedeb086", + "sha256:b5e439d9e55d645f2a4dca63e2f66d68fe974c405053b132d61c7e98c25dfeb2", + "sha256:ba107add08e12600b072cf3c47aaa1ab85dd4d3c48107a5d3377d1bf80f8b235", + "sha256:d092b7ba63182d2dd427904e3eb58dd5c46ec67c5968de14a4b5007010a3a4cc", + "sha256:dc8c5c23e7056e126275dbf29efba817b3d94196690930d0968873ac3a94ab82", + "sha256:df0042cab69f4d246f4cb8fc297770ac4ae6ec2983f61836b04a117722037dcd", + "sha256:ee3d9ff16d749a9aa521bd7d86f0dbf256b2d2ac8ce31b19e4d2c86d2f2ff0b6", + "sha256:f23fbf70d2e80f4e03a83fc1206a8306d9bc50482fee4239f10676ce7e470c83", + "sha256:ff5d9fe518ad2de14ce82ab906b6ab5c2b0c7f4f984400ff8a7a905daa580a0a" ], "index": "pypi", - "version": "==3.4.3" - }, - "matplotlib-inline": { - "hashes": [ - "sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee", - "sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c" - ], - "markers": "python_version >= '3.5'", - "version": "==0.1.3" - }, - "mccabe": { - "hashes": [ - "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", - "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" - ], - "version": "==0.6.1" + "version": "==3.5.0" }, "mdit-py-plugins": { "hashes": [ @@ -2420,127 +1593,6 @@ "markers": "python_version ~= '3.6'", "version": "==0.2.8" }, - "mistune": { - "hashes": [ - "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e", - "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4" - ], - "version": "==0.8.4" - }, - "mock": { - "hashes": [ - "sha256:122fcb64ee37cfad5b3f48d7a7d51875d7031aaf3d8be7c42e2bee25044eee62", - "sha256:7d3fbbde18228f4ff2f1f119a45cdffa458b4c0dee32eb4d2bb2f82554bac7bc" - ], - "index": "pypi", - "version": "==4.0.3" - }, - "mpld3": { - "hashes": [ - "sha256:b080f3535238a71024c0158280ab4f6091717c45347c41c907012f8dd6da1bd5" - ], - "index": "pypi", - "version": "==0.5.5" - }, - "msal": { - "hashes": [ - "sha256:240fb04dba46a27fd6a3178db8334412d0d02e0be85166f9e05bb45d03399084", - "sha256:a421a43413335099228f1d9ad93f7491d7c7c40044108290e4923fe58f41a332" - ], - "version": "==1.16.0" - }, - "msal-extensions": { - "hashes": [ - "sha256:5523dfa15da88297e90d2e73486c8ef875a17f61ea7b7e2953a300432c2e7861", - "sha256:a530c2d620061822f2ced8e29da301bc928b146970df635c852907423e8ddddc" - ], - "version": "==0.3.0" - }, - "msgpack-python": { - "hashes": [ - "sha256:378cc8a6d3545b532dfd149da715abae4fda2a3adb6d74e525d0d5e51f46909b" - ], - "index": "pypi", - "version": "==0.5.6" - }, - "multidict": { - "hashes": [ - "sha256:06560fbdcf22c9387100979e65b26fba0816c162b888cb65b845d3def7a54c9b", - "sha256:067150fad08e6f2dd91a650c7a49ba65085303fcc3decbd64a57dc13a2733031", - "sha256:0a2cbcfbea6dc776782a444db819c8b78afe4db597211298dd8b2222f73e9cd0", - "sha256:0dd1c93edb444b33ba2274b66f63def8a327d607c6c790772f448a53b6ea59ce", - "sha256:0fed465af2e0eb6357ba95795d003ac0bdb546305cc2366b1fc8f0ad67cc3fda", - "sha256:116347c63ba049c1ea56e157fa8aa6edaf5e92925c9b64f3da7769bdfa012858", - "sha256:1b4ac3ba7a97b35a5ccf34f41b5a8642a01d1e55454b699e5e8e7a99b5a3acf5", - "sha256:1c7976cd1c157fa7ba5456ae5d31ccdf1479680dc9b8d8aa28afabc370df42b8", - "sha256:246145bff76cc4b19310f0ad28bd0769b940c2a49fc601b86bfd150cbd72bb22", - "sha256:25cbd39a9029b409167aa0a20d8a17f502d43f2efebfe9e3ac019fe6796c59ac", - "sha256:28e6d883acd8674887d7edc896b91751dc2d8e87fbdca8359591a13872799e4e", - "sha256:2d1d55cdf706ddc62822d394d1df53573d32a7a07d4f099470d3cb9323b721b6", - "sha256:2e77282fd1d677c313ffcaddfec236bf23f273c4fba7cdf198108f5940ae10f5", - "sha256:32fdba7333eb2351fee2596b756d730d62b5827d5e1ab2f84e6cbb287cc67fe0", - "sha256:35591729668a303a02b06e8dba0eb8140c4a1bfd4c4b3209a436a02a5ac1de11", - "sha256:380b868f55f63d048a25931a1632818f90e4be71d2081c2338fcf656d299949a", - "sha256:3822c5894c72e3b35aae9909bef66ec83e44522faf767c0ad39e0e2de11d3b55", - "sha256:38ba256ee9b310da6a1a0f013ef4e422fca30a685bcbec86a969bd520504e341", - "sha256:3bc3b1621b979621cee9f7b09f024ec76ec03cc365e638126a056317470bde1b", - "sha256:3d2d7d1fff8e09d99354c04c3fd5b560fb04639fd45926b34e27cfdec678a704", - "sha256:517d75522b7b18a3385726b54a081afd425d4f41144a5399e5abd97ccafdf36b", - "sha256:5f79c19c6420962eb17c7e48878a03053b7ccd7b69f389d5831c0a4a7f1ac0a1", - "sha256:5f841c4f14331fd1e36cbf3336ed7be2cb2a8f110ce40ea253e5573387db7621", - "sha256:637c1896497ff19e1ee27c1c2c2ddaa9f2d134bbb5e0c52254361ea20486418d", - "sha256:6ee908c070020d682e9b42c8f621e8bb10c767d04416e2ebe44e37d0f44d9ad5", - "sha256:77f0fb7200cc7dedda7a60912f2059086e29ff67cefbc58d2506638c1a9132d7", - "sha256:7878b61c867fb2df7a95e44b316f88d5a3742390c99dfba6c557a21b30180cac", - "sha256:78c106b2b506b4d895ddc801ff509f941119394b89c9115580014127414e6c2d", - "sha256:8b911d74acdc1fe2941e59b4f1a278a330e9c34c6c8ca1ee21264c51ec9b67ef", - "sha256:93de39267c4c676c9ebb2057e98a8138bade0d806aad4d864322eee0803140a0", - "sha256:9416cf11bcd73c861267e88aea71e9fcc35302b3943e45e1dbb4317f91a4b34f", - "sha256:94b117e27efd8e08b4046c57461d5a114d26b40824995a2eb58372b94f9fca02", - "sha256:9815765f9dcda04921ba467957be543423e5ec6a1136135d84f2ae092c50d87b", - "sha256:98ec9aea6223adf46999f22e2c0ab6cf33f5914be604a404f658386a8f1fba37", - "sha256:a37e9a68349f6abe24130846e2f1d2e38f7ddab30b81b754e5a1fde32f782b23", - "sha256:a43616aec0f0d53c411582c451f5d3e1123a68cc7b3475d6f7d97a626f8ff90d", - "sha256:a4771d0d0ac9d9fe9e24e33bed482a13dfc1256d008d101485fe460359476065", - "sha256:a5635bcf1b75f0f6ef3c8a1ad07b500104a971e38d3683167b9454cb6465ac86", - "sha256:a9acb76d5f3dd9421874923da2ed1e76041cb51b9337fd7f507edde1d86535d6", - "sha256:ac42181292099d91217a82e3fa3ce0e0ddf3a74fd891b7c2b347a7f5aa0edded", - "sha256:b227345e4186809d31f22087d0265655114af7cda442ecaf72246275865bebe4", - "sha256:b61f85101ef08cbbc37846ac0e43f027f7844f3fade9b7f6dd087178caedeee7", - "sha256:b70913cbf2e14275013be98a06ef4b412329fe7b4f83d64eb70dce8269ed1e1a", - "sha256:b9aad49466b8d828b96b9e3630006234879c8d3e2b0a9d99219b3121bc5cdb17", - "sha256:baf1856fab8212bf35230c019cde7c641887e3fc08cadd39d32a421a30151ea3", - "sha256:bd6c9c50bf2ad3f0448edaa1a3b55b2e6866ef8feca5d8dbec10ec7c94371d21", - "sha256:c1ff762e2ee126e6f1258650ac641e2b8e1f3d927a925aafcfde943b77a36d24", - "sha256:c30ac9f562106cd9e8071c23949a067b10211917fdcb75b4718cf5775356a940", - "sha256:c9631c642e08b9fff1c6255487e62971d8b8e821808ddd013d8ac058087591ac", - "sha256:cdd68778f96216596218b4e8882944d24a634d984ee1a5a049b300377878fa7c", - "sha256:ce8cacda0b679ebc25624d5de66c705bc53dcc7c6f02a7fb0f3ca5e227d80422", - "sha256:cfde464ca4af42a629648c0b0d79b8f295cf5b695412451716531d6916461628", - "sha256:d3def943bfd5f1c47d51fd324df1e806d8da1f8e105cc7f1c76a1daf0f7e17b0", - "sha256:d9b668c065968c5979fe6b6fa6760bb6ab9aeb94b75b73c0a9c1acf6393ac3bf", - "sha256:da7d57ea65744d249427793c042094c4016789eb2562576fb831870f9c878d9e", - "sha256:dc3a866cf6c13d59a01878cd806f219340f3e82eed514485e094321f24900677", - "sha256:df23c83398715b26ab09574217ca21e14694917a0c857e356fd39e1c64f8283f", - "sha256:dfc924a7e946dd3c6360e50e8f750d51e3ef5395c95dc054bc9eab0f70df4f9c", - "sha256:e4a67f1080123de76e4e97a18d10350df6a7182e243312426d508712e99988d4", - "sha256:e5283c0a00f48e8cafcecadebfa0ed1dac8b39e295c7248c44c665c16dc1138b", - "sha256:e58a9b5cc96e014ddf93c2227cbdeca94b56a7eb77300205d6e4001805391747", - "sha256:e6453f3cbeb78440747096f239d282cc57a2997a16b5197c9bc839099e1633d0", - "sha256:e6c4fa1ec16e01e292315ba76eb1d012c025b99d22896bd14a66628b245e3e01", - "sha256:e7d81ce5744757d2f05fc41896e3b2ae0458464b14b5a2c1e87a6a9d69aefaa8", - "sha256:ea21d4d5104b4f840b91d9dc8cbc832aba9612121eaba503e54eaab1ad140eb9", - "sha256:ecc99bce8ee42dcad15848c7885197d26841cb24fa2ee6e89d23b8993c871c64", - "sha256:f0bb0973f42ffcb5e3537548e0767079420aefd94ba990b61cf7bb8d47f4916d", - "sha256:f19001e790013ed580abfde2a4465388950728861b52f0da73e8e8a9418533c0", - "sha256:f76440e480c3b2ca7f843ff8a48dc82446b86ed4930552d736c0bac507498a52", - "sha256:f9bef5cff994ca3026fcc90680e326d1a19df9841c5e3d224076407cc21471a1", - "sha256:fc66d4016f6e50ed36fb39cd287a3878ffcebfa90008535c62e0e90a7ab713ae", - "sha256:fd77c8f3cba815aa69cb97ee2b2ef385c7c12ada9c734b0f3b32e26bb88bbf1d" - ], - "markers": "python_version >= '3.6'", - "version": "==5.2.0" - }, "mypy": { "hashes": [ "sha256:088cd9c7904b4ad80bec811053272986611b84221835e079be5bcad029e79dd9", @@ -2585,54 +1637,6 @@ "index": "pypi", "version": "==0.15.2" }, - "nbclassic": { - "hashes": [ - "sha256:9c7b7987a148ecdd1827b47fe6f6968b2ddabf663142f81254000cb77ee5bd10", - "sha256:f00b07ef4908fc38fd332d2676ccd3ceea5076528feaf21bd27e809ef20f5578" - ], - "markers": "python_version >= '3.6'", - "version": "==0.3.4" - }, - "nbclient": { - "hashes": [ - "sha256:542b1dfd492bc2524fff52064461149208ac3d53fa6353ce21da2219910b0cfc", - "sha256:ed7d18431393750d29a64da432e0b7889274eb5a5056682be5691b1b1dc8f755" - ], - "markers": "python_full_version >= '3.6.1'", - "version": "==0.5.5" - }, - "nbconvert": { - "hashes": [ - "sha256:16ceecd0afaa8fd26c245fa32e2c52066c02f13aa73387fffafd84750baea863", - "sha256:b1b9dc4f1ff6cafae0e6d91f42fb9046fdc32e6beb6d7e2fa2cd7191ad535240" - ], - "markers": "python_version >= '3.7'", - "version": "==6.2.0" - }, - "nbformat": { - "hashes": [ - "sha256:b516788ad70771c6250977c1374fcca6edebe6126fd2adb5a69aa5c2356fd1c8", - "sha256:eb8447edd7127d043361bc17f2f5a807626bc8e878c7709a1c647abda28a9171" - ], - "markers": "python_version >= '3.5'", - "version": "==5.1.3" - }, - "nest-asyncio": { - "hashes": [ - "sha256:76d6e972265063fe92a90b9cc4fb82616e07d586b346ed9d2c89a4187acea39c", - "sha256:afc5a1c515210a23c461932765691ad39e8eba6551c055ac8d5546e69250d0aa" - ], - "markers": "python_version >= '3.5'", - "version": "==1.5.1" - }, - "networkx": { - "hashes": [ - "sha256:80b6b89c77d1dfb64a4c7854981b60aeea6360ac02c6d4e4913319e0a313abef", - "sha256:c0946ed31d71f1b732b5aaa6da5a0388a345019af232ce2f49c766e2d6795c51" - ], - "index": "pypi", - "version": "==2.6.3" - }, "nodeenv": { "hashes": [ "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b", @@ -2640,14 +1644,6 @@ ], "version": "==1.6.0" }, - "notebook": { - "hashes": [ - "sha256:872e20da9ae518bbcac3e4e0092d5bd35454e847dedb8cb9739e9f3b68406be0", - "sha256:f7b4362698fed34f44038de0517b2e5136c1e7c379797198c1736121d3d597bd" - ], - "markers": "python_version >= '3.6'", - "version": "==6.4.5" - }, "numpy": { "hashes": [ "sha256:0b78ecfa070460104934e2caf51694ccd00f37d5e5dbe76f021b1b0b0d221823", @@ -2720,26 +1716,6 @@ "index": "pypi", "version": "==4.5.4.58" }, - "osmium": { - "hashes": [ - "sha256:36e2fec6ef00f0c13ec81cdb13b1d70a8d8a9a61094ea08b2a448f98bb62a6e2", - "sha256:3f3a79c895f86109b72f048bac50d36c9527b61a1701df74aa94495e1fc9ef46", - "sha256:5dcfc48205785ad56524e883e121866258d951ac6765cf181c213a37de3d5071", - "sha256:6a4a36328c85dcacda88e6d838bf5b6ecc04cacc427660a3fddb9bba701fe436", - "sha256:82102179fd3fefb61db6a70e96ed668d335fee29f6e45ef8d484b21e7daa02a4", - "sha256:a572773655e9fefcb51aacf90b2f599064f0f855c968ccf66f74c3f410e68665", - "sha256:ab691a1a4f077946f139658bf11c4b73f0c59606d747d30c6a7bd61841f67771", - "sha256:acbbf5ebf7e77e753d96431f4f4b0598663a2eec287120f0184b3d894cc54ddb", - "sha256:ae4e8e52ddf67db9f499fb25010933bf36e976ebd820600d0e67720ab90bccf1", - "sha256:b94b3c792a8f148e654f838382f4c5fb34eeea5dd13c2ebc34f5ce43c4744956", - "sha256:c23c6aa1903ddebbaff6e1969c37c46bfc00b845f51e35be2f52c1153b7f4fff", - "sha256:d285c91b1d87cdc25e44243f8685ccc09de26a6287e6cbd891cf4b0eb0b2fc40", - "sha256:e156143a6e0661a6f04608f6c73cb939bccb96f51e59bb46f59cfa0fd6a93303", - "sha256:eb6d42a550997bbe1de12d6a1747d51ddc26c7d3118c6d22159703efa57c9d5a" - ], - "index": "pypi", - "version": "==3.2.0" - }, "packaging": { "hashes": [ "sha256:096d689d78ca690e4cd8a89568ba06d07ca097e3306a4381635073ca91479966", @@ -2748,44 +1724,6 @@ "markers": "python_version >= '3.6'", "version": "==21.2" }, - "pandas": { - "hashes": [ - "sha256:003ba92db58b71a5f8add604a17a059f3068ef4e8c0c365b088468d0d64935fd", - "sha256:10e10a2527db79af6e830c3d5842a4d60383b162885270f8cffc15abca4ba4a9", - "sha256:22808afb8f96e2269dcc5b846decacb2f526dd0b47baebc63d913bf847317c8f", - "sha256:2d1dc09c0013d8faa7474574d61b575f9af6257ab95c93dcf33a14fd8d2c1bab", - "sha256:35c77609acd2e4d517da41bae0c11c70d31c87aae8dd1aabd2670906c6d2c143", - "sha256:372d72a3d8a5f2dbaf566a5fa5fa7f230842ac80f29a931fb4b071502cf86b9a", - "sha256:42493f8ae67918bf129869abea8204df899902287a7f5eaf596c8e54e0ac7ff4", - "sha256:4acc28364863127bca1029fb72228e6f473bb50c32e77155e80b410e2068eeac", - "sha256:5298a733e5bfbb761181fd4672c36d0c627320eb999c59c65156c6a90c7e1b4f", - "sha256:5ba0aac1397e1d7b654fccf263a4798a9e84ef749866060d19e577e927d66e1b", - "sha256:9707bdc1ea9639c886b4d3be6e2a45812c1ac0c2080f94c31b71c9fa35556f9b", - "sha256:a2aa18d3f0b7d538e21932f637fbfe8518d085238b429e4790a35e1e44a96ffc", - "sha256:a388960f979665b447f0847626e40f99af8cf191bce9dc571d716433130cb3a7", - "sha256:a51528192755f7429c5bcc9e80832c517340317c861318fea9cea081b57c9afd", - "sha256:b528e126c13816a4374e56b7b18bfe91f7a7f6576d1aadba5dee6a87a7f479ae", - "sha256:c1aa4de4919358c5ef119f6377bc5964b3a7023c23e845d9db7d9016fa0c5b1c", - "sha256:c2646458e1dce44df9f71a01dc65f7e8fa4307f29e5c0f2f92c97f47a5bf22f5", - "sha256:c2f44425594ae85e119459bb5abb0748d76ef01d9c08583a667e3339e134218e", - "sha256:d47750cf07dee6b55d8423471be70d627314277976ff2edd1381f02d52dbadf9", - "sha256:d99d2350adb7b6c3f7f8f0e5dfb7d34ff8dd4bc0a53e62c445b7e43e163fce63", - "sha256:dd324f8ee05925ee85de0ea3f0d66e1362e8c80799eb4eb04927d32335a3e44a", - "sha256:eaca36a80acaacb8183930e2e5ad7f71539a66805d6204ea88736570b2876a7b", - "sha256:f567e972dce3bbc3a8076e0b675273b4a9e8576ac629149cf8286ee13c259ae5", - "sha256:fe48e4925455c964db914b958f6e7032d285848b7538a5e1b19aeb26ffaea3ec" - ], - "markers": "python_full_version >= '3.7.1'", - "version": "==1.3.4" - }, - "pandocfilters": { - "hashes": [ - "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38", - "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.5.0" - }, "parameterized": { "hashes": [ "sha256:41bbff37d6186430f77f900d777e5bb6a24928a1c46fb1de692f8b52b8833b5c", @@ -2802,29 +1740,6 @@ "index": "pypi", "version": "==2.8.0" }, - "parso": { - "hashes": [ - "sha256:12b83492c6239ce32ff5eed6d3639d6a536170723c6f3f1506869f1ace413398", - "sha256:a8c4922db71e4fdb90e0d0bc6e50f9b273d3397925e5e60a717e719201778d22" - ], - "markers": "python_version >= '3.6'", - "version": "==0.8.2" - }, - "pexpect": { - "hashes": [ - "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937", - "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c" - ], - "markers": "sys_platform != 'win32'", - "version": "==4.8.0" - }, - "pickleshare": { - "hashes": [ - "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca", - "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56" - ], - "version": "==0.7.5" - }, "pillow": { "hashes": [ "sha256:066f3999cb3b070a95c3652712cffa1a748cd02d60ad7b4e485c3748a04d9d76", @@ -2872,13 +1787,6 @@ "index": "pypi", "version": "==8.4.0" }, - "pkginfo": { - "hashes": [ - "sha256:37ecd857b47e5f55949c41ed061eb51a0bee97a87c969219d144c0e023982779", - "sha256:e7432f81d08adec7297633191bbf0bd47faf13cd8724c3a13250e51d542635bd" - ], - "version": "==1.7.1" - }, "platformdirs": { "hashes": [ "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2", @@ -2887,14 +1795,6 @@ "markers": "python_version >= '3.6'", "version": "==2.4.0" }, - "portalocker": { - "hashes": [ - "sha256:34cb36c618d88bcd9079beb36dcdc1848a3e3d92ac4eac59055bdeafc39f9d4a", - "sha256:6d6f5de5a3e68c4dd65a98ec1babb26d28ccc5e770e07b672d65d5a35e4b2d8a" - ], - "markers": "platform_system != 'Windows'", - "version": "==1.7.1" - }, "pprofile": { "hashes": [ "sha256:b2bb56603dadf40c0bc0f61621f22c20e41638425f729945d9b7f8e4ae8cdd4a" @@ -2910,64 +1810,6 @@ "index": "pypi", "version": "==2.15.0" }, - "prometheus-client": { - "hashes": [ - "sha256:1b12ba48cee33b9b0b9de64a1047cbd3c5f2d0ab6ebcead7ddda613a750ec3c5", - "sha256:317453ebabff0a1b02df7f708efbab21e3489e7072b61cb6957230dd004a0af0" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.12.0" - }, - "prompt-toolkit": { - "hashes": [ - "sha256:449f333dd120bd01f5d296a8ce1452114ba3a71fae7288d2f0ae2c918764fa72", - "sha256:48d85cdca8b6c4f16480c7ce03fd193666b62b0a21667ca56b4bb5ad679d1170" - ], - "markers": "python_full_version >= '3.6.2'", - "version": "==3.0.22" - }, - "psutil": { - "hashes": [ - "sha256:0066a82f7b1b37d334e68697faba68e5ad5e858279fd6351c8ca6024e8d6ba64", - "sha256:02b8292609b1f7fcb34173b25e48d0da8667bc85f81d7476584d889c6e0f2131", - "sha256:0ae6f386d8d297177fd288be6e8d1afc05966878704dad9847719650e44fc49c", - "sha256:0c9ccb99ab76025f2f0bbecf341d4656e9c1351db8cc8a03ccd62e318ab4b5c6", - "sha256:0dd4465a039d343925cdc29023bb6960ccf4e74a65ad53e768403746a9207023", - "sha256:12d844996d6c2b1d3881cfa6fa201fd635971869a9da945cf6756105af73d2df", - "sha256:1bff0d07e76114ec24ee32e7f7f8d0c4b0514b3fae93e3d2aaafd65d22502394", - "sha256:245b5509968ac0bd179287d91210cd3f37add77dad385ef238b275bad35fa1c4", - "sha256:28ff7c95293ae74bf1ca1a79e8805fcde005c18a122ca983abf676ea3466362b", - "sha256:36b3b6c9e2a34b7d7fbae330a85bf72c30b1c827a4366a07443fc4b6270449e2", - "sha256:52de075468cd394ac98c66f9ca33b2f54ae1d9bff1ef6b67a212ee8f639ec06d", - "sha256:5da29e394bdedd9144c7331192e20c1f79283fb03b06e6abd3a8ae45ffecee65", - "sha256:61f05864b42fedc0771d6d8e49c35f07efd209ade09a5afe6a5059e7bb7bf83d", - "sha256:6223d07a1ae93f86451d0198a0c361032c4c93ebd4bf6d25e2fb3edfad9571ef", - "sha256:6323d5d845c2785efb20aded4726636546b26d3b577aded22492908f7c1bdda7", - "sha256:6ffe81843131ee0ffa02c317186ed1e759a145267d54fdef1bc4ea5f5931ab60", - "sha256:74f2d0be88db96ada78756cb3a3e1b107ce8ab79f65aa885f76d7664e56928f6", - "sha256:74fb2557d1430fff18ff0d72613c5ca30c45cdbfcddd6a5773e9fc1fe9364be8", - "sha256:90d4091c2d30ddd0a03e0b97e6a33a48628469b99585e2ad6bf21f17423b112b", - "sha256:90f31c34d25b1b3ed6c40cdd34ff122b1887a825297c017e4cbd6796dd8b672d", - "sha256:99de3e8739258b3c3e8669cb9757c9a861b2a25ad0955f8e53ac662d66de61ac", - "sha256:c6a5fd10ce6b6344e616cf01cc5b849fa8103fbb5ba507b6b2dee4c11e84c935", - "sha256:ce8b867423291cb65cfc6d9c4955ee9bfc1e21fe03bb50e177f2b957f1c2469d", - "sha256:d225cd8319aa1d3c85bf195c4e07d17d3cd68636b8fc97e6cf198f782f99af28", - "sha256:ea313bb02e5e25224e518e4352af4bf5e062755160f77e4b1767dd5ccb65f876", - "sha256:ea372bcc129394485824ae3e3ddabe67dc0b118d262c568b4d2602a7070afdb0", - "sha256:f4634b033faf0d968bb9220dd1c793b897ab7f1189956e1aa9eae752527127d3", - "sha256:fcc01e900c1d7bee2a37e5d6e4f9194760a93597c97fee89c4ae51701de03563" - ], - "index": "pypi", - "version": "==5.8.0" - }, - "ptyprocess": { - "hashes": [ - "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", - "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" - ], - "markers": "os_name != 'nt'", - "version": "==0.7.0" - }, "pycparser": { "hashes": [ "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", @@ -3030,167 +1872,30 @@ "sha256:b400edd7391972e75b4243113089d6ea10b032e1306e8721efabb36d33c2d0f2", "sha256:b545634f96132af1d31dcb873cf03a9c4a5654ae39d9ee126db0b2eba2806788", "sha256:ba5bf655c892bbf4a9bafb4fcbc4c71023cc9a65f0cae0f3eba09a11018a858e", - "sha256:bb55368d455ab9518b97febd33a8d417988397b019c9408993be034e0b5a7db6", - "sha256:c1eb91198fc47c2e4fdc19c544b5d94534a70fd877f5c342228feb05e9fc4bef", - "sha256:c28c6f764aa03a0245db12346f1da327c6f49bcc20e53aefec6eed57e4fbe1ce", - "sha256:c6ee571995527e779b46cafee7ebef2dceb1a9c375143828e019293ff0efa167", - "sha256:c84a93e6d33dafce9e25080ac557342333e15ef7e378ba84cb6181c52a8fd663", - "sha256:d4061ac4e81bb36ec8f0a7027582c1c4dd32a939882e008165627103cb0b3985", - "sha256:d5c62fbdb30082f7e1dcfa253da48e7b4be7342d275b34b2efa51f6cffc5942b", - "sha256:e533f4bf9dc1a91cfd608b9bfb028c6a92383e731c502660933f0f9b812045a6", - "sha256:e9368c105a8bccc8adfe7fd7fa5220d2b6c03979a3a57a8178c42f6fa9914ebc", - "sha256:f628f9f26c8dadf72fabc9ae0ce5fe7f60d76be71a3407abc756b4d1fd030fa0", - "sha256:f8379052cfbc278b11e31bc97f2e7f5998959c50837c4d54f4e424a541e0c5d9", - "sha256:fad7b5351931cb68d19d7ecc0b21021fe23237d8fba8c455b5af4a79e1c7c536", - "sha256:fdd488daa4ad33748d5ea806e311bfe01b9cc506def5288400072fcd66d226cf" - ], - "index": "pypi", - "version": "==2.1.0" - }, - "pygments": { - "hashes": [ - "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380", - "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6" - ], - "index": "pypi", - "version": "==2.10.0" - }, - "pyjwt": { - "hashes": [ - "sha256:b888b4d56f06f6dcd777210c334e69c737be74755d3e5e9ee3fe67dc18a0ee41", - "sha256:e0c4bb8d9f0af0c7f5b1ec4c5036309617d03d56932877f2f7a0beeb5318322f" - ], - "index": "pypi", - "version": "==2.3.0" - }, - "pylint": { - "hashes": [ - "sha256:0f358e221c45cbd4dad2a1e4b883e75d28acdcccd29d40c76eb72b307269b126", - "sha256:2c9843fff1a88ca0ad98a256806c82c5a8f86086e7ccbdb93297d86c3f90c436" - ], - "index": "pypi", - "version": "==2.11.1" - }, - "pymongo": { - "hashes": [ - "sha256:02e0c088f189ca69fac094cb5f851b43bbbd7cec42114495777d4d8f297f7f8a", - "sha256:138248c542051eb462f88b50b0267bd5286d6661064bab06faa0ef6ac30cdb4b", - "sha256:13a7c6d055af58a1e9c505e736da8b6a2e95ccc8cec10b008143f7a536e5de8a", - "sha256:13d74bf3435c1e58d8fafccc0d5e87f246ae2c6e9cbef4b35e32a1c3759e354f", - "sha256:15dae01341571d0af51526b7a21648ca575e9375e16ba045c9860848dfa8952f", - "sha256:17238115e6d37f5423b046cb829f1ca02c4ea7edb163f5b8b88e0c975dc3fec9", - "sha256:180b405e17b90a877ea5dbc5efe7f4c171af4c89323148e100c0f12cedb86f12", - "sha256:1821ce4e5a293313947fd017bbd2d2535aa6309680fa29b33d0442d15da296ec", - "sha256:1a7b138a04fdd17849930dc8bf664002e17db38448850bfb96d200c9c5a8b3a1", - "sha256:1c4e51a3b69789b6f468a8e881a13f2d1e8f5e99e41f80fd44845e6ec0f701e1", - "sha256:1d55982e5335925c55e2b87467043866ce72bd30ea7e7e3eeed6ec3d95a806d4", - "sha256:1fa6f08ddb6975371777f97592d35c771e713ee2250e55618148a5e57e260aff", - "sha256:2174d3279b8e2b6d7613b338f684cd78ff7adf1e7ec5b7b7bde5609a129c9898", - "sha256:2462a68f6675da548e333fa299d8e9807e00f95a4d198cfe9194d7be69f40c9b", - "sha256:25fd76deabe9ea37c8360c362b32f702cc095a208dd1c5328189938ca7685847", - "sha256:287c2a0063267c1458c4ddf528b44063ce7f376a6436eea5bccd7f625bbc3b5e", - "sha256:2d3abe548a280b49269c7907d5b71199882510c484d680a5ea7860f30c4a695f", - "sha256:2fa101bb23619120673899694a65b094364269e597f551a87c4bdae3a474d726", - "sha256:2fda3b3fb5c0d159195ab834b322a23808f1b059bcc7e475765abeddee6a2529", - "sha256:303531649fa45f96b694054c1aa02f79bda32ef57affe42c5c339336717eed74", - "sha256:36806ee53a85c3ba73939652f2ced2961e6a77cfbae385cd83f2e24cd97964b7", - "sha256:37a63da5ee623acdf98e6d511171c8a5827a6106b0712c18af4441ef4f11e6be", - "sha256:3a2fcbd04273a509fa85285d9eccf17ab65ce440bd4f5e5a58c978e563cd9e9a", - "sha256:3b40e36d3036bfe69ba63ec8e746a390721f75467085a0384b528e1dda532c69", - "sha256:4168b6c425d783e81723fc3dc382d374a228ff29530436a472a36d9f27593e73", - "sha256:444c00ebc20f2f9dc62e34f7dc9453dc2f5f5a72419c8dccad6e26d546c35712", - "sha256:45d6b47d70ed44e3c40bef618ed61866c48176e7e5dff80d06d8b1a6192e8584", - "sha256:460bdaa3f65ddb5b7474ae08589a1763b5da1a78b8348351b9ba1c63b459d67d", - "sha256:47ed77f62c8417a86f9ad158b803f3459a636386cb9d3d4e9e7d6a82d051f907", - "sha256:48722e91981bb22a16b0431ea01da3e1cc5b96805634d3b8d3c2a5315c1ce7f1", - "sha256:49b0d92724d3fce1174fd30b0b428595072d5c6b14d6203e46a9ea347ae7b439", - "sha256:4a2d73a9281faefb273a5448f6d25f44ebd311ada9eb79b6801ae890508fe231", - "sha256:4f4bc64fe9cbd70d46f519f1e88c9e4677f7af18ab9cd4942abce2bcfa7549c3", - "sha256:5067c04d3b19c820faac6342854d887ade58e8d38c3db79b68c2a102bbb100e7", - "sha256:51437c77030bed72d57d8a61e22758e3c389b13fea7787c808030002bb05ca39", - "sha256:515e4708d6567901ffc06476a38abe2c9093733f52638235d9f149579c1d3de0", - "sha256:5183b698d6542219e4135de583b57bc6286bd37df7f645b688278eb919bfa785", - "sha256:56feb80ea1f5334ccab9bd16a5161571ab70392e51fcc752fb8a1dc67125f663", - "sha256:573e2387d0686976642142c50740dfc4d3494cc627e2a7d22782b99f70879055", - "sha256:58a67b3800476232f9989e533d0244060309451b436d46670a53e6d189f1a7e7", - "sha256:5e3833c001a04aa06a28c6fd9628256862a654c09b0f81c07734b5629bc014ab", - "sha256:5f5fe59328838fa28958cc06ecf94be585726b97d637012f168bc3c7abe4fd81", - "sha256:6235bf2157aa46e53568ed79b70603aa8874baa202d5d1de82fa0eb917696e73", - "sha256:63be03f7ae1e15e72a234637ec7941ef229c7ab252c9ff6af48bba1e5418961c", - "sha256:65f159c445761cab04b665fc448b3fc008aebc98e54fdcbfd1aff195ef1b1408", - "sha256:67e0b2ad3692f6d0335ae231a40de55ec395b6c2e971ad6f55b162244d1ec542", - "sha256:68409171ab2aa7ccd6e8e839233e4b8ddeec246383c9a3698614e814739356f9", - "sha256:6a96c04ce39d66df60d9ce89f4c254c4967bc7d9e2e2c52adc58f47be826ee96", - "sha256:6ead0126fb4424c6c6a4fdc603d699a9db7c03cdb8eac374c352a75fec8a820a", - "sha256:6eb6789f26c398c383225e1313c8e75a7d290d323b8eaf65f3f3ddd0eb8a5a3c", - "sha256:6f07888e3b73c0dfa46f12d098760494f5f23fd66923a6615edfe486e6a7649c", - "sha256:6f0f0a10f128ea0898e607d351ebfabf70941494fc94e87f12c76e2894d8e6c4", - "sha256:704879b6a54c45ad76cea7c6789c1ae7185050acea7afd15b58318fa1932ed45", - "sha256:7117bfd8827cfe550f65a3c399dcd6e02226197a91c6d11a3540c3e8efc686d6", - "sha256:712de1876608fd5d76abc3fc8ec55077278dd5044073fbe9492631c9a2c58351", - "sha256:75c7ef67b4b8ec070e7a4740764f6c03ec9246b59d95e2ae45c029d41cb9efa1", - "sha256:77dddf596fb065de29fb39992fbc81301f7fd0003be649b7fa7448c77ca53bed", - "sha256:7abc87e45b572eb6d17a50422e69a9e5d6f13e691e821fe2312df512500faa50", - "sha256:7d8cdd2f070c71366e64990653522cce84b08dc26ab0d1fa19aa8d14ee0cf9ba", - "sha256:81ce5f871f5d8e82615c8bd0b34b68a9650204c8b1a04ce7890d58c98eb66e39", - "sha256:837cdef094f39c6f4a2967abc646a412999c2540fbf5d3cce1dd3b671f4b876c", - "sha256:849e641cfed05c75d772f9e9018f42c5fbd00655d43d52da1b9c56346fd3e4cc", - "sha256:87114b995506e7584cf3daf891e419b5f6e7e383e7df6267494da3a76312aa22", - "sha256:87db421c9eb915b8d9a9a13c5b2ee338350e36ee83e26ff0adfc48abc5db3ac3", - "sha256:8851544168703fb519e95556e3b463fca4beeef7ed3f731d81a68c8268515d9d", - "sha256:891f541c7ed29b95799da0cd249ae1db1842777b564e8205a197b038c5df6135", - "sha256:8f87f53c9cd89010ae45490ec2c963ff18b31f5f290dc08b04151709589fe8d9", - "sha256:9641be893ccce7d192a0094efd0a0d9f1783a1ebf314b4128f8a27bfadb8a77c", - "sha256:979e34db4f3dc5710c18db437aaf282f691092b352e708cb2afd4df287698c76", - "sha256:9b62d84478f471fdb0dcea3876acff38f146bd23cbdbed15074fb4622064ec2e", - "sha256:a472ca3d43d33e596ff5836c6cc71c3e61be33f44fe1cfdab4a1100f4af60333", - "sha256:a5dbeeea6a375fbd79448b48a54c46fc9351611a03ef8398d2a40b684ce46194", - "sha256:a7430f3987d232e782304c109be1d0e6fff46ca6405cb2479e4d8d08cd29541e", - "sha256:a81e52dbf95f236a0c89a5abcd2b6e1331da0c0312f471c73fae76c79d2acf6b", - "sha256:aa434534cc91f51a85e3099dc257ee8034b3d2be77f2ca58fb335a686e3a681f", - "sha256:ab27d6d7d41a66d9e54269a290d27cd5c74f08e9add0054a754b4821026c4f42", - "sha256:adb37bf22d25a51b84d989a2a5c770d4514ac590201eea1cb50ce8c9c5257f1d", - "sha256:afb16330ab6efbbf995375ad94e970fa2f89bb46bd10d854b7047620fdb0d67d", - "sha256:b1b06038c9940a49c73db0aeb0f6809b308e198da1326171768cf68d843af521", - "sha256:b1e6d1cf4bd6552b5f519432cce1530c09e6b0aab98d44803b991f7e880bd332", - "sha256:bf2d9d62178bb5c05e77d40becf89c309b1966fbcfb5c306238f81bf1ec2d6a2", - "sha256:bfd073fea04061019a103a288847846b5ef40dfa2f73b940ed61e399ca95314f", - "sha256:c04e84ccf590933a266180286d8b6a5fc844078a5d934432628301bd8b5f9ca7", - "sha256:c0947d7be30335cb4c3d5d0983d8ebc8294ae52503cf1d596c926f7e7183900b", - "sha256:c2a17752f97a942bdb4ff4a0516a67c5ade1658ebe1ab2edacdec0b42e39fa75", - "sha256:c4653830375ab019b86d218c749ad38908b74182b2863d09936aa8d7f990d30e", - "sha256:c660fd1e4a4b52f79f7d134a3d31d452948477b7f46ff5061074a534c5805ba6", - "sha256:cb48ff6cc6109190e1ccf8ea1fc71cc244c9185813ce7d1c415dce991cfb8709", - "sha256:cef2675004d85d85a4ccc24730b73a99931547368d18ceeed1259a2d9fcddbc1", - "sha256:d1b98539b0de822b6f717498e59ae3e5ae2e7f564370ab513e6d0c060753e447", - "sha256:d6c6989c10008ac70c2bb2ad2b940fcfe883712746c89f7e3308c14c213a70d7", - "sha256:db3efec9dcecd96555d752215797816da40315d61878f90ca39c8e269791bf17", - "sha256:dc4749c230a71b34db50ac2481d9008bb17b67c92671c443c3b40e192fbea78e", - "sha256:dcf906c1f7a33e4222e4bff18da1554d69323bc4dd95fe867a6fa80709ee5f93", - "sha256:e2bccadbe313b11704160aaba5eec95d2da1aa663f02f41d2d1520d02bbbdcd5", - "sha256:e30cce3cc86d6082c8596b3fbee0d4f54bc4d337a4fa1bf536920e2e319e24f0", - "sha256:e5d6428b8b422ba5205140e8be11722fa7292a0bedaa8bc80fb34c92eb19ba45", - "sha256:e841695b5dbea38909ab2dbf17e91e9a823412d8d88d1ef77f1b94a7bc551c0f", - "sha256:eb65ec0255a0fccc47c87d44e505ef5180bfd71690bd5f84161b1f23949fb209", - "sha256:ed20ec5a01c43254f6047c5d8124b70d28e39f128c8ad960b437644fe94e1827", - "sha256:ed751a20840a31242e7bea566fcf93ba75bc11b33afe2777bbf46069c1af5094", - "sha256:ef8b927813c27c3bdfc82c55682d7767403bcdadfd9f9c0fc49f4be4553a877b", - "sha256:f43cacda46fc188f998e6d308afe1c61ff41dcb300949f4cbf731e9a0a5eb2d3", - "sha256:f44bea60fd2178d7153deef9621c4b526a93939da30010bba24d3408a98b0f79", - "sha256:fcc021530b7c71069132fe4846d95a3cdd74d143adc2f7e398d5fabf610f111c", - "sha256:fe16517b275031d61261a4e3941c411fb7c46a9cd012f02381b56e7907cc9e06", - "sha256:fe3ae4294d593da54862f0140fdcc89d1aeeb94258ca97f094119ed7f0e5882d" + "sha256:bb55368d455ab9518b97febd33a8d417988397b019c9408993be034e0b5a7db6", + "sha256:c1eb91198fc47c2e4fdc19c544b5d94534a70fd877f5c342228feb05e9fc4bef", + "sha256:c28c6f764aa03a0245db12346f1da327c6f49bcc20e53aefec6eed57e4fbe1ce", + "sha256:c6ee571995527e779b46cafee7ebef2dceb1a9c375143828e019293ff0efa167", + "sha256:c84a93e6d33dafce9e25080ac557342333e15ef7e378ba84cb6181c52a8fd663", + "sha256:d4061ac4e81bb36ec8f0a7027582c1c4dd32a939882e008165627103cb0b3985", + "sha256:d5c62fbdb30082f7e1dcfa253da48e7b4be7342d275b34b2efa51f6cffc5942b", + "sha256:e533f4bf9dc1a91cfd608b9bfb028c6a92383e731c502660933f0f9b812045a6", + "sha256:e9368c105a8bccc8adfe7fd7fa5220d2b6c03979a3a57a8178c42f6fa9914ebc", + "sha256:f628f9f26c8dadf72fabc9ae0ce5fe7f60d76be71a3407abc756b4d1fd030fa0", + "sha256:f8379052cfbc278b11e31bc97f2e7f5998959c50837c4d54f4e424a541e0c5d9", + "sha256:fad7b5351931cb68d19d7ecc0b21021fe23237d8fba8c455b5af4a79e1c7c536", + "sha256:fdd488daa4ad33748d5ea806e311bfe01b9cc506def5288400072fcd66d226cf" ], "index": "pypi", - "version": "==3.12.1" + "version": "==2.1.0" }, - "pymysql": { + "pygments": { "hashes": [ - "sha256:263040d2779a3b84930f7ac9da5132be0fefcd6f453a885756656103f8ee1fdd", - "sha256:44f47128dda8676e021c8d2dbb49a82be9e4ab158b9f03e897152a3a287c69ea" + "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380", + "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6" ], - "index": "pypi", - "version": "==0.10.1" + "markers": "python_version >= '3.5'", + "version": "==2.10.0" }, "pynacl": { "hashes": [ @@ -3216,21 +1921,6 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.4.0" }, - "pynmea2": { - "hashes": [ - "sha256:098f9ffd89c4a6c5e137b8b59e5b38194888d4a557c50b003ebcf2c3c15ec22e", - "sha256:e340d3327ebf09683d09466a52541dfcccb98bde9cb661cab2d3eeb72ea424ad" - ], - "index": "pypi", - "version": "==1.18.0" - }, - "pyopenssl": { - "hashes": [ - "sha256:5e2d8c5e46d0d865ae933bef5230090bdaf5506281e9eec60fa250ee80600cb3", - "sha256:8935bd4920ab9abfebb07c41a4f58296407ed77f04bd1a92914044b848ba1ed6" - ], - "version": "==21.0.0" - }, "pyparsing": { "hashes": [ "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", @@ -3246,67 +1936,6 @@ "index": "pypi", "version": "==1.4.5" }, - "pyproj": { - "hashes": [ - "sha256:00ec0cdd218cc8e7c823a9fe7c705b1e55926fe3a9460ef2048403757f9897ec", - "sha256:19e6a7c6d31624b9971639036679fad35460045fd99c0c484899134b6bbf84cc", - "sha256:28026ddf4d779e6bcbbd45954a0ca017348d819f27deb503e860be4eb88f5218", - "sha256:40ed2a66d93af811abac9fd2581685a2aade22a6753501f2f9760893ee6b0828", - "sha256:4a936093825ff55b24c1fc6cc093541fcf6d0f6d406589ed699e62048ebf3877", - "sha256:50d312cb7610f93f02f07b7da5b96469c52645717bebe6530ac7214cc69c068e", - "sha256:604e8041ee0a17eec0fac4e7e10b2f11f45ab49676a4f26eb63753ebb9ba38b0", - "sha256:76dd8a9dbd67a42e5ab8afe0e4a4167f0dfcd8f07e12541852c5289abf49e28f", - "sha256:8a732342136fa57112de717109c2b853a4df3e4e2de56e42da7a2b61e67f0b29", - "sha256:8cf6f7c62a7c4144771a330381198e53bff782c0345af623b8989b1913acb919", - "sha256:8e6821a472f03e3604413b562536e05cb7926c3bd85bfc423c88c4909871f692", - "sha256:b73973908688a0845ebd78871ed2edcca35d1fad8e90983a416a49aadb350f28", - "sha256:b87eda8647d71f27ed81c43da9d8e0b841a403378b645e8dc1d015e9f5133ed1", - "sha256:c5fb6283da84be5dc909f3f681490fd43de1b3694e9b5bed1ca7bc875130cb93", - "sha256:c7d7097b969c7a3f114fcce379021e59c843c1c7b1b9b3f1bb2aa65019793800", - "sha256:ce554616880ab59110af9baa2948b4442d2961e20390df00cea49782b7c779fe", - "sha256:d355ddf4cb29e77cb38e152354fb6ef6796d699d37e1a67a2427890ce2341162", - "sha256:e61c34b1b5a6b8df2ecf5abdbf8dd69322001ebc1971d0897919e4004512c476", - "sha256:f2eb0ee7e4183c1c4e2f450cccff09734b59ff929619bad3a4df97a87e3a3d1f", - "sha256:faadb5795e99321b5135263080348e184b927352c6331a06c2fcfe77a07ad215" - ], - "index": "pypi", - "version": "==3.2.1" - }, - "pyrsistent": { - "hashes": [ - "sha256:097b96f129dd36a8c9e33594e7ebb151b1515eb52cceb08474c10a5479e799f2", - "sha256:2aaf19dc8ce517a8653746d98e962ef480ff34b6bc563fc067be6401ffb457c7", - "sha256:404e1f1d254d314d55adb8d87f4f465c8693d6f902f67eb6ef5b4526dc58e6ea", - "sha256:48578680353f41dca1ca3dc48629fb77dfc745128b56fc01096b2530c13fd426", - "sha256:4916c10896721e472ee12c95cdc2891ce5890898d2f9907b1b4ae0f53588b710", - "sha256:527be2bfa8dc80f6f8ddd65242ba476a6c4fb4e3aedbf281dfbac1b1ed4165b1", - "sha256:58a70d93fb79dc585b21f9d72487b929a6fe58da0754fa4cb9f279bb92369396", - "sha256:5e4395bbf841693eaebaa5bb5c8f5cdbb1d139e07c975c682ec4e4f8126e03d2", - "sha256:6b5eed00e597b5b5773b4ca30bd48a5774ef1e96f2a45d105db5b4ebb4bca680", - "sha256:73ff61b1411e3fb0ba144b8f08d6749749775fe89688093e1efef9839d2dcc35", - "sha256:772e94c2c6864f2cd2ffbe58bb3bdefbe2a32afa0acb1a77e472aac831f83427", - "sha256:773c781216f8c2900b42a7b638d5b517bb134ae1acbebe4d1e8f1f41ea60eb4b", - "sha256:a0c772d791c38bbc77be659af29bb14c38ced151433592e326361610250c605b", - "sha256:b29b869cf58412ca5738d23691e96d8aff535e17390128a1a52717c9a109da4f", - "sha256:c1a9ff320fa699337e05edcaae79ef8c2880b52720bc031b219e5b5008ebbdef", - "sha256:cd3caef37a415fd0dae6148a1b6957a8c5f275a62cca02e18474608cb263640c", - "sha256:d5ec194c9c573aafaceebf05fc400656722793dac57f254cd4741f3c27ae57b4", - "sha256:da6e5e818d18459fa46fac0a4a4e543507fe1110e808101277c5a2b5bab0cd2d", - "sha256:e79d94ca58fcafef6395f6352383fa1a76922268fa02caa2272fff501c2fdc78", - "sha256:f3ef98d7b76da5eb19c37fda834d50262ff9167c65658d1d8f974d2e4d90676b", - "sha256:f4c8cabb46ff8e5d61f56a037974228e978f26bfefce4f61a4b1ac0ba7a2ab72" - ], - "markers": "python_version >= '3.6'", - "version": "==0.18.0" - }, - "pysocks": { - "hashes": [ - "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299", - "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5", - "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0" - ], - "version": "==1.7.1" - }, "python-dateutil": { "hashes": [ "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", @@ -3315,29 +1944,6 @@ "index": "pypi", "version": "==2.8.2" }, - "python-engineio": { - "hashes": [ - "sha256:ad06a975f7e14cb3bb7137cbf70fd883804484d29acd58004d1db1e2a7fc0ad3", - "sha256:fed35eeacfa21f53f1fc05ef0cadd65a50780364da3a2be7650eb92f928fdb11" - ], - "markers": "python_version >= '3.6'", - "version": "==4.3.0" - }, - "python-logstash": { - "hashes": [ - "sha256:10943e5df83f592b4d61b63ad1afff855ccc8c9467f78718f0a59809ba1fe68c" - ], - "index": "pypi", - "version": "==0.4.6" - }, - "python-socketio": { - "hashes": [ - "sha256:d84fa319e943aa18328280c8fbc4e2ba03cf9e96ff905b294b8b482af64532c9", - "sha256:ef4e273ddfebb421144a228cbab1e7e27ffe8d372514fa561e57d590ea6627b0" - ], - "markers": "python_version >= '3.6'", - "version": "==5.4.1" - }, "pytz": { "hashes": [ "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c", @@ -3345,42 +1951,6 @@ ], "version": "==2021.3" }, - "pywavelets": { - "hashes": [ - "sha256:076ca8907001fdfe4205484f719d12b4a0262dfe6652fa1cfc3c5c362d14dc84", - "sha256:18a51b3f9416a2ae6e9a35c4af32cf520dd7895f2b69714f4aa2f4342fca47f9", - "sha256:1a64b40f6acb4ffbaccce0545d7fc641744f95351f62e4c6aaa40549326008c9", - "sha256:2b634a54241c190ee989a4af87669d377b37c91bcc9cf0efe33c10ff847f7841", - "sha256:2f7429eeb5bf9c7068002d0d7f094ed654c77a70ce5e6198737fd68ab85f8311", - "sha256:35959c041ec014648575085a97b498eafbbaa824f86f6e4a59bfdef8a3fe6308", - "sha256:39c74740718e420d38c78ca4498568fa57976d78d5096277358e0fa9629a7aea", - "sha256:411e17ca6ed8cf5e18a7ca5ee06a91c25800cc6c58c77986202abf98d749273a", - "sha256:55e39ec848ceec13c9fa1598253ae9dd5c31d09dfd48059462860d2b908fb224", - "sha256:6162dc0ae04669ea04b4b51420777b9ea2d30b0a9d02901b2a3b4d61d159c2e9", - "sha256:68b5c33741d26c827074b3d8f0251de1c3019bb9567b8d303eb093c822ce28f1", - "sha256:6bc78fb9c42a716309b4ace56f51965d8b5662c3ba19d4591749f31773db1125", - "sha256:6ebfefebb5c6494a3af41ad8c60248a95da267a24b79ed143723d4502b1fe4d7", - "sha256:720dbcdd3d91c6dfead79c80bf8b00a1d8aa4e5d551dc528c6d5151e4efc3403", - "sha256:732bab78435c48be5d6bc75486ef629d7c8f112e07b313bf1f1a2220ab437277", - "sha256:7947e51ca05489b85928af52a34fe67022ab5b81d4ae32a4109a99e883a0635e", - "sha256:79f5b54f9dc353e5ee47f0c3f02bebd2c899d49780633aa771fed43fa20b3149", - "sha256:80b924edbc012ded8aa8b91cb2fd6207fb1a9a3a377beb4049b8a07445cec6f0", - "sha256:83c5e3eb78ce111c2f0b45f46106cc697c3cb6c4e5f51308e1f81b512c70c8fb", - "sha256:889d4c5c5205a9c90118c1980df526857929841df33e4cd1ff1eff77c6817a65", - "sha256:935ff247b8b78bdf77647fee962b1cc208c51a7b229db30b9ba5f6da3e675178", - "sha256:98b2669c5af842a70cfab33a7043fcb5e7535a690a00cd251b44c9be0be418e5", - "sha256:9e2528823ccf5a0a1d23262dfefe5034dce89cd84e4e124dc553dfcdf63ebb92", - "sha256:bc5e87b72371da87c9bebc68e54882aada9c3114e640de180f62d5da95749cd3", - "sha256:be105382961745f88d8196bba5a69ee2c4455d87ad2a2e5d1eed6bd7fda4d3fd", - "sha256:c06d2e340c7bf8b9ec71da2284beab8519a3908eab031f4ea126e8ccfc3fd567", - "sha256:c2a799e79cee81a862216c47e5623c97b95f1abee8dd1f9eed736df23fb653fb", - "sha256:cfe79844526dd92e3ecc9490b5031fca5f8ab607e1e858feba232b1b788ff0ea", - "sha256:d510aef84d9852653d079c84f2f81a82d5d09815e625f35c95714e7364570ad4", - "sha256:e02a0558e0c2ac8b8bbe6a6ac18c136767ec56b96a321e0dfde2173adfa5a504" - ], - "markers": "python_version >= '3.5'", - "version": "==1.1.1" - }, "pyyaml": { "hashes": [ "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293", @@ -3420,83 +1990,6 @@ "index": "pypi", "version": "==6.0" }, - "pyzmq": { - "hashes": [ - "sha256:08c4e315a76ef26eb833511ebf3fa87d182152adf43dedee8d79f998a2162a0b", - "sha256:0ca6cd58f62a2751728016d40082008d3b3412a7f28ddfb4a2f0d3c130f69e74", - "sha256:1621e7a2af72cced1f6ec8ca8ca91d0f76ac236ab2e8828ac8fe909512d566cb", - "sha256:18cd854b423fce44951c3a4d3e686bac8f1243d954f579e120a1714096637cc0", - "sha256:2841997a0d85b998cbafecb4183caf51fd19c4357075dfd33eb7efea57e4c149", - "sha256:2b97502c16a5ec611cd52410bdfaab264997c627a46b0f98d3f666227fd1ea2d", - "sha256:3a4c9886d61d386b2b493377d980f502186cd71d501fffdba52bd2a0880cef4f", - "sha256:3c1895c95be92600233e476fe283f042e71cf8f0b938aabf21b7aafa62a8dac9", - "sha256:42abddebe2c6a35180ca549fadc7228d23c1e1f76167c5ebc8a936b5804ea2df", - "sha256:468bd59a588e276961a918a3060948ae68f6ff5a7fa10bb2f9160c18fe341067", - "sha256:480b9931bfb08bf8b094edd4836271d4d6b44150da051547d8c7113bf947a8b0", - "sha256:53f4fd13976789ffafedd4d46f954c7bb01146121812b72b4ddca286034df966", - "sha256:62bcade20813796c426409a3e7423862d50ff0639f5a2a95be4b85b09a618666", - "sha256:67db33bea0a29d03e6eeec55a8190e033318cee3cbc732ba8fd939617cbf762d", - "sha256:6b217b8f9dfb6628f74b94bdaf9f7408708cb02167d644edca33f38746ca12dd", - "sha256:7661fc1d5cb73481cf710a1418a4e1e301ed7d5d924f91c67ba84b2a1b89defd", - "sha256:76c532fd68b93998aab92356be280deec5de8f8fe59cd28763d2cc8a58747b7f", - "sha256:79244b9e97948eaf38695f4b8e6fc63b14b78cc37f403c6642ba555517ac1268", - "sha256:7c58f598d9fcc52772b89a92d72bf8829c12d09746a6d2c724c5b30076c1f11d", - "sha256:7dc09198e4073e6015d9a8ea093fc348d4e59de49382476940c3dd9ae156fba8", - "sha256:80e043a89c6cadefd3a0712f8a1322038e819ebe9dbac7eca3bce1721bcb63bf", - "sha256:851977788b9caa8ed011f5f643d3ee8653af02c5fc723fa350db5125abf2be7b", - "sha256:8eddc033e716f8c91c6a2112f0a8ebc5e00532b4a6ae1eb0ccc48e027f9c671c", - "sha256:902319cfe23366595d3fa769b5b751e6ee6750a0a64c5d9f757d624b2ac3519e", - "sha256:954e73c9cd4d6ae319f1c936ad159072b6d356a92dcbbabfd6e6204b9a79d356", - "sha256:ab888624ed68930442a3f3b0b921ad7439c51ba122dbc8c386e6487a658e4a4e", - "sha256:acebba1a23fb9d72b42471c3771b6f2f18dcd46df77482612054bd45c07dfa36", - "sha256:b4ebed0977f92320f6686c96e9e8dd29eed199eb8d066936bac991afc37cbb70", - "sha256:badb868fff14cfd0e200eaa845887b1011146a7d26d579aaa7f966c203736b92", - "sha256:be4e0f229cf3a71f9ecd633566bd6f80d9fa6afaaff5489492be63fe459ef98c", - "sha256:c0f84360dcca3481e8674393bdf931f9f10470988f87311b19d23cda869bb6b7", - "sha256:c1e41b32d6f7f9c26bc731a8b529ff592f31fc8b6ef2be9fa74abd05c8a342d7", - "sha256:c88fa7410e9fc471e0858638f403739ee869924dd8e4ae26748496466e27ac59", - "sha256:cf98fd7a6c8aaa08dbc699ffae33fd71175696d78028281bc7b832b26f00ca57", - "sha256:d072f7dfbdb184f0786d63bda26e8a0882041b1e393fbe98940395f7fab4c5e2", - "sha256:d1b5d457acbadcf8b27561deeaa386b0217f47626b29672fa7bd31deb6e91e1b", - "sha256:d3dcb5548ead4f1123851a5ced467791f6986d68c656bc63bfff1bf9e36671e2", - "sha256:d6157793719de168b199194f6b6173f0ccd3bf3499e6870fac17086072e39115", - "sha256:d728b08448e5ac3e4d886b165385a262883c34b84a7fe1166277fe675e1c197a", - "sha256:de8df0684398bd74ad160afdc2a118ca28384ac6f5e234eb0508858d8d2d9364", - "sha256:e6a02cf7271ee94674a44f4e62aa061d2d049001c844657740e156596298b70b", - "sha256:ea12133df25e3a6918718fbb9a510c6ee5d3fdd5a346320421aac3882f4feeea", - "sha256:ea5a79e808baef98c48c884effce05c31a0698c1057de8fc1c688891043c1ce1", - "sha256:f43b4a2e6218371dd4f41e547bd919ceeb6ebf4abf31a7a0669cd11cd91ea973", - "sha256:f762442bab706fd874064ca218b33a1d8e40d4938e96c24dafd9b12e28017f45", - "sha256:f89468059ebc519a7acde1ee50b779019535db8dcf9b8c162ef669257fef7a93", - "sha256:f907c7359ce8bf7f7e63c82f75ad0223384105f5126f313400b7e8004d9b33c3" - ], - "index": "pypi", - "version": "==22.3.0" - }, - "qtconsole": { - "hashes": [ - "sha256:73994105b0369bb99f4164df4a131010f3c7b33a7b5169c37366358d8744675b", - "sha256:bbc34bca14f65535afcb401bc74b752bac955e5313001ba640383f7e5857dc49" - ], - "markers": "python_version >= '3.6'", - "version": "==5.1.1" - }, - "qtpy": { - "hashes": [ - "sha256:83c502973e9fdd7b648d8267a421229ea3d9a0651c22e4c65a4d9228479c39b6", - "sha256:d6e4ae3a41f1fcb19762b58f35ad6dd443b4bdc867a4cb81ef10ccd85403c92b" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.11.2" - }, - "redis": { - "hashes": [ - "sha256:0e7e0cfca8660dea8b7d5cd8c4f6c5e29e11f31158c0b0ae91a397f00e5a05a2", - "sha256:432b788c4530cfe16d8d943a09d40ca6c16149727e4afe8c2c9d5580c59d9f24" - ], - "index": "pypi", - "version": "==3.5.3" - }, "requests": { "hashes": [ "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24", @@ -3512,47 +2005,6 @@ "index": "pypi", "version": "==1.5.1" }, - "s2sphere": { - "hashes": [ - "sha256:c2478c1ff7c601a59a7151a57b605435897514578fa6bdb8730721c182adbbaf", - "sha256:d2340c9cf458ddc9a89afd1d8048a4195ce6fa6b0095ab900d4be5271e537401" - ], - "index": "pypi", - "version": "==0.2.5" - }, - "s3transfer": { - "hashes": [ - "sha256:50ed823e1dc5868ad40c8dc92072f757aa0e653a192845c94a3b676f4a62da4c", - "sha256:9c1dc369814391a6bda20ebbf4b70a0f34630592c9aa520856bf384916af2803" - ], - "markers": "python_version >= '3.6'", - "version": "==0.5.0" - }, - "scikit-image": { - "hashes": [ - "sha256:05b430b1f8e25f7ba4a55afc6bf592af00f0ec809ab1d80bdede8893e7c6af57", - "sha256:088bf793696a3d5f56cce27c75d415fa795d1db9336b7e8257a1764dc03c7c52", - "sha256:0bf23d3d182ba8fe4ef8a0935e843be1f6c99e7eebeb492ac07c305e8cbb1dcd", - "sha256:0bf3cdadc15db90f875bf59bdd0db080337e6353bb3d165c281f9af456d9d3f2", - "sha256:142d070a41f9dfed0c3661e0dd9ce3cdb59a20a5b5ab071f529577d6d3e1fb81", - "sha256:2f24eb3df859ba5b3fb66947fe2d7240653b38f307d574e25f1ae29cc2a212ee", - "sha256:3068af85682e90fda021070969dd2fce667f89a868c6aacb2fffbc5aa002e39e", - "sha256:3f3aa984638a6868171d176d26d6bd17b7b16a9fd505eaa97482f00a4310e3ff", - "sha256:7994866857a1bb388cf3ede4ca7a8fba0b89ef980d5d802ec25e30124a2a34db", - "sha256:7f27357adae9225df10fd152224d4c43978ae222f44bad7fedbfc2b81b985f9d", - "sha256:8394ad148685ed6ea8d84eb9c41e70cef1adda6c6d9a0ff8476c3126818a9340", - "sha256:9b60fe0bc6e770c126c625f8c2d8af3b20fea53dac845abdf474bef1bd526490", - "sha256:b29982f07231f60d6170f4c2c6f2fe88051a7b4194d775aefd81bfee107452b9", - "sha256:bfa6eb04dc0b8773043f9994eccd8c517d713cd0f9e960dcb6754e19c1abceb1", - "sha256:e2148846fae22e12b7a20d11d951adae57213dd097af5960407eb5c4421c0ab3", - "sha256:ec242ff35bd4bc531aaf00c6edb9f0f64ff36ff353bd6ecd8f1c77886ddc0a7a", - "sha256:ecae99f93f4c5e9b1bf34959f4dc596c41f2f6b2fc407d9d9ddf85aebd3137ca", - "sha256:ef92f42d8a0794c47df1eeb1937119b6686b523dc663ecc5ffdf3c91645719ac", - "sha256:f698fc715202eeccabb371190c19c2d6713696de4d07609a0fa0cae3acb0b3dd" - ], - "index": "pypi", - "version": "==0.18.3" - }, "scipy": { "hashes": [ "sha256:1437073f1d4664990879aa8f9547524764372e0fef84a077be4b19e82bba7a8d", @@ -3575,6 +2027,7 @@ "sha256:a80eb01c43fd98257ec7a49ff5cec0edba32031b5f86503f55399a48cb2c5379", "sha256:cac71d5476a6f56b50459da21f6221707e0051ebd428b2137db32ef4a43bb15e", "sha256:d86abd1ddf421dea5e9cebfeb4de0d205b3dc04e78249afedba9c6c3b2227ff2", + "sha256:dc2d1bf41294e63c7302bf499973ac0c7f73c93c01763db43055f6525234bf11", "sha256:e08b81fcd9bf98740b58dc6fdd7879e33a64dcb682201c1135f7d4a75216bb05", "sha256:e3efe7ef75dfe627b354ab0af0dbc918eadee97cc80ff1aabea6d3e01114ebdd", "sha256:fa2dbabaaecdb502641b0b3c00dec05fb475ae48655c66da16c9ed24eda1e711" @@ -3582,99 +2035,13 @@ "index": "pypi", "version": "==1.7.2" }, - "seaborn": { + "setuptools-scm": { "hashes": [ - "sha256:85a6baa9b55f81a0623abddc4a26b334653ff4c6b18c418361de19dbba0ef283", - "sha256:cf45e9286d40826864be0e3c066f98536982baf701a7caa386511792d61ff4f6" - ], - "index": "pypi", - "version": "==0.11.2" - }, - "send2trash": { - "hashes": [ - "sha256:d2c24762fd3759860a0aff155e45871447ea58d2be6bdd39b5c8f966a0c99c2d", - "sha256:f20eaadfdb517eaca5ce077640cb261c7d2698385a6a0f072a4a5447fd49fa08" - ], - "version": "==1.8.0" - }, - "shapely": { - "hashes": [ - "sha256:0e640d6da59172d679270f0dfd88128b6ae7c57df864a030dd858ff924c307fc", - "sha256:13cbb959863cec32d48e2cffdc4bb81828bc3b0fa4256c9b2b32edac5021a0e4", - "sha256:19b54cd840883fd71cce98fd94916d1731eed8a32c115eb082b3ed24e631be02", - "sha256:1c5632cedea6d815b61eb4c264da1c3f24a8ce2ceba2f74e30fba340ca230563", - "sha256:26b43b69dfeb8a8cb27aacf5597134baf12337845c2bacb01809540c20d3d904", - "sha256:2c3cc87e66cbffd00ce0457c03969b64935752824bf43a1cd61f21cf606997d6", - "sha256:4e8cdffeec6d0c47ed1eb215ec4e80c024ac05be6ded982061c1e1188034f22f", - "sha256:622f62d2b2da81dd40841a56db0f78bcf9f9af7a83c7d5f5dc9bcb234aa650ba", - "sha256:68bdf463f7a609fbed42bbded18fa74c82a5741251984a5597d070060f4286f4", - "sha256:78b3a46dadd47c27e658d5e8d9006b4b1eb9b7ab947b450059225dcee799a18f", - "sha256:796b15a483ac37c2dc757654186d0e064a42fb6f43cb9d1ff65d81cd0c92a84e", - "sha256:7e1aebf4f1b2fbef40152fd531216387fcf6fe4ff2d777268381979b63c7c779", - "sha256:83145eda2e582c2046d1ecc6a0d7dbfe97f492434311124f65ea60f4e87a6b65", - "sha256:83d10f8b47a7568fc90063f72da62cda201dc92ecadf80cc00c015babc48e11f", - "sha256:8917a91430126165cfa4bc2b4cf168121e37ff0c8657134e7398c597ca1fe934", - "sha256:9b54ebd8fa4b78320f6d87032fe91363c7c1bf0f8d4a30eb93bca6413f787fd5", - "sha256:bd84d993a0e8e07f5ebb4c67794d5392fdd23ce59a7ccc121900f2080f57989a", - "sha256:cfb9d72d255af1a484e3859f4c9bb737950faf1d16c21d2b949ffc4ba5f46147", - "sha256:d4ce1f18a0c9bb6b483c73bd7a0eb3a5e90676bcc29b9c27120236e662195c9d", - "sha256:f304243b1f4d7bca9b3c9fdeec6565171e1b611fb4a3d6c93efc870c8a75958c", - "sha256:f5307ee14ba4199f8bbcf6532ca33064661c1433960c432c84f0daa73b47ef9c" - ], - "index": "pypi", - "version": "==1.8.0" - }, - "simplejson": { - "hashes": [ - "sha256:065230b9659ac38c8021fa512802562d122afb0cf8d4b89e257014dcddb5730a", - "sha256:07707ba69324eaf58f0c6f59d289acc3e0ed9ec528dae5b0d4219c0d6da27dc5", - "sha256:10defa88dd10a0a4763f16c1b5504e96ae6dc68953cfe5fc572b4a8fcaf9409b", - "sha256:140eb58809f24d843736edb8080b220417e22c82ac07a3dfa473f57e78216b5f", - "sha256:188f2c78a8ac1eb7a70a4b2b7b9ad11f52181044957bf981fb3e399c719e30ee", - "sha256:1c2688365743b0f190392e674af5e313ebe9d621813d15f9332e874b7c1f2d04", - "sha256:24e413bd845bd17d4d72063d64e053898543fb7abc81afeae13e5c43cef9c171", - "sha256:2b59acd09b02da97728d0bae8ff48876d7efcbbb08e569c55e2d0c2e018324f5", - "sha256:2df15814529a4625ea6f7b354a083609b3944c269b954ece0d0e7455872e1b2a", - "sha256:352c11582aa1e49a2f0f7f7d8fd5ec5311da890d1354287e83c63ab6af857cf5", - "sha256:36b08b886027eac67e7a0e822e3a5bf419429efad7612e69501669d6252a21f2", - "sha256:376023f51edaf7290332dacfb055bc00ce864cb013c0338d0dea48731f37e42f", - "sha256:3ba82f8b421886f4a2311c43fb98faaf36c581976192349fef2a89ed0fcdbdef", - "sha256:3d72aa9e73134dacd049a2d6f9bd219f7be9c004d03d52395831611d66cedb71", - "sha256:40ece8fa730d1a947bff792bcc7824bd02d3ce6105432798e9a04a360c8c07b0", - "sha256:417b7e119d66085dc45bdd563dcb2c575ee10a3b1c492dd3502a029448d4be1c", - "sha256:42b7c7264229860fe879be961877f7466d9f7173bd6427b3ba98144a031d49fb", - "sha256:457d9cfe7ece1571770381edccdad7fc255b12cd7b5b813219441146d4f47595", - "sha256:4a6943816e10028eeed512ea03be52b54ea83108b408d1049b999f58a760089b", - "sha256:5b94df70bd34a3b946c0eb272022fb0f8a9eb27cad76e7f313fedbee2ebe4317", - "sha256:5f5051a13e7d53430a990604b532c9124253c5f348857e2d5106d45fc8533860", - "sha256:5f7f53b1edd4b23fb112b89208377480c0bcee45d43a03ffacf30f3290e0ed85", - "sha256:5fe8c6dcb9e6f7066bdc07d3c410a2fca78c0d0b4e0e72510ffd20a60a20eb8e", - "sha256:71a54815ec0212b0cba23adc1b2a731bdd2df7b9e4432718b2ed20e8aaf7f01a", - "sha256:7332f7b06d42153255f7bfeb10266141c08d48cc1a022a35473c95238ff2aebc", - "sha256:78c6f0ed72b440ebe1892d273c1e5f91e55e6861bea611d3b904e673152a7a4c", - "sha256:7c9b30a2524ae6983b708f12741a31fbc2fb8d6fecd0b6c8584a62fd59f59e09", - "sha256:86fcffc06f1125cb443e2bed812805739d64ceb78597ac3c1b2d439471a09717", - "sha256:87572213965fd8a4fb7a97f837221e01d8fddcfb558363c671b8aa93477fb6a2", - "sha256:8e595de17178dd3bbeb2c5b8ea97536341c63b7278639cb8ee2681a84c0ef037", - "sha256:917f01db71d5e720b731effa3ff4a2c702a1b6dacad9bcdc580d86a018dfc3ca", - "sha256:91cfb43fb91ff6d1e4258be04eee84b51a4ef40a28d899679b9ea2556322fb50", - "sha256:aa86cfdeb118795875855589934013e32895715ec2d9e8eb7a59be3e7e07a7e1", - "sha256:ade09aa3c284d11f39640aebdcbb748e1996f0c60504f8c4a0c5a9fec821e67a", - "sha256:b2a5688606dffbe95e1347a05b77eb90489fe337edde888e23bbb7fd81b0d93b", - "sha256:b92fbc2bc549c5045c8233d954f3260ccf99e0f3ec9edfd2372b74b350917752", - "sha256:c2d5334d935af711f6d6dfeec2d34e071cdf73ec0df8e8bd35ac435b26d8da97", - "sha256:cb0afc3bad49eb89a579103616574a54b523856d20fc539a4f7a513a0a8ba4b2", - "sha256:ce66f730031b9b3683b2fc6ad4160a18db86557c004c3d490a29bf8d450d7ab9", - "sha256:e29b9cea4216ec130df85d8c36efb9985fda1c9039e4706fb30e0fb6a67602ff", - "sha256:e2cc4b68e59319e3de778325e34fbff487bfdb2225530e89995402989898d681", - "sha256:e90d2e219c3dce1500dda95f5b893c293c4d53c4e330c968afbd4e7a90ff4a5b", - "sha256:f13c48cc4363829bdfecc0c181b6ddf28008931de54908a492dc8ccd0066cd60", - "sha256:f550730d18edec4ff9d4252784b62adfe885d4542946b6d5a54c8a6521b56afd", - "sha256:fa843ee0d34c7193f5a816e79df8142faff851549cab31e84b526f04878ac778", - "sha256:fe1c33f78d2060719d52ea9459d97d7ae3a5b707ec02548575c4fbed1d1d345b" + "sha256:4c64444b1d49c4063ae60bfe1680f611c8b13833d556fd1d6050c0023162a119", + "sha256:a49aa8081eeb3514eb9728fa5040f2eaa962d6c6f4ec9c32f6c1fba88f88a0f2" ], - "index": "pypi", - "version": "==3.17.5" + "markers": "python_version >= '3.6'", + "version": "==6.3.2" }, "six": { "hashes": [ @@ -3684,20 +2051,12 @@ "index": "pypi", "version": "==1.16.0" }, - "sniffio": { - "hashes": [ - "sha256:471b71698eac1c2112a40ce2752bb2f4a4814c22a54a3eed3676bc0f5ca9f663", - "sha256:c4666eecec1d3f50960c6bdf61ab7bc350648da6c126e3cf6898d8cd4ddcd3de" - ], - "markers": "python_version >= '3.5'", - "version": "==1.2.0" - }, "snowballstemmer": { "hashes": [ - "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2", - "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914" + "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", + "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" ], - "version": "==2.1.0" + "version": "==2.2.0" }, "sortedcontainers": { "hashes": [ @@ -3708,11 +2067,11 @@ }, "sphinx": { "hashes": [ - "sha256:94078db9184491e15bce0a56d9186e0aec95f16ac20b12d00e06d4e36f1058a6", - "sha256:98a535c62a4fcfcc362528592f69b26f7caec587d32cd55688db580be0287ae0" + "sha256:6d051ab6e0d06cba786c4656b0fe67ba259fe058410f49e95bee6e49c4052cbf", + "sha256:7e2b30da5f39170efcd95c6270f07669d623c276521fee27ad6c380f49d2bf5b" ], "index": "pypi", - "version": "==4.2.0" + "version": "==4.3.0" }, "sphinx-rtd-theme": { "hashes": [ @@ -3770,48 +2129,6 @@ "markers": "python_version >= '3.5'", "version": "==1.1.5" }, - "sqlalchemy": { - "hashes": [ - "sha256:07ac4461a1116b317519ddf6f34bcb00b011b5c1370ebeaaf56595504ffc7e84", - "sha256:090536fd23bf49077ee94ff97142bc5ee8bad24294c3d7c8d5284267c885dde7", - "sha256:1dee515578d04bc80c4f9a8c8cfe93f455db725059e885f1b1da174d91c4d077", - "sha256:1ef37c9ec2015ce2f0dc1084514e197f2f199d3dc3514190db7620b78e6004c8", - "sha256:295b90efef1278f27fe27d94a45460ae3c17f5c5c2b32c163e29c359740a1599", - "sha256:2ce42ad1f59eb85c55c44fb505f8854081ee23748f76b62a7f569cfa9b6d0604", - "sha256:2feb028dc75e13ba93456a42ac042b255bf94dbd692bf80b47b22653bb25ccf8", - "sha256:31f4426cfad19b5a50d07153146b2bcb372a279975d5fa39f98883c0ef0f3313", - "sha256:3c0c5f54560a92691d54b0768d67b4d3159e514b426cfcb1258af8c195577e8f", - "sha256:463ef692259ff8189be42223e433542347ae17e33f91c1013e9c5c64e2798088", - "sha256:4a882dedb9dfa6f33524953c3e3d72bcf518a5defd6d5863150a821928b19ad3", - "sha256:4c185c928e2638af9bae13acc3f70e0096eac76471a1101a10f96b80666b8270", - "sha256:5039faa365e7522a8eb4736a54afd24a7e75dcc33b81ab2f0e6c456140f1ad64", - "sha256:5c6774b34782116ad9bdec61c2dbce9faaca4b166a0bc8e7b03c2b870b121d94", - "sha256:6bc7f9d7d90ef55e8c6db1308a8619cd8f40e24a34f759119b95e7284dca351a", - "sha256:7e8ef103eaa72a857746fd57dda5b8b5961e8e82a528a3f8b7e2884d8506f0b7", - "sha256:7ef421c3887b39c6f352e5022a53ac18de8387de331130481cb956b2d029cad6", - "sha256:908fad32c53b17aad12d722379150c3c5317c422437e44032256a77df1746292", - "sha256:91efbda4e6d311812f23996242bad7665c1392209554f8a31ec6db757456db5c", - "sha256:a6506c17b0b6016656783232d0bdd03fd333f1f654d51a14d93223f953903646", - "sha256:a95bf9c725012dcd7ea3cac16bf647054e0d62b31d67467d228338e6a163e4ff", - "sha256:ad7e403fc1e3cb76e802872694e30d6ca6129b9bc6ad4e7caa48ca35f8a144f8", - "sha256:b86f762cee3709722ab4691981958cbec475ea43406a6916a7ec375db9cbd9e9", - "sha256:ba84026e84379326bbf2f0c50792f2ae56ab9c01937df5597b6893810b8ca369", - "sha256:bca660b76672e15d70a7dba5e703e1ce451a0257b6bd2028e62b0487885e8ae9", - "sha256:c24c01dcd03426a5fe5ee7af735906bec6084977b9027a3605d11d949a565c01", - "sha256:c2f2114b0968a280f94deeeaa31cfbac9175e6ac7bd3058b3ce6e054ecd762b3", - "sha256:c46f013ff31b80cbe36410281675e1fb4eaf3e25c284fd8a69981c73f6fa4cb4", - "sha256:c757ba1279b85b3460e72e8b92239dae6f8b060a75fb24b3d9be984dd78cfa55", - "sha256:cc6b21f19bc9d4cd77cbcba5f3b260436ce033f1053cea225b6efea2603d201e", - "sha256:dbf588ab09e522ac2cbd010919a592c6aae2f15ccc3cd9a96d01c42fbc13f63e", - "sha256:de996756d894a2d52c132742e3b6d64ecd37e0919ddadf4dc3981818777c7e67", - "sha256:e700d48056475d077f867e6a36e58546de71bdb6fdc3d34b879e3240827fefab", - "sha256:f1e97c5f36b94542f72917b62f3a2f92be914b2cf33b80fa69cede7529241d2a", - "sha256:fb2aa74a6e3c2cebea38dd21633671841fbe70ea486053cba33d68e3e22ccc0a", - "sha256:ff8f91a7b1c4a1c7772caa9efe640f2768828897044748f2458b708f1026e2d4" - ], - "index": "pypi", - "version": "==1.4.26" - }, "subprocess32": { "hashes": [ "sha256:88e37c1aac5388df41cc8a8456bb49ebffd321a3ad4d70358e3518176de3a56b", @@ -3821,13 +2138,6 @@ "index": "pypi", "version": "==3.5.4" }, - "tabulate": { - "hashes": [ - "sha256:d7c013fe7abbc5e491394e10fa845f8f32fe54f8dc60c6622c6cf482d25d47e4", - "sha256:eb1d13f25760052e8931f2ef80aaf6045a6cceb47514db8beab24cded16f13a7" - ], - "version": "==0.8.9" - }, "tenacity": { "hashes": [ "sha256:43242a20e3e73291a28bcbcacfd6e000b02d3857a9a9fff56b297a27afdc932f", @@ -3836,30 +2146,6 @@ "index": "pypi", "version": "==8.0.1" }, - "terminado": { - "hashes": [ - "sha256:09fdde344324a1c9c6e610ee4ca165c4bb7f5bbf982fceeeb38998a988ef8452", - "sha256:b20fd93cc57c1678c799799d117874367cc07a3d2d55be95205b1a88fa08393f" - ], - "markers": "python_version >= '3.6'", - "version": "==0.12.1" - }, - "testpath": { - "hashes": [ - "sha256:1acf7a0bcd3004ae8357409fc33751e16d37ccc650921da1094a86581ad1e417", - "sha256:8044f9a0bab6567fc644a3593164e872543bb44225b0e24846e2c89237937589" - ], - "markers": "python_version >= '3.5'", - "version": "==0.5.0" - }, - "tifffile": { - "hashes": [ - "sha256:153e31fa1d892f482fabb2ae9f2561fa429ee42d01a6f67e58cee13637d9285b", - "sha256:2e0066f90e2dbeb3e6a287cfd78bafbd2f142fabbca4a76a8ff809573baf5ad5" - ], - "markers": "python_version >= '3.7'", - "version": "==2021.11.2" - }, "toml": { "hashes": [ "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", @@ -3868,69 +2154,21 @@ "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==0.10.2" }, - "tornado": { - "hashes": [ - "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb", - "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c", - "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288", - "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95", - "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558", - "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe", - "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791", - "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d", - "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326", - "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b", - "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4", - "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c", - "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910", - "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5", - "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c", - "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0", - "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675", - "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd", - "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f", - "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c", - "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea", - "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6", - "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05", - "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd", - "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575", - "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a", - "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37", - "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795", - "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f", - "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32", - "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c", - "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01", - "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4", - "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2", - "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921", - "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085", - "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df", - "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102", - "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5", - "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68", - "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5" - ], - "markers": "python_version >= '3.5'", - "version": "==6.1" - }, - "traitlets": { + "tomli": { "hashes": [ - "sha256:059f456c5a7c1c82b98c2e8c799f39c9b8128f6d0d46941ee118daace9eb70c7", - "sha256:2d313cc50a42cd6c277e7d7dc8d4d7fedd06a2c215f78766ae7b1a66277e0033" + "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee", + "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade" ], - "markers": "python_version >= '3.7'", - "version": "==5.1.1" + "markers": "python_version >= '3.6'", + "version": "==1.2.2" }, "typing-extensions": { "hashes": [ - "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e", - "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7", - "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34" + "sha256:2cdf80e4e04866a9b3689a51869016d36db0814d84b8d8a568d22781d45d27ed", + "sha256:829704698b22e13ec9eaf959122315eabb370b0884400e9818334d8b677023d9" ], "markers": "python_version < '3.10'", - "version": "==3.10.0.2" + "version": "==4.0.0" }, "urllib3": { "hashes": [ @@ -3947,186 +2185,6 @@ ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", "version": "==20.10.0" - }, - "wcwidth": { - "hashes": [ - "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784", - "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83" - ], - "version": "==0.2.5" - }, - "webencodings": { - "hashes": [ - "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", - "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" - ], - "version": "==0.5.1" - }, - "websocket-client": { - "hashes": [ - "sha256:0133d2f784858e59959ce82ddac316634229da55b498aac311f1620567a710ec", - "sha256:8dfb715d8a992f5712fff8c843adae94e22b22a99b2c5e6b0ec4a1a981cc4e0d" - ], - "index": "pypi", - "version": "==1.2.1" - }, - "werkzeug": { - "hashes": [ - "sha256:63d3dc1cf60e7b7e35e97fa9861f7397283b75d765afcaefd993d6046899de8f", - "sha256:aa2bb6fc8dee8d6c504c0ac1e7f5f7dc5810a9903e793b6f715a9f015bdadb9a" - ], - "markers": "python_version >= '3.6'", - "version": "==2.0.2" - }, - "widgetsnbextension": { - "hashes": [ - "sha256:763a9fdc836d141fa080005a886d63f66f73d56dba1fb5961afc239c77708569", - "sha256:e0731a60ba540cd19bbbefe771a9076dcd2dde90713a8f87f27f53f2d1db7727" - ], - "version": "==3.5.2" - }, - "wrapt": { - "hashes": [ - "sha256:086218a72ec7d986a3eddb7707c8c4526d677c7b35e355875a0fe2918b059179", - "sha256:0877fe981fd76b183711d767500e6b3111378ed2043c145e21816ee589d91096", - "sha256:0a017a667d1f7411816e4bf214646d0ad5b1da2c1ea13dec6c162736ff25a374", - "sha256:0cb23d36ed03bf46b894cfec777eec754146d68429c30431c99ef28482b5c1df", - "sha256:1fea9cd438686e6682271d36f3481a9f3636195578bab9ca3382e2f5f01fc185", - "sha256:220a869982ea9023e163ba915077816ca439489de6d2c09089b219f4e11b6785", - "sha256:25b1b1d5df495d82be1c9d2fad408f7ce5ca8a38085e2da41bb63c914baadff7", - "sha256:2dded5496e8f1592ec27079b28b6ad2a1ef0b9296d270f77b8e4a3a796cf6909", - "sha256:2ebdde19cd3c8cdf8df3fc165bc7827334bc4e353465048b36f7deeae8ee0918", - "sha256:43e69ffe47e3609a6aec0fe723001c60c65305784d964f5007d5b4fb1bc6bf33", - "sha256:46f7f3af321a573fc0c3586612db4decb7eb37172af1bc6173d81f5b66c2e068", - "sha256:47f0a183743e7f71f29e4e21574ad3fa95676136f45b91afcf83f6a050914829", - "sha256:498e6217523111d07cd67e87a791f5e9ee769f9241fcf8a379696e25806965af", - "sha256:4b9c458732450ec42578b5642ac53e312092acf8c0bfce140ada5ca1ac556f79", - "sha256:51799ca950cfee9396a87f4a1240622ac38973b6df5ef7a41e7f0b98797099ce", - "sha256:5601f44a0f38fed36cc07db004f0eedeaadbdcec90e4e90509480e7e6060a5bc", - "sha256:5f223101f21cfd41deec8ce3889dc59f88a59b409db028c469c9b20cfeefbe36", - "sha256:610f5f83dd1e0ad40254c306f4764fcdc846641f120c3cf424ff57a19d5f7ade", - "sha256:6a03d9917aee887690aa3f1747ce634e610f6db6f6b332b35c2dd89412912bca", - "sha256:705e2af1f7be4707e49ced9153f8d72131090e52be9278b5dbb1498c749a1e32", - "sha256:766b32c762e07e26f50d8a3468e3b4228b3736c805018e4b0ec8cc01ecd88125", - "sha256:77416e6b17926d953b5c666a3cb718d5945df63ecf922af0ee576206d7033b5e", - "sha256:778fd096ee96890c10ce96187c76b3e99b2da44e08c9e24d5652f356873f6709", - "sha256:78dea98c81915bbf510eb6a3c9c24915e4660302937b9ae05a0947164248020f", - "sha256:7dd215e4e8514004c8d810a73e342c536547038fb130205ec4bba9f5de35d45b", - "sha256:7dde79d007cd6dfa65afe404766057c2409316135cb892be4b1c768e3f3a11cb", - "sha256:81bd7c90d28a4b2e1df135bfbd7c23aee3050078ca6441bead44c42483f9ebfb", - "sha256:85148f4225287b6a0665eef08a178c15097366d46b210574a658c1ff5b377489", - "sha256:865c0b50003616f05858b22174c40ffc27a38e67359fa1495605f96125f76640", - "sha256:87883690cae293541e08ba2da22cacaae0a092e0ed56bbba8d018cc486fbafbb", - "sha256:8aab36778fa9bba1a8f06a4919556f9f8c7b33102bd71b3ab307bb3fecb21851", - "sha256:8c73c1a2ec7c98d7eaded149f6d225a692caa1bd7b2401a14125446e9e90410d", - "sha256:936503cb0a6ed28dbfa87e8fcd0a56458822144e9d11a49ccee6d9a8adb2ac44", - "sha256:944b180f61f5e36c0634d3202ba8509b986b5fbaf57db3e94df11abee244ba13", - "sha256:96b81ae75591a795d8c90edc0bfaab44d3d41ffc1aae4d994c5aa21d9b8e19a2", - "sha256:981da26722bebb9247a0601e2922cedf8bb7a600e89c852d063313102de6f2cb", - "sha256:ae9de71eb60940e58207f8e71fe113c639da42adb02fb2bcbcaccc1ccecd092b", - "sha256:b73d4b78807bd299b38e4598b8e7bd34ed55d480160d2e7fdaabd9931afa65f9", - "sha256:d4a5f6146cfa5c7ba0134249665acd322a70d1ea61732723c7d3e8cc0fa80755", - "sha256:dd91006848eb55af2159375134d724032a2d1d13bcc6f81cd8d3ed9f2b8e846c", - "sha256:e05e60ff3b2b0342153be4d1b597bbcfd8330890056b9619f4ad6b8d5c96a81a", - "sha256:e6906d6f48437dfd80464f7d7af1740eadc572b9f7a4301e7dd3d65db285cacf", - "sha256:e92d0d4fa68ea0c02d39f1e2f9cb5bc4b4a71e8c442207433d8db47ee79d7aa3", - "sha256:e94b7d9deaa4cc7bac9198a58a7240aaf87fe56c6277ee25fa5b3aa1edebd229", - "sha256:ea3e746e29d4000cd98d572f3ee2a6050a4f784bb536f4ac1f035987fc1ed83e", - "sha256:ec7e20258ecc5174029a0f391e1b948bf2906cd64c198a9b8b281b811cbc04de", - "sha256:ec9465dd69d5657b5d2fa6133b3e1e989ae27d29471a672416fd729b429eb554", - "sha256:f122ccd12fdc69628786d0c947bdd9cb2733be8f800d88b5a37c57f1f1d73c10", - "sha256:f99c0489258086308aad4ae57da9e8ecf9e1f3f30fa35d5e170b4d4896554d80", - "sha256:f9c51d9af9abb899bd34ace878fbec8bf357b3194a10c4e8e0a25512826ef056", - "sha256:fd76c47f20984b43d93de9a82011bb6e5f8325df6c9ed4d8310029a55fa361ea" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.13.3" - }, - "yarl": { - "hashes": [ - "sha256:044daf3012e43d4b3538562da94a88fb12a6490652dbc29fb19adfa02cf72eac", - "sha256:0cba38120db72123db7c58322fa69e3c0efa933040ffb586c3a87c063ec7cae8", - "sha256:167ab7f64e409e9bdd99333fe8c67b5574a1f0495dcfd905bc7454e766729b9e", - "sha256:1be4bbb3d27a4e9aa5f3df2ab61e3701ce8fcbd3e9846dbce7c033a7e8136746", - "sha256:1ca56f002eaf7998b5fcf73b2421790da9d2586331805f38acd9997743114e98", - "sha256:1d3d5ad8ea96bd6d643d80c7b8d5977b4e2fb1bab6c9da7322616fd26203d125", - "sha256:1eb6480ef366d75b54c68164094a6a560c247370a68c02dddb11f20c4c6d3c9d", - "sha256:1edc172dcca3f11b38a9d5c7505c83c1913c0addc99cd28e993efeaafdfaa18d", - "sha256:211fcd65c58bf250fb994b53bc45a442ddc9f441f6fec53e65de8cba48ded986", - "sha256:29e0656d5497733dcddc21797da5a2ab990c0cb9719f1f969e58a4abac66234d", - "sha256:368bcf400247318382cc150aaa632582d0780b28ee6053cd80268c7e72796dec", - "sha256:39d5493c5ecd75c8093fa7700a2fb5c94fe28c839c8e40144b7ab7ccba6938c8", - "sha256:3abddf0b8e41445426d29f955b24aeecc83fa1072be1be4e0d194134a7d9baee", - "sha256:3bf8cfe8856708ede6a73907bf0501f2dc4e104085e070a41f5d88e7faf237f3", - "sha256:3ec1d9a0d7780416e657f1e405ba35ec1ba453a4f1511eb8b9fbab81cb8b3ce1", - "sha256:45399b46d60c253327a460e99856752009fcee5f5d3c80b2f7c0cae1c38d56dd", - "sha256:52690eb521d690ab041c3919666bea13ab9fbff80d615ec16fa81a297131276b", - "sha256:534b047277a9a19d858cde163aba93f3e1677d5acd92f7d10ace419d478540de", - "sha256:580c1f15500e137a8c37053e4cbf6058944d4c114701fa59944607505c2fe3a0", - "sha256:59218fef177296451b23214c91ea3aba7858b4ae3306dde120224cfe0f7a6ee8", - "sha256:5ba63585a89c9885f18331a55d25fe81dc2d82b71311ff8bd378fc8004202ff6", - "sha256:5bb7d54b8f61ba6eee541fba4b83d22b8a046b4ef4d8eb7f15a7e35db2e1e245", - "sha256:6152224d0a1eb254f97df3997d79dadd8bb2c1a02ef283dbb34b97d4f8492d23", - "sha256:67e94028817defe5e705079b10a8438b8cb56e7115fa01640e9c0bb3edf67332", - "sha256:695ba021a9e04418507fa930d5f0704edbce47076bdcfeeaba1c83683e5649d1", - "sha256:6a1a9fe17621af43e9b9fcea8bd088ba682c8192d744b386ee3c47b56eaabb2c", - "sha256:6ab0c3274d0a846840bf6c27d2c60ba771a12e4d7586bf550eefc2df0b56b3b4", - "sha256:6feca8b6bfb9eef6ee057628e71e1734caf520a907b6ec0d62839e8293e945c0", - "sha256:737e401cd0c493f7e3dd4db72aca11cfe069531c9761b8ea474926936b3c57c8", - "sha256:788713c2896f426a4e166b11f4ec538b5736294ebf7d5f654ae445fd44270832", - "sha256:797c2c412b04403d2da075fb93c123df35239cd7b4cc4e0cd9e5839b73f52c58", - "sha256:8300401dc88cad23f5b4e4c1226f44a5aa696436a4026e456fe0e5d2f7f486e6", - "sha256:87f6e082bce21464857ba58b569370e7b547d239ca22248be68ea5d6b51464a1", - "sha256:89ccbf58e6a0ab89d487c92a490cb5660d06c3a47ca08872859672f9c511fc52", - "sha256:8b0915ee85150963a9504c10de4e4729ae700af11df0dc5550e6587ed7891e92", - "sha256:8cce6f9fa3df25f55521fbb5c7e4a736683148bcc0c75b21863789e5185f9185", - "sha256:95a1873b6c0dd1c437fb3bb4a4aaa699a48c218ac7ca1e74b0bee0ab16c7d60d", - "sha256:9b4c77d92d56a4c5027572752aa35082e40c561eec776048330d2907aead891d", - "sha256:9bfcd43c65fbb339dc7086b5315750efa42a34eefad0256ba114cd8ad3896f4b", - "sha256:9c1f083e7e71b2dd01f7cd7434a5f88c15213194df38bc29b388ccdf1492b739", - "sha256:a1d0894f238763717bdcfea74558c94e3bc34aeacd3351d769460c1a586a8b05", - "sha256:a467a431a0817a292121c13cbe637348b546e6ef47ca14a790aa2fa8cc93df63", - "sha256:aa32aaa97d8b2ed4e54dc65d241a0da1c627454950f7d7b1f95b13985afd6c5d", - "sha256:ac10bbac36cd89eac19f4e51c032ba6b412b3892b685076f4acd2de18ca990aa", - "sha256:ac35ccde589ab6a1870a484ed136d49a26bcd06b6a1c6397b1967ca13ceb3913", - "sha256:bab827163113177aee910adb1f48ff7af31ee0289f434f7e22d10baf624a6dfe", - "sha256:baf81561f2972fb895e7844882898bda1eef4b07b5b385bcd308d2098f1a767b", - "sha256:bf19725fec28452474d9887a128e98dd67eee7b7d52e932e6949c532d820dc3b", - "sha256:c01a89a44bb672c38f42b49cdb0ad667b116d731b3f4c896f72302ff77d71656", - "sha256:c0910c6b6c31359d2f6184828888c983d54d09d581a4a23547a35f1d0b9484b1", - "sha256:c10ea1e80a697cf7d80d1ed414b5cb8f1eec07d618f54637067ae3c0334133c4", - "sha256:c1164a2eac148d85bbdd23e07dfcc930f2e633220f3eb3c3e2a25f6148c2819e", - "sha256:c145ab54702334c42237a6c6c4cc08703b6aa9b94e2f227ceb3d477d20c36c63", - "sha256:c17965ff3706beedafd458c452bf15bac693ecd146a60a06a214614dc097a271", - "sha256:c19324a1c5399b602f3b6e7db9478e5b1adf5cf58901996fc973fe4fccd73eed", - "sha256:c2a1ac41a6aa980db03d098a5531f13985edcb451bcd9d00670b03129922cd0d", - "sha256:c6ddcd80d79c96eb19c354d9dca95291589c5954099836b7c8d29278a7ec0bda", - "sha256:c9c6d927e098c2d360695f2e9d38870b2e92e0919be07dbe339aefa32a090265", - "sha256:cc8b7a7254c0fc3187d43d6cb54b5032d2365efd1df0cd1749c0c4df5f0ad45f", - "sha256:cff3ba513db55cc6a35076f32c4cdc27032bd075c9faef31fec749e64b45d26c", - "sha256:d260d4dc495c05d6600264a197d9d6f7fc9347f21d2594926202fd08cf89a8ba", - "sha256:d6f3d62e16c10e88d2168ba2d065aa374e3c538998ed04996cd373ff2036d64c", - "sha256:da6df107b9ccfe52d3a48165e48d72db0eca3e3029b5b8cb4fe6ee3cb870ba8b", - "sha256:dfe4b95b7e00c6635a72e2d00b478e8a28bfb122dc76349a06e20792eb53a523", - "sha256:e39378894ee6ae9f555ae2de332d513a5763276a9265f8e7cbaeb1b1ee74623a", - "sha256:ede3b46cdb719c794427dcce9d8beb4abe8b9aa1e97526cc20de9bd6583ad1ef", - "sha256:f2a8508f7350512434e41065684076f640ecce176d262a7d54f0da41d99c5a95", - "sha256:f44477ae29025d8ea87ec308539f95963ffdc31a82f42ca9deecf2d505242e72", - "sha256:f64394bd7ceef1237cc604b5a89bf748c95982a84bcd3c4bbeb40f685c810794", - "sha256:fc4dd8b01a8112809e6b636b00f487846956402834a7fd59d46d4f4267181c41", - "sha256:fce78593346c014d0d986b7ebc80d782b7f5e19843ca798ed62f8e3ba8728576", - "sha256:fd547ec596d90c8676e369dd8a581a21227fe9b4ad37d0dc7feb4ccf544c2d59" - ], - "markers": "python_version >= '3.6'", - "version": "==1.7.2" - }, - "zipp": { - "hashes": [ - "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832", - "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc" - ], - "markers": "python_version < '3.10'", - "version": "==3.6.0" } } } diff --git a/RELEASES.md b/RELEASES.md index 31383eec8015ec..aabe4254774878 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,9 +1,12 @@ +Version 0.8.12 (202X-XX-XX) +======================== + Version 0.8.11 (2021-11-22) ======================== * Support for an external panda on the comma three * Navigation: Show more detailed instructions when approaching maneuver * Fixed occasional steering faults on GM cars thanks to jyoung8607! - * Nissan ECU firmware fingerprinting thanks to robin-reckmann, martinl and razem-io! + * Nissan ECU firmware fingerprinting thanks to robin-reckmann, martinl, and razem-io! * Cadillac Escalade ESV 2016 support thanks to Gibby! * Mazda CX-9 2021 support thanks to Jacar! * Volkswagen Polo 2020 support thanks to jyoung8607! diff --git a/SConstruct b/SConstruct index 73c66690ade338..67acd3eac4637f 100644 --- a/SConstruct +++ b/SConstruct @@ -189,6 +189,7 @@ env = Environment( "-Wno-inconsistent-missing-override", "-Wno-c99-designator", "-Wno-reorder-init-list", + "-Wno-error=unused-but-set-variable", ] + cflags + ccflags, CPPPATH=cpppath + [ diff --git a/cereal b/cereal index 78ded8f8606e17..5edffa0f494abf 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 78ded8f8606e1760f8bb99834ed4cbfc68c5d49e +Subproject commit 5edffa0f494abfa2e907c497cda0f64223a421e7 diff --git a/docs/CARS.md b/docs/CARS.md index 924b3f72cd7abf..aa23a85cecb0a6 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -46,7 +46,7 @@ | Toyota | Avalon 2016-21 | TSS-P | Stock3| 20mph1 | 0mph | | Toyota | Avalon Hybrid 2019-21 | TSS-P | Stock3| 20mph1 | 0mph | | Toyota | Camry 2018-20 | All | Stock | 0mph4 | 0mph | -| Toyota | Camry 2021 | All | openpilot | 0mph4 | 0mph | +| Toyota | Camry 2021-22 | All | openpilot | 0mph4 | 0mph | | Toyota | Camry Hybrid 2018-20 | All | Stock | 0mph4 | 0mph | | Toyota | Camry Hybrid 2021-22 | All | openpilot | 0mph | 0mph | | Toyota | C-HR 2017-20 | All | Stock | 0mph | 0mph | @@ -58,7 +58,7 @@ | Toyota | Highlander 2017-19 | All | Stock3| 0mph | 0mph | | Toyota | Highlander 2020-22 | All | openpilot | 0mph | 0mph | | Toyota | Highlander Hybrid 2017-19 | All | Stock3| 0mph | 0mph | -| Toyota | Highlander Hybrid 2020-21 | All | openpilot | 0mph | 0mph | +| Toyota | Highlander Hybrid 2020-22 | All | openpilot | 0mph | 0mph | | Toyota | Mirai 2021 | All | openpilot | 0mph | 0mph | | Toyota | Prius 2016-20 | TSS-P | Stock3| 0mph | 0mph | | Toyota | Prius 2021 | All | openpilot | 0mph | 0mph | diff --git a/opendbc b/opendbc index b9669cbe5405fe..fedaf7eb31949e 160000 --- a/opendbc +++ b/opendbc @@ -1 +1 @@ -Subproject commit b9669cbe5405fe3cc3b591f7bba44b407021fde6 +Subproject commit fedaf7eb31949ee3b72831c1bc7bba7641b64912 diff --git a/panda b/panda index ae26b75d7bac3d..571512a3923962 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit ae26b75d7bac3d57b060f9fdc48b591fa23e0a25 +Subproject commit 571512a392396271e54469c562b2ba08cbb44bfc diff --git a/release/files_common b/release/files_common index bf8b22369364cc..ceaef0b0bf4607 100644 --- a/release/files_common +++ b/release/files_common @@ -130,6 +130,7 @@ selfdrive/car/hyundai/carcontroller.py selfdrive/car/hyundai/hyundaican.py selfdrive/car/toyota/__init__.py selfdrive/car/toyota/carstate.py +selfdrive/car/toyota/tunes.py selfdrive/car/toyota/interface.py selfdrive/car/toyota/radar_interface.py selfdrive/car/toyota/values.py diff --git a/selfdrive/boardd/boardd.cc b/selfdrive/boardd/boardd.cc index c6f2cf8ed39867..50749a10617dae 100644 --- a/selfdrive/boardd/boardd.cc +++ b/selfdrive/boardd/boardd.cc @@ -158,8 +158,6 @@ Panda *usb_connect(std::string serial="", uint32_t index=0) { return nullptr; } - Params params = Params(); - if (getenv("BOARDD_LOOPBACK")) { panda->set_loopback(true); } @@ -669,6 +667,11 @@ int main(int argc, char* argv[]) { } } + if (pandas.size() == 0) { + // do_exit was set while not connected to a panda + return 0; + } + peripheral_panda = pandas[0]; LOGW("connected to board"); diff --git a/selfdrive/boardd/panda.cc b/selfdrive/boardd/panda.cc index b5bf3f903dbcf5..f101b2e3b20d37 100644 --- a/selfdrive/boardd/panda.cc +++ b/selfdrive/boardd/panda.cc @@ -344,6 +344,14 @@ void Panda::send_heartbeat() { usb_write(0xf3, 1, 0); } +void Panda::set_can_speed_kbps(uint16_t bus, uint16_t speed) { + usb_write(0xde, bus, (speed * 10)); +} + +void Panda::set_data_speed_kbps(uint16_t bus, uint16_t speed) { + usb_write(0xf9, bus, (speed * 10)); +} + uint8_t Panda::len_to_dlc(uint8_t len) { if (len <= 8) { return len; @@ -356,12 +364,14 @@ uint8_t Panda::len_to_dlc(uint8_t len) { } void Panda::can_send(capnp::List::Reader can_data_list) { - send.resize(72 * can_data_list.size()); // TODO: need to include 1 byte for each usb 64bytes frame + if (send.size() < (can_data_list.size() * CANPACKET_MAX_SIZE)) { + send.resize(can_data_list.size() * CANPACKET_MAX_SIZE); + } int msg_count = 0; while (msg_count < can_data_list.size()) { uint32_t pos = 0; - while (pos < 256) { + while (pos < USB_TX_SOFT_LIMIT) { if (msg_count == can_data_list.size()) { break; } auto cmsg = can_data_list[msg_count]; @@ -376,26 +386,31 @@ void Panda::can_send(capnp::List::Reader can_data_list) { assert(can_data.size() <= (hw_type == cereal::PandaState::PandaType::RED_PANDA) ? 64 : 8); assert(can_data.size() == dlc_to_len[data_len_code]); - *(uint32_t*)&send[pos+1] = (cmsg.getAddress() << 3); - if (cmsg.getAddress() >= 0x800) { - *(uint32_t*)&send[pos+1] |= (1 << 2); - } - send[pos] = data_len_code << 4 | ((bus - bus_offset) << 1); - memcpy(&send[pos+5], can_data.begin(), can_data.size()); + can_header header; + header.addr = cmsg.getAddress(); + header.extended = (cmsg.getAddress() >= 0x800) ? 1 : 0; + header.data_len_code = data_len_code; + header.bus = bus - bus_offset; + memcpy(&send[pos], &header, CANPACKET_HEAD_SIZE); + memcpy(&send[pos+CANPACKET_HEAD_SIZE], can_data.begin(), can_data.size()); pos += CANPACKET_HEAD_SIZE + dlc_to_len[data_len_code]; msg_count++; } if (pos > 0) { // Helps not to spam with ZLP - // insert counter + // Counter needs to be inserted every 64 bytes (first byte of 64 bytes USB packet) uint8_t counter = 0; - for (int i = 0; i < pos; i += 64) { - send.insert(send.begin() + i, counter); + uint8_t to_write[USB_TX_SOFT_LIMIT+128]; + int ptr = 0; + for (int i = 0; i < pos; i += 63) { + to_write[ptr] = counter; + int copy_size = ((pos - i) < 63) ? (pos - i) : 63; + memcpy(&to_write[ptr+1], &(send.data()[i]) , copy_size); + ptr += copy_size + 1; counter++; - pos++; } - usb_bulk_write(3, (uint8_t*)send.data(), pos, 5); + usb_bulk_write(3, to_write, ptr, 5); } } } @@ -407,7 +422,6 @@ bool Panda::can_receive(std::vector& out_vec) { // Not sure if this can happen if (recv < 0) recv = 0; - // TODO: Might change from full to overloaded? if > some threshold that is lower than RECV_SIZE, let's say 80-90% if (recv == RECV_SIZE) { LOGW("Receive buffer full"); } @@ -418,17 +432,18 @@ bool Panda::can_receive(std::vector& out_vec) { out_vec.reserve(out_vec.size() + (recv / CANPACKET_HEAD_SIZE)); - static uint8_t tail[72]; + static uint8_t tail[CANPACKET_MAX_SIZE]; uint8_t tail_size = 0; uint8_t counter = 0; for (int i = 0; i < recv; i += 64) { + // Check for counter every 64 bytes (length of USB packet) if (counter != data[i]) { LOGE("CAN: MALFORMED USB RECV PACKET"); break; } counter++; uint8_t chunk_len = ((recv - i) > 64) ? 63 : (recv - i - 1); // as 1 is always reserved for counter - uint8_t chunk[72]; + uint8_t chunk[CANPACKET_MAX_SIZE]; memcpy(chunk, tail, tail_size); memcpy(&chunk[tail_size], &data[i+1], chunk_len); chunk_len += tail_size; @@ -439,21 +454,22 @@ bool Panda::can_receive(std::vector& out_vec) { uint8_t pckt_len = CANPACKET_HEAD_SIZE + data_len; if (pckt_len <= (chunk_len - pos)) { can_frame canData; + can_header header; + memcpy(&header, &chunk[pos], CANPACKET_HEAD_SIZE); canData.busTime = 0; - canData.address = (*(uint32_t*)&chunk[pos+1]) >> 3; - canData.src = ((chunk[pos] >> 1) & 0x7) + bus_offset; + canData.address = header.addr; + canData.src = header.bus + bus_offset; - bool rejected = chunk[pos+1] & 0x1; - bool returned = (chunk[pos+1] >> 1) & 0x1; - if (rejected) { canData.src += CANPACKET_REJECTED; } - if (returned) { canData.src += CANPACKET_RETURNED; } - canData.dat.assign((char*)&chunk[pos+5], data_len); + if (header.rejected) { canData.src += CANPACKET_REJECTED; } + if (header.returned) { canData.src += CANPACKET_RETURNED; } + canData.dat.assign((char*)&chunk[pos+CANPACKET_HEAD_SIZE], data_len); pos += pckt_len; // add to vector out_vec.push_back(canData); } else { + // Keep partial CAN packet until next USB packet tail_size = (chunk_len - pos); memcpy(tail, &chunk[pos], tail_size); break; diff --git a/selfdrive/boardd/panda.h b/selfdrive/boardd/panda.h index 2373d1cb938139..415bb30103fc70 100644 --- a/selfdrive/boardd/panda.h +++ b/selfdrive/boardd/panda.h @@ -13,11 +13,12 @@ #include "cereal/gen/cpp/car.capnp.h" #include "cereal/gen/cpp/log.capnp.h" -// double the FIFO size -#define RECV_SIZE (0x4000) #define TIMEOUT 0 #define PANDA_BUS_CNT 4 -#define CANPACKET_HEAD_SIZE (0x5U) +#define RECV_SIZE (0x4000U) +#define USB_TX_SOFT_LIMIT (0x100U) +#define CANPACKET_HEAD_SIZE 5U +#define CANPACKET_MAX_SIZE 72U #define CANPACKET_REJECTED (0xC0U) #define CANPACKET_RETURNED (0x80U) @@ -44,6 +45,16 @@ struct __attribute__((packed)) health_t { uint8_t heartbeat_lost; }; +struct __attribute__((packed)) can_header { + uint8_t reserved : 1; + uint8_t bus : 3; + uint8_t data_len_code : 4; + uint8_t rejected : 1; + uint8_t returned : 1; + uint8_t extended : 1; + uint32_t addr : 29; +}; + struct can_frame { long address; std::string dat; @@ -96,6 +107,8 @@ class Panda { void set_power_saving(bool power_saving); void set_usb_power_mode(cereal::PeripheralState::UsbPowerMode power_mode); void send_heartbeat(); + void set_can_speed_kbps(uint16_t bus, uint16_t speed); + void set_data_speed_kbps(uint16_t bus, uint16_t speed); uint8_t len_to_dlc(uint8_t len); void can_send(capnp::List::Reader can_data_list); bool can_receive(std::vector& out_vec); diff --git a/selfdrive/camerad/cameras/camera_common.h b/selfdrive/camerad/cameras/camera_common.h index 8387e60bf206c3..e994fc2208b722 100644 --- a/selfdrive/camerad/cameras/camera_common.h +++ b/selfdrive/camerad/cameras/camera_common.h @@ -34,6 +34,7 @@ enum CameraType { WideRoadCam }; +// TODO: remove these once all the internal tools are moved to vipc const bool env_send_driver = getenv("SEND_DRIVER") != NULL; const bool env_send_road = getenv("SEND_ROAD") != NULL; const bool env_send_wide_road = getenv("SEND_WIDE_ROAD") != NULL; diff --git a/selfdrive/camerad/cameras/camera_qcom2.cc b/selfdrive/camerad/cameras/camera_qcom2.cc index 089d9e999bb19c..03138e353aa69c 100644 --- a/selfdrive/camerad/cameras/camera_qcom2.cc +++ b/selfdrive/camerad/cameras/camera_qcom2.cc @@ -551,7 +551,6 @@ int open_v4l_by_name_and_index(const char name[], int index, int flags = O_RDWR } static void camera_open(CameraState *s) { - int ret; s->sensor_fd = open_v4l_by_name_and_index("cam-sensor-driver", s->camera_num); assert(s->sensor_fd >= 0); LOGD("opened sensor"); @@ -566,7 +565,7 @@ static void camera_open(CameraState *s) { // create session struct cam_req_mgr_session_info session_info = {}; - ret = cam_control(s->multi_cam_state->video0_fd, CAM_REQ_MGR_CREATE_SESSION, &session_info, sizeof(session_info)); + int ret = cam_control(s->multi_cam_state->video0_fd, CAM_REQ_MGR_CREATE_SESSION, &session_info, sizeof(session_info)); LOGD("get session: %d 0x%X", ret, session_info.session_hdl); s->session_handle = session_info.session_hdl; @@ -577,73 +576,59 @@ static void camera_open(CameraState *s) { s->sensor_dev_handle = *sensor_dev_handle; LOGD("acquire sensor dev"); - static struct cam_isp_resource isp_resource = {0}; - isp_resource.resource_id = CAM_ISP_RES_ID_PORT; - isp_resource.length = sizeof(struct cam_isp_in_port_info) + sizeof(struct cam_isp_out_port_info)*(1-1); - isp_resource.handle_type = CAM_HANDLE_USER_POINTER; - - struct cam_isp_in_port_info *in_port_info = (struct cam_isp_in_port_info *)malloc(isp_resource.length); - isp_resource.res_hdl = (uint64_t)in_port_info; - - switch (s->camera_num) { - case 0: - in_port_info->res_type = CAM_ISP_IFE_IN_RES_PHY_0; - break; - case 1: - in_port_info->res_type = CAM_ISP_IFE_IN_RES_PHY_1; - break; - case 2: - in_port_info->res_type = CAM_ISP_IFE_IN_RES_PHY_2; - break; - } - - in_port_info->lane_type = CAM_ISP_LANE_TYPE_DPHY; - in_port_info->lane_num = 4; - in_port_info->lane_cfg = 0x3210; - - in_port_info->vc = 0x0; - //in_port_info->dt = 0x2C; //CSI_RAW12 - //in_port_info->format = CAM_FORMAT_MIPI_RAW_12; - - in_port_info->dt = 0x2B; //CSI_RAW10 - in_port_info->format = CAM_FORMAT_MIPI_RAW_10; - - in_port_info->test_pattern = 0x2; // 0x3? - in_port_info->usage_type = 0x0; - - in_port_info->left_start = 0x0; - in_port_info->left_stop = FRAME_WIDTH - 1; - in_port_info->left_width = FRAME_WIDTH; - - in_port_info->right_start = 0x0; - in_port_info->right_stop = FRAME_WIDTH - 1; - in_port_info->right_width = FRAME_WIDTH; - - in_port_info->line_start = 0x0; - in_port_info->line_stop = FRAME_HEIGHT - 1; - in_port_info->height = FRAME_HEIGHT; - - in_port_info->pixel_clk = 0x0; - in_port_info->batch_size = 0x0; - in_port_info->dsp_mode = 0x0; - in_port_info->hbi_cnt = 0x0; - in_port_info->custom_csid = 0x0; - - in_port_info->num_out_res = 0x1; - in_port_info->data[0] = (struct cam_isp_out_port_info){ - .res_type = CAM_ISP_IFE_OUT_RES_RDI_0, - //.format = CAM_FORMAT_MIPI_RAW_12, - .format = CAM_FORMAT_MIPI_RAW_10, - .width = FRAME_WIDTH, - .height = FRAME_HEIGHT, - .comp_grp_id = 0x0, .split_point = 0x0, .secure_mode = 0x0, + struct cam_isp_in_port_info in_port_info = { + .res_type = (uint32_t[]){CAM_ISP_IFE_IN_RES_PHY_0, CAM_ISP_IFE_IN_RES_PHY_1, CAM_ISP_IFE_IN_RES_PHY_2}[s->camera_num], + + .lane_type = CAM_ISP_LANE_TYPE_DPHY, + .lane_num = 4, + .lane_cfg = 0x3210, + + .vc = 0x0, + // .dt = 0x2C; //CSI_RAW12 + .dt = 0x2B, //CSI_RAW10 + .format = CAM_FORMAT_MIPI_RAW_10, + + .test_pattern = 0x2, // 0x3? + .usage_type = 0x0, + + .left_start = 0, + .left_stop = FRAME_WIDTH - 1, + .left_width = FRAME_WIDTH, + + .right_start = 0, + .right_stop = FRAME_WIDTH - 1, + .right_width = FRAME_WIDTH, + + .line_start = 0, + .line_stop = FRAME_HEIGHT - 1, + .height = FRAME_HEIGHT, + + .pixel_clk = 0x0, + .batch_size = 0x0, + .dsp_mode = 0x0, + .hbi_cnt = 0x0, + .custom_csid = 0x0, + + .num_out_res = 0x1, + .data[0] = (struct cam_isp_out_port_info){ + .res_type = CAM_ISP_IFE_OUT_RES_RDI_0, + .format = CAM_FORMAT_MIPI_RAW_10, + .width = FRAME_WIDTH, + .height = FRAME_HEIGHT, + .comp_grp_id = 0x0, .split_point = 0x0, .secure_mode = 0x0, + }, + }; + struct cam_isp_resource isp_resource = { + .resource_id = CAM_ISP_RES_ID_PORT, + .handle_type = CAM_HANDLE_USER_POINTER, + .res_hdl = (uint64_t)&in_port_info, + .length = sizeof(in_port_info), }; auto isp_dev_handle = device_acquire(s->multi_cam_state->isp_fd, s->session_handle, &isp_resource); assert(isp_dev_handle); s->isp_dev_handle = *isp_dev_handle; LOGD("acquire isp dev"); - free(in_port_info); struct cam_csiphy_acquire_dev_info csiphy_acquire_dev_info = {.combo_mode = 0}; auto csiphy_dev_handle = device_acquire(s->csiphy_fd, s->session_handle, &csiphy_acquire_dev_info); @@ -651,19 +636,14 @@ static void camera_open(CameraState *s) { s->csiphy_dev_handle = *csiphy_dev_handle; LOGD("acquire csiphy dev"); - // acquires done - // config ISP alloc_w_mmu_hdl(s->multi_cam_state->video0_fd, 984480, (uint32_t*)&s->buf0_handle, 0x20, CAM_MEM_FLAG_HW_READ_WRITE | CAM_MEM_FLAG_KMD_ACCESS | CAM_MEM_FLAG_UMD_ACCESS | CAM_MEM_FLAG_CMD_BUF_TYPE, s->multi_cam_state->device_iommu, s->multi_cam_state->cdm_iommu); config_isp(s, 0, 0, 1, s->buf0_handle, 0); LOG("-- Configuring sensor"); - sensors_i2c(s, init_array_ar0231, sizeof(init_array_ar0231)/sizeof(struct i2c_random_wr_payload), - CAM_SENSOR_PACKET_OPCODE_SENSOR_CONFIG); - //sensors_i2c(s, start_reg_array, sizeof(start_reg_array)/sizeof(struct i2c_random_wr_payload), - //CAM_SENSOR_PACKET_OPCODE_SENSOR_STREAMON); - //sensors_i2c(s, stop_reg_array, sizeof(stop_reg_array)/sizeof(struct i2c_random_wr_payload), - //CAM_SENSOR_PACKET_OPCODE_SENSOR_STREAMOFF); + sensors_i2c(s, init_array_ar0231, std::size(init_array_ar0231), CAM_SENSOR_PACKET_OPCODE_SENSOR_CONFIG); + //sensors_i2c(s, start_reg_array, std::size(start_reg_array), CAM_SENSOR_PACKET_OPCODE_SENSOR_STREAMON); + //sensors_i2c(s, stop_reg_array, std::size(stop_reg_array), CAM_SENSOR_PACKET_OPCODE_SENSOR_STREAMOFF); // config csiphy LOG("-- Config CSI PHY"); @@ -700,7 +680,7 @@ static void camera_open(CameraState *s) { // link devices LOG("-- Link devices"); - static struct cam_req_mgr_link_info req_mgr_link_info = {0}; + struct cam_req_mgr_link_info req_mgr_link_info = {0}; req_mgr_link_info.session_hdl = s->session_handle; req_mgr_link_info.num_devices = 2; req_mgr_link_info.dev_hdls[0] = s->isp_dev_handle; @@ -709,7 +689,7 @@ static void camera_open(CameraState *s) { LOGD("link: %d", ret); s->link_handle = req_mgr_link_info.link_hdl; - static struct cam_req_mgr_link_control req_mgr_link_control = {0}; + struct cam_req_mgr_link_control req_mgr_link_control = {0}; req_mgr_link_control.ops = CAM_REQ_MGR_LINK_ACTIVATE; req_mgr_link_control.session_hdl = s->session_handle; req_mgr_link_control.num_links = 1; diff --git a/selfdrive/camerad/snapshot/snapshot.py b/selfdrive/camerad/snapshot/snapshot.py index 787d628370e34e..889e1579bf5949 100755 --- a/selfdrive/camerad/snapshot/snapshot.py +++ b/selfdrive/camerad/snapshot/snapshot.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -import os import subprocess import time @@ -8,24 +7,29 @@ from typing import List import cereal.messaging as messaging +from cereal.visionipc.visionipc_pyx import VisionIpcClient, VisionStreamType # pylint: disable=no-name-in-module, import-error from common.params import Params from common.realtime import DT_MDL -from common.transformations.camera import eon_f_frame_size, eon_d_frame_size, tici_f_frame_size -from selfdrive.hardware import TICI +from selfdrive.hardware import TICI, PC from selfdrive.controls.lib.alertmanager import set_offroad_alert from selfdrive.manager.process_config import managed_processes LM_THRESH = 120 # defined in selfdrive/camerad/imgproc/utils.h +VISION_STREAMS = { + "roadCameraState": VisionStreamType.VISION_STREAM_RGB_BACK, + "driverCameraState": VisionStreamType.VISION_STREAM_RGB_FRONT, + "wideRoadCameraState": VisionStreamType.VISION_STREAM_RGB_WIDE, +} + def jpeg_write(fn, dat): img = Image.fromarray(dat) img.save(fn, "JPEG") -def extract_image(dat, frame_sizes): - img = np.frombuffer(dat, dtype=np.uint8) - w, h = frame_sizes[len(img) // 3] +def extract_image(buf, w, h, stride): + img = np.hstack([buf[i * stride:i * stride + 3 * w] for i in range(h)]) b = img[::3].reshape(h, w) g = img[1::3].reshape(h, w) r = img[2::3].reshape(h, w) @@ -33,45 +37,47 @@ def extract_image(dat, frame_sizes): def rois_in_focus(lapres: List[float]) -> float: - sz = len(lapres) - return sum([1. / sz for sharpness in - lapres if sharpness >= LM_THRESH]) + return sum([1. / len(lapres) for sharpness in lapres if sharpness >= LM_THRESH]) def get_snapshots(frame="roadCameraState", front_frame="driverCameraState", focus_perc_threshold=0.): - frame_sizes = [eon_f_frame_size, eon_d_frame_size, tici_f_frame_size] - frame_sizes = {w * h: (w, h) for (w, h) in frame_sizes} - - sockets = [] - if frame is not None: - sockets.append(frame) - if front_frame is not None: - sockets.append(front_frame) + sockets = [s for s in (frame, front_frame) if s is not None] + sm = messaging.SubMaster(sockets) + vipc_clients = {s: VisionIpcClient("camerad", VISION_STREAMS[s], True) for s in sockets} # wait 4 sec from camerad startup for focus and exposure - sm = messaging.SubMaster(sockets) while sm[sockets[0]].frameId < int(4. / DT_MDL): sm.update() + for client in vipc_clients.values(): + client.connect(True) + + # wait for focus start_t = time.monotonic() while time.monotonic() - start_t < 10: - sm.update() + sm.update(100) if min(sm.rcv_frame.values()) > 1 and rois_in_focus(sm[frame].sharpnessScore) >= focus_perc_threshold: break - rear = extract_image(sm[frame].image, frame_sizes) if frame is not None else None - front = extract_image(sm[front_frame].image, frame_sizes) if front_frame is not None else None + # grab images + rear, front = None, None + if frame is not None: + c = vipc_clients[frame] + rear = extract_image(c.recv(), c.width, c.height, c.stride) + if front_frame is not None: + c = vipc_clients[front_frame] + front = extract_image(c.recv(), c.width, c.height, c.stride) return rear, front def snapshot(): params = Params() - front_camera_allowed = params.get_bool("RecordFront") if (not params.get_bool("IsOffroad")) or params.get_bool("IsTakingSnapshot"): print("Already taking snapshot") return None, None + front_camera_allowed = params.get_bool("RecordFront") params.put_bool("IsTakingSnapshot", True) set_offroad_alert("Offroad_IsTakingSnapshot", True) time.sleep(2.0) # Give thermald time to read the param, or if just started give camerad time to start @@ -86,13 +92,11 @@ def snapshot(): except subprocess.CalledProcessError: pass - os.environ["SEND_ROAD"] = "1" - os.environ["SEND_WIDE_ROAD"] = "1" - if front_camera_allowed: - os.environ["SEND_DRIVER"] = "1" - try: - managed_processes['camerad'].start() + # Allow testing on replay on PC + if not PC: + managed_processes['camerad'].start() + frame = "wideRoadCameraState" if TICI else "roadCameraState" front_frame = "driverCameraState" if front_camera_allowed else None focus_perc_threshold = 0. if TICI else 10 / 12. diff --git a/selfdrive/camerad/test/test_exposure.py b/selfdrive/camerad/test/test_exposure.py index 0b5b5ace8898da..6ed69627b50d27 100755 --- a/selfdrive/camerad/test/test_exposure.py +++ b/selfdrive/camerad/test/test_exposure.py @@ -1,8 +1,6 @@ #!/usr/bin/env python3 - import time import unittest -import os import numpy as np from selfdrive.test.helpers import with_processes @@ -13,11 +11,6 @@ TEST_TIME = 45 REPEAT = 5 -os.environ["SEND_ROAD"] = "1" -os.environ["SEND_DRIVER"] = "1" -if TICI: - os.environ["SEND_WIDE_ROAD"] = "1" - class TestCamerad(unittest.TestCase): @classmethod def setUpClass(cls): @@ -38,14 +31,11 @@ def _is_exposure_okay(self, i, med_mean=np.array([[0.2,0.4],[0.2,0.6]])): print([i_median, i_mean]) return med_ex[0] < i_median < med_ex[1] and mean_ex[0] < i_mean < mean_ex[1] - @with_processes(['camerad']) def test_camera_operation(self): - print("checking image outputs") - - start = time.time() passed = 0 - while(time.time() - start < TEST_TIME and passed < REPEAT): + start = time.time() + while time.time() - start < TEST_TIME and passed < REPEAT: rpic, dpic = get_snapshots(frame="roadCameraState", front_frame="driverCameraState") res = self._is_exposure_okay(rpic) @@ -61,8 +51,7 @@ def test_camera_operation(self): passed += int(res) time.sleep(2) - print(passed) - self.assertTrue(passed >= REPEAT) + self.assertGreaterEqual(passed, REPEAT) if __name__ == "__main__": unittest.main() diff --git a/selfdrive/car/honda/carcontroller.py b/selfdrive/car/honda/carcontroller.py index 088e42476ea0b3..1e0a35fdf50222 100644 --- a/selfdrive/car/honda/carcontroller.py +++ b/selfdrive/car/honda/carcontroller.py @@ -232,7 +232,7 @@ def update(self, enabled, active, CS, frame, actuators, pcm_cancel_cmd, # This prevents unexpected pedal range rescaling # Sending non-zero gas when OP is not enabled will cause the PCM not to respond to throttle as expected # when you do enable. - if enabled: + if active: apply_gas = clip(gas_mult * (gas - brake + wind_brake*3/4), 0., 1.) else: apply_gas = 0.0 diff --git a/selfdrive/car/mazda/values.py b/selfdrive/car/mazda/values.py index 4e4ecd341c26f1..ada3ea1ddbb8f3 100644 --- a/selfdrive/car/mazda/values.py +++ b/selfdrive/car/mazda/values.py @@ -46,13 +46,14 @@ class Buttons: ], (Ecu.engine, 0x7e0, None): [ b'PA53-188K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'PYNF-188K2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PYFA-188K2-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PYFC-188K2-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PYFD-188K2-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYNF-188K2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PX2G-188K2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PX2H-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'PX2H-188K2-D\0x0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX2H-188K2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX2K-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PX38-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PX42-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PX68-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', @@ -67,14 +68,14 @@ class Buttons: ], (Ecu.esp, 0x760, None): [ b'K123-437K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'KBJ5-437K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'KL2K-437K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'KN0W-437K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'KBJ5-437K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.fwdCamera, 0x706, None): [ - b'B61L-67XK2-T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'B61L-67XK2-R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'B61L-67XK2-S\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'B61L-67XK2-T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'B61L-67XK2-V\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'GSH7-67XK2-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'GSH7-67XK2-N\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', @@ -82,14 +83,15 @@ class Buttons: (Ecu.transmission, 0x7e1, None): [ b'PA66-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PX39-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX39-21PS1-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX68-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PYB1-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PYB1-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'PX68-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'PYNC-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PYB2-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PYB2-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PYB2-21PS1-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PYB2-21PS1-G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYNC-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'SH9T-21PS1-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], }, @@ -101,55 +103,59 @@ class Buttons: b'KJ01-3210X-L-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.engine, 0x7e0, None): [ - b'PYFM-188K2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'PYD7-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PX23-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PX24-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PXN8-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXN8-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYD7-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYD8-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYFM-188K2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.fwdRadar, 0x764, None): [ - b'TK80-67XK2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'K123-67XK2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'K131-67XK2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'K131-67XK2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'TK80-67XK2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.esp, 0x760, None): [ + b'TA0B-437K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'TK79-437K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'TM53-437K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'TN40-437K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'TA0B-437K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.fwdCamera, 0x706, None): [ - b'TK80-67XK2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'B61L-67XK2-P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'B61L-67XK2-V\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'GSH7-67XK2-K\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - ], + b'TK80-67XK2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], (Ecu.transmission, 0x7e1, None): [ + b'PXM7-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXM7-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PYFM-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PYD5-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PYD5-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYD6-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PYD6-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'PXM7-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], }, CAR.MAZDA3: { (Ecu.eps, 0x730, None): [ + b'BHN1-3210X-J-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'K070-3210X-C-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'KR11-3210X-K-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'BHN1-3210X-J-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.engine, 0x7e0, None): [ b'P5JD-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PY2P-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PYKC-188K2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PYKE-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'PY2P-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.fwdRadar, 0x764, None): [ + b'B63C-67XK2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'GHP9-67Y10---41\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'K131-67XK2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'B63C-67XK2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.esp, 0x760, None): [ b'B45A-437AS-0-08\x00\x00\x00\x00\x00\x00\x00\x00\x00', @@ -173,8 +179,8 @@ class Buttons: b'GFBC-3210X-A-00\000\000\000\000\000\000\000\000\000', ], (Ecu.engine, 0x7e0, None): [ - b'PYH7-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PX4F-188K2-D\000\000\000\000\000\000\000\000\000\000\000\000', + b'PYH7-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.fwdRadar, 0x764, None): [ b'K131-67XK2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', @@ -189,8 +195,8 @@ class Buttons: b'GSH7-67XK2-P\000\000\000\000\000\000\000\000\000\000\000\000', ], (Ecu.transmission, 0x7e1, None): [ - b'PYH7-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PYH3-21PS1-D\000\000\000\000\000\000\000\000\000\000\000\000', + b'PYH7-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], }, diff --git a/selfdrive/car/toyota/carcontroller.py b/selfdrive/car/toyota/carcontroller.py index 2d17ee20f821df..daf91a49d38262 100644 --- a/selfdrive/car/toyota/carcontroller.py +++ b/selfdrive/car/toyota/carcontroller.py @@ -37,7 +37,7 @@ def __init__(self, dbc_name, CP, VM): self.packer = CANPacker(dbc_name) - def update(self, enabled, CS, frame, actuators, pcm_cancel_cmd, hud_alert, + def update(self, enabled, active, CS, frame, actuators, pcm_cancel_cmd, hud_alert, left_line, right_line, lead, left_lane_depart, right_lane_depart): # *** compute control surfaces *** @@ -53,7 +53,7 @@ def update(self, enabled, CS, frame, actuators, pcm_cancel_cmd, hud_alert, elif CS.out.vEgo > MIN_ACC_SPEED + PEDAL_HYST_GAP: self.use_interceptor = False - if self.use_interceptor and enabled: + if self.use_interceptor and active: # only send negative accel when using interceptor. gas handles acceleration # +0.18 m/s^2 offset to reduce ABS pump usage when OP is engaged MAX_INTERCEPTOR_GAS = interp(CS.out.vEgo, [0.0, MIN_ACC_SPEED], [0.2, 0.5]) diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index 643876af118a93..a1221ae8a4184e 100755 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -1,7 +1,8 @@ #!/usr/bin/env python3 from cereal import car from selfdrive.config import Conversions as CV -from selfdrive.car.toyota.values import Ecu, CAR, TSS2_CAR, NO_DSU_CAR, MIN_ACC_SPEED, PEDAL_HYST_GAP, CarControllerParams +from selfdrive.car.toyota.tunes import LatTunes, LongTunes, set_long_tune, set_lat_tune +from selfdrive.car.toyota.values import Ecu, CAR, TSS2_CAR, NO_DSU_CAR, MIN_ACC_SPEED, CarControllerParams from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint, get_safety_config from selfdrive.car.interfaces import CarInterfaceBase @@ -23,267 +24,208 @@ def get_params(candidate, fingerprint=gen_empty_fingerprint(), car_fw=[]): # py ret.steerActuatorDelay = 0.12 # Default delay, Prius has larger delay ret.steerLimitTimer = 0.4 - ret.stoppingControl = False # Toyota starts braking more when it thinks you want to stop + ret.stoppingControl = False # Toyota starts braking more when it thinks you want to stop - if candidate not in [CAR.PRIUS, CAR.RAV4, CAR.RAV4H]: # These cars use LQR/INDI - ret.lateralTuning.init('pid') - ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0.], [0.]] + # Most cars use this default safety param + ret.safetyConfigs[0].safetyParam = 73 if candidate == CAR.PRIUS: - stop_and_go = True ret.safetyConfigs[0].safetyParam = 66 # see conversion factor for STEER_TORQUE_EPS in dbc file + stop_and_go = True ret.wheelbase = 2.70 ret.steerRatio = 15.74 # unknown end-to-end spec tire_stiffness_factor = 0.6371 # hand-tune ret.mass = 3045. * CV.LB_TO_KG + STD_CARGO_KG - ret.lateralTuning.init('indi') - ret.lateralTuning.indi.innerLoopGainBP = [0.] - ret.lateralTuning.indi.innerLoopGainV = [4.0] - ret.lateralTuning.indi.outerLoopGainBP = [0.] - ret.lateralTuning.indi.outerLoopGainV = [3.0] - ret.lateralTuning.indi.timeConstantBP = [0.] - ret.lateralTuning.indi.timeConstantV = [1.0] - ret.lateralTuning.indi.actuatorEffectivenessBP = [0.] - ret.lateralTuning.indi.actuatorEffectivenessV = [1.0] + set_lat_tune(ret.lateralTuning, LatTunes.INDI_PRIUS) ret.steerActuatorDelay = 0.3 elif candidate in [CAR.RAV4, CAR.RAV4H]: stop_and_go = True if (candidate in CAR.RAV4H) else False - ret.safetyConfigs[0].safetyParam = 73 ret.wheelbase = 2.65 ret.steerRatio = 16.88 # 14.5 is spec end-to-end tire_stiffness_factor = 0.5533 ret.mass = 3650. * CV.LB_TO_KG + STD_CARGO_KG # mean between normal and hybrid - ret.lateralTuning.init('lqr') - - ret.lateralTuning.lqr.scale = 1500.0 - ret.lateralTuning.lqr.ki = 0.05 - - ret.lateralTuning.lqr.a = [0., 1., -0.22619643, 1.21822268] - ret.lateralTuning.lqr.b = [-1.92006585e-04, 3.95603032e-05] - ret.lateralTuning.lqr.c = [1., 0.] - ret.lateralTuning.lqr.k = [-110.73572306, 451.22718255] - ret.lateralTuning.lqr.l = [0.3233671, 0.3185757] - ret.lateralTuning.lqr.dcGain = 0.002237852961363602 + set_lat_tune(ret.lateralTuning, LatTunes.LQR_RAV4) elif candidate == CAR.COROLLA: - stop_and_go = False ret.safetyConfigs[0].safetyParam = 88 + stop_and_go = False ret.wheelbase = 2.70 ret.steerRatio = 18.27 tire_stiffness_factor = 0.444 # not optimized yet ret.mass = 2860. * CV.LB_TO_KG + STD_CARGO_KG # mean between normal and hybrid - ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.05]] - ret.lateralTuning.pid.kf = 0.00003 # full torque for 20 deg at 80mph means 0.00007818594 + set_lat_tune(ret.lateralTuning, LatTunes.PID_A) elif candidate == CAR.LEXUS_RX: stop_and_go = True - ret.safetyConfigs[0].safetyParam = 73 ret.wheelbase = 2.79 ret.steerRatio = 14.8 tire_stiffness_factor = 0.5533 ret.mass = 4387. * CV.LB_TO_KG + STD_CARGO_KG - ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.05]] - ret.lateralTuning.pid.kf = 0.00006 + set_lat_tune(ret.lateralTuning, LatTunes.PID_B) + elif candidate == CAR.LEXUS_RXH: stop_and_go = True - ret.safetyConfigs[0].safetyParam = 73 ret.wheelbase = 2.79 ret.steerRatio = 16. # 14.8 is spec end-to-end tire_stiffness_factor = 0.444 # not optimized yet ret.mass = 4481. * CV.LB_TO_KG + STD_CARGO_KG # mean between min and max - ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.1]] - ret.lateralTuning.pid.kf = 0.00006 # full torque for 10 deg at 80mph means 0.00007818594 + set_lat_tune(ret.lateralTuning, LatTunes.PID_C) elif candidate == CAR.LEXUS_RX_TSS2: stop_and_go = True - ret.safetyConfigs[0].safetyParam = 73 ret.wheelbase = 2.79 ret.steerRatio = 14.8 tire_stiffness_factor = 0.5533 # not optimized yet ret.mass = 4387. * CV.LB_TO_KG + STD_CARGO_KG - ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.1]] - ret.lateralTuning.pid.kf = 0.00007818594 + set_lat_tune(ret.lateralTuning, LatTunes.PID_D) elif candidate == CAR.LEXUS_RXH_TSS2: stop_and_go = True - ret.safetyConfigs[0].safetyParam = 73 ret.wheelbase = 2.79 ret.steerRatio = 16.0 # 14.8 is spec end-to-end tire_stiffness_factor = 0.444 # not optimized yet ret.mass = 4481.0 * CV.LB_TO_KG + STD_CARGO_KG # mean between min and max - ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.15]] - ret.lateralTuning.pid.kf = 0.00007818594 + set_lat_tune(ret.lateralTuning, LatTunes.PID_E) elif candidate in [CAR.CHR, CAR.CHRH]: stop_and_go = True - ret.safetyConfigs[0].safetyParam = 73 ret.wheelbase = 2.63906 ret.steerRatio = 13.6 tire_stiffness_factor = 0.7933 ret.mass = 3300. * CV.LB_TO_KG + STD_CARGO_KG - ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.723], [0.0428]] - ret.lateralTuning.pid.kf = 0.00006 + set_lat_tune(ret.lateralTuning, LatTunes.PID_F) elif candidate in [CAR.CAMRY, CAR.CAMRYH, CAR.CAMRY_TSS2, CAR.CAMRYH_TSS2]: stop_and_go = True - ret.safetyConfigs[0].safetyParam = 73 ret.wheelbase = 2.82448 ret.steerRatio = 13.7 tire_stiffness_factor = 0.7933 ret.mass = 3400. * CV.LB_TO_KG + STD_CARGO_KG # mean between normal and hybrid - ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.1]] - ret.lateralTuning.pid.kf = 0.00006 + set_lat_tune(ret.lateralTuning, LatTunes.PID_C) elif candidate in [CAR.HIGHLANDER_TSS2, CAR.HIGHLANDERH_TSS2]: stop_and_go = True - ret.safetyConfigs[0].safetyParam = 73 ret.wheelbase = 2.84988 # 112.2 in = 2.84988 m ret.steerRatio = 16.0 tire_stiffness_factor = 0.8 ret.mass = 4700. * CV.LB_TO_KG + STD_CARGO_KG # 4260 + 4-5 people - ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.18], [0.015]] # community tuning - ret.lateralTuning.pid.kf = 0.00012 # community tuning + set_lat_tune(ret.lateralTuning, LatTunes.PID_G) elif candidate in [CAR.HIGHLANDER, CAR.HIGHLANDERH]: stop_and_go = True - ret.safetyConfigs[0].safetyParam = 73 ret.wheelbase = 2.78 ret.steerRatio = 16.0 tire_stiffness_factor = 0.8 ret.mass = 4607. * CV.LB_TO_KG + STD_CARGO_KG # mean between normal and hybrid limited - ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.18], [0.015]] # community tuning - ret.lateralTuning.pid.kf = 0.00012 # community tuning + set_lat_tune(ret.lateralTuning, LatTunes.PID_G) elif candidate in [CAR.AVALON, CAR.AVALON_2019, CAR.AVALONH_2019]: stop_and_go = False - ret.safetyConfigs[0].safetyParam = 73 ret.wheelbase = 2.82 ret.steerRatio = 14.8 # Found at https://pressroom.toyota.com/releases/2016+avalon+product+specs.download tire_stiffness_factor = 0.7983 ret.mass = 3505. * CV.LB_TO_KG + STD_CARGO_KG # mean between normal and hybrid - ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.17], [0.03]] - ret.lateralTuning.pid.kf = 0.00006 + set_lat_tune(ret.lateralTuning, LatTunes.PID_H) elif candidate in [CAR.RAV4_TSS2, CAR.RAV4H_TSS2]: stop_and_go = True - ret.safetyConfigs[0].safetyParam = 73 ret.wheelbase = 2.68986 ret.steerRatio = 14.3 tire_stiffness_factor = 0.7933 - ret.mass = 3585. * CV.LB_TO_KG + STD_CARGO_KG # Average between ICE and Hybrid - ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.1]] - ret.lateralTuning.pid.kf = 0.00007818594 + ret.mass = 3585. * CV.LB_TO_KG + STD_CARGO_KG # Average between ICE and Hybrid + set_lat_tune(ret.lateralTuning, LatTunes.PID_D) # 2019+ Rav4 TSS2 uses two different steering racks and specific tuning seems to be necessary. # See https://github.com/commaai/openpilot/pull/21429#issuecomment-873652891 for fw in car_fw: if fw.ecu == "eps" and (fw.fwVersion.startswith(b'\x02') or fw.fwVersion in [b'8965B42181\x00\x00\x00\x00\x00\x00']): - ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.15], [0.05]] - ret.lateralTuning.pid.kf = 0.00004 + set_lat_tune(ret.lateralTuning, LatTunes.PID_I) break elif candidate in [CAR.COROLLA_TSS2, CAR.COROLLAH_TSS2]: stop_and_go = True - ret.safetyConfigs[0].safetyParam = 73 ret.wheelbase = 2.67 # Average between 2.70 for sedan and 2.64 for hatchback ret.steerRatio = 13.9 tire_stiffness_factor = 0.444 # not optimized yet ret.mass = 3060. * CV.LB_TO_KG + STD_CARGO_KG - ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.1]] - ret.lateralTuning.pid.kf = 0.00007818594 + set_lat_tune(ret.lateralTuning, LatTunes.PID_D) elif candidate in [CAR.LEXUS_ES_TSS2, CAR.LEXUS_ESH_TSS2]: stop_and_go = True - ret.safetyConfigs[0].safetyParam = 73 ret.wheelbase = 2.8702 ret.steerRatio = 16.0 # not optimized tire_stiffness_factor = 0.444 # not optimized yet ret.mass = 3704. * CV.LB_TO_KG + STD_CARGO_KG - ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.1]] - ret.lateralTuning.pid.kf = 0.00007818594 + set_lat_tune(ret.lateralTuning, LatTunes.PID_D) elif candidate == CAR.LEXUS_ESH: stop_and_go = True - ret.safetyConfigs[0].safetyParam = 73 ret.wheelbase = 2.8190 ret.steerRatio = 16.06 tire_stiffness_factor = 0.444 # not optimized yet ret.mass = 3682. * CV.LB_TO_KG + STD_CARGO_KG - ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.1]] - ret.lateralTuning.pid.kf = 0.00007818594 + set_lat_tune(ret.lateralTuning, LatTunes.PID_D) elif candidate == CAR.SIENNA: stop_and_go = True - ret.safetyConfigs[0].safetyParam = 73 ret.wheelbase = 3.03 ret.steerRatio = 15.5 tire_stiffness_factor = 0.444 ret.mass = 4590. * CV.LB_TO_KG + STD_CARGO_KG - ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.19], [0.02]] - ret.lateralTuning.pid.kf = 0.00007818594 + set_lat_tune(ret.lateralTuning, LatTunes.PID_J) elif candidate == CAR.LEXUS_IS: - stop_and_go = False ret.safetyConfigs[0].safetyParam = 77 + stop_and_go = False ret.wheelbase = 2.79908 ret.steerRatio = 13.3 tire_stiffness_factor = 0.444 ret.mass = 3736.8 * CV.LB_TO_KG + STD_CARGO_KG - ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.3], [0.05]] - ret.lateralTuning.pid.kf = 0.00006 + set_lat_tune(ret.lateralTuning, LatTunes.PID_L) elif candidate == CAR.LEXUS_CTH: - stop_and_go = True ret.safetyConfigs[0].safetyParam = 100 + stop_and_go = True ret.wheelbase = 2.60 ret.steerRatio = 18.6 tire_stiffness_factor = 0.517 ret.mass = 3108 * CV.LB_TO_KG + STD_CARGO_KG # mean between min and max - ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.3], [0.05]] - ret.lateralTuning.pid.kf = 0.00007 + set_lat_tune(ret.lateralTuning, LatTunes.PID_M) elif candidate in [CAR.LEXUS_NXH, CAR.LEXUS_NX, CAR.LEXUS_NX_TSS2]: stop_and_go = True - ret.safetyConfigs[0].safetyParam = 73 ret.wheelbase = 2.66 ret.steerRatio = 14.7 tire_stiffness_factor = 0.444 # not optimized yet ret.mass = 4070 * CV.LB_TO_KG + STD_CARGO_KG - ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.1]] - ret.lateralTuning.pid.kf = 0.00006 + set_lat_tune(ret.lateralTuning, LatTunes.PID_C) elif candidate == CAR.PRIUS_TSS2: stop_and_go = True - ret.safetyConfigs[0].safetyParam = 73 ret.wheelbase = 2.70002 # from toyota online sepc. ret.steerRatio = 13.4 # True steerRation from older prius tire_stiffness_factor = 0.6371 # hand-tune ret.mass = 3115. * CV.LB_TO_KG + STD_CARGO_KG - ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.35], [0.15]] - ret.lateralTuning.pid.kf = 0.00007818594 + set_lat_tune(ret.lateralTuning, LatTunes.PID_N) elif candidate == CAR.MIRAI: stop_and_go = True - ret.safetyConfigs[0].safetyParam = 73 ret.wheelbase = 2.91 ret.steerRatio = 14.8 tire_stiffness_factor = 0.8 ret.mass = 4300. * CV.LB_TO_KG + STD_CARGO_KG - ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.1]] - ret.lateralTuning.pid.kf = 0.00006 + set_lat_tune(ret.lateralTuning, LatTunes.PID_C) elif candidate == CAR.ALPHARD_TSS2: stop_and_go = True - ret.safetyConfigs[0].safetyParam = 73 ret.wheelbase = 3.00 ret.steerRatio = 14.2 tire_stiffness_factor = 0.444 - ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.19], [0.02]] ret.mass = 4305. * CV.LB_TO_KG + STD_CARGO_KG - ret.lateralTuning.pid.kf = 0.00007818594 + set_lat_tune(ret.lateralTuning, LatTunes.PID_J) ret.steerRateCost = 1. ret.centerToFront = ret.wheelbase * 0.44 @@ -316,28 +258,13 @@ def get_params(candidate, fingerprint=gen_empty_fingerprint(), car_fw=[]): # py ret.communityFeature = ret.enableGasInterceptor or ret.enableDsu or smartDsu if ret.enableGasInterceptor: - ret.longitudinalTuning.kpBP = [0., 5., MIN_ACC_SPEED, MIN_ACC_SPEED + PEDAL_HYST_GAP, 35.] - ret.longitudinalTuning.kpV = [1.2, 0.8, 0.765, 2.255, 1.5] - ret.longitudinalTuning.kiBP = [0., MIN_ACC_SPEED, MIN_ACC_SPEED + PEDAL_HYST_GAP, 35.] - ret.longitudinalTuning.kiV = [0.18, 0.165, 0.489, 0.36] + set_long_tune(ret.longitudinalTuning, LongTunes.PEDAL) elif candidate in [CAR.COROLLA_TSS2, CAR.COROLLAH_TSS2, CAR.RAV4_TSS2, CAR.RAV4H_TSS2, CAR.LEXUS_NX_TSS2]: - # Improved longitudinal tune - ret.longitudinalTuning.deadzoneBP = [0., 8.05] - ret.longitudinalTuning.deadzoneV = [.0, .14] - ret.longitudinalTuning.kpBP = [0., 5., 20.] - ret.longitudinalTuning.kpV = [1.3, 1.0, 0.7] - ret.longitudinalTuning.kiBP = [0., 5., 12., 20., 27.] - ret.longitudinalTuning.kiV = [.35, .23, .20, .17, .1] + set_long_tune(ret.longitudinalTuning, LongTunes.TSS2) ret.stoppingDecelRate = 0.3 # reach stopping target smoothly ret.startingAccelRate = 6.0 # release brakes fast else: - # Default longitudinal tune - ret.longitudinalTuning.deadzoneBP = [0., 9.] - ret.longitudinalTuning.deadzoneV = [0., .15] - ret.longitudinalTuning.kpBP = [0., 5., 35.] - ret.longitudinalTuning.kiBP = [0., 35.] - ret.longitudinalTuning.kpV = [3.6, 2.4, 1.5] - ret.longitudinalTuning.kiV = [0.54, 0.36] + set_long_tune(ret.longitudinalTuning, LongTunes.TSS) return ret @@ -375,7 +302,7 @@ def update(self, c, can_strings): # to be called @ 100hz def apply(self, c): - can_sends = self.CC.update(c.enabled, self.CS, self.frame, + can_sends = self.CC.update(c.enabled, c.active, self.CS, self.frame, c.actuators, c.cruiseControl.cancel, c.hudControl.visualAlert, c.hudControl.leftLaneVisible, c.hudControl.rightLaneVisible, c.hudControl.leadVisible, diff --git a/selfdrive/car/toyota/tunes.py b/selfdrive/car/toyota/tunes.py new file mode 100644 index 00000000000000..3f210d48a7791b --- /dev/null +++ b/selfdrive/car/toyota/tunes.py @@ -0,0 +1,142 @@ +#!/usr/bin/env python3 +from enum import Enum +from selfdrive.car.toyota.values import MIN_ACC_SPEED, PEDAL_HYST_GAP + + +class LongTunes(Enum): + PEDAL = 0 + TSS2 = 1 + TSS = 2 + +class LatTunes(Enum): + INDI_PRIUS = 0 + LQR_RAV4 = 1 + PID_A = 2 + PID_B = 3 + PID_C = 4 + PID_D = 5 + PID_E = 6 + PID_F = 7 + PID_G = 8 + PID_I = 9 + PID_H = 10 + PID_J = 11 + PID_K = 12 + PID_L = 13 + PID_M = 14 + PID_N = 15 + + +###### LONG ###### +def set_long_tune(tune, name): + if name == LongTunes.PEDAL: + tune.deadzoneBP = [0.] + tune.deadzoneV = [0.] + tune.kpBP = [0., 5., MIN_ACC_SPEED, MIN_ACC_SPEED + PEDAL_HYST_GAP, 35.] + tune.kpV = [1.2, 0.8, 0.765, 2.255, 1.5] + tune.kiBP = [0., MIN_ACC_SPEED, MIN_ACC_SPEED + PEDAL_HYST_GAP, 35.] + tune.kiV = [0.18, 0.165, 0.489, 0.36] + # Improved longitudinal tune + elif name == LongTunes.TSS2: + tune.deadzoneBP = [0., 8.05] + tune.deadzoneV = [.0, .14] + tune.kpBP = [0., 5., 20.] + tune.kpV = [1.3, 1.0, 0.7] + tune.kiBP = [0., 5., 12., 20., 27.] + tune.kiV = [.35, .23, .20, .17, .1] + # Default longitudinal tune + elif name == LongTunes.TSS: + tune.deadzoneBP = [0., 9.] + tune.deadzoneV = [0., .15] + tune.kpBP = [0., 5., 35.] + tune.kiBP = [0., 35.] + tune.kpV = [3.6, 2.4, 1.5] + tune.kiV = [0.54, 0.36] + else: + raise NotImplementedError('This longitudinal tune does not exist') + + +###### LAT ###### +def set_lat_tune(tune, name): + if name == LatTunes.INDI_PRIUS: + tune.init('indi') + tune.indi.innerLoopGainBP = [0.] + tune.indi.innerLoopGainV = [4.0] + tune.indi.outerLoopGainBP = [0.] + tune.indi.outerLoopGainV = [3.0] + tune.indi.timeConstantBP = [0.] + tune.indi.timeConstantV = [1.0] + tune.indi.actuatorEffectivenessBP = [0.] + tune.indi.actuatorEffectivenessV = [1.0] + + elif name == LatTunes.LQR_RAV4: + tune.init('lqr') + tune.lqr.scale = 1500.0 + tune.lqr.ki = 0.05 + tune.lqr.a = [0., 1., -0.22619643, 1.21822268] + tune.lqr.b = [-1.92006585e-04, 3.95603032e-05] + tune.lqr.c = [1., 0.] + tune.lqr.k = [-110.73572306, 451.22718255] + tune.lqr.l = [0.3233671, 0.3185757] + tune.lqr.dcGain = 0.002237852961363602 + + elif 'PID' in str(name): + tune.init('pid') + tune.pid.kiBP = [0.0] + tune.pid.kpBP = [0.0] + if name == LatTunes.PID_A: + tune.pid.kpV = [0.2] + tune.pid.kiV = [0.05] + tune.pid.kf = 0.00003 + elif name == LatTunes.PID_B: + tune.pid.kpV = [0.6] + tune.pid.kiV = [0.05] + tune.pid.kf = 0.00006 + elif name == LatTunes.PID_C: + tune.pid.kpV = [0.6] + tune.pid.kiV = [0.1] + tune.pid.kf = 0.00006 + elif name == LatTunes.PID_D: + tune.pid.kpV = [0.6] + tune.pid.kiV = [0.1] + tune.pid.kf = 0.00007818594 + elif name == LatTunes.PID_E: + tune.pid.kpV = [0.6] + tune.pid.kiV = [0.15] + tune.pid.kf = 0.00007818594 + elif name == LatTunes.PID_F: + tune.pid.kpV = [0.723] + tune.pid.kiV = [0.0428] + tune.pid.kf = 0.00006 + elif name == LatTunes.PID_G: + tune.pid.kpV = [0.18] + tune.pid.kiV = [0.015] + tune.pid.kf = 0.00012 + elif name == LatTunes.PID_H: + tune.pid.kpV = [0.17] + tune.pid.kiV = [0.03] + tune.pid.kf = 0.00006 + elif name == LatTunes.PID_I: + tune.pid.kpV = [0.15] + tune.pid.kiV = [0.05] + tune.pid.kf = 0.00004 + elif name == LatTunes.PID_J: + tune.pid.kpV = [0.19] + tune.pid.kiV = [0.02] + tune.pid.kf = 0.00007818594 + elif name == LatTunes.PID_L: + tune.pid.kpV = [0.3] + tune.pid.kiV = [0.05] + tune.pid.kf = 0.00006 + elif name == LatTunes.PID_M: + tune.pid.kpV = [0.3] + tune.pid.kiV = [0.05] + tune.pid.kf = 0.00007 + elif name == LatTunes.PID_N: + tune.pid.kpV = [0.35] + tune.pid.kiV = [0.15] + tune.pid.kf = 0.00007818594 + else: + raise NotImplementedError('This PID tune does not exist') + else: + raise NotImplementedError('This lateral tune does not exist') diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index 0cd75d8723b205..73198d925fc8ae 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -618,6 +618,7 @@ class CAR: b'\x028966312Q4000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', b'\x038966312L7000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF1205001\x00\x00\x00\x00', b'\x038966312N1000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF1203001\x00\x00\x00\x00', + b'\x038966312T3000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF1205001\x00\x00\x00\x00', ], (Ecu.eps, 0x7a1, None): [ b'8965B12361\x00\x00\x00\x00\x00\x00', @@ -782,7 +783,8 @@ class CAR: b'\x01F152648C6300\x00\x00\x00\x00', ], (Ecu.engine, 0x700, None): [ - b'\x01896630EA1000\000\000\000\000', + b'\x01896630EA1000\x00\x00\x00\x00', + b'\x01896630EE4000\x00\x00\x00\x00', b'\x01896630EA1000\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00', b'\x02896630E66000\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00', b'\x02896630EB3000\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00', diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 01677037fb7149..ed0b1ac76d407b 100755 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -160,6 +160,7 @@ class CAR: b'\xf1\x8704L906056CR\xf1\x895813', b'\xf1\x8704L906056HE\xf1\x893758', b'\xf1\x870EA906016A \xf1\x898343', + b'\xf1\x870EA906016E \xf1\x894219', b'\xf1\x870EA906016F \xf1\x895002', b'\xf1\x870EA906016S \xf1\x897207', b'\xf1\x875G0906259 \xf1\x890007', @@ -227,6 +228,7 @@ class CAR: b'\xf1\x875Q0959655S \xf1\x890870\xf1\x82\02324230011211200061104171724102491132111', b'\xf1\x875Q0959655S \xf1\x890870\xf1\x82\02324230011211200621143171724112491132111', b'\xf1\x875Q0959655S \xf1\x890870\xf1\x82\x1315120011211200061104171717101791132111', + b'\xf1\x875Q0959655S \xf1\x890870\xf1\x82\x1324230011211200631143171724122491132111', b'\xf1\x875Q0959655T \xf1\x890825\xf1\x82\023271200111312--071104171837103791132111', b'\xf1\x875Q0959655T \xf1\x890830\xf1\x82\x13271100111312--071104171826102691131211', b'\xf1\x875QD959655 \xf1\x890388\xf1\x82\x111413001113120006110417121D101D9112', @@ -254,6 +256,7 @@ class CAR: b'\xf1\x875Q0909144S \xf1\x891063\xf1\x82\00516A00604A1', b'\xf1\x875Q0909144S \xf1\x891063\xf1\x82\00516A07A02A1', b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\00521A00507A1', + b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521A07B04A1', b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\00521A20B03A1', b'\xf1\x875QD909144B \xf1\x891072\xf1\x82\x0521A00507A1', b'\xf1\x875QM909144A \xf1\x891072\xf1\x82\x0521A20B03A1', diff --git a/selfdrive/common/version.h b/selfdrive/common/version.h index 9f00fac4f94111..aa786903c48a22 100644 --- a/selfdrive/common/version.h +++ b/selfdrive/common/version.h @@ -1 +1 @@ -#define COMMA_VERSION "0.8.11" +#define COMMA_VERSION "0.8.12" diff --git a/selfdrive/common/watchdog.cc b/selfdrive/common/watchdog.cc index 33307f720007bd..c937103a5d1880 100644 --- a/selfdrive/common/watchdog.cc +++ b/selfdrive/common/watchdog.cc @@ -1,19 +1,12 @@ #include "selfdrive/common/watchdog.h" - -#include - -#include -#include - #include "selfdrive/common/timing.h" #include "selfdrive/common/util.h" const std::string watchdog_fn_prefix = "/dev/shm/wd_"; // + bool watchdog_kick() { - std::string fn = watchdog_fn_prefix + std::to_string(getpid()); - std::string cur_t = std::to_string(nanos_since_boot()); + static std::string fn = watchdog_fn_prefix + std::to_string(getpid()); - int r = util::write_file(fn.c_str(), cur_t.data(), cur_t.length(), O_WRONLY | O_CREAT); - return r == 0; + uint64_t ts = nanos_since_boot(); + return util::write_file(fn.c_str(), &ts, sizeof(ts), O_WRONLY | O_CREAT) > 0; } diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 07b68c941ae22e..bd184f200faf78 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -404,7 +404,7 @@ def state_transition(self, CS): elif self.CP.pcmCruise and CS.cruiseState.enabled: self.v_cruise_kph = CS.cruiseState.speed * CV.MS_TO_KPH - # decrease the soft disable timer at every step, as it's reset on + # decrement the soft disable timer at every step, as it's reset on # entrance in SOFT_DISABLING state self.soft_disable_timer = max(0, self.soft_disable_timer - 1) @@ -426,7 +426,7 @@ def state_transition(self, CS): if self.state == State.enabled: if self.events.any(ET.SOFT_DISABLE): self.state = State.softDisabling - self.soft_disable_timer = 300 # 3s + self.soft_disable_timer = int(3 / DT_CTRL) self.current_alert_types.append(ET.SOFT_DISABLE) # SOFT DISABLING diff --git a/selfdrive/controls/lib/events.py b/selfdrive/controls/lib/events.py index 09e9d65c90c34a..bd728159b708d4 100644 --- a/selfdrive/controls/lib/events.py +++ b/selfdrive/controls/lib/events.py @@ -149,7 +149,7 @@ def __init__(self, alert_text_2, audible_alert=AudibleAlert.chimeError, class SoftDisableAlert(Alert): def __init__(self, alert_text_2): super().__init__("TAKE CONTROL IMMEDIATELY", alert_text_2, - AlertStatus.critical, AlertSize.full, + AlertStatus.userPrompt, AlertSize.full, Priority.MID, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeatInfinite, 2.), @@ -171,10 +171,18 @@ def __init__(self, audible_alert: car.CarControl.HUDControl.AudibleAlert): class NormalPermanentAlert(Alert): - def __init__(self, alert_text_1: str, alert_text_2: str = "", duration: float = 0.2): + def __init__(self, alert_text_1: str, alert_text_2: str = "", duration: float = 0.2, priority: Priority = Priority.LOWER, creation_delay: float = 0.): super().__init__(alert_text_1, alert_text_2, AlertStatus.normal, AlertSize.mid if len(alert_text_2) else AlertSize.small, - Priority.LOWER, VisualAlert.none, AudibleAlert.none, duration), + priority, VisualAlert.none, AudibleAlert.none, duration, creation_delay=creation_delay), + + +class StartupAlert(Alert): + def __init__(self, alert_text_1: str, alert_text_2: str = "Always keep hands on wheel and eyes on road", alert_status=AlertStatus.normal): + super().__init__(alert_text_1, alert_text_2, + alert_status, AlertSize.mid, + Priority.LOWER, VisualAlert.none, AudibleAlert.none, 10.), + # ********** helper functions ********** def get_display_speed(speed_ms: float, metric: bool) -> str: @@ -244,88 +252,59 @@ def joystick_alert(CP: car.CarParams, sm: messaging.SubMaster, metric: bool) -> }, EventName.startup: { - ET.PERMANENT: Alert( - "Be ready to take over at any time", - "Always keep hands on wheel and eyes on road", - AlertStatus.normal, AlertSize.mid, - Priority.LOWER, VisualAlert.none, AudibleAlert.none, 10.), + ET.PERMANENT: StartupAlert("Be ready to take over at any time") }, EventName.startupMaster: { - ET.PERMANENT: Alert( - "WARNING: This branch is not tested", - "Always keep hands on wheel and eyes on road", - AlertStatus.userPrompt, AlertSize.mid, - Priority.LOWER, VisualAlert.none, AudibleAlert.none, 10.), + ET.PERMANENT: StartupAlert("WARNING: This branch is not tested", + alert_status=AlertStatus.userPrompt), }, # Car is recognized, but marked as dashcam only EventName.startupNoControl: { - ET.PERMANENT: Alert( - "Dashcam mode", - "Always keep hands on wheel and eyes on road", - AlertStatus.normal, AlertSize.mid, - Priority.LOWER, VisualAlert.none, AudibleAlert.none, 10.), + ET.PERMANENT: StartupAlert("Dashcam mode"), }, # Car is not recognized EventName.startupNoCar: { - ET.PERMANENT: Alert( - "Dashcam mode for unsupported car", - "Always keep hands on wheel and eyes on road", - AlertStatus.normal, AlertSize.mid, - Priority.LOWER, VisualAlert.none, AudibleAlert.none, 10.), + ET.PERMANENT: StartupAlert("Dashcam mode for unsupported car"), }, EventName.startupNoFw: { - ET.PERMANENT: Alert( - "Car Unrecognized", - "Check comma power connections", - AlertStatus.userPrompt, AlertSize.mid, - Priority.LOWER, VisualAlert.none, AudibleAlert.none, 10.), + ET.PERMANENT: StartupAlert("Car Unrecognized", + "Check comma power connections", + alert_status=AlertStatus.userPrompt), }, EventName.dashcamMode: { - ET.PERMANENT: Alert( - "Dashcam Mode", - "", - AlertStatus.normal, AlertSize.small, - Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2), + ET.PERMANENT: NormalPermanentAlert("Dashcam Mode", + priority=Priority.LOWEST), }, EventName.invalidLkasSetting: { - ET.PERMANENT: Alert( - "Stock LKAS is turned on", - "Turn off stock LKAS to engage", - AlertStatus.normal, AlertSize.mid, - Priority.LOWER, VisualAlert.none, AudibleAlert.none, .2), + ET.PERMANENT: NormalPermanentAlert("Stock LKAS is turned on", + "Turn off stock LKAS to engage"), }, EventName.cruiseMismatch: { - ET.PERMANENT: ImmediateDisableAlert("openpilot failed to cancel cruise"), + #ET.PERMANENT: ImmediateDisableAlert("openpilot failed to cancel cruise"), }, # Some features or cars are marked as community features. If openpilot # detects the use of a community feature it switches to dashcam mode # until these features are allowed using a toggle in settings. EventName.communityFeatureDisallowed: { - # LOW priority to overcome Cruise Error - ET.PERMANENT: Alert( - "openpilot Not Available", - "Enable Community Features in Settings to Engage", - AlertStatus.normal, AlertSize.mid, - Priority.LOW, VisualAlert.none, AudibleAlert.none, .2), + ET.PERMANENT: NormalPermanentAlert("openpilot Not Available", + "Enable Community Features in Settings to Engage"), }, # openpilot doesn't recognize the car. This switches openpilot into a # read-only mode. This can be solved by adding your fingerprint. # See https://github.com/commaai/openpilot/wiki/Fingerprinting for more information EventName.carUnrecognized: { - ET.PERMANENT: Alert( - "Dashcam Mode", - "Car Unrecognized", - AlertStatus.normal, AlertSize.mid, - Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2), + ET.PERMANENT: NormalPermanentAlert("Dashcam Mode", + "Car Unrecognized", + priority=Priority.LOWEST), }, EventName.stockAeb: { @@ -374,11 +353,6 @@ def joystick_alert(CP: car.CarParams, sm: messaging.SubMaster, metric: bool) -> EventName.vehicleModelInvalid: { ET.NO_ENTRY: NoEntryAlert("Vehicle Parameter Identification Failed"), ET.SOFT_DISABLE: SoftDisableAlert("Vehicle Parameter Identification Failed"), - ET.WARNING: Alert( - "Vehicle Parameter Identification Failed", - "", - AlertStatus.normal, AlertSize.small, - Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .1), }, EventName.steerTempUnavailableSilent: { @@ -718,18 +692,21 @@ def joystick_alert(CP: car.CarParams, sm: messaging.SubMaster, metric: bool) -> }, EventName.roadCameraError: { - ET.PERMANENT: NormalPermanentAlert("Road Camera Error", "", - duration=10.), + ET.PERMANENT: NormalPermanentAlert("Camera Error", + duration=1., + creation_delay=30.), }, EventName.driverCameraError: { - ET.PERMANENT: NormalPermanentAlert("Driver Camera Error", "", - duration=10.), + ET.PERMANENT: NormalPermanentAlert("Camera Error", + duration=1., + creation_delay=30.), }, EventName.wideRoadCameraError: { - ET.PERMANENT: NormalPermanentAlert("Wide Road Camera Error", "", - duration=10.), + ET.PERMANENT: NormalPermanentAlert("Camera Error", + duration=1., + creation_delay=30.), }, # Sometimes the USB stack on the device can get into a bad state @@ -756,21 +733,13 @@ def joystick_alert(CP: car.CarParams, sm: messaging.SubMaster, metric: bool) -> EventName.steerUnavailable: { ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("LKAS Fault: Restart the Car"), - ET.PERMANENT: Alert( - "LKAS Fault: Restart the car to engage", - "", - AlertStatus.normal, AlertSize.small, - Priority.LOWER, VisualAlert.none, AudibleAlert.none, .2), + ET.PERMANENT: NormalPermanentAlert("LKAS Fault: Restart the car to engage"), ET.NO_ENTRY: NoEntryAlert("LKAS Fault: Restart the Car"), }, EventName.brakeUnavailable: { ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Cruise Fault: Restart the Car"), - ET.PERMANENT: Alert( - "Cruise Fault: Restart the car to engage", - "", - AlertStatus.normal, AlertSize.small, - Priority.LOWER, VisualAlert.none, AudibleAlert.none, .2), + ET.PERMANENT: NormalPermanentAlert("Cruise Fault: Restart the car to engage"), ET.NO_ENTRY: NoEntryAlert("Cruise Fault: Restart the Car"), }, @@ -832,19 +801,11 @@ def joystick_alert(CP: car.CarParams, sm: messaging.SubMaster, metric: bool) -> "Model uncertain at this speed", AlertStatus.userPrompt, AlertSize.mid, Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.chimeWarning2RepeatInfinite, 4.), - ET.NO_ENTRY: Alert( - "Speed Too High", - "Slow down to engage", - AlertStatus.normal, AlertSize.mid, - Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, 3.), + ET.NO_ENTRY: NoEntryAlert("Slow down to engage"), }, EventName.lowSpeedLockout: { - ET.PERMANENT: Alert( - "Cruise Fault: Restart the car to engage", - "", - AlertStatus.normal, AlertSize.small, - Priority.LOWER, VisualAlert.none, AudibleAlert.none, .2), + ET.PERMANENT: NormalPermanentAlert("Cruise Fault: Restart the car to engage"), ET.NO_ENTRY: NoEntryAlert("Cruise Fault: Restart the Car"), }, diff --git a/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py b/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py index df6d8e0fb64316..577651f8d47262 100644 --- a/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py +++ b/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py @@ -24,15 +24,17 @@ X_DIM = 3 U_DIM = 1 -COST_E_DIM = 4 +PARAM_DIM= 4 +COST_E_DIM = 5 COST_DIM = COST_E_DIM + 1 CONSTR_DIM = 4 X_EGO_OBSTACLE_COST = 3. -V_EGO_COST = 0. X_EGO_COST = 0. +V_EGO_COST = 0. A_EGO_COST = 0. -J_EGO_COST = 10. +J_EGO_COST = 5.0 +A_CHANGE_COST = .5 DANGER_ZONE_COST = 100. CRASH_DISTANCE = .5 LIMIT_COST = 1e6 @@ -85,7 +87,8 @@ def gen_long_model(): x_obstacle = SX.sym('x_obstacle') a_min = SX.sym('a_min') a_max = SX.sym('a_max') - model.p = vertcat(a_min, a_max, x_obstacle) + prev_a = SX.sym('prev_a') + model.p = vertcat(a_min, a_max, x_obstacle, prev_a) # dynamics model f_expl = vertcat(v_ego, a_ego, j_ego) @@ -118,6 +121,7 @@ def gen_long_mpc_solver(): a_min, a_max = ocp.model.p[0], ocp.model.p[1] x_obstacle = ocp.model.p[2] + prev_a = ocp.model.p[3] ocp.cost.yref = np.zeros((COST_DIM, )) ocp.cost.yref_e = np.zeros((COST_E_DIM, )) @@ -132,6 +136,7 @@ def gen_long_mpc_solver(): x_ego, v_ego, a_ego, + 20*(a_ego - prev_a), j_ego] ocp.model.cost_y_expr = vertcat(*costs) ocp.model.cost_y_expr_e = vertcat(*costs[:-1]) @@ -148,7 +153,7 @@ def gen_long_mpc_solver(): x0 = np.zeros(X_DIM) ocp.constraints.x0 = x0 - ocp.parameter_values = np.array([-1.2, 1.2, 0.0]) + ocp.parameter_values = np.array([-1.2, 1.2, 0.0, 0.0]) # We put all constraint cost weights to 0 and only set them at runtime cost_weights = np.zeros(CONSTR_DIM) @@ -198,6 +203,7 @@ def reset(self): self.solver = AcadosOcpSolverFast('long', N, EXPORT_DIR) self.v_solution = [0.0 for i in range(N+1)] self.a_solution = [0.0 for i in range(N+1)] + self.prev_a = self.a_solution self.j_solution = [0.0 for i in range(N)] self.yref = np.zeros((N+1, COST_DIM)) for i in range(N): @@ -205,7 +211,7 @@ def reset(self): self.solver.cost_set(N, "yref", self.yref[N][:COST_E_DIM]) self.x_sol = np.zeros((N+1, X_DIM)) self.u_sol = np.zeros((N,1)) - self.params = np.zeros((N+1,3)) + self.params = np.zeros((N+1, PARAM_DIM)) for i in range(N+1): self.solver.set(i, 'x', np.zeros(X_DIM)) self.last_cloudlog_t = 0 @@ -222,8 +228,9 @@ def set_weights(self): self.set_weights_for_lead_policy() def set_weights_for_lead_policy(self): - W = np.asfortranarray(np.diag([X_EGO_OBSTACLE_COST, X_EGO_COST, V_EGO_COST, A_EGO_COST, J_EGO_COST])) + W = np.asfortranarray(np.diag([X_EGO_OBSTACLE_COST, X_EGO_COST, V_EGO_COST, A_EGO_COST, A_CHANGE_COST, J_EGO_COST])) for i in range(N): + W[4,4] = A_CHANGE_COST * np.interp(T_IDXS[i], [0.0, 1.0, 2.0], [1.0, 1.0, 0.0]) self.solver.cost_set(i, 'W', W) # Setting the slice without the copy make the array not contiguous, # causing issues with the C interface. @@ -235,7 +242,7 @@ def set_weights_for_lead_policy(self): self.solver.cost_set(i, 'Zl', Zl) def set_weights_for_xva_policy(self): - W = np.asfortranarray(np.diag([0., 10., 1., 10., 1.])) + W = np.asfortranarray(np.diag([0., 10., 1., 10., 0.0, 1.])) for i in range(N): self.solver.cost_set(i, 'W', W) # Setting the slice without the copy make the array not contiguous, @@ -320,6 +327,7 @@ def update(self, carstate, radarstate, v_cruise): x_obstacles = np.column_stack([lead_0_obstacle, lead_1_obstacle, cruise_obstacle]) self.source = SOURCES[np.argmin(x_obstacles[0])] self.params[:,2] = np.min(x_obstacles, axis=1) + self.params[:,3] = np.copy(self.prev_a) self.run() if (np.any(lead_xv_0[:,0] - self.x_sol[:,0] < CRASH_DISTANCE) and @@ -339,7 +347,8 @@ def update_with_xva(self, x, v, a): self.accel_limit_arr[:,1] = 10. x_obstacle = 1e5*np.ones((N+1)) self.params = np.concatenate([self.accel_limit_arr, - x_obstacle[:,None]], axis=1) + x_obstacle[:,None], + self.prev_a], axis=1) self.run() @@ -358,6 +367,8 @@ def run(self): self.a_solution = self.x_sol[:,2] self.j_solution = self.u_sol[:,0] + self.prev_a = interp(T_IDXS + 0.05, T_IDXS, self.a_solution) + t = sec_since_boot() if self.solution_status != 0: if t > self.last_cloudlog_t + 5.0: diff --git a/selfdrive/controls/tests/test_alerts.py b/selfdrive/controls/tests/test_alerts.py index d32bc2365d9899..a55cb373a133cc 100755 --- a/selfdrive/controls/tests/test_alerts.py +++ b/selfdrive/controls/tests/test_alerts.py @@ -76,11 +76,16 @@ def test_alert_text_length(self): def test_alert_sanity_check(self): for a in ALERTS: if a.alert_size == AlertSize.none: - self.assertEqual(0, len(a.alert_text_1)) - self.assertEqual(0, len(a.alert_text_2)) + self.assertEqual(len(a.alert_text_1), 0) + self.assertEqual(len(a.alert_text_2), 0) + elif a.alert_size == AlertSize.small: + self.assertGreater(len(a.alert_text_1), 0) + self.assertEqual(len(a.alert_text_2), 0) + elif a.alert_size == AlertSize.mid: + self.assertGreater(len(a.alert_text_1), 0) + self.assertGreater(len(a.alert_text_2), 0) else: - if a.alert_size == AlertSize.small: - self.assertEqual(0, len(a.alert_text_2)) + self.assertGreater(len(a.alert_text_1), 0) self.assertGreaterEqual(a.duration, 0.) diff --git a/selfdrive/manager/process.py b/selfdrive/manager/process.py index 8cb3505b8e00c3..d9a1619411a390 100644 --- a/selfdrive/manager/process.py +++ b/selfdrive/manager/process.py @@ -1,6 +1,7 @@ import importlib import os import signal +import struct import time import subprocess from abc import ABC, abstractmethod @@ -88,7 +89,7 @@ def check_watchdog(self, started): try: fn = WATCHDOG_FN + str(self.proc.pid) - self.last_watchdog_time = int(open(fn).read()) + self.last_watchdog_time = struct.unpack('Q', open(fn, "rb").read())[0] except Exception: pass diff --git a/selfdrive/test/longitudinal_maneuvers/test_longitudinal.py b/selfdrive/test/longitudinal_maneuvers/test_longitudinal.py index 4267f3c9e134d7..35b9f32e68e86a 100755 --- a/selfdrive/test/longitudinal_maneuvers/test_longitudinal.py +++ b/selfdrive/test/longitudinal_maneuvers/test_longitudinal.py @@ -62,7 +62,7 @@ speed_lead_values=[20., 20., 0.], prob_lead_values=[0., 1., 1.], cruise_values=[20., 20., 20.], - breakpoints=[2., 2.01, 8.51], + breakpoints=[2., 2.01, 8.8], ), Maneuver( "approach stopped car at 20m/s", diff --git a/selfdrive/test/openpilotci.py b/selfdrive/test/openpilotci.py index 1939677b102822..9cc0e37c4b2b7d 100755 --- a/selfdrive/test/openpilotci.py +++ b/selfdrive/test/openpilotci.py @@ -12,7 +12,7 @@ def get_url(route_name, segment_num, log_type="rlog"): return BASE_URL + "%s/%s/%s.%s" % (route_name.replace("|", "/"), segment_num, log_type, ext) def upload_file(path, name): - from azure.storage.blob import BlockBlobService + from azure.storage.blob import BlockBlobService # pylint: disable=import-error sas_token = None if os.path.isfile(TOKEN_PATH): diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index d58be73f571c5b..5027b0c1798917 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -b3c61dc5f6777497fdd82fb7421a469a43efcbf1 \ No newline at end of file +6540e8c5a765975fd292b1efdef97b2d6391fa9c \ No newline at end of file diff --git a/selfdrive/test/test_onroad.py b/selfdrive/test/test_onroad.py index f051b18b075040..f1aad012eff275 100755 --- a/selfdrive/test/test_onroad.py +++ b/selfdrive/test/test_onroad.py @@ -56,7 +56,7 @@ "./loggerd": 70.0, "selfdrive.controls.controlsd": 28.0, "./camerad": 31.0, - "./_ui": 21.0, + "./_ui": 30.2, "selfdrive.controls.plannerd": 11.7, "./_dmonitoringmodeld": 10.0, "selfdrive.locationd.paramsd": 5.0, @@ -97,7 +97,8 @@ def cputime_total(ct): def check_cpu_usage(first_proc, last_proc): - result = "------------------------------------------------\n" + result = "\n" + result += "------------------------------------------------\n" result += "------------------ CPU Usage -------------------\n" result += "------------------------------------------------\n" @@ -112,10 +113,9 @@ def check_cpu_usage(first_proc, last_proc): cpu_usage = cpu_time / dt * 100. if cpu_usage > max(normal_cpu_usage * 1.15, normal_cpu_usage + 5.0): # cpu usage is high while playing sounds - if proc_name == "./_soundd" and cpu_usage < 65.: - continue - result += f"Warning {proc_name} using more CPU than normal\n" - r = False + if not (proc_name == "./_soundd" and cpu_usage < 65.): + result += f"Warning {proc_name} using more CPU than normal\n" + r = False elif cpu_usage < min(normal_cpu_usage * 0.65, max(normal_cpu_usage - 1.0, 0.0)): result += f"Warning {proc_name} using less CPU than normal\n" r = False @@ -201,7 +201,8 @@ def test_cpu_usage(self): self.assertTrue(cpu_ok) def test_model_execution_timings(self): - result = "------------------------------------------------\n" + result = "\n" + result += "------------------------------------------------\n" result += "----------------- Model Timing -----------------\n" result += "------------------------------------------------\n" # TODO: this went up when plannerd cpu usage increased, why? @@ -212,12 +213,15 @@ def test_model_execution_timings(self): self.assertLess(np.mean(ts), avg_max, f"high avg '{s}' execution time: {np.mean(ts)}") result += f"'{s}' execution time: {min(ts)}\n" result += f"'{s}' avg execution time: {np.mean(ts)}\n" + result += "------------------------------------------------\n" print(result) def test_timings(self): - - print("\n\n") - print("="*25, "service timings", "="*25) + passed = True + result = "\n" + result += "------------------------------------------------\n" + result += "----------------- Service Timings --------------\n" + result += "------------------------------------------------\n" for s, (maxmin, rsd) in TIMINGS.items(): msgs = [m.logMonoTime for m in self.lr if m.which() == s] if not len(msgs): @@ -226,12 +230,22 @@ def test_timings(self): ts = np.diff(msgs) / 1e9 dt = 1 / service_list[s].frequency - np.testing.assert_allclose(np.mean(ts), dt, rtol=0.03, err_msg=f"{s} - failed mean timing check") - np.testing.assert_allclose([np.max(ts), np.min(ts)], dt, rtol=maxmin, err_msg=f"{s} - failed max/min timing check") - self.assertLess(np.std(ts) / dt, rsd, msg=f"{s} - failed RSD timing check") - print(f"{s}: {np.array([np.mean(ts), np.max(ts), np.min(ts)])*1e3}") - print(f" {np.max(np.absolute([np.max(ts)/dt, np.min(ts)/dt]))} {np.std(ts)/dt}") - print("="*67) + try: + np.testing.assert_allclose(np.mean(ts), dt, rtol=0.03, err_msg=f"{s} - failed mean timing check") + np.testing.assert_allclose([np.max(ts), np.min(ts)], dt, rtol=maxmin, err_msg=f"{s} - failed max/min timing check") + except Exception as e: + result += str(e) + "\n" + passed = False + + if np.std(ts) / dt > rsd: + result += f"{s} - failed RSD timing check\n" + passed = False + + result += f"{s.ljust(40)}: {np.array([np.mean(ts), np.max(ts), np.min(ts)])*1e3}\n" + result += f"{''.ljust(40)} {np.max(np.absolute([np.max(ts)/dt, np.min(ts)/dt]))} {np.std(ts)/dt}\n" + result += "="*67 + print(result) + self.assertTrue(passed) @release_only def test_startup(self): diff --git a/selfdrive/test/update_ci_routes.py b/selfdrive/test/update_ci_routes.py index e25172be9d62b3..3e5a0d2cf0db24 100755 --- a/selfdrive/test/update_ci_routes.py +++ b/selfdrive/test/update_ci_routes.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 import sys import subprocess -from azure.storage.blob import BlockBlobService +from azure.storage.blob import BlockBlobService # pylint: disable=import-error from selfdrive.test.test_routes import routes as test_car_models_routes from selfdrive.test.process_replay.test_processes import original_segments as replay_segments diff --git a/selfdrive/thermald/thermald.py b/selfdrive/thermald/thermald.py index 5e678587911d6f..1f4247145544c7 100755 --- a/selfdrive/thermald/thermald.py +++ b/selfdrive/thermald/thermald.py @@ -126,16 +126,23 @@ def handle_fan_uno(controller, max_cpu_temp, fan_speed, ignition): return new_speed +last_ignition = False def handle_fan_tici(controller, max_cpu_temp, fan_speed, ignition): + global last_ignition + controller.neg_limit = -(80 if ignition else 30) controller.pos_limit = -(30 if ignition else 0) + if ignition != last_ignition: + controller.reset() + fan_pwr_out = -int(controller.update( setpoint=(75 if ignition else (OFFROAD_DANGER_TEMP - 2)), measurement=max_cpu_temp, feedforward=interp(max_cpu_temp, [60.0, 100.0], [0, -80]) )) + last_ignition = ignition return fan_pwr_out diff --git a/selfdrive/ui/navd/route_engine.h b/selfdrive/ui/navd/route_engine.h index 5b8de698a96bb3..9a6c99041732aa 100644 --- a/selfdrive/ui/navd/route_engine.h +++ b/selfdrive/ui/navd/route_engine.h @@ -1,5 +1,7 @@ #pragma once +#include + #include #include #include diff --git a/selfdrive/ui/paint.cc b/selfdrive/ui/paint.cc index 1bbbb8379cd4c1..612b924f3220d9 100644 --- a/selfdrive/ui/paint.cc +++ b/selfdrive/ui/paint.cc @@ -64,15 +64,15 @@ static void ui_draw_circle_image(const UIState *s, int center_x, int center_y, i ui_draw_circle_image(s, center_x, center_y, radius, image, nvgRGBA(0, 0, 0, (255 * bg_alpha)), img_alpha); } -static void draw_lead(UIState *s, const cereal::ModelDataV2::LeadDataV3::Reader &lead_data, const vertex_data &vd) { +static void draw_lead(UIState *s, const cereal::RadarState::LeadData::Reader &lead_data, const vertex_data &vd) { // Draw lead car indicator auto [x, y] = vd; float fillAlpha = 0; float speedBuff = 10.; float leadBuff = 40.; - float d_rel = lead_data.getX()[0]; - float v_rel = lead_data.getV()[0]; + float d_rel = lead_data.getDRel(); + float v_rel = lead_data.getVRel(); if (d_rel < leadBuff) { fillAlpha = 255*(1.0-(d_rel/leadBuff)); if (v_rel < 0) { @@ -139,12 +139,12 @@ static void ui_draw_world(UIState *s) { // Draw lead indicators if openpilot is handling longitudinal if (s->scene.longitudinal_control) { - auto lead_one = (*s->sm)["modelV2"].getModelV2().getLeadsV3()[0]; - auto lead_two = (*s->sm)["modelV2"].getModelV2().getLeadsV3()[1]; - if (lead_one.getProb() > .5) { + auto lead_one = (*s->sm)["radarState"].getRadarState().getLeadOne(); + auto lead_two = (*s->sm)["radarState"].getRadarState().getLeadTwo(); + if (lead_one.getStatus()) { draw_lead(s, lead_one, s->scene.lead_vertices[0]); } - if (lead_two.getProb() > .5 && (std::abs(lead_one.getX()[0] - lead_two.getX()[0]) > 3.0)) { + if (lead_two.getStatus() && (std::abs(lead_one.getDRel() - lead_two.getDRel()) > 3.0)) { draw_lead(s, lead_two, s->scene.lead_vertices[1]); } } @@ -302,12 +302,10 @@ void ui_resize(UIState *s, int width, int height) { // Apply transformation such that video pixel coordinates match video // 1) Put (0, 0) in the middle of the video - nvgTranslate(s->vg, width / 2, height / 2 + y_offset); // 2) Apply same scaling as video - nvgScale(s->vg, zoom, zoom); // 3) Put (0, 0) in top left corner of video - nvgTranslate(s->vg, -intrinsic_matrix.v[2], -intrinsic_matrix.v[5]); - - nvgCurrentTransform(s->vg, s->car_space_transform); - nvgResetTransform(s->vg); + s->car_space_transform.reset(); + s->car_space_transform.translate(width / 2, height / 2 + y_offset) + .scale(zoom, zoom) + .translate(-intrinsic_matrix.v[2], -intrinsic_matrix.v[5]); } diff --git a/selfdrive/ui/paint.h b/selfdrive/ui/paint.h index 55fe9c1d0835f1..4ce7cbd133e156 100644 --- a/selfdrive/ui/paint.h +++ b/selfdrive/ui/paint.h @@ -9,3 +9,4 @@ void ui_fill_rect(NVGcontext *vg, const Rect &r, const NVGpaint &paint, float ra void ui_fill_rect(NVGcontext *vg, const Rect &r, const NVGcolor &color, float radius = 0); void ui_nvg_init(UIState *s); void ui_resize(UIState *s, int width, int height); +void ui_update_params(UIState *s); diff --git a/selfdrive/ui/qt/maps/map.cc b/selfdrive/ui/qt/maps/map.cc index 1daed310b756aa..ecb5c122ae95ac 100644 --- a/selfdrive/ui/qt/maps/map.cc +++ b/selfdrive/ui/qt/maps/map.cc @@ -22,12 +22,15 @@ const float MIN_PITCH = 0; const float MAP_SCALE = 2; MapWindow::MapWindow(const QMapboxGLSettings &settings) : - m_settings(settings), velocity_filter(0, 10, 0.1) { + m_settings(settings), velocity_filter(0, 10, 0.05) { sm = new SubMaster({"liveLocationKalman", "navInstruction", "navRoute"}); + // Connect now, so any navRoutes sent while the map is initializing are not dropped + sm->update(0); + timer = new QTimer(this); QObject::connect(timer, SIGNAL(timeout()), this, SLOT(timerUpdate())); - timer->start(100); + timer->start(50); // Instructions map_instructions = new MapInstructions(this); @@ -50,6 +53,7 @@ MapWindow::MapWindow(const QMapboxGLSettings &settings) : } grabGesture(Qt::GestureType::PinchGesture); + qDebug() << "MapWindow initialized"; } MapWindow::~MapWindow() { @@ -178,7 +182,8 @@ void MapWindow::timerUpdate() { } } - if (sm->updated("navRoute")) { + if (sm->rcv_frame("navRoute") != route_rcv_frame) { + qWarning() << "Got new navRoute from navd"; auto route = (*sm)["navRoute"].getNavRoute(); auto route_points = capnp_coordinate_list_to_collection(route.getCoordinates()); QMapbox::Feature feature(QMapbox::Feature::LineStringType, route_points, {}, {}); @@ -193,6 +198,7 @@ void MapWindow::timerUpdate() { setVisible(true); // Show map on destination set/change allow_open = false; } + route_rcv_frame = sm->rcv_frame("navRoute"); } } diff --git a/selfdrive/ui/qt/maps/map.h b/selfdrive/ui/qt/maps/map.h index 519750ce58a784..a5e333fdf50e60 100644 --- a/selfdrive/ui/qt/maps/map.h +++ b/selfdrive/ui/qt/maps/map.h @@ -114,6 +114,7 @@ class MapWindow : public QOpenGLWidget { MapETA* map_eta; void clearRoute(); + uint64_t route_rcv_frame = 0; private slots: void timerUpdate(); diff --git a/selfdrive/ui/qt/onroad.cc b/selfdrive/ui/qt/onroad.cc index a2195a621d5f49..e7a233000cdd8e 100644 --- a/selfdrive/ui/qt/onroad.cc +++ b/selfdrive/ui/qt/onroad.cc @@ -42,10 +42,12 @@ OnroadWindow::OnroadWindow(QWidget *parent) : QWidget(parent) { void OnroadWindow::updateState(const UIState &s) { QColor bgColor = bg_colors[s.status]; Alert alert = Alert::get(*(s.sm), s.scene.started_frame); - if (alert.type == "controlsUnresponsive") { - bgColor = bg_colors[STATUS_ALERT]; + if (s.sm->updated("controlsState") || !alert.equal({})) { + if (alert.type == "controlsUnresponsive") { + bgColor = bg_colors[STATUS_ALERT]; + } + alerts->updateAlert(alert, bgColor); } - alerts->updateAlert(alert, bgColor); if (bg != bgColor) { // repaint border bg = bgColor; @@ -184,3 +186,9 @@ void NvgWindow::paintGL() { } prev_draw_t = cur_draw_t; } + +void NvgWindow::showEvent(QShowEvent *event) { + CameraViewWidget::showEvent(event); + ui_update_params(&QUIState::ui_state); + prev_draw_t = millis_since_boot(); +} diff --git a/selfdrive/ui/qt/onroad.h b/selfdrive/ui/qt/onroad.h index 9be04e04ae473f..ee44973cf24c19 100644 --- a/selfdrive/ui/qt/onroad.h +++ b/selfdrive/ui/qt/onroad.h @@ -34,6 +34,7 @@ class NvgWindow : public CameraViewWidget { protected: void paintGL() override; void initializeGL() override; + void showEvent(QShowEvent *event) override; double prev_draw_t = 0; }; diff --git a/selfdrive/ui/qt/sidebar.cc b/selfdrive/ui/qt/sidebar.cc index cd53a5b725c831..73c4e2f8ce6b65 100644 --- a/selfdrive/ui/qt/sidebar.cc +++ b/selfdrive/ui/qt/sidebar.cc @@ -43,6 +43,8 @@ void Sidebar::mouseReleaseEvent(QMouseEvent *event) { } void Sidebar::updateState(const UIState &s) { + if (!isVisible()) return; + auto &sm = *(s.sm); auto deviceState = sm["deviceState"].getDeviceState(); diff --git a/selfdrive/ui/qt/widgets/cameraview.cc b/selfdrive/ui/qt/widgets/cameraview.cc index 19eb4ab7700373..1daabd7d1ec784 100644 --- a/selfdrive/ui/qt/widgets/cameraview.cc +++ b/selfdrive/ui/qt/widgets/cameraview.cc @@ -1,5 +1,8 @@ #include "selfdrive/ui/qt/widgets/cameraview.h" +#include +#include + namespace { const char frame_vertex_shader[] = @@ -197,18 +200,13 @@ void CameraViewWidget::paintGL() { glClear(GL_STENCIL_BUFFER_BIT | GL_COLOR_BUFFER_BIT); return; } + std::unique_lock lk(texture_lock); glViewport(0, 0, width(), height()); glBindVertexArray(frame_vao); glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, texture[latest_frame->idx]->frame_tex); - if (!Hardware::EON()) { - // this is handled in ion on QCOM - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, latest_frame->width, latest_frame->height, - GL_RGB, GL_UNSIGNED_BYTE, latest_frame->addr); - } glUseProgram(program->programId()); glUniform1i(program->uniformLocation("uTexture"), 0); @@ -251,6 +249,25 @@ void CameraViewWidget::vipcThread() { VisionStreamType cur_stream_type = stream_type; std::unique_ptr vipc_client; + std::unique_ptr ctx; + std::unique_ptr surface; + std::unique_ptr gl_buffer; + + if (!Hardware::EON()) { + ctx = std::make_unique(); + ctx->setFormat(context()->format()); + ctx->setShareContext(context()); + ctx->create(); + assert(ctx->isValid()); + + surface = std::make_unique(); + surface->setFormat(ctx->format()); + surface->create(); + ctx->makeCurrent(surface.get()); + assert(QOpenGLContext::currentContext() == ctx.get()); + initializeOpenGLFunctions(); + } + while (!QThread::currentThread()->isInterruptionRequested()) { if (!vipc_client || cur_stream_type != stream_type) { cur_stream_type = stream_type; @@ -262,11 +279,38 @@ void CameraViewWidget::vipcThread() { QThread::msleep(100); continue; } + + if (!Hardware::EON()) { + gl_buffer.reset(new QOpenGLBuffer(QOpenGLBuffer::PixelUnpackBuffer)); + gl_buffer->create(); + gl_buffer->bind(); + gl_buffer->setUsagePattern(QOpenGLBuffer::StreamDraw); + gl_buffer->allocate(vipc_client->buffers[0].len); + } + emit vipcThreadConnected(vipc_client.get()); } if (VisionBuf *buf = vipc_client->recv(nullptr, 1000)) { - emit vipcThreadFrameReceived(buf); + if (!Hardware::EON()) { + std::unique_lock lk(texture_lock); + + void *texture_buffer = gl_buffer->map(QOpenGLBuffer::WriteOnly); + memcpy(texture_buffer, buf->addr, buf->len); + gl_buffer->unmap(); + + // copy pixels from PBO to texture object + glBindTexture(GL_TEXTURE_2D, texture[buf->idx]->frame_tex); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, buf->width, buf->height, GL_RGB, GL_UNSIGNED_BYTE, 0); + glBindTexture(GL_TEXTURE_2D, 0); + assert(glGetError() == GL_NO_ERROR); + + emit vipcThreadFrameReceived(buf); + + glFlush(); + } else { + emit vipcThreadFrameReceived(buf); + } } } } diff --git a/selfdrive/ui/qt/widgets/cameraview.h b/selfdrive/ui/qt/widgets/cameraview.h index caf686cee81376..90622c6b775a6e 100644 --- a/selfdrive/ui/qt/widgets/cameraview.h +++ b/selfdrive/ui/qt/widgets/cameraview.h @@ -48,6 +48,8 @@ class CameraViewWidget : public QOpenGLWidget, protected QOpenGLFunctions { std::atomic stream_type; QThread *vipc_thread = nullptr; + std::mutex texture_lock; + protected slots: void vipcConnected(VisionIpcClient *vipc_client); void vipcFrameReceived(VisionBuf *buf); diff --git a/selfdrive/ui/replay/framereader.cc b/selfdrive/ui/replay/framereader.cc index bfdc6ee386d767..1524ad974850ed 100644 --- a/selfdrive/ui/replay/framereader.cc +++ b/selfdrive/ui/replay/framereader.cc @@ -1,94 +1,122 @@ #include "selfdrive/ui/replay/framereader.h" #include -#include namespace { -int readFunction(void *opaque, uint8_t *buf, int buf_size) { - auto &iss = *reinterpret_cast(opaque); - iss.read(reinterpret_cast(buf), buf_size); - return iss.gcount() ? iss.gcount() : AVERROR_EOF; +struct buffer_data { + const uint8_t *data; + int64_t offset; + size_t size; +}; + +int readPacket(void *opaque, uint8_t *buf, int buf_size) { + struct buffer_data *bd = (struct buffer_data *)opaque; + buf_size = std::min((size_t)buf_size, bd->size - bd->offset); + if (!buf_size) return AVERROR_EOF; + + memcpy(buf, bd->data + bd->offset, buf_size); + bd->offset += buf_size; + return buf_size; +} + +enum AVPixelFormat get_hw_format(AVCodecContext *ctx, const enum AVPixelFormat *pix_fmts) { + enum AVPixelFormat *hw_pix_fmt = reinterpret_cast(ctx->opaque); + for (const enum AVPixelFormat *p = pix_fmts; *p != -1; p++) { + if (*p == *hw_pix_fmt) return *p; + } + printf("Please run replay with the --no-cuda flag!\n"); + assert(0); + return AV_PIX_FMT_NONE; } } // namespace FrameReader::FrameReader(bool local_cache, int chunk_size, int retries) : FileReader(local_cache, chunk_size, retries) { - pFormatCtx_ = avformat_alloc_context(); - av_frame_ = av_frame_alloc(); - rgb_frame_ = av_frame_alloc(); - yuv_frame_ = av_frame_alloc(); + input_ctx = avformat_alloc_context(); + sws_frame.reset(av_frame_alloc()); } FrameReader::~FrameReader() { for (auto &f : frames_) { - av_free_packet(&f.pkt); + av_packet_unref(&f.pkt); } - if (pCodecCtx_) avcodec_free_context(&pCodecCtx_); - if (pFormatCtx_) avformat_close_input(&pFormatCtx_); - if (av_frame_) av_frame_free(&av_frame_); - if (rgb_frame_) av_frame_free(&rgb_frame_); - if (yuv_frame_) av_frame_free(&yuv_frame_); + if (decoder_ctx) avcodec_free_context(&decoder_ctx); + if (input_ctx) avformat_close_input(&input_ctx); + if (hw_device_ctx) av_buffer_unref(&hw_device_ctx); + if (rgb_sws_ctx_) sws_freeContext(rgb_sws_ctx_); if (yuv_sws_ctx_) sws_freeContext(yuv_sws_ctx_); if (avio_ctx_) { av_freep(&avio_ctx_->buffer); - av_freep(&avio_ctx_); + avio_context_free(&avio_ctx_); } } -bool FrameReader::load(const std::string &url, std::atomic *abort) { +bool FrameReader::load(const std::string &url, bool no_cuda, std::atomic *abort) { std::string content = read(url, abort); if (content.empty()) return false; - std::istringstream iss(content); + struct buffer_data bd = { + .data = (uint8_t *)content.data(), + .offset = 0, + .size = content.size(), + }; const int avio_ctx_buffer_size = 64 * 1024; unsigned char *avio_ctx_buffer = (unsigned char *)av_malloc(avio_ctx_buffer_size); - avio_ctx_ = avio_alloc_context(avio_ctx_buffer, avio_ctx_buffer_size, 0, &iss, readFunction, nullptr, nullptr); - pFormatCtx_->pb = avio_ctx_; + avio_ctx_ = avio_alloc_context(avio_ctx_buffer, avio_ctx_buffer_size, 0, &bd, readPacket, nullptr, nullptr); + input_ctx->pb = avio_ctx_; - pFormatCtx_->probesize = 10 * 1024 * 1024; // 10MB - int ret = avformat_open_input(&pFormatCtx_, url.c_str(), NULL, NULL); + input_ctx->probesize = 10 * 1024 * 1024; // 10MB + int ret = avformat_open_input(&input_ctx, url.c_str(), NULL, NULL); if (ret != 0) { char err_str[1024] = {0}; av_strerror(ret, err_str, std::size(err_str)); printf("Error loading video - %s - %s\n", err_str, url.c_str()); return false; } - avformat_find_stream_info(pFormatCtx_, NULL); - // av_dump_format(pFormatCtx_, 0, url.c_str(), 0); - AVStream *video = pFormatCtx_->streams[0]; - auto pCodec = avcodec_find_decoder(video->codec->codec_id); - if (!pCodec) return false; + ret = avformat_find_stream_info(input_ctx, nullptr); + if (ret < 0) { + printf("cannot find a video stream in the input file\n"); + return false; + } + + AVStream *video = input_ctx->streams[0]; + AVCodec *decoder = avcodec_find_decoder(video->codec->codec_id); + if (!decoder) return false; - pCodecCtx_ = avcodec_alloc_context3(pCodec); - ret = avcodec_parameters_to_context(pCodecCtx_, video->codecpar); + decoder_ctx = avcodec_alloc_context3(decoder); + ret = avcodec_parameters_to_context(decoder_ctx, video->codecpar); if (ret != 0) return false; - // pCodecCtx_->thread_count = 0; - // pCodecCtx_->thread_type = FF_THREAD_FRAME; - ret = avcodec_open2(pCodecCtx_, pCodec, NULL); - if (ret < 0) return false; + width = (decoder_ctx->width + 3) & ~3; + height = decoder_ctx->height; - width = (pCodecCtx_->width + 3) & ~3; - height = pCodecCtx_->height; - rgb_sws_ctx_ = sws_getContext(pCodecCtx_->width, pCodecCtx_->height, AV_PIX_FMT_YUV420P, - width, height, AV_PIX_FMT_BGR24, - SWS_FAST_BILINEAR, NULL, NULL, NULL); - if (!rgb_sws_ctx_) return false; + if (!no_cuda) { + if (!initHardwareDecoder(AV_HWDEVICE_TYPE_CUDA)) { + printf("No CUDA capable device was found. fallback to CPU decoding.\n"); + } + } - yuv_sws_ctx_ = sws_getContext(pCodecCtx_->width, pCodecCtx_->height, AV_PIX_FMT_YUV420P, - width, height, AV_PIX_FMT_YUV420P, - SWS_FAST_BILINEAR, NULL, NULL, NULL); + rgb_sws_ctx_ = sws_getContext(decoder_ctx->width, decoder_ctx->height, sws_src_format, + width, height, AV_PIX_FMT_BGR24, + SWS_BILINEAR, NULL, NULL, NULL); + if (!rgb_sws_ctx_) return false; + yuv_sws_ctx_ = sws_getContext(decoder_ctx->width, decoder_ctx->height, sws_src_format, + width, height, AV_PIX_FMT_YUV420P, + SWS_BILINEAR, NULL, NULL, NULL); if (!yuv_sws_ctx_) return false; + ret = avcodec_open2(decoder_ctx, decoder, NULL); + if (ret < 0) return false; + frames_.reserve(60 * 20); // 20fps, one minute while (!(abort && *abort)) { Frame &frame = frames_.emplace_back(); - ret = av_read_frame(pFormatCtx_, &frame.pkt); + ret = av_read_frame(input_ctx, &frame.pkt); if (ret < 0) { frames_.pop_back(); valid_ = (ret == AVERROR_EOF); @@ -100,6 +128,43 @@ bool FrameReader::load(const std::string &url, std::atomic *abort) { return valid_; } +bool FrameReader::initHardwareDecoder(AVHWDeviceType hw_device_type) { + for (int i = 0;; i++) { + const AVCodecHWConfig *config = avcodec_get_hw_config(decoder_ctx->codec, i); + if (!config) { + printf("decoder %s does not support hw device type %s.\n", + decoder_ctx->codec->name, av_hwdevice_get_type_name(hw_device_type)); + return false; + } + if (config->methods & AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX && config->device_type == hw_device_type) { + hw_pix_fmt = config->pix_fmt; + break; + } + } + + int ret = av_hwdevice_ctx_create(&hw_device_ctx, hw_device_type, nullptr, nullptr, 0); + if (ret < 0) { + printf("Failed to create specified HW device %d.\n", ret); + return false; + } + + // get sws source format + AVHWFramesConstraints *hw_frames_const = av_hwdevice_get_hwframe_constraints(hw_device_ctx, nullptr); + assert(hw_frames_const != 0); + for (AVPixelFormat *p = hw_frames_const->valid_sw_formats; *p != AV_PIX_FMT_NONE; p++) { + if (sws_isSupportedInput(*p)) { + sws_src_format = *p; + break; + } + } + av_hwframe_constraints_free(&hw_frames_const); + + decoder_ctx->hw_device_ctx = av_buffer_ref(hw_device_ctx); + decoder_ctx->opaque = &hw_pix_fmt; + decoder_ctx->get_format = get_hw_format; + return true; +} + bool FrameReader::get(int idx, uint8_t *rgb, uint8_t *yuv) { assert(rgb || yuv); if (!valid_ || idx < 0 || idx >= frames_.size()) { @@ -125,35 +190,51 @@ bool FrameReader::decode(int idx, uint8_t *rgb, uint8_t *yuv) { for (int i = from_idx; i <= idx; ++i) { Frame &frame = frames_[i]; if ((!frame.decoded || i == idx) && !frame.failed) { - frame.decoded = decodeFrame(&frame.pkt); + AVFrame *f = decodeFrame(&frame.pkt); + frame.decoded = f != nullptr; frame.failed = !frame.decoded; if (frame.decoded && i == idx) { - return copyBuffers(av_frame_, rgb, yuv); + return copyBuffers(f, rgb, yuv); } } } return false; } -bool FrameReader::decodeFrame(AVPacket *pkt) { - int ret = avcodec_send_packet(pCodecCtx_, pkt); +AVFrame *FrameReader::decodeFrame(AVPacket *pkt) { + int ret = avcodec_send_packet(decoder_ctx, pkt); if (ret < 0) { printf("Error sending a packet for decoding\n"); - return false; + return nullptr; + } + + av_frame_.reset(av_frame_alloc()); + ret = avcodec_receive_frame(decoder_ctx, av_frame_.get()); + if (ret != 0) { + return nullptr; + } + + if (av_frame_->format == hw_pix_fmt) { + hw_frame.reset(av_frame_alloc()); + if ((ret = av_hwframe_transfer_data(hw_frame.get(), av_frame_.get(), 0)) < 0) { + printf("error transferring the data from GPU to CPU\n"); + return nullptr; + } + return hw_frame.get(); + } else { + return av_frame_.get(); } - ret = avcodec_receive_frame(pCodecCtx_, av_frame_); - return ret == 0; } bool FrameReader::copyBuffers(AVFrame *f, uint8_t *rgb, uint8_t *yuv) { // images is going to be written to output buffers, no alignment (align = 1) if (yuv) { - av_image_fill_arrays(yuv_frame_->data, yuv_frame_->linesize, yuv, AV_PIX_FMT_YUV420P, width, height, 1); - int ret = sws_scale(yuv_sws_ctx_, (const uint8_t **)f->data, f->linesize, 0, f->height, yuv_frame_->data, yuv_frame_->linesize); + av_image_fill_arrays(sws_frame->data, sws_frame->linesize, yuv, AV_PIX_FMT_YUV420P, width, height, 1); + int ret = sws_scale(yuv_sws_ctx_, (const uint8_t **)f->data, f->linesize, 0, f->height, sws_frame->data, sws_frame->linesize); if (ret < 0) return false; } - av_image_fill_arrays(rgb_frame_->data, rgb_frame_->linesize, rgb, AV_PIX_FMT_BGR24, width, height, 1); - int ret = sws_scale(rgb_sws_ctx_, (const uint8_t **)f->data, f->linesize, 0, f->height, rgb_frame_->data, rgb_frame_->linesize); + av_image_fill_arrays(sws_frame->data, sws_frame->linesize, rgb, AV_PIX_FMT_BGR24, width, height, 1); + int ret = sws_scale(rgb_sws_ctx_, (const uint8_t **)f->data, f->linesize, 0, f->height, sws_frame->data, sws_frame->linesize); return ret >= 0; } diff --git a/selfdrive/ui/replay/framereader.h b/selfdrive/ui/replay/framereader.h index 1b552cd1b859d0..c7b04138cfd7f3 100644 --- a/selfdrive/ui/replay/framereader.h +++ b/selfdrive/ui/replay/framereader.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include @@ -12,11 +13,15 @@ extern "C" { #include } +struct AVFrameDeleter { + void operator()(AVFrame* frame) const { av_frame_free(&frame); } +}; + class FrameReader : protected FileReader { public: FrameReader(bool local_cache = false, int chunk_size = -1, int retries = 0); ~FrameReader(); - bool load(const std::string &url, std::atomic *abort = nullptr); + bool load(const std::string &url, bool no_cuda = false, std::atomic *abort = nullptr); bool get(int idx, uint8_t *rgb, uint8_t *yuv); int getRGBSize() const { return width * height * 3; } int getYUVSize() const { return width * height * 3 / 2; } @@ -26,8 +31,9 @@ class FrameReader : protected FileReader { int width = 0, height = 0; private: + bool initHardwareDecoder(AVHWDeviceType hw_device_type); bool decode(int idx, uint8_t *rgb, uint8_t *yuv); - bool decodeFrame(AVPacket *pkt); + AVFrame * decodeFrame(AVPacket *pkt); bool copyBuffers(AVFrame *f, uint8_t *rgb, uint8_t *yuv); struct Frame { @@ -36,11 +42,15 @@ class FrameReader : protected FileReader { bool failed = false; }; std::vector frames_; + AVPixelFormat sws_src_format = AV_PIX_FMT_YUV420P; SwsContext *rgb_sws_ctx_ = nullptr, *yuv_sws_ctx_ = nullptr; - AVFrame *av_frame_, *rgb_frame_, *yuv_frame_ = nullptr; - AVFormatContext *pFormatCtx_ = nullptr; - AVCodecContext *pCodecCtx_ = nullptr; + std::unique_ptrav_frame_, sws_frame, hw_frame; + AVFormatContext *input_ctx = nullptr; + AVCodecContext *decoder_ctx = nullptr; int key_frames_count_ = 0; bool valid_ = false; AVIOContext *avio_ctx_ = nullptr; + + AVPixelFormat hw_pix_fmt = AV_PIX_FMT_NONE; + AVBufferRef *hw_device_ctx = nullptr; }; diff --git a/selfdrive/ui/replay/main.cc b/selfdrive/ui/replay/main.cc index d4fc8ff13a9f5c..062837885b1c67 100644 --- a/selfdrive/ui/replay/main.cc +++ b/selfdrive/ui/replay/main.cc @@ -102,6 +102,7 @@ int main(int argc, char *argv[]) { {"no-cache", REPLAY_FLAG_NO_FILE_CACHE, "turn off local cache"}, {"qcam", REPLAY_FLAG_QCAMERA, "load qcamera"}, {"yuv", REPLAY_FLAG_SEND_YUV, "send yuv frame"}, + {"no-cuda", REPLAY_FLAG_NO_CUDA, "disable CUDA"}, }; QCommandLineParser parser; diff --git a/selfdrive/ui/replay/replay.h b/selfdrive/ui/replay/replay.h index 320afa505b9670..2d30d90e4bce7d 100644 --- a/selfdrive/ui/replay/replay.h +++ b/selfdrive/ui/replay/replay.h @@ -16,6 +16,7 @@ enum REPLAY_FLAGS { REPLAY_FLAG_NO_FILE_CACHE = 0x0020, REPLAY_FLAG_QCAMERA = 0x0040, REPLAY_FLAG_SEND_YUV = 0x0080, + REPLAY_FLAG_NO_CUDA = 0x0100, }; class Replay : public QObject { diff --git a/selfdrive/ui/replay/route.cc b/selfdrive/ui/replay/route.cc index d834d67ab63714..9ee1d387c4736c 100644 --- a/selfdrive/ui/replay/route.cc +++ b/selfdrive/ui/replay/route.cc @@ -91,7 +91,7 @@ void Route::addFileToSegment(int n, const QString &file) { // class Segment -Segment::Segment(int n, const SegmentFile &files, uint32_t flags) : seg_num(n) { +Segment::Segment(int n, const SegmentFile &files, uint32_t flags) : seg_num(n), flags(flags) { // [RoadCam, DriverCam, WideRoadCam, log]. fallback to qcamera/qlog const QString file_list[] = { (flags & REPLAY_FLAG_QCAMERA) || files.road_cam.isEmpty() ? files.qcamera : files.road_cam, @@ -102,7 +102,7 @@ Segment::Segment(int n, const SegmentFile &files, uint32_t flags) : seg_num(n) { for (int i = 0; i < std::size(file_list); i++) { if (!file_list[i].isEmpty()) { loading_++; - synchronizer_.addFuture(QtConcurrent::run([=] { loadFile(i, file_list[i].toStdString(), !(flags & REPLAY_FLAG_NO_FILE_CACHE)); })); + synchronizer_.addFuture(QtConcurrent::run([=] { loadFile(i, file_list[i].toStdString()); })); } } } @@ -114,11 +114,12 @@ Segment::~Segment() { synchronizer_.waitForFinished(); } -void Segment::loadFile(int id, const std::string file, bool local_cache) { +void Segment::loadFile(int id, const std::string file) { + const bool local_cache = !(flags & REPLAY_FLAG_NO_FILE_CACHE); bool success = false; if (id < MAX_CAMERAS) { frames[id] = std::make_unique(local_cache, 20 * 1024 * 1024, 3); - success = frames[id]->load(file, &abort_); + success = frames[id]->load(file, flags & REPLAY_FLAG_NO_CUDA, &abort_); } else { log = std::make_unique(local_cache, -1, 3); success = log->load(file, &abort_); diff --git a/selfdrive/ui/replay/route.h b/selfdrive/ui/replay/route.h index b11607f250021f..c39eef7d92ef4c 100644 --- a/selfdrive/ui/replay/route.h +++ b/selfdrive/ui/replay/route.h @@ -58,9 +58,10 @@ class Segment : public QObject { void loadFinished(bool success); protected: - void loadFile(int id, const std::string file, bool local_cache); + void loadFile(int id, const std::string file); std::atomic abort_ = false; std::atomic loading_ = 0; QFutureSynchronizer synchronizer_; + uint32_t flags; }; diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc index d0c3c04879c9e7..7a4de06586d48b 100644 --- a/selfdrive/ui/ui.cc +++ b/selfdrive/ui/ui.cc @@ -12,23 +12,27 @@ #define BACKLIGHT_DT 0.05 #define BACKLIGHT_TS 10.00 -#define BACKLIGHT_OFFROAD 75 +#define BACKLIGHT_OFFROAD 50 // Projects a point in car to space to the corresponding point in full frame // image space. static bool calib_frame_to_full_frame(const UIState *s, float in_x, float in_y, float in_z, vertex_data *out) { const float margin = 500.0f; + const QRectF clip_region{-margin, -margin, s->fb_w + 2 * margin, s->fb_h + 2 * margin}; + const vec3 pt = (vec3){{in_x, in_y, in_z}}; const vec3 Ep = matvecmul3(s->scene.view_from_calib, pt); const vec3 KEp = matvecmul3(s->wide_camera ? ecam_intrinsic_matrix : fcam_intrinsic_matrix, Ep); // Project. - float x = KEp.v[0] / KEp.v[2]; - float y = KEp.v[1] / KEp.v[2]; - - nvgTransformPoint(&out->x, &out->y, s->car_space_transform, x, y); - return out->x >= -margin && out->x <= s->fb_w + margin && out->y >= -margin && out->y <= s->fb_h + margin; + QPointF point = s->car_space_transform.map(QPointF{KEp.v[0] / KEp.v[2], KEp.v[1] / KEp.v[2]}); + if (clip_region.contains(point)) { + out->x = point.x(); + out->y = point.y(); + return true; + } + return false; } static int get_path_length_idx(const cereal::ModelDataV2::XYZTData::Reader &line, const float path_height) { @@ -40,13 +44,12 @@ static int get_path_length_idx(const cereal::ModelDataV2::XYZTData::Reader &line return max_idx; } -static void update_leads(UIState *s, const cereal::ModelDataV2::Reader &model) { - auto leads = model.getLeadsV3(); - auto model_position = model.getPosition(); +static void update_leads(UIState *s, const cereal::RadarState::Reader &radar_state, std::optional line) { for (int i = 0; i < 2; ++i) { - if (leads[i].getProb() > 0.5) { - float z = model_position.getZ()[get_path_length_idx(model_position, leads[i].getX()[0])]; - calib_frame_to_full_frame(s, leads[i].getX()[0], leads[i].getY()[0], z + 1.22, &s->scene.lead_vertices[i]); + auto lead_data = (i == 0) ? radar_state.getLeadOne() : radar_state.getLeadTwo(); + if (lead_data.getStatus()) { + float z = line ? (*line).getZ()[get_path_length_idx(*line, lead_data.getDRel())] : 0.0; + calib_frame_to_full_frame(s, lead_data.getDRel(), -lead_data.getYRel(), z + 1.22, &s->scene.lead_vertices[i]); } } } @@ -89,9 +92,9 @@ static void update_model(UIState *s, const cereal::ModelDataV2::Reader &model) { } // update path - auto lead_one = model.getLeadsV3()[0]; - if (lead_one.getProb() > 0.5) { - const float lead_d = lead_one.getX()[0] * 2.; + auto lead_one = (*s->sm)["radarState"].getRadarState().getLeadOne(); + if (lead_one.getStatus()) { + const float lead_d = lead_one.getDRel() * 2.; max_distance = std::clamp((float)(lead_d - fmin(lead_d * 0.35, 10.)), 0.0f, max_distance); } max_idx = get_path_length_idx(model_position, max_distance); @@ -105,6 +108,7 @@ static void update_sockets(UIState *s) { static void update_state(UIState *s) { SubMaster &sm = *(s->sm); UIScene &scene = s->scene; + s->running_time = 1e-9 * (nanos_since_boot() - sm["deviceState"].getDeviceState().getStartedMonoTime()); // update engageability and DM icons at 2Hz if (sm.frame % (UI_FREQ / 2) == 0) { @@ -113,9 +117,14 @@ static void update_state(UIState *s) { scene.dm_active = sm["driverMonitoringState"].getDriverMonitoringState().getIsActiveMode(); } if (sm.updated("modelV2") && s->vg) { - auto model = sm["modelV2"].getModelV2(); - update_model(s, model); - update_leads(s, model); + update_model(s, sm["modelV2"].getModelV2()); + } + if (sm.updated("radarState") && s->vg) { + std::optional line; + if (sm.rcv_frame("modelV2") > 0) { + line = sm["modelV2"].getModelV2().getPosition(); + } + update_leads(s, sm["radarState"].getRadarState(), line); } if (sm.updated("liveCalibration")) { scene.world_objects_visible = true; @@ -185,12 +194,8 @@ static void update_state(UIState *s) { scene.started = sm["deviceState"].getDeviceState().getStarted() && scene.ignition; } -static void update_params(UIState *s) { - const uint64_t frame = s->sm->frame; - UIScene &scene = s->scene; - if (frame % (5*UI_FREQ) == 0) { - scene.is_metric = Params().getBool("IsMetric"); - } +void ui_update_params(UIState *s) { + s->scene.is_metric = Params().getBool("IsMetric"); } static void update_status(UIState *s) { @@ -224,7 +229,7 @@ static void update_status(UIState *s) { QUIState::QUIState(QObject *parent) : QObject(parent) { ui_state.sm = std::make_unique>({ - "modelV2", "controlsState", "liveCalibration", "deviceState", "roadCameraState", + "modelV2", "controlsState", "liveCalibration", "radarState", "deviceState", "roadCameraState", "pandaStates", "carParams", "driverMonitoringState", "sensorEvents", "carState", "liveLocationKalman", }); @@ -239,7 +244,6 @@ QUIState::QUIState(QObject *parent) : QObject(parent) { } void QUIState::update() { - update_params(&ui_state); update_sockets(&ui_state); update_state(&ui_state); update_status(&ui_state); @@ -249,7 +253,9 @@ void QUIState::update() { emit offroadTransition(!ui_state.scene.started); } - watchdog_kick(); + if (ui_state.sm->frame % UI_FREQ == 0) { + watchdog_kick(); + } emit uiUpdate(ui_state); } @@ -278,21 +284,30 @@ void Device::setAwake(bool on, bool reset) { } void Device::updateBrightness(const UIState &s) { - // Scale to 0% to 100% - float clipped_brightness = 100.0 * s.scene.light_sensor; - - // CIE 1931 - https://www.photonstophotos.net/GeneralTopics/Exposure/Psychometric_Lightness_and_Gamma.htm - if (clipped_brightness <= 8) { - clipped_brightness = (clipped_brightness / 903.3); - } else { - clipped_brightness = std::pow((clipped_brightness + 16.0) / 116.0, 3.0); - } + float clipped_brightness = BACKLIGHT_OFFROAD; + if (s.scene.started) { + // Scale to 0% to 100% + clipped_brightness = 100.0 * s.scene.light_sensor; + + // CIE 1931 - https://www.photonstophotos.net/GeneralTopics/Exposure/Psychometric_Lightness_and_Gamma.htm + if (clipped_brightness <= 8) { + clipped_brightness = (clipped_brightness / 903.3); + } else { + clipped_brightness = std::pow((clipped_brightness + 16.0) / 116.0, 3.0); + } - // Scale back to 10% to 100% - clipped_brightness = std::clamp(100.0f * clipped_brightness, 10.0f, 100.0f); + // Scale back to 10% to 100% + clipped_brightness = std::clamp(100.0f * clipped_brightness, 10.0f, 100.0f); - if (!s.scene.started) { - clipped_brightness = BACKLIGHT_OFFROAD; + // Limit brightness if running for too long + if (Hardware::TICI()) { + const float MAX_BRIGHTNESS_HOURS = 4; + const float HOURLY_BRIGHTNESS_DECREASE = 5; + float ui_running_hours = s.running_time / (60*60); + float anti_burnin_max_percent = std::clamp(100.0f - HOURLY_BRIGHTNESS_DECREASE * (ui_running_hours - MAX_BRIGHTNESS_HOURS), + 30.0f, 100.0f); + clipped_brightness = std::min(clipped_brightness, anti_burnin_max_percent); + } } int brightness = brightness_filter.update(clipped_brightness); diff --git a/selfdrive/ui/ui.h b/selfdrive/ui/ui.h index 4fcc137df7d8ff..46cbae63fb035d 100644 --- a/selfdrive/ui/ui.h +++ b/selfdrive/ui/ui.h @@ -3,11 +3,12 @@ #include #include #include +#include #include #include #include - +#include #include "nanovg.h" #include "cereal/messaging/messaging.h" @@ -31,7 +32,6 @@ const int header_h = 420; const int footer_h = 280; const int UI_FREQ = 20; // Hz - typedef cereal::CarControl::HUDControl::AudibleAlert AudibleAlert; // TODO: this is also hardcoded in common/transformations/camera.py @@ -147,8 +147,10 @@ typedef struct UIState { bool awake; bool has_prime = false; - float car_space_transform[6]; + QTransform car_space_transform; bool wide_camera; + + float running_time; } UIState; diff --git a/tools/lib/framereader.py b/tools/lib/framereader.py index 00e28c9dfe8983..db07c20177f63b 100644 --- a/tools/lib/framereader.py +++ b/tools/lib/framereader.py @@ -6,10 +6,10 @@ import subprocess import tempfile import threading +from enum import IntEnum from functools import wraps import numpy as np -from aenum import Enum from lru import LRU import _io @@ -41,7 +41,7 @@ def __exit__(self, *x): pass -class FrameType(Enum): +class FrameType(IntEnum): raw = 1 h265_stream = 2 diff --git a/tools/mac_setup.sh b/tools/mac_setup.sh index a633066f29ec6e..1072c1caaff4ec 100755 --- a/tools/mac_setup.sh +++ b/tools/mac_setup.sh @@ -61,6 +61,7 @@ fi # install python PYENV_PYTHON_VERSION=$(cat $OP_ROOT/.python-version) +PATH=$HOME/.pyenv/bin:$HOME/.pyenv/shims:$PATH pyenv install -s ${PYENV_PYTHON_VERSION} pyenv rehash eval "$(pyenv init -)" diff --git a/tools/openpilot_env.sh b/tools/openpilot_env.sh index ac784d41e2b1bf..81ae00d64dced7 100755 --- a/tools/openpilot_env.sh +++ b/tools/openpilot_env.sh @@ -1,16 +1,16 @@ if [ -z "$OPENPILOT_ENV" ]; then export PYTHONPATH="$HOME/openpilot:$PYTHONPATH" + export PATH="$HOME/.pyenv/bin:$PATH" + + # Pyenv suggests we place the below two lines in .profile before we source + # .bashrc, but there is no simple way to guarantee we do this correctly + # programmatically across heterogeneous systems. For end-user convenience, + # we add the lines here as a workaround. + # https://github.com/pyenv/pyenv/issues/1906 + export PYENV_ROOT="$HOME/.pyenv" unamestr=`uname` if [[ "$unamestr" == 'Linux' ]]; then - export PATH="$HOME/.pyenv/bin:$PATH" - - # Pyenv suggests we place the below two lines in .profile before we source - # .bashrc, but there is no simple way to guarantee we do this correctly - # programmatically across heterogeneous systems. For end-user convenience, - # we add the lines here as a workaround. - # https://github.com/pyenv/pyenv/issues/1906 - export PYENV_ROOT="$HOME/.pyenv" eval "$(pyenv init --path)" eval "$(pyenv virtualenv-init -)" diff --git a/tools/plotjuggler/layouts/tuning.xml b/tools/plotjuggler/layouts/tuning.xml index 270b4a6284c3e2..877fb82a5d9164 100644 --- a/tools/plotjuggler/layouts/tuning.xml +++ b/tools/plotjuggler/layouts/tuning.xml @@ -1,43 +1,43 @@ - + - + - + - + - + - - - + + + - + - + - + - - + + - + @@ -48,46 +48,47 @@ - - + + - + - - + + + - + - - - + + + - + - + - + - - - + + + - + - - + + @@ -95,10 +96,10 @@ - + - + @@ -107,23 +108,23 @@ - + - - + + - + - - + + - + @@ -131,7 +132,7 @@ - t + @@ -142,40 +143,39 @@ + - + engage_delay = 5 last_bad_time = -engage_delay - accel = value -brake = v1 -gas = v2 -active = v3 + curvature = value / v3 +pressed = v1 +enabled = v2 -if (brake ~= 0 or gas ~= 0 or active == 0) then +if (pressed == 1 or enabled == 0) then last_bad_time = time end if (time > last_bad_time + engage_delay) then - return value + return curvature else return 0 end - /carControl/actuators/accel + /liveLocationKalman/angularVelocityCalibrated/value/2 - /carState/brakePressed - /carState/gasPressed - /carControl/active + /carState/steeringPressed + /carControl/enabled + /liveLocationKalman/velocityCalibrated/value/0 - + engage_delay = 5 last_bad_time = -engage_delay - accel = value -brake = v1 -gas = v2 -active = v3 + curvature = value +pressed = v1 +enabled = v2 -if (brake ~= 0 or gas ~= 0 or active == 0) then +if (pressed == 1 or enabled == 0) then last_bad_time = time end @@ -184,22 +184,20 @@ if (time > last_bad_time + engage_delay) then else return 0 end - /longitudinalPlan/accels/0 + /controlsState/curvature - /carState/brakePressed - /carState/gasPressed - /carControl/active + /carState/steeringPressed + /carControl/enabled - + engage_delay = 5 last_bad_time = -engage_delay - accel = value -brake = v1 -gas = v2 -active = v3 + curvature = value +pressed = v1 +enabled = v2 -if (brake ~= 0 or gas ~= 0 or active == 0) then +if (pressed == 1 or enabled == 0) then last_bad_time = time end @@ -208,21 +206,21 @@ if (time > last_bad_time + engage_delay) then else return 0 end - /carState/aEgo + /lateralPlan/curvatures/0 - /carState/brakePressed - /carState/gasPressed - /carControl/active + /carState/steeringPressed + /carControl/enabled - + engage_delay = 5 last_bad_time = -engage_delay - curvature = value -pressed = v1 -active = v2 + accel = value +brake = v1 +gas = v2 +enabled = v3 -if (pressed == 1 or active == 0) then +if (brake ~= 0 or gas ~= 0 or enabled == 0) then last_bad_time = time end @@ -231,20 +229,22 @@ if (time > last_bad_time + engage_delay) then else return 0 end - /lateralPlan/curvatures/0 + /carState/aEgo - /carState/steeringPressed - /carControl/active + /carState/brakePressed + /carState/gasPressed + /carControl/enabled - + engage_delay = 5 last_bad_time = -engage_delay - curvature = value -pressed = v1 -active = v2 + accel = value +brake = v1 +gas = v2 +enabled = v3 -if (pressed == 1 or active == 0) then +if (brake ~= 0 or gas ~= 0 or enabled == 0) then last_bad_time = time end @@ -253,33 +253,35 @@ if (time > last_bad_time + engage_delay) then else return 0 end - /controlsState/curvature + /longitudinalPlan/accels/0 - /carState/steeringPressed - /controlsState/active + /carState/brakePressed + /carState/gasPressed + /carControl/enabled - + engage_delay = 5 last_bad_time = -engage_delay - curvature = value / v3 -pressed = v1 -active = v2 + accel = value +brake = v1 +gas = v2 +enabled = v3 -if (pressed == 1 or active == 0) then +if (brake ~= 0 or gas ~= 0 or enabled == 0) then last_bad_time = time end if (time > last_bad_time + engage_delay) then - return curvature + return value else return 0 end - /liveLocationKalman/angularVelocityCalibrated/value/2 + /carControl/actuators/accel - /carState/steeringPressed - /carControl/active - /carState/vEgo + /carState/brakePressed + /carState/gasPressed + /carControl/enabled diff --git a/tools/ubuntu_setup.sh b/tools/ubuntu_setup.sh index a7eaa9876827ca..6ad7931b5619c7 100755 --- a/tools/ubuntu_setup.sh +++ b/tools/ubuntu_setup.sh @@ -104,7 +104,12 @@ if [ -f "/etc/os-release" ]; then ;; *) echo "$ID $VERSION_ID is unsupported. This setup script is written for Ubuntu 20.04." - exit 1 + read -p "Would you like to attempt installation anyway? " -n 1 -r + echo "" + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + exit 1 + fi + install_ubuntu_lts_requirements esac else echo "No /etc/os-release in the system" diff --git a/tools/zookeeper/__init__.py b/tools/zookeeper/__init__.py index 0aeafdcaab351e..cd64d3a1fb13ae 100755 --- a/tools/zookeeper/__init__.py +++ b/tools/zookeeper/__init__.py @@ -2,8 +2,8 @@ # Python library to control Zookeeper -import ft4222 -import ft4222.I2CMaster +import ft4222 # pylint: disable=import-error +import ft4222.I2CMaster # pylint: disable=import-error DEBUG = False