Merge branch 'develop' into coretk-enhance/disable-runtime-editing-custom-service-config
This commit is contained in:
commit
f8a3f0a2d4
11 changed files with 451 additions and 828 deletions
581
daemon/Pipfile.lock
generated
581
daemon/Pipfile.lock
generated
|
@ -39,41 +39,36 @@
|
||||||
},
|
},
|
||||||
"cffi": {
|
"cffi": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:0b49274afc941c626b605fb59b59c3485c17dc776dc3cc7cc14aca74cc19cc42",
|
"sha256:001bf3242a1bb04d985d63e138230802c6c8d4db3668fb545fb5005ddf5bb5ff",
|
||||||
"sha256:0e3ea92942cb1168e38c05c1d56b0527ce31f1a370f6117f1d490b8dcd6b3a04",
|
"sha256:00789914be39dffba161cfc5be31b55775de5ba2235fe49aa28c148236c4e06b",
|
||||||
"sha256:135f69aecbf4517d5b3d6429207b2dff49c876be724ac0c8bf8e1ea99df3d7e5",
|
"sha256:028a579fc9aed3af38f4892bdcc7390508adabc30c6af4a6e4f611b0c680e6ac",
|
||||||
"sha256:19db0cdd6e516f13329cba4903368bff9bb5a9331d3410b1b448daaadc495e54",
|
"sha256:14491a910663bf9f13ddf2bc8f60562d6bc5315c1f09c704937ef17293fb85b0",
|
||||||
"sha256:2781e9ad0e9d47173c0093321bb5435a9dfae0ed6a762aabafa13108f5f7b2ba",
|
"sha256:1cae98a7054b5c9391eb3249b86e0e99ab1e02bb0cc0575da191aedadbdf4384",
|
||||||
"sha256:291f7c42e21d72144bb1c1b2e825ec60f46d0a7468f5346841860454c7aa8f57",
|
"sha256:2089ed025da3919d2e75a4d963d008330c96751127dd6f73c8dc0c65041b4c26",
|
||||||
"sha256:2c5e309ec482556397cb21ede0350c5e82f0eb2621de04b2633588d118da4396",
|
"sha256:2d384f4a127a15ba701207f7639d94106693b6cd64173d6c8988e2c25f3ac2b6",
|
||||||
"sha256:2e9c80a8c3344a92cb04661115898a9129c074f7ab82011ef4b612f645939f12",
|
"sha256:337d448e5a725bba2d8293c48d9353fc68d0e9e4088d62a9571def317797522b",
|
||||||
"sha256:32a262e2b90ffcfdd97c7a5e24a6012a43c61f1f5a57789ad80af1d26c6acd97",
|
"sha256:399aed636c7d3749bbed55bc907c3288cb43c65c4389964ad5ff849b6370603e",
|
||||||
"sha256:3c9fff570f13480b201e9ab69453108f6d98244a7f495e91b6c654a47486ba43",
|
"sha256:3b911c2dbd4f423b4c4fcca138cadde747abdb20d196c4a48708b8a2d32b16dd",
|
||||||
"sha256:415bdc7ca8c1c634a6d7163d43fb0ea885a07e9618a64bda407e04b04333b7db",
|
"sha256:3d311bcc4a41408cf5854f06ef2c5cab88f9fded37a3b95936c9879c1640d4c2",
|
||||||
"sha256:42194f54c11abc8583417a7cf4eaff544ce0de8187abaf5d29029c91b1725ad3",
|
"sha256:62ae9af2d069ea2698bf536dcfe1e4eed9090211dbaafeeedf5cb6c41b352f66",
|
||||||
"sha256:4424e42199e86b21fc4db83bd76909a6fc2a2aefb352cb5414833c030f6ed71b",
|
"sha256:66e41db66b47d0d8672d8ed2708ba91b2f2524ece3dee48b5dfb36be8c2f21dc",
|
||||||
"sha256:4a43c91840bda5f55249413037b7a9b79c90b1184ed504883b72c4df70778579",
|
"sha256:675686925a9fb403edba0114db74e741d8181683dcf216be697d208857e04ca8",
|
||||||
"sha256:599a1e8ff057ac530c9ad1778293c665cb81a791421f46922d80a86473c13346",
|
"sha256:7e63cbcf2429a8dbfe48dcc2322d5f2220b77b2e17b7ba023d6166d84655da55",
|
||||||
"sha256:5c4fae4e9cdd18c82ba3a134be256e98dc0596af1e7285a3d2602c97dcfa5159",
|
"sha256:8a6c688fefb4e1cd56feb6c511984a6c4f7ec7d2a1ff31a10254f3c817054ae4",
|
||||||
"sha256:5ecfa867dea6fabe2a58f03ac9186ea64da1386af2159196da51c4904e11d652",
|
"sha256:8c0ffc886aea5df6a1762d0019e9cb05f825d0eec1f520c51be9d198701daee5",
|
||||||
"sha256:62f2578358d3a92e4ab2d830cd1c2049c9c0d0e6d3c58322993cc341bdeac22e",
|
"sha256:95cd16d3dee553f882540c1ffe331d085c9e629499ceadfbda4d4fde635f4b7d",
|
||||||
"sha256:6471a82d5abea994e38d2c2abc77164b4f7fbaaf80261cb98394d5793f11b12a",
|
"sha256:99f748a7e71ff382613b4e1acc0ac83bf7ad167fb3802e35e90d9763daba4d78",
|
||||||
"sha256:6d4f18483d040e18546108eb13b1dfa1000a089bcf8529e30346116ea6240506",
|
"sha256:b8c78301cefcf5fd914aad35d3c04c2b21ce8629b5e4f4e45ae6812e461910fa",
|
||||||
"sha256:71a608532ab3bd26223c8d841dde43f3516aa5d2bf37b50ac410bb5e99053e8f",
|
"sha256:c420917b188a5582a56d8b93bdd8e0f6eca08c84ff623a4c16e809152cd35793",
|
||||||
"sha256:74a1d8c85fb6ff0b30fbfa8ad0ac23cd601a138f7509dc617ebc65ef305bb98d",
|
"sha256:c43866529f2f06fe0edc6246eb4faa34f03fe88b64a0a9a942561c8e22f4b71f",
|
||||||
"sha256:7b93a885bb13073afb0aa73ad82059a4c41f4b7d8eb8368980448b52d4c7dc2c",
|
"sha256:cab50b8c2250b46fe738c77dbd25ce017d5e6fb35d3407606e7a4180656a5a6a",
|
||||||
"sha256:7d4751da932caaec419d514eaa4215eaf14b612cff66398dd51129ac22680b20",
|
"sha256:cef128cb4d5e0b3493f058f10ce32365972c554572ff821e175dbc6f8ff6924f",
|
||||||
"sha256:7f627141a26b551bdebbc4855c1157feeef18241b4b8366ed22a5c7d672ef858",
|
"sha256:cf16e3cf6c0a5fdd9bc10c21687e19d29ad1fe863372b5543deaec1039581a30",
|
||||||
"sha256:8169cf44dd8f9071b2b9248c35fc35e8677451c52f795daa2bb4643f32a540bc",
|
"sha256:e56c744aa6ff427a607763346e4170629caf7e48ead6921745986db3692f987f",
|
||||||
"sha256:aa00d66c0fab27373ae44ae26a66a9e43ff2a678bf63a9c7c1a9a4d61172827a",
|
"sha256:e577934fc5f8779c554639376beeaa5657d54349096ef24abe8c74c5d9c117c3",
|
||||||
"sha256:ccb032fda0873254380aa2bfad2582aedc2959186cce61e3a17abc1a55ff89c3",
|
"sha256:f2b0fa0c01d8a0c7483afd9f31d7ecf2d71760ca24499c8697aeb5ca37dc090c"
|
||||||
"sha256:d754f39e0d1603b5b24a7f8484b22d2904fa551fe865fd0d4c3332f078d20d4e",
|
|
||||||
"sha256:d75c461e20e29afc0aee7172a0950157c704ff0dd51613506bd7d82b718e7410",
|
|
||||||
"sha256:dcd65317dd15bc0451f3e01c80da2216a31916bdcffd6221ca1202d96584aa25",
|
|
||||||
"sha256:e570d3ab32e2c2861c4ebe6ffcad6a8abf9347432a37608fe1fbd157b3f0036b",
|
|
||||||
"sha256:fd43a88e045cf992ed09fa724b5315b790525f2676883a6ea64e3263bae6549d"
|
|
||||||
],
|
],
|
||||||
"version": "==1.13.2"
|
"version": "==1.14.0"
|
||||||
},
|
},
|
||||||
"core": {
|
"core": {
|
||||||
"editable": true,
|
"editable": true,
|
||||||
|
@ -114,90 +109,91 @@
|
||||||
},
|
},
|
||||||
"grpcio": {
|
"grpcio": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:066630f6b62bffa291dacbee56994279a6a3682b8a11967e9ccaf3cc770fc11e",
|
"sha256:02aef8ef1a5ac5f0836b543e462eb421df6048a7974211a906148053b8055ea6",
|
||||||
"sha256:07e95762ca6b18afbeb3aa2793e827c841152d5e507089b1db0b18304edda105",
|
"sha256:07f82aefb4a56c7e1e52b78afb77d446847d27120a838a1a0489260182096045",
|
||||||
"sha256:0a0fb2f8e3a13537106bc77e4c63005bc60124a6203034304d9101921afa4e90",
|
"sha256:1cff47297ee614e7ef66243dc34a776883ab6da9ca129ea114a802c5e58af5c1",
|
||||||
"sha256:0c61b74dcfb302613926e785cb3542a0905b9a3a86e9410d8cf5d25e25e10104",
|
"sha256:1ec8fc865d8da6d0713e2092a27eee344cd54628b2c2065a0e77fff94df4ae00",
|
||||||
"sha256:13383bd70618da03684a8aafbdd9e3d9a6720bf8c07b85d0bc697afed599d8f0",
|
"sha256:1ef949b15a1f5f30651532a9b54edf3bd7c0b699a10931505fa2c80b2d395942",
|
||||||
"sha256:1c6e0f6b9d091e3717e9a58d631c8bb4898be3b261c2a01fe46371fdc271052f",
|
"sha256:209927e65395feb449783943d62a3036982f871d7f4045fadb90b2d82b153ea8",
|
||||||
"sha256:1cf710c04689daa5cc1e598efba00b028215700dcc1bf66fcb7b4f64f2ea5d5f",
|
"sha256:25c77692ea8c0929d4ad400ea9c3dcbcc4936cee84e437e0ef80da58fa73d88a",
|
||||||
"sha256:2da5cee9faf17bb8daf500cd0d28a17ae881ab5500f070a6aace457f4c08cac4",
|
"sha256:28f27c64dd699b8b10f70da5f9320c1cffcaefca7dd76275b44571bd097f276c",
|
||||||
"sha256:2f78ebf340eaf28fa09aba0f836a8b869af1716078dfe8f3b3f6ff785d8f2b0f",
|
"sha256:355bd7d7ce5ff2917d217f0e8ddac568cb7403e1ce1639b35a924db7d13a39b6",
|
||||||
"sha256:33a07a1a8e817d733588dbd18e567caad1a6fe0d440c165619866cd490c7911a",
|
"sha256:4a0a33ada3f6f94f855f92460896ef08c798dcc5f17d9364d1735c5adc9d7e4a",
|
||||||
"sha256:3d090c66af9c065b7228b07c3416f93173e9839b1d40bb0ce3dd2aa783645026",
|
"sha256:4d3b6e66f32528bf43ca2297caca768280a8e068820b1c3dca0fcf9f03c7d6f1",
|
||||||
"sha256:42b903a3596a10e2a3727bae2a76f8aefd324d498424b843cfa9606847faea7b",
|
"sha256:5121fa96c79fc0ec81825091d0be5c16865f834f41b31da40b08ee60552f9961",
|
||||||
"sha256:4fffbb58134c4f23e5a8312ac3412db6f5e39e961dc0eb5e3115ce5aa16bf927",
|
"sha256:57949756a3ce1f096fa2b00f812755f5ab2effeccedb19feeb7d0deafa3d1de7",
|
||||||
"sha256:57be5a6c509a406fe0ffa6f8b86904314c77b5e2791be8123368ad2ebccec874",
|
"sha256:586d931736912865c9790c60ca2db29e8dc4eace160d5a79fec3e58df79a9386",
|
||||||
"sha256:5b0fa09efb33e2af4e8822b4eb8b2cbc201d562e3e185c439be7eaeee2e8b8aa",
|
"sha256:5ae532b93cf9ce5a2a549b74a2c35e3b690b171ece9358519b3039c7b84c887e",
|
||||||
"sha256:5ef42dfc18f9a63a06aca938770b69470bb322e4c137cf08cf21703d1ef4ae5c",
|
"sha256:5dab393ab96b2ce4012823b2f2ed4ee907150424d2f02b97bd6f8dd8f17cc866",
|
||||||
"sha256:6a43d2f2ff8250f200fdf7aa31fa191a997922aa9ea1182453acd705ad83ab72",
|
"sha256:5ebc13451246de82f130e8ee7e723e8d7ae1827f14b7b0218867667b1b12c88d",
|
||||||
"sha256:6d8ab28559be98b02f8b3a154b53239df1aa5b0d28ff865ae5be4f30e7ed4d3f",
|
"sha256:68a149a0482d0bc697aac702ec6efb9d380e0afebf9484db5b7e634146528371",
|
||||||
"sha256:6e47866b7dc14ca3a12d40c1d6082e7bea964670f1c5315ea0fb8b0550244d64",
|
"sha256:6db7ded10b82592c472eeeba34b9f12d7b0ab1e2dcad12f081b08ebdea78d7d6",
|
||||||
"sha256:6edda1b96541187f73aab11800d25f18ee87e53d5f96bb74473873072bf28a0e",
|
"sha256:6e545908bcc2ae28e5b190ce3170f92d0438cf26a82b269611390114de0106eb",
|
||||||
"sha256:7109c8738a8a3c98cfb5dda1c45642a8d6d35dc00d257ab7a175099b2b4daecd",
|
"sha256:6f328a3faaf81a2546a3022b3dfc137cc6d50d81082dbc0c94d1678943f05df3",
|
||||||
"sha256:8d866aafb08657c456a18c4a31c8526ea62de42427c242b58210b9eae6c64559",
|
"sha256:706e2dea3de33b0d8884c4d35ecd5911b4ff04d0697c4138096666ce983671a6",
|
||||||
"sha256:9939727d9ae01690b24a2b159ac9dbca7b7e8e6edd5af6a6eb709243cae7b52b",
|
"sha256:80c3d1ce8820dd819d1c9d6b63b6f445148480a831173b572a9174a55e7abd47",
|
||||||
"sha256:99fd873699df17cb11c542553270ae2b32c169986e475df0d68a8629b8ef4df7",
|
"sha256:8111b61eee12d7af5c58f82f2c97c2664677a05df9225ef5cbc2f25398c8c454",
|
||||||
"sha256:b6fda5674f990e15e1bcaacf026428cf50bce36e708ddcbd1de9673b14aab760",
|
"sha256:9713578f187fb1c4d00ac554fe1edcc6b3ddd62f5d4eb578b81261115802df8e",
|
||||||
"sha256:bdb2f3dcb664f0c39ef1312cd6acf6bc6375252e4420cf8f36fff4cb4fa55c71",
|
"sha256:9c0669ba9aebad540fb05a33beb7e659ea6e5ca35833fc5229c20f057db760e8",
|
||||||
"sha256:bfd7d3130683a1a0a50c456273c21ec8a604f2d043b241a55235a78a0090ee06",
|
"sha256:9e9cfe55dc7ac2aa47e0fd3285ff829685f96803197042c9d2f0fb44e4b39b2c",
|
||||||
"sha256:c6c2db348ac73d73afe14e0833b18abbbe920969bf2c5c03c0922719f8020d06",
|
"sha256:a22daaf30037b8e59d6968c76fe0f7ff062c976c7a026e92fbefc4c4bf3fc5a4",
|
||||||
"sha256:cb7a4b41b5e2611f85c3402ac364f1d689f5d7ecbc24a55ef010eedcd6cf460f",
|
"sha256:a25b84e10018875a0f294a7649d07c43e8bc3e6a821714e39e5cd607a36386d7",
|
||||||
"sha256:cd3d3e328f20f7c807a862620c6ee748e8d57ba2a8fc960d48337ed71c6d9d32",
|
"sha256:a71138366d57901597bfcc52af7f076ab61c046f409c7b429011cd68de8f9fe6",
|
||||||
"sha256:d1a481777952e4f99b8a6956581f3ee866d7614100d70ae6d7e07327570b85ce",
|
"sha256:b4efde5524579a9ce0459ca35a57a48ca878a4973514b8bb88cb80d7c9d34c85",
|
||||||
"sha256:d1d49720ed636920bb3d74cedf549382caa9ad55aea89d1de99d817068d896b2",
|
"sha256:b78af4d42985ab3143d9882d0006f48d12f1bc4ba88e78f23762777c3ee64571",
|
||||||
"sha256:d42433f0086cccd192114343473d7dbd4aae9141794f939e2b7b83efc57543db",
|
"sha256:bb2987eb3af9bcf46019be39b82c120c3d35639a95bc4ee2d08f36ecdf469345",
|
||||||
"sha256:d44c34463a7c481e076f691d8fa25d080c3486978c2c41dca09a8dd75296c2d7",
|
"sha256:c03ce53690fe492845e14f4ab7e67d5a429a06db99b226b5c7caa23081c1e2bb",
|
||||||
"sha256:d7e5b7af1350e9c8c17a7baf99d575fbd2de69f7f0b0e6ebd47b57506de6493a",
|
"sha256:c59b9280284b791377b3524c8e39ca7b74ae2881ba1a6c51b36f4f1bb94cee49",
|
||||||
"sha256:d9542366a0917b9b48bab1fee481ac01f56bdffc52437b598c09e7840148a6a9",
|
"sha256:d18b4c8cacbb141979bb44355ee5813dd4d307e9d79b3a36d66eca7e0a203df8",
|
||||||
"sha256:df7cdfb40179acc9790a462c049e0b8e109481164dd7ad1a388dd67ff1528759",
|
"sha256:d1e5563e3b7f844dbc48d709c9e4a75647e11d0387cc1fa0c861d3e9d34bc844",
|
||||||
"sha256:e1a9d9d2e7224d981aea8da79260c7f6932bf31ce1f99b7ccfa5eceeb30dc5d0",
|
"sha256:d22c897b65b1408509099f1c3334bd3704f5e4eb7c0486c57d0e212f71cb8f54",
|
||||||
"sha256:ed10e5fad105ecb0b12822f924e62d0deb07f46683a0b64416b17fd143daba1d",
|
"sha256:dbec0a3a154dbf2eb85b38abaddf24964fa1c059ee0a4ad55d6f39211b1a4bca",
|
||||||
"sha256:f0ec5371ce2363b03531ed522bfbe691ec940f51f0e111f0500fc0f44518c69d",
|
"sha256:ed123037896a8db6709b8ad5acc0ed435453726ea0b63361d12de369624c2ab5",
|
||||||
"sha256:f6580a8a4f5e701289b45fd62a8f6cb5ec41e4d77082424f8b676806dcd22564",
|
"sha256:f3614dabd2cc8741850597b418bcf644d4f60e73615906c3acc407b78ff720b3",
|
||||||
"sha256:f7b83e4b2842d44fce3cdc0d54db7a7e0d169a598751bf393601efaa401c83e0",
|
"sha256:f9d632ce9fd485119c968ec6a7a343de698c5e014d17602ae2f110f1b05925ed",
|
||||||
"sha256:ffec45b0db18a555fdfe0c6fa2d0a3fceb751b22b31e8fcd14ceed7bde05481e"
|
"sha256:fb62996c61eeff56b59ab8abfcaa0859ec2223392c03d6085048b576b567459b"
|
||||||
],
|
],
|
||||||
"version": "==1.26.0"
|
"version": "==1.27.2"
|
||||||
},
|
},
|
||||||
"invoke": {
|
"invoke": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:4668a4a594a47f2da2f0672ec2f7b1566f809cebf10bcd95ce2de9ecf39b95d1",
|
"sha256:87b3ef9d72a1667e104f89b159eaf8a514dbf2f3576885b2bbdefe74c3fb2132",
|
||||||
"sha256:ae7b4513638bde9afcda0825e9535599637a3f65bd819a27098356027bb17c8a",
|
"sha256:93e12876d88130c8e0d7fd6618dd5387d6b36da55ad541481dfa5e001656f134",
|
||||||
"sha256:e04faba8ea7cdf6f5c912be42dcafd5c1074b7f2f306998992c4bfb40a9a690b"
|
"sha256:de3f23bfe669e3db1085789fd859eb8ca8e0c5d9c20811e2407fa042e8a5e15d"
|
||||||
],
|
],
|
||||||
"version": "==1.4.0"
|
"version": "==1.4.1"
|
||||||
},
|
},
|
||||||
"lxml": {
|
"lxml": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:00ac0d64949fef6b3693813fe636a2d56d97a5a49b5bbb86e4cc4cc50ebc9ea2",
|
"sha256:06d4e0bbb1d62e38ae6118406d7cdb4693a3fa34ee3762238bcb96c9e36a93cd",
|
||||||
"sha256:0571e607558665ed42e450d7bf0e2941d542c18e117b1ebbf0ba72f287ad841c",
|
"sha256:0701f7965903a1c3f6f09328c1278ac0eee8f56f244e66af79cb224b7ef3801c",
|
||||||
"sha256:0e3f04a7615fdac0be5e18b2406529521d6dbdb0167d2a690ee328bef7807487",
|
"sha256:1f2c4ec372bf1c4a2c7e4bb20845e8bcf8050365189d86806bad1e3ae473d081",
|
||||||
"sha256:13cf89be53348d1c17b453867da68704802966c433b2bb4fa1f970daadd2ef70",
|
"sha256:4235bc124fdcf611d02047d7034164897ade13046bda967768836629bc62784f",
|
||||||
"sha256:217262fcf6a4c2e1c7cb1efa08bd9ebc432502abc6c255c4abab611e8be0d14d",
|
"sha256:5828c7f3e615f3975d48f40d4fe66e8a7b25f16b5e5705ffe1d22e43fb1f6261",
|
||||||
"sha256:223e544828f1955daaf4cefbb4853bc416b2ec3fd56d4f4204a8b17007c21250",
|
"sha256:585c0869f75577ac7a8ff38d08f7aac9033da2c41c11352ebf86a04652758b7a",
|
||||||
"sha256:277cb61fede2f95b9c61912fefb3d43fbd5f18bf18a14fae4911b67984486f5d",
|
"sha256:5d467ce9c5d35b3bcc7172c06320dddb275fea6ac2037f72f0a4d7472035cea9",
|
||||||
"sha256:3213f753e8ae86c396e0e066866e64c6b04618e85c723b32ecb0909885211f74",
|
"sha256:63dbc21efd7e822c11d5ddbedbbb08cd11a41e0032e382a0fd59b0b08e405a3a",
|
||||||
"sha256:4690984a4dee1033da0af6df0b7a6bde83f74e1c0c870623797cec77964de34d",
|
"sha256:7bc1b221e7867f2e7ff1933165c0cec7153dce93d0cdba6554b42a8beb687bdb",
|
||||||
"sha256:4fcc472ef87f45c429d3b923b925704aa581f875d65bac80f8ab0c3296a63f78",
|
"sha256:8620ce80f50d023d414183bf90cc2576c2837b88e00bea3f33ad2630133bbb60",
|
||||||
"sha256:61409bd745a265a742f2693e4600e4dbd45cc1daebe1d5fad6fcb22912d44145",
|
"sha256:8a0ebda56ebca1a83eb2d1ac266649b80af8dd4b4a3502b2c1e09ac2f88fe128",
|
||||||
"sha256:678f1963f755c5d9f5f6968dded7b245dd1ece8cf53c1aa9d80e6734a8c7f41d",
|
"sha256:90ed0e36455a81b25b7034038e40880189169c308a3df360861ad74da7b68c1a",
|
||||||
"sha256:6c6d03549d4e2734133badb9ab1c05d9f0ef4bcd31d83e5d2b4747c85cfa21da",
|
"sha256:95e67224815ef86924fbc2b71a9dbd1f7262384bca4bc4793645794ac4200717",
|
||||||
"sha256:6e74d5f4d6ecd6942375c52ffcd35f4318a61a02328f6f1bd79fcb4ffedf969e",
|
"sha256:afdb34b715daf814d1abea0317b6d672476b498472f1e5aacbadc34ebbc26e89",
|
||||||
"sha256:7b4fc7b1ecc987ca7aaf3f4f0e71bbfbd81aaabf87002558f5bc95da3a865bcd",
|
"sha256:b4b2c63cc7963aedd08a5f5a454c9f67251b1ac9e22fd9d72836206c42dc2a72",
|
||||||
"sha256:7ed386a40e172ddf44c061ad74881d8622f791d9af0b6f5be20023029129bc85",
|
"sha256:d068f55bda3c2c3fcaec24bd083d9e2eede32c583faf084d6e4b9daaea77dde8",
|
||||||
"sha256:8f54f0924d12c47a382c600c880770b5ebfc96c9fd94cf6f6bdc21caf6163ea7",
|
"sha256:d5b3c4b7edd2e770375a01139be11307f04341ec709cf724e0f26ebb1eef12c3",
|
||||||
"sha256:ad9b81351fdc236bda538efa6879315448411a81186c836d4b80d6ca8217cdb9",
|
"sha256:deadf4df349d1dcd7b2853a2c8796593cc346600726eff680ed8ed11812382a7",
|
||||||
"sha256:bbd00e21ea17f7bcc58dccd13869d68441b32899e89cf6cfa90d624a9198ce85",
|
"sha256:df533af6f88080419c5a604d0d63b2c33b1c0c4409aba7d0cb6de305147ea8c8",
|
||||||
"sha256:c3c289762cc09735e2a8f8a49571d0e8b4f57ea831ea11558247b5bdea0ac4db",
|
"sha256:e4aa948eb15018a657702fee0b9db47e908491c64d36b4a90f59a64741516e77",
|
||||||
"sha256:cf4650942de5e5685ad308e22bcafbccfe37c54aa7c0e30cd620c2ee5c93d336",
|
"sha256:e5d842c73e4ef6ed8c1bd77806bf84a7cb535f9c0cf9b2c74d02ebda310070e1",
|
||||||
"sha256:cfcbc33c9c59c93776aa41ab02e55c288a042211708b72fdb518221cc803abc8",
|
"sha256:ebec08091a22c2be870890913bdadd86fcd8e9f0f22bcb398abd3af914690c15",
|
||||||
"sha256:e301055deadfedbd80cf94f2f65ff23126b232b0d1fea28f332ce58137bcdb18",
|
"sha256:edc15fcfd77395e24543be48871c251f38132bb834d9fdfdad756adb6ea37679",
|
||||||
"sha256:ebbfe24df7f7b5c6c7620702496b6419f6a9aa2fd7f005eb731cc80d7b4692b9",
|
"sha256:f2b74784ed7e0bc2d02bd53e48ad6ba523c9b36c194260b7a5045071abbb1012",
|
||||||
"sha256:eff69ddbf3ad86375c344339371168640951c302450c5d3e9936e98d6459db06",
|
"sha256:fa071559f14bd1e92077b1b5f6c22cf09756c6de7139370249eb372854ce51e6",
|
||||||
"sha256:f6ed60a62c5f1c44e789d2cf14009423cb1646b44a43e40a9cf6a21f077678a1"
|
"sha256:fd52e796fee7171c4361d441796b64df1acfceb51f29e545e812f16d023c4bbc",
|
||||||
|
"sha256:fe976a0f1ef09b3638778024ab9fb8cde3118f203364212c198f71341c0715ca"
|
||||||
],
|
],
|
||||||
"version": "==4.4.2"
|
"version": "==4.5.0"
|
||||||
},
|
},
|
||||||
"mako": {
|
"mako": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -211,13 +207,16 @@
|
||||||
"sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161",
|
"sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161",
|
||||||
"sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235",
|
"sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235",
|
||||||
"sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5",
|
"sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5",
|
||||||
|
"sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42",
|
||||||
"sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff",
|
"sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff",
|
||||||
"sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b",
|
"sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b",
|
||||||
"sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1",
|
"sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1",
|
||||||
"sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e",
|
"sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e",
|
||||||
"sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183",
|
"sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183",
|
||||||
"sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66",
|
"sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66",
|
||||||
|
"sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b",
|
||||||
"sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1",
|
"sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1",
|
||||||
|
"sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15",
|
||||||
"sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1",
|
"sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1",
|
||||||
"sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e",
|
"sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e",
|
||||||
"sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b",
|
"sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b",
|
||||||
|
@ -234,7 +233,9 @@
|
||||||
"sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6",
|
"sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6",
|
||||||
"sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f",
|
"sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f",
|
||||||
"sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f",
|
"sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f",
|
||||||
"sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"
|
"sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2",
|
||||||
|
"sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7",
|
||||||
|
"sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"
|
||||||
],
|
],
|
||||||
"version": "==1.1.1"
|
"version": "==1.1.1"
|
||||||
},
|
},
|
||||||
|
@ -281,26 +282,26 @@
|
||||||
},
|
},
|
||||||
"protobuf": {
|
"protobuf": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:0329e86a397db2a83f9dcbe21d9be55a47f963cdabc893c3a24f4d3a8f117c37",
|
"sha256:0bae429443cc4748be2aadfdaf9633297cfaeb24a9a02d0ab15849175ce90fab",
|
||||||
"sha256:0a7219254afec0d488211f3d482d8ed57e80ae735394e584a98d8f30a8c88a36",
|
"sha256:24e3b6ad259544d717902777b33966a1a069208c885576254c112663e6a5bb0f",
|
||||||
"sha256:14d6ac53df9cb5bb87c4f91b677c1bc5cec9c0fd44327f367a3c9562de2877c4",
|
"sha256:310a7aca6e7f257510d0c750364774034272538d51796ca31d42c3925d12a52a",
|
||||||
"sha256:180fc364b42907a1d2afa183ccbeffafe659378c236b1ec3daca524950bb918d",
|
"sha256:52e586072612c1eec18e1174f8e3bb19d08f075fc2e3f91d3b16c919078469d0",
|
||||||
"sha256:3d7a7d8d20b4e7a8f63f62de2d192cfd8b7a53c56caba7ece95367ca2b80c574",
|
"sha256:73152776dc75f335c476d11d52ec6f0f6925774802cd48d6189f4d5d7fe753f4",
|
||||||
"sha256:3f509f7e50d806a434fe4a5fbf602516002a0f092889209fff7db82060efffc0",
|
"sha256:7774bbbaac81d3ba86de646c39f154afc8156717972bf0450c9dbfa1dc8dbea2",
|
||||||
"sha256:4571da974019849201fc1ec6626b9cea54bd11b6bed140f8f737c0a33ea37de5",
|
"sha256:82d7ac987715d8d1eb4068bf997f3053468e0ce0287e2729c30601feb6602fee",
|
||||||
"sha256:56bd1d84fbf4505c7b73f04de987eef5682e5752c811141b0186a3809bfb396f",
|
"sha256:8eb9c93798b904f141d9de36a0ba9f9b73cc382869e67c9e642c0aba53b0fc07",
|
||||||
"sha256:680c668d00b5eff08b86aef9e5ba9a705e621ea05d39071cfea8e28cb2400946",
|
"sha256:adf0e4d57b33881d0c63bb11e7f9038f98ee0c3e334c221f0858f826e8fb0151",
|
||||||
"sha256:6b5b947dc8b3f2aec0eaad65b0b5113fcd642c358c31357c647da6281ee31104",
|
"sha256:c40973a0aee65422d8cb4e7d7cbded95dfeee0199caab54d5ab25b63bce8135a",
|
||||||
"sha256:6e96dffaf4d0a9a329e528b353ba62fd9ef13599688723d96bc9c165d0b6871e",
|
"sha256:c77c974d1dadf246d789f6dad1c24426137c9091e930dbf50e0a29c1fcf00b1f",
|
||||||
"sha256:919f0d6f6addc836d08658eba3b52be2e92fd3e76da3ce00c325d8e9826d17c7",
|
"sha256:dd9aa4401c36785ea1b6fff0552c674bdd1b641319cb07ed1fe2392388e9b0d7",
|
||||||
"sha256:9c7b19c30cf0644afd0e4218b13f637ce54382fdcb1c8f75bf3e84e49a5f6d0a",
|
"sha256:e11df1ac6905e81b815ab6fd518e79be0a58b5dc427a2cf7208980f30694b956",
|
||||||
"sha256:a2e6f57114933882ec701807f217df2fb4588d47f71f227c0a163446b930d507",
|
"sha256:e2f8a75261c26b2f5f3442b0525d50fd79a71aeca04b5ec270fc123536188306",
|
||||||
"sha256:a6b970a2eccfcbabe1acf230fbf112face1c4700036c95e195f3554d7bcb04c1",
|
"sha256:e512b7f3a4dd780f59f1bf22c302740e27b10b5c97e858a6061772668cd6f961",
|
||||||
"sha256:bc45641cbcdea068b67438244c926f9fd3e5cbdd824448a4a64370610df7c593",
|
"sha256:ef2c2e56aaf9ee914d3dccc3408d42661aaf7d9bb78eaa8f17b2e6282f214481",
|
||||||
"sha256:d61b14a9090da77fe87e38ba4c6c43d3533dcbeb5d84f5474e7ac63c532dcc9c",
|
"sha256:fac513a9dc2a74b99abd2e17109b53945e364649ca03d9f7a0b96aa8d1807d0a",
|
||||||
"sha256:d6faf5dbefb593e127463f58076b62fcfe0784187be8fe1aa9167388f24a22a1"
|
"sha256:fdfb6ad138dbbf92b5dbea3576d7c8ba7463173f7d2cb0ca1bd336ec88ddbd80"
|
||||||
],
|
],
|
||||||
"version": "==3.11.2"
|
"version": "==3.11.3"
|
||||||
},
|
},
|
||||||
"pycparser": {
|
"pycparser": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -334,6 +335,36 @@
|
||||||
],
|
],
|
||||||
"version": "==1.3.0"
|
"version": "==1.3.0"
|
||||||
},
|
},
|
||||||
|
"pyproj": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:0a12982df36f55412597431676e51d3e8fcf9b3e41f18103c31edfb1fc5fa4c0",
|
||||||
|
"sha256:0b57669a568e4235f09fea9c4e498b9beca2673ea7318989569dbb750ed299c5",
|
||||||
|
"sha256:155064fde6a95f6328962386ebde043679fd744f1415e512ed88ec47760ed47c",
|
||||||
|
"sha256:189b8278784655ee2a3bfc51bde3091b5615cc982d0017edabcb10099b2ccb3f",
|
||||||
|
"sha256:1db407591f99877b551a655897da1fd95f4e82e089c8b0d29bcd8beffcffedb8",
|
||||||
|
"sha256:226e0c126d6db158dd3da8879e5efab9f05b1d67989c33fc6aa73bf70409bb12",
|
||||||
|
"sha256:2842412ea3f99383850df92dbbca837847f3e574f98f81eaa8caebc6514a26e2",
|
||||||
|
"sha256:2d2884e85b1e69ff829bfd54872c322d3d5662dc2120a17fbd1094b9c08f9dc5",
|
||||||
|
"sha256:341dc836a1a57b74494a95cff0f05029988d93e1f96ba6c190384ec757d482b2",
|
||||||
|
"sha256:3d69b6a197fc8cf3585290e272e1cdd641d6834a3c71894ec4f2b800d2210d2a",
|
||||||
|
"sha256:447d5b18d941bea180f04179946d1d4f4aa5012697d78c9a4ceac6081dd32465",
|
||||||
|
"sha256:4e8f18a8be5653e90f24b0aea74e85e10271d1c537742ede8a11b569d3583125",
|
||||||
|
"sha256:659b1d748cd7480324841da93f91097a726b898a2de0d192bc771d374006ceb4",
|
||||||
|
"sha256:6972adfe6bb40da0423c12c38617809bf50ca8b7411a20795a1c6c3d96f10942",
|
||||||
|
"sha256:75d7ed27e2e081d2036647f7b40a9e3d4f9ec4bde795925f3f7b4c6bb85f742e",
|
||||||
|
"sha256:7b623a18f70e70cbe594fa429283027c1a73d6d31c70cd04eea65845cd060b76",
|
||||||
|
"sha256:8112da72b47af9ffcc8f0f42224898ba6371680501b3657091bb7420b7dd5c03",
|
||||||
|
"sha256:9686c611893d1c182befa63157f4a1d629e7caa464adf21309cf4da5d422a264",
|
||||||
|
"sha256:98bb690ca7ea50148792f656c0366e799d70dd7e43ab8f0c733b64bd96842e1c",
|
||||||
|
"sha256:a6ede79fd7ddd176d824e0366f8d326ff8bc082d7332c9b40baf8cb8ae7d51fe",
|
||||||
|
"sha256:c7e7b6a00a701e166e5ce903159282f2969eef689fd7fb9d7bcf92aaf167e150",
|
||||||
|
"sha256:cb8c57faf91173c219739a37b909edc1c35a48a86d26be17f1a21ffd9f8728c3",
|
||||||
|
"sha256:ea6c7cbe2f277ca6b32ebad77d713681819e23b07b17a4a892878ffe245826b7",
|
||||||
|
"sha256:ec4b2146ec8fcc93c38fbd1dcb0df06e5737d588fe28d833dfb2b241d2736f54",
|
||||||
|
"sha256:f540f4af0223cb2195b0953db6c5cb45256137da430657db42ad1b076caca361"
|
||||||
|
],
|
||||||
|
"version": "==2.5.0"
|
||||||
|
},
|
||||||
"pyyaml": {
|
"pyyaml": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:059b2ee3194d718896c0ad077dd8c043e5e909d9180f387ce42012662a4946d6",
|
"sha256:059b2ee3194d718896c0ad077dd8c043e5e909d9180f387ce42012662a4946d6",
|
||||||
|
@ -366,13 +397,6 @@
|
||||||
],
|
],
|
||||||
"version": "==1.4.3"
|
"version": "==1.4.3"
|
||||||
},
|
},
|
||||||
"aspy.yaml": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:463372c043f70160a9ec950c3f1e4c3a82db5fca01d334b6bc89c7164d744bdc",
|
|
||||||
"sha256:e7c742382eff2caed61f87a39d13f99109088e5e93f04d76eb8d4b28aa143f45"
|
|
||||||
],
|
|
||||||
"version": "==1.3.0"
|
|
||||||
},
|
|
||||||
"attrs": {
|
"attrs": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c",
|
"sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c",
|
||||||
|
@ -390,10 +414,10 @@
|
||||||
},
|
},
|
||||||
"cfgv": {
|
"cfgv": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:edb387943b665bf9c434f717bf630fa78aecd53d5900d2e05da6ad6048553144",
|
"sha256:1ccf53320421aeeb915275a196e23b3b8ae87dea8ac6698b1638001d4a486d53",
|
||||||
"sha256:fbd93c9ab0a523bf7daec408f3be2ed99a980e20b2d19b50fc184ca6b820d289"
|
"sha256:c8e8f552ffcc6194f4e18dd4f68d9aef0c0d58ae7e7be8c82bee3c5e9edfa513"
|
||||||
],
|
],
|
||||||
"version": "==2.0.1"
|
"version": "==3.1.0"
|
||||||
},
|
},
|
||||||
"click": {
|
"click": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -402,6 +426,12 @@
|
||||||
],
|
],
|
||||||
"version": "==7.0"
|
"version": "==7.0"
|
||||||
},
|
},
|
||||||
|
"distlib": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:2e166e231a26b36d6dfe35a48c4464346620f8645ed0ace01ee31822b288de21"
|
||||||
|
],
|
||||||
|
"version": "==0.3.0"
|
||||||
|
},
|
||||||
"entrypoints": {
|
"entrypoints": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19",
|
"sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19",
|
||||||
|
@ -409,6 +439,13 @@
|
||||||
],
|
],
|
||||||
"version": "==0.3"
|
"version": "==0.3"
|
||||||
},
|
},
|
||||||
|
"filelock": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59",
|
||||||
|
"sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836"
|
||||||
|
],
|
||||||
|
"version": "==3.0.12"
|
||||||
|
},
|
||||||
"flake8": {
|
"flake8": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:45681a117ecc81e870cbf1262835ae4af5e7a8b08e40b944a8a6e6b895914cfb",
|
"sha256:45681a117ecc81e870cbf1262835ae4af5e7a8b08e40b944a8a6e6b895914cfb",
|
||||||
|
@ -419,115 +456,115 @@
|
||||||
},
|
},
|
||||||
"grpcio": {
|
"grpcio": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:066630f6b62bffa291dacbee56994279a6a3682b8a11967e9ccaf3cc770fc11e",
|
"sha256:02aef8ef1a5ac5f0836b543e462eb421df6048a7974211a906148053b8055ea6",
|
||||||
"sha256:07e95762ca6b18afbeb3aa2793e827c841152d5e507089b1db0b18304edda105",
|
"sha256:07f82aefb4a56c7e1e52b78afb77d446847d27120a838a1a0489260182096045",
|
||||||
"sha256:0a0fb2f8e3a13537106bc77e4c63005bc60124a6203034304d9101921afa4e90",
|
"sha256:1cff47297ee614e7ef66243dc34a776883ab6da9ca129ea114a802c5e58af5c1",
|
||||||
"sha256:0c61b74dcfb302613926e785cb3542a0905b9a3a86e9410d8cf5d25e25e10104",
|
"sha256:1ec8fc865d8da6d0713e2092a27eee344cd54628b2c2065a0e77fff94df4ae00",
|
||||||
"sha256:13383bd70618da03684a8aafbdd9e3d9a6720bf8c07b85d0bc697afed599d8f0",
|
"sha256:1ef949b15a1f5f30651532a9b54edf3bd7c0b699a10931505fa2c80b2d395942",
|
||||||
"sha256:1c6e0f6b9d091e3717e9a58d631c8bb4898be3b261c2a01fe46371fdc271052f",
|
"sha256:209927e65395feb449783943d62a3036982f871d7f4045fadb90b2d82b153ea8",
|
||||||
"sha256:1cf710c04689daa5cc1e598efba00b028215700dcc1bf66fcb7b4f64f2ea5d5f",
|
"sha256:25c77692ea8c0929d4ad400ea9c3dcbcc4936cee84e437e0ef80da58fa73d88a",
|
||||||
"sha256:2da5cee9faf17bb8daf500cd0d28a17ae881ab5500f070a6aace457f4c08cac4",
|
"sha256:28f27c64dd699b8b10f70da5f9320c1cffcaefca7dd76275b44571bd097f276c",
|
||||||
"sha256:2f78ebf340eaf28fa09aba0f836a8b869af1716078dfe8f3b3f6ff785d8f2b0f",
|
"sha256:355bd7d7ce5ff2917d217f0e8ddac568cb7403e1ce1639b35a924db7d13a39b6",
|
||||||
"sha256:33a07a1a8e817d733588dbd18e567caad1a6fe0d440c165619866cd490c7911a",
|
"sha256:4a0a33ada3f6f94f855f92460896ef08c798dcc5f17d9364d1735c5adc9d7e4a",
|
||||||
"sha256:3d090c66af9c065b7228b07c3416f93173e9839b1d40bb0ce3dd2aa783645026",
|
"sha256:4d3b6e66f32528bf43ca2297caca768280a8e068820b1c3dca0fcf9f03c7d6f1",
|
||||||
"sha256:42b903a3596a10e2a3727bae2a76f8aefd324d498424b843cfa9606847faea7b",
|
"sha256:5121fa96c79fc0ec81825091d0be5c16865f834f41b31da40b08ee60552f9961",
|
||||||
"sha256:4fffbb58134c4f23e5a8312ac3412db6f5e39e961dc0eb5e3115ce5aa16bf927",
|
"sha256:57949756a3ce1f096fa2b00f812755f5ab2effeccedb19feeb7d0deafa3d1de7",
|
||||||
"sha256:57be5a6c509a406fe0ffa6f8b86904314c77b5e2791be8123368ad2ebccec874",
|
"sha256:586d931736912865c9790c60ca2db29e8dc4eace160d5a79fec3e58df79a9386",
|
||||||
"sha256:5b0fa09efb33e2af4e8822b4eb8b2cbc201d562e3e185c439be7eaeee2e8b8aa",
|
"sha256:5ae532b93cf9ce5a2a549b74a2c35e3b690b171ece9358519b3039c7b84c887e",
|
||||||
"sha256:5ef42dfc18f9a63a06aca938770b69470bb322e4c137cf08cf21703d1ef4ae5c",
|
"sha256:5dab393ab96b2ce4012823b2f2ed4ee907150424d2f02b97bd6f8dd8f17cc866",
|
||||||
"sha256:6a43d2f2ff8250f200fdf7aa31fa191a997922aa9ea1182453acd705ad83ab72",
|
"sha256:5ebc13451246de82f130e8ee7e723e8d7ae1827f14b7b0218867667b1b12c88d",
|
||||||
"sha256:6d8ab28559be98b02f8b3a154b53239df1aa5b0d28ff865ae5be4f30e7ed4d3f",
|
"sha256:68a149a0482d0bc697aac702ec6efb9d380e0afebf9484db5b7e634146528371",
|
||||||
"sha256:6e47866b7dc14ca3a12d40c1d6082e7bea964670f1c5315ea0fb8b0550244d64",
|
"sha256:6db7ded10b82592c472eeeba34b9f12d7b0ab1e2dcad12f081b08ebdea78d7d6",
|
||||||
"sha256:6edda1b96541187f73aab11800d25f18ee87e53d5f96bb74473873072bf28a0e",
|
"sha256:6e545908bcc2ae28e5b190ce3170f92d0438cf26a82b269611390114de0106eb",
|
||||||
"sha256:7109c8738a8a3c98cfb5dda1c45642a8d6d35dc00d257ab7a175099b2b4daecd",
|
"sha256:6f328a3faaf81a2546a3022b3dfc137cc6d50d81082dbc0c94d1678943f05df3",
|
||||||
"sha256:8d866aafb08657c456a18c4a31c8526ea62de42427c242b58210b9eae6c64559",
|
"sha256:706e2dea3de33b0d8884c4d35ecd5911b4ff04d0697c4138096666ce983671a6",
|
||||||
"sha256:9939727d9ae01690b24a2b159ac9dbca7b7e8e6edd5af6a6eb709243cae7b52b",
|
"sha256:80c3d1ce8820dd819d1c9d6b63b6f445148480a831173b572a9174a55e7abd47",
|
||||||
"sha256:99fd873699df17cb11c542553270ae2b32c169986e475df0d68a8629b8ef4df7",
|
"sha256:8111b61eee12d7af5c58f82f2c97c2664677a05df9225ef5cbc2f25398c8c454",
|
||||||
"sha256:b6fda5674f990e15e1bcaacf026428cf50bce36e708ddcbd1de9673b14aab760",
|
"sha256:9713578f187fb1c4d00ac554fe1edcc6b3ddd62f5d4eb578b81261115802df8e",
|
||||||
"sha256:bdb2f3dcb664f0c39ef1312cd6acf6bc6375252e4420cf8f36fff4cb4fa55c71",
|
"sha256:9c0669ba9aebad540fb05a33beb7e659ea6e5ca35833fc5229c20f057db760e8",
|
||||||
"sha256:bfd7d3130683a1a0a50c456273c21ec8a604f2d043b241a55235a78a0090ee06",
|
"sha256:9e9cfe55dc7ac2aa47e0fd3285ff829685f96803197042c9d2f0fb44e4b39b2c",
|
||||||
"sha256:c6c2db348ac73d73afe14e0833b18abbbe920969bf2c5c03c0922719f8020d06",
|
"sha256:a22daaf30037b8e59d6968c76fe0f7ff062c976c7a026e92fbefc4c4bf3fc5a4",
|
||||||
"sha256:cb7a4b41b5e2611f85c3402ac364f1d689f5d7ecbc24a55ef010eedcd6cf460f",
|
"sha256:a25b84e10018875a0f294a7649d07c43e8bc3e6a821714e39e5cd607a36386d7",
|
||||||
"sha256:cd3d3e328f20f7c807a862620c6ee748e8d57ba2a8fc960d48337ed71c6d9d32",
|
"sha256:a71138366d57901597bfcc52af7f076ab61c046f409c7b429011cd68de8f9fe6",
|
||||||
"sha256:d1a481777952e4f99b8a6956581f3ee866d7614100d70ae6d7e07327570b85ce",
|
"sha256:b4efde5524579a9ce0459ca35a57a48ca878a4973514b8bb88cb80d7c9d34c85",
|
||||||
"sha256:d1d49720ed636920bb3d74cedf549382caa9ad55aea89d1de99d817068d896b2",
|
"sha256:b78af4d42985ab3143d9882d0006f48d12f1bc4ba88e78f23762777c3ee64571",
|
||||||
"sha256:d42433f0086cccd192114343473d7dbd4aae9141794f939e2b7b83efc57543db",
|
"sha256:bb2987eb3af9bcf46019be39b82c120c3d35639a95bc4ee2d08f36ecdf469345",
|
||||||
"sha256:d44c34463a7c481e076f691d8fa25d080c3486978c2c41dca09a8dd75296c2d7",
|
"sha256:c03ce53690fe492845e14f4ab7e67d5a429a06db99b226b5c7caa23081c1e2bb",
|
||||||
"sha256:d7e5b7af1350e9c8c17a7baf99d575fbd2de69f7f0b0e6ebd47b57506de6493a",
|
"sha256:c59b9280284b791377b3524c8e39ca7b74ae2881ba1a6c51b36f4f1bb94cee49",
|
||||||
"sha256:d9542366a0917b9b48bab1fee481ac01f56bdffc52437b598c09e7840148a6a9",
|
"sha256:d18b4c8cacbb141979bb44355ee5813dd4d307e9d79b3a36d66eca7e0a203df8",
|
||||||
"sha256:df7cdfb40179acc9790a462c049e0b8e109481164dd7ad1a388dd67ff1528759",
|
"sha256:d1e5563e3b7f844dbc48d709c9e4a75647e11d0387cc1fa0c861d3e9d34bc844",
|
||||||
"sha256:e1a9d9d2e7224d981aea8da79260c7f6932bf31ce1f99b7ccfa5eceeb30dc5d0",
|
"sha256:d22c897b65b1408509099f1c3334bd3704f5e4eb7c0486c57d0e212f71cb8f54",
|
||||||
"sha256:ed10e5fad105ecb0b12822f924e62d0deb07f46683a0b64416b17fd143daba1d",
|
"sha256:dbec0a3a154dbf2eb85b38abaddf24964fa1c059ee0a4ad55d6f39211b1a4bca",
|
||||||
"sha256:f0ec5371ce2363b03531ed522bfbe691ec940f51f0e111f0500fc0f44518c69d",
|
"sha256:ed123037896a8db6709b8ad5acc0ed435453726ea0b63361d12de369624c2ab5",
|
||||||
"sha256:f6580a8a4f5e701289b45fd62a8f6cb5ec41e4d77082424f8b676806dcd22564",
|
"sha256:f3614dabd2cc8741850597b418bcf644d4f60e73615906c3acc407b78ff720b3",
|
||||||
"sha256:f7b83e4b2842d44fce3cdc0d54db7a7e0d169a598751bf393601efaa401c83e0",
|
"sha256:f9d632ce9fd485119c968ec6a7a343de698c5e014d17602ae2f110f1b05925ed",
|
||||||
"sha256:ffec45b0db18a555fdfe0c6fa2d0a3fceb751b22b31e8fcd14ceed7bde05481e"
|
"sha256:fb62996c61eeff56b59ab8abfcaa0859ec2223392c03d6085048b576b567459b"
|
||||||
],
|
],
|
||||||
"version": "==1.26.0"
|
"version": "==1.27.2"
|
||||||
},
|
},
|
||||||
"grpcio-tools": {
|
"grpcio-tools": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:0286f704e55e3012fec3910400fe1a4ed11aeb66d3ec4b7f8041845af7fb7206",
|
"sha256:00c5080cfb197ed20ecf0d0ff2d07f1fc9c42c724cad21c40ff2d048de5712b1",
|
||||||
"sha256:033a4e80dc78d9c11860800bd5a66b65ff385be8f669e96b02e795364c860597",
|
"sha256:069826dd02ce1886444cf4519c4fe1b05ac9ef41491f26e97400640531db47f6",
|
||||||
"sha256:0e3b5469912430f19407ebe14cfd1bece1b5a277c4d43e1b65dbff19d9475ccc",
|
"sha256:1266b577abe7c720fd16a83d0a4999a192e87c4a98fc9f97e0b99b106b3e155f",
|
||||||
"sha256:131aa8c3862a555819428856f872ab9e919e351d7cd60c98012e12d2fb6afc45",
|
"sha256:16dc3fad04fe18d50777c56af7b2d9b9984cd1cfc71184646eb431196d1645c6",
|
||||||
"sha256:1783b8fa74f58a643e7780112fc4eb6110789672e852a691fad6af6b94a90c4a",
|
"sha256:1de5a273eaffeb3d126a63345e9e848ea7db740762f700eb8b5d84c5e3e7687d",
|
||||||
"sha256:1e80f74854bd1c7263942e836d69f95ffc66bb45bf14bf3e1ab61113271b5884",
|
"sha256:2ca280af2cae1a014a238057bd3c0a254527569a6a9169a01c07f0590081d530",
|
||||||
"sha256:27ae784acff3d2fa04e3b4dc72f8d60a55d654f90e410adf08f46a4d2d673dd3",
|
"sha256:43a1573400527a23e4174d88604fde7a9d9a69bf9473c21936b7f409858f8ebb",
|
||||||
"sha256:33c6bee5a02408018dc10a5737818d2159f14cbb0613df41cc93ba6cbaeea095",
|
"sha256:4698c6b6a57f73b14d91a542c69ff33a2da8729691b7060a5d7f6383624d045e",
|
||||||
"sha256:376a1840d1f5d25e9c3391557d6b3eeb3de17be697b0e55d8247d0262fcbaacf",
|
"sha256:520b7dafddd0f82cb7e4f6e9c6ba1049aa804d0e207870def9fe7f94d1e14090",
|
||||||
"sha256:3922dffd8160d54dc00c7d32b30776a974cc098086493c668faffac19e752087",
|
"sha256:57f8b9e2c7f55cd45f6dd930d6de61deb42d3eb7f9788137fbc7155cf724132a",
|
||||||
"sha256:4ba7e5afc93b413bbb5f3dd65ba583e078ff5895a5053d825ab793cf7720ae96",
|
"sha256:59fbeb5bb9a7b94eb61642ac2cee1db5233b8094ca76fc56d4e0c6c20b5dd85f",
|
||||||
"sha256:4e9a1276f8699d06518cec8caceb2c423fc7f971765cab7550d39f281795fd81",
|
"sha256:5fd7efc2fd3370bd2c72dc58f31a407a5dff5498befa145da211b2e8c6a52c63",
|
||||||
"sha256:51ac9c4f8a542cd20c6776fde781c84c0acd8faba55ec14f121c6b4eb4245e89",
|
"sha256:6016c07d6566e3109a3c032cf3861902d66501ecc08a5a84c47e43027302f367",
|
||||||
"sha256:5580b86cf49936c9c74f0def44d3582a7a1bb720eba8a14805c3a61efa790c70",
|
"sha256:627c91923df75091d8c4d244af38d5ab7ed8d786d480751d6c2b9267fbb92fe0",
|
||||||
"sha256:58a879208bd84d6819a61c1b0618655574ef9df1d63a0e2f434fdcb5cfa1fb57",
|
"sha256:69c4a63919b9007e845d9f8980becd2f89d808a4a431ca32b9723ee37b521cb1",
|
||||||
"sha256:675918f83fa35bd54f4c29d95d8652c6215d5e95a13b6f14e626cdef6d0fce79",
|
"sha256:77e25c241e33b75612f2aa62985f746c6f6803ec4e452da508bb7f8d90a69db4",
|
||||||
"sha256:68259fd06188951d152665ffe44f9660edd715c102ae4bc4216eca4c4666dadf",
|
"sha256:7a2d5fb558ac153a326e742ebfd7020eb781c43d3ffd920abd42b2e6c6fdfb37",
|
||||||
"sha256:6cea124cbd9081a587e1954b98e9a27c7cca6ae72babc3046ab6b439a5730679",
|
"sha256:7b54b283ec83190680903a9037376dc915e1f03852a2d574ba4d981b7a1fd3d0",
|
||||||
"sha256:6f356a445ba7afc634b1046d9f51d3ae37afbf4fe1a500285aca37677462a7b9",
|
"sha256:845a51305af9fc7f9e2078edaec9a759153195f6cf1fbb12b1fa6f077e56b260",
|
||||||
"sha256:7f7430434bd997584f2136a675559ba0d4afdf7cb71d9bbc429b0cc831e6828c",
|
"sha256:84724458c86ff9b14c29b49e321f34d80445b379f4cd4d0494c694b49b1d6f88",
|
||||||
"sha256:809d60f15a32c21dc221ddb591aff8adfdde4e05095414eb8e015cdfef361615",
|
"sha256:87e8ca2c2d2d3e09b2a2bed5d740d7b3e64028dafb7d6be543b77eec85590736",
|
||||||
"sha256:826c19f26b41e99691e77823ad67f04dc0b69e514212907695e330c6f106415c",
|
"sha256:8e7738a4b93842bca1158cde81a3587c9b7111823e40a1ddf73292ca9d58e08b",
|
||||||
"sha256:96c6f657b93f49243d083840d27a5a686a1fc26044a80ebf8585734d5152d4ee",
|
"sha256:915a695bc112517af48126ee0ecdb6aff05ed33f3eeef28f0d076f1f6b52ef5e",
|
||||||
"sha256:9a2091371298f04ef350f776365945537d0befa95bad5623d80c4207bdff9d3a",
|
"sha256:99961156a36aae4a402d6b14c1e7efde642794b3ddbf32c51db0cb3a199e8b11",
|
||||||
"sha256:9af72b764b41ba939e8e0a7ae9ec8a17d1c46a18797c6342cba6483f29e1790f",
|
"sha256:9ba88c2d99bcaf7b9cb720925e3290d73b2367d238c5779363fd5598b2dc98c7",
|
||||||
"sha256:a209002e3d4787f0e90e29f15cddbe83dc9054238c0da7f539c913002a348cc1",
|
"sha256:a140bf853edb2b5e8692fe94869e3e34077d7599170c113d07a58286c604f4fe",
|
||||||
"sha256:a908d5af2f26673e970c7c03703437bf95d10e88dad3322e7e267467db44a04d",
|
"sha256:a14dc7a36c845991d908a7179502ca47bcba5ae1817c4426ce68cf2c97b20ad9",
|
||||||
"sha256:ab841c69581085b6f9aa54044a13db6ec31183513f7cce0862d29c9b7b4e3c64",
|
"sha256:a3d2aec4b09c8e59fee8b0d1ed668d09e8c48b738f03f5d8401d7eb409111c47",
|
||||||
"sha256:b1bc78efefb8e085c072add2c02326fdecad9b8644b3be11e715ea4c6102ad87",
|
"sha256:a8f892378b0b02526635b806f59141abbb429d19bec56e869e04f396502c9651",
|
||||||
"sha256:b97e74ffe121dfa9ae7ec94393fce4e95e9e0a343827663e989dc4b7c918d1a5",
|
"sha256:aaa5ae26883c3d58d1a4323981f96b941fa09bb8f0f368d97c6225585280cf04",
|
||||||
"sha256:bba8d3b61ec113bb94596599d2568217b22ddfc7baa46c00dec5106cfd4e914b",
|
"sha256:b56caecc16307b088a431a4038c3b3bb7d0e7f9988cbd0e9fa04ac937455ea38",
|
||||||
"sha256:bfe0e33aea60da100b214c72c1746cc0194bb8da910004518c185041cc795543",
|
"sha256:bd7f59ff1252a3db8a143b13ea1c1e93d4b8cf4b852eb48b22ef1e6942f62a84",
|
||||||
"sha256:c15f0718cbc3986e747d5b0734198dce0ac07d188ec5e063b1e9889ac947f86e",
|
"sha256:c1bb8f47d58e9f7c4825abfe01e6b85eda53c8b31d2267ca4cddf3c4d0829b80",
|
||||||
"sha256:c56d0ac769bf1f01dbb6ec6b6492849e70cd35bdeeb660e206a70ab43917ae92",
|
"sha256:d1a5e5fa47ba9557a7d3b31605631805adc66cdba9d95b5d10dfc52cca1fed53",
|
||||||
"sha256:d396fdb7026986e6d3897bb207cc7d5bc536a82a2e50af806a24b3d254c73bc3",
|
"sha256:dcbc06556f3713a9348c4fce02d05d91e678fc320fb2bcf0ddf8e4bb11d17867",
|
||||||
"sha256:d62ab00dea7fa0813fc813a6c848da2eeda5cb71893b892a229d23949de0cecd",
|
"sha256:e17b2e0936b04ced99769e26111e1e86ba81619d1b2691b1364f795e45560953",
|
||||||
"sha256:da75e33e185c8be17a82ec4a97f5c75ec05d57e85f8b285f86e2a22484849e4a",
|
"sha256:e6932518db389ede8bf06b4119bbd3e17f42d4626e72dec2b8955b20ec732cb6",
|
||||||
"sha256:dcbd1fbb540638c9ad9c3a071b392b654f79666a2bc12808080b0e9f674b9a80",
|
"sha256:ea4b3ad696d976d5eac74ec8df9a2c692113e455446ee38d5b3bd87f8e034fa6",
|
||||||
"sha256:e7e90bad5466347a3648358e9f437e72d5f6d6025fe741171a88aca8b9d864df",
|
"sha256:ee50b0cf0d28748ef9f941894eb50fc464bd61b8e96aaf80c5056bea9b80d580",
|
||||||
"sha256:eae371a663ceeef8f930323a120a9d11e13e1c49903a66ddb4ada4830d5bcb7d",
|
"sha256:ef624b6134aef737b3daa4fb7e806cb8c5749efecd0b1fa9ce4f7e060c7a0221",
|
||||||
"sha256:f290cccc972533a288c2ebc55eb3c0fbe0c6a0d0a9775cb34ce6bfb11fe14a11",
|
"sha256:f5450aa904e720f9c6407b59e96a8951ed6a95463f49444b6d2594b067d39588",
|
||||||
"sha256:facb8c588cdd6adc51ae7545f59283565dae8d946c6163e578b70ab6bf161215",
|
"sha256:f8514453411d72cc3cf7d481f2b6057e5b7436736d0cd39ee2b2f72088bbf497",
|
||||||
"sha256:fb043e45f91634776acdfe4b8dfc96b636c53a458799179041ab633e15c3d833"
|
"sha256:fae91f30dc050a8d0b32d20dc700e6092f0bd2138d83e9570fff3f0372c1b27e"
|
||||||
],
|
],
|
||||||
"index": "pypi",
|
"index": "pypi",
|
||||||
"version": "==1.26.0"
|
"version": "==1.27.2"
|
||||||
},
|
},
|
||||||
"identify": {
|
"identify": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:418f3b2313ac0b531139311a6b426854e9cbdfcfb6175447a5039aa6291d8b30",
|
"sha256:1222b648251bdcb8deb240b294f450fbf704c7984e08baa92507e4ea10b436d5",
|
||||||
"sha256:8ad99ed1f3a965612dcb881435bf58abcfbeb05e230bb8c352b51e8eac103360"
|
"sha256:d824ebe21f38325c771c41b08a95a761db1982f1fc0eee37c6c97df3f1636b96"
|
||||||
],
|
],
|
||||||
"version": "==1.4.10"
|
"version": "==1.4.11"
|
||||||
},
|
},
|
||||||
"importlib-metadata": {
|
"importlib-metadata": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:bdd9b7c397c273bcc9a11d6629a38487cd07154fa255a467bf704cd2c258e359",
|
"sha256:06f5b3a99029c7134207dd882428a66992a9de2bef7c2b699b5641f9886c3302",
|
||||||
"sha256:f17c015735e1a88296994c0697ecea7e11db24290941983b08c9feb30921e6d8"
|
"sha256:b97607a1a18a5100839aec1dc26a1ea17ee0d93b20b0f008d80a5a050afb200b"
|
||||||
],
|
],
|
||||||
"markers": "python_version < '3.8'",
|
"markers": "python_version < '3.8'",
|
||||||
"version": "==1.4.0"
|
"version": "==1.5.0"
|
||||||
},
|
},
|
||||||
"importlib-resources": {
|
"importlib-resources": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -554,24 +591,24 @@
|
||||||
},
|
},
|
||||||
"mock": {
|
"mock": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:83657d894c90d5681d62155c82bda9c1187827525880eda8ff5df4ec813437c3",
|
"sha256:2a572b715f09dd2f0a583d8aeb5bb67d7ed7a8fd31d193cf1227a99c16a67bc3",
|
||||||
"sha256:d157e52d4e5b938c550f39eb2fd15610db062441a9c2747d3dbfa9298211d0f8"
|
"sha256:5e48d216809f6f393987ed56920305d8f3c647e6ed35407c1ff2ecb88a9e1151"
|
||||||
],
|
],
|
||||||
"index": "pypi",
|
"index": "pypi",
|
||||||
"version": "==3.0.5"
|
"version": "==4.0.1"
|
||||||
},
|
},
|
||||||
"more-itertools": {
|
"more-itertools": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:1a2a32c72400d365000412fe08eb4a24ebee89997c18d3d147544f70f5403b39",
|
"sha256:5dd8bcf33e5f9513ffa06d5ad33d78f31e1931ac9a18f33d37e77a180d393a7c",
|
||||||
"sha256:c468adec578380b6281a114cb8a5db34eb1116277da92d7c46f904f0b52d3288"
|
"sha256:b1ddb932186d8a6ac451e1d95844b382f55e12686d51ca0c68b6f61f2ab7a507"
|
||||||
],
|
],
|
||||||
"version": "==8.1.0"
|
"version": "==8.2.0"
|
||||||
},
|
},
|
||||||
"nodeenv": {
|
"nodeenv": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:561057acd4ae3809e665a9aaaf214afff110bbb6a6d5c8a96121aea6878408b3"
|
"sha256:5b2438f2e42af54ca968dd1b374d14a1194848955187b0e5e4be1f73813a5212"
|
||||||
],
|
],
|
||||||
"version": "==1.3.4"
|
"version": "==1.3.5"
|
||||||
},
|
},
|
||||||
"packaging": {
|
"packaging": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -589,34 +626,34 @@
|
||||||
},
|
},
|
||||||
"pre-commit": {
|
"pre-commit": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:8f48d8637bdae6fa70cc97db9c1dd5aa7c5c8bf71968932a380628c25978b850",
|
"sha256:09ebe467f43ce24377f8c2f200fe3cd2570d328eb2ce0568c8e96ce19da45fa6",
|
||||||
"sha256:f92a359477f3252452ae2e8d3029de77aec59415c16ae4189bcfba40b757e029"
|
"sha256:f8d555e31e2051892c7f7b3ad9f620bd2c09271d87e9eedb2ad831737d6211eb"
|
||||||
],
|
],
|
||||||
"index": "pypi",
|
"index": "pypi",
|
||||||
"version": "==1.21.0"
|
"version": "==2.1.1"
|
||||||
},
|
},
|
||||||
"protobuf": {
|
"protobuf": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:0329e86a397db2a83f9dcbe21d9be55a47f963cdabc893c3a24f4d3a8f117c37",
|
"sha256:0bae429443cc4748be2aadfdaf9633297cfaeb24a9a02d0ab15849175ce90fab",
|
||||||
"sha256:0a7219254afec0d488211f3d482d8ed57e80ae735394e584a98d8f30a8c88a36",
|
"sha256:24e3b6ad259544d717902777b33966a1a069208c885576254c112663e6a5bb0f",
|
||||||
"sha256:14d6ac53df9cb5bb87c4f91b677c1bc5cec9c0fd44327f367a3c9562de2877c4",
|
"sha256:310a7aca6e7f257510d0c750364774034272538d51796ca31d42c3925d12a52a",
|
||||||
"sha256:180fc364b42907a1d2afa183ccbeffafe659378c236b1ec3daca524950bb918d",
|
"sha256:52e586072612c1eec18e1174f8e3bb19d08f075fc2e3f91d3b16c919078469d0",
|
||||||
"sha256:3d7a7d8d20b4e7a8f63f62de2d192cfd8b7a53c56caba7ece95367ca2b80c574",
|
"sha256:73152776dc75f335c476d11d52ec6f0f6925774802cd48d6189f4d5d7fe753f4",
|
||||||
"sha256:3f509f7e50d806a434fe4a5fbf602516002a0f092889209fff7db82060efffc0",
|
"sha256:7774bbbaac81d3ba86de646c39f154afc8156717972bf0450c9dbfa1dc8dbea2",
|
||||||
"sha256:4571da974019849201fc1ec6626b9cea54bd11b6bed140f8f737c0a33ea37de5",
|
"sha256:82d7ac987715d8d1eb4068bf997f3053468e0ce0287e2729c30601feb6602fee",
|
||||||
"sha256:56bd1d84fbf4505c7b73f04de987eef5682e5752c811141b0186a3809bfb396f",
|
"sha256:8eb9c93798b904f141d9de36a0ba9f9b73cc382869e67c9e642c0aba53b0fc07",
|
||||||
"sha256:680c668d00b5eff08b86aef9e5ba9a705e621ea05d39071cfea8e28cb2400946",
|
"sha256:adf0e4d57b33881d0c63bb11e7f9038f98ee0c3e334c221f0858f826e8fb0151",
|
||||||
"sha256:6b5b947dc8b3f2aec0eaad65b0b5113fcd642c358c31357c647da6281ee31104",
|
"sha256:c40973a0aee65422d8cb4e7d7cbded95dfeee0199caab54d5ab25b63bce8135a",
|
||||||
"sha256:6e96dffaf4d0a9a329e528b353ba62fd9ef13599688723d96bc9c165d0b6871e",
|
"sha256:c77c974d1dadf246d789f6dad1c24426137c9091e930dbf50e0a29c1fcf00b1f",
|
||||||
"sha256:919f0d6f6addc836d08658eba3b52be2e92fd3e76da3ce00c325d8e9826d17c7",
|
"sha256:dd9aa4401c36785ea1b6fff0552c674bdd1b641319cb07ed1fe2392388e9b0d7",
|
||||||
"sha256:9c7b19c30cf0644afd0e4218b13f637ce54382fdcb1c8f75bf3e84e49a5f6d0a",
|
"sha256:e11df1ac6905e81b815ab6fd518e79be0a58b5dc427a2cf7208980f30694b956",
|
||||||
"sha256:a2e6f57114933882ec701807f217df2fb4588d47f71f227c0a163446b930d507",
|
"sha256:e2f8a75261c26b2f5f3442b0525d50fd79a71aeca04b5ec270fc123536188306",
|
||||||
"sha256:a6b970a2eccfcbabe1acf230fbf112face1c4700036c95e195f3554d7bcb04c1",
|
"sha256:e512b7f3a4dd780f59f1bf22c302740e27b10b5c97e858a6061772668cd6f961",
|
||||||
"sha256:bc45641cbcdea068b67438244c926f9fd3e5cbdd824448a4a64370610df7c593",
|
"sha256:ef2c2e56aaf9ee914d3dccc3408d42661aaf7d9bb78eaa8f17b2e6282f214481",
|
||||||
"sha256:d61b14a9090da77fe87e38ba4c6c43d3533dcbeb5d84f5474e7ac63c532dcc9c",
|
"sha256:fac513a9dc2a74b99abd2e17109b53945e364649ca03d9f7a0b96aa8d1807d0a",
|
||||||
"sha256:d6faf5dbefb593e127463f58076b62fcfe0784187be8fe1aa9167388f24a22a1"
|
"sha256:fdfb6ad138dbbf92b5dbea3576d7c8ba7463173f7d2cb0ca1bd336ec88ddbd80"
|
||||||
],
|
],
|
||||||
"version": "==3.11.2"
|
"version": "==3.11.3"
|
||||||
},
|
},
|
||||||
"py": {
|
"py": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -648,11 +685,11 @@
|
||||||
},
|
},
|
||||||
"pytest": {
|
"pytest": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:1d122e8be54d1a709e56f82e2d85dcba3018313d64647f38a91aec88c239b600",
|
"sha256:0d5fe9189a148acc3c3eb2ac8e1ac0742cb7618c084f3d228baaec0c254b318d",
|
||||||
"sha256:c13d1943c63e599b98cf118fcb9703e4d7bde7caa9a432567bcdcae4bf512d20"
|
"sha256:ff615c761e25eb25df19edddc0b970302d2a9091fbce0e7213298d85fb61fef6"
|
||||||
],
|
],
|
||||||
"index": "pypi",
|
"index": "pypi",
|
||||||
"version": "==5.3.4"
|
"version": "==5.3.5"
|
||||||
},
|
},
|
||||||
"pyyaml": {
|
"pyyaml": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -686,10 +723,10 @@
|
||||||
},
|
},
|
||||||
"virtualenv": {
|
"virtualenv": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:0d62c70883c0342d59c11d0ddac0d954d0431321a41ab20851facf2b222598f3",
|
"sha256:30ea90b21dabd11da5f509710ad3be2ae47d40ccbc717dfdd2efe4367c10f598",
|
||||||
"sha256:55059a7a676e4e19498f1aad09b8313a38fcc0cdbe4fdddc0e9b06946d21b4bb"
|
"sha256:4a36a96d785428278edd389d9c36d763c5755844beb7509279194647b1ef47f1"
|
||||||
],
|
],
|
||||||
"version": "==16.7.9"
|
"version": "==20.0.7"
|
||||||
},
|
},
|
||||||
"wcwidth": {
|
"wcwidth": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -700,10 +737,10 @@
|
||||||
},
|
},
|
||||||
"zipp": {
|
"zipp": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:b338014b9bc7102ca69e0fb96ed07215a8954d2989bc5d83658494ab2ba634af",
|
"sha256:12248a63bbdf7548f89cb4c7cda4681e537031eda29c02ea29674bc6854460c2",
|
||||||
"sha256:e013e7800f60ec4dde789ebf4e9f7a54236e4bbf5df2a1a4e20ce9e1d9609d67"
|
"sha256:7c0f8e91abc0dc07a5068f315c52cb30c66bfbc581e5b50704c8a2f6ebae794a"
|
||||||
],
|
],
|
||||||
"version": "==2.0.1"
|
"version": "==3.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -146,8 +146,9 @@ def start_streamer(stream: Any, handler: Callable[[core_pb2.Event], None]) -> No
|
||||||
:param handler: function that handles an event
|
:param handler: function that handles an event
|
||||||
:return: nothing
|
:return: nothing
|
||||||
"""
|
"""
|
||||||
thread = threading.Thread(target=stream_listener, args=(stream, handler))
|
thread = threading.Thread(
|
||||||
thread.daemon = True
|
target=stream_listener, args=(stream, handler), daemon=True
|
||||||
|
)
|
||||||
thread.start()
|
thread.start()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -949,11 +949,10 @@ class CoreHandler(socketserver.BaseRequestHandler):
|
||||||
file_name,
|
file_name,
|
||||||
{"__file__": file_name, "coreemu": self.coreemu},
|
{"__file__": file_name, "coreemu": self.coreemu},
|
||||||
),
|
),
|
||||||
|
daemon=True,
|
||||||
)
|
)
|
||||||
thread.daemon = True
|
|
||||||
thread.start()
|
thread.start()
|
||||||
# allow time for session creation
|
thread.join()
|
||||||
time.sleep(0.25)
|
|
||||||
|
|
||||||
if message.flags & MessageFlags.STRING.value:
|
if message.flags & MessageFlags.STRING.value:
|
||||||
new_session_ids = set(self.coreemu.sessions.keys())
|
new_session_ids = set(self.coreemu.sessions.keys())
|
||||||
|
@ -1128,7 +1127,6 @@ class CoreHandler(socketserver.BaseRequestHandler):
|
||||||
self.session.location.refgeo,
|
self.session.location.refgeo,
|
||||||
self.session.location.refscale,
|
self.session.location.refscale,
|
||||||
)
|
)
|
||||||
logging.info("location configured: UTM%s", self.session.location.refutm)
|
|
||||||
|
|
||||||
def handle_config_metadata(self, message_type, config_data):
|
def handle_config_metadata(self, message_type, config_data):
|
||||||
replies = []
|
replies = []
|
||||||
|
|
|
@ -328,7 +328,6 @@ class EmaneManager(ModelManager):
|
||||||
nems = []
|
nems = []
|
||||||
with self._emane_node_lock:
|
with self._emane_node_lock:
|
||||||
self.buildxml()
|
self.buildxml()
|
||||||
self.initeventservice()
|
|
||||||
self.starteventmonitor()
|
self.starteventmonitor()
|
||||||
|
|
||||||
if self.numnems() > 0:
|
if self.numnems() > 0:
|
||||||
|
@ -683,8 +682,9 @@ class EmaneManager(ModelManager):
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
self.doeventloop = True
|
self.doeventloop = True
|
||||||
self.eventmonthread = threading.Thread(target=self.eventmonitorloop)
|
self.eventmonthread = threading.Thread(
|
||||||
self.eventmonthread.daemon = True
|
target=self.eventmonitorloop, daemon=True
|
||||||
|
)
|
||||||
self.eventmonthread.start()
|
self.eventmonthread.start()
|
||||||
|
|
||||||
def stopeventmonitor(self) -> None:
|
def stopeventmonitor(self) -> None:
|
||||||
|
|
|
@ -37,8 +37,8 @@ from core.emulator.emudata import (
|
||||||
from core.emulator.enumerations import EventTypes, ExceptionLevels, LinkTypes, NodeTypes
|
from core.emulator.enumerations import EventTypes, ExceptionLevels, LinkTypes, NodeTypes
|
||||||
from core.emulator.sessionconfig import SessionConfig
|
from core.emulator.sessionconfig import SessionConfig
|
||||||
from core.errors import CoreError
|
from core.errors import CoreError
|
||||||
from core.location.corelocation import CoreLocation
|
|
||||||
from core.location.event import EventLoop
|
from core.location.event import EventLoop
|
||||||
|
from core.location.geo import GeoLocation
|
||||||
from core.location.mobility import BasicRangeModel, MobilityManager
|
from core.location.mobility import BasicRangeModel, MobilityManager
|
||||||
from core.nodes.base import CoreNetworkBase, CoreNode, CoreNodeBase, NodeBase
|
from core.nodes.base import CoreNetworkBase, CoreNode, CoreNodeBase, NodeBase
|
||||||
from core.nodes.docker import DockerNode
|
from core.nodes.docker import DockerNode
|
||||||
|
@ -146,7 +146,7 @@ class Session:
|
||||||
self.distributed = DistributedController(self)
|
self.distributed = DistributedController(self)
|
||||||
|
|
||||||
# initialize session feature helpers
|
# initialize session feature helpers
|
||||||
self.location = CoreLocation()
|
self.location = GeoLocation()
|
||||||
self.mobility = MobilityManager(session=self)
|
self.mobility = MobilityManager(session=self)
|
||||||
self.services = CoreServices(session=self)
|
self.services = CoreServices(session=self)
|
||||||
self.emane = EmaneManager(session=self)
|
self.emane = EmaneManager(session=self)
|
||||||
|
|
|
@ -1,279 +0,0 @@
|
||||||
"""
|
|
||||||
location.py: definition of CoreLocation class that is a member of the
|
|
||||||
Session object. Provides conversions between Cartesian and geographic coordinate
|
|
||||||
systems. Depends on utm contributed module, from
|
|
||||||
https://pypi.python.org/pypi/utm (version 0.3.0).
|
|
||||||
"""
|
|
||||||
|
|
||||||
import logging
|
|
||||||
from typing import Optional, Tuple
|
|
||||||
|
|
||||||
from core.emulator.enumerations import RegisterTlvs
|
|
||||||
from core.location import utm
|
|
||||||
|
|
||||||
|
|
||||||
class CoreLocation:
|
|
||||||
"""
|
|
||||||
Member of session class for handling global location data. This keeps
|
|
||||||
track of a latitude/longitude/altitude reference point and scale in
|
|
||||||
order to convert between X,Y and geo coordinates.
|
|
||||||
"""
|
|
||||||
|
|
||||||
name = "location"
|
|
||||||
config_type = RegisterTlvs.UTILITY.value
|
|
||||||
|
|
||||||
def __init__(self) -> None:
|
|
||||||
"""
|
|
||||||
Creates a MobilityManager instance.
|
|
||||||
|
|
||||||
:return: nothing
|
|
||||||
"""
|
|
||||||
# ConfigurableManager.__init__(self)
|
|
||||||
self.reset()
|
|
||||||
self.zonemap = {}
|
|
||||||
self.refxyz = (0.0, 0.0, 0.0)
|
|
||||||
self.refscale = 1.0
|
|
||||||
self.zoneshifts = {}
|
|
||||||
self.refgeo = (0.0, 0.0, 0.0)
|
|
||||||
for n, l in utm.ZONE_LETTERS:
|
|
||||||
self.zonemap[l] = n
|
|
||||||
|
|
||||||
def reset(self) -> None:
|
|
||||||
"""
|
|
||||||
Reset to initial state.
|
|
||||||
"""
|
|
||||||
# (x, y, z) coordinates of the point given by self.refgeo
|
|
||||||
self.refxyz = (0.0, 0.0, 0.0)
|
|
||||||
# decimal latitude, longitude, and altitude at the point (x, y, z)
|
|
||||||
self.setrefgeo(0.0, 0.0, 0.0)
|
|
||||||
# 100 pixels equals this many meters
|
|
||||||
self.refscale = 1.0
|
|
||||||
# cached distance to refpt in other zones
|
|
||||||
self.zoneshifts = {}
|
|
||||||
|
|
||||||
def px2m(self, val: float) -> float:
|
|
||||||
"""
|
|
||||||
Convert the specified value in pixels to meters using the
|
|
||||||
configured scale. The scale is given as s, where
|
|
||||||
100 pixels = s meters.
|
|
||||||
|
|
||||||
:param val: value to use in converting to meters
|
|
||||||
:return: value converted to meters
|
|
||||||
"""
|
|
||||||
return (val / 100.0) * self.refscale
|
|
||||||
|
|
||||||
def m2px(self, val: float) -> float:
|
|
||||||
"""
|
|
||||||
Convert the specified value in meters to pixels using the
|
|
||||||
configured scale. The scale is given as s, where
|
|
||||||
100 pixels = s meters.
|
|
||||||
|
|
||||||
:param val: value to convert to pixels
|
|
||||||
:return: value converted to pixels
|
|
||||||
"""
|
|
||||||
if self.refscale == 0.0:
|
|
||||||
return 0.0
|
|
||||||
return 100.0 * (val / self.refscale)
|
|
||||||
|
|
||||||
def setrefgeo(self, lat: float, lon: float, alt: float) -> None:
|
|
||||||
"""
|
|
||||||
Record the geographical reference point decimal (lat, lon, alt)
|
|
||||||
and convert and store its UTM equivalent for later use.
|
|
||||||
|
|
||||||
:param lat: latitude
|
|
||||||
:param lon: longitude
|
|
||||||
:param alt: altitude
|
|
||||||
:return: nothing
|
|
||||||
"""
|
|
||||||
self.refgeo = (lat, lon, alt)
|
|
||||||
# easting, northing, zone
|
|
||||||
e, n, zonen, zonel = utm.from_latlon(lat, lon)
|
|
||||||
self.refutm = ((zonen, zonel), e, n, alt)
|
|
||||||
|
|
||||||
def getgeo(self, x: float, y: float, z: float) -> Tuple[float, float, float]:
|
|
||||||
"""
|
|
||||||
Given (x, y, z) Cartesian coordinates, convert them to latitude,
|
|
||||||
longitude, and altitude based on the configured reference point
|
|
||||||
and scale.
|
|
||||||
|
|
||||||
:param x: x value
|
|
||||||
:param y: y value
|
|
||||||
:param z: z value
|
|
||||||
:return: lat, lon, alt values for provided coordinates
|
|
||||||
"""
|
|
||||||
# shift (x,y,z) over to reference point (x,y,z)
|
|
||||||
x -= self.refxyz[0]
|
|
||||||
y = -(y - self.refxyz[1])
|
|
||||||
if z is None:
|
|
||||||
z = self.refxyz[2]
|
|
||||||
else:
|
|
||||||
z -= self.refxyz[2]
|
|
||||||
# use UTM coordinates since unit is meters
|
|
||||||
zone = self.refutm[0]
|
|
||||||
if zone == "":
|
|
||||||
raise ValueError("reference point not configured")
|
|
||||||
e = self.refutm[1] + self.px2m(x)
|
|
||||||
n = self.refutm[2] + self.px2m(y)
|
|
||||||
alt = self.refutm[3] + self.px2m(z)
|
|
||||||
(e, n, zone) = self.getutmzoneshift(e, n)
|
|
||||||
try:
|
|
||||||
lat, lon = utm.to_latlon(e, n, zone[0], zone[1])
|
|
||||||
except utm.OutOfRangeError:
|
|
||||||
logging.exception(
|
|
||||||
"UTM out of range error for n=%s zone=%s xyz=(%s,%s,%s)",
|
|
||||||
n,
|
|
||||||
zone,
|
|
||||||
x,
|
|
||||||
y,
|
|
||||||
z,
|
|
||||||
)
|
|
||||||
lat, lon = self.refgeo[:2]
|
|
||||||
return lat, lon, alt
|
|
||||||
|
|
||||||
def getxyz(self, lat: float, lon: float, alt: float) -> Tuple[float, float, float]:
|
|
||||||
"""
|
|
||||||
Given latitude, longitude, and altitude location data, convert them
|
|
||||||
to (x, y, z) Cartesian coordinates based on the configured
|
|
||||||
reference point and scale. Lat/lon is converted to UTM meter
|
|
||||||
coordinates, UTM zones are accounted for, and the scale turns
|
|
||||||
meters to pixels.
|
|
||||||
|
|
||||||
:param lat: latitude
|
|
||||||
:param lon: longitude
|
|
||||||
:param alt: altitude
|
|
||||||
:return: converted x, y, z coordinates
|
|
||||||
"""
|
|
||||||
# convert lat/lon to UTM coordinates in meters
|
|
||||||
e, n, zonen, zonel = utm.from_latlon(lat, lon)
|
|
||||||
_rlat, _rlon, ralt = self.refgeo
|
|
||||||
xshift = self.geteastingshift(zonen, zonel)
|
|
||||||
if xshift is None:
|
|
||||||
xm = e - self.refutm[1]
|
|
||||||
else:
|
|
||||||
xm = e + xshift
|
|
||||||
yshift = self.getnorthingshift(zonen, zonel)
|
|
||||||
if yshift is None:
|
|
||||||
ym = n - self.refutm[2]
|
|
||||||
else:
|
|
||||||
ym = n + yshift
|
|
||||||
zm = alt - ralt
|
|
||||||
|
|
||||||
# shift (x,y,z) over to reference point (x,y,z)
|
|
||||||
x = self.m2px(xm) + self.refxyz[0]
|
|
||||||
y = -(self.m2px(ym) + self.refxyz[1])
|
|
||||||
z = self.m2px(zm) + self.refxyz[2]
|
|
||||||
return x, y, z
|
|
||||||
|
|
||||||
def geteastingshift(self, zonen: float, zonel: float) -> Optional[float]:
|
|
||||||
"""
|
|
||||||
If the lat, lon coordinates being converted are located in a
|
|
||||||
different UTM zone than the canvas reference point, the UTM meters
|
|
||||||
may need to be shifted.
|
|
||||||
This picks a reference point in the same longitudinal band
|
|
||||||
(UTM zone number) as the provided zone, to calculate the shift in
|
|
||||||
meters for the x coordinate.
|
|
||||||
|
|
||||||
:param zonen: zonen
|
|
||||||
:param zonel: zone1
|
|
||||||
:return: the x shift value
|
|
||||||
"""
|
|
||||||
rzonen = int(self.refutm[0][0])
|
|
||||||
# same zone number, no x shift required
|
|
||||||
if zonen == rzonen:
|
|
||||||
return None
|
|
||||||
z = (zonen, zonel)
|
|
||||||
# x shift already calculated, cached
|
|
||||||
if z in self.zoneshifts and self.zoneshifts[z][0] is not None:
|
|
||||||
return self.zoneshifts[z][0]
|
|
||||||
|
|
||||||
rlat, rlon, _ralt = self.refgeo
|
|
||||||
# ea. zone is 6deg band
|
|
||||||
lon2 = rlon + 6 * (zonen - rzonen)
|
|
||||||
# ignore northing
|
|
||||||
e2, _n2, _zonen2, _zonel2 = utm.from_latlon(rlat, lon2)
|
|
||||||
# NOTE: great circle distance used here, not reference ellipsoid!
|
|
||||||
xshift = utm.haversine(rlon, rlat, lon2, rlat) - e2
|
|
||||||
# cache the return value
|
|
||||||
yshift = None
|
|
||||||
if z in self.zoneshifts:
|
|
||||||
yshift = self.zoneshifts[z][1]
|
|
||||||
self.zoneshifts[z] = (xshift, yshift)
|
|
||||||
return xshift
|
|
||||||
|
|
||||||
def getnorthingshift(self, zonen: float, zonel: float) -> Optional[float]:
|
|
||||||
"""
|
|
||||||
If the lat, lon coordinates being converted are located in a
|
|
||||||
different UTM zone than the canvas reference point, the UTM meters
|
|
||||||
may need to be shifted.
|
|
||||||
This picks a reference point in the same latitude band (UTM zone letter)
|
|
||||||
as the provided zone, to calculate the shift in meters for the
|
|
||||||
y coordinate.
|
|
||||||
|
|
||||||
:param zonen: zonen
|
|
||||||
:param zonel: zone1
|
|
||||||
:return: calculated y shift
|
|
||||||
"""
|
|
||||||
rzonel = self.refutm[0][1]
|
|
||||||
# same zone letter, no y shift required
|
|
||||||
if zonel == rzonel:
|
|
||||||
return None
|
|
||||||
z = (zonen, zonel)
|
|
||||||
# y shift already calculated, cached
|
|
||||||
if z in self.zoneshifts and self.zoneshifts[z][1] is not None:
|
|
||||||
return self.zoneshifts[z][1]
|
|
||||||
|
|
||||||
rlat, rlon, _ralt = self.refgeo
|
|
||||||
# zonemap is used to calculate degrees difference between zone letters
|
|
||||||
latshift = self.zonemap[zonel] - self.zonemap[rzonel]
|
|
||||||
# ea. latitude band is 8deg high
|
|
||||||
lat2 = rlat + latshift
|
|
||||||
_e2, n2, _zonen2, _zonel2 = utm.from_latlon(lat2, rlon)
|
|
||||||
# NOTE: great circle distance used here, not reference ellipsoid
|
|
||||||
yshift = -(utm.haversine(rlon, rlat, rlon, lat2) + n2)
|
|
||||||
# cache the return value
|
|
||||||
xshift = None
|
|
||||||
if z in self.zoneshifts:
|
|
||||||
xshift = self.zoneshifts[z][0]
|
|
||||||
self.zoneshifts[z] = (xshift, yshift)
|
|
||||||
return yshift
|
|
||||||
|
|
||||||
def getutmzoneshift(
|
|
||||||
self, e: float, n: float
|
|
||||||
) -> Tuple[float, float, Tuple[float, str]]:
|
|
||||||
"""
|
|
||||||
Given UTM easting and northing values, check if they fall outside
|
|
||||||
the reference point's zone boundary. Return the UTM coordinates in a
|
|
||||||
different zone and the new zone if they do. Zone lettering is only
|
|
||||||
changed when the reference point is in the opposite hemisphere.
|
|
||||||
|
|
||||||
:param e: easting value
|
|
||||||
:param n: northing value
|
|
||||||
:return: modified easting, northing, and zone values
|
|
||||||
"""
|
|
||||||
zone = self.refutm[0]
|
|
||||||
rlat, rlon, _ralt = self.refgeo
|
|
||||||
if e > 834000 or e < 166000:
|
|
||||||
num_zones = (int(e) - 166000) / (utm.R / 10)
|
|
||||||
# estimate number of zones to shift, E (positive) or W (negative)
|
|
||||||
rlon2 = self.refgeo[1] + (num_zones * 6)
|
|
||||||
_e2, _n2, zonen2, zonel2 = utm.from_latlon(rlat, rlon2)
|
|
||||||
xshift = utm.haversine(rlon, rlat, rlon2, rlat)
|
|
||||||
# after >3 zones away from refpt, the above estimate won't work
|
|
||||||
# (the above estimate could be improved)
|
|
||||||
if not 100000 <= (e - xshift) < 1000000:
|
|
||||||
# move one more zone away
|
|
||||||
num_zones = (abs(num_zones) + 1) * (abs(num_zones) / num_zones)
|
|
||||||
rlon2 = self.refgeo[1] + (num_zones * 6)
|
|
||||||
_e2, _n2, zonen2, zonel2 = utm.from_latlon(rlat, rlon2)
|
|
||||||
xshift = utm.haversine(rlon, rlat, rlon2, rlat)
|
|
||||||
e = e - xshift
|
|
||||||
zone = (zonen2, zonel2)
|
|
||||||
if n < 0:
|
|
||||||
# refpt in northern hemisphere and we crossed south of equator
|
|
||||||
n += 10000000
|
|
||||||
zone = (zone[0], "M")
|
|
||||||
elif n > 10000000:
|
|
||||||
# refpt in southern hemisphere and we crossed north of equator
|
|
||||||
n -= 10000000
|
|
||||||
zone = (zone[0], "N")
|
|
||||||
return e, n, zone
|
|
124
daemon/core/location/geo.py
Normal file
124
daemon/core/location/geo.py
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
"""
|
||||||
|
Provides conversions from x,y,z to lon,lat,alt.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import logging
|
||||||
|
from typing import Tuple
|
||||||
|
|
||||||
|
import pyproj
|
||||||
|
|
||||||
|
from core.emulator.enumerations import RegisterTlvs
|
||||||
|
|
||||||
|
SCALE_FACTOR = 100.0
|
||||||
|
CRS_WGS84 = 4326
|
||||||
|
CRS_PROJ = 3857
|
||||||
|
|
||||||
|
|
||||||
|
class GeoLocation:
|
||||||
|
"""
|
||||||
|
Provides logic to convert x,y,z coordinates to lon,lat,alt using
|
||||||
|
defined projections.
|
||||||
|
"""
|
||||||
|
|
||||||
|
name = "location"
|
||||||
|
config_type = RegisterTlvs.UTILITY.value
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
|
"""
|
||||||
|
Creates a GeoLocation instance.
|
||||||
|
"""
|
||||||
|
self.to_pixels = pyproj.Transformer.from_crs(
|
||||||
|
CRS_WGS84, CRS_PROJ, always_xy=True
|
||||||
|
)
|
||||||
|
self.to_geo = pyproj.Transformer.from_crs(CRS_PROJ, CRS_WGS84, always_xy=True)
|
||||||
|
self.refproj = (0.0, 0.0)
|
||||||
|
self.refgeo = (0.0, 0.0, 0.0)
|
||||||
|
self.refxyz = (0.0, 0.0, 0.0)
|
||||||
|
self.refscale = 1.0
|
||||||
|
|
||||||
|
def setrefgeo(self, lat: float, lon: float, alt: float) -> None:
|
||||||
|
"""
|
||||||
|
Set the geospatial reference point.
|
||||||
|
|
||||||
|
:param lat: latitude reference
|
||||||
|
:param lon: longitude reference
|
||||||
|
:param alt: altitude reference
|
||||||
|
:return: nothing
|
||||||
|
"""
|
||||||
|
self.refgeo = (lat, lon, alt)
|
||||||
|
px, py = self.to_pixels.transform(lon, lat)
|
||||||
|
self.refproj = (px, py, alt)
|
||||||
|
|
||||||
|
def reset(self) -> None:
|
||||||
|
"""
|
||||||
|
Reset reference data to default values.
|
||||||
|
|
||||||
|
:return: nothing
|
||||||
|
"""
|
||||||
|
self.refxyz = (0.0, 0.0, 0.0)
|
||||||
|
self.refgeo = (0.0, 0.0, 0.0)
|
||||||
|
self.refscale = 1.0
|
||||||
|
self.refproj = self.to_pixels.transform(self.refgeo[0], self.refgeo[1])
|
||||||
|
|
||||||
|
def pixels2meters(self, value: float) -> float:
|
||||||
|
"""
|
||||||
|
Provides conversion from pixels to meters.
|
||||||
|
|
||||||
|
:param value: pixels value
|
||||||
|
:return: pixels value in meters
|
||||||
|
"""
|
||||||
|
return (value / SCALE_FACTOR) * self.refscale
|
||||||
|
|
||||||
|
def meters2pixels(self, value: float) -> float:
|
||||||
|
"""
|
||||||
|
Provides conversion from meters to pixels.
|
||||||
|
|
||||||
|
:param value: meters value
|
||||||
|
:return: meters value in pixels
|
||||||
|
"""
|
||||||
|
if self.refscale == 0.0:
|
||||||
|
return 0.0
|
||||||
|
return SCALE_FACTOR * (value / self.refscale)
|
||||||
|
|
||||||
|
def getxyz(self, lat: float, lon: float, alt: float) -> Tuple[float, float, float]:
|
||||||
|
"""
|
||||||
|
Convert provided lon,lat,alt to x,y,z.
|
||||||
|
|
||||||
|
:param lat: latitude value
|
||||||
|
:param lon: longitude value
|
||||||
|
:param alt: altitude value
|
||||||
|
:return: x,y,z representation of provided values
|
||||||
|
"""
|
||||||
|
logging.debug("input lon,lat,alt(%s, %s, %s)", lon, lat, alt)
|
||||||
|
px, py = self.to_pixels.transform(lon, lat)
|
||||||
|
px -= self.refproj[0]
|
||||||
|
py -= self.refproj[1]
|
||||||
|
pz = alt - self.refproj[2]
|
||||||
|
x = self.meters2pixels(px) + self.refxyz[0]
|
||||||
|
y = -(self.meters2pixels(py) + self.refxyz[1])
|
||||||
|
z = self.meters2pixels(pz) + self.refxyz[2]
|
||||||
|
logging.debug("result x,y,z(%s, %s, %s)", x, y, z)
|
||||||
|
return x, y, z
|
||||||
|
|
||||||
|
def getgeo(self, x: float, y: float, z: float) -> Tuple[float, float, float]:
|
||||||
|
"""
|
||||||
|
Convert provided x,y,z to lon,lat,alt.
|
||||||
|
|
||||||
|
:param x: x value
|
||||||
|
:param y: y value
|
||||||
|
:param z: z value
|
||||||
|
:return: lat,lon,alt representation of provided values
|
||||||
|
"""
|
||||||
|
logging.debug("input x,y(%s, %s)", x, y)
|
||||||
|
x -= self.refxyz[0]
|
||||||
|
y = -(y - self.refxyz[1])
|
||||||
|
if z is None:
|
||||||
|
z = self.refxyz[2]
|
||||||
|
else:
|
||||||
|
z -= self.refxyz[2]
|
||||||
|
px = self.refproj[0] + self.pixels2meters(x)
|
||||||
|
py = self.refproj[1] + self.pixels2meters(y)
|
||||||
|
lon, lat = self.to_geo.transform(px, py)
|
||||||
|
alt = self.refgeo[2] + self.pixels2meters(z)
|
||||||
|
logging.debug("result lon,lat,alt(%s, %s, %s)", lon, lat, alt)
|
||||||
|
return lat, lon, alt
|
|
@ -1,259 +0,0 @@
|
||||||
"""
|
|
||||||
utm
|
|
||||||
===
|
|
||||||
|
|
||||||
.. image:: https://travis-ci.org/Turbo87/utm.png
|
|
||||||
|
|
||||||
Bidirectional UTM-WGS84 converter for python
|
|
||||||
|
|
||||||
Usage
|
|
||||||
-----
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
import utm
|
|
||||||
|
|
||||||
Convert a (latitude, longitude) tuple into an UTM coordinate::
|
|
||||||
|
|
||||||
utm.from_latlon(51.2, 7.5)
|
|
||||||
>>> (395201.3103811303, 5673135.241182375, 32, 'U')
|
|
||||||
|
|
||||||
Convert an UTM coordinate into a (latitude, longitude) tuple::
|
|
||||||
|
|
||||||
utm.to_latlon(340000, 5710000, 32, 'U')
|
|
||||||
>>> (51.51852098408468, 6.693872395145327)
|
|
||||||
|
|
||||||
Speed
|
|
||||||
-----
|
|
||||||
|
|
||||||
The library has been compared to the more generic pyproj library by running the
|
|
||||||
unit test suite through pyproj instead of utm. These are the results:
|
|
||||||
|
|
||||||
* with pyproj (without projection cache): 4.0 - 4.5 sec
|
|
||||||
* with pyproj (with projection cache): 0.9 - 1.0 sec
|
|
||||||
* with utm: 0.4 - 0.5 sec
|
|
||||||
|
|
||||||
Authors
|
|
||||||
-------
|
|
||||||
|
|
||||||
* Tobias Bieniek <Tobias.Bieniek@gmx.de>
|
|
||||||
|
|
||||||
License
|
|
||||||
-------
|
|
||||||
|
|
||||||
Copyright (C) 2012 Tobias Bieniek <Tobias.Bieniek@gmx.de>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import math
|
|
||||||
|
|
||||||
__all__ = ['to_latlon', 'from_latlon']
|
|
||||||
|
|
||||||
|
|
||||||
class OutOfRangeError(ValueError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
K0 = 0.9996
|
|
||||||
|
|
||||||
E = 0.00669438
|
|
||||||
E2 = E * E
|
|
||||||
E3 = E2 * E
|
|
||||||
E_P2 = E / (1.0 - E)
|
|
||||||
|
|
||||||
SQRT_E = math.sqrt(1 - E)
|
|
||||||
_E = (1 - SQRT_E) / (1 + SQRT_E)
|
|
||||||
_E3 = _E * _E * _E
|
|
||||||
_E4 = _E3 * _E
|
|
||||||
|
|
||||||
M1 = (1 - E / 4 - 3 * E2 / 64 - 5 * E3 / 256)
|
|
||||||
M2 = (3 * E / 8 + 3 * E2 / 32 + 45 * E3 / 1024)
|
|
||||||
M3 = (15 * E2 / 256 + 45 * E3 / 1024)
|
|
||||||
M4 = (35 * E3 / 3072)
|
|
||||||
|
|
||||||
P2 = (3 * _E / 2 - 27 * _E3 / 32)
|
|
||||||
P3 = (21 * _E3 / 16 - 55 * _E4 / 32)
|
|
||||||
P4 = (151 * _E3 / 96)
|
|
||||||
|
|
||||||
R = 6378137
|
|
||||||
|
|
||||||
ZONE_LETTERS = [
|
|
||||||
(84, None), (72, 'X'), (64, 'W'), (56, 'V'), (48, 'U'), (40, 'T'),
|
|
||||||
(32, 'S'), (24, 'R'), (16, 'Q'), (8, 'P'), (0, 'N'), (-8, 'M'), (-16, 'L'),
|
|
||||||
(-24, 'K'), (-32, 'J'), (-40, 'H'), (-48, 'G'), (-56, 'F'), (-64, 'E'),
|
|
||||||
(-72, 'D'), (-80, 'C')
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
def to_latlon(easting, northing, zone_number, zone_letter):
|
|
||||||
zone_letter = zone_letter.upper()
|
|
||||||
|
|
||||||
if not 100000 <= easting < 1000000:
|
|
||||||
raise OutOfRangeError('easting out of range (must be between 100.000 m and 999.999 m)')
|
|
||||||
if not 0 <= northing <= 10000000:
|
|
||||||
raise OutOfRangeError('northing out of range (must be between 0 m and 10.000.000 m)')
|
|
||||||
if not 1 <= zone_number <= 60:
|
|
||||||
raise OutOfRangeError('zone number out of range (must be between 1 and 60)')
|
|
||||||
if not 'C' <= zone_letter <= 'X' or zone_letter in ['I', 'O']:
|
|
||||||
raise OutOfRangeError('zone letter out of range (must be between C and X)')
|
|
||||||
|
|
||||||
x = easting - 500000
|
|
||||||
y = northing
|
|
||||||
|
|
||||||
if zone_letter < 'N':
|
|
||||||
y -= 10000000
|
|
||||||
|
|
||||||
m = y / K0
|
|
||||||
mu = m / (R * M1)
|
|
||||||
|
|
||||||
p_rad = (mu + P2 * math.sin(2 * mu) + P3 * math.sin(4 * mu) + P4 * math.sin(6 * mu))
|
|
||||||
|
|
||||||
p_sin = math.sin(p_rad)
|
|
||||||
p_sin2 = p_sin * p_sin
|
|
||||||
|
|
||||||
p_cos = math.cos(p_rad)
|
|
||||||
|
|
||||||
p_tan = p_sin / p_cos
|
|
||||||
p_tan2 = p_tan * p_tan
|
|
||||||
p_tan4 = p_tan2 * p_tan2
|
|
||||||
|
|
||||||
ep_sin = 1 - E * p_sin2
|
|
||||||
ep_sin_sqrt = math.sqrt(1 - E * p_sin2)
|
|
||||||
|
|
||||||
n = R / ep_sin_sqrt
|
|
||||||
r = (1 - E) / ep_sin
|
|
||||||
|
|
||||||
c = _E * p_cos ** 2
|
|
||||||
c2 = c * c
|
|
||||||
|
|
||||||
d = x / (n * K0)
|
|
||||||
d2 = d * d
|
|
||||||
d3 = d2 * d
|
|
||||||
d4 = d3 * d
|
|
||||||
d5 = d4 * d
|
|
||||||
d6 = d5 * d
|
|
||||||
|
|
||||||
latitude = (p_rad - (p_tan / r) *
|
|
||||||
(d2 / 2 -
|
|
||||||
d4 / 24 * (5 + 3 * p_tan2 + 10 * c - 4 * c2 - 9 * E_P2)) +
|
|
||||||
d6 / 720 * (61 + 90 * p_tan2 + 298 * c + 45 * p_tan4 - 252 * E_P2 - 3 * c2))
|
|
||||||
|
|
||||||
longitude = (d -
|
|
||||||
d3 / 6 * (1 + 2 * p_tan2 + c) +
|
|
||||||
d5 / 120 * (5 - 2 * c + 28 * p_tan2 - 3 * c2 + 8 * E_P2 + 24 * p_tan4)) / p_cos
|
|
||||||
|
|
||||||
return (math.degrees(latitude),
|
|
||||||
math.degrees(longitude) + zone_number_to_central_longitude(zone_number))
|
|
||||||
|
|
||||||
|
|
||||||
def from_latlon(latitude, longitude):
|
|
||||||
if not -80.0 <= latitude <= 84.0:
|
|
||||||
raise OutOfRangeError('latitude out of range (must be between 80 deg S and 84 deg N)')
|
|
||||||
if not -180.0 <= longitude <= 180.0:
|
|
||||||
raise OutOfRangeError('northing out of range (must be between 180 deg W and 180 deg E)')
|
|
||||||
|
|
||||||
lat_rad = math.radians(latitude)
|
|
||||||
lat_sin = math.sin(lat_rad)
|
|
||||||
lat_cos = math.cos(lat_rad)
|
|
||||||
|
|
||||||
lat_tan = lat_sin / lat_cos
|
|
||||||
lat_tan2 = lat_tan * lat_tan
|
|
||||||
lat_tan4 = lat_tan2 * lat_tan2
|
|
||||||
|
|
||||||
lon_rad = math.radians(longitude)
|
|
||||||
|
|
||||||
zone_number = latlon_to_zone_number(latitude, longitude)
|
|
||||||
central_lon = zone_number_to_central_longitude(zone_number)
|
|
||||||
central_lon_rad = math.radians(central_lon)
|
|
||||||
|
|
||||||
zone_letter = latitude_to_zone_letter(latitude)
|
|
||||||
|
|
||||||
n = R / math.sqrt(1 - E * lat_sin ** 2)
|
|
||||||
c = E_P2 * lat_cos ** 2
|
|
||||||
|
|
||||||
a = lat_cos * (lon_rad - central_lon_rad)
|
|
||||||
a2 = a * a
|
|
||||||
a3 = a2 * a
|
|
||||||
a4 = a3 * a
|
|
||||||
a5 = a4 * a
|
|
||||||
a6 = a5 * a
|
|
||||||
|
|
||||||
m = R * (M1 * lat_rad -
|
|
||||||
M2 * math.sin(2 * lat_rad) +
|
|
||||||
M3 * math.sin(4 * lat_rad) -
|
|
||||||
M4 * math.sin(6 * lat_rad))
|
|
||||||
|
|
||||||
easting = K0 * n * (a +
|
|
||||||
a3 / 6 * (1 - lat_tan2 + c) +
|
|
||||||
a5 / 120 * (5 - 18 * lat_tan2 + lat_tan4 + 72 * c - 58 * E_P2)) + 500000
|
|
||||||
|
|
||||||
northing = K0 * (m + n * lat_tan * (a2 / 2 +
|
|
||||||
a4 / 24 * (5 - lat_tan2 + 9 * c + 4 * c ** 2) +
|
|
||||||
a6 / 720 * (61 - 58 * lat_tan2 + lat_tan4 + 600 * c - 330 * E_P2)))
|
|
||||||
|
|
||||||
if latitude < 0:
|
|
||||||
northing += 10000000
|
|
||||||
|
|
||||||
return easting, northing, zone_number, zone_letter
|
|
||||||
|
|
||||||
|
|
||||||
def latitude_to_zone_letter(latitude):
|
|
||||||
for lat_min, zone_letter in ZONE_LETTERS:
|
|
||||||
if latitude >= lat_min:
|
|
||||||
return zone_letter
|
|
||||||
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def latlon_to_zone_number(latitude, longitude):
|
|
||||||
if 56 <= latitude <= 64 and 3 <= longitude <= 12:
|
|
||||||
return 32
|
|
||||||
|
|
||||||
if 72 <= latitude <= 84 and longitude >= 0:
|
|
||||||
if longitude <= 9:
|
|
||||||
return 31
|
|
||||||
elif longitude <= 21:
|
|
||||||
return 33
|
|
||||||
elif longitude <= 33:
|
|
||||||
return 35
|
|
||||||
elif longitude <= 42:
|
|
||||||
return 37
|
|
||||||
|
|
||||||
return int((longitude + 180) / 6) + 1
|
|
||||||
|
|
||||||
|
|
||||||
def zone_number_to_central_longitude(zone_number):
|
|
||||||
return (zone_number - 1) * 6 - 180 + 3
|
|
||||||
|
|
||||||
|
|
||||||
def haversine(lon1, lat1, lon2, lat2):
|
|
||||||
"""
|
|
||||||
Calculate the great circle distance between two points
|
|
||||||
on the earth (specified in decimal degrees)
|
|
||||||
"""
|
|
||||||
# convert decimal degrees to radians
|
|
||||||
lon1, lat1, lon2, lat2 = map(math.radians, [lon1, lat1, lon2, lat2])
|
|
||||||
# haversine formula
|
|
||||||
dlon = lon2 - lon1
|
|
||||||
dlat = lat2 - lat1
|
|
||||||
a = math.sin(dlat / 2) ** 2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon / 2) ** 2
|
|
||||||
c = 2 * math.asin(math.sqrt(a))
|
|
||||||
m = 6367000 * c
|
|
||||||
return m
|
|
|
@ -70,8 +70,7 @@ class EbtablesQueue:
|
||||||
return
|
return
|
||||||
|
|
||||||
self.doupdateloop = True
|
self.doupdateloop = True
|
||||||
self.updatethread = threading.Thread(target=self.updateloop)
|
self.updatethread = threading.Thread(target=self.updateloop, daemon=True)
|
||||||
self.updatethread.daemon = True
|
|
||||||
self.updatethread.start()
|
self.updatethread.start()
|
||||||
|
|
||||||
def stopupdateloop(self, wlan: "CoreNetwork") -> None:
|
def stopupdateloop(self, wlan: "CoreNetwork") -> None:
|
||||||
|
|
|
@ -1,17 +1,18 @@
|
||||||
bcrypt==3.1.7
|
bcrypt==3.1.7
|
||||||
cffi==1.13.2
|
cffi==1.14.0
|
||||||
cryptography==2.8
|
cryptography==2.8
|
||||||
fabric==2.5.0
|
fabric==2.5.0
|
||||||
grpcio==1.26.0
|
grpcio==1.27.2
|
||||||
invoke==1.4.0
|
invoke==1.4.1
|
||||||
lxml==4.4.2
|
lxml==4.5.0
|
||||||
Mako==1.1.1
|
Mako==1.1.1
|
||||||
MarkupSafe==1.1.1
|
MarkupSafe==1.1.1
|
||||||
netaddr==0.7.19
|
netaddr==0.7.19
|
||||||
paramiko==2.7.1
|
paramiko==2.7.1
|
||||||
Pillow==7.0.0
|
Pillow==7.0.0
|
||||||
protobuf==3.11.2
|
protobuf==3.11.3
|
||||||
pycparser==2.19
|
pycparser==2.19
|
||||||
PyNaCl==1.3.0
|
PyNaCl==1.3.0
|
||||||
|
pyproj==2.5.0
|
||||||
PyYAML==5.3
|
PyYAML==5.3
|
||||||
six==1.14.0
|
six==1.14.0
|
||||||
|
|
|
@ -42,6 +42,7 @@ setup(
|
||||||
"mako",
|
"mako",
|
||||||
"pillow",
|
"pillow",
|
||||||
"protobuf",
|
"protobuf",
|
||||||
|
"pyproj",
|
||||||
"pyyaml",
|
"pyyaml",
|
||||||
],
|
],
|
||||||
tests_require=[
|
tests_require=[
|
||||||
|
|
Loading…
Reference in a new issue