From 4e10407f9f3c5d4ddeeaedfc919959029690d65f Mon Sep 17 00:00:00 2001 From: Snowsune Date: Tue, 30 Sep 2025 12:26:09 -0400 Subject: [PATCH] Inital version --- .gitignore | 38 + Pipfile | 13 + Pipfile.lock | 568 ++++ README.md | 49 + examples/Example Wave Gwinstek.CSV | 4016 ++++++++++++++++++++++++++++ examples/Example Wave OWON.CSV | 4011 +++++++++++++++++++++++++++ examples/example_usage.py | 55 + pyproject.toml | 16 + scope_parser/__init__.py | 9 + scope_parser/base_parser.py | 72 + scope_parser/data.py | 100 + scope_parser/gwinstek_parser.py | 118 + scope_parser/owon_parser.py | 107 + scope_parser/parsers.py | 19 + setup.py | 46 + 15 files changed, 9237 insertions(+) create mode 100644 .gitignore create mode 100644 Pipfile create mode 100644 Pipfile.lock create mode 100644 README.md create mode 100644 examples/Example Wave Gwinstek.CSV create mode 100644 examples/Example Wave OWON.CSV create mode 100644 examples/example_usage.py create mode 100644 pyproject.toml create mode 100644 scope_parser/__init__.py create mode 100644 scope_parser/base_parser.py create mode 100644 scope_parser/data.py create mode 100644 scope_parser/gwinstek_parser.py create mode 100644 scope_parser/owon_parser.py create mode 100644 scope_parser/parsers.py create mode 100644 setup.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d233ef2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# Distribution / packaging +.build/ +build/ +dist/ +.eggs/ +*.egg-info/ +*.egg + +# Virtual environments +.venv/ +venv/ +ENV/ + +# Test / coverage +.pytest_cache/ +.coverage* +htmlcov/ + +# IDE / editor +.vscode/ +*.code-workspace +.idea/ + +# OS files +.DS_Store +Thumbs.db + +# Jupyter +.ipynb_checkpoints/ + +# Local configs +*.env +.env.* diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..490c52c --- /dev/null +++ b/Pipfile @@ -0,0 +1,13 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +simple-scope-parser = {file = ".", editable = true} +matplotlib = "*" + +[dev-packages] + +[requires] +python_version = "3.11" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..85d0f75 --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,568 @@ +{ + "_meta": { + "hash": { + "sha256": "608eb6a78a7c634cfeda947bf7bf94e9c248bf9351248f67a75d42c82c850165" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.11" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "contourpy": { + "hashes": [ + "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", + "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", + "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", + "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a", + "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8", + "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", + "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470", + "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", + "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", + "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", + "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", + "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381", + "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", + "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", + "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", + "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f", + "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", + "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", + "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42", + "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", + "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77", + "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", + "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", + "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", + "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", + "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", + "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", + "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db", + "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", + "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620", + "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989", + "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", + "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", + "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", + "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", + "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", + "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", + "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1", + "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e", + "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", + "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", + "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", + "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7", + "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", + "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", + "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1", + "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", + "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", + "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", + "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", + "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", + "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", + "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", + "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", + "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", + "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", + "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", + "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", + "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", + "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497", + "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", + "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", + "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", + "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", + "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", + "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", + "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", + "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", + "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", + "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff", + "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", + "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a" + ], + "markers": "python_version >= '3.11'", + "version": "==1.3.3" + }, + "cycler": { + "hashes": [ + "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", + "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c" + ], + "markers": "python_version >= '3.8'", + "version": "==0.12.1" + }, + "fonttools": { + "hashes": [ + "sha256:022beaea4b73a70295b688f817ddc24ed3e3418b5036ffcd5658141184ef0d0c", + "sha256:026290e4ec76583881763fac284aca67365e0be9f13a7fb137257096114cb3bc", + "sha256:0b0835ed15dd5b40d726bb61c846a688f5b4ce2208ec68779bc81860adb5851a", + "sha256:0eae96373e4b7c9e45d099d7a523444e3554360927225c1cdae221a58a45b856", + "sha256:122e1a8ada290423c493491d002f622b1992b1ab0b488c68e31c413390dc7eb2", + "sha256:1410155d0e764a4615774e5c2c6fc516259fe3eca5882f034eb9bfdbee056259", + "sha256:145daa14bf24824b677b9357c5e44fd8895c2a8f53596e1b9ea3496081dc692c", + "sha256:1525796c3ffe27bb6268ed2a1bb0dcf214d561dfaf04728abf01489eb5339dce", + "sha256:154cb6ee417e417bf5f7c42fe25858c9140c26f647c7347c06f0cc2d47eff003", + "sha256:2299df884c11162617a66b7c316957d74a18e3758c0274762d2cc87df7bc0272", + "sha256:2409d5fb7b55fd70f715e6d34e7a6e4f7511b8ad29a49d6df225ee76da76dd77", + "sha256:268ecda8ca6cb5c4f044b1fb9b3b376e8cd1b361cef275082429dc4174907038", + "sha256:282dafa55f9659e8999110bd8ed422ebe1c8aecd0dc396550b038e6c9a08b8ea", + "sha256:2ee06fc57512144d8b0445194c2da9f190f61ad51e230f14836286470c99f854", + "sha256:3630e86c484263eaac71d117085d509cbcf7b18f677906824e4bace598fb70d2", + "sha256:398447f3d8c0c786cbf1209711e79080a40761eb44b27cdafffb48f52bcec258", + "sha256:4ba4bd646e86de16160f0fb72e31c3b9b7d0721c3e5b26b9fa2fc931dfdb2652", + "sha256:5664fd1a9ea7f244487ac8f10340c4e37664675e8667d6fee420766e0fb3cf08", + "sha256:583b7f8e3c49486e4d489ad1deacfb8d5be54a8ef34d6df824f6a171f8511d99", + "sha256:596ecaca36367027d525b3b426d8a8208169d09edcf8c7506aceb3a38bfb55c7", + "sha256:5c1015318e4fec75dd4943ad5f6a206d9727adf97410d58b7e32ab644a807914", + "sha256:66929e2ea2810c6533a5184f938502cfdaea4bc3efb7130d8cc02e1c1b4108d6", + "sha256:6ec722ee589e89a89f5b7574f5c45604030aa6ae24cb2c751e2707193b466fed", + "sha256:6f68576bb4bbf6060c7ab047b1574a1ebe5c50a17de62830079967b211059ebb", + "sha256:7473a8ed9ed09aeaa191301244a5a9dbe46fe0bf54f9d6cd21d83044c3321217", + "sha256:7b0c6d57ab00dae9529f3faf187f2254ea0aa1e04215cf2f1a8ec277c96661bc", + "sha256:7b4c32e232a71f63a5d00259ca3d88345ce2a43295bb049d21061f338124246f", + "sha256:8177ec9676ea6e1793c8a084a90b65a9f778771998eb919d05db6d4b1c0b114c", + "sha256:839565cbf14645952d933853e8ade66a463684ed6ed6c9345d0faf1f0e868877", + "sha256:875cb7764708b3132637f6c5fb385b16eeba0f7ac9fa45a69d35e09b47045801", + "sha256:8a44788d9d91df72d1a5eac49b31aeb887a5f4aab761b4cffc4196c74907ea85", + "sha256:8b4eb332f9501cb1cd3d4d099374a1e1306783ff95489a1026bde9eb02ccc34a", + "sha256:906306ac7afe2156fcf0042173d6ebbb05416af70f6b370967b47f8f00103bbb", + "sha256:992775c9fbe2cf794786fa0ffca7f09f564ba3499b8fe9f2f80bd7197db60383", + "sha256:996a4d1834524adbb423385d5a629b868ef9d774670856c63c9a0408a3063401", + "sha256:9a52f254ce051e196b8fe2af4634c2d2f02c981756c6464dc192f1b6050b4e28", + "sha256:9d0ced62b59e0430b3690dbc5373df1c2aa7585e9a8ce38eff87f0fd993c5b01", + "sha256:a140761c4ff63d0cb9256ac752f230460ee225ccef4ad8f68affc723c88e2036", + "sha256:a184b2ea57b13680ab6d5fbde99ccef152c95c06746cb7718c583abd8f945ccc", + "sha256:a3db56f153bd4c5c2b619ab02c5db5192e222150ce5a1bc10f16164714bc39ac", + "sha256:a46b2f450bc79e06ef3b6394f0c68660529ed51692606ad7f953fc2e448bc903", + "sha256:a884aef09d45ba1206712c7dbda5829562d3fea7726935d3289d343232ecb0d3", + "sha256:b2cf105cee600d2de04ca3cfa1f74f1127f8455b71dbad02b9da6ec266e116d6", + "sha256:b33a7884fabd72bdf5f910d0cf46be50dce86a0362a65cfc746a4168c67eb96c", + "sha256:b42d86938e8dda1cd9a1a87a6d82f1818eaf933348429653559a458d027446da", + "sha256:b6379e7546ba4ae4b18f8ae2b9bc5960936007a1c0e30b342f662577e8bc3299", + "sha256:c7420a2696a44650120cdd269a5d2e56a477e2bfa9d95e86229059beb1c19e15", + "sha256:c8651e0d4b3bdeda6602b85fdc2abbefc1b41e573ecb37b6779c4ca50753a199", + "sha256:d066ea419f719ed87bc2c99a4a4bfd77c2e5949cb724588b9dd58f3fd90b92bf", + "sha256:e6c58beb17380f7c2ea181ea11e7db8c0ceb474c9dd45f48e71e2cb577d146a1", + "sha256:e852d9dda9f93ad3651ae1e3bb770eac544ec93c3807888798eccddf84596537", + "sha256:ec3681a0cb34c255d76dd9d865a55f260164adb9fa02628415cdc2d43ee2c05d", + "sha256:ee0c0b3b35b34f782afc673d503167157094a16f442ace7c6c5e0ca80b08f50c", + "sha256:eedacb5c5d22b7097482fa834bda0dafa3d914a4e829ec83cdea2a01f8c813c4", + "sha256:ef00af0439ebfee806b25f24c8f92109157ff3fac5731dc7867957812e87b8d9", + "sha256:f0e8817c7d1a0c2eedebf57ef9a9896f3ea23324769a9a2061a80fe8852705ed", + "sha256:f3d5be054c461d6a2268831f04091dc82753176f6ea06dc6047a5e168265a987", + "sha256:f4b5c37a5f40e4d733d3bbaaef082149bee5a5ea3156a785ff64d949bd1353fa" + ], + "markers": "python_version >= '3.9'", + "version": "==4.60.1" + }, + "kiwisolver": { + "hashes": [ + "sha256:0749fd8f4218ad2e851e11cc4dc05c7cbc0cbc4267bdfdb31782e65aace4ee9c", + "sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7", + "sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21", + "sha256:0a590506f303f512dff6b7f75fd2fd18e16943efee932008fe7140e5fa91d80e", + "sha256:0ab74e19f6a2b027ea4f845a78827969af45ce790e6cb3e1ebab71bdf9f215ff", + "sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7", + "sha256:0e4e2bf29574a6a7b7f6cb5fa69293b9f96c928949ac4a53ba3f525dffb87f9c", + "sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26", + "sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa", + "sha256:1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f", + "sha256:1b11d6a633e4ed84fc0ddafd4ebfd8ea49b3f25082c04ad12b8315c11d504dc1", + "sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891", + "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77", + "sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543", + "sha256:2489e4e5d7ef9a1c300a5e0196e43d9c739f066ef23270607d45aba368b91f2d", + "sha256:24c175051354f4a28c5d6a31c93906dc653e2bf234e8a4bbfb964892078898ce", + "sha256:2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3", + "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60", + "sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a", + "sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089", + "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab", + "sha256:40092754720b174e6ccf9e845d0d8c7d8e12c3d71e7fc35f55f3813e96376f78", + "sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771", + "sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f", + "sha256:497d05f29a1300d14e02e6441cf0f5ee81c1ff5a304b0d9fb77423974684e08b", + "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14", + "sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32", + "sha256:4d1d9e582ad4d63062d34077a9a1e9f3c34088a2ec5135b1f7190c07cf366527", + "sha256:52a15b0f35dad39862d376df10c5230155243a2c1a436e39eb55623ccbd68185", + "sha256:540c7c72324d864406a009d72f5d6856f49693db95d1fbb46cf86febef873634", + "sha256:5656aa670507437af0207645273ccdfee4f14bacd7f7c67a4306d0dcaeaf6eed", + "sha256:5a0f2724dfd4e3b3ac5a82436a8e6fd16baa7d507117e4279b660fe8ca38a3a1", + "sha256:60c439763a969a6af93b4881db0eed8fadf93ee98e18cbc35bc8da868d0c4f0c", + "sha256:61874cdb0a36016354853593cffc38e56fc9ca5aa97d2c05d3dcf6922cd55a11", + "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752", + "sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5", + "sha256:72d0eb9fba308b8311685c2268cf7d0a0639a6cd027d8128659f72bdd8a024b4", + "sha256:767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58", + "sha256:77937e5e2a38a7b48eef0585114fe7930346993a88060d0bf886086d2aa49ef5", + "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198", + "sha256:7b4da0d01ac866a57dd61ac258c5607b4cd677f63abaec7b148354d2b2cdd536", + "sha256:7cf974dd4e35fa315563ac99d6287a1024e4dc2077b8a7d7cd3d2fb65d283134", + "sha256:84fd60810829c27ae375114cd379da1fa65e6918e1da405f356a775d49a62bcf", + "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2", + "sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2", + "sha256:85bd218b5ecfbee8c8a82e121802dcb519a86044c9c3b2e4aef02fa05c6da370", + "sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1", + "sha256:8fdca1def57a2e88ef339de1737a1449d6dbf5fab184c54a1fca01d541317154", + "sha256:90f47e70293fc3688b71271100a1a5453aa9944a81d27ff779c108372cf5567b", + "sha256:92a2f997387a1b79a75e7803aa7ded2cfbe2823852ccf1ba3bcf613b62ae3197", + "sha256:9928fe1eb816d11ae170885a74d074f57af3a0d65777ca47e9aeb854a1fba386", + "sha256:9af39d6551f97d31a4deebeac6f45b156f9755ddc59c07b402c148f5dbb6482a", + "sha256:9cf554f21be770f5111a1690d42313e140355e687e05cf82cb23d0a721a64a48", + "sha256:a30fd6fdef1430fd9e1ba7b3398b5ee4e2887783917a687d86ba69985fb08748", + "sha256:a31d512c812daea6d8b3be3b2bfcbeb091dbb09177706569bcfc6240dcf8b41c", + "sha256:a5d0432ccf1c7ab14f9949eec60c5d1f924f17c037e9f8b33352fa05799359b8", + "sha256:a60ea74330b91bd22a29638940d115df9dc00af5035a9a2a6ad9399ffb4ceca5", + "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999", + "sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369", + "sha256:b34e51affded8faee0dfdb705416153819d8ea9250bbbf7ea1b249bdeb5f1122", + "sha256:b4b4d74bda2b8ebf4da5bd42af11d02d04428b2c32846e4c2c93219df8a7987b", + "sha256:b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098", + "sha256:b78efa4c6e804ecdf727e580dbb9cba85624d2e1c6b5cb059c66290063bd99a9", + "sha256:bb4ae2b57fc1d8cbd1cf7b1d9913803681ffa903e7488012be5b76dedf49297f", + "sha256:bdd1a81a1860476eb41ac4bc1e07b3f07259e6d55bbf739b79c8aaedcf512799", + "sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028", + "sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2", + "sha256:bfc08add558155345129c7803b3671cf195e6a56e7a12f3dde7c57d9b417f525", + "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", + "sha256:c9e7cdf45d594ee04d5be1b24dd9d49f3d1590959b2271fb30b5ca2b262c00fb", + "sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872", + "sha256:cc9617b46837c6468197b5945e196ee9ca43057bb7d9d1ae688101e4e1dddf64", + "sha256:ccd09f20ccdbbd341b21a67ab50a119b64a403b09288c27481575105283c1586", + "sha256:ce6a3a4e106cf35c2d9c4fa17c05ce0b180db622736845d4315519397a77beaf", + "sha256:d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552", + "sha256:d4188e73af84ca82468f09cadc5ac4db578109e52acb4518d8154698d3a87ca2", + "sha256:d4efec7bcf21671db6a3294ff301d2fc861c31faa3c8740d1a94689234d1b415", + "sha256:d75aa530ccfaa593da12834b86a0724f58bff12706659baa9227c2ccaa06264c", + "sha256:d84cd4061ae292d8ac367b2c3fa3aad11cb8625a95d135fe93f286f914f3f5a6", + "sha256:d8aacd3d4b33b772542b2e01beb50187536967b514b00003bdda7589722d2a64", + "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d", + "sha256:d976bbb382b202f71c67f77b0ac11244021cfa3f7dfd9e562eefcea2df711548", + "sha256:dba5ee5d3981160c28d5490f0d1b7ed730c22470ff7f6cc26cfcfaacb9896a07", + "sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61", + "sha256:dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d", + "sha256:deed0c7258ceb4c44ad5ec7d9918f9f14fd05b2be86378d86cf50e63d1e7b771", + "sha256:e09c2279a4d01f099f52d5c4b3d9e208e91edcbd1a175c9662a8b16e000fece9", + "sha256:e2ea9f7ab7fbf18fffb1b5434ce7c69a07582f7acc7717720f1d69f3e806f90c", + "sha256:e6b93f13371d341afee3be9f7c5964e3fe61d5fa30f6a30eb49856935dfe4fc3", + "sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16", + "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145", + "sha256:ede8c6d533bc6601a47ad4046080d36b8fc99f81e6f1c17b0ac3c2dc91ac7611", + "sha256:efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2", + "sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464", + "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2", + "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04", + "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54", + "sha256:f68e4f3eeca8fb22cc3d731f9715a13b652795ef657a13df1ad0c7dc0e9731df", + "sha256:fb3b8132019ea572f4611d770991000d7f58127560c4889729248eb5852a102f", + "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1", + "sha256:fc1795ac5cd0510207482c3d1d3ed781143383b8cfd36f5c645f3897ce066220" + ], + "markers": "python_version >= '3.10'", + "version": "==1.4.9" + }, + "matplotlib": { + "hashes": [ + "sha256:05be9bdaa8b242bc6ff96330d18c52f1fc59c6fb3a4dd411d953d67e7e1baf98", + "sha256:08f141d55148cd1fc870c3387d70ca4df16dee10e909b3b038782bd4bda6ea07", + "sha256:08fc803293b4e1694ee325896030de97f74c141ccff0be886bb5915269247676", + "sha256:091cea22e059b89f6d7d1a18e2c33a7376c26eee60e401d92a4d6726c4e12706", + "sha256:13fcd07ccf17e354398358e0307a1f53f5325dca22982556ddb9c52837b5af41", + "sha256:1565aae810ab79cb72e402b22facfa6501365e73ebab70a0fdfb98488d2c3c0c", + "sha256:1678bb61d897bb4ac4757b5ecfb02bfb3fddf7f808000fb81e09c510712fda75", + "sha256:1b53bd6337eba483e2e7d29c5ab10eee644bc3a2491ec67cc55f7b44583ffb18", + "sha256:25f7a3eb42d6c1c56e89eacd495661fc815ffc08d9da750bca766771c0fd9110", + "sha256:2adf92d9b7527fbfb8818e050260f0ebaa460f79d61546374ce73506c9421d09", + "sha256:30fdd37edf41a4e6785f9b37969de57aea770696cb637d9946eb37470c94a453", + "sha256:31ca662df6a80bd426f871105fdd69db7543e28e73a9f2afe80de7e531eb2347", + "sha256:376a624a218116461696b27b2bbf7a8945053e6d799f6502fc03226d077807bf", + "sha256:3d80d60d4e54cda462e2cd9a086d85cd9f20943ead92f575ce86885a43a565d5", + "sha256:470fc846d59d1406e34fa4c32ba371039cd12c2fe86801159a965956f2575bd1", + "sha256:491e25e02a23d7207629d942c666924a6b61e007a48177fdd231a0097b7f507e", + "sha256:4d6ca6ef03dfd269f4ead566ec6f3fb9becf8dab146fb999022ed85ee9f6b3eb", + "sha256:4dd83e029f5b4801eeb87c64efd80e732452781c16a9cf7415b7b63ec8f374d7", + "sha256:56cd2d20842f58c03d2d6e6c1f1cf5548ad6f66b91e1e48f814e4fb5abd1cb95", + "sha256:590f5925c2d650b5c9d813c5b3b5fc53f2929c3f8ef463e4ecfa7e052044fb2b", + "sha256:59c8ac8382fefb9cb71308dde16a7c487432f5255d8f1fd32473523abecfecdf", + "sha256:658bc91894adeab669cf4bb4a186d049948262987e80f0857216387d7435d833", + "sha256:662df55604a2f9a45435566d6e2660e41efe83cd94f4288dfbf1e6d1eae4b0bb", + "sha256:6f4a69196e663a41d12a728fab8751177215357906436804217d6d9cf0d4d6cf", + "sha256:70aaf890ce1d0efd482df969b28a5b30ea0b891224bb315810a3940f67182899", + "sha256:7bac38d816637343e53d7185d0c66677ff30ffb131044a81898b5792c956ba76", + "sha256:819e409653c1106c8deaf62e6de6b8611449c2cd9939acb0d7d4e57a3d95cc7a", + "sha256:83847b47f6524c34b4f2d3ce726bb0541c48c8e7692729865c3df75bfa0f495a", + "sha256:84e82d9e0fd70c70bc55739defbd8055c54300750cbacf4740c9673a24d6933a", + "sha256:886f989ccfae63659183173bb3fced7fd65e9eb793c3cc21c273add368536951", + "sha256:8913b7474f6dd83ac444c9459c91f7f0f2859e839f41d642691b104e0af056aa", + "sha256:8fa4c43d6bfdbfec09c733bca8667de11bfa4970e8324c471f3a3632a0301c15", + "sha256:905b60d1cb0ee604ce65b297b61cf8be9f4e6cfecf95a3fe1c388b5266bc8f4f", + "sha256:942a8de2b5bfff1de31d95722f702e2966b8a7e31f4e68f7cd963c7cd8861cf6", + "sha256:94f0b4cacb23763b64b5dace50d5b7bfe98710fed5f0cef5c08135a03399d98b", + "sha256:9df5851b219225731f564e4b9e7f2ac1e13c9e6481f941b5631a0f8e2d9387ce", + "sha256:a3276c85370bc0dfca051ec65c5817d1e0f8f5ce1b7787528ec8ed2d524bbc2f", + "sha256:abb5d9478625dd9c9eb51a06d39aae71eda749ae9b3138afb23eb38824026c7e", + "sha256:acc86dd6e0e695c095001a7fccff158c49e45e0758fdf5dcdbb0103318b59c9f", + "sha256:bc31e693da1c08012c764b053e702c1855378e04102238e6a5ee6a7117c53a47", + "sha256:bc7316c306d97463a9866b89d5cc217824e799fa0de346c8f68f4f3d27c8693d", + "sha256:c7e0518e0d223683532a07f4b512e2e0729b62674f1b3a1a69869f98e6b1c7e3", + "sha256:cbd5eb50b7058b2892ce45c2f4e92557f395c9991f5c886d1bb74a1582e70fd6", + "sha256:cc332891306b9fb39462673d8225d1b824c89783fee82840a709f96714f17a5c", + "sha256:d00932b0d160ef03f59f9c0e16d1e3ac89646f7785165ce6ad40c842db16cc2e", + "sha256:e228cd2ffb8f88b7d0b29e37f68ca9aaf83e33821f24a5ccc4f082dd8396bc27", + "sha256:ea117a9c1627acaa04dbf36265691921b999cbf515a015298e54e1a12c3af837", + "sha256:ec01b645840dd1996df21ee37f208cd8ba57644779fa20464010638013d3203c", + "sha256:ee1d607b3fb1590deb04b69f02ea1d53ed0b0bf75b2b1a5745f269afcbd3cdd3", + "sha256:f2d684c3204fa62421bbf770ddfebc6b50130f9cad65531eeba19236d73bb488", + "sha256:f3b23315a01981689aa4e1a179dbf6ef9fbd17143c3eea77548c2ecfb0499438", + "sha256:f44c8d264a71609c79a78d50349e724f5d5fc3684ead7c2a473665ee63d868aa", + "sha256:f56a0d1ab05d34c628592435781d185cd99630bdfd76822cd686fb5a0aecd43a", + "sha256:f7173f8551b88f4ef810a94adae3128c2530e0d07529f7141be7f8d8c365f051", + "sha256:f9c862d91ec0b7842920a4cfdaaec29662195301914ea54c33e01f1a28d014b2" + ], + "index": "pypi", + "markers": "python_version >= '3.10'", + "version": "==3.10.6" + }, + "numpy": { + "hashes": [ + "sha256:067e3d7159a5d8f8a0b46ee11148fc35ca9b21f61e3c49fbd0a027450e65a33b", + "sha256:0edd58682a399824633b66885d699d7de982800053acf20be1eaa46d92009c54", + "sha256:0ffc4f5caba7dfcbe944ed674b7eef683c7e94874046454bb79ed7ee0236f59d", + "sha256:1250c5d3d2562ec4174bce2e3a1523041595f9b651065e4a4473f5f48a6bc8a5", + "sha256:179a42101b845a816d464b6fe9a845dfaf308fdfc7925387195570789bb2c970", + "sha256:1c02d0629d25d426585fb2e45a66154081b9fa677bc92a881ff1d216bc9919a8", + "sha256:1e02c7159791cd481e1e6d5ddd766b62a4d5acf8df4d4d1afe35ee9c5c33a41e", + "sha256:2990adf06d1ecee3b3dcbb4977dfab6e9f09807598d647f04d385d29e7a3c3d3", + "sha256:2e267c7da5bf7309670523896df97f93f6e469fb931161f483cd6882b3b1a5dc", + "sha256:367ad5d8fbec5d9296d18478804a530f1191e24ab4d75ab408346ae88045d25e", + "sha256:396b254daeb0a57b1fe0ecb5e3cff6fa79a380fa97c8f7781a6d08cd429418fe", + "sha256:3c7cf302ac6e0b76a64c4aecf1a09e51abd9b01fc7feee80f6c43e3ab1b1dbc5", + "sha256:40051003e03db4041aa325da2a0971ba41cf65714e65d296397cc0e32de6018b", + "sha256:414a97499480067d305fcac9716c29cf4d0d76db6ebf0bf3cbce666677f12652", + "sha256:433bf137e338677cebdd5beac0199ac84712ad9d630b74eceeb759eaa45ddf30", + "sha256:4384a169c4d8f97195980815d6fcad04933a7e1ab3b530921c3fef7a1c63426d", + "sha256:497d7cad08e7092dba36e3d296fe4c97708c93daf26643a1ae4b03f6294d30eb", + "sha256:50a5fe69f135f88a2be9b6ca0481a68a136f6febe1916e4920e12f1a34e708a7", + "sha256:533ca5f6d325c80b6007d4d7fb1984c303553534191024ec6a524a4c92a5935a", + "sha256:5534ed6b92f9b7dca6c0a19d6df12d41c68b991cef051d108f6dbff3babc4ebf", + "sha256:5b83648633d46f77039c29078751f80da65aa64d5622a3cd62aaef9d835b6c93", + "sha256:691808c2b26b0f002a032c73255d0bd89751425f379f7bcd22d140db593a96e8", + "sha256:6ee9086235dd6ab7ae75aba5662f582a81ced49f0f1c6de4260a78d8f2d91a19", + "sha256:74c2a948d02f88c11a3c075d9733f1ae67d97c6bdb97f2bb542f980458b257e7", + "sha256:75370986cc0bc66f4ce5110ad35aae6d182cc4ce6433c40ad151f53690130bf1", + "sha256:78c9f6560dc7e6b3990e32df7ea1a50bbd0e2a111e05209963f5ddcab7073b0b", + "sha256:7af05ed4dc19f308e1d9fc759f36f21921eb7bbfc82843eeec6b2a2863a0aefa", + "sha256:7f025652034199c301049296b59fa7d52c7e625017cae4c75d8662e377bf487d", + "sha256:823d04112bc85ef5c4fda73ba24e6096c8f869931405a80aa8b0e604510a26bc", + "sha256:8596ba2f8af5f93b01d97563832686d20206d303024777f6dfc2e7c7c3f1850e", + "sha256:8e9aced64054739037d42fb84c54dd38b81ee238816c948c8f3ed134665dcd86", + "sha256:8f6ac61a217437946a1fa48d24c47c91a0c4f725237871117dea264982128097", + "sha256:901bf6123879b7f251d3631967fd574690734236075082078e0571977c6a8e6a", + "sha256:93d4962d8f82af58f0b2eb85daaf1b3ca23fe0a85d0be8f1f2b7bb46034e56d7", + "sha256:94fcaa68757c3e2e668ddadeaa86ab05499a70725811e582b6a9858dd472fb30", + "sha256:952cfd0748514ea7c3afc729a0fc639e61655ce4c55ab9acfab14bda4f402b4c", + "sha256:9591e1221db3f37751e6442850429b3aabf7026d3b05542d102944ca7f00c8a8", + "sha256:99683cbe0658f8271b333a1b1b4bb3173750ad59c0c61f5bbdc5b318918fffe3", + "sha256:9ad12e976ca7b10f1774b03615a2a4bab8addce37ecc77394d8e986927dc0dfe", + "sha256:9cc48e09feb11e1db00b320e9d30a4151f7369afb96bd0e48d942d09da3a0d00", + "sha256:9dc13c6a5829610cc07422bc74d3ac083bd8323f14e2827d992f9e52e22cd6a6", + "sha256:9e318ee0596d76d4cb3d78535dc005fa60e5ea348cd131a51e99d0bdbe0b54fe", + "sha256:a333b4ed33d8dc2b373cc955ca57babc00cd6f9009991d9edc5ddbc1bac36bcd", + "sha256:afd07d377f478344ec6ca2b8d4ca08ae8bd44706763d1efb56397de606393f48", + "sha256:b001bae8cea1c7dfdb2ae2b017ed0a6f2102d7a70059df1e338e307a4c78a8ae", + "sha256:b37a0b2e5935409daebe82c1e42274d30d9dd355852529eab91dab8dcca7419f", + "sha256:b912f2ed2b67a129e6a601e9d93d4fa37bef67e54cac442a2f588a54afe5c67a", + "sha256:bc92a5dedcc53857249ca51ef29f5e5f2f8c513e22cfb90faeb20343b8c6f7a6", + "sha256:ca0309a18d4dfea6fc6262a66d06c26cfe4640c3926ceec90e57791a82b6eee5", + "sha256:cb248499b0bc3be66ebd6578b83e5acacf1d6cb2a77f2248ce0e40fbec5a76d0", + "sha256:cb32e3cf0f762aee47ad1ddc6672988f7f27045b0783c887190545baba73aa25", + "sha256:cd052f1fa6a78dee696b58a914b7229ecfa41f0a6d96dc663c1220a55e137593", + "sha256:cd4260f64bc794c3390a63bf0728220dd1a68170c169088a1e0dfa2fde1be12f", + "sha256:cd7de500a5b66319db419dc3c345244404a164beae0d0937283b907d8152e6ea", + "sha256:ce020080e4a52426202bdb6f7691c65bb55e49f261f31a8f506c9f6bc7450421", + "sha256:cfdd09f9c84a1a934cde1eec2267f0a43a7cd44b2cca4ff95b7c0d14d144b0bf", + "sha256:d00de139a3324e26ed5b95870ce63be7ec7352171bc69a4cf1f157a48e3eb6b7", + "sha256:d79715d95f1894771eb4e60fb23f065663b2298f7d22945d66877aadf33d00c7", + "sha256:d8f3b1080782469fdc1718c4ed1d22549b5fb12af0d57d35e992158a772a37cf", + "sha256:d9192da52b9745f7f0766531dcfa978b7763916f158bb63bdb8a1eca0068ab20", + "sha256:d9d537a39cc9de668e5cd0e25affb17aec17b577c6b3ae8a3d866b479fbe88d0", + "sha256:da1a74b90e7483d6ce5244053399a614b1d6b7bc30a60d2f570e5071f8959d3e", + "sha256:dca2d0fc80b3893ae72197b39f69d55a3cd8b17ea1b50aa4c62de82419936150", + "sha256:ddc7c39727ba62b80dfdbedf400d1c10ddfa8eefbd7ec8dcb118be8b56d31029", + "sha256:e1ec5615b05369925bd1125f27df33f3b6c8bc10d788d5999ecd8769a1fa04db", + "sha256:e6687dc183aa55dae4a705b35f9c0f8cb178bcaa2f029b241ac5356221d5c021", + "sha256:e7e946c7170858a0295f79a60214424caac2ffdb0063d4d79cb681f9aa0aa569", + "sha256:eb63d443d7b4ffd1e873f8155260d7f58e7e4b095961b01c91062935c2491e57", + "sha256:ec9d249840f6a565f58d8f913bccac2444235025bbb13e9a4681783572ee3caa", + "sha256:ed635ff692483b8e3f0fcaa8e7eb8a75ee71aa6d975388224f70821421800cea", + "sha256:eda59e44957d272846bb407aad19f89dc6f58fecf3504bd144f4c5cf81a7eacc", + "sha256:f0dadeb302887f07431910f67a14d57209ed91130be0adea2f9793f1a4f817cf", + "sha256:f0ddb4b96a87b6728df9362135e764eac3cfa674499943ebc44ce96c478ab125", + "sha256:f5415fb78995644253370985342cd03572ef8620b934da27d77377a2285955bf" + ], + "markers": "python_version >= '3.11'", + "version": "==2.3.3" + }, + "packaging": { + "hashes": [ + "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", + "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" + ], + "markers": "python_version >= '3.8'", + "version": "==25.0" + }, + "pillow": { + "hashes": [ + "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", + "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", + "sha256:040a5b691b0713e1f6cbe222e0f4f74cd233421e105850ae3b3c0ceda520f42e", + "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", + "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", + "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", + "sha256:092c80c76635f5ecb10f3f83d76716165c96f5229addbd1ec2bdbbda7d496e06", + "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", + "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", + "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", + "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f", + "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", + "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", + "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", + "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", + "sha256:19d2ff547c75b8e3ff46f4d9ef969a06c30ab2d4263a9e287733aa8b2429ce8f", + "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac", + "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860", + "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", + "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722", + "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", + "sha256:23cff760a9049c502721bdb743a7cb3e03365fafcdfc2ef9784610714166e5a4", + "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", + "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", + "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", + "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", + "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd", + "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", + "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", + "sha256:3cee80663f29e3843b68199b9d6f4f54bd1d4a6b59bdd91bceefc51238bcb967", + "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", + "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", + "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", + "sha256:4445fa62e15936a028672fd48c4c11a66d641d2c05726c7ec1f8ba6a572036ae", + "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", + "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c", + "sha256:48d254f8a4c776de343051023eb61ffe818299eeac478da55227d96e241de53f", + "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", + "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", + "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7", + "sha256:527b37216b6ac3a12d7838dc3bd75208ec57c1c6d11ef01902266a5a0c14fc27", + "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361", + "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", + "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", + "sha256:6359a3bc43f57d5b375d1ad54a0074318a0844d11b76abccf478c37c986d3cfc", + "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58", + "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad", + "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", + "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", + "sha256:6a418691000f2a418c9135a7cf0d797c1bb7d9a485e61fe8e7722845b95ef978", + "sha256:6abdbfd3aea42be05702a8dd98832329c167ee84400a1d1f61ab11437f1717eb", + "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", + "sha256:7107195ddc914f656c7fc8e4a5e1c25f32e9236ea3ea860f257b0436011fddd0", + "sha256:71f511f6b3b91dd543282477be45a033e4845a40278fa8dcdbfdb07109bf18f9", + "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", + "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", + "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", + "sha256:7aee118e30a4cf54fdd873bd3a29de51e29105ab11f9aad8c32123f58c8f8081", + "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", + "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6", + "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d", + "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", + "sha256:819931d25e57b513242859ce1876c58c59dc31587847bf74cfe06b2e0cb22d2f", + "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", + "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", + "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", + "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", + "sha256:89bd777bc6624fe4115e9fac3352c79ed60f3bb18651420635f26e643e3dd1f6", + "sha256:8dc70ca24c110503e16918a658b869019126ecfe03109b754c402daff12b3d9f", + "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494", + "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", + "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94", + "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", + "sha256:97afb3a00b65cc0804d1c7abddbf090a81eaac02768af58cbdcaaa0a931e0b6d", + "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", + "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", + "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438", + "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288", + "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", + "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", + "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", + "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", + "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", + "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0", + "sha256:b5f56c3f344f2ccaf0dd875d3e180f631dc60a51b314295a3e681fe8cf851fbe", + "sha256:be5463ac478b623b9dd3937afd7fb7ab3d79dd290a28e2b6df292dc75063eb8a", + "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", + "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8", + "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", + "sha256:cadc9e0ea0a2431124cde7e1697106471fc4c1da01530e679b2391c37d3fbb3a", + "sha256:cc3e831b563b3114baac7ec2ee86819eb03caa1a2cef0b481a5675b59c4fe23b", + "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e", + "sha256:d000f46e2917c705e9fb93a3606ee4a819d1e3aa7a9b442f6444f07e77cf5e25", + "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", + "sha256:e5c5858ad8ec655450a7c7df532e9842cf8df7cc349df7225c60d5d348c8aada", + "sha256:e67d793d180c9df62f1f40aee3accca4829d3794c95098887edc18af4b8b780c", + "sha256:ea944117a7974ae78059fcc1800e5d3295172bb97035c0c1d9345fca1419da71", + "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", + "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", + "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", + "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", + "sha256:f1f182ebd2303acf8c380a54f615ec883322593320a9b00438eb842c1f37ae50", + "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", + "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", + "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", + "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3" + ], + "markers": "python_version >= '3.9'", + "version": "==11.3.0" + }, + "pyparsing": { + "hashes": [ + "sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6", + "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e" + ], + "markers": "python_version >= '3.9'", + "version": "==3.2.5" + }, + "python-dateutil": { + "hashes": [ + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "version": "==2.9.0.post0" + }, + "simple-scope-parser": { + "editable": true, + "file": "." + }, + "six": { + "hashes": [ + "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", + "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "version": "==1.17.0" + } + }, + "develop": {} +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..6323416 --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +# Joe's Really Simple Scope Parser + +Got to be enough times in class that we needed to load the data from either my own +owon scope or the Gwinstek scopes at the lab. Both semi-standard CSV style exports. +This package is just neat enough to combine those together. + +Supports pulling the metadata, time encoding and etc from each of the loadable +types. + +## Instalation +```bash +# Install directly from my server +pip install git+https://git.kitsunehosting.net/Kenwood/simple-scope-parser.git +``` + +### Local Development + +```bash +# Install in development mode +pip install -e . + +# Or if you use pipenv +pipenv install -e . +``` + +## Quick Start + +```python +from scope_parser import parse_scope_data + +# Parse your oscilloscope data (auto-detects file format) +data = parse_scope_data("your_file.CSV") + +# Access channel data +channel = data['CH1'] + +# Get voltage and time arrays +voltage = channel.voltage_values # in mV +time = channel.time_values # in seconds + +# Access metadata +print(f"Frequency: {channel.frequency} Hz") +print(f"Peak-to-Peak: {channel.vpp} mV") +print(f"Average: {channel.average} mV") +``` + +## License + +MIT License diff --git a/examples/Example Wave Gwinstek.CSV b/examples/Example Wave Gwinstek.CSV new file mode 100644 index 0000000..b079efe --- /dev/null +++ b/examples/Example Wave Gwinstek.CSV @@ -0,0 +1,4016 @@ +Memory Length,4000, +Trigger Level,2.000E-02, +Source,CH1, +Probe,1X, +Vertical Units,V, +Vertical Scale,1.000E+00, +Vertical Position,4.000E-02, +Horizontal Units,s, +Horizontal Scale,5.000E-04, +Horizontal Position,0.000E+00, +Horizontal Mode,Main, +Sampling Period,2.000E-06, +Firmware,V1.13, +Time, , +Mode,Fast, +Waveform Data, +24, +24, +24, +24, +24, +25, +24, +24, +24, +25, +24, +24, +24, +24, +24, +24, +25, +24, +25, +24, +25, +24, +24, +25, +24, +25, +24, +25, +25, +24, +25, +24, +24, +24, +24, +24, +24, +24, +25, +25, +25, +24, +24, +24, +24, +24, +24, +24, +24, +24, +24, +24, +24, +24, +24, +25, +25, +25, +25, +24, +24, +25, +25, +24, +24, +24, +24, +24, +24, +25, +24, +24, +24, +24, +24, +24, +24, +24, +24, +25, +25, +25, +24, +25, +24, +24, +25, +25, +24, +24, +24, +24, +24, +24, +24, +25, +25, +25, +25, +25, +25, +24, +24, +24, +25, +24, +24, +24, +24, +24, +25, +25, +24, +24, +24, +25, +25, +24, +25, +25, +24, +24, +25, +25, +25, +24, +24, +25, +25, +24, +25, +24, +24, +24, +24, +24, +24, +24, +24, +24, +24, +24, +24, +25, +24, +25, +25, +24, +25, +25, +25, +25, +25, +24, +24, +25, +25, +25, +24, +24, +24, +24, +24, +24, +25, +25, +24, +24, +24, +25, +25, +24, +24, +24, +24, +24, +24, +25, +25, +25, +25, +24, +24, +24, +24, +24, +24, +24, +24, +25, +25, +24, +25, +24, +24, +25, +24, +25, +25, +24, +25, +25, +24, +24, +24, +24, +25, +25, +24, +25, +24, +25, +24, +24, +25, +25, +24, +24, +25, +24, +25, +25, +25, +24, +25, +24, +24, +25, +24, +24, +25, +24, +25, +25, +25, +24, +24, +25, +25, +25, +24, +25, +25, +24, +25, +24, +24, +24, +24, +25, +24, +25, +25, +24, +25, +24, +25, +24, +25, +24, +24, +24, +24, +25, +24, +25, +25, +24, +24, +25, +25, +24, +24, +25, +25, +25, +24, +24, +25, +24, +24, +25, +24, +24, +25, +25, +25, +24, +24, +25, +24, +24, +24, +24, +24, +24, +24, +25, +25, +24, +25, +24, +25, +25, +25, +25, +24, +24, +24, +24, +25, +24, +25, +24, +25, +25, +25, +24, +25, +24, +24, +24, +24, +24, +25, +24, +25, +25, +24, +24, +25, +24, +25, +25, +24, +24, +24, +24, +25, +24, +25, +24, +24, +25, +25, +25, +24, +24, +25, +24, +25, +24, +24, +25, +24, +25, +24, +24, +25, +24, +24, +25, +25, +25, +24, +24, +24, +25, +24, +24, +25, +24, +25, +24, +25, +25, +24, +24, +25, +25, +25, +24, +24, +25, +25, +25, +24, +24, +25, +25, +24, +25, +24, +25, +24, +25, +24, +24, +24, +24, +25, +24, +25, +24, +24, +24, +25, +24, +24, +24, +25, +24, +24, +25, +25, +25, +24, +25, +25, +25, +24, +25, +24, +24, +24, +24, +24, +25, +25, +25, +25, +24, +25, +24, +24, +25, +25, +25, +24, +24, +24, +25, +24, +24, +24, +25, +24, +25, +25, +24, +24, +25, +25, +25, +24, +25, +25, +24, +24, +24, +25, +24, +24, +24, +24, +25, +24, +24, +25, +24, +25, +25, +24, +24, +24, +25, +24, +25, +24, +24, +24, +25, +24, +25, +24, +25, +24, +24, +24, +24, +25, +24, +24, +24, +24, +24, +25, +24, +25, +24, +-24, +-24, +-24, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-24, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-24, +-25, +-25, +-24, +-26, +-24, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-26, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-26, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-24, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-24, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-24, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-26, +-25, +-24, +-25, +-25, +-26, +-25, +-25, +-24, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +24, +24, +25, +24, +24, +25, +25, +24, +25, +24, +24, +24, +24, +24, +24, +25, +24, +24, +25, +25, +24, +25, +24, +24, +24, +25, +24, +24, +24, +24, +24, +24, +24, +25, +24, +24, +24, +25, +24, +24, +24, +25, +24, +25, +25, +24, +24, +25, +24, +25, +24, +24, +25, +24, +25, +24, +25, +24, +24, +25, +24, +24, +24, +25, +24, +24, +24, +25, +24, +24, +25, +25, +25, +25, +24, +24, +25, +25, +24, +24, +24, +25, +24, +24, +24, +25, +25, +25, +24, +25, +24, +25, +25, +24, +25, +25, +24, +24, +24, +24, +24, +25, +24, +25, +24, +24, +24, +25, +24, +24, +24, +24, +24, +25, +25, +24, +24, +25, +25, +25, +25, +24, +24, +24, +24, +24, +24, +24, +24, +24, +25, +24, +25, +25, +24, +24, +24, +25, +24, +25, +24, +25, +24, +25, +25, +24, +25, +25, +24, +25, +24, +25, +24, +24, +24, +25, +24, +24, +25, +25, +24, +25, +25, +25, +24, +24, +24, +25, +24, +24, +25, +24, +25, +24, +24, +24, +25, +24, +24, +25, +25, +24, +25, +25, +24, +25, +25, +24, +25, +24, +25, +24, +25, +24, +25, +25, +25, +25, +24, +24, +25, +25, +25, +24, +24, +25, +24, +24, +24, +24, +24, +25, +24, +25, +24, +24, +25, +25, +25, +24, +24, +24, +24, +24, +25, +24, +25, +25, +24, +24, +25, +25, +24, +24, +25, +24, +24, +24, +25, +25, +24, +24, +24, +25, +24, +24, +24, +25, +24, +24, +25, +24, +25, +24, +24, +25, +24, +24, +25, +24, +24, +25, +24, +25, +25, +24, +24, +24, +24, +24, +24, +24, +24, +24, +24, +25, +24, +25, +24, +25, +24, +25, +25, +24, +24, +24, +24, +25, +24, +25, +24, +24, +24, +25, +24, +24, +24, +24, +25, +24, +24, +24, +25, +24, +24, +25, +24, +25, +25, +24, +25, +25, +25, +24, +25, +24, +25, +24, +25, +25, +25, +25, +24, +25, +24, +24, +24, +25, +25, +25, +24, +24, +24, +24, +25, +25, +25, +24, +24, +24, +25, +25, +24, +24, +25, +24, +24, +25, +24, +25, +25, +24, +25, +25, +24, +25, +25, +24, +25, +25, +24, +25, +24, +25, +25, +25, +24, +24, +24, +24, +24, +25, +24, +25, +24, +25, +25, +24, +25, +25, +25, +25, +24, +24, +24, +25, +24, +24, +25, +25, +25, +25, +25, +24, +25, +25, +24, +25, +24, +24, +25, +25, +24, +25, +24, +25, +25, +25, +24, +24, +24, +24, +25, +24, +25, +25, +24, +24, +24, +24, +24, +25, +24, +24, +24, +24, +24, +24, +24, +24, +25, +24, +24, +24, +25, +25, +24, +25, +25, +25, +24, +25, +25, +25, +24, +25, +24, +25, +24, +25, +25, +25, +25, +24, +25, +25, +25, +25, +24, +25, +25, +25, +24, +24, +25, +25, +25, +24, +24, +24, +25, +25, +25, +25, +24, +25, +24, +24, +25, +24, +24, +25, +25, +24, +24, +25, +24, +25, +24, +25, +24, +25, +24, +25, +25, +24, +24, +24, +25, +-20, +-24, +-24, +-24, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-24, +-24, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-24, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-24, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-24, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-26, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-24, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-25, +-24, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-24, +-25, +-25, +-26, +-25, +-24, +-24, +-25, +-24, +-25, +-24, +-24, +-25, +-25, +-25, +-24, +-24, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-24, +-25, +-25, +23, +23, +24, +24, +24, +24, +24, +24, +24, +24, +24, +24, +24, +25, +24, +24, +25, +24, +24, +24, +24, +24, +25, +24, +25, +24, +25, +25, +25, +25, +25, +25, +24, +24, +25, +25, +24, +24, +24, +25, +24, +25, +24, +25, +25, +24, +25, +25, +25, +24, +25, +24, +25, +25, +24, +24, +25, +24, +25, +25, +24, +25, +24, +24, +24, +25, +25, +25, +25, +24, +25, +25, +25, +24, +24, +24, +25, +25, +24, +25, +25, +24, +24, +24, +25, +25, +24, +24, +25, +25, +25, +24, +25, +24, +25, +25, +24, +25, +24, +24, +24, +25, +25, +24, +24, +25, +24, +25, +24, +24, +24, +24, +25, +24, +25, +24, +24, +24, +25, +24, +25, +24, +24, +24, +25, +25, +25, +25, +24, +25, +25, +24, +24, +24, +24, +25, +24, +24, +24, +25, +24, +25, +24, +25, +25, +25, +24, +24, +24, +24, +25, +24, +24, +24, +25, +25, +25, +24, +25, +25, +24, +25, +24, +25, +25, +25, +24, +24, +24, +24, +25, +25, +25, +25, +25, +24, +24, +25, +25, +25, +25, +24, +24, +25, +24, +25, +25, +25, +24, +24, +24, +25, +25, +25, +24, +24, +25, +25, +24, +25, +24, +25, +24, +24, +24, +25, +24, +25, +24, +25, +24, +24, +25, +24, +24, +24, +25, +24, +24, +24, +24, +24, +24, +24, +25, +24, +24, +24, +24, +24, +25, +24, +25, +25, +24, +25, +25, +24, +24, +24, +25, +24, +25, +25, +24, +25, +24, +24, +24, +24, +25, +24, +24, +25, +24, +25, +24, +24, +24, +24, +25, +25, +24, +25, +24, +25, +25, +25, +25, +24, +25, +24, +24, +25, +24, +25, +24, +24, +25, +24, +25, +25, +24, +25, +25, +25, +25, +24, +24, +24, +25, +24, +24, +25, +24, +24, +24, +25, +25, +25, +25, +25, +24, +24, +25, +24, +25, +25, +24, +25, +25, +25, +25, +24, +25, +25, +24, +24, +25, +24, +25, +24, +24, +24, +24, +24, +24, +25, +24, +25, +24, +24, +24, +24, +25, +25, +24, +24, +25, +24, +24, +25, +25, +25, +24, +24, +24, +25, +25, +24, +25, +25, +25, +25, +25, +24, +24, +25, +24, +25, +24, +25, +24, +24, +25, +25, +24, +25, +24, +24, +25, +24, +25, +25, +25, +24, +25, +24, +24, +25, +25, +25, +24, +24, +25, +25, +25, +25, +25, +24, +25, +25, +24, +25, +24, +25, +25, +25, +24, +25, +25, +24, +24, +24, +25, +24, +25, +25, +25, +25, +25, +25, +24, +24, +24, +24, +25, +25, +25, +24, +25, +25, +24, +25, +24, +25, +25, +24, +25, +25, +25, +25, +24, +25, +24, +24, +24, +25, +24, +25, +24, +25, +24, +25, +25, +24, +24, +25, +24, +24, +24, +25, +25, +25, +25, +25, +25, +24, +25, +25, +24, +24, +25, +24, +24, +24, +24, +25, +24, +24, +24, +24, +25, +24, +24, +24, +24, +24, +24, +24, +24, +25, +25, +24, +25, +25, +24, +24, +24, +25, +24, +24, +25, +25, +25, +24, +25, +25, +24, +24, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-26, +-25, +-25, +-26, +-25, +-24, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-26, +-24, +-25, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-26, +-25, +-25, +-26, +-24, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-26, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-24, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-26, +-26, +-24, +-25, +-25, +-25, +-24, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-26, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +23, +23, +24, +24, +24, +24, +25, +24, +24, +24, +24, +24, +25, +25, +25, +24, +24, +25, +24, +24, +25, +24, +24, +24, +24, +24, +24, +25, +24, +25, +24, +24, +24, +24, +25, +24, +25, +24, +24, +24, +25, +24, +25, +24, +24, +24, +24, +24, +24, +24, +24, +24, +24, +25, +24, +24, +25, +24, +25, +25, +25, +24, +25, +25, +24, +24, +24, +24, +25, +25, +25, +24, +24, +25, +25, +24, +25, +25, +24, +24, +24, +24, +25, +24, +25, +24, +24, +24, +25, +24, +25, +25, +24, +25, +25, +24, +25, +24, +25, +25, +25, +25, +24, +24, +24, +24, +24, +24, +25, +25, +25, +25, +24, +25, +24, +24, +24, +25, +25, +24, +24, +25, +25, +24, +24, +25, +24, +24, +25, +25, +25, +25, +25, +25, +24, +24, +24, +25, +24, +25, +25, +25, +25, +24, +25, +25, +25, +25, +25, +24, +24, +25, +24, +24, +24, +25, +25, +25, +24, +24, +25, +24, +25, +25, +25, +25, +25, +25, +25, +24, +25, +24, +24, +24, +25, +24, +24, +24, +24, +25, +24, +24, +25, +24, +25, +25, +24, +24, +24, +24, +25, +25, +25, +24, +24, +25, +25, +24, +24, +25, +25, +25, +24, +24, +24, +25, +25, +25, +25, +25, +25, +25, +25, +25, +24, +25, +25, +25, +24, +24, +24, +25, +24, +24, +24, +25, +25, +24, +25, +24, +25, +24, +24, +25, +25, +24, +25, +24, +25, +24, +25, +25, +25, +25, +25, +24, +25, +24, +25, +24, +24, +24, +25, +25, +24, +25, +25, +25, +24, +24, +24, +24, +25, +24, +24, +24, +24, +25, +25, +25, +24, +25, +25, +25, +25, +25, +24, +24, +24, +24, +24, +24, +25, +24, +25, +24, +24, +25, +25, +25, +24, +24, +25, +25, +24, +25, +24, +25, +25, +24, +25, +25, +25, +24, +24, +24, +24, +24, +25, +25, +25, +25, +24, +24, +24, +25, +24, +24, +24, +25, +25, +24, +25, +24, +25, +24, +25, +24, +25, +25, +25, +24, +25, +24, +24, +24, +25, +25, +25, +25, +24, +24, +24, +24, +24, +24, +25, +24, +25, +24, +25, +25, +25, +25, +25, +25, +24, +25, +24, +24, +25, +25, +24, +24, +25, +25, +24, +25, +25, +25, +25, +24, +24, +25, +24, +24, +25, +24, +24, +25, +24, +24, +24, +24, +25, +25, +24, +24, +24, +25, +24, +25, +25, +25, +25, +25, +25, +24, +24, +24, +25, +24, +25, +24, +25, +25, +24, +25, +24, +25, +24, +25, +25, +24, +24, +24, +25, +24, +25, +25, +24, +25, +24, +25, +25, +24, +25, +25, +25, +24, +24, +25, +25, +25, +24, +24, +25, +24, +25, +24, +25, +25, +25, +25, +24, +24, +24, +26, +25, +24, +24, +25, +25, +24, +25, +25, +25, +24, +25, +25, +24, +24, +25, +25, +25, +25, +25, +24, +24, +25, +24, +25, +25, +24, +25, +24, +24, +25, +24, +24, +25, +25, +24, +24, +24, +24, +24, +24, +24, +25, +24, +25, +24, +25, +25, +25, +24, +24, +24, +25, +-23, +-25, +-24, +-24, +-24, +-24, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-24, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-24, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-24, +-25, +-24, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-25, +-24, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-24, +-25, +-24, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-24, +-25, +-25, +-26, +-25, +-24, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-24, +-25, +-25, +-25, +-25, +-25, +-24, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-24, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-24, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-26, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-24, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-24, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +-25, +24, diff --git a/examples/Example Wave OWON.CSV b/examples/Example Wave OWON.CSV new file mode 100644 index 0000000..1debcd8 --- /dev/null +++ b/examples/Example Wave OWON.CSV @@ -0,0 +1,4011 @@ +Channel :,CH1 +Frequency :,F=2.919kHz +Period :,T= ? +PK-PK :,Vpp=320.0mV +Average :,V=-4.860mV +Vertical pos :,0.00mV +Probe attenuation :,10X +Voltage per ADC value:,4.00mV +Time interval :,0.40uS + +index,CH1_Voltage(mV) +0,-96.00 +1,-100.00 +2,-96.00 +3,-104.00 +4,-104.00 +5,-100.00 +6,-100.00 +7,-104.00 +8,-100.00 +9,-96.00 +10,-100.00 +11,-96.00 +12,-96.00 +13,-96.00 +14,-100.00 +15,-104.00 +16,-108.00 +17,-108.00 +18,-112.00 +19,-112.00 +20,-112.00 +21,-108.00 +22,-112.00 +23,-108.00 +24,-108.00 +25,-108.00 +26,-108.00 +27,-112.00 +28,-108.00 +29,-108.00 +30,-108.00 +31,-108.00 +32,-112.00 +33,-112.00 +34,-112.00 +35,-112.00 +36,-120.00 +37,-116.00 +38,-112.00 +39,-120.00 +40,-112.00 +41,-112.00 +42,-112.00 +43,-112.00 +44,-108.00 +45,-104.00 +46,-104.00 +47,-104.00 +48,-104.00 +49,-104.00 +50,-108.00 +51,-108.00 +52,-108.00 +53,-104.00 +54,-104.00 +55,-108.00 +56,-108.00 +57,-112.00 +58,-112.00 +59,-112.00 +60,-116.00 +61,-124.00 +62,-120.00 +63,-120.00 +64,-112.00 +65,-112.00 +66,-112.00 +67,-108.00 +68,-112.00 +69,-112.00 +70,-112.00 +71,-108.00 +72,-116.00 +73,-112.00 +74,-112.00 +75,-112.00 +76,-112.00 +77,-112.00 +78,-112.00 +79,-120.00 +80,-120.00 +81,-112.00 +82,-112.00 +83,-112.00 +84,-112.00 +85,-112.00 +86,-112.00 +87,-112.00 +88,-112.00 +89,-112.00 +90,-120.00 +91,-124.00 +92,-120.00 +93,-120.00 +94,-112.00 +95,-112.00 +96,-116.00 +97,-112.00 +98,-112.00 +99,-112.00 +100,-112.00 +101,-112.00 +102,-116.00 +103,-112.00 +104,-112.00 +105,-112.00 +106,-108.00 +107,-112.00 +108,-112.00 +109,-108.00 +110,-116.00 +111,-116.00 +112,-124.00 +113,-116.00 +114,-124.00 +115,-124.00 +116,-120.00 +117,-120.00 +118,-112.00 +119,-112.00 +120,-112.00 +121,-108.00 +122,-108.00 +123,-108.00 +124,-108.00 +125,-104.00 +126,-104.00 +127,-104.00 +128,-104.00 +129,-108.00 +130,-104.00 +131,-100.00 +132,-108.00 +133,-104.00 +134,-108.00 +135,-112.00 +136,-108.00 +137,-100.00 +138,-96.00 +139,-120.00 +140,-104.00 +141,-100.00 +142,-96.00 +143,-100.00 +144,-96.00 +145,-96.00 +146,-92.00 +147,-100.00 +148,-92.00 +149,-92.00 +150,-96.00 +151,-100.00 +152,-92.00 +153,-88.00 +154,-92.00 +155,-84.00 +156,-80.00 +157,-84.00 +158,-80.00 +159,-76.00 +160,-76.00 +161,-80.00 +162,-80.00 +163,-80.00 +164,-84.00 +165,-84.00 +166,-80.00 +167,-80.00 +168,-80.00 +169,-80.00 +170,-76.00 +171,-72.00 +172,-72.00 +173,-68.00 +174,-64.00 +175,-68.00 +176,-64.00 +177,-64.00 +178,-56.00 +179,-64.00 +180,-60.00 +181,-56.00 +182,-56.00 +183,-56.00 +184,-60.00 +185,-60.00 +186,-60.00 +187,-68.00 +188,-64.00 +189,-64.00 +190,-64.00 +191,-64.00 +192,-60.00 +193,-52.00 +194,-52.00 +195,-48.00 +196,-44.00 +197,-44.00 +198,-44.00 +199,-44.00 +200,-40.00 +201,-40.00 +202,-36.00 +203,-36.00 +204,-36.00 +205,-28.00 +206,-40.00 +207,-40.00 +208,-40.00 +209,-40.00 +210,-36.00 +211,-40.00 +212,-32.00 +213,-28.00 +214,-24.00 +215,-24.00 +216,-24.00 +217,-20.00 +218,-16.00 +219,-20.00 +220,-24.00 +221,-12.00 +222,-12.00 +223,-24.00 +224,-16.00 +225,-20.00 +226,-16.00 +227,-16.00 +228,-8.00 +229,-12.00 +230,-4.00 +231,-4.00 +232,-4.00 +233,-4.00 +234,4.00 +235,4.00 +236,4.00 +237,8.00 +238,4.00 +239,4.00 +240,4.00 +241,4.00 +242,8.00 +243,16.00 +244,16.00 +245,16.00 +246,20.00 +247,28.00 +248,24.00 +249,24.00 +250,24.00 +251,28.00 +252,28.00 +253,40.00 +254,36.00 +255,36.00 +256,36.00 +257,28.00 +258,36.00 +259,40.00 +260,40.00 +261,36.00 +262,36.00 +263,36.00 +264,32.00 +265,24.00 +266,40.00 +267,40.00 +268,48.00 +269,44.00 +270,52.00 +271,56.00 +272,56.00 +273,56.00 +274,64.00 +275,64.00 +276,68.00 +277,64.00 +278,64.00 +279,68.00 +280,68.00 +281,56.00 +282,64.00 +283,64.00 +284,64.00 +285,68.00 +286,72.00 +287,76.00 +288,76.00 +289,76.00 +290,76.00 +291,80.00 +292,84.00 +293,84.00 +294,80.00 +295,88.00 +296,80.00 +297,84.00 +298,84.00 +299,84.00 +300,84.00 +301,96.00 +302,96.00 +303,96.00 +304,96.00 +305,96.00 +306,104.00 +307,104.00 +308,104.00 +309,108.00 +310,104.00 +311,104.00 +312,108.00 +313,104.00 +314,112.00 +315,104.00 +316,108.00 +317,104.00 +318,112.00 +319,112.00 +320,112.00 +321,112.00 +322,120.00 +323,124.00 +324,128.00 +325,132.00 +326,132.00 +327,136.00 +328,136.00 +329,136.00 +330,140.00 +331,144.00 +332,144.00 +333,144.00 +334,148.00 +335,144.00 +336,136.00 +337,148.00 +338,144.00 +339,148.00 +340,148.00 +341,144.00 +342,144.00 +343,152.00 +344,148.00 +345,156.00 +346,160.00 +347,160.00 +348,160.00 +349,160.00 +350,164.00 +351,160.00 +352,168.00 +353,164.00 +354,164.00 +355,160.00 +356,160.00 +357,160.00 +358,160.00 +359,168.00 +360,168.00 +361,168.00 +362,168.00 +363,172.00 +364,172.00 +365,176.00 +366,176.00 +367,176.00 +368,176.00 +369,172.00 +370,164.00 +371,168.00 +372,172.00 +373,176.00 +374,176.00 +375,176.00 +376,176.00 +377,180.00 +378,180.00 +379,180.00 +380,180.00 +381,184.00 +382,180.00 +383,184.00 +384,184.00 +385,180.00 +386,180.00 +387,180.00 +388,184.00 +389,180.00 +390,176.00 +391,176.00 +392,172.00 +393,176.00 +394,176.00 +395,176.00 +396,176.00 +397,176.00 +398,180.00 +399,184.00 +400,184.00 +401,180.00 +402,184.00 +403,180.00 +404,180.00 +405,180.00 +406,180.00 +407,180.00 +408,176.00 +409,176.00 +410,176.00 +411,176.00 +412,168.00 +413,172.00 +414,164.00 +415,164.00 +416,164.00 +417,164.00 +418,164.00 +419,164.00 +420,164.00 +421,168.00 +422,164.00 +423,172.00 +424,164.00 +425,164.00 +426,160.00 +427,160.00 +428,148.00 +429,156.00 +430,152.00 +431,152.00 +432,144.00 +433,160.00 +434,156.00 +435,148.00 +436,148.00 +437,148.00 +438,144.00 +439,144.00 +440,136.00 +441,136.00 +442,136.00 +443,132.00 +444,136.00 +445,124.00 +446,128.00 +447,132.00 +448,128.00 +449,124.00 +450,124.00 +451,124.00 +452,124.00 +453,120.00 +454,124.00 +455,120.00 +456,120.00 +457,124.00 +458,112.00 +459,112.00 +460,108.00 +461,112.00 +462,104.00 +463,100.00 +464,108.00 +465,96.00 +466,96.00 +467,96.00 +468,92.00 +469,92.00 +470,92.00 +471,92.00 +472,84.00 +473,92.00 +474,92.00 +475,92.00 +476,92.00 +477,96.00 +478,92.00 +479,92.00 +480,92.00 +481,92.00 +482,88.00 +483,84.00 +484,84.00 +485,76.00 +486,80.00 +487,76.00 +488,72.00 +489,72.00 +490,72.00 +491,76.00 +492,80.00 +493,72.00 +494,72.00 +495,68.00 +496,80.00 +497,68.00 +498,72.00 +499,68.00 +500,68.00 +501,64.00 +502,64.00 +503,64.00 +504,60.00 +505,60.00 +506,64.00 +507,64.00 +508,64.00 +509,64.00 +510,68.00 +511,64.00 +512,56.00 +513,64.00 +514,60.00 +515,56.00 +516,56.00 +517,52.00 +518,52.00 +519,48.00 +520,48.00 +521,44.00 +522,48.00 +523,44.00 +524,44.00 +525,48.00 +526,48.00 +527,52.00 +528,40.00 +529,48.00 +530,48.00 +531,44.00 +532,48.00 +533,48.00 +534,48.00 +535,44.00 +536,44.00 +537,40.00 +538,40.00 +539,40.00 +540,44.00 +541,28.00 +542,32.00 +543,24.00 +544,28.00 +545,24.00 +546,24.00 +547,24.00 +548,24.00 +549,24.00 +550,32.00 +551,28.00 +552,24.00 +553,20.00 +554,24.00 +555,24.00 +556,24.00 +557,24.00 +558,24.00 +559,20.00 +560,16.00 +561,16.00 +562,16.00 +563,12.00 +564,4.00 +565,12.00 +566,8.00 +567,4.00 +568,-4.00 +569,12.00 +570,8.00 +571,12.00 +572,4.00 +573,4.00 +574,4.00 +575,4.00 +576,-4.00 +577,16.00 +578,4.00 +579,-4.00 +580,-4.00 +581,16.00 +582,-4.00 +583,4.00 +584,4.00 +585,4.00 +586,4.00 +587,4.00 +588,-4.00 +589,-4.00 +590,-4.00 +591,-4.00 +592,-4.00 +593,-4.00 +594,-12.00 +595,-12.00 +596,-20.00 +597,-12.00 +598,-16.00 +599,-12.00 +600,-12.00 +601,-4.00 +602,-4.00 +603,-12.00 +604,-4.00 +605,-4.00 +606,-12.00 +607,-4.00 +608,-4.00 +609,-4.00 +610,-12.00 +611,-16.00 +612,-12.00 +613,-12.00 +614,-12.00 +615,-20.00 +616,-16.00 +617,-24.00 +618,-24.00 +619,-24.00 +620,-24.00 +621,-16.00 +622,-20.00 +623,-24.00 +624,-24.00 +625,-16.00 +626,-24.00 +627,-20.00 +628,-24.00 +629,-28.00 +630,-24.00 +631,-24.00 +632,-24.00 +633,-28.00 +634,-28.00 +635,-28.00 +636,-28.00 +637,-28.00 +638,-28.00 +639,-24.00 +640,-28.00 +641,-28.00 +642,-24.00 +643,-24.00 +644,-24.00 +645,-32.00 +646,-32.00 +647,-40.00 +648,-32.00 +649,-36.00 +650,-40.00 +651,-32.00 +652,-32.00 +653,-36.00 +654,-32.00 +655,-28.00 +656,-32.00 +657,-32.00 +658,-32.00 +659,-40.00 +660,-32.00 +661,-40.00 +662,-32.00 +663,-32.00 +664,-40.00 +665,-44.00 +666,-40.00 +667,-40.00 +668,-44.00 +669,-52.00 +670,-52.00 +671,-48.00 +672,-44.00 +673,-44.00 +674,-44.00 +675,-40.00 +676,-44.00 +677,-44.00 +678,-40.00 +679,-44.00 +680,-44.00 +681,-44.00 +682,-44.00 +683,-44.00 +684,-44.00 +685,-44.00 +686,-48.00 +687,-48.00 +688,-48.00 +689,-52.00 +690,-56.00 +691,-56.00 +692,-60.00 +693,-56.00 +694,-60.00 +695,-52.00 +696,-52.00 +697,-52.00 +698,-56.00 +699,-52.00 +700,-44.00 +701,-52.00 +702,-52.00 +703,-56.00 +704,-52.00 +705,-56.00 +706,-56.00 +707,-64.00 +708,-56.00 +709,-64.00 +710,-64.00 +711,-64.00 +712,-60.00 +713,-60.00 +714,-60.00 +715,-56.00 +716,-56.00 +717,-56.00 +718,-64.00 +719,-56.00 +720,-56.00 +721,-68.00 +722,-60.00 +723,-56.00 +724,-48.00 +725,-60.00 +726,-52.00 +727,-56.00 +728,-52.00 +729,-56.00 +730,-56.00 +731,-56.00 +732,-60.00 +733,-52.00 +734,-60.00 +735,-56.00 +736,-60.00 +737,-60.00 +738,-64.00 +739,-60.00 +740,-64.00 +741,-64.00 +742,-64.00 +743,-64.00 +744,-72.00 +745,-80.00 +746,-76.00 +747,-84.00 +748,-72.00 +749,-76.00 +750,-80.00 +751,-80.00 +752,-72.00 +753,-72.00 +754,-68.00 +755,-72.00 +756,-92.00 +757,-72.00 +758,-68.00 +759,-68.00 +760,-72.00 +761,-72.00 +762,-76.00 +763,-80.00 +764,-80.00 +765,-88.00 +766,-88.00 +767,-88.00 +768,-84.00 +769,-84.00 +770,-80.00 +771,-80.00 +772,-80.00 +773,-80.00 +774,-84.00 +775,-80.00 +776,-84.00 +777,-84.00 +778,-92.00 +779,-88.00 +780,-84.00 +781,-88.00 +782,-92.00 +783,-88.00 +784,-84.00 +785,-88.00 +786,-92.00 +787,-88.00 +788,-84.00 +789,-84.00 +790,-92.00 +791,-84.00 +792,-88.00 +793,-88.00 +794,-92.00 +795,-96.00 +796,-96.00 +797,-100.00 +798,-104.00 +799,-104.00 +800,-100.00 +801,-96.00 +802,-92.00 +803,-92.00 +804,-88.00 +805,-92.00 +806,-88.00 +807,-92.00 +808,-88.00 +809,-88.00 +810,-84.00 +811,-84.00 +812,-84.00 +813,-84.00 +814,-84.00 +815,-84.00 +816,-84.00 +817,-88.00 +818,-92.00 +819,-96.00 +820,-92.00 +821,-92.00 +822,-92.00 +823,-96.00 +824,-96.00 +825,-96.00 +826,-88.00 +827,-88.00 +828,-84.00 +829,-92.00 +830,-88.00 +831,-80.00 +832,-84.00 +833,-80.00 +834,-84.00 +835,-88.00 +836,-92.00 +837,-92.00 +838,-92.00 +839,-88.00 +840,-92.00 +841,-92.00 +842,-92.00 +843,-84.00 +844,-88.00 +845,-84.00 +846,-88.00 +847,-92.00 +848,-88.00 +849,-92.00 +850,-92.00 +851,-80.00 +852,-96.00 +853,-100.00 +854,-92.00 +855,-96.00 +856,-96.00 +857,-96.00 +858,-100.00 +859,-100.00 +860,-92.00 +861,-96.00 +862,-92.00 +863,-96.00 +864,-92.00 +865,-96.00 +866,-100.00 +867,-96.00 +868,-100.00 +869,-100.00 +870,-108.00 +871,-100.00 +872,-112.00 +873,-108.00 +874,-108.00 +875,-112.00 +876,-112.00 +877,-112.00 +878,-108.00 +879,-108.00 +880,-108.00 +881,-108.00 +882,-108.00 +883,-100.00 +884,-100.00 +885,-96.00 +886,-104.00 +887,-108.00 +888,-108.00 +889,-100.00 +890,-108.00 +891,-100.00 +892,-104.00 +893,-108.00 +894,-108.00 +895,-108.00 +896,-112.00 +897,-120.00 +898,-112.00 +899,-112.00 +900,-120.00 +901,-112.00 +902,-116.00 +903,-108.00 +904,-108.00 +905,-112.00 +906,-108.00 +907,-112.00 +908,-108.00 +909,-112.00 +910,-120.00 +911,-116.00 +912,-116.00 +913,-112.00 +914,-116.00 +915,-112.00 +916,-120.00 +917,-112.00 +918,-112.00 +919,-108.00 +920,-108.00 +921,-112.00 +922,-112.00 +923,-108.00 +924,-108.00 +925,-112.00 +926,-112.00 +927,-112.00 +928,-112.00 +929,-116.00 +930,-112.00 +931,-104.00 +932,-112.00 +933,-112.00 +934,-108.00 +935,-108.00 +936,-108.00 +937,-104.00 +938,-100.00 +939,-108.00 +940,-108.00 +941,-108.00 +942,-104.00 +943,-108.00 +944,-108.00 +945,-112.00 +946,-112.00 +947,-112.00 +948,-116.00 +949,-116.00 +950,-112.00 +951,-112.00 +952,-112.00 +953,-112.00 +954,-112.00 +955,-116.00 +956,-112.00 +957,-108.00 +958,-104.00 +959,-108.00 +960,-108.00 +961,-108.00 +962,-104.00 +963,-108.00 +964,-108.00 +965,-108.00 +966,-108.00 +967,-108.00 +968,-112.00 +969,-112.00 +970,-108.00 +971,-112.00 +972,-112.00 +973,-112.00 +974,-112.00 +975,-112.00 +976,-112.00 +977,-108.00 +978,-112.00 +979,-112.00 +980,-108.00 +981,-108.00 +982,-108.00 +983,-108.00 +984,-108.00 +985,-120.00 +986,-112.00 +987,-112.00 +988,-116.00 +989,-112.00 +990,-112.00 +991,-108.00 +992,-104.00 +993,-104.00 +994,-108.00 +995,-100.00 +996,-100.00 +997,-108.00 +998,-108.00 +999,-108.00 +1000,-104.00 +1001,-104.00 +1002,-108.00 +1003,-108.00 +1004,-100.00 +1005,-100.00 +1006,-100.00 +1007,-96.00 +1008,-96.00 +1009,-84.00 +1010,-88.00 +1011,-84.00 +1012,-84.00 +1013,-80.00 +1014,-84.00 +1015,-80.00 +1016,-80.00 +1017,-76.00 +1018,-80.00 +1019,-80.00 +1020,-84.00 +1021,-80.00 +1022,-80.00 +1023,-76.00 +1024,-76.00 +1025,-76.00 +1026,-80.00 +1027,-80.00 +1028,-76.00 +1029,-80.00 +1030,-76.00 +1031,-72.00 +1032,-72.00 +1033,-68.00 +1034,-60.00 +1035,-64.00 +1036,-56.00 +1037,-56.00 +1038,-56.00 +1039,-52.00 +1040,-60.00 +1041,-60.00 +1042,-64.00 +1043,-56.00 +1044,-56.00 +1045,-52.00 +1046,-56.00 +1047,-48.00 +1048,-52.00 +1049,-48.00 +1050,-52.00 +1051,-48.00 +1052,-48.00 +1053,-44.00 +1054,-44.00 +1055,-44.00 +1056,-40.00 +1057,-40.00 +1058,-40.00 +1059,-44.00 +1060,-40.00 +1061,-40.00 +1062,-40.00 +1063,-40.00 +1064,-40.00 +1065,-28.00 +1066,-28.00 +1067,-24.00 +1068,-24.00 +1069,-24.00 +1070,-24.00 +1071,-24.00 +1072,-24.00 +1073,-24.00 +1074,-24.00 +1075,-24.00 +1076,-24.00 +1077,-24.00 +1078,-24.00 +1079,-24.00 +1080,-24.00 +1081,-24.00 +1082,-24.00 +1083,-16.00 +1084,-12.00 +1085,-12.00 +1086,-12.00 +1087,-8.00 +1088,-4.00 +1089,-4.00 +1090,4.00 +1091,0.00 +1092,4.00 +1093,4.00 +1094,4.00 +1095,8.00 +1096,12.00 +1097,4.00 +1098,8.00 +1099,8.00 +1100,12.00 +1101,4.00 +1102,16.00 +1103,8.00 +1104,8.00 +1105,12.00 +1106,12.00 +1107,12.00 +1108,24.00 +1109,16.00 +1110,24.00 +1111,28.00 +1112,28.00 +1113,28.00 +1114,28.00 +1115,28.00 +1116,28.00 +1117,28.00 +1118,32.00 +1119,36.00 +1120,36.00 +1121,40.00 +1122,40.00 +1123,44.00 +1124,52.00 +1125,48.00 +1126,48.00 +1127,52.00 +1128,56.00 +1129,56.00 +1130,56.00 +1131,60.00 +1132,56.00 +1133,56.00 +1134,56.00 +1135,60.00 +1136,64.00 +1137,64.00 +1138,72.00 +1139,72.00 +1140,72.00 +1141,72.00 +1142,80.00 +1143,80.00 +1144,84.00 +1145,88.00 +1146,84.00 +1147,88.00 +1148,84.00 +1149,88.00 +1150,88.00 +1151,84.00 +1152,84.00 +1153,84.00 +1154,84.00 +1155,84.00 +1156,92.00 +1157,92.00 +1158,100.00 +1159,100.00 +1160,108.00 +1161,96.00 +1162,108.00 +1163,112.00 +1164,112.00 +1165,112.00 +1166,112.00 +1167,112.00 +1168,116.00 +1169,120.00 +1170,120.00 +1171,120.00 +1172,120.00 +1173,120.00 +1174,120.00 +1175,120.00 +1176,112.00 +1177,120.00 +1178,112.00 +1179,116.00 +1180,120.00 +1181,124.00 +1182,124.00 +1183,136.00 +1184,132.00 +1185,136.00 +1186,132.00 +1187,136.00 +1188,136.00 +1189,136.00 +1190,136.00 +1191,136.00 +1192,132.00 +1193,140.00 +1194,136.00 +1195,144.00 +1196,144.00 +1197,136.00 +1198,148.00 +1199,152.00 +1200,160.00 +1201,152.00 +1202,156.00 +1203,152.00 +1204,152.00 +1205,160.00 +1206,156.00 +1207,160.00 +1208,160.00 +1209,160.00 +1210,172.00 +1211,176.00 +1212,172.00 +1213,176.00 +1214,176.00 +1215,176.00 +1216,180.00 +1217,180.00 +1218,180.00 +1219,180.00 +1220,180.00 +1221,180.00 +1222,180.00 +1223,180.00 +1224,180.00 +1225,176.00 +1226,180.00 +1227,176.00 +1228,176.00 +1229,172.00 +1230,176.00 +1231,176.00 +1232,176.00 +1233,180.00 +1234,184.00 +1235,188.00 +1236,184.00 +1237,188.00 +1238,192.00 +1239,188.00 +1240,188.00 +1241,192.00 +1242,184.00 +1243,192.00 +1244,192.00 +1245,184.00 +1246,184.00 +1247,184.00 +1248,188.00 +1249,180.00 +1250,180.00 +1251,180.00 +1252,180.00 +1253,180.00 +1254,184.00 +1255,188.00 +1256,176.00 +1257,180.00 +1258,180.00 +1259,188.00 +1260,176.00 +1261,176.00 +1262,176.00 +1263,176.00 +1264,176.00 +1265,172.00 +1266,176.00 +1267,172.00 +1268,176.00 +1269,172.00 +1270,176.00 +1271,176.00 +1272,172.00 +1273,164.00 +1274,164.00 +1275,164.00 +1276,160.00 +1277,164.00 +1278,160.00 +1279,160.00 +1280,152.00 +1281,156.00 +1282,148.00 +1283,152.00 +1284,148.00 +1285,144.00 +1286,152.00 +1287,152.00 +1288,152.00 +1289,148.00 +1290,152.00 +1291,148.00 +1292,152.00 +1293,144.00 +1294,148.00 +1295,148.00 +1296,140.00 +1297,140.00 +1298,136.00 +1299,132.00 +1300,132.00 +1301,132.00 +1302,124.00 +1303,124.00 +1304,120.00 +1305,120.00 +1306,112.00 +1307,112.00 +1308,112.00 +1309,112.00 +1310,112.00 +1311,112.00 +1312,112.00 +1313,112.00 +1314,112.00 +1315,112.00 +1316,112.00 +1317,116.00 +1318,112.00 +1319,104.00 +1320,104.00 +1321,108.00 +1322,96.00 +1323,104.00 +1324,96.00 +1325,96.00 +1326,100.00 +1327,92.00 +1328,96.00 +1329,100.00 +1330,96.00 +1331,96.00 +1332,96.00 +1333,92.00 +1334,88.00 +1335,92.00 +1336,80.00 +1337,84.00 +1338,84.00 +1339,84.00 +1340,84.00 +1341,88.00 +1342,80.00 +1343,88.00 +1344,84.00 +1345,84.00 +1346,84.00 +1347,84.00 +1348,76.00 +1349,84.00 +1350,80.00 +1351,80.00 +1352,80.00 +1353,76.00 +1354,64.00 +1355,60.00 +1356,64.00 +1357,68.00 +1358,68.00 +1359,72.00 +1360,68.00 +1361,72.00 +1362,68.00 +1363,72.00 +1364,80.00 +1365,64.00 +1366,72.00 +1367,72.00 +1368,72.00 +1369,64.00 +1370,64.00 +1371,64.00 +1372,64.00 +1373,64.00 +1374,60.00 +1375,56.00 +1376,60.00 +1377,52.00 +1378,48.00 +1379,36.00 +1380,44.00 +1381,40.00 +1382,44.00 +1383,44.00 +1384,40.00 +1385,44.00 +1386,40.00 +1387,44.00 +1388,44.00 +1389,44.00 +1390,40.00 +1391,36.00 +1392,40.00 +1393,36.00 +1394,28.00 +1395,24.00 +1396,28.00 +1397,28.00 +1398,24.00 +1399,28.00 +1400,32.00 +1401,36.00 +1402,32.00 +1403,28.00 +1404,32.00 +1405,28.00 +1406,28.00 +1407,28.00 +1408,24.00 +1409,24.00 +1410,24.00 +1411,24.00 +1412,24.00 +1413,16.00 +1414,24.00 +1415,16.00 +1416,24.00 +1417,24.00 +1418,24.00 +1419,20.00 +1420,16.00 +1421,24.00 +1422,20.00 +1423,20.00 +1424,16.00 +1425,12.00 +1426,20.00 +1427,12.00 +1428,8.00 +1429,12.00 +1430,8.00 +1431,4.00 +1432,4.00 +1433,-4.00 +1434,-4.00 +1435,4.00 +1436,4.00 +1437,4.00 +1438,4.00 +1439,4.00 +1440,4.00 +1441,4.00 +1442,4.00 +1443,16.00 +1444,8.00 +1445,4.00 +1446,4.00 +1447,8.00 +1448,4.00 +1449,4.00 +1450,-4.00 +1451,-4.00 +1452,-12.00 +1453,-4.00 +1454,-8.00 +1455,-4.00 +1456,-4.00 +1457,-4.00 +1458,-4.00 +1459,-4.00 +1460,-4.00 +1461,-4.00 +1462,-4.00 +1463,-4.00 +1464,-4.00 +1465,-12.00 +1466,-12.00 +1467,-20.00 +1468,-20.00 +1469,-16.00 +1470,-20.00 +1471,-16.00 +1472,-16.00 +1473,-12.00 +1474,-20.00 +1475,-12.00 +1476,-16.00 +1477,-16.00 +1478,-16.00 +1479,-16.00 +1480,-12.00 +1481,-16.00 +1482,-24.00 +1483,-24.00 +1484,-28.00 +1485,-24.00 +1486,-32.00 +1487,-24.00 +1488,-24.00 +1489,-24.00 +1490,-24.00 +1491,-16.00 +1492,-20.00 +1493,-20.00 +1494,-28.00 +1495,-24.00 +1496,-24.00 +1497,-24.00 +1498,-24.00 +1499,-20.00 +1500,-24.00 +1501,-24.00 +1502,-28.00 +1503,-28.00 +1504,-24.00 +1505,-32.00 +1506,-28.00 +1507,-40.00 +1508,-32.00 +1509,-40.00 +1510,-40.00 +1511,-40.00 +1512,-36.00 +1513,-32.00 +1514,-28.00 +1515,-28.00 +1516,-24.00 +1517,-32.00 +1518,-32.00 +1519,-36.00 +1520,-40.00 +1521,-32.00 +1522,-32.00 +1523,-36.00 +1524,-36.00 +1525,-40.00 +1526,-40.00 +1527,-40.00 +1528,-48.00 +1529,-44.00 +1530,-44.00 +1531,-48.00 +1532,-52.00 +1533,-44.00 +1534,-44.00 +1535,-48.00 +1536,-44.00 +1537,-44.00 +1538,-44.00 +1539,-52.00 +1540,-52.00 +1541,-52.00 +1542,-52.00 +1543,-52.00 +1544,-52.00 +1545,-52.00 +1546,-48.00 +1547,-44.00 +1548,-48.00 +1549,-44.00 +1550,-48.00 +1551,-52.00 +1552,-52.00 +1553,-52.00 +1554,-48.00 +1555,-52.00 +1556,-52.00 +1557,-56.00 +1558,-56.00 +1559,-60.00 +1560,-68.00 +1561,-76.00 +1562,-64.00 +1563,-64.00 +1564,-68.00 +1565,-64.00 +1566,-60.00 +1567,-56.00 +1568,-56.00 +1569,-60.00 +1570,-60.00 +1571,-56.00 +1572,-56.00 +1573,-48.00 +1574,-60.00 +1575,-56.00 +1576,-56.00 +1577,-60.00 +1578,-60.00 +1579,-64.00 +1580,-68.00 +1581,-68.00 +1582,-68.00 +1583,-64.00 +1584,-68.00 +1585,-60.00 +1586,-60.00 +1587,-60.00 +1588,-60.00 +1589,-64.00 +1590,-64.00 +1591,-60.00 +1592,-60.00 +1593,-60.00 +1594,-64.00 +1595,-64.00 +1596,-60.00 +1597,-68.00 +1598,-68.00 +1599,-68.00 +1600,-68.00 +1601,-68.00 +1602,-68.00 +1603,-68.00 +1604,-64.00 +1605,-64.00 +1606,-64.00 +1607,-72.00 +1608,-64.00 +1609,-64.00 +1610,-64.00 +1611,-68.00 +1612,-72.00 +1613,-72.00 +1614,-76.00 +1615,-72.00 +1616,-72.00 +1617,-72.00 +1618,-72.00 +1619,-68.00 +1620,-72.00 +1621,-72.00 +1622,-72.00 +1623,-68.00 +1624,-72.00 +1625,-68.00 +1626,-72.00 +1627,-80.00 +1628,-68.00 +1629,-80.00 +1630,-80.00 +1631,-80.00 +1632,-84.00 +1633,-80.00 +1634,-80.00 +1635,-92.00 +1636,-84.00 +1637,-96.00 +1638,-96.00 +1639,-96.00 +1640,-92.00 +1641,-92.00 +1642,-88.00 +1643,-92.00 +1644,-88.00 +1645,-84.00 +1646,-88.00 +1647,-88.00 +1648,-96.00 +1649,-88.00 +1650,-84.00 +1651,-84.00 +1652,-84.00 +1653,-96.00 +1654,-88.00 +1655,-88.00 +1656,-92.00 +1657,-96.00 +1658,-96.00 +1659,-100.00 +1660,-100.00 +1661,-100.00 +1662,-100.00 +1663,-92.00 +1664,-100.00 +1665,-92.00 +1666,-92.00 +1667,-88.00 +1668,-92.00 +1669,-92.00 +1670,-92.00 +1671,-92.00 +1672,-96.00 +1673,-96.00 +1674,-96.00 +1675,-100.00 +1676,-96.00 +1677,-88.00 +1678,-92.00 +1679,-84.00 +1680,-88.00 +1681,-96.00 +1682,-92.00 +1683,-88.00 +1684,-92.00 +1685,-96.00 +1686,-88.00 +1687,-92.00 +1688,-92.00 +1689,-88.00 +1690,-88.00 +1691,-92.00 +1692,-88.00 +1693,-84.00 +1694,-80.00 +1695,-76.00 +1696,-76.00 +1697,-80.00 +1698,-80.00 +1699,-80.00 +1700,-80.00 +1701,-76.00 +1702,-80.00 +1703,-84.00 +1704,-80.00 +1705,-84.00 +1706,-84.00 +1707,-92.00 +1708,-92.00 +1709,-92.00 +1710,-96.00 +1711,-92.00 +1712,-96.00 +1713,-100.00 +1714,-100.00 +1715,-92.00 +1716,-96.00 +1717,-92.00 +1718,-92.00 +1719,-88.00 +1720,-88.00 +1721,-92.00 +1722,-96.00 +1723,-84.00 +1724,-92.00 +1725,-96.00 +1726,-92.00 +1727,-92.00 +1728,-96.00 +1729,-92.00 +1730,-100.00 +1731,-100.00 +1732,-108.00 +1733,-108.00 +1734,-104.00 +1735,-112.00 +1736,-112.00 +1737,-112.00 +1738,-104.00 +1739,-108.00 +1740,-104.00 +1741,-104.00 +1742,-104.00 +1743,-108.00 +1744,-112.00 +1745,-112.00 +1746,-112.00 +1747,-112.00 +1748,-112.00 +1749,-108.00 +1750,-112.00 +1751,-112.00 +1752,-112.00 +1753,-112.00 +1754,-112.00 +1755,-112.00 +1756,-112.00 +1757,-112.00 +1758,-112.00 +1759,-112.00 +1760,-108.00 +1761,-112.00 +1762,-108.00 +1763,-112.00 +1764,-116.00 +1765,-116.00 +1766,-124.00 +1767,-120.00 +1768,-112.00 +1769,-120.00 +1770,-112.00 +1771,-112.00 +1772,-108.00 +1773,-108.00 +1774,-112.00 +1775,-108.00 +1776,-104.00 +1777,-108.00 +1778,-104.00 +1779,-108.00 +1780,-104.00 +1781,-104.00 +1782,-108.00 +1783,-104.00 +1784,-100.00 +1785,-108.00 +1786,-108.00 +1787,-108.00 +1788,-112.00 +1789,-120.00 +1790,-120.00 +1791,-116.00 +1792,-116.00 +1793,-112.00 +1794,-108.00 +1795,-112.00 +1796,-108.00 +1797,-108.00 +1798,-112.00 +1799,-112.00 +1800,-112.00 +1801,-108.00 +1802,-108.00 +1803,-112.00 +1804,-112.00 +1805,-112.00 +1806,-112.00 +1807,-120.00 +1808,-112.00 +1809,-112.00 +1810,-112.00 +1811,-112.00 +1812,-108.00 +1813,-108.00 +1814,-108.00 +1815,-112.00 +1816,-112.00 +1817,-112.00 +1818,-112.00 +1819,-116.00 +1820,-116.00 +1821,-120.00 +1822,-112.00 +1823,-112.00 +1824,-112.00 +1825,-108.00 +1826,-108.00 +1827,-112.00 +1828,-104.00 +1829,-108.00 +1830,-108.00 +1831,-108.00 +1832,-108.00 +1833,-108.00 +1834,-112.00 +1835,-108.00 +1836,-108.00 +1837,-112.00 +1838,-112.00 +1839,-112.00 +1840,-116.00 +1841,-112.00 +1842,-112.00 +1843,-108.00 +1844,-108.00 +1845,-108.00 +1846,-108.00 +1847,-104.00 +1848,-104.00 +1849,-104.00 +1850,-104.00 +1851,-100.00 +1852,-100.00 +1853,-96.00 +1854,-96.00 +1855,-96.00 +1856,-92.00 +1857,-96.00 +1858,-100.00 +1859,-100.00 +1860,-92.00 +1861,-96.00 +1862,-96.00 +1863,-96.00 +1864,-100.00 +1865,-96.00 +1866,-104.00 +1867,-92.00 +1868,-92.00 +1869,-92.00 +1870,-84.00 +1871,-88.00 +1872,-84.00 +1873,-80.00 +1874,-80.00 +1875,-80.00 +1876,-84.00 +1877,-84.00 +1878,-92.00 +1879,-80.00 +1880,-80.00 +1881,-76.00 +1882,-80.00 +1883,-72.00 +1884,-72.00 +1885,-68.00 +1886,-68.00 +1887,-68.00 +1888,-68.00 +1889,-68.00 +1890,-68.00 +1891,-64.00 +1892,-64.00 +1893,-56.00 +1894,-60.00 +1895,-64.00 +1896,-56.00 +1897,-56.00 +1898,-52.00 +1899,-52.00 +1900,-52.00 +1901,-48.00 +1902,-44.00 +1903,-48.00 +1904,-44.00 +1905,-44.00 +1906,-44.00 +1907,-44.00 +1908,-40.00 +1909,-44.00 +1910,-40.00 +1911,-44.00 +1912,-44.00 +1913,-48.00 +1914,-44.00 +1915,-40.00 +1916,-40.00 +1917,-40.00 +1918,-36.00 +1919,-28.00 +1920,-28.00 +1921,-24.00 +1922,-24.00 +1923,-24.00 +1924,-20.00 +1925,-16.00 +1926,-20.00 +1927,-12.00 +1928,-20.00 +1929,-20.00 +1930,-16.00 +1931,-16.00 +1932,-12.00 +1933,-12.00 +1934,-16.00 +1935,-20.00 +1936,-24.00 +1937,-16.00 +1938,-16.00 +1939,-12.00 +1940,-12.00 +1941,-12.00 +1942,-4.00 +1943,-4.00 +1944,-4.00 +1945,0.00 +1946,-4.00 +1947,4.00 +1948,-4.00 +1949,-4.00 +1950,4.00 +1951,-4.00 +1952,4.00 +1953,-4.00 +1954,8.00 +1955,12.00 +1956,16.00 +1957,8.00 +1958,12.00 +1959,20.00 +1960,16.00 +1961,24.00 +1962,24.00 +1963,20.00 +1964,24.00 +1965,24.00 +1966,24.00 +1967,32.00 +1968,28.00 +1969,36.00 +1970,40.00 +1971,44.00 +1972,40.00 +1973,44.00 +1974,52.00 +1975,48.00 +1976,52.00 +1977,56.00 +1978,56.00 +1979,56.00 +1980,56.00 +1981,56.00 +1982,52.00 +1983,56.00 +1984,56.00 +1985,56.00 +1986,48.00 +1987,52.00 +1988,52.00 +1989,60.00 +1990,56.00 +1991,60.00 +1992,64.00 +1993,72.00 +1994,76.00 +1995,72.00 +1996,76.00 +1997,76.00 +1998,76.00 +1999,84.00 +2000,84.00 +2001,88.00 +2002,84.00 +2003,88.00 +2004,88.00 +2005,84.00 +2006,84.00 +2007,84.00 +2008,72.00 +2009,84.00 +2010,88.00 +2011,88.00 +2012,88.00 +2013,92.00 +2014,92.00 +2015,96.00 +2016,96.00 +2017,104.00 +2018,104.00 +2019,100.00 +2020,108.00 +2021,104.00 +2022,104.00 +2023,96.00 +2024,108.00 +2025,104.00 +2026,112.00 +2027,112.00 +2028,112.00 +2029,120.00 +2030,120.00 +2031,120.00 +2032,120.00 +2033,124.00 +2034,128.00 +2035,132.00 +2036,132.00 +2037,128.00 +2038,128.00 +2039,124.00 +2040,132.00 +2041,132.00 +2042,124.00 +2043,132.00 +2044,132.00 +2045,132.00 +2046,136.00 +2047,136.00 +2048,140.00 +2049,148.00 +2050,148.00 +2051,152.00 +2052,152.00 +2053,156.00 +2054,160.00 +2055,160.00 +2056,160.00 +2057,160.00 +2058,160.00 +2059,160.00 +2060,160.00 +2061,164.00 +2062,160.00 +2063,160.00 +2064,160.00 +2065,164.00 +2066,160.00 +2067,160.00 +2068,160.00 +2069,164.00 +2070,168.00 +2071,168.00 +2072,168.00 +2073,168.00 +2074,172.00 +2075,172.00 +2076,180.00 +2077,176.00 +2078,176.00 +2079,176.00 +2080,176.00 +2081,176.00 +2082,172.00 +2083,172.00 +2084,176.00 +2085,176.00 +2086,176.00 +2087,176.00 +2088,176.00 +2089,176.00 +2090,180.00 +2091,180.00 +2092,180.00 +2093,180.00 +2094,180.00 +2095,172.00 +2096,176.00 +2097,180.00 +2098,180.00 +2099,180.00 +2100,188.00 +2101,188.00 +2102,188.00 +2103,188.00 +2104,188.00 +2105,184.00 +2106,188.00 +2107,184.00 +2108,192.00 +2109,184.00 +2110,180.00 +2111,184.00 +2112,184.00 +2113,176.00 +2114,180.00 +2115,180.00 +2116,180.00 +2117,172.00 +2118,172.00 +2119,172.00 +2120,176.00 +2121,172.00 +2122,172.00 +2123,172.00 +2124,168.00 +2125,176.00 +2126,172.00 +2127,176.00 +2128,172.00 +2129,172.00 +2130,176.00 +2131,176.00 +2132,176.00 +2133,164.00 +2134,172.00 +2135,164.00 +2136,164.00 +2137,160.00 +2138,160.00 +2139,160.00 +2140,152.00 +2141,152.00 +2142,152.00 +2143,152.00 +2144,156.00 +2145,144.00 +2146,148.00 +2147,148.00 +2148,152.00 +2149,148.00 +2150,144.00 +2151,144.00 +2152,140.00 +2153,136.00 +2154,132.00 +2155,132.00 +2156,132.00 +2157,132.00 +2158,128.00 +2159,124.00 +2160,124.00 +2161,124.00 +2162,124.00 +2163,124.00 +2164,120.00 +2165,124.00 +2166,120.00 +2167,124.00 +2168,112.00 +2169,112.00 +2170,104.00 +2171,104.00 +2172,108.00 +2173,112.00 +2174,112.00 +2175,112.00 +2176,112.00 +2177,112.00 +2178,112.00 +2179,104.00 +2180,112.00 +2181,108.00 +2182,108.00 +2183,108.00 +2184,104.00 +2185,108.00 +2186,100.00 +2187,104.00 +2188,92.00 +2189,96.00 +2190,92.00 +2191,84.00 +2192,84.00 +2193,80.00 +2194,80.00 +2195,84.00 +2196,84.00 +2197,80.00 +2198,80.00 +2199,84.00 +2200,88.00 +2201,84.00 +2202,84.00 +2203,84.00 +2204,84.00 +2205,84.00 +2206,84.00 +2207,84.00 +2208,80.00 +2209,76.00 +2210,76.00 +2211,72.00 +2212,68.00 +2213,64.00 +2214,72.00 +2215,64.00 +2216,68.00 +2217,72.00 +2218,64.00 +2219,64.00 +2220,68.00 +2221,60.00 +2222,64.00 +2223,64.00 +2224,60.00 +2225,64.00 +2226,60.00 +2227,56.00 +2228,56.00 +2229,56.00 +2230,56.00 +2231,56.00 +2232,48.00 +2233,60.00 +2234,52.00 +2235,56.00 +2236,56.00 +2237,52.00 +2238,52.00 +2239,48.00 +2240,48.00 +2241,44.00 +2242,40.00 +2243,40.00 +2244,44.00 +2245,44.00 +2246,40.00 +2247,40.00 +2248,44.00 +2249,48.00 +2250,48.00 +2251,52.00 +2252,52.00 +2253,48.00 +2254,48.00 +2255,40.00 +2256,44.00 +2257,44.00 +2258,44.00 +2259,40.00 +2260,40.00 +2261,36.00 +2262,28.00 +2263,28.00 +2264,32.00 +2265,24.00 +2266,24.00 +2267,16.00 +2268,16.00 +2269,16.00 +2270,12.00 +2271,16.00 +2272,20.00 +2273,20.00 +2274,20.00 +2275,24.00 +2276,24.00 +2277,24.00 +2278,20.00 +2279,20.00 +2280,20.00 +2281,16.00 +2282,20.00 +2283,16.00 +2284,16.00 +2285,8.00 +2286,4.00 +2287,4.00 +2288,4.00 +2289,4.00 +2290,4.00 +2291,8.00 +2292,4.00 +2293,4.00 +2294,8.00 +2295,8.00 +2296,8.00 +2297,4.00 +2298,4.00 +2299,4.00 +2300,-4.00 +2301,-12.00 +2302,-4.00 +2303,-4.00 +2304,-4.00 +2305,-4.00 +2306,-4.00 +2307,-4.00 +2308,-4.00 +2309,-4.00 +2310,-4.00 +2311,-4.00 +2312,-4.00 +2313,-4.00 +2314,-4.00 +2315,-4.00 +2316,-8.00 +2317,-8.00 +2318,-12.00 +2319,-12.00 +2320,-16.00 +2321,-20.00 +2322,-8.00 +2323,-8.00 +2324,-12.00 +2325,-12.00 +2326,-4.00 +2327,-4.00 +2328,-8.00 +2329,-12.00 +2330,-8.00 +2331,-8.00 +2332,-12.00 +2333,-4.00 +2334,-12.00 +2335,-4.00 +2336,-12.00 +2337,-12.00 +2338,-12.00 +2339,-16.00 +2340,-24.00 +2341,-16.00 +2342,-24.00 +2343,-28.00 +2344,-24.00 +2345,-24.00 +2346,-24.00 +2347,-28.00 +2348,-24.00 +2349,-24.00 +2350,-16.00 +2351,-24.00 +2352,-24.00 +2353,-24.00 +2354,-24.00 +2355,-24.00 +2356,-24.00 +2357,-28.00 +2358,-32.00 +2359,-32.00 +2360,-32.00 +2361,-36.00 +2362,-40.00 +2363,-32.00 +2364,-28.00 +2365,-24.00 +2366,-28.00 +2367,-32.00 +2368,-28.00 +2369,-28.00 +2370,-32.00 +2371,-36.00 +2372,-40.00 +2373,-40.00 +2374,-40.00 +2375,-44.00 +2376,-44.00 +2377,-40.00 +2378,-40.00 +2379,-40.00 +2380,-40.00 +2381,-36.00 +2382,-44.00 +2383,-40.00 +2384,-40.00 +2385,-40.00 +2386,-40.00 +2387,-32.00 +2388,-40.00 +2389,-40.00 +2390,-44.00 +2391,-44.00 +2392,-44.00 +2393,-52.00 +2394,-48.00 +2395,-52.00 +2396,-52.00 +2397,-52.00 +2398,-52.00 +2399,-44.00 +2400,-44.00 +2401,-44.00 +2402,-44.00 +2403,-44.00 +2404,-40.00 +2405,-44.00 +2406,-48.00 +2407,-44.00 +2408,-44.00 +2409,-44.00 +2410,-48.00 +2411,-48.00 +2412,-52.00 +2413,-52.00 +2414,-56.00 +2415,-56.00 +2416,-56.00 +2417,-56.00 +2418,-56.00 +2419,-52.00 +2420,-60.00 +2421,-56.00 +2422,-52.00 +2423,-56.00 +2424,-52.00 +2425,-52.00 +2426,-56.00 +2427,-52.00 +2428,-56.00 +2429,-60.00 +2430,-60.00 +2431,-64.00 +2432,-64.00 +2433,-60.00 +2434,-68.00 +2435,-56.00 +2436,-56.00 +2437,-56.00 +2438,-56.00 +2439,-56.00 +2440,-60.00 +2441,-60.00 +2442,-64.00 +2443,-64.00 +2444,-68.00 +2445,-72.00 +2446,-72.00 +2447,-68.00 +2448,-68.00 +2449,-64.00 +2450,-72.00 +2451,-64.00 +2452,-64.00 +2453,-60.00 +2454,-60.00 +2455,-68.00 +2456,-64.00 +2457,-64.00 +2458,-64.00 +2459,-60.00 +2460,-64.00 +2461,-68.00 +2462,-64.00 +2463,-64.00 +2464,-72.00 +2465,-68.00 +2466,-80.00 +2467,-76.00 +2468,-80.00 +2469,-80.00 +2470,-76.00 +2471,-76.00 +2472,-72.00 +2473,-68.00 +2474,-68.00 +2475,-72.00 +2476,-68.00 +2477,-72.00 +2478,-72.00 +2479,-68.00 +2480,-68.00 +2481,-72.00 +2482,-72.00 +2483,-72.00 +2484,-72.00 +2485,-72.00 +2486,-76.00 +2487,-80.00 +2488,-84.00 +2489,-84.00 +2490,-84.00 +2491,-92.00 +2492,-84.00 +2493,-80.00 +2494,-84.00 +2495,-80.00 +2496,-80.00 +2497,-84.00 +2498,-84.00 +2499,-84.00 +2500,-84.00 +2501,-88.00 +2502,-92.00 +2503,-92.00 +2504,-88.00 +2505,-92.00 +2506,-96.00 +2507,-88.00 +2508,-88.00 +2509,-88.00 +2510,-88.00 +2511,-88.00 +2512,-88.00 +2513,-84.00 +2514,-88.00 +2515,-92.00 +2516,-88.00 +2517,-92.00 +2518,-92.00 +2519,-92.00 +2520,-96.00 +2521,-92.00 +2522,-92.00 +2523,-92.00 +2524,-88.00 +2525,-84.00 +2526,-80.00 +2527,-76.00 +2528,-80.00 +2529,-80.00 +2530,-80.00 +2531,-84.00 +2532,-80.00 +2533,-80.00 +2534,-80.00 +2535,-84.00 +2536,-84.00 +2537,-92.00 +2538,-88.00 +2539,-80.00 +2540,-96.00 +2541,-92.00 +2542,-96.00 +2543,-96.00 +2544,-96.00 +2545,-92.00 +2546,-92.00 +2547,-92.00 +2548,-84.00 +2549,-88.00 +2550,-84.00 +2551,-84.00 +2552,-88.00 +2553,-88.00 +2554,-84.00 +2555,-88.00 +2556,-84.00 +2557,-84.00 +2558,-88.00 +2559,-84.00 +2560,-92.00 +2561,-96.00 +2562,-92.00 +2563,-96.00 +2564,-100.00 +2565,-100.00 +2566,-96.00 +2567,-92.00 +2568,-96.00 +2569,-92.00 +2570,-92.00 +2571,-96.00 +2572,-100.00 +2573,-92.00 +2574,-96.00 +2575,-96.00 +2576,-100.00 +2577,-104.00 +2578,-100.00 +2579,-100.00 +2580,-96.00 +2581,-100.00 +2582,-100.00 +2583,-100.00 +2584,-100.00 +2585,-100.00 +2586,-100.00 +2587,-96.00 +2588,-96.00 +2589,-100.00 +2590,-104.00 +2591,-104.00 +2592,-100.00 +2593,-104.00 +2594,-108.00 +2595,-112.00 +2596,-112.00 +2597,-108.00 +2598,-112.00 +2599,-104.00 +2600,-108.00 +2601,-100.00 +2602,-100.00 +2603,-108.00 +2604,-108.00 +2605,-100.00 +2606,-100.00 +2607,-104.00 +2608,-104.00 +2609,-100.00 +2610,-100.00 +2611,-104.00 +2612,-104.00 +2613,-96.00 +2614,-104.00 +2615,-112.00 +2616,-108.00 +2617,-108.00 +2618,-112.00 +2619,-112.00 +2620,-128.00 +2621,-116.00 +2622,-112.00 +2623,-116.00 +2624,-112.00 +2625,-112.00 +2626,-116.00 +2627,-108.00 +2628,-112.00 +2629,-108.00 +2630,-108.00 +2631,-100.00 +2632,-108.00 +2633,-112.00 +2634,-112.00 +2635,-112.00 +2636,-120.00 +2637,-112.00 +2638,-116.00 +2639,-112.00 +2640,-112.00 +2641,-108.00 +2642,-108.00 +2643,-96.00 +2644,-108.00 +2645,-108.00 +2646,-104.00 +2647,-108.00 +2648,-112.00 +2649,-112.00 +2650,-120.00 +2651,-112.00 +2652,-112.00 +2653,-112.00 +2654,-112.00 +2655,-112.00 +2656,-112.00 +2657,-108.00 +2658,-108.00 +2659,-108.00 +2660,-104.00 +2661,-112.00 +2662,-112.00 +2663,-112.00 +2664,-108.00 +2665,-108.00 +2666,-112.00 +2667,-112.00 +2668,-112.00 +2669,-112.00 +2670,-112.00 +2671,-116.00 +2672,-120.00 +2673,-120.00 +2674,-120.00 +2675,-112.00 +2676,-112.00 +2677,-112.00 +2678,-108.00 +2679,-108.00 +2680,-108.00 +2681,-108.00 +2682,-104.00 +2683,-104.00 +2684,-104.00 +2685,-100.00 +2686,-104.00 +2687,-104.00 +2688,-100.00 +2689,-100.00 +2690,-96.00 +2691,-100.00 +2692,-104.00 +2693,-112.00 +2694,-112.00 +2695,-116.00 +2696,-112.00 +2697,-108.00 +2698,-104.00 +2699,-96.00 +2700,-100.00 +2701,-100.00 +2702,-100.00 +2703,-100.00 +2704,-100.00 +2705,-104.00 +2706,-100.00 +2707,-104.00 +2708,-108.00 +2709,-108.00 +2710,-108.00 +2711,-104.00 +2712,-104.00 +2713,-100.00 +2714,-96.00 +2715,-92.00 +2716,-96.00 +2717,-92.00 +2718,-92.00 +2719,-92.00 +2720,-88.00 +2721,-88.00 +2722,-92.00 +2723,-92.00 +2724,-100.00 +2725,-88.00 +2726,-96.00 +2727,-88.00 +2728,-84.00 +2729,-88.00 +2730,-84.00 +2731,-80.00 +2732,-80.00 +2733,-76.00 +2734,-72.00 +2735,-72.00 +2736,-72.00 +2737,-68.00 +2738,-72.00 +2739,-68.00 +2740,-64.00 +2741,-68.00 +2742,-68.00 +2743,-72.00 +2744,-72.00 +2745,-72.00 +2746,-72.00 +2747,-76.00 +2748,-68.00 +2749,-72.00 +2750,-68.00 +2751,-64.00 +2752,-56.00 +2753,-64.00 +2754,-48.00 +2755,-56.00 +2756,-52.00 +2757,-52.00 +2758,-52.00 +2759,-52.00 +2760,-48.00 +2761,-44.00 +2762,-44.00 +2763,-44.00 +2764,-44.00 +2765,-52.00 +2766,-44.00 +2767,-44.00 +2768,-52.00 +2769,-44.00 +2770,-48.00 +2771,-40.00 +2772,-40.00 +2773,-40.00 +2774,-36.00 +2775,-28.00 +2776,-36.00 +2777,-32.00 +2778,-28.00 +2779,-28.00 +2780,-28.00 +2781,-28.00 +2782,-32.00 +2783,-28.00 +2784,-24.00 +2785,-24.00 +2786,-24.00 +2787,-24.00 +2788,-20.00 +2789,-16.00 +2790,-16.00 +2791,-12.00 +2792,-4.00 +2793,-12.00 +2794,-16.00 +2795,-12.00 +2796,-4.00 +2797,-12.00 +2798,-12.00 +2799,-12.00 +2800,-4.00 +2801,-4.00 +2802,4.00 +2803,-4.00 +2804,12.00 +2805,4.00 +2806,12.00 +2807,12.00 +2808,16.00 +2809,16.00 +2810,8.00 +2811,16.00 +2812,24.00 +2813,16.00 +2814,24.00 +2815,16.00 +2816,24.00 +2817,20.00 +2818,16.00 +2819,24.00 +2820,24.00 +2821,24.00 +2822,16.00 +2823,20.00 +2824,20.00 +2825,24.00 +2826,24.00 +2827,28.00 +2828,28.00 +2829,28.00 +2830,36.00 +2831,36.00 +2832,40.00 +2833,44.00 +2834,44.00 +2835,52.00 +2836,48.00 +2837,52.00 +2838,48.00 +2839,48.00 +2840,44.00 +2841,52.00 +2842,40.00 +2843,48.00 +2844,48.00 +2845,52.00 +2846,60.00 +2847,60.00 +2848,60.00 +2849,64.00 +2850,64.00 +2851,64.00 +2852,72.00 +2853,68.00 +2854,72.00 +2855,64.00 +2856,72.00 +2857,72.00 +2858,72.00 +2859,72.00 +2860,76.00 +2861,80.00 +2862,80.00 +2863,84.00 +2864,84.00 +2865,92.00 +2866,92.00 +2867,92.00 +2868,92.00 +2869,92.00 +2870,96.00 +2871,96.00 +2872,96.00 +2873,96.00 +2874,96.00 +2875,100.00 +2876,92.00 +2877,96.00 +2878,96.00 +2879,104.00 +2880,112.00 +2881,112.00 +2882,116.00 +2883,116.00 +2884,116.00 +2885,120.00 +2886,120.00 +2887,128.00 +2888,132.00 +2889,124.00 +2890,132.00 +2891,128.00 +2892,132.00 +2893,128.00 +2894,132.00 +2895,132.00 +2896,132.00 +2897,132.00 +2898,132.00 +2899,132.00 +2900,132.00 +2901,132.00 +2902,132.00 +2903,136.00 +2904,136.00 +2905,144.00 +2906,144.00 +2907,144.00 +2908,148.00 +2909,152.00 +2910,148.00 +2911,156.00 +2912,152.00 +2913,152.00 +2914,148.00 +2915,148.00 +2916,152.00 +2917,152.00 +2918,156.00 +2919,160.00 +2920,160.00 +2921,168.00 +2922,164.00 +2923,168.00 +2924,176.00 +2925,168.00 +2926,172.00 +2927,168.00 +2928,164.00 +2929,164.00 +2930,168.00 +2931,164.00 +2932,168.00 +2933,176.00 +2934,176.00 +2935,176.00 +2936,176.00 +2937,176.00 +2938,176.00 +2939,180.00 +2940,176.00 +2941,180.00 +2942,176.00 +2943,180.00 +2944,184.00 +2945,176.00 +2946,184.00 +2947,180.00 +2948,180.00 +2949,180.00 +2950,176.00 +2951,176.00 +2952,172.00 +2953,180.00 +2954,180.00 +2955,176.00 +2956,184.00 +2957,188.00 +2958,192.00 +2959,188.00 +2960,188.00 +2961,192.00 +2962,192.00 +2963,188.00 +2964,192.00 +2965,192.00 +2966,188.00 +2967,192.00 +2968,192.00 +2969,188.00 +2970,188.00 +2971,184.00 +2972,180.00 +2973,176.00 +2974,180.00 +2975,180.00 +2976,176.00 +2977,180.00 +2978,188.00 +2979,184.00 +2980,180.00 +2981,188.00 +2982,180.00 +2983,176.00 +2984,176.00 +2985,176.00 +2986,176.00 +2987,168.00 +2988,168.00 +2989,164.00 +2990,168.00 +2991,168.00 +2992,164.00 +2993,160.00 +2994,164.00 +2995,160.00 +2996,164.00 +2997,160.00 +2998,160.00 +2999,160.00 +3000,152.00 +3001,148.00 +3002,148.00 +3003,152.00 +3004,144.00 +3005,148.00 +3006,144.00 +3007,148.00 +3008,148.00 +3009,140.00 +3010,144.00 +3011,144.00 +3012,144.00 +3013,140.00 +3014,140.00 +3015,136.00 +3016,136.00 +3017,132.00 +3018,136.00 +3019,128.00 +3020,128.00 +3021,124.00 +3022,120.00 +3023,116.00 +3024,112.00 +3025,112.00 +3026,112.00 +3027,112.00 +3028,112.00 +3029,112.00 +3030,112.00 +3031,112.00 +3032,112.00 +3033,116.00 +3034,112.00 +3035,112.00 +3036,112.00 +3037,112.00 +3038,104.00 +3039,112.00 +3040,104.00 +3041,96.00 +3042,96.00 +3043,96.00 +3044,100.00 +3045,92.00 +3046,88.00 +3047,92.00 +3048,92.00 +3049,92.00 +3050,92.00 +3051,92.00 +3052,84.00 +3053,92.00 +3054,88.00 +3055,88.00 +3056,88.00 +3057,80.00 +3058,84.00 +3059,76.00 +3060,76.00 +3061,80.00 +3062,80.00 +3063,80.00 +3064,80.00 +3065,80.00 +3066,80.00 +3067,76.00 +3068,80.00 +3069,76.00 +3070,72.00 +3071,76.00 +3072,72.00 +3073,152.00 +3074,68.00 +3075,64.00 +3076,64.00 +3077,64.00 +3078,56.00 +3079,56.00 +3080,60.00 +3081,64.00 +3082,56.00 +3083,60.00 +3084,64.00 +3085,64.00 +3086,64.00 +3087,64.00 +3088,68.00 +3089,64.00 +3090,64.00 +3091,64.00 +3092,60.00 +3093,52.00 +3094,52.00 +3095,56.00 +3096,48.00 +3097,52.00 +3098,44.00 +3099,44.00 +3100,36.00 +3101,36.00 +3102,40.00 +3103,40.00 +3104,40.00 +3105,36.00 +3106,40.00 +3107,40.00 +3108,40.00 +3109,44.00 +3110,44.00 +3111,40.00 +3112,40.00 +3113,36.00 +3114,40.00 +3115,36.00 +3116,40.00 +3117,28.00 +3118,32.00 +3119,24.00 +3120,28.00 +3121,24.00 +3122,24.00 +3123,24.00 +3124,24.00 +3125,28.00 +3126,24.00 +3127,28.00 +3128,24.00 +3129,24.00 +3130,24.00 +3131,24.00 +3132,20.00 +3133,16.00 +3134,16.00 +3135,12.00 +3136,16.00 +3137,16.00 +3138,16.00 +3139,16.00 +3140,20.00 +3141,16.00 +3142,16.00 +3143,16.00 +3144,12.00 +3145,16.00 +3146,16.00 +3147,16.00 +3148,12.00 +3149,8.00 +3150,4.00 +3151,4.00 +3152,-4.00 +3153,-4.00 +3154,4.00 +3155,4.00 +3156,4.00 +3157,4.00 +3158,8.00 +3159,4.00 +3160,4.00 +3161,4.00 +3162,4.00 +3163,4.00 +3164,4.00 +3165,4.00 +3166,4.00 +3167,4.00 +3168,4.00 +3169,4.00 +3170,4.00 +3171,0.00 +3172,4.00 +3173,-4.00 +3174,-4.00 +3175,-4.00 +3176,-4.00 +3177,-16.00 +3178,-16.00 +3179,-16.00 +3180,-16.00 +3181,-16.00 +3182,-20.00 +3183,-16.00 +3184,-12.00 +3185,-12.00 +3186,-16.00 +3187,-8.00 +3188,-12.00 +3189,-16.00 +3190,-16.00 +3191,-24.00 +3192,-24.00 +3193,-24.00 +3194,-24.00 +3195,-24.00 +3196,-24.00 +3197,-20.00 +3198,-24.00 +3199,-24.00 +3200,-16.00 +3201,-24.00 +3202,-24.00 +3203,-24.00 +3204,-12.00 +3205,-24.00 +3206,-24.00 +3207,-28.00 +3208,-28.00 +3209,-28.00 +3210,-32.00 +3211,-24.00 +3212,-24.00 +3213,-28.00 +3214,-24.00 +3215,-24.00 +3216,-24.00 +3217,-24.00 +3218,-24.00 +3219,-24.00 +3220,-28.00 +3221,-24.00 +3222,-24.00 +3223,-32.00 +3224,-24.00 +3225,-24.00 +3226,-32.00 +3227,-32.00 +3228,-40.00 +3229,-36.00 +3230,-40.00 +3231,-40.00 +3232,-44.00 +3233,-44.00 +3234,-40.00 +3235,-28.00 +3236,-32.00 +3237,-32.00 +3238,-28.00 +3239,-28.00 +3240,-28.00 +3241,-32.00 +3242,-36.00 +3243,-36.00 +3244,-32.00 +3245,-36.00 +3246,-36.00 +3247,-40.00 +3248,-40.00 +3249,-44.00 +3250,-48.00 +3251,-48.00 +3252,-52.00 +3253,-48.00 +3254,-44.00 +3255,-48.00 +3256,-44.00 +3257,-44.00 +3258,-44.00 +3259,-48.00 +3260,-44.00 +3261,-52.00 +3262,-44.00 +3263,-52.00 +3264,-52.00 +3265,-52.00 +3266,-52.00 +3267,-52.00 +3268,-52.00 +3269,-52.00 +3270,-52.00 +3271,-52.00 +3272,-52.00 +3273,-52.00 +3274,-48.00 +3275,-52.00 +3276,-52.00 +3277,-52.00 +3278,-48.00 +3279,-56.00 +3280,-52.00 +3281,-56.00 +3282,-60.00 +3283,-56.00 +3284,-56.00 +3285,-48.00 +3286,-52.00 +3287,-60.00 +3288,-52.00 +3289,-52.00 +3290,-48.00 +3291,-52.00 +3292,-52.00 +3293,-52.00 +3294,-52.00 +3295,-44.00 +3296,-56.00 +3297,-56.00 +3298,-56.00 +3299,-60.00 +3300,-52.00 +3301,-60.00 +3302,-56.00 +3303,-64.00 +3304,-60.00 +3305,-64.00 +3306,-72.00 +3307,-72.00 +3308,-68.00 +3309,-56.00 +3310,-72.00 +3311,-72.00 +3312,-64.00 +3313,-56.00 +3314,-64.00 +3315,-56.00 +3316,-68.00 +3317,-64.00 +3318,-60.00 +3319,-64.00 +3320,-68.00 +3321,-64.00 +3322,-68.00 +3323,-68.00 +3324,-72.00 +3325,-68.00 +3326,-68.00 +3327,-72.00 +3328,-68.00 +3329,-68.00 +3330,-64.00 +3331,-72.00 +3332,-64.00 +3333,-68.00 +3334,-64.00 +3335,-68.00 +3336,-64.00 +3337,-72.00 +3338,-72.00 +3339,-76.00 +3340,-76.00 +3341,-80.00 +3342,-72.00 +3343,-80.00 +3344,-76.00 +3345,-72.00 +3346,-72.00 +3347,-72.00 +3348,-72.00 +3349,-72.00 +3350,-76.00 +3351,-80.00 +3352,-80.00 +3353,-80.00 +3354,-80.00 +3355,-84.00 +3356,-80.00 +3357,-92.00 +3358,-96.00 +3359,-96.00 +3360,-92.00 +3361,-96.00 +3362,-92.00 +3363,-92.00 +3364,-92.00 +3365,-88.00 +3366,-88.00 +3367,-84.00 +3368,-80.00 +3369,-80.00 +3370,-84.00 +3371,-76.00 +3372,-84.00 +3373,-88.00 +3374,-88.00 +3375,-88.00 +3376,-88.00 +3377,-92.00 +3378,-84.00 +3379,-92.00 +3380,-88.00 +3381,-92.00 +3382,-96.00 +3383,-96.00 +3384,-100.00 +3385,-96.00 +3386,-96.00 +3387,-92.00 +3388,-92.00 +3389,-88.00 +3390,-92.00 +3391,-88.00 +3392,-92.00 +3393,-92.00 +3394,-92.00 +3395,-88.00 +3396,-92.00 +3397,-92.00 +3398,-84.00 +3399,-92.00 +3400,-88.00 +3401,-96.00 +3402,-92.00 +3403,-88.00 +3404,-84.00 +3405,-84.00 +3406,-80.00 +3407,-84.00 +3408,-80.00 +3409,-80.00 +3410,-84.00 +3411,-84.00 +3412,-84.00 +3413,-96.00 +3414,-92.00 +3415,-84.00 +3416,-92.00 +3417,-84.00 +3418,-88.00 +3419,-84.00 +3420,-88.00 +3421,-76.00 +3422,-84.00 +3423,-88.00 +3424,-84.00 +3425,-84.00 +3426,-88.00 +3427,-88.00 +3428,-88.00 +3429,-88.00 +3430,-96.00 +3431,-92.00 +3432,-92.00 +3433,-100.00 +3434,-100.00 +3435,-100.00 +3436,-96.00 +3437,-96.00 +3438,-96.00 +3439,-96.00 +3440,-100.00 +3441,-96.00 +3442,-96.00 +3443,-92.00 +3444,-100.00 +3445,-92.00 +3446,-96.00 +3447,-92.00 +3448,-96.00 +3449,-92.00 +3450,-96.00 +3451,-96.00 +3452,-100.00 +3453,-100.00 +3454,-108.00 +3455,-104.00 +3456,-108.00 +3457,-108.00 +3458,-108.00 +3459,-108.00 +3460,-100.00 +3461,-104.00 +3462,-104.00 +3463,-108.00 +3464,-108.00 +3465,-108.00 +3466,-108.00 +3467,-108.00 +3468,-100.00 +3469,-100.00 +3470,-108.00 +3471,-112.00 +3472,-112.00 +3473,-108.00 +3474,-112.00 +3475,-112.00 +3476,-108.00 +3477,-108.00 +3478,-108.00 +3479,-104.00 +3480,-104.00 +3481,-104.00 +3482,-108.00 +3483,-96.00 +3484,-112.00 +3485,-108.00 +3486,-112.00 +3487,-112.00 +3488,-112.00 +3489,-108.00 +3490,-108.00 +3491,-100.00 +3492,-96.00 +3493,-104.00 +3494,-104.00 +3495,-100.00 +3496,-96.00 +3497,-100.00 +3498,-100.00 +3499,-104.00 +3500,-108.00 +3501,-100.00 +3502,-100.00 +3503,-100.00 +3504,-104.00 +3505,-96.00 +3506,-104.00 +3507,-104.00 +3508,-112.00 +3509,-116.00 +3510,-112.00 +3511,-116.00 +3512,-112.00 +3513,-108.00 +3514,-108.00 +3515,-108.00 +3516,-104.00 +3517,-108.00 +3518,-108.00 +3519,-100.00 +3520,-100.00 +3521,-100.00 +3522,-104.00 +3523,-108.00 +3524,-108.00 +3525,-100.00 +3526,-100.00 +3527,-108.00 +3528,-108.00 +3529,-112.00 +3530,-112.00 +3531,-112.00 +3532,-108.00 +3533,-112.00 +3534,-108.00 +3535,-108.00 +3536,-108.00 +3537,-104.00 +3538,-108.00 +3539,-104.00 +3540,-104.00 +3541,-108.00 +3542,-108.00 +3543,-108.00 +3544,-112.00 +3545,-108.00 +3546,-108.00 +3547,-112.00 +3548,-108.00 +3549,-104.00 +3550,-104.00 +3551,-100.00 +3552,-104.00 +3553,-104.00 +3554,-104.00 +3555,-104.00 +3556,-100.00 +3557,-100.00 +3558,-100.00 +3559,-108.00 +3560,-100.00 +3561,-108.00 +3562,-108.00 +3563,-108.00 +3564,-108.00 +3565,-100.00 +3566,-100.00 +3567,-100.00 +3568,-96.00 +3569,-92.00 +3570,-92.00 +3571,-92.00 +3572,-88.00 +3573,-88.00 +3574,-84.00 +3575,-88.00 +3576,-88.00 +3577,-84.00 +3578,-80.00 +3579,-88.00 +3580,-80.00 +3581,-84.00 +3582,-92.00 +3583,-80.00 +3584,-92.00 +3585,-88.00 +3586,-92.00 +3587,-84.00 +3588,-88.00 +3589,-80.00 +3590,-80.00 +3591,-72.00 +3592,-80.00 +3593,-76.00 +3594,-76.00 +3595,-72.00 +3596,-72.00 +3597,-72.00 +3598,-64.00 +3599,-68.00 +3600,-68.00 +3601,-68.00 +3602,-68.00 +3603,-72.00 +3604,-64.00 +3605,-64.00 +3606,-56.00 +3607,-60.00 +3608,-56.00 +3609,-52.00 +3610,-48.00 +3611,-48.00 +3612,-52.00 +3613,-60.00 +3614,-52.00 +3615,-48.00 +3616,-48.00 +3617,-48.00 +3618,-52.00 +3619,-52.00 +3620,-44.00 +3621,-44.00 +3622,-44.00 +3623,-40.00 +3624,-40.00 +3625,-40.00 +3626,-36.00 +3627,-28.00 +3628,-40.00 +3629,-40.00 +3630,-36.00 +3631,-40.00 +3632,-32.00 +3633,-28.00 +3634,-28.00 +3635,-32.00 +3636,-40.00 +3637,-36.00 +3638,-32.00 +3639,-24.00 +3640,-28.00 +3641,-24.00 +3642,-24.00 +3643,-16.00 +3644,-12.00 +3645,-8.00 +3646,-4.00 +3647,-4.00 +3648,-8.00 +3649,-8.00 +3650,-4.00 +3651,-4.00 +3652,-4.00 +3653,4.00 +3654,4.00 +3655,4.00 +3656,4.00 +3657,4.00 +3658,-4.00 +3659,-4.00 +3660,-4.00 +3661,-4.00 +3662,4.00 +3663,-4.00 +3664,4.00 +3665,4.00 +3666,8.00 +3667,16.00 +3668,16.00 +3669,12.00 +3670,16.00 +3671,24.00 +3672,20.00 +3673,24.00 +3674,20.00 +3675,20.00 +3676,24.00 +3677,20.00 +3678,24.00 +3679,28.00 +3680,28.00 +3681,28.00 +3682,36.00 +3683,36.00 +3684,40.00 +3685,40.00 +3686,40.00 +3687,36.00 +3688,40.00 +3689,40.00 +3690,40.00 +3691,40.00 +3692,40.00 +3693,44.00 +3694,52.00 +3695,52.00 +3696,52.00 +3697,64.00 +3698,60.00 +3699,60.00 +3700,64.00 +3701,64.00 +3702,68.00 +3703,68.00 +3704,64.00 +3705,72.00 +3706,72.00 +3707,72.00 +3708,68.00 +3709,72.00 +3710,68.00 +3711,72.00 +3712,68.00 +3713,68.00 +3714,72.00 +3715,72.00 +3716,76.00 +3717,84.00 +3718,84.00 +3719,92.00 +3720,92.00 +3721,92.00 +3722,96.00 +3723,100.00 +3724,96.00 +3725,104.00 +3726,100.00 +3727,104.00 +3728,96.00 +3729,96.00 +3730,104.00 +3731,112.00 +3732,104.00 +3733,96.00 +3734,104.00 +3735,108.00 +3736,108.00 +3737,108.00 +3738,112.00 +3739,112.00 +3740,120.00 +3741,124.00 +3742,124.00 +3743,128.00 +3744,120.00 +3745,120.00 +3746,124.00 +3747,128.00 +3748,124.00 +3749,124.00 +3750,132.00 +3751,132.00 +3752,132.00 +3753,132.00 +3754,132.00 +3755,136.00 +3756,136.00 +3757,140.00 +3758,144.00 +3759,144.00 +3760,148.00 +3761,144.00 +3762,144.00 +3763,140.00 +3764,148.00 +3765,152.00 +3766,148.00 +3767,152.00 +3768,156.00 +3769,164.00 +3770,160.00 +3771,164.00 +3772,168.00 +3773,164.00 +3774,168.00 +3775,176.00 +3776,172.00 +3777,176.00 +3778,172.00 +3779,176.00 +3780,176.00 +3781,176.00 +3782,176.00 +3783,172.00 +3784,176.00 +3785,176.00 +3786,164.00 +3787,176.00 +3788,164.00 +3789,168.00 +3790,172.00 +3791,176.00 +3792,176.00 +3793,180.00 +3794,180.00 +3795,180.00 +3796,188.00 +3797,188.00 +3798,188.00 +3799,184.00 +3800,184.00 +3801,188.00 +3802,188.00 +3803,188.00 +3804,188.00 +3805,180.00 +3806,176.00 +3807,176.00 +3808,176.00 +3809,184.00 +3810,180.00 +3811,184.00 +3812,188.00 +3813,188.00 +3814,188.00 +3815,188.00 +3816,184.00 +3817,192.00 +3818,188.00 +3819,184.00 +3820,176.00 +3821,184.00 +3822,188.00 +3823,180.00 +3824,180.00 +3825,180.00 +3826,184.00 +3827,184.00 +3828,188.00 +3829,188.00 +3830,188.00 +3831,188.00 +3832,184.00 +3833,180.00 +3834,180.00 +3835,188.00 +3836,180.00 +3837,180.00 +3838,172.00 +3839,176.00 +3840,172.00 +3841,172.00 +3842,172.00 +3843,176.00 +3844,172.00 +3845,176.00 +3846,176.00 +3847,176.00 +3848,176.00 +3849,172.00 +3850,168.00 +3851,168.00 +3852,172.00 +3853,176.00 +3854,168.00 +3855,164.00 +3856,160.00 +3857,164.00 +3858,160.00 +3859,160.00 +3860,152.00 +3861,148.00 +3862,148.00 +3863,148.00 +3864,136.00 +3865,140.00 +3866,136.00 +3867,136.00 +3868,136.00 +3869,148.00 +3870,144.00 +3871,136.00 +3872,140.00 +3873,136.00 +3874,136.00 +3875,136.00 +3876,136.00 +3877,132.00 +3878,132.00 +3879,124.00 +3880,124.00 +3881,124.00 +3882,120.00 +3883,120.00 +3884,120.00 +3885,116.00 +3886,124.00 +3887,112.00 +3888,116.00 +3889,112.00 +3890,112.00 +3891,112.00 +3892,112.00 +3893,104.00 +3894,108.00 +3895,100.00 +3896,96.00 +3897,100.00 +3898,100.00 +3899,96.00 +3900,96.00 +3901,96.00 +3902,96.00 +3903,96.00 +3904,92.00 +3905,96.00 +3906,92.00 +3907,96.00 +3908,92.00 +3909,96.00 +3910,92.00 +3911,88.00 +3912,88.00 +3913,84.00 +3914,80.00 +3915,80.00 +3916,80.00 +3917,80.00 +3918,80.00 +3919,84.00 +3920,88.00 +3921,80.00 +3922,84.00 +3923,80.00 +3924,84.00 +3925,84.00 +3926,80.00 +3927,84.00 +3928,80.00 +3929,76.00 +3930,80.00 +3931,80.00 +3932,76.00 +3933,72.00 +3934,76.00 +3935,72.00 +3936,68.00 +3937,64.00 +3938,64.00 +3939,64.00 +3940,56.00 +3941,56.00 +3942,60.00 +3943,68.00 +3944,64.00 +3945,56.00 +3946,56.00 +3947,64.00 +3948,56.00 +3949,60.00 +3950,60.00 +3951,56.00 +3952,56.00 +3953,52.00 +3954,44.00 +3955,48.00 +3956,44.00 +3957,44.00 +3958,48.00 +3959,44.00 +3960,48.00 +3961,48.00 +3962,44.00 +3963,44.00 +3964,48.00 +3965,48.00 +3966,40.00 +3967,28.00 +3968,32.00 +3969,32.00 +3970,28.00 +3971,32.00 +3972,32.00 +3973,36.00 +3974,36.00 +3975,48.00 +3976,56.00 +3977,56.00 +3978,56.00 +3979,56.00 +3980,48.00 +3981,48.00 +3982,56.00 +3983,48.00 +3984,48.00 +3985,48.00 +3986,44.00 +3987,44.00 +3988,40.00 +3989,44.00 +3990,44.00 +3991,80.00 +3992,76.00 +3993,72.00 +3994,72.00 +3995,68.00 +3996,72.00 +3997,72.00 +3998,64.00 +3999,72.00 diff --git a/examples/example_usage.py b/examples/example_usage.py new file mode 100644 index 0000000..9682709 --- /dev/null +++ b/examples/example_usage.py @@ -0,0 +1,55 @@ +import matplotlib.pyplot as plt +from scope_parser import parse_owon_data, parse_gwinstek_data + +# Parse OWON data +print("=== OWON Data ===") +owon_data = parse_owon_data("Example Wave OWON.CSV") +ch1 = owon_data["CH1"] +print(f"Samples: {len(ch1.voltage_values)}") +print(f"Sample interval: {ch1.time_interval} s") +print(f"Frequency (approx): {ch1.frequency} Hz") + +print() + +# Parse Gwinstek data +print("=== Gwinstek Data ===") +gwinstek_data = parse_gwinstek_data("Example Wave Gwinstek.CSV") +ch1_gw = gwinstek_data["CH1"] +print(f"Samples: {len(ch1_gw.voltage_values)}") +print(f"Average: {ch1_gw.average:.6f} V") + +# Plot both waveforms +fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8)) + +# OWON plot +ax1.plot(ch1.time_values * 1000, ch1.voltage_values * 1000, "b-", linewidth=0.8) +ax1.set_title("OWON Oscilloscope Data") +ax1.set_xlabel("Time (ms)") +ax1.set_ylabel("Voltage (mV)") +ax1.grid(True, alpha=0.3) +ax1.text( + 0.02, + 0.95, + f"Frequency: {ch1.frequency} Hz\nPeak-to-peak: {ch1.vpp*1000:.1f} mV", + transform=ax1.transAxes, + verticalalignment="top", + bbox=dict(boxstyle="round", facecolor="wheat", alpha=0.8), +) + +# Gwinstek plot +ax2.plot(ch1_gw.time_values * 1000, ch1_gw.voltage_values, "r-", linewidth=0.8) +ax2.set_title("Gwinstek Oscilloscope Data") +ax2.set_xlabel("Time (ms)") +ax2.set_ylabel("Voltage (V)") +ax2.grid(True, alpha=0.3) +ax2.text( + 0.02, + 0.95, + f"Average: {ch1_gw.average:.3f} V\nRange: {ch1_gw.voltage_values.min():.3f} to {ch1_gw.voltage_values.max():.3f} V", + transform=ax2.transAxes, + verticalalignment="top", + bbox=dict(boxstyle="round", facecolor="lightcoral", alpha=0.8), +) + +plt.tight_layout() +plt.show() diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b281ccd --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,16 @@ +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[project] +name = "simple-scope-parser" +version = "0.1.0" +description = "Simple oscilloscope CSV parser" +readme = "README.md" +requires-python = ">=3.7" +license = { text = "MIT" } +authors = [{ name = "Joe" }] +dependencies = ["numpy>=1.19.0"] + +[tool.setuptools.packages.find] +include = ["scope_parser*"] diff --git a/scope_parser/__init__.py b/scope_parser/__init__.py new file mode 100644 index 0000000..b18b3bb --- /dev/null +++ b/scope_parser/__init__.py @@ -0,0 +1,9 @@ +""" +Joe's Really Simple Scope Parser +""" + +from .parsers import parse_owon_data, parse_gwinstek_data +from .data import ScopeData, ChannelData + +__version__ = "0.1.0" +__all__ = ["parse_owon_data", "parse_gwinstek_data", "ScopeData", "ChannelData"] diff --git a/scope_parser/base_parser.py b/scope_parser/base_parser.py new file mode 100644 index 0000000..c58a57c --- /dev/null +++ b/scope_parser/base_parser.py @@ -0,0 +1,72 @@ +""" +Base parser class for oscilloscope data parsers. +""" + +from abc import ABC, abstractmethod +from typing import Dict, List, Optional +import numpy as np + +from .data import ScopeData, ChannelData + + +class BaseOscilloscopeParser(ABC): + """Base class for oscilloscope data parsers.""" + + @abstractmethod + def parse(self, file_path: str) -> ScopeData: + """Parse oscilloscope data from file.""" + pass + + @abstractmethod + def can_parse(self, file_path: str) -> bool: + """Check if this parser can handle the given file.""" + pass + + def _extract_time_interval(self, metadata: Dict[str, str]) -> float: + """Extract time interval between samples in seconds.""" + # Default implementation - can be overridden by subclasses + interval_str = metadata.get("Time interval", "") + if interval_str: + if "uS" in interval_str: + return float(interval_str.replace("uS", "")) * 1e-6 + elif "nS" in interval_str: + return float(interval_str.replace("nS", "")) * 1e-9 + elif "mS" in interval_str: + return float(interval_str.replace("mS", "")) * 1e-3 + elif "S" in interval_str: + return float(interval_str.replace("S", "")) + return 1e-6 # Default to 1 µs + + def _extract_frequency(self, metadata: Dict[str, str]) -> Optional[float]: + """Extract frequency from metadata if available.""" + freq_str = metadata.get("Frequency", "") + if freq_str.startswith("F="): + # Extract frequency value and convert units + freq_value = freq_str[2:] + if "kHz" in freq_value: + return float(freq_value.replace("kHz", "")) * 1000 + elif "Hz" in freq_value: + return float(freq_value.replace("Hz", "")) + return None + + def _extract_vpp(self, metadata: Dict[str, str]) -> Optional[float]: + """Extract peak-to-peak voltage from metadata.""" + pp_str = metadata.get("PK-PK", "") + if pp_str.startswith("Vpp="): + value = float(pp_str[4:].replace("mV", "").replace("V", "")) + # Convert mV to V if needed + if "mV" in pp_str: + return value / 1000.0 + return value + return None + + def _extract_average(self, metadata: Dict[str, str]) -> Optional[float]: + """Extract average voltage from metadata.""" + avg_str = metadata.get("Average", "") + if avg_str.startswith("V="): + value = float(avg_str[2:].replace("mV", "").replace("V", "")) + # Convert mV to V if needed + if "mV" in avg_str: + return value / 1000.0 + return value + return None diff --git a/scope_parser/data.py b/scope_parser/data.py new file mode 100644 index 0000000..656fed1 --- /dev/null +++ b/scope_parser/data.py @@ -0,0 +1,100 @@ +""" +Data structures for oscilloscope measurements. +""" + +from dataclasses import dataclass +from typing import List, Dict, Optional +import numpy as np + + +@dataclass +class ChannelData: + """Represents data from a single oscilloscope channel.""" + + channel_name: str + voltage_values: np.ndarray # in volts + time_values: np.ndarray # in seconds + metadata: Dict[str, str] + + @property + def frequency(self) -> Optional[float]: + """Extract frequency from metadata if available.""" + freq_str = self.metadata.get("Frequency", "") + if freq_str.startswith("F="): + # Extract frequency value and convert units + freq_value = freq_str[2:] + if "kHz" in freq_value: + return float(freq_value.replace("kHz", "")) * 1000 + elif "Hz" in freq_value: + return float(freq_value.replace("Hz", "")) + return None + + @property + def vpp(self) -> Optional[float]: + """Peak-to-peak voltage in volts.""" + pp_str = self.metadata.get("PK-PK", "") + if pp_str.startswith("Vpp="): + value = float(pp_str[4:].replace("mV", "").replace("V", "")) + # Convert mV to V if needed + if "mV" in pp_str: + return value / 1000.0 + return value + return None + + @property + def average(self) -> Optional[float]: + """Average voltage in volts (computed from data).""" + return float(np.mean(self.voltage_values)) + + @property + def metadata_average(self) -> Optional[float]: + """Average voltage from metadata in volts.""" + avg_str = self.metadata.get("Average", "") + if avg_str.startswith("V="): + value = float(avg_str[2:].replace("mV", "").replace("V", "")) + # Convert mV to V if needed + if "mV" in avg_str: + return value / 1000.0 + return value + return None + + @property + def time_interval(self) -> Optional[float]: + """Time interval between samples in seconds.""" + interval_str = self.metadata.get("Time interval", "") + if interval_str: + if "uS" in interval_str: + return float(interval_str.replace("uS", "")) * 1e-6 + elif "nS" in interval_str: + return float(interval_str.replace("nS", "")) * 1e-9 + elif "mS" in interval_str: + return float(interval_str.replace("mS", "")) * 1e-3 + elif "S" in interval_str: + return float(interval_str.replace("S", "")) + return None + + +@dataclass +class ScopeData: + """Container for all oscilloscope measurement data.""" + + channels: Dict[str, ChannelData] + metadata: Dict[str, str] + + def __getitem__(self, channel_name: str) -> ChannelData: + """Allow dictionary-like access to channels.""" + return self.channels[channel_name] + + def __iter__(self): + """Allow iteration over channels.""" + return iter(self.channels.values()) + + @property + def channel_names(self) -> List[str]: + """Get list of all channel names.""" + return list(self.channels.keys()) + + @property + def num_channels(self) -> int: + """Get number of channels.""" + return len(self.channels) diff --git a/scope_parser/gwinstek_parser.py b/scope_parser/gwinstek_parser.py new file mode 100644 index 0000000..43a269b --- /dev/null +++ b/scope_parser/gwinstek_parser.py @@ -0,0 +1,118 @@ +""" +Parser for Gwinstek oscilloscope CSV files. +""" + +import csv +from typing import Dict, List +import numpy as np + +from .base_parser import BaseOscilloscopeParser +from .data import ScopeData, ChannelData + + +class GwinstekParser(BaseOscilloscopeParser): + """Parser for Gwinstek oscilloscope CSV files.""" + + def can_parse(self, file_path: str) -> bool: + """Check if file is from Gwinstek scope.""" + try: + with open(file_path, "r") as f: + first_lines = [f.readline().strip() for _ in range(10)] + # Gwinstek-specific + return any("Memory Length" in line for line in first_lines) + except: + return False + + def parse(self, file_path: str) -> ScopeData: + """Parse Gwinstek oscilloscope CSV file.""" + + with open(file_path, "r") as f: + # Read header metadata + metadata_lines = [] + data_start_line = 0 + + for i, line in enumerate(f): + line = line.strip() + if line.startswith("Waveform Data"): # Gwinstek uses this as separator + data_start_line = i + 1 + break + metadata_lines.append(line) + + # Parse metadata + metadata = self._parse_metadata(metadata_lines) + + # Reset file pointer to data section + f.seek(0) + for _ in range(data_start_line): + next(f) + + # Parse waveform data (just numbers, one per line) + voltage_data = [] + time_data = [] + + for i, line in enumerate(f): + line = line.strip() + if not line: # Skip empty lines + continue + + # Remove trailing comma TODO: If 2ch this might not be trailing + if line.endswith(","): + line = line[:-1] + + try: + # Gwinstek data is in pixels, yes its dumb + pixel_value = float(line) + + # Get volts per division from metadata + volts_per_division = float(metadata.get("Vertical Scale", "1.0")) + vertical_position = float(metadata.get("Vertical Position", "0.0")) + + # Convert pixels to voltage: 25 pixels per division + # Pixel 0 is in the middle, so we center around vertical_position + voltage = ( + pixel_value / 25.0 + ) * volts_per_division + vertical_position + voltage_data.append(voltage) + + # Calculate time values from sampling period + sampling_period = float(metadata.get("Sampling Period", "2.0E-06")) + time_data.append(i * sampling_period) + + except ValueError: + # Skip non-numeric lines + continue + + # Create channel data + channel_name = metadata.get("Source", "CH1") + + channel_data = ChannelData( + channel_name=channel_name, + voltage_values=np.array(voltage_data), + time_values=np.array(time_data), + metadata=metadata, + ) + + return ScopeData(channels={channel_name: channel_data}, metadata=metadata) + + def _parse_metadata(self, metadata_lines: List[str]) -> Dict[str, str]: + """Parse metadata from header lines.""" + metadata = {} + + for line in metadata_lines: + if "," in line: + parts = line.split(",", 2) # Gwinstek has 3 parts: key, value, empty + if len(parts) >= 2: + key = parts[0].strip() + value = parts[1].strip() + if value: # Only add non-empty values + metadata[key] = value + + return metadata + + def _extract_time_interval(self, metadata: Dict[str, str]) -> float: + """Extract time interval between samples for Gwinstek format.""" + sampling_period = metadata.get("Sampling Period", "2.0E-06") + try: + return float(sampling_period) + except ValueError: + return 2.0e-6 # Default to 2 µs diff --git a/scope_parser/owon_parser.py b/scope_parser/owon_parser.py new file mode 100644 index 0000000..4f152dc --- /dev/null +++ b/scope_parser/owon_parser.py @@ -0,0 +1,107 @@ +""" +Parser for OWON oscilloscope CSV files. +""" + +import csv +from typing import Dict, List +import numpy as np + +from .base_parser import BaseOscilloscopeParser +from .data import ScopeData, ChannelData + + +class OwonParser(BaseOscilloscopeParser): + """Parser for OWON oscilloscope CSV files.""" + + def can_parse(self, file_path: str) -> bool: + """Check if file is from OWON scope.""" + try: + with open(file_path, "r") as f: + first_lines = [f.readline().strip() for _ in range(10)] + # Look for OWON-specific patterns + return any("Channel" in line and "CH" in line for line in first_lines) + except: + return False + + def parse(self, file_path: str) -> ScopeData: + """Parse OWON oscilloscope CSV file.""" + + with open(file_path, "r") as f: + # Read header metadata + metadata_lines = [] + data_start_line = 0 + + for i, line in enumerate(f): + line = line.strip() + if not line: # Empty line indicates end of metadata + data_start_line = i + 1 + break + metadata_lines.append(line) + + # Parse metadata + metadata = self._parse_metadata(metadata_lines) + + # Reset file pointer to data section + f.seek(0) + for _ in range(data_start_line): + next(f) + + # Parse CSV data + reader = csv.DictReader(f) + + # Extract data columns + voltage_data = [] + time_data = [] + + for row in reader: + # Get voltage data (look for CH*_Voltage column) + voltage_col = None + for col_name in row.keys(): + if "Voltage" in col_name: + voltage_col = col_name + break + + if voltage_col is None: + raise ValueError("Could not find voltage column in CSV data") + + # Convert mV to volts + voltage_mv = float(row[voltage_col]) + voltage_data.append(voltage_mv / 1000.0) + + # Calculate time values from index and time interval + index = int(row["index"]) + time_interval = self._extract_time_interval(metadata) + time_data.append(index * time_interval) + + # Create channel data + channel_name = metadata.get("Channel", "CH1").replace(":", "").strip() + + channel_data = ChannelData( + channel_name=channel_name, + voltage_values=np.array(voltage_data), + time_values=np.array(time_data), + metadata=metadata, + ) + + return ScopeData(channels={channel_name: channel_data}, metadata=metadata) + + def _parse_metadata(self, metadata_lines: List[str]) -> Dict[str, str]: + """ + Parse metadata from header lines. + + You can access the metadata like this: + data = parse_owon_data(".CSV") + print(data.frequency) + print(data.vpp) + """ + metadata = {} + + for line in metadata_lines: + if "," in line: + parts = line.split(",", 1) + if len(parts) == 2: + key = parts[0].strip().rstrip(":").strip() + value = parts[1].strip() + metadata[key] = value + + return metadata diff --git a/scope_parser/parsers.py b/scope_parser/parsers.py new file mode 100644 index 0000000..3a40dc1 --- /dev/null +++ b/scope_parser/parsers.py @@ -0,0 +1,19 @@ +""" +Main Parsers module +""" + +from .owon_parser import OwonParser +from .gwinstek_parser import GwinstekParser +from .data import ScopeData + + +def parse_owon_data(file_path: str) -> ScopeData: + """Parse OWON oscilloscope CSV file.""" + parser = OwonParser() + return parser.parse(file_path) + + +def parse_gwinstek_data(file_path: str) -> ScopeData: + """Parse Gwinstek oscilloscope CSV file.""" + parser = GwinstekParser() + return parser.parse(file_path) diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..a2ac191 --- /dev/null +++ b/setup.py @@ -0,0 +1,46 @@ +""" +Setup script for simple-scope-parser package. +""" + +from setuptools import setup, find_packages + +with open("README.md", "r", encoding="utf-8") as fh: + long_description = fh.read() + +setup( + name="simple-scope-parser", + version="0.1.0", + author="Joe", + description="A simple package for parsing oscilloscope CSV data from various manufacturers", + long_description=long_description, + long_description_content_type="text/markdown", + packages=find_packages(), + classifiers=[ + "Development Status :: 3 - Alpha", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Topic :: Scientific/Engineering :: Physics", + ], + python_requires=">=3.7", + install_requires=[ + "numpy>=1.19.0", + ], + extras_require={ + "dev": [ + "pytest>=6.0", + "black>=21.0", + "flake8>=3.8", + ], + "analysis": [ + "scipy>=1.7.0", + "matplotlib>=3.3.0", + ], + }, +)