From 54242da04b5a9222851a163bf31a8d3ed6a865a9 Mon Sep 17 00:00:00 2001 From: grabowski Date: Thu, 22 Oct 2026 17:01:32 +0700 Subject: [PATCH] Rewrite the driver in Rust; move the testbench tools out The repository is now only the HPCS 6500 driver: a Rust library (serial transport, every protocol command, block parsing, USBPcap captures, a simulated instrument) and the hpcs6500 CLI with the flags of the former hpcs6500.py, plus dump/capture for reverse engineering. The lamp station, lamp export, TM-30, label printer and LED calibration move to B4L/lamp-testbench. Golden tests pin the Rust output to the Python driver's: parsed values bit-exact, report text, CSV and number formatting. The Python driver is at tag python-final. --- .gitattributes | 4 + .gitignore | 27 +- .python-version | 1 - Cargo.lock | 832 + Cargo.toml | 38 + PROTOCOL.md | 3 +- README.md | 254 +- calibration.py | 895 - hpcs6500.py | 887 - label_printer.py | 112 - lamp_export.py | 283 - lamp_station.py | 392 - pyproject.toml | 13 - spectrometer.py | 42 - src/cli/capture.rs | 297 + src/cli/main.rs | 427 + src/device.rs | 446 + src/error.rs | 52 + src/format.rs | 178 + src/lib.rs | 38 + src/pcap.rs | 220 + src/protocol.rs | 226 + src/pyfmt.rs | 267 + src/reading.rs | 334 + src/sim.rs | 284 + tests/fixtures/r01_elec.bin | Bin 0 -> 1584 bytes tests/fixtures/r01_meas.bin | Bin 0 -> 3904 bytes tests/fixtures/r02_elec.bin | Bin 0 -> 1584 bytes tests/fixtures/r02_meas.bin | Bin 0 -> 3904 bytes tests/fixtures/r03_elec.bin | Bin 0 -> 1584 bytes tests/fixtures/r03_meas.bin | Bin 0 -> 3904 bytes tests/fixtures/r04_elec.bin | Bin 0 -> 1584 bytes tests/fixtures/r04_meas.bin | Bin 0 -> 3904 bytes tests/fixtures/r05_elec.bin | Bin 0 -> 1584 bytes tests/fixtures/r05_meas.bin | Bin 0 -> 3904 bytes tests/fixtures/r06_elec.bin | Bin 0 -> 1584 bytes tests/fixtures/r06_meas.bin | Bin 0 -> 3904 bytes tests/fixtures/r07_elec.bin | Bin 0 -> 1584 bytes tests/fixtures/r07_meas.bin | Bin 0 -> 3904 bytes tests/golden.rs | 189 + tests/golden/csv_r01.txt | 2 + tests/golden/csv_r02.txt | 2 + tests/golden/csv_r03.txt | 2 + tests/golden/csv_r04.txt | 2 + tests/golden/csv_r05.txt | 2 + tests/golden/csv_r06.txt | 2 + tests/golden/csv_r07.txt | 2 + tests/golden/format_r01.txt | 41 + tests/golden/format_r01_spectrum.txt | 113 + tests/golden/format_r02.txt | 43 + tests/golden/format_r02_spectrum.txt | 218 + tests/golden/format_r03.txt | 43 + tests/golden/format_r03_spectrum.txt | 219 + tests/golden/format_r04.txt | 41 + tests/golden/format_r04_spectrum.txt | 113 + tests/golden/format_r05.txt | 41 + tests/golden/format_r05_spectrum.txt | 113 + tests/golden/format_r06.txt | 41 + tests/golden/format_r06_spectrum.txt | 113 + tests/golden/format_r07.txt | 41 + tests/golden/format_r07_spectrum.txt | 113 + ...parse_usb_capture_20260204_123655_hub1.txt | 90 + ...capture_20260204_123655_hub1_harmonics.txt | 234 + ...usb_capture_20260204_123655_hub1_quick.txt | 2 + ...parse_usb_capture_20260204_134301_hub1.txt | 47 + ...capture_20260204_134301_hub1_harmonics.txt | 223 + ...usb_capture_20260204_134301_hub1_quick.txt | 1 + tests/golden/pyfmt.json | 1 + tests/golden/quick_r01.txt | 2 + tests/golden/quick_r02.txt | 2 + tests/golden/quick_r03.txt | 2 + tests/golden/quick_r04.txt | 2 + tests/golden/quick_r05.txt | 2 + tests/golden/quick_r06.txt | 2 + tests/golden/quick_r07.txt | 2 + tests/golden/readings.json | 17317 ++++++++++++++++ tests/sim.rs | 143 + tm30.py | 125 - usb_capture.py | 341 - 79 files changed, 23340 insertions(+), 3246 deletions(-) create mode 100644 .gitattributes delete mode 100644 .python-version create mode 100644 Cargo.lock create mode 100644 Cargo.toml delete mode 100644 calibration.py delete mode 100644 hpcs6500.py delete mode 100644 label_printer.py delete mode 100644 lamp_export.py delete mode 100644 lamp_station.py delete mode 100644 pyproject.toml delete mode 100644 spectrometer.py create mode 100644 src/cli/capture.rs create mode 100644 src/cli/main.rs create mode 100644 src/device.rs create mode 100644 src/error.rs create mode 100644 src/format.rs create mode 100644 src/lib.rs create mode 100644 src/pcap.rs create mode 100644 src/protocol.rs create mode 100644 src/pyfmt.rs create mode 100644 src/reading.rs create mode 100644 src/sim.rs create mode 100644 tests/fixtures/r01_elec.bin create mode 100644 tests/fixtures/r01_meas.bin create mode 100644 tests/fixtures/r02_elec.bin create mode 100644 tests/fixtures/r02_meas.bin create mode 100644 tests/fixtures/r03_elec.bin create mode 100644 tests/fixtures/r03_meas.bin create mode 100644 tests/fixtures/r04_elec.bin create mode 100644 tests/fixtures/r04_meas.bin create mode 100644 tests/fixtures/r05_elec.bin create mode 100644 tests/fixtures/r05_meas.bin create mode 100644 tests/fixtures/r06_elec.bin create mode 100644 tests/fixtures/r06_meas.bin create mode 100644 tests/fixtures/r07_elec.bin create mode 100644 tests/fixtures/r07_meas.bin create mode 100644 tests/golden.rs create mode 100644 tests/golden/csv_r01.txt create mode 100644 tests/golden/csv_r02.txt create mode 100644 tests/golden/csv_r03.txt create mode 100644 tests/golden/csv_r04.txt create mode 100644 tests/golden/csv_r05.txt create mode 100644 tests/golden/csv_r06.txt create mode 100644 tests/golden/csv_r07.txt create mode 100644 tests/golden/format_r01.txt create mode 100644 tests/golden/format_r01_spectrum.txt create mode 100644 tests/golden/format_r02.txt create mode 100644 tests/golden/format_r02_spectrum.txt create mode 100644 tests/golden/format_r03.txt create mode 100644 tests/golden/format_r03_spectrum.txt create mode 100644 tests/golden/format_r04.txt create mode 100644 tests/golden/format_r04_spectrum.txt create mode 100644 tests/golden/format_r05.txt create mode 100644 tests/golden/format_r05_spectrum.txt create mode 100644 tests/golden/format_r06.txt create mode 100644 tests/golden/format_r06_spectrum.txt create mode 100644 tests/golden/format_r07.txt create mode 100644 tests/golden/format_r07_spectrum.txt create mode 100644 tests/golden/parse_usb_capture_20260204_123655_hub1.txt create mode 100644 tests/golden/parse_usb_capture_20260204_123655_hub1_harmonics.txt create mode 100644 tests/golden/parse_usb_capture_20260204_123655_hub1_quick.txt create mode 100644 tests/golden/parse_usb_capture_20260204_134301_hub1.txt create mode 100644 tests/golden/parse_usb_capture_20260204_134301_hub1_harmonics.txt create mode 100644 tests/golden/parse_usb_capture_20260204_134301_hub1_quick.txt create mode 100644 tests/golden/pyfmt.json create mode 100644 tests/golden/quick_r01.txt create mode 100644 tests/golden/quick_r02.txt create mode 100644 tests/golden/quick_r03.txt create mode 100644 tests/golden/quick_r04.txt create mode 100644 tests/golden/quick_r05.txt create mode 100644 tests/golden/quick_r06.txt create mode 100644 tests/golden/quick_r07.txt create mode 100644 tests/golden/readings.json create mode 100644 tests/sim.rs delete mode 100644 tm30.py delete mode 100644 usb_capture.py diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..6197f68 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +# keep test data byte-exact on every platform +*.bin binary +*.pcap binary +tests/golden/** -text diff --git a/.gitignore b/.gitignore index 9e9b3bb..64c0939 100644 --- a/.gitignore +++ b/.gitignore @@ -1,27 +1,18 @@ -# Python -__pycache__/ -*.py[oc] -build/ -dist/ -wheels/ -*.egg-info - -# Virtual environments -.venv - -# UV -uv -uv.lock +# Rust +target/ # Captures (binary data, not tracked) captures/ -# Lamp export bundles (published to the website repo instead) +# left over from the Python tools +__pycache__/ +*.py[oc] +.venv +uv +uv.lock lamps/ -# Claude Code -.claude/ - # Local AI-tooling state +.claude/ .claude-flow/ .swarm/ diff --git a/.python-version b/.python-version deleted file mode 100644 index 24ee5b1..0000000 --- a/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.13 diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..9e01c2b --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,832 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "android_system_properties" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "cc" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877bf67ac8e52449eb2f9e98a344ea163beb70dd1f9eebe3cc5357dcfeaee4df" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" + +[[package]] +name = "cfg_aliases" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "num-traits", + "windows-link", +] + +[[package]] +name = "clap" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9c751b79415d4e559e3d1fcf128e09e720eb673a06d26cf6f392d37d75b66e0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "clap_lex" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486" + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "ctrlc" +version = "3.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0b1fab2ae45819af2d0731d60f2afe17227ebb1a1538a236da84c93e9a60162" +dependencies = [ + "dispatch2", + "nix 0.31.3", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.13.2", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "equivalent" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826" + +[[package]] +name = "find-msvc-tools" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c66915cc5391097de7a2b0b972e8505aa33c0df401fd3a6811dbdb32881ba48" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hpcs6500" +version = "0.2.0" +dependencies = [ + "chrono", + "clap", + "ctrlc", + "serde", + "serde_json", + "serialport", + "thiserror", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "indexmap" +version = "2.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "io-kit-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617ee6cf8e3f66f3b4ea67a4058564628cde41901316e19f559e14c7c72c5e7b" +dependencies = [ + "core-foundation-sys", + "mach2", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "js-sys" +version = "0.3.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.191" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a" + +[[package]] +name = "libudev" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b324152da65df7bb95acfcaab55e3097ceaab02fb19b228a9eb74d55f135e0" +dependencies = [ + "libc", + "libudev-sys", +] + +[[package]] +name = "libudev-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "log" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" + +[[package]] +name = "mach2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", +] + +[[package]] +name = "nix" +version = "0.31.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" +dependencies = [ + "bitflags 2.13.2", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "objc2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08849bbd4767dfae9457696856ae1c84fe4e0281bbe4a7abff2d0e06fb7981f8" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "serde_json" +version = "1.0.154" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6" +dependencies = [ + "foldhash", + "indexmap", + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serialport" +version = "4.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba5f8f29aa20853c4e3e85a33ec580eb66be1f057142e77a333834a318bacf2" +dependencies = [ + "bitflags 2.13.2", + "cfg-if", + "core-foundation", + "core-foundation-sys", + "io-kit-sys", + "libudev", + "mach2", + "nix 0.26.4", + "scopeguard", + "unescaper", + "windows-sys 0.52.0", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "unescaper" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7285e83a80ce76f5e7bce79fa41f68d78ba62d1003cf27bf748ab24413808cf4" +dependencies = [ + "thiserror", +] + +[[package]] +name = "unicode-ident" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "wasm-bindgen" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 3.0.9", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..fc13dd9 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "hpcs6500" +version = "0.2.0" +edition = "2024" +rust-version = "1.85" +description = "Open-source driver and CLI for the HPCS 6500 spectrophotometer / integrating sphere" +repository = "https://git.b4l.co.th/B4L/HPCS6500-py" +readme = "README.md" +publish = false + +[features] +default = ["cli"] +# the `hpcs6500` command line tool; library users can turn it off +cli = ["dep:clap", "dep:serde_json", "dep:chrono", "dep:ctrlc"] + +[lib] +name = "hpcs6500" +path = "src/lib.rs" + +[[bin]] +name = "hpcs6500" +path = "src/cli/main.rs" +required-features = ["cli"] + +[dependencies] +serialport = "4.7" +serde = { version = "1", features = ["derive"] } +thiserror = "2" +clap = { version = "4.5", features = ["derive"], optional = true } +serde_json = { version = "1", features = ["preserve_order"], optional = true } +chrono = { version = "0.4", default-features = false, features = ["clock", "std"], optional = true } +ctrlc = { version = "3.4", optional = true } + +[dev-dependencies] +serde_json = { version = "1", features = ["preserve_order"] } + +[profile.release] +strip = true diff --git a/PROTOCOL.md b/PROTOCOL.md index 022f848..39f7778 100644 --- a/PROTOCOL.md +++ b/PROTOCOL.md @@ -1,6 +1,7 @@ # HPCS 6500 USB Protocol Reference -Reverse-engineered from USB packet captures of the vendor software. +Reverse-engineered from USB packet captures of the vendor software. The +Rust driver in `src/` implements it (`protocol.rs`, `device.rs`, `reading.rs`). ## Device Overview diff --git a/README.md b/README.md index 95e2c18..ff64715 100644 --- a/README.md +++ b/README.md @@ -1,170 +1,152 @@ -# HPCS 6500 — Open-Source Driver +# HPCS 6500 — open-source driver -Python driver and CLI for the HPCS 6500 spectrophotometer / integrating sphere. +Rust driver and command line tool for the HPCS 6500 spectrophotometer / +integrating sphere. It talks to the instrument directly over its USB serial +port and replaces the vendor software for measurement automation and data +extraction. -Communicates directly with the instrument over USB serial, replacing the -vendor software for measurement automation and data extraction. +This repository is only the driver. The lamp measurement station, the lamp +comparison export (TM-30, label printing) and the LED light calibration are +in the testbench repository, +[B4L/lamp-testbench](https://git.b4l.co.th/B4L/lamp-testbench), which pulls +this repository in as a submodule (the same layout as +[mppt-testbench](https://git.b4l.co.th/B4L/mppt-testbench)). -## What This Does +## What it reads -- **Measure**: Luminous flux (lm), CCT (K), CRI (Ra, R1-R15), chromaticity - (CIE xy, uv, u'v'), radiometric flux, spectrum 380-1050 nm -- **Electrical**: Voltage, current, power, power factor, frequency -- **Harmonics**: 50-harmonic voltage/current analysis, UThd, AThd, waveforms -- **Power supply**: Control the built-in AC (100-240V, 50/60Hz) and DC - (1-60V, 0-5A) power supply -- **Export**: CSV output for data logging -- **TM-30**: ANSI/IES TM-30-18 Rf, Rg, and hue-bin data computed from the - measured spectrum (via colour-science) -- **Lamp bundles**: one-command export of spectrum + TM-30 + metrics for the - [buildfor.life lamp comparison](https://buildfor.life/comparisons) +- **Photometric**: luminous flux (lm), efficacy (lm/W), CCT (K), Duv +- **Colour**: CRI Ra and R1-R15, SDCM, TLCI-2012, CIE xy / uv / u'v', CIE 1931 XYZ +- **Radiometric**: total, UV, blue, yellow, red, far-red and IR flux (mW) +- **Spectrum**: 350 points, 380-1050 nm +- **Electrical**: voltage, current, power, power factor, frequency +- **Harmonics**: 50 voltage and current harmonics, UThd, AThd, one cycle of both waveforms +- **Power supply**: the built-in AC (100-240 V, 50/60 Hz) and DC (1-60 V, 0-5 A) supply -## Quick Start +## Install ```bash -# Install -uv sync - -# Single measurement (auto-detects device, turns PSU on/off) -uv run hpcs6500.py - -# Continuous measurements -uv run hpcs6500.py --continuous - -# Quick test (lumen + CCT only) -uv run hpcs6500.py --quick -uv run hpcs6500.py --quick --continuous - -# Show full spectrum + harmonics -uv run hpcs6500.py --spectrum --harmonics - -# Save to CSV -uv run hpcs6500.py --continuous --csv output.csv +cargo install --git https://git.b4l.co.th/B4L/HPCS6500-py # puts `hpcs6500` on the PATH +# or, in a checkout: +cargo build --release # target/release/hpcs6500(.exe) ``` -## Power Supply Control +Windows needs no driver: the instrument is an STM32 virtual COM port +(VID `0483`, PID `5741`) and is found automatically. Linux: add yourself to +the `dialout` group. + +## Command line + +The flags are the ones of the former Python tool: `uv run hpcs6500.py ...` +is now `hpcs6500 ...`. ```bash -# Read current PSU settings -uv run hpcs6500.py --psu-status +hpcs6500 # single reading (vendor single-test flow) +hpcs6500 --continuous # continuous readings, PSU on while measuring +hpcs6500 --continuous --count 10 --csv out.csv +hpcs6500 --quick --continuous # lumen + CCT only +hpcs6500 --spectrum --harmonics # full spectrum and harmonics +hpcs6500 --json # one JSON object per reading on stdout +hpcs6500 --passive --continuous # read only, while the vendor software drives the instrument +hpcs6500 --port COM42 # pick the port +hpcs6500 ports # list serial ports, the instrument is marked -# Set AC mode, 230V 50Hz -uv run hpcs6500.py --mode ac --voltage 230 --frequency 50 - -# Set DC mode, 12V with 1A current limit -uv run hpcs6500.py --mode dc --voltage 12 --current 1.0 - -# Manual PSU on/off -uv run hpcs6500.py --psu-on -uv run hpcs6500.py --psu-off - -# Set integration time (ms) -uv run hpcs6500.py --integration 500 +# power supply +hpcs6500 --psu-status +hpcs6500 --mode ac --voltage 230 --frequency 50 +hpcs6500 --mode dc --voltage 12 --current 1.0 +hpcs6500 --psu-on / hpcs6500 --psu-off +hpcs6500 --integration 500 # ms, 0 = auto ``` -## Lamp Comparison Export +Ctrl+C stops a continuous run cleanly: the supply is switched off and the +instrument reset. The text output and the CSV files are character for +character those of the Python tool, so scripts that read them keep working. -Produces the per-lamp data bundle consumed by the buildfor.life comparison -pages: `spd.csv` (full 380-1050 nm spectrum), `tm30.csv` (TM-30-18 hue-bin -data for the color vector graphic), and `metrics.json` (photometric, -colorimetric, CRI R1-R15, TM-30 Rf/Rg, electrical). +### Without the instrument + +`--simulate` talks to a simulated instrument that answers every command of +the protocol: with a capture it replays the readings recorded in it, +without one it uses a built-in sample reading. ```bash -# Single reading from the device -uv run lamp_export.py --name philips-a60-8w --manufacturer Philips --model "A60 8W 927" - -# Average several readings -uv run lamp_export.py --name philips-a60-8w --readings 5 - -# Power the lamp from the built-in supply: 230 V / 50 Hz, 60 s warm-up, -# PSU switches on before the readings and off afterwards -uv run lamp_export.py --name philips-a60-8w --voltage 230 --frequency 50 --settle 60 - -# From an existing pcap capture -uv run lamp_export.py --name some-lamp --parse captures/run.pcap +hpcs6500 --simulate # built-in sample +hpcs6500 --simulate captures/run.pcap --continuous # replay a capture ``` -Output lands in `lamps//`. TM-30 is computed from the measured spectrum -with [colour-science](https://www.colour-science.org/); the spectrum is -relative, which TM-30 is invariant to. Sanity check of the implementation: -`uv run tm30.py` reproduces the published values for the CIE FL2 illuminant -(Rf 70, Rg 86). - -## Lamp Station (barcode workflow) - -Interactive loop around `lamp_export.py` for building the comparison database -end to end. Every lamp gets an internal ID (L0001, L0002, ...) as primary key; -the EAN barcode is optional metadata, so one barcode can cover daylight/warm -white variants (distinct IDs + variant field) and unbranded lamps work too. - -Every run opens with a freshly allocated ID (the ID only becomes real once a -bundle is written, so aborting never burns a number). Then: scan the box's EAN -(optional, Enter skips it), or type an existing ID like L0004 to re-measure -that lamp with everything pre-filled, which also rewrites its bundle in the -current metrics format. Scanned EANs are checksum-validated and resolved to -manufacturer/model (previously measured lamps, local cache, then -upcitemdb.com; GS1-restricted 20-29 barcodes are flagged as -retailer-internal), lamps already measured under the same EAN are offered for -re-measurement, you confirm the identification and type the ADVERTISED values -from the packaging (flux, CCT, power, CRI, lifetime, equivalent W -> stored -under "rated" in metrics.json for claimed-vs-measured comparison), insert the -lamp, and the tool measures per the published procedure (230 V / 50 Hz, 60 s -settle, 5 readings averaged), writes lamps// into the comparison-data -checkout, commits, and pushes, then prints two ID labels (QR code linking to -the lamp's page plus the ID, DK-11221 23x23 mm) on a Brother QL-820NWB network -printer: one for the box, one for the lamp. Set HPCS_LABEL_PRINTER (e.g. -tcp://192.168.1.50) or pass --printer; reprint anytime with -`uv run label_printer.py `. The website picks the lamp up automatically: -its device list is data-driven from the comparison-data bundles and the push -triggers the auto-bump deploy. An .md page in the web repo is only ever needed -for photos, where-to-buy links, or notes. +### USB captures (reverse engineering) ```bash -uv run lamp_station.py # scan -> measure -> commit -> push -uv run lamp_station.py --no-push # commit locally only -uv run lamp_station.py --no-commit # just write the bundle -uv run lamp_station.py --settle 0 --readings 1 # quick smoke test +hpcs6500 --parse captures/run.pcap [--quick] [--spectrum] [--json] # readings in a capture +hpcs6500 dump captures/run.pcap # traffic timeline + _TX.bin / _RX.bin +hpcs6500 capture # record the vendor software with USBPcap (admin, Windows) ``` -Defaults assume `C:/dev/buildfor_life_web` with the comparison-data submodule -initialized; override with --data-repo. +`capture` starts `USBPcapCMD` on every root hub, waits for Ctrl+C, keeps the +largest file and dumps it. Captures go to `captures/` (not in git). -## Offline Parsing +## Library -Parse previously captured USB traffic (pcap files from USBPcap): - -```bash -uv run hpcs6500.py --parse captures/some_capture.pcap -uv run hpcs6500.py --parse captures/some_capture.pcap --quick +```toml +[dependencies] +hpcs6500 = { git = "https://git.b4l.co.th/B4L/HPCS6500-py", default-features = false } ``` -## Files +`default-features = false` leaves out the command line tool's dependencies. -| File | Description | -|------------------|----------------------------------------------------| -| `hpcs6500.py` | Driver class (`HPCS6500`) and CLI | -| `lamp_export.py` | Lamp comparison bundle export (spd/tm30/metrics) | -| `tm30.py` | ANSI/IES TM-30-18 computation from a spectrum | -| `usb_capture.py` | USB traffic capture tool (requires USBPcap) | -| `PROTOCOL.md` | Complete protocol reference (byte-level) | -| `pyproject.toml` | Project metadata and dependencies | +```rust +use hpcs6500::{Hpcs6500, Mode}; -## Hardware +let port = hpcs6500::find_port().ok_or(hpcs6500::Error::NotFound)?; +let mut dev = Hpcs6500::open(&port)?; +dev.identify()?; // "HPCS6500" +dev.set_mode(Mode::Ac)?; +dev.set_ac_voltage(230.0)?; +dev.set_ac_frequency(50.0)?; +dev.psu_on()?; +dev.send_test_config(false)?; // the vendor's single-test configuration +let r = dev.take_single_reading()?; // trigger, poll, read both blocks, reset +dev.psu_off()?; +println!("{:.0} lm {:.0} K Ra {:.1}", r.flux_lm(), r.cct_k(), r.ra()); +println!("{:?}", r.get("Phi_eb_mW")); // every field by its CSV name +let nm = r.spectrum_nm(); // with r.spectrum +``` -- **Device**: HPCS 6500 spectrophotometer / integrating sphere -- **USB**: STM32 Virtual COM Port (VID `0483`, PID `5741`) -- **Protocol**: Custom binary over serial, documented in [PROTOCOL.md](PROTOCOL.md) +| Item | | +|---|---| +| `Hpcs6500::open(port)` / `with_transport(t, name)` | the instrument over the serial port or any `Transport` | +| `identify`, `poll_state`, `wait_for_data` | | +| `take_single_reading`, `take_reading(psu)`, `read_current` | single test, one continuous reading, passive read | +| `start_measurement`, `stop_measurement`, `reset`, `send_test_config` | the raw sequence steps | +| `psu_on`, `psu_off`, `set_mode`, `set_ac_voltage`, `set_ac_frequency`, `set_dc_voltage`, `set_dc_current`, `read_psu_settings` | built-in supply | +| `set_integration_time(ms)` | 0 = auto | +| `read_measurement_block`, `read_electrical_block` | raw 3904 / 1584-byte blocks | +| `set_cancel_flag(flag)`, `pause(d)` | long waits end with `Error::Cancelled` when the flag goes up (Ctrl+C) | +| `Reading` | `values` by `FIELDS`, `get(name)`, `scalars()`, `spectrum`, `spectrum_nm()`, `electrical` with `harmonics`; serializes to the Python driver's JSON keys | +| `pcap::read_messages`, `pcap::readings`, `pcap::blocks` | USBPcap captures | +| `sim::Simulator` | simulated instrument (`sample()`, `from_pcap(path)`), logs every frame | +| `format::*` | the text report and the CSV export | +| `pyfmt::*` | Python-compatible number formatting (`repr`, `.6g`, `.2f`, `round`) | -## Dependencies - -- Python 3.11+ -- `pyserial` (serial communication) -- `colour-science` (TM-30 computation) -- USBPcap (only for `usb_capture.py`, not needed for normal operation) +Every method returns `Result`; errors say what was expected and what came +back (`no acknowledge for command 0x72 (got nothing)`). ## Protocol -The binary protocol is fully documented in [PROTOCOL.md](PROTOCOL.md), -including all command bytes, data block layouts, field offsets, and the -complete measurement sequence. This was reverse-engineered from USB -packet captures of the vendor software. +The binary protocol is documented byte by byte in [PROTOCOL.md](PROTOCOL.md): +command bytes, block layouts, field offsets and the measurement sequences. +It was reverse-engineered from USB captures of the vendor software. + +## Development + +```bash +cargo test # protocol, simulator, golden tests +cargo clippy --all-targets -- -D warnings +``` + +`tests/golden/` holds the output of the former Python driver for real +readings (`tests/fixtures/`): the parsed values (bit-exact), the text report, +the CSV row and 2,000 number-formatting cases. The Rust driver reproduces all +of them exactly. Where `captures/` is present, the `--parse` reports of real +captures are compared too. + +The Python driver this replaces is at tag `python-final`. diff --git a/calibration.py b/calibration.py deleted file mode 100644 index 39e4137..0000000 --- a/calibration.py +++ /dev/null @@ -1,895 +0,0 @@ -#!/usr/bin/env python3 -""" -LED Light Calibration Tool - -Calibrates the bilinear interpolation table for CCT/Lumen mixing ratios. -Works with an external measurement script that writes to measurement.json. - -Usage: -1. Start the external measurement script (reads spectrometer/lux meter) -2. Run this calibration tool -3. The tool sets test points and waits for measurements -4. After all points are measured, it generates a calibration table -""" - -import serial -import time -import json -import sys -import argparse -import subprocess -from pathlib import Path - -# Calibration grid (matches firmware) -CCT_POINTS = [2600, 2900, 3200, 3500, 3800, 4100, 4400, 4700, 5000] -LUMEN_POINTS = [200, 375, 550, 725, 900] -NUM_CCT = len(CCT_POINTS) -NUM_LUMEN = len(LUMEN_POINTS) - -# UART commands -CMD_SET_COLOR = 0x81 -CMD_SET_INTENSITY = 0x82 -CMD_PROFILE_OFF = 0x84 -CMD_CAL_START = 0x8A -CMD_CAL_WRITE = 0x8B -CMD_CAL_COMMIT = 0x8C -CMD_CAL_CLEAR = 0x8D -CMD_CAL_READ = 0x8E -CMD_CAL_WRITE_Y = 0x8F -RSP_ACK = 0xC0 - -# Default y-data tables (mA points: 0, 11, 33, 65, 150 -> lumen output) -Y27_DEFAULT = [0, 39, 179, 369, 844] -Y50_DEFAULT = [0, 51, 217, 441, 969] -X_DATA = [0, 11, 33, 65, 150] # mA drive points - -# Default paths -CALIBRATION_OUTPUT = Path(__file__).parent / "calibration_table.json" -DEFAULT_SPECTROMETER = Path(__file__).parent / "spectrometer.py" - - -class CalibrationTool: - def __init__(self, port, baudrate=115200, spectrometer_script=None): - self.port = port - self.baudrate = baudrate - self.spectrometer_script = spectrometer_script or DEFAULT_SPECTROMETER - self.ser = None - self.measurements = {} # (cct, lumen) -> {'measured_cct': x, 'measured_lumen': y} - - def connect(self): - """Connect to the light via serial port.""" - self.ser = serial.Serial(self.port, self.baudrate, timeout=1) - time.sleep(0.5) # Wait for connection to stabilize - self.ser.reset_input_buffer() - print(f"Connected to {self.port}") - - def disconnect(self): - """Disconnect from the light.""" - if self.ser: - self.ser.close() - self.ser = None - - def send_command(self, cmd, payload, timeout=2.0): - """Send a 5-byte command and wait for response, skipping diagnostic messages.""" - if len(payload) != 4: - raise ValueError("Payload must be 4 bytes") - - # Flush any pending input - self.ser.reset_input_buffer() - - data = bytes([cmd]) + bytes(payload) - self.ser.write(data) - - # Read 5-byte messages until we get a response (0xC0 or 0xC1) - start = time.time() - while time.time() - start < timeout: - response = self.ser.read(5) - if len(response) < 5: - continue - - # Check if this is a command response (0xC0=ACK, 0xC1=NAK) - if response[0] == RSP_ACK: - # Verify the echoed command matches what we sent - if response[1] == cmd: - return True - else: - print(f"ACK mismatch: sent 0x{cmd:02x}, got {response.hex()}") - # Keep reading, this might be from a previous command - continue - elif response[0] == 0xC1: # RSP_NAK - print(f"NAK received: {response.hex()}") - return False - # Otherwise it's a diagnostic message, skip it - - print("Timeout waiting for response") - return False - - def set_intensity(self, intensity): - """Set light intensity (0-1000 lux target).""" - lo = intensity & 0xFF - hi = (intensity >> 8) & 0xFF - return self.send_command(CMD_SET_INTENSITY, [lo, hi, 0, 0]) - - def set_color(self, cct): - """Set color temperature (2600-5000K).""" - lo = cct & 0xFF - hi = (cct >> 8) & 0xFF - return self.send_command(CMD_SET_COLOR, [lo, hi, 0, 0]) - - def disable_profile(self): - """Disable automatic profile, switch to manual mode.""" - return self.send_command(CMD_PROFILE_OFF, [0, 0, 0, 0]) - - def cal_start(self): - """Start calibration write sequence (erases flash).""" - result = self.send_command(CMD_CAL_START, [0, 0, 0, 0], timeout=5.0) - print(f" cal_start result: {result}") - return result - - def cal_write(self, index, value): - """Write a single calibration value (index 0-44, value 0-255).""" - result = self.send_command(CMD_CAL_WRITE, [index, value, 0, 0]) - if not result: - print(f" cal_write failed at index {index}, value {value}") - return result - - def cal_write_y(self, table, index, value): - """Write a y-data calibration value. table: 0=y27, 1=y50. value: uint16.""" - lo = value & 0xFF - hi = (value >> 8) & 0xFF - return self.send_command(CMD_CAL_WRITE_Y, [table, index, lo, hi]) - - def cal_commit(self): - """Commit calibration data to flash.""" - return self.send_command(CMD_CAL_COMMIT, [0, 0, 0, 0], timeout=5.0) - - def cal_clear(self): - """Clear calibration (revert to defaults).""" - return self.send_command(CMD_CAL_CLEAR, [0, 0, 0, 0]) - - def write_calibration_table(self, table, y27_cal=None, y50_cal=None, verbose=True): - """Write calibration data to the device. - - Args: - table: 9x5 mixing ratio table - y27_cal: 5-element list of lumen values for 2700K LED (optional) - y50_cal: 5-element list of lumen values for 5000K LED (optional) - """ - if verbose: - print("Writing calibration to device...") - - # Ensure clean UART state before starting - self.ser.reset_input_buffer() - time.sleep(0.1) - - if not self.cal_start(): - if verbose: - print(" Failed to start calibration write") - return False - - time.sleep(1.0) # Wait for flash erase to complete - - # Write mixing ratios - index = 0 - for i, row in enumerate(table): - for j, value in enumerate(row): - if not self.cal_write(index, value): - if verbose: - print(f" Failed to write mixing ratio index {index}") - return False - index += 1 - time.sleep(0.05) - - # Write y27 data (use defaults if not provided) - y27 = y27_cal if y27_cal else Y27_DEFAULT - for i, value in enumerate(y27): - if not self.cal_write_y(0, i, int(value)): - if verbose: - print(f" Failed to write y27[{i}]") - return False - time.sleep(0.05) - - # Write y50 data (use defaults if not provided) - y50 = y50_cal if y50_cal else Y50_DEFAULT - for i, value in enumerate(y50): - if not self.cal_write_y(1, i, int(value)): - if verbose: - print(f" Failed to write y50[{i}]") - return False - time.sleep(0.05) - - time.sleep(0.5) # Wait before commit - - if not self.cal_commit(): - if verbose: - print(" Failed to commit calibration") - return False - - if verbose: - print(" Calibration written successfully!") - return True - - def cal_read(self, index): - """Read a single calibration value. Returns (index, value, valid) or None.""" - self.ser.write(bytes([CMD_CAL_READ, index, 0, 0, 0])) - response = self.ser.read(5) - if len(response) < 5 or response[0] != RSP_ACK: - return None - return (response[1], response[2], response[3]) - - def read_calibration_table(self, verbose=True): - """Read the entire calibration table from device.""" - if verbose: - print("Reading calibration table from device...") - table = [] - valid = None - for i in range(NUM_CCT): - row = [] - for j in range(NUM_LUMEN): - index = i * NUM_LUMEN + j - result = self.cal_read(index) - if result is None: - if verbose: - print(f" Failed to read index {index}") - return None - row.append(result[1]) - if valid is None: - valid = result[2] - table.append(row) - - if verbose: - status = "calibrated" if valid else "defaults" - print(f" Read complete ({status})") - return table, valid - - def set_test_point(self, cct, lumen, verbose=False): - """Set the light to a specific CCT and lumen test point.""" - if verbose: - print(f" Setting CCT={cct}K, Lumen={lumen}") - - if not self.set_color(cct): - if verbose: - print(" Failed to set color") - return False - time.sleep(0.2) - - if not self.set_intensity(lumen): - if verbose: - print(" Failed to set intensity") - return False - - return True - - def take_measurement(self, timeout=30, verbose=False): - """ - Call spectrometer script to take a measurement. - - Expected JSON output: {"lumen": 450.5, "cct": 3250} - """ - if verbose: - print(f" Taking measurement...") - try: - result = subprocess.run( - ['uv', 'run', 'python', str(self.spectrometer_script), '--measure'], - capture_output=True, - text=True, - timeout=timeout - ) - if result.returncode != 0: - if verbose: - print(f" Spectrometer error: {result.stderr.strip()}") - return None - data = json.loads(result.stdout) - if 'lumen' in data and 'cct' in data: - return data - if verbose: - print(f" Invalid response: missing lumen or cct") - return None - except subprocess.TimeoutExpired: - if verbose: - print(f" Timeout waiting for spectrometer") - return None - except json.JSONDecodeError as e: - if verbose: - print(f" Invalid JSON from spectrometer: {e}") - return None - except FileNotFoundError: - if verbose: - print(f" Spectrometer script not found: {self.spectrometer_script}") - return None - - def measure_all_points(self): - """Measure all calibration points once. Returns True if all succeeded. - - Points are ordered to minimize drive current changes between consecutive - measurements: sorted by lumen (ascending), with CCT in snake pattern - (alternating direction) to avoid large jumps. - """ - total_points = len(CCT_POINTS) * len(LUMEN_POINTS) - current_point = 0 - success_count = 0 - - # Generate measurement order: snake pattern to minimize current jumps - # At each lumen level, alternate CCT direction - measurement_order = [] - for i, lumen in enumerate(LUMEN_POINTS): - ccts = CCT_POINTS if i % 2 == 0 else list(reversed(CCT_POINTS)) - for cct in ccts: - measurement_order.append((cct, lumen)) - - for cct, lumen in measurement_order: - current_point += 1 - key = (cct, lumen) - - print(f" [{current_point}/{total_points}] CCT={cct}K, Lumen={lumen}", end="") - - # Set test point - if not self.set_test_point(cct, lumen): - print(" - FAILED to set") - continue - - # Wait for light to stabilize - time.sleep(4.0) - - # Take measurement with plausibility check - max_retries = 3 - for attempt in range(max_retries): - measurement = self.take_measurement() - if not measurement: - if attempt < max_retries - 1: - time.sleep(2.0) - continue - print(" - NO READING") - break - - # Plausibility check: deviation must be < 60% - cct_dev = abs(measurement['cct'] - cct) / cct - lumen_dev = abs(measurement['lumen'] - lumen) / lumen if lumen > 0 else 0 - - if cct_dev > 0.6 or lumen_dev > 0.6: - if attempt < max_retries - 1: - time.sleep(4.0) - continue - print(f" - IMPLAUSIBLE ({cct_dev*100:.0f}%/{lumen_dev*100:.0f}%)") - break - - # Measurement is plausible, store it - self.measurements[key] = { - 'target_cct': cct, - 'target_lumen': lumen, - 'measured_cct': measurement['cct'], - 'measured_lumen': measurement['lumen'] - } - cct_err = (measurement['cct'] - cct) / cct * 100 - lumen_err = (measurement['lumen'] - lumen) / lumen * 100 - print(f" -> CCT:{cct_err:+5.1f}% Lum:{lumen_err:+5.1f}%") - success_count += 1 - break - - return success_count == total_points - - def print_deviation_table(self): - """Print a table showing deviation of all measured points.""" - print("\n" + "=" * 70) - print("DEVIATION TABLE (% error from target)") - print("=" * 70) - - # Header - header = " |" - for lumen in LUMEN_POINTS: - header += f" {lumen:4d}lm |" - print(header) - print("-" * len(header)) - - max_cct_dev = 0 - max_lumen_dev = 0 - all_within_tolerance = True - cct_devs = [] - lumen_devs = [] - - for cct in CCT_POINTS: - row = f"{cct:5d}K |" - for lumen in LUMEN_POINTS: - key = (cct, lumen) - if key in self.measurements: - m = self.measurements[key] - cct_dev = (m['measured_cct'] - cct) / cct * 100 - lumen_dev = (m['measured_lumen'] - lumen) / lumen * 100 - cct_devs.append(cct_dev) - lumen_devs.append(lumen_dev) - max_cct_dev = max(max_cct_dev, abs(cct_dev)) - max_lumen_dev = max(max_lumen_dev, abs(lumen_dev)) - if abs(cct_dev) > 5 or abs(lumen_dev) > 5: - all_within_tolerance = False - row += f"{cct_dev:+4.1f}/{lumen_dev:+4.1f}|" - else: - row += " --- |" - all_within_tolerance = False - print(row) - - # Calculate standard deviation - def calc_std(values): - if len(values) < 2: - return 0.0 - mean = sum(values) / len(values) - variance = sum((x - mean) ** 2 for x in values) / len(values) - return variance ** 0.5 - - cct_std = calc_std(cct_devs) - lumen_std = calc_std(lumen_devs) - - print("-" * len(header)) - print(f"Format: CCT%/Lumen% | Max CCT: {max_cct_dev:.1f}% | Max Lumen: {max_lumen_dev:.1f}%") - print(f"Standard deviation | CCT: {cct_std:.2f}% | Lumen: {lumen_std:.2f}%") - - return all_within_tolerance, max_cct_dev, max_lumen_dev - - def calibrate_y_data(self): - """Calibrate y-data tables by measuring lumen output at fixed drive points. - - Returns (y27_cal, y50_cal) or (None, None) on failure. - """ - print("\n" + "=" * 70) - print("Y-DATA CALIBRATION") - print("=" * 70) - print("Measuring lumen output at fixed drive currents") - print(f"Drive points (mA): {X_DATA}") - print("=" * 70) - - # First, clear any existing calibration to use defaults - print("\nClearing existing calibration to use default tables...") - time.sleep(0.2) # Brief delay to ensure UART is idle - self.ser.reset_input_buffer() # Clear any pending diagnostics - if not self.cal_clear(): - print("Failed to clear calibration") - return None, None - time.sleep(1.0) - - # Calibrate 2700K LED (use 2600K CCT = pure warm LED, mixing ratio 0) - print("\n--- Calibrating 2700K LED (pure warm) ---") - y27_cal = self._measure_led_curve(2600, Y27_DEFAULT) - if y27_cal is None: - return None, None - - # Turn off LEDs and wait for thermal stabilization before switching - print("\nTurning off LEDs, waiting 10s for thermal stabilization...") - self.set_intensity(0) - time.sleep(10.0) - - # Calibrate 5000K LED (use 5000K CCT = pure cool LED, mixing ratio 255) - print("\n--- Calibrating 5000K LED (pure cool) ---") - y50_cal = self._measure_led_curve(5000, Y50_DEFAULT) - if y50_cal is None: - return None, None - - print("\n" + "=" * 70) - print("Y-DATA CALIBRATION RESULTS") - print("=" * 70) - print(f" mA points: {X_DATA}") - print(f" y27 (2700K): {y27_cal} (default: {Y27_DEFAULT})") - print(f" y50 (5000K): {y50_cal} (default: {Y50_DEFAULT})") - - return y27_cal, y50_cal - - def _measure_led_curve(self, cct, default_lumens): - """Measure lumen output at each drive point for a single LED type. - - Args: - cct: Color temperature to set (2600 for pure 2700K LED, 5000 for pure 5000K LED) - default_lumens: Default y-data values to use as intensity targets - - Returns: - List of 5 measured lumen values, or None on failure - """ - measured = [] - - # Set color (this determines which LED is primarily driven) - if not self.set_color(cct): - print(f" Failed to set color to {cct}K") - return None - time.sleep(0.5) - - for i, target_lumen in enumerate(default_lumens): - ma = X_DATA[i] - print(f" Point {i+1}/5: {ma:3d}mA (intensity={target_lumen:3d})", end="") - - if ma == 0: - # Zero point is always 0 lumen - measured.append(0) - print(" -> 0 lm (zero point)") - continue - - # Set intensity to the default lumen value - # With cleared calibration (defaults), this drives at the target mA - if not self.set_intensity(target_lumen): - print(" - FAILED to set intensity") - return None - - # Wait for LED to stabilize (longer for last point at max current) - stabilize_time = 5.0 if i == len(default_lumens) - 1 else 2.0 - time.sleep(stabilize_time) - - # Take measurement with retry - reading = None - for attempt in range(3): - reading = self.take_measurement() - if reading and reading['lumen'] > 0: - break - time.sleep(1.0) - - if reading is None: - print(" - NO READING") - return None - - actual_lumen = int(round(reading['lumen'])) - deviation = (actual_lumen - target_lumen) / target_lumen * 100 if target_lumen > 0 else 0 - measured.append(actual_lumen) - print(f" -> {actual_lumen:4d} lm ({deviation:+5.1f}%)") - - return measured - - def run_calibration(self, skip_y=False): - """Run full calibration: y-data first, then iterative mixing ratios. - - Args: - skip_y: If True, skip y-data calibration (only do mixing ratios) - """ - print("=" * 70) - print("LED Light Full Calibration") - print("=" * 70) - print("Phase 1: Y-data calibration (LED lumen curves)") - print("Phase 2: Mixing ratio calibration (CCT/lumen targeting)") - print("=" * 70) - - self.connect() - y27_cal = None - y50_cal = None - - try: - # Disable profile mode - print("\nDisabling profile mode...") - self.disable_profile() - time.sleep(0.5) - - # Phase 1: Y-data calibration - if not skip_y: - y27_cal, y50_cal = self.calibrate_y_data() - if y27_cal is None: - print("\nY-data calibration failed, aborting.") - return - # Write y-data immediately with default mixing ratios - print("\nWriting y-data to device...") - default_mixing = [ - [ 0, 0, 0, 0, 0], - [ 32, 38, 36, 37, 36], - [ 84, 72, 70, 71, 71], - [142, 100, 99, 99, 99], - [175, 131, 126, 127, 126], - [155, 154, 154, 157, 153], - [206, 170, 184, 184, 185], - [242, 223, 208, 216, 217], - [255, 255, 255, 255, 255] - ] - if not self.write_calibration_table(default_mixing, y27_cal, y50_cal, verbose=False): - print("Failed to write y-data, aborting.") - return - print("Y-data written, proceeding to mixing ratio calibration...") - time.sleep(1.0) - - # Phase 2: Mixing ratio calibration - print("\n" + "=" * 70) - print("MIXING RATIO CALIBRATION") - print("=" * 70) - print("Target: < 5% deviation on all points") - print("Maximum passes: 10") - - max_passes = 10 - for pass_num in range(1, max_passes + 1): - print(f"\n{'='*70}") - print(f"PASS {pass_num}/{max_passes}") - print("=" * 70) - - # Clear previous measurements for fresh pass - self.measurements = {} - - # Measure all points - print("\nMeasuring all points...") - self.measure_all_points() - - # Print deviation table - converged, max_cct, max_lumen = self.print_deviation_table() - - # Save progress - self.save_calibration() - - if converged: - print(f"\n*** CONVERGED after {pass_num} pass(es)! ***") - print("All points within 5% tolerance.") - break - - if pass_num == max_passes: - print(f"\n*** MAX PASSES REACHED ***") - print(f"Best achieved: CCT {max_cct:.1f}%, Lumen {max_lumen:.1f}%") - break - - # Generate and apply corrections - print("\nCalculating and applying corrections...") - calibrated_table = self.generate_table(verbose=False) - - if calibrated_table: - if self.write_calibration_table(calibrated_table, y27_cal, y50_cal, verbose=False): - print("Corrections applied, starting next pass...") - time.sleep(1.0) - else: - print("Failed to write calibration, stopping.") - break - - finally: - self.disconnect() - - print("\n" + "=" * 70) - print("Calibration complete!") - print("=" * 70) - - def save_calibration(self): - """Save current calibration state to file.""" - data = { - 'measurements': { - f"{k[0]},{k[1]}": v for k, v in self.measurements.items() - }, - 'cct_points': CCT_POINTS, - 'lumen_points': LUMEN_POINTS - } - with open(CALIBRATION_OUTPUT, 'w') as f: - json.dump(data, f, indent=2) - - def generate_table(self, verbose=False): - """ - Generate the calibrated mixing ratio table using direct proportional correction. - - Simple approach: mixing ratio controls CCT. - - If measured CCT < target CCT: increase ratio (more 5000K LED) - - If measured CCT > target CCT: decrease ratio (less 5000K LED) - - Correction is proportional to error, scaled by CCT-to-ratio gradient - """ - if verbose: - print("\nGenerating calibration table...") - - # Read current mixing ratios from device (baseline) - baseline_table = None - if self.ser and self.ser.is_open: - result = self.read_calibration_table(verbose=verbose) - if result: - baseline_table, _ = result - if verbose: - print("Using current device values as baseline") - - if baseline_table is None: - if verbose: - print("Using firmware defaults as baseline") - baseline_table = [ - [ 0, 0, 0, 0, 0], # 2600K - [ 32, 38, 36, 37, 36], # 2900K - [ 84, 72, 70, 71, 71], # 3200K - [142, 100, 99, 99, 99], # 3500K - [175, 131, 126, 127, 126], # 3800K - [155, 154, 154, 157, 153], # 4100K - [206, 170, 184, 184, 185], # 4400K - [242, 223, 208, 216, 217], # 4700K - [255, 255, 255, 255, 255] # 5000K - ] - - # CCT range: 2600K to 5000K = 2400K maps to ratio 0-255 - # Gradient: ~9.4 K per ratio unit (but use 10 for simpler math) - K_PER_RATIO = 10.0 - - corrections = {} - for (cct, lumen), m in self.measurements.items(): - i = CCT_POINTS.index(cct) - j = LUMEN_POINTS.index(lumen) - baseline_r = baseline_table[i][j] - - target_cct = m['target_cct'] - target_lumen = m['target_lumen'] - measured_cct = m['measured_cct'] - measured_lumen = m['measured_lumen'] - - cct_error = target_cct - measured_cct # positive = need higher CCT = more 5000K = higher ratio - lumen_error = target_lumen - measured_lumen - - # Simple proportional correction: dr = cct_error / K_PER_RATIO - # If measured CCT is 100K too low, increase ratio by 10 units - dr = cct_error / K_PER_RATIO - - # Apply correction with gain factor (can be tuned) - # Use 1.0 for full correction, <1 for damping, >1 for aggressive - gain = 1.0 - dr = dr * gain - - # Limit adjustment per iteration to prevent oscillation - dr = max(-30, min(30, dr)) - - corrections[(cct, lumen)] = { - 'cct_error': cct_error, - 'lumen_error': lumen_error, - 'lumen_error_pct': 100 * lumen_error / target_lumen if target_lumen > 0 else 0, - 'mixing_adjust': dr, - 'baseline_ratio': baseline_r - } - - # Apply corrections to generate calibrated table - calibrated_table = [] - for i, cct in enumerate(CCT_POINTS): - row = [] - for j, lumen in enumerate(LUMEN_POINTS): - baseline_r = baseline_table[i][j] - key = (cct, lumen) - if key in corrections: - c = corrections[key] - adjusted = baseline_r + c['mixing_adjust'] - adjusted = max(0, min(255, round(adjusted))) - else: - adjusted = baseline_r - row.append(int(adjusted)) - calibrated_table.append(row) - - # Print correction details - if verbose: - print("\nCorrection summary:") - print(f"{'CCT':>5} {'Lumen':>5} | {'CCT err':>8} {'Lum err':>8} | {'Base':>4} {'Adj':>6} {'New':>4}") - print("-" * 65) - for i, cct in enumerate(CCT_POINTS): - for j, lumen in enumerate(LUMEN_POINTS): - key = (cct, lumen) - if key in corrections: - c = corrections[key] - new_r = calibrated_table[i][j] - print(f"{cct:>5} {lumen:>5} | {c['cct_error']:>+7.0f}K {c['lumen_error']:>+7.0f}lm | {c['baseline_ratio']:>4} {c['mixing_adjust']:>+6.1f} {new_r:>4}") - - # Print final table - print("\nCalibrated mixing_ratios table:") - print("const uint8_t mixing_ratios[NUM_CCT][NUM_LUMEN] = {") - for i, (cct, row) in enumerate(zip(CCT_POINTS, calibrated_table)): - values = ", ".join(f"{v:3d}" for v in row) - comment = f"// {cct}K" - if i == 0: - comment += " (pure 2700K)" - elif i == len(CCT_POINTS) - 1: - comment += " (pure 5000K)" - comma = "," if i < len(CCT_POINTS) - 1 else "" - print(f" {{{values}}}{comma} {comment}") - print("};") - - # Save to calibration file - data = { - 'measurements': {f"{k[0]},{k[1]}": v for k, v in self.measurements.items()}, - 'corrections': {f"{k[0]},{k[1]}": v for k, v in corrections.items()}, - 'cct_points': CCT_POINTS, - 'lumen_points': LUMEN_POINTS, - 'baseline_table': baseline_table, - 'calibrated_table': calibrated_table - } - with open(CALIBRATION_OUTPUT, 'w') as f: - json.dump(data, f, indent=2) - if verbose: - print(f"\nCalibration saved to {CALIBRATION_OUTPUT}") - - return calibrated_table - - -def main(): - parser = argparse.ArgumentParser(description='LED Light Calibration Tool') - parser.add_argument('port', nargs='?', default='COM3', - help='Serial port (default: COM3)') - parser.add_argument('--baudrate', '-b', type=int, default=115200, - help='Baud rate (default: 115200)') - parser.add_argument('--spectrometer', '-s', type=Path, - default=DEFAULT_SPECTROMETER, - help='Path to spectrometer script (default: spectrometer.py)') - parser.add_argument('--generate-only', '-g', action='store_true', - help='Only generate table from existing measurements') - parser.add_argument('--write', '-w', action='store_true', - help='Write calibration table to device') - parser.add_argument('--clear', '-c', action='store_true', - help='Clear calibration on device (revert to defaults)') - parser.add_argument('--read', action='store_true', - help='Read calibration table from device') - parser.add_argument('--skip-y', action='store_true', - help='Skip y-data calibration (only do mixing ratios)') - parser.add_argument('--y-only', action='store_true', - help='Only run y-data calibration (no mixing ratios)') - args = parser.parse_args() - - tool = CalibrationTool(args.port, args.baudrate, args.spectrometer) - - if args.read: - # Read calibration from device - tool.connect() - try: - result = tool.read_calibration_table() - if result: - table, valid = result - status = "CALIBRATED" if valid else "DEFAULTS" - print(f"\nCalibration status: {status}") - print("\nMixing ratios table:") - for i, (cct, row) in enumerate(zip(CCT_POINTS, table)): - values = ", ".join(f"{v:3d}" for v in row) - print(f" {cct}K: [{values}]") - finally: - tool.disconnect() - elif args.clear: - # Clear calibration on device - tool.connect() - try: - if tool.cal_clear(): - print("Calibration cleared successfully") - else: - print("Failed to clear calibration") - finally: - tool.disconnect() - elif args.y_only: - # Only run y-data calibration - tool.connect() - try: - tool.disable_profile() - time.sleep(0.5) - y27_cal, y50_cal = tool.calibrate_y_data() - if y27_cal and y50_cal: - # Write y-data with default mixing ratios - print("\nWriting y-data calibration (with default mixing ratios)...") - default_mixing = [ - [ 0, 0, 0, 0, 0], # 2600K - [ 32, 38, 36, 37, 36], # 2900K - [ 84, 72, 70, 71, 71], # 3200K - [142, 100, 99, 99, 99], # 3500K - [175, 131, 126, 127, 126], # 3800K - [155, 154, 154, 157, 153], # 4100K - [206, 170, 184, 184, 185], # 4400K - [242, 223, 208, 216, 217], # 4700K - [255, 255, 255, 255, 255] # 5000K - ] - if tool.write_calibration_table(default_mixing, y27_cal, y50_cal): - print("Y-data calibration saved successfully!") - # Save to file as well - data = { - 'y27_cal': y27_cal, - 'y50_cal': y50_cal, - 'x_data': X_DATA - } - with open(CALIBRATION_OUTPUT, 'w') as f: - json.dump(data, f, indent=2) - else: - print("Failed to write y-data calibration") - finally: - tool.disconnect() - elif args.generate_only or args.write: - # Load existing measurements and generate/write table - if CALIBRATION_OUTPUT.exists(): - with open(CALIBRATION_OUTPUT, 'r') as f: - saved = json.load(f) - if 'measurements' in saved: - tool.measurements = { - tuple(map(int, k.split(','))): v - for k, v in saved['measurements'].items() - } - - # Connect to read current values from device - tool.connect() - try: - table = tool.generate_table(verbose=True) - - if args.write and table: - # Load y-data if available - y27 = saved.get('y27_cal') - y50 = saved.get('y50_cal') - tool.write_calibration_table(table, y27, y50) - finally: - tool.disconnect() - else: - print(f"No calibration file found: {CALIBRATION_OUTPUT}") - else: - tool.run_calibration(skip_y=args.skip_y) - - -if __name__ == "__main__": - main() diff --git a/hpcs6500.py b/hpcs6500.py deleted file mode 100644 index f23aa2e..0000000 --- a/hpcs6500.py +++ /dev/null @@ -1,887 +0,0 @@ -""" -HPCS 6500 Spectrophotometer / Integrating Sphere — Direct Reader - -Communicates with the HPCS 6500 over USB serial (STM32 VCP) to take -measurements and extract photometric, colorimetric, radiometric, -electrical, and spectral data. - -Usage: - uv run hpcs6500.py # auto-detect port, single reading - uv run hpcs6500.py --port COM42 # specify port - uv run hpcs6500.py --continuous # continuous readings - uv run hpcs6500.py --csv out.csv # save to CSV - uv run hpcs6500.py --spectrum # also print full spectrum -""" - -import argparse -import csv -import struct -import sys -import time -from datetime import datetime - -import serial -import serial.tools.list_ports - -# Protocol constants -SYNC = 0x8C -CMD_IDENTIFY = 0x00 -CMD_INTEGRATION_TIME = 0x01 -CMD_POLL_STATE = 0x03 -CMD_STATUS = 0x05 -CMD_START = 0x0E -CMD_READ_MEASUREMENT = 0x13 -CMD_RESET = 0x25 -CMD_CONFIG = 0x2A -CMD_SET_DC = 0x73 -CMD_READ_ELECTRICAL = 0x77 -CMD_SET_AC = 0x78 -CMD_READ_PSU = 0x79 -CMD_PSU_OUTPUT = 0x72 -CMD_SET_MODE = 0x7A -CMD_TEST_CONFIG = 0x2B - -# Single-test config payloads captured from vendor software. -# Sub 00: test parameters, sub 01: test config with auto-PSU flag at byte 37. -_TEST_CONFIG_SUB0 = bytes.fromhex( - "00003c00000001008813037c011a04000000484200000208" - "000000000001060000000000803f0000803f0000803f0000" - "803f0000803f00000000003f" -) -_TEST_CONFIG_SUB1_BASE = bytes.fromhex( - "017c010c037c010c037c010c030000803f000000000000000000000000" - "00000000000000000001000000400000803f" -) - -# State polling byte[5] values -STATE_IDLE = 0x04 -STATE_MEASURING = 0x01 - -# Spectrum parameters -SPECTRUM_START_NM = 380 -SPECTRUM_END_NM = 1050 -SPECTRUM_OFFSET = 432 -SPECTRUM_COUNT = 350 -SPECTRUM_STEP = (SPECTRUM_END_NM - SPECTRUM_START_NM) / (SPECTRUM_COUNT - 1) - -# Measurement block field offsets (all float32 LE) -FIELDS = { - "Phi_lm": 36, - "eta_lm_W": 40, - "CCT_K": 44, - "Duv": 48, - "x": 52, - "y": 56, - "u": 60, - "v": 64, - "u_prime": 68, - "v_prime": 72, - "SDCM": 76, - "Ra": 80, - "R1": 84, - "R2": 88, - "R3": 92, - "R4": 96, - "R5": 100, - "R6": 104, - "R7": 108, - "R8": 112, - "R9": 116, - "R10": 120, - "R11": 124, - "R12": 128, - "R13": 132, - "R14": 136, - "R15": 140, - "Phi_e_mW": 144, - "Phi_euv_mW": 148, - "Phi_eb_mW": 152, - "Phi_ey_mW": 156, - "Phi_er_mW": 160, - "Phi_efr_mW": 164, - "Phi_eir_mW": 168, - "Phi_e_total": 172, - "CIE_X": 224, - "CIE_Y": 228, - "CIE_Z": 232, - "TLCI": 236, - "PeakSignal": 244, - "DarkSignal": 248, - "Compensate": 252, -} - -# Electrical block field offsets -ELECTRICAL_FIELDS = { - "Voltage_V": 8, - "Current_A": 12, - "Power_W": 16, - "Freq_Hz": 20, - "PF": 24, -} - -# Harmonics offsets within the electrical block -HARMONICS_V_OFFSET = 544 # 50 x float32 voltage harmonics (%) -HARMONICS_V_COUNT = 50 -UTHD_OFFSET = 744 # float32 UThd (%) -HARMONICS_I_OFFSET = 800 # 50 x float32 current harmonics (%) -HARMONICS_I_COUNT = 50 -ATHD_OFFSET = 1000 # float32 AThd (%) - -# Waveform offsets (int16 LE samples, 128 per waveform) -WAVEFORM_V_OFFSET = 30 -WAVEFORM_I_OFFSET = 286 -WAVEFORM_SAMPLES = 128 - - -def parse_pcap_messages(filepath): - """Parse a USBPcap pcap file and extract bulk transfer payloads.""" - with open(filepath, "rb") as f: - data = f.read() - magic = struct.unpack_from("" - offset = 24 - messages = [] - first_ts = None - while offset + 16 <= len(data): - ts_sec, ts_usec, incl_len, orig_len = struct.unpack_from( - f"{endian}IIII", data, offset - ) - offset += 16 - if offset + incl_len > len(data): - break - pkt_data = data[offset : offset + incl_len] - offset += incl_len - if len(pkt_data) < 27: - continue - hdr_len = struct.unpack_from(" deadline: - break - return data - - def _recv_response(self, cmd_id, timeout=3.0): - """Read a response, expecting it to start with 8C .""" - # Read the 2-byte header first - hdr = self._recv(2, timeout) - if len(hdr) < 2: - return None - if hdr[0] != SYNC or hdr[1] != cmd_id: - # Try to resync — read until we find 8C - buf = hdr - deadline = time.monotonic() + timeout - while time.monotonic() < deadline: - b = self.ser.read(1) - if not b: - continue - buf += b - idx = buf.find(bytes([SYNC, cmd_id])) - if idx >= 0: - hdr = buf[idx:idx+2] - break - else: - return None - return hdr - - def identify(self): - """Send identify command, return device name string.""" - self.ser.reset_input_buffer() - self._send(CMD_IDENTIFY) - resp = self._recv(16, timeout=2.0) - if len(resp) < 16: - return None - if resp[0] != SYNC or resp[1] != CMD_IDENTIFY: - return None - name = resp[2:10].decode("ascii", errors="replace").rstrip("\x00") - return name - - def read_measurement_block(self): - """Send 8C 13 and read the 3904-byte measurement block.""" - self.ser.reset_input_buffer() - self._send(CMD_READ_MEASUREMENT) - # First, read the 4-byte header: 8C 13 0F 40 - hdr = self._recv(4, timeout=3.0) - if len(hdr) < 4 or hdr[0] != SYNC or hdr[1] != CMD_READ_MEASUREMENT: - return None - # Then read the 3904-byte payload - payload = self._recv(3904, timeout=5.0) - if len(payload) < 3904: - print(f"Warning: measurement block short ({len(payload)}/3904 bytes)") - return None - return payload - - def read_electrical_block(self): - """Send 8C 77 and read the 1584-byte electrical block.""" - self.ser.reset_input_buffer() - self._send(CMD_READ_ELECTRICAL) - # 4-byte header: 8C 77 06 30 - hdr = self._recv(4, timeout=3.0) - if len(hdr) < 4 or hdr[0] != SYNC or hdr[1] != CMD_READ_ELECTRICAL: - return None - payload = self._recv(1584, timeout=5.0) - if len(payload) < 1584: - print(f"Warning: electrical block short ({len(payload)}/1584 bytes)") - return None - return payload - - def poll_state(self): - """Send 8C 03 and return (data_available, state).""" - self.ser.reset_input_buffer() - self._send(CMD_POLL_STATE) - resp = self._recv(9, timeout=2.0) - if len(resp) < 9 or resp[0] != SYNC or resp[1] != CMD_POLL_STATE: - return None, None - data_available = resp[2] == 1 - state = resp[5] - return data_available, state - - def send_test_config(self, auto_psu=False): - """Send single-test configuration (8C 2B sub 00 + sub 01). - If auto_psu=True, device handles PSU on/off automatically.""" - self.ser.reset_input_buffer() - self.ser.write(bytes([SYNC, CMD_TEST_CONFIG]) + _TEST_CONFIG_SUB0) - resp = self._recv(2, timeout=2.0) - if resp != bytes([SYNC, CMD_TEST_CONFIG]): - return False - - sub1 = bytearray(_TEST_CONFIG_SUB1_BASE) - if auto_psu: - sub1[37] = 0x01 - self.ser.reset_input_buffer() - self.ser.write(bytes([SYNC, CMD_TEST_CONFIG]) + bytes(sub1)) - resp = self._recv(2, timeout=2.0) - return resp == bytes([SYNC, CMD_TEST_CONFIG]) - - def start_measurement(self): - """Send 8C 0E 01 to start measurement.""" - self.ser.reset_input_buffer() - self._send(CMD_START, 0x01) - resp = self._recv(2, timeout=2.0) - return resp == bytes([SYNC, CMD_START]) - - def stop_measurement(self): - """Send 8C 0E 02 to stop measurement.""" - self.ser.reset_input_buffer() - self._send(CMD_START, 0x02) - resp = self._recv(2, timeout=2.0) - return resp == bytes([SYNC, CMD_START]) - - def reset(self): - """Send 8C 25 to reset.""" - self.ser.reset_input_buffer() - self._send(CMD_RESET) - resp = self._recv(2, timeout=2.0) - return resp == bytes([SYNC, CMD_RESET]) - - # --- Power supply control --- - - def psu_on(self): - """Turn PSU output on.""" - self.ser.reset_input_buffer() - self._send(CMD_PSU_OUTPUT, 0x00) - resp = self._recv(2, timeout=2.0) - return resp == bytes([SYNC, CMD_PSU_OUTPUT]) - - def psu_off(self): - """Turn PSU output off.""" - self.ser.reset_input_buffer() - self._send(CMD_PSU_OUTPUT, 0x01) - resp = self._recv(2, timeout=2.0) - return resp == bytes([SYNC, CMD_PSU_OUTPUT]) - - def set_mode(self, mode): - """Set output mode: 'ac' or 'dc'.""" - mode_byte = 0x00 if mode.lower() == "ac" else 0x01 - self.ser.reset_input_buffer() - self._send(CMD_SET_MODE, mode_byte) - resp = self._recv(2, timeout=2.0) - return resp == bytes([SYNC, CMD_SET_MODE]) - - def set_ac_voltage(self, volts): - """Set AC output voltage (100-240 V).""" - self.ser.reset_input_buffer() - data = bytes([SYNC, CMD_SET_AC, 0x00]) + struct.pack("= ATHD_OFFSET + 4: - h1_v = struct.unpack_from(" 0.001 or i == 0: - lines.append(f" H{i+1:2d}: {val:8.4f}") - lines.append("") - - lines.append(" --- Current Harmonics (%) ---") - ih = r["I_harmonics"] - for i, val in enumerate(ih): - if val > 0.001 or i == 0: - lines.append(f" H{i+1:2d}: {val:8.4f}") - lines.append("") - - lines.append(" --- Sensor ---") - lines.append(f" Peak Signal: {r.get('PeakSignal', 0):10.0f}") - lines.append(f" Dark Signal: {r.get('DarkSignal', 0):10.0f}") - lines.append(f" Compensate: {r.get('Compensate', 0):10.0f}") - - if show_spectrum and "spectrum" in r: - lines.append("") - lines.append(" --- Spectrum (380-1050nm) ---") - spectrum = r["spectrum"] - nm = r["spectrum_nm"] - peak_val = max(spectrum) if spectrum else 1 - for i, (wl, val) in enumerate(zip(nm, spectrum)): - if i % 5 == 0: # Print every 5th point (~10nm spacing) - norm = val / peak_val if peak_val > 0 else 0 - bar = "#" * int(norm * 40) - lines.append(f" {wl:7.1f}nm: {val:8.4f} [{bar}]") - - return "\n".join(lines) - - -def format_quick(r, reading_num=None): - """Format a reading for quick test mode: lumen + CCT only.""" - lm = r.get("Phi_lm", 0) - cct = r.get("CCT_K", 0) - prefix = f"#{reading_num} " if reading_num else "" - return f" {prefix}{lm:.1f} lm {cct:.0f} K" - - -def main(): - parser = argparse.ArgumentParser(description="HPCS 6500 Spectrophotometer Reader") - parser.add_argument("--port", help="COM port (auto-detect if not specified)") - parser.add_argument("--continuous", action="store_true", help="Continuous reading mode") - parser.add_argument("--csv", metavar="FILE", help="Save readings to CSV file") - parser.add_argument("--spectrum", action="store_true", help="Show full spectrum data") - parser.add_argument("--passive", action="store_true", - help="Passive mode: read data without controlling instrument") - parser.add_argument("--quick", action="store_true", - help="Quick test mode: only report lumen and CCT") - parser.add_argument("--harmonics", action="store_true", - help="Show harmonics data (voltage/current THD and per-harmonic)") - parser.add_argument("--parse", metavar="PCAP", help="Parse a pcap capture file instead") - - # Power supply control - psu = parser.add_argument_group("power supply") - psu.add_argument("--mode", choices=["ac", "dc"], help="Set output mode") - psu.add_argument("--voltage", type=float, help="Set output voltage (V)") - psu.add_argument("--frequency", type=float, help="Set AC frequency (Hz)") - psu.add_argument("--current", type=float, help="Set DC current limit (A)") - psu.add_argument("--integration", type=float, help="Set integration time (ms), 0=auto") - psu.add_argument("--psu-on", action="store_true", help="Turn PSU output on") - psu.add_argument("--psu-off", action="store_true", help="Turn PSU output off") - psu.add_argument("--no-psu", action="store_true", - help="Don't auto-control PSU during measurements") - psu.add_argument("--psu-status", action="store_true", help="Read power supply settings") - - args = parser.parse_args() - - # --harmonics implies --spectrum for the detailed display - if args.harmonics: - args.spectrum = True - - # Parse mode: analyze an existing capture - if args.parse: - messages = parse_pcap_messages(args.parse) - blocks = [m for m in messages if m["dir"] == "RX" and len(m["data"]) == 3904 - and m["data"][:8] == b"HPCS6500"] - config_blocks = [m for m in messages if m["dir"] == "RX" and len(m["data"]) == 1584] - - dev = HPCS6500.__new__(HPCS6500) - for i, block in enumerate(blocks): - result = dev._parse_measurement(block["data"]) - if i < len(config_blocks): - result.update(dev._parse_electrical(config_blocks[i]["data"])) - if args.quick: - print(format_quick(result, i + 1)) - else: - print(f"\n{'='*60}") - print(f"Reading {i+1} (t={block['ts']:.2f}s)") - print(f"{'='*60}") - print(format_reading(result, show_spectrum=args.spectrum)) - return - - # Find port - port = args.port or find_hpcs_port() - if not port: - print("ERROR: HPCS 6500 not found. Connect the device or specify --port.") - print("\nAvailable ports:") - for p in serial.tools.list_ports.comports(): - print(f" {p.device}: {p.description} [{p.hwid}]") - sys.exit(1) - - print(f"HPCS 6500 Spectrophotometer Reader") - print(f"Port: {port}") - print("=" * 60) - - dev = HPCS6500(port) - - # Identify - name = dev.identify() - if name: - print(f"Device: {name}") - else: - print("Warning: no identify response (device may be busy)") - - # Power supply control - has_psu_cmd = any([args.mode, args.voltage is not None, args.frequency is not None, - args.current is not None, args.integration is not None, - args.psu_status, args.psu_on, args.psu_off]) - - if args.psu_status: - settings = dev.read_psu_settings() - if settings: - print(f"\nPower Supply Settings:") - print(f" Mode: {settings['mode']}") - print(f" AC Voltage: {settings['ac_voltage']:.0f} V") - print(f" AC Frequency: {settings['ac_frequency']:.0f} Hz") - print(f" DC Voltage: {settings['dc_voltage']:.1f} V") - print(f" DC Current: {settings['dc_current']:.1f} A") - else: - print("Failed to read PSU settings") - if not args.continuous and args.voltage is None and args.mode is None: - dev.close() - return - - if args.mode: - ok = dev.set_mode(args.mode) - print(f"Set mode to {args.mode.upper()}: {'OK' if ok else 'FAILED'}") - - if args.voltage is not None: - mode = args.mode or "ac" - if mode == "ac": - ok = dev.set_ac_voltage(args.voltage) - else: - ok = dev.set_dc_voltage(args.voltage) - print(f"Set {mode.upper()} voltage to {args.voltage} V: {'OK' if ok else 'FAILED'}") - - if args.frequency is not None: - ok = dev.set_ac_frequency(args.frequency) - print(f"Set AC frequency to {args.frequency} Hz: {'OK' if ok else 'FAILED'}") - - if args.current is not None: - ok = dev.set_dc_current(args.current) - print(f"Set DC current limit to {args.current} A: {'OK' if ok else 'FAILED'}") - - if args.integration is not None: - ok = dev.set_integration_time(args.integration) - print(f"Set integration time to {args.integration} ms: {'OK' if ok else 'FAILED'}") - - if args.psu_on: - ok = dev.psu_on() - print(f"PSU output ON: {'OK' if ok else 'FAILED'}") - - if args.psu_off: - ok = dev.psu_off() - print(f"PSU output OFF: {'OK' if ok else 'FAILED'}") - - # If only PSU commands were given with no measurement request, exit - if has_psu_cmd and not args.continuous and not args.passive: - dev.close() - return - - csv_writer = None - csv_file = None - if args.csv: - csv_file = open(args.csv, "w", newline="") - fieldnames = ["timestamp"] + list(FIELDS.keys()) + list(ELECTRICAL_FIELDS.keys()) - csv_writer = csv.DictWriter(csv_file, fieldnames=fieldnames, extrasaction="ignore") - csv_writer.writeheader() - print(f"Saving to: {args.csv}") - - # Only control PSU if explicitly requested or in continuous mode - use_psu = args.continuous and not args.no_psu and not args.passive - - try: - if use_psu: - dev.psu_on() - time.sleep(0.2) - - reading_num = 0 - while True: - reading_num += 1 - - if not args.quick: - print(f"\n{'='*60}") - print(f"Reading {reading_num} ({datetime.now().strftime('%H:%M:%S')})") - print(f"{'='*60}") - - if args.passive: - result = dev.read_current() - elif args.continuous: - result = dev.take_reading(psu=False) - else: - result = dev.take_single_reading() - - if result is None: - print("Failed to get reading") - if not args.continuous: - break - time.sleep(1) - continue - - if args.quick: - print(format_quick(result, reading_num)) - else: - print(format_reading(result, show_spectrum=args.spectrum)) - - if csv_writer: - row = {"timestamp": datetime.now().isoformat()} - row.update({k: v for k, v in result.items() - if isinstance(v, (int, float))}) - csv_writer.writerow(row) - csv_file.flush() - - if not args.continuous: - break - - time.sleep(0.5) - - except KeyboardInterrupt: - print("\nStopped.") - finally: - if use_psu: - dev.psu_off() - dev.reset() - dev.close() - if csv_file: - csv_file.close() - print(f"Data saved to: {args.csv}") - - -if __name__ == "__main__": - main() diff --git a/label_printer.py b/label_printer.py deleted file mode 100644 index 9ebe477..0000000 --- a/label_printer.py +++ /dev/null @@ -1,112 +0,0 @@ -""" -Lamp ID labels on the Brother QL-820NWB (DK-11221, 23x23 mm die-cut). - -Each label carries the lamp ID as a QR code and as text. These are internal -inventory labels: scanning one with the station's barcode scanner types the -ID, which drops straight into the re-measure flow. The station prints two -per lamp: one for the box, one for the lamp itself. - -Printer address comes from --printer or the HPCS_LABEL_PRINTER environment -variable, e.g. tcp://192.168.1.50 (the QL-820NWB listens on port 9100). - -Usage: - uv run label_printer.py L0006 # print 2 labels - uv run label_printer.py L0006 --copies 1 - uv run label_printer.py L0006 --preview out.png # render only, no printer -""" - -import argparse -import os -import sys - -import qrcode -from PIL import Image, ImageDraw, ImageFont - -LABEL_ID = "23x23" # DK-11221 -DOTS = (202, 202) # printable area of the 23x23 label -MODEL = "QL-820NWB" -TEXT_HEIGHT = 52 # bottom strip for the ID text - - -def _font(size): - for name in ("arialbd.ttf", "arial.ttf", "DejaVuSans-Bold.ttf"): - try: - return ImageFont.truetype(name, size) - except OSError: - continue - return ImageFont.load_default(size) - - -def render_label(lamp_id: str) -> Image.Image: - """202x202 1-bit label: the bare lamp ID as QR on top, as text below.""" - image = Image.new("1", DOTS, 1) - - # Just the ID (internal use): a 5-character QR stays at version 1, so the - # modules print large and scan reliably at 23 mm. Scanning it at the - # station types the ID and lands in the re-measure flow. - qr = qrcode.QRCode( - error_correction=qrcode.constants.ERROR_CORRECT_M, - box_size=1, - border=2, # quiet zone; tight but fine for close-range scanning - ) - qr.add_data(lamp_id.upper()) - qr.make(fit=True) - modules = len(qr.get_matrix()) - qr_size = DOTS[1] - TEXT_HEIGHT - qr.box_size = max(1, qr_size // modules) - qr_img = qr.make_image().get_image().convert("1") - image.paste(qr_img, ((DOTS[0] - qr_img.width) // 2, (qr_size - qr_img.height) // 2)) - - draw = ImageDraw.Draw(image) - size = 44 - while size > 10: - font = _font(size) - box = draw.textbbox((0, 0), lamp_id, font=font) - if box[2] - box[0] <= DOTS[0] - 8: - break - size -= 2 - draw.text( - ((DOTS[0] - (box[2] - box[0])) // 2 - box[0], DOTS[1] - TEXT_HEIGHT + (TEXT_HEIGHT - (box[3] - box[1])) // 2 - box[1]), - lamp_id, - font=font, - fill=0, - ) - return image - - -def print_labels(lamp_id: str, printer: str, copies: int = 2) -> None: - """Render and send `copies` labels to the QL-820NWB.""" - from brother_ql.backends.helpers import send - from brother_ql.conversion import convert - from brother_ql.raster import BrotherQLRaster - - image = render_label(lamp_id) - raster = BrotherQLRaster(MODEL) - instructions = convert(qlr=raster, images=[image] * copies, label=LABEL_ID, cut=True) - send(instructions=instructions, printer_identifier=printer, backend_identifier="network", blocking=True) - - -def main(): - parser = argparse.ArgumentParser(description="Print lamp ID labels (QR + ID)") - parser.add_argument("lamp_id", help="e.g. L0006") - parser.add_argument("--printer", default=os.environ.get("HPCS_LABEL_PRINTER", ""), - help="tcp:// of the QL-820NWB (default: HPCS_LABEL_PRINTER env)") - parser.add_argument("--copies", type=int, default=2) - parser.add_argument("--preview", metavar="PNG", - help="Write the rendered label to a PNG instead of printing") - args = parser.parse_args() - - lamp_id = args.lamp_id.upper() - if args.preview: - render_label(lamp_id).save(args.preview) - print(f"Wrote {args.preview}") - return - if not args.printer: - print("ERROR: no printer configured. Pass --printer tcp:// or set HPCS_LABEL_PRINTER.") - sys.exit(1) - print_labels(lamp_id, args.printer, args.copies) - print(f"Printed {args.copies} label(s) for {lamp_id} on {args.printer}") - - -if __name__ == "__main__": - main() diff --git a/lamp_export.py b/lamp_export.py deleted file mode 100644 index c368d16..0000000 --- a/lamp_export.py +++ /dev/null @@ -1,283 +0,0 @@ -""" -Lamp comparison export — one measurement, one publishable data bundle. - -Takes a reading from the HPCS 6500 (or an existing pcap capture) and writes -the per-lamp files consumed by the buildfor.life comparison pages: - - //spd.csv full spectrum, wavelength_nm,value (380-1050 nm) - //tm30.csv TM-30-18 hue-bin data for the color vector graphic - //metrics.json photometric / colorimetric / CRI / TM-30 / - electrical summary - -Usage: - uv run lamp_export.py --name philips-a60-8w - uv run lamp_export.py --name x --manufacturer Philips --model "A60 8W 927" - uv run lamp_export.py --name x --readings 5 # average 5 readings - uv run lamp_export.py --name x --voltage 230 --frequency 50 --settle 60 - uv run lamp_export.py --name x --passive # vendor SW drives the instrument - uv run lamp_export.py --name x --parse captures/run.pcap - -With --voltage/--frequency/--current/--mode (or --psu), the built-in supply is -configured, switched on for the measurement, and switched off afterwards. ---settle waits after power-on so the lamp stabilizes before the first reading. -""" - -import argparse -import csv -import json -import sys -import time -from datetime import datetime -from pathlib import Path - -from hpcs6500 import HPCS6500, find_hpcs_port, parse_pcap_messages - -SCALAR_GROUPS = { - "photometric": ["Phi_lm", "eta_lm_W", "CCT_K", "Duv", "SDCM", "TLCI"], - "chromaticity": ["x", "y", "u", "v", "u_prime", "v_prime", "CIE_X", "CIE_Y", "CIE_Z"], - "radiometric": [ - "Phi_e_mW", "Phi_euv_mW", "Phi_eb_mW", "Phi_ey_mW", - "Phi_er_mW", "Phi_efr_mW", "Phi_eir_mW", "Phi_e_total", - ], - "electrical": ["Voltage_V", "Current_A", "Power_W", "Freq_Hz", "PF", "UThd", "AThd"], - "sensor": ["PeakSignal", "DarkSignal", "Compensate"], -} - - -def average_readings(readings): - """Element-wise average of scalars and spectra across readings.""" - result = dict(readings[0]) - n = len(readings) - if n == 1: - return result - for key, value in readings[0].items(): - if isinstance(value, (int, float)): - result[key] = sum(r.get(key, 0.0) for r in readings) / n - elif key == "spectrum": - result[key] = [ - sum(r["spectrum"][i] for r in readings) / n - for i in range(len(value)) - ] - return result - - -def readings_from_pcap(path): - """Extract parsed readings from a pcap capture.""" - messages = parse_pcap_messages(path) - blocks = [m for m in messages if m["dir"] == "RX" and len(m["data"]) == 3904 - and m["data"][:8] == b"HPCS6500"] - elec_blocks = [m for m in messages if m["dir"] == "RX" and len(m["data"]) == 1584] - dev = HPCS6500.__new__(HPCS6500) - readings = [] - for i, block in enumerate(blocks): - r = dev._parse_measurement(block["data"]) - if i < len(elec_blocks): - r.update(dev._parse_electrical(elec_blocks[i]["data"])) - readings.append(r) - return readings - - -def readings_from_device(port, count, passive, psu): - dev = HPCS6500(port) - name = dev.identify() - if name: - print(f"Device: {name}") - readings = [] - supply = None - try: - if psu["mode"]: - ok = dev.set_mode(psu["mode"]) - print(f"Mode {psu['mode'].upper()}: {'OK' if ok else 'FAILED'}") - if psu["voltage"] is not None: - if psu["mode"] == "dc": - ok = dev.set_dc_voltage(psu["voltage"]) - else: - ok = dev.set_ac_voltage(psu["voltage"]) - print(f"Voltage {psu['voltage']:g} V: {'OK' if ok else 'FAILED'}") - if psu["frequency"] is not None: - ok = dev.set_ac_frequency(psu["frequency"]) - print(f"Frequency {psu['frequency']:g} Hz: {'OK' if ok else 'FAILED'}") - if psu["current"] is not None: - ok = dev.set_dc_current(psu["current"]) - print(f"DC current limit {psu['current']:g} A: {'OK' if ok else 'FAILED'}") - - supply = dev.read_psu_settings() - - if psu["enable"]: - if not dev.psu_on(): - print("ERROR: failed to turn PSU on") - sys.exit(1) - print("PSU on") - if psu["settle"] > 0: - print(f"Settling {psu['settle']:g} s ...") - time.sleep(psu["settle"]) - else: - time.sleep(0.2) - - for i in range(count): - print(f"Reading {i + 1}/{count} ...") - if passive: - r = dev.read_current() - else: - # Vendor single-shot cycle (verified from USB captures): - # test config -> trigger (8C 0E 02) -> poll -> read -> reset, - # repeated per reading. auto_psu stays off; we hold the PSU. - dev.send_test_config(auto_psu=False) - r = dev.take_single_reading() - if r is None: - print("ERROR: failed to get reading") - sys.exit(1) - readings.append(r) - if i < count - 1: - if psu["enable"] and not passive: - # take_single_reading() ends with an instrument reset; - # make sure the lamp stays powered for the next reading. - dev.psu_on() - if psu["interval"] > 0: - time.sleep(psu["interval"]) - finally: - if psu["enable"]: - dev.psu_off() - print("PSU off") - dev.close() - return readings, supply - - -def write_bundle(reading, out_dir, meta, n_readings, supply=None): - # Deferred: importing colour-science takes a few seconds, so it happens - # after the readings rather than at startup. - from tm30 import compute_tm30 - - out_dir.mkdir(parents=True, exist_ok=True) - - spectrum = reading.get("spectrum") or [] - nm = reading.get("spectrum_nm") or [] - if not spectrum or max(spectrum) <= 0: - print("ERROR: reading contains no spectrum data") - sys.exit(1) - - # spd.csv — full measured range; consumers trim to visible as needed. - with open(out_dir / "spd.csv", "w", newline="") as f: - w = csv.writer(f) - w.writerow(["wavelength_nm", "value"]) - for wl, val in zip(nm, spectrum): - w.writerow([f"{wl:.2f}", f"{val:.6g}"]) - - # TM-30 from the same spectrum. - tm30 = compute_tm30(nm, spectrum) - bin_fields = list(tm30["bins"][0].keys()) - with open(out_dir / "tm30.csv", "w", newline="") as f: - w = csv.DictWriter(f, fieldnames=bin_fields) - w.writeheader() - for b in tm30["bins"]: - w.writerow({k: (f"{v:.6g}" if isinstance(v, float) else v) for k, v in b.items()}) - - # metrics.json — grouped scalars plus identification. ean/variant are set - # by lamp_station.py when one barcode covers several versions of a lamp - # (e.g. daylight and warm white sharing box art and EAN). - metrics = {"name": meta["name"]} - if meta.get("ean"): - metrics["ean"] = meta["ean"] - if meta.get("type"): - # Lamp technology: led, halogen, cfl, incandescent, ... - metrics["type"] = meta["type"] - if meta.get("dimmable") is not None: - metrics["dimmable"] = meta["dimmable"] - if meta.get("variant"): - metrics["variant"] = meta["variant"] - if meta.get("rated"): - # Advertised values from the packaging, keyed like their measured - # counterparts so consumers can pair them (truth-in-advertising rows). - metrics["rated"] = meta["rated"] - metrics |= { - "manufacturer": meta["manufacturer"], - "model": meta["model"], - "notes": meta["notes"], - "instrument": reading.get("device", "HPCS6500"), - "measured_at": datetime.now().astimezone().isoformat(timespec="seconds"), - "instrument_date": reading.get("test_date"), - "instrument_time": reading.get("test_time"), - "readings_averaged": n_readings, - "tm30": {"Rf": round(tm30["Rf"], 1), "Rg": round(tm30["Rg"], 1)}, - "cri": {"Ra": reading.get("Ra")} - | {f"R{i}": reading.get(f"R{i}") for i in range(1, 16)}, - } - if supply: - metrics["supply"] = supply - for group, keys in SCALAR_GROUPS.items(): - metrics[group] = {k: reading[k] for k in keys if k in reading} - with open(out_dir / "metrics.json", "w") as f: - json.dump(metrics, f, indent=2) - - return tm30 - - -def main(): - parser = argparse.ArgumentParser(description="Export a lamp measurement bundle") - parser.add_argument("--name", required=True, - help="Lamp slug, becomes the output directory name") - parser.add_argument("--manufacturer", default="") - parser.add_argument("--model", default="") - parser.add_argument("--notes", default="") - parser.add_argument("--out", default="lamps", help="Output base directory") - parser.add_argument("--port", help="COM port (auto-detect if omitted)") - parser.add_argument("--readings", type=int, default=1, - help="Number of readings to average (default 1)") - parser.add_argument("--passive", action="store_true", - help="Read without controlling the instrument") - parser.add_argument("--parse", metavar="PCAP", - help="Export from a pcap capture instead of the device") - - psu_group = parser.add_argument_group("power supply") - psu_group.add_argument("--mode", choices=["ac", "dc"], - help="Supply mode (default ac when --voltage is given)") - psu_group.add_argument("--voltage", type=float, help="Supply voltage (V)") - psu_group.add_argument("--frequency", type=float, help="AC frequency (Hz)") - psu_group.add_argument("--current", type=float, help="DC current limit (A)") - psu_group.add_argument("--psu", action="store_true", - help="Power the lamp from the built-in supply " - "(implied by --mode/--voltage/--frequency/--current)") - psu_group.add_argument("--settle", type=float, default=0, - help="Seconds to wait after PSU on before the first reading") - parser.add_argument("--interval", type=float, default=1.0, - help="Seconds to wait between readings (default 1)") - args = parser.parse_args() - - psu = { - "mode": args.mode, - "voltage": args.voltage, - "frequency": args.frequency, - "current": args.current, - "settle": args.settle, - "interval": args.interval, - "enable": args.psu or args.mode is not None or args.voltage is not None - or args.frequency is not None or args.current is not None, - } - - supply = None - if args.parse: - readings = readings_from_pcap(args.parse) - if not readings: - print(f"ERROR: no measurement blocks in {args.parse}") - sys.exit(1) - print(f"Using {len(readings)} reading(s) from capture") - else: - port = args.port or find_hpcs_port() - if not port: - print("ERROR: HPCS 6500 not found. Connect the device or specify --port.") - sys.exit(1) - readings, supply = readings_from_device(port, args.readings, args.passive, psu) - - reading = average_readings(readings) - out_dir = Path(args.out) / args.name - meta = {k: getattr(args, k) for k in ("name", "manufacturer", "model", "notes")} - tm30 = write_bundle(reading, out_dir, meta, len(readings), supply) - - print(f"\nWrote {out_dir}/spd.csv, tm30.csv, metrics.json") - print(f" {reading.get('Phi_lm', 0):.0f} lm {reading.get('eta_lm_W', 0):.1f} lm/W " - f"{reading.get('CCT_K', 0):.0f} K Ra {reading.get('Ra', 0):.1f}") - print(f" TM-30: Rf {tm30['Rf']:.1f} Rg {tm30['Rg']:.1f}") - - -if __name__ == "__main__": - main() diff --git a/lamp_station.py b/lamp_station.py deleted file mode 100644 index 24c72b1..0000000 --- a/lamp_station.py +++ /dev/null @@ -1,392 +0,0 @@ -""" -Lamp measurement station — scan a barcode, measure, commit, done. - -Interactive loop for building the buildfor.life lamp comparison database. -Every lamp gets an internal ID (L0001, L0002, ...) as its primary key; the -EAN barcode is optional metadata. This keeps lamps distinct when one barcode -covers several versions (daylight / warm white in the same box art) and -supports unbranded lamps without any barcode. - - 1. Every run opens with a freshly allocated ID (L0012, ...). The ID only - becomes real once the bundle is written, so aborting never burns one. - 2. Scan the box with a keyboard-wedge barcode scanner (types EAN + - Enter), press Enter for a lamp without a barcode, or type an existing - ID (e.g. L0004) to re-measure that lamp with everything pre-filled, - which also rewrites its bundle in the current metrics format. Scanned - EANs are checksum-validated; lamps already measured with the same EAN - are listed (pick one to re-measure, or continue as the new lamp: that - is how same-EAN variants get their own IDs). Identification is - suggested from previous lamps, a local cache, then upcitemdb.com - (best effort; GS1-restricted 20-29 barcodes skip the online lookup). - 3. Confirm or edit manufacturer / model / variant / notes, then type the - ADVERTISED values from the packaging (lumen, CCT, watts, CRI, - lifetime, equivalent watts; Enter skips unknown ones). They are - stored under "rated" in metrics.json so the site can show - advertised-vs-measured deltas. - 4. Insert the lamp, press Enter: the built-in supply powers it per the - published procedure (230 V / 50 Hz, 60 s settle, 5 readings averaged) - and the bundle (spd.csv, tm30.csv, metrics.json) is written to - /lamps//. - 5. The bundle is committed to the comparison-data repo and pushed. The - website picks it up automatically (data-driven device list plus the - auto-bump deploy); an .md page in the web repo is only ever needed - for photos, where-to-buy links, or notes. - 6. Two ID labels (QR to the lamp's page + the ID, DK-11221 23x23 mm) - print on the Brother QL-820NWB: one for the box, one for the lamp. - Configure the printer via HPCS_LABEL_PRINTER or --printer; reprint - any lamp later with `uv run label_printer.py L0006`. - -Usage: - uv run lamp_station.py # defaults below - uv run lamp_station.py --data-repo D:/comparison-data --no-push - uv run lamp_station.py --settle 0 --readings 1 # quick smoke test -""" - -import argparse -import json -import os -import re -import subprocess -import sys -import urllib.request -from pathlib import Path - -from hpcs6500 import find_hpcs_port -from lamp_export import average_readings, readings_from_device, write_bundle - -DEFAULT_DATA_REPO = Path(r"C:\dev\buildfor_life_web\apps\web\comparison-data") -CACHE_FILE = Path.home() / ".cache" / "hpcs6500" / "ean-cache.json" -LOOKUP_URL = "https://api.upcitemdb.com/prod/trial/lookup?upc={}" -ID_RE = re.compile(r"^L(\d{4,})$") - -# Advertised values typed from the packaging; keys match the measured -# metrics they are compared against on the site. -RATED_FIELDS = [ - ("Phi_lm", "Rated flux (lm)"), - ("CCT_K", "Rated CCT (K)"), - ("Power_W", "Rated power (W)"), - ("Ra", "Rated CRI (Ra)"), - ("lifetime_h", "Rated lifetime (h)"), - ("W_equiv", "Incandescent equivalent (W)"), -] - - -def ean_normalize(code): - """Return a valid EAN-13 (UPC-A gets a leading zero), or None.""" - code = re.sub(r"\D", "", code) - if len(code) == 12: - code = "0" + code - if len(code) != 13: - return None - digits = [int(c) for c in code] - check = (10 - sum(d * (3 if i % 2 else 1) for i, d in enumerate(digits[:12])) % 10) % 10 - return code if check == digits[12] else None - - -def is_restricted(ean): - """GS1 prefixes 20-29 are retailer-internal, never publicly resolvable.""" - return 20 <= int(ean[:2]) <= 29 - - -def lamp_index(data_repo): - """{id: metrics-dict} for every measured lamp.""" - lamps = {} - for f in sorted((data_repo / "lamps").glob("L*/metrics.json")): - if ID_RE.match(f.parent.name): - try: - lamps[f.parent.name] = json.loads(f.read_text()) - except ValueError: - pass - return lamps - - -def next_lamp_id(data_repo): - used = [int(ID_RE.match(d.name).group(1)) - for d in (data_repo / "lamps").glob("L*") if ID_RE.match(d.name)] - return f"L{max(used, default=0) + 1:04d}" - - -# Canonical spellings for brands; extended at runtime by whatever is already -# in the database and the cache, so the first accepted spelling of a new brand -# becomes its canonical form for every later scan. -BRAND_SEED = [ - "Philips", "OSRAM", "LAMPTAN", "TKL", "ST", "IKEA", "Panasonic", - "Toshiba", "GE", "Sylvania", "Xiaomi", "Opple", "EVE", -] - - -def canonical_brand(name, lamps): - """Map a manufacturer string to its canonical capitalization.""" - name = " ".join(name.split()) - if not name: - return name - brands = {b.lower(): b for b in BRAND_SEED} - for entry in load_cache().values(): - b = entry.get("manufacturer", "") - if b: - brands.setdefault(b.lower(), b) - for m in lamps.values(): - b = m.get("manufacturer", "") - if b: - brands[b.lower()] = b # the database is the strongest source - return brands.get(name.lower(), name) - - -def load_cache(): - try: - return json.loads(CACHE_FILE.read_text()) - except (OSError, ValueError): - return {} - - -def save_cache(cache): - CACHE_FILE.parent.mkdir(parents=True, exist_ok=True) - CACHE_FILE.write_text(json.dumps(cache, indent=2)) - - -def lookup_ean(ean, lamps): - """Best-effort (manufacturer, model, source) for an EAN.""" - for m in lamps.values(): - if m.get("ean") == ean and (m.get("manufacturer") or m.get("model")): - return m.get("manufacturer", ""), m.get("model", ""), f"previous lamp {m['name']}" - - cache = load_cache() - if ean in cache: - return cache[ean]["manufacturer"], cache[ean]["model"], "local cache" - - if is_restricted(ean): - return "", "", "retailer-internal barcode, not resolvable" - - try: - req = urllib.request.Request(LOOKUP_URL.format(ean), - headers={"User-Agent": "hpcs6500-lamp-station"}) - with urllib.request.urlopen(req, timeout=10) as resp: - data = json.loads(resp.read()) - item = (data.get("items") or [{}])[0] - brand, title = item.get("brand", ""), item.get("title", "") - if brand or title: - return brand, title, "upcitemdb.com (verify against packaging)" - except Exception as e: # noqa: BLE001 — lookup is strictly best-effort - print(f" (online lookup failed: {e})") - return "", "", "no match" - - -def prompt(label, default=""): - text = input(f"{label} [{default}]: " if default else f"{label}: ").strip() - return text or default - - -def prompt_rated(previous=None): - """Advertised values from the box; Enter skips a field.""" - previous = previous or {} - print(" Advertised values from the packaging (Enter to skip):") - rated = {} - for key, label in RATED_FIELDS: - default = previous.get(key, "") - raw = prompt(f" {label}", str(default) if default != "" else "") - if not raw: - continue - try: - value = float(raw) - rated[key] = int(value) if value == int(value) else value - except ValueError: - print(f" (not a number, skipped: {raw!r})") - return rated - - -def git(repo, *args, check=True): - return subprocess.run(["git", "-C", str(repo), *args], - check=check, capture_output=True, text=True) - - -def commit_bundle(data_repo, lamp_id, label, existed, push): - git(data_repo, "add", f"lamps/{lamp_id}") - if not git(data_repo, "status", "--porcelain", f"lamps/{lamp_id}").stdout.strip(): - print("No data changes to commit.") - return - verb = "Re-measure" if existed else "Add" - git(data_repo, "commit", "-m", f"{verb} lamp {lamp_id} ({label})") - print(f"Committed to comparison-data: {verb} lamp {lamp_id} ({label})") - if push: - git(data_repo, "push") - print("Pushed.") - - -def measure_one(new_id, ean, lamps, args, data_repo, existing_id=None): - # The run already owns its fresh ID (new_id). Typing an existing ID at - # the scan prompt re-measures that lamp instead (all its identification - # pre-filled, bundle rewritten in the current format); an EAN may also - # redirect to a re-measure when it matches an existing lamp. - lamp_id, previous = new_id, {} - if existing_id: - lamp_id = existing_id - previous = lamps[existing_id] - ean = previous.get("ean", "") - print(f" Re-measuring {lamp_id}" + (f" (EAN {ean})" if ean else "")) - elif ean: - same = {i: m for i, m in lamps.items() if m.get("ean") == ean} - if same: - print(" Lamps already measured with this EAN:") - for i, m in same.items(): - variant = f", {m['variant']}" if m.get("variant") else "" - print(f" {i}: {m.get('manufacturer', '')} {m.get('model', '')}{variant}") - choice = prompt(f"Re-measure one of these (type its ID) or Enter to continue as {new_id}").strip() - if choice: - if choice.upper() not in same: - print(f" Unknown ID {choice!r}, aborting this run.") - return - lamp_id = choice.upper() - previous = same[lamp_id] - print(f" Re-measuring {lamp_id}") - - if previous: - manufacturer, model = previous.get("manufacturer", ""), previous.get("model", "") - elif ean: - manufacturer, model, source = lookup_ean(ean, lamps) - print(f" Lookup: {manufacturer or '?'} / {model or '?'} ({source})") - else: - manufacturer = model = "" - - manufacturer = prompt("Manufacturer", canonical_brand(manufacturer, lamps)) - canon = canonical_brand(manufacturer, lamps) - if canon != manufacturer: - print(f" Using canonical brand name: {canon}") - manufacturer = canon - model = prompt("Model", model) - lamp_type = prompt("Type (led / halogen / cfl / incandescent / ...)", - previous.get("type", "led")).lower().strip() - prev_dim = previous.get("dimmable") - dim_default = "" if prev_dim is None else ("y" if prev_dim else "n") - dim_raw = prompt("Dimmable? (y / n, Enter if unknown)", dim_default).lower() - dimmable = True if dim_raw.startswith("y") else False if dim_raw.startswith("n") else None - variant = prompt("Variant (e.g. daylight / warm white, Enter if none)", - previous.get("variant", "")).lower() - notes = prompt("Notes", previous.get("notes", "retailer-internal barcode, brand unknown" - if ean and is_restricted(ean) and not manufacturer else "")) - rated = prompt_rated(previous.get("rated")) - - if ean and (manufacturer or model): - cache = load_cache() - cache[ean] = {"manufacturer": manufacturer, "model": model} - save_cache(cache) - - input("Insert the lamp, close the sphere, press Enter to start ... ") - - port = args.port or find_hpcs_port() - if not port: - print("ERROR: HPCS 6500 not found. Connect the device or use --port.") - return - psu = {"mode": "ac", "voltage": args.voltage, "frequency": args.frequency, - "current": None, "settle": args.settle, "interval": args.interval, - "enable": True} - readings, supply = readings_from_device(port, args.readings, False, psu) - reading = average_readings(readings) - meta = {"name": lamp_id, "ean": ean or "", "type": lamp_type, "dimmable": dimmable, - "variant": variant, "manufacturer": manufacturer, "model": model, - "notes": notes, "rated": rated} - out_dir = data_repo / "lamps" / lamp_id - tm30 = write_bundle(reading, out_dir, meta, len(readings), supply) - - print(f"\n {reading.get('Phi_lm', 0):.0f} lm {reading.get('eta_lm_W', 0):.1f} lm/W " - f"{reading.get('CCT_K', 0):.0f} K Ra {reading.get('Ra', 0):.1f} " - f"TM-30 Rf {tm30['Rf']:.1f} / Rg {tm30['Rg']:.1f}") - if rated.get("Phi_lm"): - delta = reading.get("Phi_lm", 0) / rated["Phi_lm"] * 100 - 100 - print(f" vs advertised: {delta:+.1f} % flux", end="") - if rated.get("CCT_K"): - print(f", {reading.get('CCT_K', 0) - rated['CCT_K']:+.0f} K CCT", end="") - print() - print() - - label_parts = [x for x in (manufacturer, model) if x] - if variant: - label_parts.append(variant) - if ean: - label_parts.append(f"EAN {ean}") - if not args.no_commit: - commit_bundle(data_repo, lamp_id, ", ".join(label_parts) or "unidentified", - existed=bool(previous), push=not args.no_push) - print(" The lamp publishes automatically (auto-bump deploy); add an .md under") - print(" src/content/comparisons/lamps/ only for photos, buy links, or notes.") - - # Two ID labels on the QL-820NWB: one for the box, one for the lamp. - if not args.no_labels: - if args.printer: - try: - from label_printer import print_labels - print_labels(lamp_id, args.printer, copies=2) - print(f" Printed 2 ID labels for {lamp_id}.") - except Exception as e: # noqa: BLE001 — a printer problem must not lose the run - print(f" Label printing failed ({e}); reprint later with:") - print(f" uv run label_printer.py {lamp_id}") - else: - print(f" (no label printer configured; set HPCS_LABEL_PRINTER or use --printer,") - print(f" reprint later with: uv run label_printer.py {lamp_id})") - - -def main(): - parser = argparse.ArgumentParser(description="Barcode-driven lamp measurement station") - parser.add_argument("--data-repo", default=str(DEFAULT_DATA_REPO), - help="comparison-data checkout (bundles land in lamps//)") - parser.add_argument("--port", help="COM port (auto-detect if omitted)") - parser.add_argument("--readings", type=int, default=5) - parser.add_argument("--voltage", type=float, default=230.0) - parser.add_argument("--frequency", type=float, default=50.0) - parser.add_argument("--settle", type=float, default=60.0, - help="Seconds of stabilization after PSU on (procedure: 60)") - parser.add_argument("--interval", type=float, default=1.0) - parser.add_argument("--no-commit", action="store_true", - help="Write the bundle but skip git entirely") - parser.add_argument("--no-push", action="store_true", - help="Commit locally but do not push") - parser.add_argument("--printer", default=os.environ.get("HPCS_LABEL_PRINTER", ""), - help="QL-820NWB address, e.g. tcp://192.168.1.50 " - "(default: HPCS_LABEL_PRINTER env)") - parser.add_argument("--no-labels", action="store_true", - help="Skip printing the two ID labels after each lamp") - args = parser.parse_args() - - data_repo = Path(args.data_repo) - # In a submodule checkout .git is a file, not a directory; exists() covers both. - if not (data_repo / ".git").exists(): - print(f"ERROR: {data_repo} is not a git checkout of comparison-data.") - sys.exit(1) - - print("Lamp station ready. Every run starts a new lamp ID; the EAN is optional") - print("(scan it, or press Enter to skip). 'q' quits.") - while True: - # A fresh ID opens every run. It only becomes real once a bundle is - # written, so quitting or re-measuring never burns a number. - lamps = lamp_index(data_repo) - new_id = next_lamp_id(data_repo) - print(f"\n--- New lamp {new_id} ---") - try: - code = input("Scan EAN (Enter to skip, L#### re-measures an existing lamp, q quits): ").strip() - except (EOFError, KeyboardInterrupt): - break - if code.lower() in ("q", "quit", "exit"): - break - existing_id = None - ean = "" - if ID_RE.match(code.upper()): - existing_id = code.upper() - if existing_id not in lamps: - print(f" No lamp {existing_id} in the database.") - continue - elif code and code.lower() not in ("n", "none"): - ean = ean_normalize(code) - if not ean: - print(f" Not a valid EAN-13/UPC-A: {code!r} (Enter would skip the EAN)") - continue - try: - measure_one(new_id, ean, lamps, args, data_repo, existing_id=existing_id) - except KeyboardInterrupt: - print("\n Aborted; lamp skipped. (PSU is switched off by the driver.)") - except (subprocess.CalledProcessError, SystemExit) as e: - err = getattr(e, "stderr", "") or e - print(f" ERROR: {err}") - print("Bye.") - - -if __name__ == "__main__": - main() diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 615a096..0000000 --- a/pyproject.toml +++ /dev/null @@ -1,13 +0,0 @@ -[project] -name = "hpcs6500" -version = "0.1.0" -description = "Open-source driver and CLI for the HPCS 6500 spectrophotometer / integrating sphere" -readme = "README.md" -requires-python = ">=3.11" -dependencies = [ - "pyserial>=3.5", - "colour-science>=0.4.4", - "qrcode>=8.2", - "pillow>=12.3.0", - "brother-ql-next>=0.12.0", -] diff --git a/spectrometer.py b/spectrometer.py deleted file mode 100644 index 540dce3..0000000 --- a/spectrometer.py +++ /dev/null @@ -1,42 +0,0 @@ -"""Thin wrapper for external tools — outputs JSON to stdout.""" - -import argparse -import json -import sys - -from hpcs6500 import HPCS6500, find_hpcs_port - - -def measure(): - port = find_hpcs_port() - if not port: - print('{"error": "HPCS 6500 not found"}', file=sys.stderr) - sys.exit(1) - - dev = HPCS6500(port) - try: - dev.identify() - reading = dev.take_single_reading() - finally: - dev.close() - - if reading is None: - print('{"error": "measurement failed"}', file=sys.stderr) - sys.exit(1) - - result = { - "lumen": round(reading["Phi_lm"], 1), - "cct": round(reading["CCT_K"]), - } - print(json.dumps(result)) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description="HPCS 6500 JSON interface") - parser.add_argument("--measure", action="store_true", help="Take a measurement and output JSON") - args = parser.parse_args() - - if args.measure: - measure() - else: - parser.print_help() diff --git a/src/cli/capture.rs b/src/cli/capture.rs new file mode 100644 index 0000000..6c5a69b --- /dev/null +++ b/src/cli/capture.rs @@ -0,0 +1,297 @@ +//! Reverse-engineering tools: capture the vendor software's USB traffic +//! with USBPcap, and dump a capture (timeline, TX/RX byte streams). + +use hpcs6500::pcap; +use std::path::{Path, PathBuf}; +use std::process::{Child, Command, Stdio}; +use std::sync::Arc; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::time::Duration; + +fn hex_spaced(b: &[u8]) -> String { + b.iter() + .map(|x| format!("{x:02x}")) + .collect::>() + .join(" ") +} + +fn ascii(b: &[u8]) -> String { + b.iter() + .map(|&c| { + if (32..127).contains(&c) { + c as char + } else { + '.' + } + }) + .collect() +} + +/// Timeline of the bulk transfers, the TX/RX streams as .bin files and a +/// quick look at both streams. +pub fn dump(path: &Path, limit: usize, write_bin: bool) -> i32 { + let data = match std::fs::read(path) { + Ok(d) => d, + Err(e) => { + eprintln!("ERROR: {}: {e}", path.display()); + return 1; + } + }; + let (hdr, packets) = match pcap::packets(&data) { + Ok(x) => x, + Err(e) => { + eprintln!("ERROR: {e}"); + return 1; + } + }; + println!( + "PCAP: v{}.{}, snaplen={}, link_type={}", + hdr.version.0, hdr.version.1, hdr.snaplen, hdr.link_type + ); + if hdr.link_type != 249 { + println!( + "Warning: expected link_type 249 (USBPcap), got {}", + hdr.link_type + ); + } + let total = packets.last().map(|p| p.num).unwrap_or(0); + let bulk: Vec<&pcap::Packet> = packets.iter().filter(|p| p.is_bulk()).collect(); + let is_rx = |p: &pcap::Packet| p.info & 1 == 1 || p.endpoint & 0x80 != 0; + let (mut tx, mut rx) = (vec![], vec![]); + for p in &bulk { + if is_rx(p) { + rx.extend_from_slice(&p.data) + } else { + tx.extend_from_slice(&p.data) + } + } + println!( + "\nParsed {total} total packets, {} bulk transfers with data", + bulk.len() + ); + println!("TX (host -> device): {} bytes", tx.len()); + println!("RX (device -> host): {} bytes", rx.len()); + if bulk.is_empty() { + println!("\nNo bulk transfer data found."); + return 0; + } + + println!("\n{}\nTRAFFIC TIMELINE\n{}", "=".repeat(80), "=".repeat(80)); + let first = bulk[0].ts; + for p in bulk.iter().take(limit) { + let (colour, label) = if is_rx(p) { + ("\x1b[92m", "DEV->PC") + } else { + ("\x1b[93m", "PC->DEV") + }; + let mut h = hex_spaced(&p.data); + if h.len() > 90 { + h = format!("{} ... (+{}B)", &h[..90], p.data.len().saturating_sub(30)); + } + println!( + "{colour}[{:8.4}] {label} EP{:02X} ({:4}B): {h}\x1b[0m", + p.ts - first, + p.endpoint, + p.data.len() + ); + let printable = p.data.iter().filter(|c| (32..127).contains(*c)).count(); + if printable as f64 > p.data.len() as f64 * 0.4 { + println!( + " ASCII: {:?}", + ascii(&p.data[..p.data.len().min(40)]) + ); + } + } + if bulk.len() > limit { + println!(" ... ({} more packets)", bulk.len() - limit); + } + + if write_bin { + let stem = path.with_extension(""); + for (suffix, stream) in [("_TX.bin", &tx), ("_RX.bin", &rx)] { + if stream.is_empty() { + continue; + } + let out = PathBuf::from(format!("{}{suffix}", stem.display())); + match std::fs::write(&out, stream) { + Ok(_) => println!("\n{} data saved to: {}", &suffix[1..3], out.display()), + Err(e) => println!("\nERROR writing {}: {e}", out.display()), + } + } + } + + println!("\n{}\nQUICK ANALYSIS\n{}", "=".repeat(80), "=".repeat(80)); + for (label, s) in [("TX (PC -> Device)", &tx), ("RX (Device -> PC)", &rx)] { + if s.is_empty() { + continue; + } + println!("\n--- {label}: {} bytes ---", s.len()); + let printable = s + .iter() + .filter(|&&c| (32..127).contains(&c) || c == 0x0A || c == 0x0D) + .count(); + println!( + " Printable ratio: {:.0}%", + printable as f64 / s.len() as f64 * 100.0 + ); + let sample = &s[..s.len().min(200)]; + println!(" HEX: {}", hex_spaced(sample)); + println!(" ASCII: {}", ascii(sample)); + if s.len() > 10 { + for (name, d) in [ + ("\\r\\n", &b"\r\n"[..]), + ("\\n", b"\n"), + ("0xFF", b"\xff"), + ("0xAA", b"\xaa"), + ] { + let count = count_non_overlapping(s, d); + if count > 2 { + println!(" Delimiter {name}: appears {count} times"); + } + } + } + } + 0 +} + +fn count_non_overlapping(hay: &[u8], needle: &[u8]) -> usize { + let (mut i, mut n) = (0, 0); + while i + needle.len() <= hay.len() { + if &hay[i..i + needle.len()] == needle { + n += 1; + i += needle.len(); + } else { + i += 1; + } + } + n +} + +/// Start USBPcapCMD on every root hub at once (the instrument's hub is not +/// known in advance), wait for Ctrl+C, keep the largest capture and dump it. +pub fn capture(address: u32, out_dir: &Path, usbpcap: &Path) -> i32 { + if !cfg!(windows) { + eprintln!( + "ERROR: capturing needs USBPcap on Windows; use Wireshark/usbmon elsewhere and `hpcs6500 dump`." + ); + return 1; + } + if !usbpcap.exists() { + eprintln!( + "ERROR: {} not found. Install USBPcap (and reboot), then run as administrator.", + usbpcap.display() + ); + return 1; + } + if let Err(e) = std::fs::create_dir_all(out_dir) { + eprintln!("ERROR: {}: {e}", out_dir.display()); + return 1; + } + println!("HPCS6500 USB Traffic Capture\n{}", "=".repeat(60)); + println!("Device address: {address}\n"); + let stamp = chrono::Local::now().format("%Y%m%d_%H%M%S"); + let mut procs: Vec<(Child, String, PathBuf)> = vec![]; + for i in 1..=10 { + let device = format!(r"\\.\USBPcap{i}"); + let file = out_dir.join(format!("usb_capture_{stamp}_hub{i}.pcap")); + let child = Command::new(usbpcap) + .args(["-d", &device, "-o"]) + .arg(&file) + .args([ + "-A", + "--devices", + &address.to_string(), + "-s", + "65535", + "-b", + "1048576", + ]) + .stdout(Stdio::null()) + .stderr(Stdio::piped()) + .spawn(); + match child { + Ok(c) => { + println!("Starting capture on {device} -> {}", file.display()); + procs.push((c, device, file)); + } + Err(e) => println!(" {device}: {e}"), + } + } + if procs.is_empty() { + println!( + "ERROR: no USBPcap capture could be started (run as ADMINISTRATOR, reboot after installing USBPcap)." + ); + return 1; + } + println!("\nCapturing on ALL hubs simultaneously."); + println!(">>> Now use the vendor software - take a measurement"); + println!(">>> Press Ctrl+C when done\n{}", "-".repeat(60)); + + let stop = Arc::new(AtomicBool::new(false)); + { + let stop = stop.clone(); + let _ = ctrlc::set_handler(move || stop.store(true, Ordering::SeqCst)); + } + loop { + if stop.load(Ordering::SeqCst) { + println!("\n\nStopping captures..."); + break; + } + if procs + .iter_mut() + .all(|(c, _, _)| matches!(c.try_wait(), Ok(Some(_)))) + { + println!("\nAll capture processes have exited."); + for (c, device, _) in procs.iter_mut() { + let mut err = String::new(); + if let Some(mut s) = c.stderr.take() { + let _ = std::io::Read::read_to_string(&mut s, &mut err); + } + let code = c.try_wait().ok().flatten().and_then(|s| s.code()); + println!( + " {device}: exit code {code:?}{}", + if err.trim().is_empty() { + String::new() + } else { + format!(" - {}", err.trim()) + } + ); + } + break; + } + std::thread::sleep(Duration::from_millis(500)); + } + for (c, _, _) in procs.iter_mut() { + let _ = c.kill(); + let _ = c.wait(); + } + + println!(); + let mut best: Option<(PathBuf, u64)> = None; + for (_, device, file) in &procs { + match std::fs::metadata(file) { + Ok(m) => { + println!("{device} -> {}: {} bytes", file.display(), m.len()); + if best.as_ref().is_none_or(|(_, s)| m.len() > *s) { + best = Some((file.clone(), m.len())); + } + } + Err(_) => println!("{device} -> no file created"), + } + } + match best { + Some((file, size)) if size > 24 => { + println!( + "\nBest capture: {} ({size} bytes)\n\nParsing capture...\n", + file.display() + ); + dump(&file, 100, true) + } + _ => { + println!( + "\nNo USB data captured from any hub.\nMake sure you're running as ADMINISTRATOR." + ); + 1 + } + } +} diff --git a/src/cli/main.rs b/src/cli/main.rs new file mode 100644 index 0000000..d7a8a54 --- /dev/null +++ b/src/cli/main.rs @@ -0,0 +1,427 @@ +//! `hpcs6500`: command line tool for the HPCS 6500. +//! +//! The flags are those of the former Python tool (`hpcs6500.py`), so +//! `uv run hpcs6500.py --continuous --csv out.csv` becomes +//! `hpcs6500 --continuous --csv out.csv`. + +mod capture; + +use clap::{Parser, Subcommand}; +use hpcs6500::format::{csv_header, csv_row, format_quick, format_reading, pcap_report}; +use hpcs6500::sim::Simulator; +use hpcs6500::{Error, Hpcs6500, Mode, Reading, Transport, pcap}; +use std::fs::File; +use std::io::Write; +use std::path::PathBuf; +use std::sync::Arc; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::time::Duration; + +#[derive(Parser)] +#[command( + name = "hpcs6500", + version, + about = "HPCS 6500 Spectrophotometer Reader" +)] +struct Cli { + #[command(subcommand)] + command: Option, + + /// COM port (auto-detect if not specified) + #[arg(long)] + port: Option, + /// Continuous reading mode + #[arg(long)] + continuous: bool, + /// With --continuous: stop after this many readings + #[arg(long, value_name = "N")] + count: Option, + /// Save readings to CSV file + #[arg(long, value_name = "FILE")] + csv: Option, + /// Show full spectrum data + #[arg(long)] + spectrum: bool, + /// Passive mode: read data without controlling instrument + #[arg(long)] + passive: bool, + /// Quick test mode: only report lumen and CCT + #[arg(long)] + quick: bool, + /// Show harmonics data (voltage/current THD and per-harmonic) + #[arg(long)] + harmonics: bool, + /// Parse a pcap capture file instead + #[arg(long, value_name = "PCAP")] + parse: Option, + /// Print each reading as one JSON line on stdout (messages go to stderr) + #[arg(long)] + json: bool, + /// Talk to a simulated instrument instead of the serial port; replays + /// the readings of a USB capture, or a built-in sample without one + #[arg(long, value_name = "PCAP", num_args = 0..=1, default_missing_value = "")] + simulate: Option, + + /// Set output mode + #[arg(long, help_heading = "Power supply")] + mode: Option, + /// Set output voltage (V) + #[arg(long, help_heading = "Power supply")] + voltage: Option, + /// Set AC frequency (Hz) + #[arg(long, help_heading = "Power supply")] + frequency: Option, + /// Set DC current limit (A) + #[arg(long, help_heading = "Power supply")] + current: Option, + /// Set integration time (ms), 0=auto + #[arg(long, help_heading = "Power supply")] + integration: Option, + /// Turn PSU output on + #[arg(long, help_heading = "Power supply")] + psu_on: bool, + /// Turn PSU output off + #[arg(long, help_heading = "Power supply")] + psu_off: bool, + /// Don't auto-control PSU during measurements + #[arg(long, help_heading = "Power supply")] + no_psu: bool, + /// Read power supply settings + #[arg(long, help_heading = "Power supply")] + psu_status: bool, +} + +#[derive(Subcommand)] +enum Command { + /// List serial ports (the HPCS 6500 is marked) + Ports, + /// Show the USB traffic in a capture and save the TX/RX byte streams + Dump { + pcap: PathBuf, + /// Packets to show in the timeline + #[arg(long, default_value_t = 100)] + limit: usize, + /// Do not write _TX.bin / _RX.bin + #[arg(long)] + no_bin: bool, + }, + /// Capture the USB traffic of the vendor software with USBPcap (Windows, run as administrator) + Capture { + /// USB device address of the instrument on its hub + #[arg(long, default_value_t = 4)] + address: u32, + #[arg(long, default_value = "captures")] + out_dir: PathBuf, + #[arg(long, default_value = r"C:\Program Files\USBPcap\USBPcapCMD.exe")] + usbpcap: PathBuf, + }, +} + +/// Human messages: stdout normally, stderr with --json. +macro_rules! say { + ($json:expr, $($t:tt)*) => { + if $json { eprintln!($($t)*) } else { println!($($t)*) } + }; +} + +fn ok(r: &hpcs6500::Result<()>) -> &'static str { + if r.is_ok() { "OK" } else { "FAILED" } +} + +fn main() { + let cli = Cli::parse(); + let code = match &cli.command { + Some(Command::Ports) => ports(), + Some(Command::Dump { + pcap, + limit, + no_bin, + }) => capture::dump(pcap, *limit, !*no_bin), + Some(Command::Capture { + address, + out_dir, + usbpcap, + }) => capture::capture(*address, out_dir, usbpcap), + None => run(cli), + }; + std::process::exit(code); +} + +fn ports() -> i32 { + for p in hpcs6500::list_ports() { + println!( + " {}: {} [{}]{}", + p.name, + p.description, + p.hwid, + if p.is_hpcs { " <- HPCS 6500" } else { "" } + ); + } + 0 +} + +fn run(mut cli: Cli) -> i32 { + // --harmonics implies --spectrum for the detailed display + if cli.harmonics { + cli.spectrum = true; + } + + if let Some(path) = &cli.parse { + return match pcap::read_messages(path) { + Ok(msgs) if cli.json => { + for r in pcap::readings(&msgs) { + println!("{}", serde_json::to_string(&r).expect("json")); + } + 0 + } + Ok(msgs) => { + print!("{}", pcap_report(&msgs, cli.quick, cli.spectrum)); + 0 + } + Err(e) => { + eprintln!("ERROR: {e}"); + 1 + } + }; + } + + match &cli.simulate { + Some(src) => { + let sim = if src.is_empty() { + Ok(Simulator::sample()) + } else { + Simulator::from_pcap(src) + }; + match sim { + Ok(s) => { + let label = if src.is_empty() { + "simulator (built-in sample)".to_string() + } else { + format!("simulator ({src})") + }; + session(&cli, Hpcs6500::with_transport(s, label)) + } + Err(e) => { + eprintln!("ERROR: {e}"); + 1 + } + } + } + None => { + let Some(port) = cli.port.clone().or_else(hpcs6500::find_port) else { + println!("ERROR: HPCS 6500 not found. Connect the device or specify --port."); + println!("\nAvailable ports:"); + ports(); + return 1; + }; + match Hpcs6500::open(&port) { + Ok(dev) => session(&cli, dev), + Err(e) => { + eprintln!("ERROR: cannot open {port}: {e}"); + 1 + } + } + } + } +} + +fn session(cli: &Cli, mut dev: Hpcs6500) -> i32 { + let j = cli.json; + let stop = Arc::new(AtomicBool::new(false)); + { + let stop = stop.clone(); + let _ = ctrlc::set_handler(move || stop.store(true, Ordering::SeqCst)); + } + dev.set_cancel_flag(stop.clone()); + + say!(j, "HPCS 6500 Spectrophotometer Reader"); + say!(j, "Port: {}", dev.port()); + say!(j, "{}", "=".repeat(60)); + + match dev.identify() { + Ok(name) => say!(j, "Device: {name}"), + Err(_) => say!(j, "Warning: no identify response (device may be busy)"), + } + + let has_psu_cmd = cli.mode.is_some() + || cli.voltage.is_some() + || cli.frequency.is_some() + || cli.current.is_some() + || cli.integration.is_some() + || cli.psu_status + || cli.psu_on + || cli.psu_off; + + if cli.psu_status { + match dev.read_psu_settings() { + Ok(s) => { + say!(j, "\nPower Supply Settings:"); + say!(j, " Mode: {}", s.mode); + say!(j, " AC Voltage: {:.0} V", s.ac_voltage); + say!(j, " AC Frequency: {:.0} Hz", s.ac_frequency); + say!(j, " DC Voltage: {:.1} V", s.dc_voltage); + say!(j, " DC Current: {:.1} A", s.dc_current); + } + Err(_) => say!(j, "Failed to read PSU settings"), + } + if !cli.continuous && cli.voltage.is_none() && cli.mode.is_none() { + return 0; + } + } + + if let Some(m) = cli.mode { + let r = dev.set_mode(m); + say!(j, "Set mode to {m}: {}", ok(&r)); + } + if let Some(v) = cli.voltage { + let mode = cli.mode.unwrap_or(Mode::Ac); + let r = if mode == Mode::Ac { + dev.set_ac_voltage(v as f32) + } else { + dev.set_dc_voltage(v as f32) + }; + say!( + j, + "Set {mode} voltage to {} V: {}", + hpcs6500::pyfmt::repr(v), + ok(&r) + ); + } + if let Some(f) = cli.frequency { + let r = dev.set_ac_frequency(f as f32); + say!( + j, + "Set AC frequency to {} Hz: {}", + hpcs6500::pyfmt::repr(f), + ok(&r) + ); + } + if let Some(a) = cli.current { + let r = dev.set_dc_current(a as f32); + say!( + j, + "Set DC current limit to {} A: {}", + hpcs6500::pyfmt::repr(a), + ok(&r) + ); + } + if let Some(ms) = cli.integration { + let r = dev.set_integration_time(ms); + say!( + j, + "Set integration time to {} ms: {}", + hpcs6500::pyfmt::repr(ms), + ok(&r) + ); + } + if cli.psu_on { + let r = dev.psu_on(); + say!(j, "PSU output ON: {}", ok(&r)); + } + if cli.psu_off { + let r = dev.psu_off(); + say!(j, "PSU output OFF: {}", ok(&r)); + } + + // only supply commands, no measurement requested + if has_psu_cmd && !cli.continuous && !cli.passive { + return 0; + } + + let mut csv = None; + if let Some(path) = &cli.csv { + match File::create(path) { + Ok(mut f) => { + let _ = f.write_all(csv_header().as_bytes()); + say!(j, "Saving to: {}", path.display()); + csv = Some(f); + } + Err(e) => { + eprintln!("ERROR: {}: {e}", path.display()); + return 1; + } + } + } + + // the supply is only controlled in continuous mode + let use_psu = cli.continuous && !cli.no_psu && !cli.passive; + let mut code = 0; + if use_psu { + let _ = dev.psu_on(); + std::thread::sleep(Duration::from_millis(200)); + } + + let mut n = 0; + loop { + if stop.load(Ordering::SeqCst) { + say!(j, "\nStopped."); + break; + } + n += 1; + if !cli.quick { + say!(j, "\n{}", "=".repeat(60)); + say!( + j, + "Reading {n} ({})", + chrono::Local::now().format("%H:%M:%S") + ); + say!(j, "{}", "=".repeat(60)); + } + let result: hpcs6500::Result = if cli.passive { + dev.read_current() + } else if cli.continuous { + dev.take_reading(false) + } else { + dev.take_single_reading() + }; + let r = match result { + Ok(r) => r, + Err(Error::Cancelled) => { + say!(j, "\nStopped."); + break; + } + Err(e) => { + say!(j, "Failed to get reading ({e})"); + if !cli.continuous { + code = 1; + break; + } + let _ = dev.pause(Duration::from_secs(1)); + continue; + } + }; + if j { + println!("{}", serde_json::to_string(&r).expect("json")); + } else if cli.quick { + println!("{}", format_quick(&r, Some(n))); + } else { + println!("{}", format_reading(&r, cli.spectrum)); + } + if let Some(f) = csv.as_mut() { + let now = chrono::Local::now().naive_local(); + let ts = if now.and_utc().timestamp_subsec_micros() == 0 { + now.format("%Y-%m-%dT%H:%M:%S").to_string() + } else { + now.format("%Y-%m-%dT%H:%M:%S%.6f").to_string() + }; + let _ = f.write_all(csv_row(&ts, &r).as_bytes()); + let _ = f.flush(); + } + if !cli.continuous || cli.count.is_some_and(|c| n >= c) { + break; + } + if dev.pause(Duration::from_millis(500)).is_err() { + say!(j, "\nStopped."); + break; + } + } + + if use_psu { + let _ = dev.psu_off(); + } + let _ = dev.reset(); + if let Some(path) = &cli.csv { + say!(j, "Data saved to: {}", path.display()); + } + code +} diff --git a/src/device.rs b/src/device.rs new file mode 100644 index 0000000..f22f3a8 --- /dev/null +++ b/src/device.rs @@ -0,0 +1,446 @@ +//! The instrument over a byte transport (the serial port, or the simulator). + +use crate::error::{Error, Result, hex}; +use crate::protocol::{self, Mode, PollState, PsuSettings, SYNC, cmd}; +use crate::reading::Reading; +use std::io::{self, Read, Write}; +use std::sync::Arc; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::time::{Duration, Instant}; + +/// A byte pipe to the instrument. +pub trait Transport: Send { + /// Write a whole frame. + fn write_all(&mut self, data: &[u8]) -> io::Result<()>; + /// Read what is available, waiting up to `timeout` for the first byte. + /// Returns `Ok(0)` when nothing arrived in time. + fn read_some(&mut self, buf: &mut [u8], timeout: Duration) -> io::Result; + /// Drop unread input. + fn clear_input(&mut self) -> io::Result<()>; +} + +/// The USB virtual COM port. +pub struct SerialTransport { + port: Box, + timeout: Duration, +} + +impl SerialTransport { + pub fn open(name: &str) -> Result { + let timeout = Duration::from_millis(100); + let mut port = serialport::new(name, protocol::BAUD) + .data_bits(serialport::DataBits::Eight) + .parity(serialport::Parity::None) + .stop_bits(serialport::StopBits::One) + .flow_control(serialport::FlowControl::None) + .timeout(timeout) + .open()?; + // pyserial raises DTR and RTS on open; the vendor software does too + let _ = port.write_data_terminal_ready(true); + let _ = port.write_request_to_send(true); + Ok(SerialTransport { port, timeout }) + } +} + +impl Transport for SerialTransport { + fn write_all(&mut self, data: &[u8]) -> io::Result<()> { + self.port.write_all(data)?; + self.port.flush() + } + + fn read_some(&mut self, buf: &mut [u8], timeout: Duration) -> io::Result { + if timeout != self.timeout { + self.port.set_timeout(timeout).map_err(io::Error::other)?; + self.timeout = timeout; + } + match self.port.read(buf) { + Ok(n) => Ok(n), + Err(e) if e.kind() == io::ErrorKind::TimedOut => Ok(0), + Err(e) => Err(e), + } + } + + fn clear_input(&mut self) -> io::Result<()> { + self.port + .clear(serialport::ClearBuffer::Input) + .map_err(io::Error::other) + } +} + +/// A serial port as listed by [`list_ports`]. +#[derive(Debug, Clone)] +pub struct PortInfo { + pub name: String, + pub description: String, + /// `USB VID:PID=0483:5741 SER=...` or the port type. + pub hwid: String, + pub is_hpcs: bool, +} + +pub fn list_ports() -> Vec { + let Ok(ports) = serialport::available_ports() else { + return vec![]; + }; + ports + .into_iter() + .map(|p| match p.port_type { + serialport::SerialPortType::UsbPort(u) => PortInfo { + description: u + .product + .clone() + .or(u.manufacturer.clone()) + .unwrap_or_else(|| "USB serial".into()), + hwid: format!( + "USB VID:PID={:04X}:{:04X}{}", + u.vid, + u.pid, + u.serial_number + .as_ref() + .map(|s| format!(" SER={s}")) + .unwrap_or_default() + ), + is_hpcs: u.vid == protocol::USB_VID && u.pid == protocol::USB_PID, + name: p.port_name, + }, + t => PortInfo { + description: "n/a".into(), + hwid: format!("{t:?}"), + is_hpcs: false, + name: p.port_name, + }, + }) + .collect() +} + +/// The first serial port with the instrument's USB IDs. +pub fn find_port() -> Option { + list_ports().into_iter().find(|p| p.is_hpcs).map(|p| p.name) +} + +const ACK_TIMEOUT: Duration = Duration::from_secs(2); +const HEADER_TIMEOUT: Duration = Duration::from_secs(3); +const BLOCK_TIMEOUT: Duration = Duration::from_secs(5); +/// How long a reading may take before giving up. +pub const DATA_TIMEOUT: Duration = Duration::from_secs(30); + +/// The HPCS 6500. +/// +/// Every command clears pending input, sends one frame and reads the +/// answer. Methods return `Err` where the Python driver returned +/// `None`/`False`. +pub struct Hpcs6500 { + io: T, + port: String, + cancel: Option>, +} + +impl Hpcs6500 { + /// Open the instrument on a serial port (e.g. `COM42`, `/dev/ttyACM0`). + pub fn open(port: &str) -> Result { + Ok(Hpcs6500 { + io: SerialTransport::open(port)?, + port: port.to_string(), + cancel: None, + }) + } +} + +impl Hpcs6500 { + /// Use any transport, e.g. a [`crate::sim::Simulator`]. + pub fn with_transport(io: T, port: impl Into) -> Self { + Hpcs6500 { + io, + port: port.into(), + cancel: None, + } + } + + pub fn port(&self) -> &str { + &self.port + } + pub fn transport(&self) -> &T { + &self.io + } + pub fn transport_mut(&mut self) -> &mut T { + &mut self.io + } + pub fn into_transport(self) -> T { + self.io + } + + /// Long waits (data polling, [`Hpcs6500::pause`]) end with + /// [`Error::Cancelled`] when this flag goes up, e.g. from a Ctrl+C handler. + pub fn set_cancel_flag(&mut self, flag: Arc) { + self.cancel = Some(flag); + } + + fn cancelled(&self) -> bool { + self.cancel + .as_ref() + .is_some_and(|f| f.load(Ordering::SeqCst)) + } + + /// Sleep, but return [`Error::Cancelled`] early when the cancel flag goes up. + pub fn pause(&self, d: Duration) -> Result<()> { + let end = Instant::now() + d; + loop { + if self.cancelled() { + return Err(Error::Cancelled); + } + let now = Instant::now(); + if now >= end { + return Ok(()); + } + std::thread::sleep((end - now).min(Duration::from_millis(50))); + } + } + + // ---- framing ---- + + fn send(&mut self, frame: &[u8]) -> Result<()> { + self.io.clear_input()?; + self.io.write_all(frame)?; + Ok(()) + } + + /// Up to `n` bytes, fewer if the deadline passes. + fn recv(&mut self, n: usize, timeout: Duration) -> Result> { + let deadline = Instant::now() + timeout; + let mut buf = vec![0u8; n]; + let mut got = 0; + while got < n { + let now = Instant::now(); + if now >= deadline { + break; + } + got += self.io.read_some( + &mut buf[got..], + (deadline - now).min(Duration::from_millis(100)), + )?; + } + buf.truncate(got); + Ok(buf) + } + + /// Send a write command and expect the `8C ` acknowledge. + fn command(&mut self, frame: &[u8]) -> Result<()> { + self.send(frame)?; + let cmd = frame[1]; + let r = self.recv(2, ACK_TIMEOUT)?; + if r == [SYNC, cmd] { + Ok(()) + } else { + Err(Error::NoAck { cmd, got: hex(&r) }) + } + } + + /// Send a read command, check the header, return the whole response. + fn query(&mut self, cmd: u8, len: usize, timeout: Duration) -> Result> { + self.send(&protocol::frame(cmd, &[]))?; + let r = self.recv(len, timeout)?; + if r.len() < 2 || r[0] != SYNC || r[1] != cmd { + return Err(Error::BadResponse { cmd, got: hex(&r) }); + } + if r.len() < len { + return Err(Error::Short { + what: "response", + got: r.len(), + want: len, + }); + } + Ok(r) + } + + fn read_block(&mut self, cmd: u8, len: usize, what: &'static str) -> Result> { + self.send(&protocol::frame(cmd, &[]))?; + let hdr = self.recv(4, HEADER_TIMEOUT)?; + if hdr.len() < 4 || hdr[0] != SYNC || hdr[1] != cmd { + return Err(Error::BadResponse { + cmd, + got: hex(&hdr), + }); + } + let payload = self.recv(len, BLOCK_TIMEOUT)?; + if payload.len() < len { + return Err(Error::Short { + what, + got: payload.len(), + want: len, + }); + } + Ok(payload) + } + + // ---- commands ---- + + /// `8C 00`: the device name, e.g. "HPCS6500". + pub fn identify(&mut self) -> Result { + let r = self.query(cmd::IDENTIFY, 16, ACK_TIMEOUT)?; + let name: String = r[2..10] + .iter() + .map(|&b| if b < 0x80 { b as char } else { '\u{FFFD}' }) + .collect(); + Ok(name.trim_end_matches('\0').to_string()) + } + + /// `8C 13`: the raw 3904-byte measurement block. + pub fn read_measurement_block(&mut self) -> Result> { + self.read_block( + cmd::READ_MEASUREMENT, + protocol::MEASUREMENT_LEN, + "measurement block", + ) + } + + /// `8C 77`: the raw 1584-byte electrical / harmonics block. + pub fn read_electrical_block(&mut self) -> Result> { + self.read_block( + cmd::READ_ELECTRICAL, + protocol::ELECTRICAL_LEN, + "electrical block", + ) + } + + /// `8C 03`: is a reading ready? + pub fn poll_state(&mut self) -> Result { + let r = self.query(cmd::POLL_STATE, 9, ACK_TIMEOUT)?; + Ok(PollState { + data_available: r[2] == 1, + state: r[5], + }) + } + + /// `8C 2B` sub 00 + sub 01: the vendor's single-test configuration. + /// With `auto_psu` the instrument switches its supply on and off around the test. + pub fn send_test_config(&mut self, auto_psu: bool) -> Result<()> { + for f in protocol::test_config_frames(auto_psu) { + self.command(&f)?; + } + Ok(()) + } + + /// `8C 0E 01`: start continuous measuring. + pub fn start_measurement(&mut self) -> Result<()> { + self.command(&protocol::frame(cmd::START, &[protocol::START_CONTINUOUS])) + } + + /// `8C 0E 02`: stop measuring; on an idle instrument this triggers one reading. + pub fn stop_measurement(&mut self) -> Result<()> { + self.command(&protocol::frame(cmd::START, &[protocol::STOP_OR_SINGLE])) + } + + /// `8C 25`. + pub fn reset(&mut self) -> Result<()> { + self.command(&protocol::frame(cmd::RESET, &[])) + } + + /// `8C 72 00`: supply output on. + pub fn psu_on(&mut self) -> Result<()> { + self.command(&protocol::frame(cmd::PSU_OUTPUT, &[0x00])) + } + + /// `8C 72 01`: supply output off. + pub fn psu_off(&mut self) -> Result<()> { + self.command(&protocol::frame(cmd::PSU_OUTPUT, &[0x01])) + } + + /// `8C 7A`: AC or DC output. + pub fn set_mode(&mut self, mode: Mode) -> Result<()> { + self.command(&protocol::frame(cmd::SET_MODE, &[mode.byte()])) + } + + /// `8C 78 00`: AC voltage, 100-240 V. + pub fn set_ac_voltage(&mut self, volts: f32) -> Result<()> { + self.command(&protocol::frame_f32(cmd::SET_AC, 0x00, volts)) + } + + /// `8C 78 01`: AC frequency, 50 or 60 Hz. + pub fn set_ac_frequency(&mut self, hz: f32) -> Result<()> { + self.command(&protocol::frame_f32(cmd::SET_AC, 0x01, hz)) + } + + /// `8C 73 01`: DC voltage, 1-60 V. + pub fn set_dc_voltage(&mut self, volts: f32) -> Result<()> { + self.command(&protocol::frame_f32(cmd::SET_DC, 0x01, volts)) + } + + /// `8C 73 00`: DC current limit, 0-5 A. + pub fn set_dc_current(&mut self, amps: f32) -> Result<()> { + self.command(&protocol::frame_f32(cmd::SET_DC, 0x00, amps)) + } + + /// `8C 01`: integration time in milliseconds, 0 = automatic. + pub fn set_integration_time(&mut self, ms: f64) -> Result<()> { + let us = (ms * 1000.0) as u32; + self.command(&protocol::frame(cmd::INTEGRATION_TIME, &us.to_le_bytes())) + } + + /// `8C 79`: the supply settings. + pub fn read_psu_settings(&mut self) -> Result { + let r = self.query(cmd::READ_PSU, PsuSettings::RESPONSE_LEN, ACK_TIMEOUT)?; + PsuSettings::parse(&r[2..]).ok_or(Error::Short { + what: "PSU settings", + got: r.len(), + want: 20, + }) + } + + /// Poll every 100 ms until a reading is ready. + pub fn wait_for_data(&mut self, timeout: Duration) -> Result<()> { + let deadline = Instant::now() + timeout; + while Instant::now() < deadline { + match self.poll_state() { + Ok(s) if s.data_available => return Ok(()), + Ok(_) | Err(Error::BadResponse { .. } | Error::Short { .. }) => {} + Err(e) => return Err(e), + } + self.pause(Duration::from_millis(100))?; + } + Err(Error::Timeout) + } + + /// Read both blocks; the electrical block is optional. + fn read_reading(&mut self) -> Result { + let meas = self.read_measurement_block()?; + let elec = self.read_electrical_block().ok(); + Ok(Reading::parse(&meas, elec.as_deref()).expect("full measurement block")) + } + + /// One reading in continuous mode: start, wait, read, stop. With `psu` + /// the supply is switched on first and off afterwards, also on errors. + pub fn take_reading(&mut self, psu: bool) -> Result { + if psu { + self.psu_on()?; + std::thread::sleep(Duration::from_millis(200)); + } + let r = (|| { + self.start_measurement()?; + let r = self + .wait_for_data(DATA_TIMEOUT) + .and_then(|_| self.read_reading()); + let _ = self.stop_measurement(); + r + })(); + if psu { + let _ = self.psu_off(); + } + r + } + + /// One reading like the vendor's single test: `8C 0E 02` triggers it, + /// poll, read both blocks, then reset. The supply is not touched (call + /// [`Hpcs6500::send_test_config`] first to match the vendor flow exactly). + pub fn take_single_reading(&mut self) -> Result { + let _ = self.stop_measurement(); + self.wait_for_data(DATA_TIMEOUT)?; + let r = self.read_reading()?; + let _ = self.reset(); + Ok(r) + } + + /// Read the latest data without starting or stopping anything (while the + /// vendor software drives the instrument). + pub fn read_current(&mut self) -> Result { + self.read_reading() + } +} diff --git a/src/error.rs b/src/error.rs new file mode 100644 index 0000000..52a3233 --- /dev/null +++ b/src/error.rs @@ -0,0 +1,52 @@ +use std::fmt::Write; + +/// Everything that can go wrong talking to the instrument. +#[derive(Debug, thiserror::Error)] +pub enum Error { + #[error("serial port: {0}")] + Serial(#[from] serialport::Error), + #[error("I/O: {0}")] + Io(#[from] std::io::Error), + /// A write command was not acknowledged with `8C `. + #[error("no acknowledge for command 0x{cmd:02X} (got {got})")] + NoAck { cmd: u8, got: String }, + /// A read command answered with an unexpected header. + #[error("bad response to command 0x{cmd:02X} (got {got})")] + BadResponse { cmd: u8, got: String }, + /// A data block ended early. + #[error("{what} short ({got}/{want} bytes)")] + Short { + what: &'static str, + got: usize, + want: usize, + }, + #[error("timeout waiting for measurement data")] + Timeout, + /// The cancel flag (Ctrl+C) was raised during a wait. + #[error("cancelled")] + Cancelled, + #[error("HPCS 6500 not found (no serial port with VID 0483 / PID 5741)")] + NotFound, + #[error("pcap: {0}")] + Pcap(String), +} + +pub type Result = std::result::Result; + +/// `8c 13 0f` style hex for error messages, `(nothing)` when empty. +pub(crate) fn hex(b: &[u8]) -> String { + if b.is_empty() { + return "nothing".into(); + } + let mut s = String::new(); + for (i, x) in b.iter().take(24).enumerate() { + if i > 0 { + s.push(' '); + } + let _ = write!(s, "{x:02x}"); + } + if b.len() > 24 { + let _ = write!(s, " ... ({} bytes)", b.len()); + } + s +} diff --git a/src/format.rs b/src/format.rs new file mode 100644 index 0000000..84af37b --- /dev/null +++ b/src/format.rs @@ -0,0 +1,178 @@ +//! Text output of the command line tool, character for character the same +//! as the Python driver's (`format_reading`, `format_quick`, the CSV export +//! and the `--parse` report), so scripts reading it keep working. + +use crate::pcap::Message; +use crate::pyfmt; +use crate::reading::{ELECTRICAL_FIELDS, FIELDS, Reading}; +use std::fmt::{self, Write}; + +/// A float that formats like a Python number (`nan`, right-aligned). +struct Py(f64); + +impl fmt::Display for Py { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let s = match f.precision() { + Some(p) => pyfmt::fixed(self.0, p), + None => pyfmt::repr(self.0), + }; + match f.width() { + Some(w) => write!(f, "{s:>w$}"), + None => f.write_str(&s), + } + } +} + +/// The full report of one reading. `show_spectrum` adds the harmonics (when +/// present) and every 5th spectrum point as a bar chart. +pub fn format_reading(r: &Reading, show_spectrum: bool) -> String { + let g = |k: &str| Py(r.get(k).unwrap_or(0.0)); + let mut l: Vec = vec![]; + l.push(format!(" Device: {}", r.device)); + l.push(format!(" Date: {} Time: {}", r.test_date, r.test_time)); + l.push(String::new()); + + l.push(" --- Photometric ---".into()); + l.push(format!(" Phi (lm): {:10.2}", g("Phi_lm"))); + l.push(format!(" eta (lm/W): {:10.2}", g("eta_lm_W"))); + l.push(format!(" CCT (K): {:10.0}", g("CCT_K"))); + l.push(format!(" Duv: {:10.5}", g("Duv"))); + l.push(String::new()); + + l.push(" --- Chromaticity ---".into()); + l.push(format!(" x: {:.4} y: {:.4}", g("x"), g("y"))); + l.push(format!(" u: {:.4} v: {:.4}", g("u"), g("v"))); + l.push(format!( + " u': {:.4} v': {:.4}", + g("u_prime"), + g("v_prime") + )); + l.push(String::new()); + + l.push(" --- CRI ---".into()); + l.push(format!(" Ra: {:.1} SDCM: {:.2}", g("Ra"), g("SDCM"))); + let ri: Vec = (1..=15) + .map(|i| format!("R{i}={:.0}", Py(r.r(i)))) + .collect(); + l.push(format!(" {}", ri[..8].join(", "))); + l.push(format!(" {}", ri[8..].join(", "))); + l.push(String::new()); + + l.push(" --- CIE 1931 ---".into()); + l.push(format!( + " X: {:.3} Y: {:.3} Z: {:.3}", + g("CIE_X"), + g("CIE_Y"), + g("CIE_Z") + )); + l.push(format!(" TLCI-2012: {:.0}", g("TLCI"))); + l.push(String::new()); + + l.push(" --- Radiometric ---".into()); + l.push(format!(" Phi_e (mW): {:10.3}", g("Phi_e_mW"))); + l.push(format!(" Phi_eb (mW): {:10.3}", g("Phi_eb_mW"))); + l.push(format!(" Phi_ey (mW): {:10.3}", g("Phi_ey_mW"))); + l.push(format!(" Phi_er (mW): {:10.3}", g("Phi_er_mW"))); + l.push(format!(" Phi_efr (mW): {:10.3}", g("Phi_efr_mW"))); + l.push(String::new()); + + l.push(" --- Electrical ---".into()); + l.push(format!(" Voltage (V): {:10.2}", g("Voltage_V"))); + l.push(format!(" Current (A): {:10.4}", g("Current_A"))); + l.push(format!(" Power (W): {:10.3}", g("Power_W"))); + l.push(format!(" Frequency (Hz):{:10.2}", g("Freq_Hz"))); + l.push(format!(" Power Factor: {:10.4}", g("PF"))); + let harmonics = r.electrical.as_ref().and_then(|e| e.harmonics.as_ref()); + if let Some(h) = harmonics { + l.push(format!(" UThd (%): {:10.4}", Py(h.uthd))); + l.push(format!(" AThd (%): {:10.4}", Py(h.athd))); + } + l.push(String::new()); + + if let (true, Some(h)) = (show_spectrum, harmonics) { + for (title, values) in [("Voltage", &h.voltage), ("Current", &h.current)] { + l.push(format!(" --- {title} Harmonics (%) ---")); + for (i, v) in values.iter().enumerate() { + if *v > 0.001 || i == 0 { + l.push(format!(" H{:2}: {:8.4}", i + 1, Py(*v))); + } + } + l.push(String::new()); + } + } + + l.push(" --- Sensor ---".into()); + l.push(format!(" Peak Signal: {:10.0}", g("PeakSignal"))); + l.push(format!(" Dark Signal: {:10.0}", g("DarkSignal"))); + l.push(format!(" Compensate: {:10.0}", g("Compensate"))); + + if show_spectrum { + l.push(String::new()); + l.push(" --- Spectrum (380-1050nm) ---".into()); + let peak = r.spectrum.iter().cloned().fold(f64::NEG_INFINITY, f64::max); + let peak = if r.spectrum.is_empty() { 1.0 } else { peak }; + for (i, (wl, v)) in r.spectrum_nm().iter().zip(&r.spectrum).enumerate() { + if i % 5 == 0 { + let norm = if peak > 0.0 { v / peak } else { 0.0 }; + let bar = "#".repeat((norm * 40.0).max(0.0) as usize); + l.push(format!(" {:7.1}nm: {:8.4} [{bar}]", Py(*wl), Py(*v))); + } + } + } + l.join("\n") +} + +/// ` #3 479.6 lm 5653 K` (lumen and CCT only). +pub fn format_quick(r: &Reading, reading_num: Option) -> String { + let prefix = match reading_num { + Some(n) if n > 0 => format!("#{n} "), + _ => String::new(), + }; + format!( + " {prefix}{:.1} lm {:.0} K", + Py(r.flux_lm()), + Py(r.cct_k()) + ) +} + +/// CSV columns: `timestamp`, the measurement fields, the electrical fields. +pub fn csv_columns() -> Vec<&'static str> { + std::iter::once("timestamp") + .chain(FIELDS.iter().map(|f| f.0)) + .chain(ELECTRICAL_FIELDS.iter().map(|f| f.0)) + .collect() +} + +/// The CSV header line (CRLF, like Python's csv module). +pub fn csv_header() -> String { + csv_columns().join(",") + "\r\n" +} + +/// One CSV row; numbers as Python writes them, empty cells for values the +/// reading does not have. +pub fn csv_row(timestamp: &str, r: &Reading) -> String { + let mut cells = vec![timestamp.to_string()]; + for c in &csv_columns()[1..] { + cells.push(r.get(c).map(pyfmt::repr).unwrap_or_default()); + } + cells.join(",") + "\r\n" +} + +/// The `--parse` report of a capture, as the Python tool printed it. +pub fn pcap_report(messages: &[Message], quick: bool, show_spectrum: bool) -> String { + let mut out = String::new(); + for (i, b) in crate::pcap::blocks(messages).iter().enumerate() { + let Some(r) = Reading::parse(&b.measurement, b.electrical.as_deref()) else { + continue; + }; + if quick { + let _ = writeln!(out, "{}", format_quick(&r, Some(i + 1))); + } else { + let _ = writeln!(out, "\n{}", "=".repeat(60)); + let _ = writeln!(out, "Reading {} (t={:.2}s)", i + 1, b.ts); + let _ = writeln!(out, "{}", "=".repeat(60)); + let _ = writeln!(out, "{}", format_reading(&r, show_spectrum)); + } + } + out +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..eb3a4ce --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,38 @@ +//! Driver for the HPCS 6500 spectrophotometer / integrating sphere. +//! +//! The instrument talks a small binary protocol over its USB virtual COM +//! port (STM32 VCP, VID 0483 / PID 5741, 115200 baud). The protocol was +//! reverse-engineered from USB captures of the vendor software and is +//! documented byte by byte in `PROTOCOL.md`. +//! +//! ```no_run +//! use hpcs6500::{Hpcs6500, Mode}; +//! +//! let port = hpcs6500::find_port().expect("HPCS 6500 not connected"); +//! let mut dev = Hpcs6500::open(&port)?; +//! println!("{}", dev.identify()?); +//! dev.set_mode(Mode::Ac)?; +//! dev.set_ac_voltage(230.0)?; +//! dev.psu_on()?; +//! let r = dev.take_single_reading()?; +//! dev.psu_off()?; +//! println!("{:.0} lm, {:.0} K, Ra {:.1}", r.flux_lm(), r.cct_k(), r.ra()); +//! # Ok::<(), hpcs6500::Error>(()) +//! ``` +//! +//! Without hardware, [`sim::Simulator`] answers like the instrument, either +//! with readings replayed from a USB capture or with built-in sample data. + +mod device; +mod error; +pub mod format; +pub mod pcap; +pub mod protocol; +pub mod pyfmt; +pub mod reading; +pub mod sim; + +pub use device::{Hpcs6500, PortInfo, SerialTransport, Transport, find_port, list_ports}; +pub use error::{Error, Result}; +pub use protocol::{Mode, PollState, PsuSettings}; +pub use reading::{Electrical, Harmonics, Reading}; diff --git a/src/pcap.rs b/src/pcap.rs new file mode 100644 index 0000000..c7ccfba --- /dev/null +++ b/src/pcap.rs @@ -0,0 +1,220 @@ +//! USB captures (USBPcap pcap files) of the vendor software talking to the +//! instrument: the source of the protocol, and test data for the parser and +//! the simulator. + +use crate::error::{Error, Result}; +use crate::protocol::{ELECTRICAL_LEN, MEASUREMENT_LEN}; +use crate::reading::Reading; +use std::path::Path; + +/// Direction of a USB bulk transfer. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Dir { + /// Host to instrument (OUT endpoint). + Tx, + /// Instrument to host (IN endpoint). + Rx, +} + +/// One USB packet with a payload. +#[derive(Debug, Clone)] +pub struct Packet { + /// 1-based index in the file, counting every record. + pub num: usize, + /// Seconds since the epoch. + pub ts: f64, + pub status: u32, + /// USBPcap `info` byte: bit 0 set = IN (device to host). + pub info: u8, + pub device: u16, + /// Endpoint address; bit 7 set = IN. + pub endpoint: u8, + /// 0 isochronous, 1 interrupt, 2 control, 3 bulk. + pub transfer: u8, + pub data: Vec, +} + +impl Packet { + pub fn is_bulk(&self) -> bool { + self.transfer == 3 + } + /// Direction from the endpoint address, as the driver's parser uses it. + pub fn dir(&self) -> Dir { + if self.endpoint & 0x80 != 0 { + Dir::Rx + } else { + Dir::Tx + } + } +} + +/// File header facts. +#[derive(Debug, Clone, Copy)] +pub struct Header { + pub version: (u16, u16), + pub snaplen: u32, + /// 249 = USBPcap. + pub link_type: u32, +} + +/// A bulk transfer payload, timestamp relative to the first one. +#[derive(Debug, Clone)] +pub struct Message { + pub ts: f64, + pub dir: Dir, + pub data: Vec, +} + +/// Every record that carries a payload after its USBPcap header. +pub fn packets(data: &[u8]) -> Result<(Header, Vec)> { + if data.len() < 24 { + return Err(Error::Pcap(format!( + "file too small for a pcap header ({} bytes)", + data.len() + ))); + } + let magic = u32::from_le_bytes(data[..4].try_into().expect("4 bytes")); + let (big, nanos) = match magic { + 0xA1B2_C3D4 => (false, false), + 0xA1B2_3C4D => (false, true), + 0xD4C3_B2A1 => (true, false), + 0x4D3C_B2A1 => (true, true), + m => return Err(Error::Pcap(format!("not a pcap file (magic {m:#010x})"))), + }; + let u16_at = |o: usize| { + let b = [data[o], data[o + 1]]; + if big { + u16::from_be_bytes(b) + } else { + u16::from_le_bytes(b) + } + }; + let u32_at = |o: usize| { + let b: [u8; 4] = data[o..o + 4].try_into().expect("4 bytes"); + if big { + u32::from_be_bytes(b) + } else { + u32::from_le_bytes(b) + } + }; + let header = Header { + version: (u16_at(4), u16_at(6)), + snaplen: u32_at(16), + link_type: u32_at(20), + }; + let mut out = vec![]; + let mut off = 24; + let mut num = 0; + while off + 16 <= data.len() { + let (ts_sec, ts_frac, incl) = (u32_at(off), u32_at(off + 4), u32_at(off + 8) as usize); + off += 16; + if off + incl > data.len() { + break; + } + let p = &data[off..off + incl]; + off += incl; + num += 1; + if p.len() < 27 { + continue; + } + // the USBPcap header itself is always little-endian + let hdr_len = u16::from_le_bytes([p[0], p[1]]) as usize; + if hdr_len >= p.len() { + continue; + } + out.push(Packet { + num, + ts: ts_sec as f64 + ts_frac as f64 / if nanos { 1e9 } else { 1e6 }, + status: u32::from_le_bytes(p[10..14].try_into().expect("4 bytes")), + info: p[16], + device: u16::from_le_bytes([p[19], p[20]]), + endpoint: p[21], + transfer: p[22], + data: p[hdr_len..].to_vec(), + }); + } + Ok((header, out)) +} + +/// The bulk transfers in order, timestamps relative to the first. +pub fn messages(data: &[u8]) -> Result> { + let (_, pk) = packets(data)?; + let first = pk.iter().find(|p| p.is_bulk()).map(|p| p.ts).unwrap_or(0.0); + Ok(pk + .into_iter() + .filter(|p| p.is_bulk()) + .map(|p| Message { + ts: p.ts - first, + dir: p.dir(), + data: p.data, + }) + .collect()) +} + +pub fn read_messages(path: impl AsRef) -> Result> { + let path = path.as_ref(); + let data = std::fs::read(path).map_err(|e| Error::Pcap(format!("{}: {e}", path.display())))?; + messages(&data) +} + +/// A measurement block (with its time) and the electrical block at the same index. +#[derive(Debug, Clone)] +pub struct Block { + pub ts: f64, + pub measurement: Vec, + pub electrical: Option>, +} + +/// Measurement blocks (3904 bytes starting "HPCS6500") paired by index with +/// electrical blocks (1584 bytes), as the vendor software reads them. +pub fn blocks(messages: &[Message]) -> Vec { + let rx = messages.iter().filter(|m| m.dir == Dir::Rx); + let meas: Vec<&Message> = rx + .clone() + .filter(|m| m.data.len() == MEASUREMENT_LEN && m.data.starts_with(b"HPCS6500")) + .collect(); + let elec: Vec<&Message> = rx.filter(|m| m.data.len() == ELECTRICAL_LEN).collect(); + meas.iter() + .enumerate() + .map(|(i, m)| Block { + ts: m.ts, + measurement: m.data.clone(), + electrical: elec.get(i).map(|e| e.data.clone()), + }) + .collect() +} + +/// The readings in a capture. +pub fn readings(messages: &[Message]) -> Vec { + blocks(messages) + .iter() + .filter_map(|b| Reading::parse(&b.measurement, b.electrical.as_deref())) + .collect() +} + +/// A pcap file in memory, for tests and tools: one record per payload. +pub fn write(records: &[(Dir, Vec)]) -> Vec { + let mut f = vec![]; + f.extend_from_slice(&0xA1B2_C3D4u32.to_le_bytes()); + f.extend_from_slice(&2u16.to_le_bytes()); + f.extend_from_slice(&4u16.to_le_bytes()); + f.extend_from_slice(&[0; 8]); + f.extend_from_slice(&65535u32.to_le_bytes()); + f.extend_from_slice(&249u32.to_le_bytes()); + for (i, (dir, data)) in records.iter().enumerate() { + let mut p = vec![0u8; 27]; + p[..2].copy_from_slice(&27u16.to_le_bytes()); + p[16] = matches!(dir, Dir::Rx) as u8; + p[19..21].copy_from_slice(&4u16.to_le_bytes()); + p[21] = if matches!(dir, Dir::Rx) { 0x81 } else { 0x01 }; + p[22] = 3; + p[23..27].copy_from_slice(&(data.len() as u32).to_le_bytes()); + p.extend_from_slice(data); + f.extend_from_slice(&1_770_000_000u32.to_le_bytes()); + f.extend_from_slice(&(i as u32 * 1000).to_le_bytes()); + f.extend_from_slice(&(p.len() as u32).to_le_bytes()); + f.extend_from_slice(&(p.len() as u32).to_le_bytes()); + f.extend_from_slice(&p); + } + f +} diff --git a/src/protocol.rs b/src/protocol.rs new file mode 100644 index 0000000..156da24 --- /dev/null +++ b/src/protocol.rs @@ -0,0 +1,226 @@ +//! Frame layout, command bytes and the small fixed-size responses. +//! See `PROTOCOL.md` for the full reference. + +use serde::Serialize; + +/// Every frame in both directions starts with this byte. +pub const SYNC: u8 = 0x8C; +pub const BAUD: u32 = 115_200; +/// USB IDs of the instrument's virtual COM port (STM32 VCP). +pub const USB_VID: u16 = 0x0483; +pub const USB_PID: u16 = 0x5741; + +/// Command bytes (second byte of every frame). +pub mod cmd { + pub const IDENTIFY: u8 = 0x00; + pub const INTEGRATION_TIME: u8 = 0x01; + pub const POLL_STATE: u8 = 0x03; + pub const STATUS: u8 = 0x05; + pub const START: u8 = 0x0E; + pub const READ_MEASUREMENT: u8 = 0x13; + pub const RESET: u8 = 0x25; + pub const CONFIG: u8 = 0x2A; + pub const TEST_CONFIG: u8 = 0x2B; + pub const PSU_OUTPUT: u8 = 0x72; + pub const SET_DC: u8 = 0x73; + pub const READ_ELECTRICAL: u8 = 0x77; + pub const SET_AC: u8 = 0x78; + pub const READ_PSU: u8 = 0x79; + pub const SET_MODE: u8 = 0x7A; +} + +/// Payload length of the measurement block (`8C 13`, after a 4-byte header). +pub const MEASUREMENT_LEN: usize = 3904; +/// Payload length of the electrical / harmonics block (`8C 77`, after a 4-byte header). +pub const ELECTRICAL_LEN: usize = 1584; +/// Transport headers the instrument sends in front of the two blocks. +pub const MEASUREMENT_HEADER: [u8; 4] = [SYNC, cmd::READ_MEASUREMENT, 0x0F, 0x40]; +pub const ELECTRICAL_HEADER: [u8; 4] = [SYNC, cmd::READ_ELECTRICAL, 0x06, 0x30]; + +/// Poll response byte 5. +pub const STATE_IDLE: u8 = 0x04; +pub const STATE_MEASURING: u8 = 0x01; + +/// `8C 0E` sub commands. +pub const START_CONTINUOUS: u8 = 0x01; +/// Stops a continuous measurement; on an idle instrument it triggers one reading. +pub const STOP_OR_SINGLE: u8 = 0x02; + +/// Single-test parameters (`8C 2B` sub 00), captured from the vendor software. +const TEST_CONFIG_SUB0_HEX: &str = concat!( + "00003c00000001008813037c011a04000000484200000208", + "000000000001060000000000803f0000803f0000803f0000", + "803f0000803f00000000003f", +); +/// Single-test config (`8C 2B` sub 01); byte 37 is the auto-PSU flag. +const TEST_CONFIG_SUB1_HEX: &str = concat!( + "017c010c037c010c037c010c030000803f000000000000000000000000", + "00000000000000000001000000400000803f", +); +pub const AUTO_PSU_BYTE: usize = 37; + +fn unhex(s: &str) -> Vec { + (0..s.len()) + .step_by(2) + .map(|i| u8::from_str_radix(&s[i..i + 2], 16).expect("valid hex")) + .collect() +} + +/// A frame: `8C `. +pub fn frame(cmd: u8, payload: &[u8]) -> Vec { + let mut f = Vec::with_capacity(2 + payload.len()); + f.push(SYNC); + f.push(cmd); + f.extend_from_slice(payload); + f +} + +/// `8C ` (AC and DC parameters). +pub fn frame_f32(cmd: u8, sub: u8, value: f32) -> Vec { + let mut p = vec![sub]; + p.extend_from_slice(&value.to_le_bytes()); + frame(cmd, &p) +} + +/// The two `8C 2B` frames of the vendor's single-test configuration. +pub fn test_config_frames(auto_psu: bool) -> [Vec; 2] { + let mut sub1 = unhex(TEST_CONFIG_SUB1_HEX); + if auto_psu { + sub1[AUTO_PSU_BYTE] = 0x01; + } + [ + frame(cmd::TEST_CONFIG, &unhex(TEST_CONFIG_SUB0_HEX)), + frame(cmd::TEST_CONFIG, &sub1), + ] +} + +/// Output mode of the built-in supply. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)] +pub enum Mode { + #[serde(rename = "AC")] + Ac, + #[serde(rename = "DC")] + Dc, +} + +impl Mode { + pub fn byte(self) -> u8 { + match self { + Mode::Ac => 0x00, + Mode::Dc => 0x01, + } + } + pub fn as_str(self) -> &'static str { + match self { + Mode::Ac => "AC", + Mode::Dc => "DC", + } + } +} + +impl std::fmt::Display for Mode { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(self.as_str()) + } +} + +impl std::str::FromStr for Mode { + type Err = String; + fn from_str(s: &str) -> Result { + match s.to_ascii_lowercase().as_str() { + "ac" => Ok(Mode::Ac), + "dc" => Ok(Mode::Dc), + _ => Err(format!("mode must be ac or dc, not {s:?}")), + } + } +} + +/// Settings of the built-in supply (`8C 79`). +#[derive(Debug, Clone, Copy, PartialEq, Serialize)] +pub struct PsuSettings { + pub ac_voltage: f64, + pub ac_frequency: f64, + pub dc_voltage: f64, + pub dc_current: f64, + pub mode: Mode, +} + +impl PsuSettings { + /// Response length including the `8C 79` header. + pub const RESPONSE_LEN: usize = 20; + + /// Parse the 18 bytes after the header. + pub fn parse(p: &[u8]) -> Option { + if p.len() < 17 { + return None; + } + let f = |o: usize| f32::from_le_bytes([p[o], p[o + 1], p[o + 2], p[o + 3]]) as f64; + Some(PsuSettings { + ac_voltage: f(0), + ac_frequency: f(4), + dc_voltage: f(8), + dc_current: f(12), + mode: if p[16] == 1 { Mode::Dc } else { Mode::Ac }, + }) + } + + /// The full response frame the instrument sends. + pub fn to_response(&self) -> Vec { + let mut v = vec![SYNC, cmd::READ_PSU]; + for x in [ + self.ac_voltage, + self.ac_frequency, + self.dc_voltage, + self.dc_current, + ] { + v.extend_from_slice(&(x as f32).to_le_bytes()); + } + v.push(self.mode.byte()); + v.push(0xFF); + v + } +} + +/// Answer to `8C 03`. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)] +pub struct PollState { + /// A new reading can be read with `8C 13` / `8C 77`. + pub data_available: bool, + /// [`STATE_IDLE`] or [`STATE_MEASURING`]. + pub state: u8, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_config_matches_vendor_capture() { + let [a, b] = test_config_frames(false); + assert_eq!(a.len(), 2 + 60); + assert_eq!(b.len(), 2 + 47); + assert_eq!(&a[..4], &[0x8C, 0x2B, 0x00, 0x00]); + assert_eq!(b[2], 0x01); + assert_eq!(b[2 + AUTO_PSU_BYTE], 0x00); + let [_, b] = test_config_frames(true); + assert_eq!(b[2 + AUTO_PSU_BYTE], 0x01); + } + + #[test] + fn psu_settings_round_trip() { + let s = PsuSettings { + ac_voltage: 230.0, + ac_frequency: 50.0, + dc_voltage: 24.0, + dc_current: 5.0, + mode: Mode::Ac, + }; + let r = s.to_response(); + assert_eq!(r.len(), PsuSettings::RESPONSE_LEN); + assert_eq!(PsuSettings::parse(&r[2..]), Some(s)); + assert_eq!( + frame_f32(cmd::SET_AC, 0, 230.0), + vec![0x8C, 0x78, 0x00, 0x00, 0x00, 0x66, 0x43] + ); + } +} diff --git a/src/pyfmt.rs b/src/pyfmt.rs new file mode 100644 index 0000000..ee6b1c7 --- /dev/null +++ b/src/pyfmt.rs @@ -0,0 +1,267 @@ +//! Number formatting that matches Python, so files written by the Rust tools +//! are byte-identical to the ones the Python tools wrote (CSV exports, lamp +//! bundles): `repr(float)`, `format(x, ".6g")`, `format(x, ".2f")` and +//! `round(x, n)`. +//! +//! Python rounds the exact binary value half to even (David Gay's dtoa); +//! Rust's shortest formatting breaks ties differently (`93.72439575195313` +//! vs Python's `93.72439575195312`), so the digits are derived here from the +//! exact decimal expansion. + +/// Python `repr(x)` / `str(x)` of a float: shortest round-trip digits, +/// exponent form below 1e-4 and from 1e16 (`1e-05`, `1e+16`), always a +/// `.0` on whole numbers. +pub fn repr(x: f64) -> String { + if let Some(s) = special(x) { + return s; + } + if x == 0.0 { + return if x.is_sign_negative() { + "-0.0".into() + } else { + "0.0".into() + }; + } + let (neg, digits, exp) = exact(x); + let (mut d, mut e) = (digits.clone(), exp); + for p in 1..=17 { + let (rd, re) = round_sig(&digits, exp, p); + if to_f64(&rd, re) == x.abs() { + (d, e) = (rd, re); + break; + } + } + trim(&mut d); + let mut out = String::with_capacity(24); + if neg { + out.push('-'); + } + if (-4..16).contains(&e) { + place(&mut out, &d, e, 0); + if !out.contains('.') { + out.push_str(".0"); + } + } else { + sci(&mut out, &d, e); + } + out +} + +/// Python `format(x, f".{prec}g")`. +pub fn g(x: f64, prec: usize) -> String { + if let Some(s) = special(x) { + return s; + } + let p = prec.max(1); + if x == 0.0 { + return if x.is_sign_negative() { + "-0".into() + } else { + "0".into() + }; + } + let (neg, digits, exp) = exact(x); + let (mut d, e) = round_sig(&digits, exp, p); + trim(&mut d); + let mut out = String::new(); + if neg { + out.push('-'); + } + if e >= -4 && e < p as i32 { + place(&mut out, &d, e, 0); + } else { + sci(&mut out, &d, e); + } + out +} + +/// Python `format(x, f".{prec}f")`. +pub fn fixed(x: f64, prec: usize) -> String { + if let Some(s) = special(x) { + return s; + } + let mut out = String::new(); + if x.is_sign_negative() { + out.push('-'); + } + if x == 0.0 { + place(&mut out, b"0", 0, prec); + return out; + } + let (_, digits, exp) = exact(x); + // significant digits kept when rounding at the prec-th decimal + let keep = exp + 1 + prec as i32; + let (d, e) = if keep > 0 { + round_sig(&digits, exp, keep as usize) + } else if keep == 0 && round_up_from(&digits, 0, b'0') { + (b"1".to_vec(), -(prec as i32)) + } else { + (b"0".to_vec(), 0) + }; + place(&mut out, &d, e, prec); + out +} + +/// Python `round(x, ndigits)` (half to even on the exact value). +pub fn round(x: f64, ndigits: usize) -> f64 { + if !x.is_finite() { + return x; + } + fixed(x, ndigits).parse().unwrap_or(x) +} + +fn special(x: f64) -> Option { + if x.is_nan() { + Some("nan".into()) + } else if x.is_infinite() { + Some(if x > 0.0 { "inf".into() } else { "-inf".into() }) + } else { + None + } +} + +/// Exact decimal expansion of a finite non-zero x: (negative, significant +/// digits without trailing zeros, decimal exponent of the first digit). +fn exact(x: f64) -> (bool, Vec, i32) { + // every f64 has at most 767 significant decimal digits; Rust prints them exactly + let s = format!("{:.800e}", x.abs()); + let (mant, e) = s.split_once('e').expect("exponent"); + let mut d: Vec = mant.bytes().filter(u8::is_ascii_digit).collect(); + trim(&mut d); + (x.is_sign_negative(), d, e.parse().expect("exponent")) +} + +fn trim(d: &mut Vec) { + while d.len() > 1 && d.last() == Some(&b'0') { + d.pop(); + } +} + +/// Does the tail starting at `from` round up: more than half, or exactly +/// half after an odd last kept digit? +fn round_up_from(d: &[u8], from: usize, last_kept: u8) -> bool { + let Some(&first) = d.get(from) else { + return false; + }; + if first != b'5' { + return first > b'5'; + } + if d[from + 1..].iter().any(|&c| c != b'0') { + return true; + } + (last_kept - b'0') % 2 == 1 +} + +/// Round to `n` significant digits, half to even. +fn round_sig(d: &[u8], exp: i32, n: usize) -> (Vec, i32) { + if d.len() <= n { + return (d.to_vec(), exp); + } + let mut k = d[..n].to_vec(); + if round_up_from(d, n, k[n - 1]) { + let mut i = n; + loop { + if i == 0 { + // 99.9 -> 100: one more digit in front, one fewer at the end + k.insert(0, b'1'); + k.pop(); + return (k, exp + 1); + } + i -= 1; + if k[i] == b'9' { + k[i] = b'0'; + } else { + k[i] += 1; + break; + } + } + } + (k, exp) +} + +fn to_f64(d: &[u8], e: i32) -> f64 { + let s = format!( + "{}e{}", + std::str::from_utf8(d).expect("digits"), + e - d.len() as i32 + 1 + ); + s.parse().expect("number") +} + +/// Positional notation of digits `d` (first digit at 10^e) with at least +/// `min_decimals` decimals. +fn place(out: &mut String, d: &[u8], e: i32, min_decimals: usize) { + // digit at position 10^i + let digit = |i: i32| -> char { + let idx = e - i; + if idx >= 0 && (idx as usize) < d.len() { + d[idx as usize] as char + } else { + '0' + } + }; + for i in (0..=e.max(0)).rev() { + out.push(digit(i)); + } + let lowest = e - d.len() as i32 + 1; + let decimals = (-lowest).max(min_decimals as i32); + if decimals > 0 { + out.push('.'); + for i in 1..=decimals { + out.push(digit(-i)); + } + } +} + +fn sci(out: &mut String, d: &[u8], e: i32) { + out.push(d[0] as char); + if d.len() > 1 { + out.push('.'); + out.push_str(std::str::from_utf8(&d[1..]).expect("digits")); + } + out.push('e'); + out.push(if e < 0 { '-' } else { '+' }); + let a = e.unsigned_abs(); + if a < 10 { + out.push('0'); + } + out.push_str(&a.to_string()); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + #[allow(clippy::excessive_precision)] + fn examples() { + assert_eq!(repr(1.0), "1.0"); + assert_eq!(repr(100.0), "100.0"); + assert_eq!(repr(0.1 + 0.2), "0.30000000000000004"); + assert_eq!(repr(1e-5), "1e-05"); + assert_eq!(repr(0.0001), "0.0001"); + assert_eq!(repr(1e16), "1e+16"); + assert_eq!(repr(1234567890123456.0), "1234567890123456.0"); + assert_eq!(repr(93.724395751953125), "93.72439575195312"); + assert_eq!(repr(-617.35406494140625), "-617.3540649414062"); + assert_eq!(g(0.00191776, 6), "0.00191776"); + assert_eq!(g(1.5e-5, 6), "1.5e-05"); + assert_eq!(g(123456.5, 6), "123456"); + assert_eq!(g(1234567.0, 6), "1.23457e+06"); + assert_eq!(g(999999.5, 6), "1e+06"); + assert_eq!(g(100.0, 6), "100"); + assert_eq!(g(0.0, 6), "0"); + assert_eq!(g(f64::NAN, 6), "nan"); + assert_eq!(fixed(380.0, 2), "380.00"); + assert_eq!(fixed(0.125, 2), "0.12"); + assert_eq!(fixed(0.375, 2), "0.38"); + assert_eq!(fixed(2.5, 0), "2"); + assert_eq!(fixed(0.5, 0), "0"); + assert_eq!(fixed(1.5, 0), "2"); + assert_eq!(fixed(-0.001, 2), "-0.00"); + assert_eq!(fixed(0.006, 2), "0.01"); + assert_eq!(fixed(99.995, 2), "100.00"); + assert_eq!(fixed(0.004, 2), "0.00"); + assert_eq!(round(83.25, 1), 83.2); + } +} diff --git a/src/reading.rs b/src/reading.rs new file mode 100644 index 0000000..b4438ff --- /dev/null +++ b/src/reading.rs @@ -0,0 +1,334 @@ +//! The two data blocks and what is in them. + +use crate::protocol::MEASUREMENT_LEN; +use serde::ser::{Serialize, SerializeMap, Serializer}; + +pub const SPECTRUM_START_NM: f64 = 380.0; +pub const SPECTRUM_END_NM: f64 = 1050.0; +pub const SPECTRUM_OFFSET: usize = 432; +pub const SPECTRUM_COUNT: usize = 350; +/// (1050 - 380) / (350 - 1) = 1.9198 nm. +pub const SPECTRUM_STEP: f64 = + (SPECTRUM_END_NM - SPECTRUM_START_NM) / (SPECTRUM_COUNT as f64 - 1.0); + +/// Named float32 fields of the measurement block: (name, offset). +/// The names are the column names of the CSV export and the keys of the +/// lamp bundles, so they stay as they were in the Python driver. +pub const FIELDS: [(&str, usize); 42] = [ + ("Phi_lm", 36), + ("eta_lm_W", 40), + ("CCT_K", 44), + ("Duv", 48), + ("x", 52), + ("y", 56), + ("u", 60), + ("v", 64), + ("u_prime", 68), + ("v_prime", 72), + ("SDCM", 76), + ("Ra", 80), + ("R1", 84), + ("R2", 88), + ("R3", 92), + ("R4", 96), + ("R5", 100), + ("R6", 104), + ("R7", 108), + ("R8", 112), + ("R9", 116), + ("R10", 120), + ("R11", 124), + ("R12", 128), + ("R13", 132), + ("R14", 136), + ("R15", 140), + ("Phi_e_mW", 144), + ("Phi_euv_mW", 148), + ("Phi_eb_mW", 152), + ("Phi_ey_mW", 156), + ("Phi_er_mW", 160), + ("Phi_efr_mW", 164), + ("Phi_eir_mW", 168), + ("Phi_e_total", 172), + ("CIE_X", 224), + ("CIE_Y", 228), + ("CIE_Z", 232), + ("TLCI", 236), + ("PeakSignal", 244), + ("DarkSignal", 248), + ("Compensate", 252), +]; +pub const FIELD_COUNT: usize = FIELDS.len(); + +/// Electrical block fields: (name, offset). +pub const ELECTRICAL_FIELDS: [(&str, usize); 5] = [ + ("Voltage_V", 8), + ("Current_A", 12), + ("Power_W", 16), + ("Freq_Hz", 20), + ("PF", 24), +]; + +pub const HARMONICS_V_OFFSET: usize = 544; +pub const HARMONICS_COUNT: usize = 50; +pub const UTHD_OFFSET: usize = 744; +pub const HARMONICS_I_OFFSET: usize = 800; +pub const ATHD_OFFSET: usize = 1000; +pub const WAVEFORM_V_OFFSET: usize = 30; +pub const WAVEFORM_I_OFFSET: usize = 286; +pub const WAVEFORM_SAMPLES: usize = 128; + +const DATE_OFFSET: usize = 272; +const TIME_OFFSET: usize = 283; + +fn f32_at(d: &[u8], o: usize) -> f64 { + f32::from_le_bytes([d[o], d[o + 1], d[o + 2], d[o + 3]]) as f64 +} + +/// ASCII with U+FFFD for bytes above 0x7F and trailing NULs removed, +/// like Python's `decode("ascii", errors="replace").rstrip("\0")`. +fn ascii(d: &[u8]) -> String { + let s: String = d + .iter() + .map(|&b| if b < 0x80 { b as char } else { '\u{FFFD}' }) + .collect(); + s.trim_end_matches('\0').to_string() +} + +/// One reading: the measurement block, plus the electrical block when it was read. +#[derive(Debug, Clone, PartialEq)] +pub struct Reading { + /// Device ID from the block header ("HPCS6500"). + pub device: String, + /// Date and time the instrument stamped on the reading. + pub test_date: String, + pub test_time: String, + /// The [`FIELDS`] in order; use [`Reading::get`] by name. + pub values: [f64; FIELD_COUNT], + /// 350 points, 380 to 1050 nm (spectral irradiance, µW/cm²/nm). + pub spectrum: Vec, + pub electrical: Option, +} + +#[derive(Debug, Clone, PartialEq)] +pub struct Electrical { + pub voltage_v: f64, + pub current_a: f64, + pub power_w: f64, + pub freq_hz: f64, + pub pf: f64, + /// Present when harmonics analysis is on (H1 of the voltage is 100 %). + pub harmonics: Option, +} + +#[derive(Debug, Clone, PartialEq)] +pub struct Harmonics { + /// H1..H50 of the voltage, % of H1. + pub voltage: Vec, + pub uthd: f64, + /// H1..H50 of the current, % of H1. + pub current: Vec, + pub athd: f64, + /// One AC cycle, 128 samples each. + pub v_waveform: Vec, + pub i_waveform: Vec, +} + +impl Electrical { + /// Parse the 1584-byte electrical block. + pub fn parse(d: &[u8]) -> Option { + if d.len() < 28 { + return None; + } + let harmonics = (d.len() >= ATHD_OFFSET + 4 + && (f32_at(d, HARMONICS_V_OFFSET) - 100.0).abs() < 1.0) + .then(|| { + let i16s = |o: usize| { + (0..WAVEFORM_SAMPLES) + .map(|i| i16::from_le_bytes([d[o + 2 * i], d[o + 2 * i + 1]])) + .collect() + }; + Harmonics { + voltage: (0..HARMONICS_COUNT) + .map(|i| f32_at(d, HARMONICS_V_OFFSET + 4 * i)) + .collect(), + uthd: f32_at(d, UTHD_OFFSET), + current: (0..HARMONICS_COUNT) + .map(|i| f32_at(d, HARMONICS_I_OFFSET + 4 * i)) + .collect(), + athd: f32_at(d, ATHD_OFFSET), + v_waveform: i16s(WAVEFORM_V_OFFSET), + i_waveform: i16s(WAVEFORM_I_OFFSET), + } + }); + Some(Electrical { + voltage_v: f32_at(d, 8), + current_a: f32_at(d, 12), + power_w: f32_at(d, 16), + freq_hz: f32_at(d, 20), + pf: f32_at(d, 24), + harmonics, + }) + } + + fn values(&self) -> [f64; 5] { + [ + self.voltage_v, + self.current_a, + self.power_w, + self.freq_hz, + self.pf, + ] + } +} + +impl Reading { + /// Parse a 3904-byte measurement block and optionally its electrical block. + pub fn parse(meas: &[u8], elec: Option<&[u8]>) -> Option { + if meas.len() < MEASUREMENT_LEN { + return None; + } + let mut values = [0.0; FIELD_COUNT]; + for (v, (_, off)) in values.iter_mut().zip(FIELDS.iter()) { + *v = f32_at(meas, *off); + } + Some(Reading { + device: ascii(&meas[..10]), + test_date: ascii(&meas[DATE_OFFSET..DATE_OFFSET + 10]), + test_time: ascii(&meas[TIME_OFFSET..TIME_OFFSET + 8]), + values, + spectrum: (0..SPECTRUM_COUNT) + .map(|i| f32_at(meas, SPECTRUM_OFFSET + 4 * i)) + .collect(), + electrical: elec.and_then(Electrical::parse), + }) + } + + /// A value by its CSV / bundle name: the [`FIELDS`], the + /// [`ELECTRICAL_FIELDS`], `UThd` and `AThd`. `None` when absent. + pub fn get(&self, name: &str) -> Option { + if let Some(i) = FIELDS.iter().position(|(n, _)| *n == name) { + return Some(self.values[i]); + } + let e = self.electrical.as_ref()?; + if let Some(i) = ELECTRICAL_FIELDS.iter().position(|(n, _)| *n == name) { + return Some(e.values()[i]); + } + let h = e.harmonics.as_ref()?; + match name { + "UThd" => Some(h.uthd), + "AThd" => Some(h.athd), + _ => None, + } + } + + /// Set a scalar by name (see [`Reading::get`]); false if it does not exist here. + pub fn set(&mut self, name: &str, value: f64) -> bool { + if let Some(i) = FIELDS.iter().position(|(n, _)| *n == name) { + self.values[i] = value; + return true; + } + let Some(e) = self.electrical.as_mut() else { + return false; + }; + match name { + "Voltage_V" => e.voltage_v = value, + "Current_A" => e.current_a = value, + "Power_W" => e.power_w = value, + "Freq_Hz" => e.freq_hz = value, + "PF" => e.pf = value, + "UThd" | "AThd" => { + let Some(h) = e.harmonics.as_mut() else { + return false; + }; + if name == "UThd" { + h.uthd = value + } else { + h.athd = value + } + } + _ => return false, + } + true + } + + /// All scalars present in this reading, in the Python driver's key order. + pub fn scalars(&self) -> Vec<(&'static str, f64)> { + let mut v: Vec<(&'static str, f64)> = + FIELDS.iter().map(|(n, _)| *n).zip(self.values).collect(); + if let Some(e) = &self.electrical { + v.extend(ELECTRICAL_FIELDS.iter().map(|(n, _)| *n).zip(e.values())); + if let Some(h) = &e.harmonics { + v.push(("UThd", h.uthd)); + v.push(("AThd", h.athd)); + } + } + v + } + + /// Wavelength of each spectrum point (nm). + pub fn spectrum_nm(&self) -> Vec { + (0..self.spectrum.len()) + .map(|i| SPECTRUM_START_NM + i as f64 * SPECTRUM_STEP) + .collect() + } + + fn field(&self, name: &str) -> f64 { + self.get(name).unwrap_or(0.0) + } + /// Luminous flux (lm). + pub fn flux_lm(&self) -> f64 { + self.field("Phi_lm") + } + /// Luminous efficacy (lm/W). + pub fn efficacy_lm_w(&self) -> f64 { + self.field("eta_lm_W") + } + /// Correlated colour temperature (K). + pub fn cct_k(&self) -> f64 { + self.field("CCT_K") + } + pub fn duv(&self) -> f64 { + self.field("Duv") + } + /// CRI Ra. + pub fn ra(&self) -> f64 { + self.field("Ra") + } + /// Special CRI R1..R15. + pub fn r(&self, n: usize) -> f64 { + assert!((1..=15).contains(&n), "R1..R15"); + self.values[11 + n] + } +} + +/// JSON with the Python driver's keys and order: `device`, the fields, +/// `test_date`, `test_time`, `spectrum`, `spectrum_nm`, then the electrical +/// values and harmonics when present. +impl Serialize for Reading { + fn serialize(&self, s: S) -> Result { + let mut m = s.serialize_map(None)?; + m.serialize_entry("device", &self.device)?; + for ((n, _), v) in FIELDS.iter().zip(self.values) { + m.serialize_entry(n, &v)?; + } + m.serialize_entry("test_date", &self.test_date)?; + m.serialize_entry("test_time", &self.test_time)?; + m.serialize_entry("spectrum", &self.spectrum)?; + m.serialize_entry("spectrum_nm", &self.spectrum_nm())?; + if let Some(e) = &self.electrical { + for ((n, _), v) in ELECTRICAL_FIELDS.iter().zip(e.values()) { + m.serialize_entry(n, &v)?; + } + if let Some(h) = &e.harmonics { + m.serialize_entry("V_harmonics", &h.voltage)?; + m.serialize_entry("UThd", &h.uthd)?; + m.serialize_entry("I_harmonics", &h.current)?; + m.serialize_entry("AThd", &h.athd)?; + m.serialize_entry("V_waveform", &h.v_waveform)?; + m.serialize_entry("I_waveform", &h.i_waveform)?; + } + } + m.end() + } +} diff --git a/src/sim.rs b/src/sim.rs new file mode 100644 index 0000000..deb278c --- /dev/null +++ b/src/sim.rs @@ -0,0 +1,284 @@ +//! A simulated instrument: answers every command of the protocol like the +//! HPCS 6500 does, so tools can be developed and tested without hardware. +//! +//! Readings come from a USB capture ([`Simulator::from_pcap`]) or from the +//! built-in sample ([`Simulator::sample`], a real reading of an LED lamp). +//! Every frame the host writes is kept in [`Simulator::log`]. + +use crate::device::Transport; +use crate::error::Result; +use crate::pcap::{self, Dir}; +use crate::protocol::{self, ELECTRICAL_HEADER, MEASUREMENT_HEADER, Mode, PsuSettings, SYNC, cmd}; +use std::collections::VecDeque; +use std::io; +use std::path::Path; +use std::time::Duration; + +const SAMPLE_MEAS: &[u8] = include_bytes!("../tests/fixtures/r01_meas.bin"); +const SAMPLE_ELEC: &[u8] = include_bytes!("../tests/fixtures/r01_elec.bin"); + +/// The simulated instrument (a [`Transport`] for [`crate::Hpcs6500`]). +#[derive(Debug, Clone)] +pub struct Simulator { + readings: Vec<(Vec, Vec)>, + identify: Vec, + /// Supply settings as set by the host. + pub psu: PsuSettings, + /// Supply output on? + pub output_on: bool, + /// Last integration time set (µs), 0 = auto. + pub integration_us: u32, + /// Polls after a trigger until data is ready. + pub polls_to_ready: u32, + /// Readings served so far. + pub served: usize, + /// Every frame written by the host, in order. + pub log: Vec>, + /// Commands the instrument ignores (no answer at all), to test timeouts. + pub mute: Vec, + countdown: Option, + ready: bool, + continuous: bool, + out: VecDeque, +} + +impl Simulator { + /// Serve these (measurement, electrical) block pairs in a loop. + pub fn new(readings: Vec<(Vec, Vec)>) -> Self { + assert!(!readings.is_empty(), "at least one reading"); + let mut identify = vec![SYNC, cmd::IDENTIFY]; + identify.extend_from_slice(b"HPCS6500\0\0"); + identify.extend_from_slice(&[0; 4]); + Simulator { + readings, + identify, + psu: PsuSettings { + ac_voltage: 230.0, + ac_frequency: 50.0, + dc_voltage: 24.0, + dc_current: 5.0, + mode: Mode::Ac, + }, + output_on: false, + integration_us: 0, + polls_to_ready: 2, + served: 0, + log: vec![], + mute: vec![], + countdown: None, + ready: false, + continuous: false, + out: VecDeque::new(), + } + } + + /// The built-in sample reading (an LED lamp at 230 V / 50 Hz). + pub fn sample() -> Self { + Simulator::new(vec![(SAMPLE_MEAS.to_vec(), SAMPLE_ELEC.to_vec())]) + } + + /// Replay the readings of a USB capture; the identify and supply answers + /// are taken from the capture too when it has them. + pub fn from_pcap(path: impl AsRef) -> Result { + let msgs = pcap::read_messages(path.as_ref())?; + let blocks = pcap::blocks(&msgs); + if blocks.is_empty() { + return Err(crate::Error::Pcap(format!( + "{}: no measurement blocks", + path.as_ref().display() + ))); + } + let mut s = Simulator::new( + blocks + .into_iter() + .map(|b| { + ( + b.measurement, + b.electrical + .unwrap_or_else(|| vec![0; protocol::ELECTRICAL_LEN]), + ) + }) + .collect(), + ); + let rx = || msgs.iter().filter(|m| m.dir == Dir::Rx); + if let Some(m) = rx().find(|m| m.data.len() == 16 && m.data[..2] == [SYNC, cmd::IDENTIFY]) { + s.identify = m.data.clone(); + } + if let Some(p) = rx() + .find(|m| { + m.data.len() == PsuSettings::RESPONSE_LEN && m.data[..2] == [SYNC, cmd::READ_PSU] + }) + .and_then(|m| PsuSettings::parse(&m.data[2..])) + { + s.psu = p; + } + Ok(s) + } + + /// Number of distinct readings it serves. + pub fn len(&self) -> usize { + self.readings.len() + } + pub fn is_empty(&self) -> bool { + false + } + + /// The frames of the log with this command byte. + pub fn sent(&self, command: u8) -> Vec<&Vec> { + self.log + .iter() + .filter(|f| f.len() >= 2 && f[1] == command) + .collect() + } + + fn reply(&mut self, b: &[u8]) { + self.out.extend(b); + } + fn ack(&mut self, c: u8) { + self.reply(&[SYNC, c]); + } + fn trigger(&mut self, continuous: bool) { + self.continuous = continuous; + self.ready = false; + self.countdown = Some(self.polls_to_ready); + } + fn current(&self) -> &(Vec, Vec) { + &self.readings[self.served.saturating_sub(1) % self.readings.len()] + } + fn f32_arg(f: &[u8]) -> Option<(u8, f32)> { + (f.len() >= 7).then(|| (f[2], f32::from_le_bytes([f[3], f[4], f[5], f[6]]))) + } + + fn handle(&mut self, f: &[u8]) { + if f.len() < 2 || f[0] != SYNC || self.mute.contains(&f[1]) { + return; + } + let c = f[1]; + let arg = f.get(2).copied(); + match c { + cmd::IDENTIFY => { + let r = self.identify.clone(); + self.reply(&r) + } + cmd::INTEGRATION_TIME if f.len() >= 6 => { + self.integration_us = u32::from_le_bytes([f[2], f[3], f[4], f[5]]); + self.ack(c) + } + cmd::POLL_STATE => { + if let Some(n) = self.countdown { + if n == 0 { + self.countdown = None; + self.ready = true; + self.served += 1; + } else { + self.countdown = Some(n - 1); + } + } + let r = self.ready as u8; + let state = if self.continuous || self.countdown.is_some() { + protocol::STATE_MEASURING + } else { + protocol::STATE_IDLE + }; + self.reply(&[SYNC, c, r, r, 0, state, 0, 0, 1]) + } + cmd::STATUS => self.reply(&[SYNC, c, 0, 0, 0, 0, 0]), + cmd::START => { + match arg { + Some(protocol::START_CONTINUOUS) => self.trigger(true), + // stop ends a continuous run; on an idle instrument it takes one reading + Some(protocol::STOP_OR_SINGLE) if self.continuous => { + self.continuous = false; + self.countdown = None; + } + Some(protocol::STOP_OR_SINGLE) => self.trigger(false), + _ => {} + } + self.ack(c) + } + cmd::READ_MEASUREMENT => { + let mut r = MEASUREMENT_HEADER.to_vec(); + r.extend_from_slice(&self.current().0); + self.reply(&r); + self.ready = false; + if self.continuous { + self.countdown = Some(self.polls_to_ready); + } + } + cmd::READ_ELECTRICAL => { + let mut r = ELECTRICAL_HEADER.to_vec(); + r.extend_from_slice(&self.current().1); + self.reply(&r) + } + cmd::RESET => { + self.continuous = false; + self.countdown = None; + self.ready = false; + self.ack(c) + } + cmd::TEST_CONFIG => self.ack(c), + cmd::PSU_OUTPUT => { + match arg { + Some(0x00) => self.output_on = true, + Some(0x01) => self.output_on = false, + _ => {} + } + self.ack(c) + } + cmd::SET_DC => { + if let Some((sub, v)) = Self::f32_arg(f) { + if sub == 0 { + self.psu.dc_current = v as f64 + } else { + self.psu.dc_voltage = v as f64 + } + } + self.ack(c) + } + cmd::SET_AC => { + if let Some((sub, v)) = Self::f32_arg(f) { + if sub == 0 { + self.psu.ac_voltage = v as f64 + } else { + self.psu.ac_frequency = v as f64 + } + } + self.ack(c) + } + cmd::READ_PSU => { + let r = self.psu.to_response(); + self.reply(&r) + } + cmd::SET_MODE => { + self.psu.mode = if arg == Some(1) { Mode::Dc } else { Mode::Ac }; + self.ack(c) + } + _ => {} + } + } +} + +impl Transport for Simulator { + fn write_all(&mut self, data: &[u8]) -> io::Result<()> { + self.log.push(data.to_vec()); + self.handle(data); + Ok(()) + } + + fn read_some(&mut self, buf: &mut [u8], timeout: Duration) -> io::Result { + if self.out.is_empty() { + std::thread::sleep(timeout.min(Duration::from_millis(5))); + return Ok(0); + } + let n = buf.len().min(self.out.len()); + for (b, x) in buf.iter_mut().zip(self.out.drain(..n)) { + *b = x; + } + Ok(n) + } + + fn clear_input(&mut self) -> io::Result<()> { + self.out.clear(); + Ok(()) + } +} diff --git a/tests/fixtures/r01_elec.bin b/tests/fixtures/r01_elec.bin new file mode 100644 index 0000000000000000000000000000000000000000..dfa7ab0e04f72c789fb7e1b7f435b306dc720030 GIT binary patch literal 1584 wcmZQzfB;SJG-u04t+q`~Y>uL09!~sU`0Sxlqts{!jE2By2#kinXb3O>0EeXpO8@`> literal 0 HcmV?d00001 diff --git a/tests/fixtures/r01_meas.bin b/tests/fixtures/r01_meas.bin new file mode 100644 index 0000000000000000000000000000000000000000..59a840c74ff9dd1594fedda64acac4e71902be2e GIT binary patch literal 3904 zcmeIz`#;uq9|!OYk*J~EizKYEHE9vx9rapscS z(-;naopi44&;{=0_(6`p?;2{){K75Z7MDDyB;Kw3E%?#~w!>vWG-^61;^`}k`+I%ZhHa@_1#=b$x{Sn} zx~W)l|2=W=tq6{%o@UF_+rE`|Ny&z%Z)%gt`iMd_!u*fs$SDbzpO?JJKhs=*j@(NW1dl?+q6bpNr%+#Lz+vkeC=He3llA$qoV$Um!VHkz zsaO*rL7GPrUg@3(FET?~9*N8_jbXh_z?;G+jI_&n~msa&>aWmtqEx9 zJ&!ka7f}B?89&-eaIWMc^tn{1cBi50d^!~UGGXg@9ZL+dVb+`r{+D?O>M6j8LlL~L zltB0S9qf5gj-%aoQ7^4Rp0EZMH}9cR`2o(lJVa}7Ew)G1VaJ(z1O_yqh-rkcVH4`) zo3ZY0Gt^EzLdp6T?9FXKB3iMwuNB79$GC9l2|lE4&{*>n+RD#xd*$!YS=o-GavkvL z??6?-bDT=*gy2jUhQIBGvR4mO1ijdz(ucq&ebBwsk5!%n&{Q47Q0gFNt%mSx^$-@g zVVD#Q!%%kwXG2FIogP8w{!zFOj6%wwLh9*AiGtlc6?}h#b=d{CGSTVa3t- zbT$fwrjbzSh=5(#X$;&sg>l|VjC>yio!KM!)cX*wJ@muB%)DW6aSs;OxnttS4y+J6 zP*YJ`}u-5fo#Dwf7A$qppikZ!PF_t%6g88YbLS(crig zEqfGjL4ya?>^a&Zlu>EjD76mhqYoWAsK@5V^o_WIo`}3hZC6*&*jGg~MJ4G#$1GrJcIRsdL*QdbP}l7U%D#@2G!9 zJ;I&o>ZP`{WR#&{TP>-_{3a^b^Z|X_q)+FUuc50?tfK!Gte_zV%Jl6P1)8|`4M{pS zMR>IX^{i!hMK$%ecdZv(l5GPDC3Klx&?-a%uZ5En8 zT_G$REEl-AI|)2X>#gHu%dGt(&u{tLJb}eU76lds76lds76lds{!apTL_CCv{|D(R B`M>}G literal 0 HcmV?d00001 diff --git a/tests/fixtures/r02_elec.bin b/tests/fixtures/r02_elec.bin new file mode 100644 index 0000000000000000000000000000000000000000..4b4d93259e8296a361bb1987e30de7b929580315 GIT binary patch literal 1584 zcmeH{{ZCU@7{|}KrKLb`dqqUS1<)aiSqXw0NKfy%EgBdb7$5-&K~|Kv#VvDz2{KXG z41$0ovWcJ~3K0SVzC;{E=YVAlki-oY7y}e!Q|E5qpit_Wk9P=f~&C=lKHg zPy8d<3k$tFsPEGzqTZ+I2vI0Z4{QYMg2kW!h~PzY=#zGVHyjPo>{DggK5le&$5W zj>>vv8T6lYwtQHwQ`}R`D|{IplgCss)yx&9gK1*wm>MRViC`G!Cq=$Ospyr*%YUO& z=rI|RwK>sF$&NQ17>6|JW&1J721&HI(r!q!K)ppJ!7|VxOb{6fw(Vc8TN<#+tnV%s zF7#VmEV}uQIghz4^K(&m$M5Ge_%nPr zKg;{;3-kv4Cc_njhw*}Oqp8mnW?nWo%tk#E(x=O6n>+c1+!l&J zBYXrufFD5-gP1$YDpj|A`v8= zBoUef5DkeWhKelRF#U@qta1uzL*hiNbzSYRUD1oNN|6jL{$ z6-cQ2@C$ek*1!%}4~O7uH~O@Nr7djcj7=%G-09IKXGR_z$Lc?~7K z2T}FjGwAjUi|WY02zvR~HkEo|FIx5Nv8qb)1RZKTp-TPrW8_g6i*^ae(b;AZlKV!Z z#DWpktG)}UG0PR%*2qv%jx|J6cM^r#cdCx}>Cktdw}x!*mLfW;Tr~~G(1dYZmD;)+ z>)&3HWYDm~&}{TGHkblUcg>k*^IYA0%!*XE7V;L6m9~y9om*qnxfPet&D^Ewesw=`A?@go^vaMTt*Ohj8{v2FDfpaVOnfaK`Qc zF5ydeOmYLb3W*n+`X!_3f- z$75xETW0Ou%1h2Dn3vgY%__0iYA=vhnEh#4bkl^u`C~6`aX8=FY;}=Uj9nISxl}+} z?RJs(>oWezb6eh$h0U?3R?g(=tTMQ#L*?A)?J}CIZTY z#<5Q1WmF2Mu2IM(zLOFD7U&7TTWxHoOP`?DrC(s8Dkp5pJjm*@X2%pr3a6FX^8(yB%XS{!^So5@vtRLDO6hyZLF;bzjY_ftfH8wQfp>JrcZ)nOh z+F@yIVQFIV=jy*rc=$+L1gg4OZRoV&YjVB(N*@QNyygZIeRP2NG*FA=#yS#F<3(ay zoI>V{tB7ddF!8>oNRzrY(_LCZ+Hmdw&A%5!E4L=ms-uN;m7tmC@kVI}CyQ!14V*Z% z6}sL)i02+$_VB}*f*{zOjKK@fOl+Ph#ru$_@K@+Xy4M_B%U7^D1M2KsZ(Y{txeFSN5UDUe-nI$(q)9vU(TxvR=Ns*)kIc_GA#p?p|ZgZpqSTRVp^I=J(dJ z@@cEt`ymQ!wm^n0asLC`b!LzjF@hi5df-bsu)?kdYf~E_@~VVVb}{@;=OZlXE;2*X zq2iQ+nb`ywhQ?v%R5TJ-ML1r3zdi~T4$;ugjlp}< zIAkuyL$E9n#-_>W3roR;g6B=V#SYMO_<)inIq<$avHwzK0_5dCyO5j#j zhN6)Q99s}!u=^3L0TK3%=sofnnf_uVA8W#_`xD3*J;j)2GhBaf zhI#fglsdK`r>6y116$Fk)`s}HHq?auj69Ea95;N9-K$<;7w;twynhMF_Zf zf5DY>2_(s#XiR>EfS@kKeEk}I7H_a#u^V4@bmMtk4^q*K6iF|nPW*~^nLap$_rX`D zAAfw;kA$gyC>|a_diMZQ90p-oGzfXkA*2KkVb$yqnvV}dW@Z?*r$%5uHG=Tdqv+T; zhJoedkQ*CEe&z&Te>#bR^OLxfKMCK;N$k5n34Z7#;(LbCounX99{dz zQQ1BQx^4{XnNe)B9zmpF7@wOC;f&%SdK&w&+`A7!%YQ}fLJ#(jbz}bU8|-=51--#e zG)qgMuiAl~DlgGK)eg3*4dU}H@Y>dl$*Lx7w0sQjoAo#{TZ0+5D%6#Va7V2IU-*?m z(WDr*Lq(|8DS)Q?kN6}q7w5!xp)Pj^Z;%1g&c_`vUjPESq6ZvcI`KRVc zW$*-o_=*_GeNMzuHblIJAx)di$aK^;qF1L&Jf3NiN`;SzTemVE~D#ZN$?InEg@-+VW2jP6drh|ORIWxW_ yhsWR0pJ=7}UwNzhU3^Pf=N$9D%>!6EWJzF2U`b#}U`b#};QuHf67cYE;r{^0HUgsn literal 0 HcmV?d00001 diff --git a/tests/fixtures/r03_elec.bin b/tests/fixtures/r03_elec.bin new file mode 100644 index 0000000000000000000000000000000000000000..b6a1bfb8dd4fe2942cfb79eb2503d373b0d6d4bc GIT binary patch literal 1584 zcmeHH`%hbC0KMObg~C!{j#ta0w8$%i@kZd@_PcEmDhrTVCAh7Cjz_XB6K1kd0Y}il z3?MRs8<4$p#2JL41H&W2)PM*IV@x(?ZYeDkYAanCkMX!)W&gnb0X@H*A5LPB z;zclmCcAjfBYQR1>e#R^lsE8lyvwcq5eHgaIqvBmm7bUQ{er7rA9#y=fbV19Vc|`` zB+-b-UwlqnCTd26eF)37dGyRm9-y=HM+xowUzJv7!X z=Pbn;JQhU@@9W!j_vh!e9Bsf{t%j%RXO1xnM#f|?Ma)M`3!`QD8nxz`rg+X-`dRZSzN%jvJ!k9|B0<^6Pt?NZOC?LQKyg9watw)SLS}vJux(!(k$*zO&fXJ zf<144Y{12~E!!4R0yKmpkx%3RGx!??0gWIT z`orhj7?oR#zmq!G@zC#K$s@sH({-WV-;=+;I0osE$geyAXOhGQk_H`L_$GY2I+qk;71=qYtQk4o-n zq%t~6$>zRKDN#`>$bRD%3G@DphdYlSOR8S+b zb@FPj8x=W2P`#PokfVYGQs4LoY2}1b#=pBsHT{TmEjvPXS7sy4%A8sos@2aA>h9<- zE{rYWrNreD*P+*?hO8nkUh^ouJ{^#sJbTqZDIxq zoJ!;aQ6@CR50z)<_M^)Ivoc>l6)L+?DO1Gcp^VHB8MpBWTBzBkl^b4YD$hWNL~v30 z>|^?(EETcogY_&V63cxy4f@MMnZbAT6un4HZ5R8CP h@H}(@TTleOU-SmJ=0Y@+=1>`WO0I+f4uf literal 0 HcmV?d00001 diff --git a/tests/fixtures/r03_meas.bin b/tests/fixtures/r03_meas.bin new file mode 100644 index 0000000000000000000000000000000000000000..df0334fd6ea2241fe8388d5016ab8a062699a92d GIT binary patch literal 3904 zcmeYWa1J&zH85acaAfoPu*2JZ#}03Ai(TH{D|UEC|JcFAy<;Oc!!QQkTHCxce{ab4 z`k~~^{X>S|$iT=<*T6{Ez=Xlj%*xcj%GhEU`+n4GqaiRF0;3@?8UmvsFd71*Aut*O XqaiRF0;3@?8UlnvV4pLCL$eD2%3K-o literal 0 HcmV?d00001 diff --git a/tests/fixtures/r04_elec.bin b/tests/fixtures/r04_elec.bin new file mode 100644 index 0000000000000000000000000000000000000000..03a235bb830424815151aeba909d7fd5418545ec GIT binary patch literal 1584 wcmZQzfB-SyG-vG-t+s-dY>ts)9!@J+`0b%mqts{!jE2By2#kinXb3O>0N7athX4Qo literal 0 HcmV?d00001 diff --git a/tests/fixtures/r04_meas.bin b/tests/fixtures/r04_meas.bin new file mode 100644 index 0000000000000000000000000000000000000000..adda1fe6313cd80fc42affbfd340d3fbf31cd49f GIT binary patch literal 3904 zcmeH{`#0739>zDKTuwEtaY+}E+bFqL?CuOjb$LG@&e) z;q0M0!fdxexkQnOp`jw}a+h(7jqQ>$F`ZS%%wN$Dp0(cVz1H)~`&qB`toP>a0uMV| z3kx2PRXWx*@@TG9l>mJ;)iA=Q}p_-*V93okjXZ zg=DS!=cIIv_@Ax0;ZIWGDuT9R2G<@W=FC=>bAe~exJZR0&Z;$yyLh9JGxy5i`uXR$ zh3l_CcV8Cw@AZk?f1QK4J?44b@~|py%c4Zi_-vVwH>ddV5rKHvRJd?|x}ZZ~#s2Nl zz%t=>In#@U86>-+qO2P`yFALwS7I<7sfv9OrkIAdfAsXVSU)0pLw!H?_AheFOKb#ZeVpo*0Bna2JEvl z%h<4!>TJm8s_Y4QMfPFsd*sEw!LRD0pweFO+S(v5eS+bQzr%)Ci3+#d`1Z4Wg!p8` z&Gi>F=p;k(FbQvViBMV>58-4Sc2&jVMOzGhIvs;ocVoaf#^UXQI4He~!*=6%)LlwI z?+OtjhJHqeGzk)|YZwVihRMqm*arQA;eTa7w=N6Lq8vmYx&g;k1+XqCLbFi`R-U?p z@5{=tO~w*$nU67TmqxiuRH=7-zS` zE~NuzqE76J>q11t3w(XD8?ih8fU#8%T4sA-SkQ}n-#)l1^`j@RA1&SknEo&Tar{eU zY7D~o{M?KTqR3|m8y*kg3wtRPGo^6X9>&2-!^l+}!IBFja8MbALHsBlY05B^DTC*> zF&r@%NB8@2sO3!HKUR|{PMn0SWfB`ECo%nO5*g8x&?l3)_;LbSNfTJ@I)U@!G7NAQR3FfMCIVbwK=y>t1_a|1}@_hUxC4_tf?{5!j$BKHD; z8l51^+tI4i3fl$EINvFO-%m}rv9=Mt#gAZTS&x<1AD}>?2GYG%C@HVNl9lD)g_Yva zTvzsK6eDbBAuM8UqPHR!QzO~9sg;R>&0?s8rsCx7WYkPug_=zg(nCbhtBr?LYpy5z zqp|qE<5*_u2XqHd($gvlz%B5a4VvF zV)N*=wk(><7t^7sWE!85L|1qu(4%TG^wZ`@YE*H7{uLfZ5A_Ap-jV<+Cp$o!*xfYn zjR$>D>q`65gmku_PiuW`>2E6LH2kd*m95aDhDUYiy?5#~pi+(Q2w6yX2gp;|xmj}a z#yC;V9UzHok99!_@{`R$=nqts{!jE2By2#kinXb3O>0MYjb0{{R3 literal 0 HcmV?d00001 diff --git a/tests/fixtures/r05_meas.bin b/tests/fixtures/r05_meas.bin new file mode 100644 index 0000000000000000000000000000000000000000..797c4c8cf8a44003ab904ec37fc9bc78f4e01b6b GIT binary patch literal 3904 zcmeIz>06U$76$MD1GunQrJ~Y;6&Iv3giRpfeV+S$1E^qSu~2o2c3e^~QK_H>2FHRU zAXG4xy(mS4h&vJpVJU7Pr2-;`C_)jCHEbzTmx?;={1ej;++WUhoiF#feqYXNU(x!N zPJBL($Lj5Bdg&cdp@^F4QttI}fx_EDS)@JlWr@!7#xarO_U+sbMWM$kd9m=&=LO_y zdJ$Q^ejWLFao+!?t@CqIHai`B$9(QtT^<(~T*+;7E$70=GC7}TXE?!P8Fw=(pXA_oQ=Mm~97Wpe;ndxFZwq47Z+VkyK+VJgd z_>Mfgl>)w_z~27P>c33d-?X}hhe(An@8aCd*BCQR1_zjrqDq-=Mu*%kv?URipOYeW z965SRN_MDf$hik2B;bM}9gAN^Qw%-mx=Jy99TrCud$Ori!wh` zY)P{Q4pDG{fruA`;Lw~{{9coSby;V@nwDWhbUk{0?85E(mzdo$jcu5CpH+lfvf>^- ztGLdv#(`_t^J;%K;n7A`XMYfDnHI!0hHYY1k)N{ppRQ%c3prNH*M*g7Y*>B6#q7k} z1+1`dHfvZulN}1yWu+(I!FAhjSkO2Gby7D(k*zRGZo;O)S`pc$V$m4h+JB|zX5|j){klJwq(~VLf{w5XM zEYk7gNCqbQve2V<5_+HI!1_)u+%`&KF(V&$?iIkK;Nl0utH;|BZ3x|c(pf_qTV_7XK_Wgv1sdWfV{TXdhck!!NJ(LCwI6T?_ z|At09Ot}Z`pe9I6?qk0EKD>RJab~a?2Twh~bs!wL^aT7s!uw;KRL7(8+dUg<%(7HFe>>q#Hr&pW>ZC4;mCbh+N+bwW=2; z=z~XYAA)%Oa1{4r_oIF!tsX#G=>YPU4q|r7Ant0b(Hg48o)I-v;X`<>KMYy^FgiDk zK#xBPt?6SZs~m&rCmQ4xYp`Nm1Bcfdv^>^eYqkbHz8V-zj$z)#F(hmrL(Qx)BwZRs zq{S#g{y749>@Wn`LnzHrV|UUZ^0o}X#=IX#>w4k!RS!;m`4o9R-O#G-M9=IenCJ8h zCYUw|M6HMtJ;WM83zjc>fJJ>xn48>)BWCrGpQrByL$iugSz zkSI^awwK>R;gkT6&N%#f>I{UTJZuOSxX1}1#P8xc^c#yi7chle3wo$tnCDko#pjCr+=wf<<&UjHqWgiyP zpQKl4v&99Pbmc6~h{~mQ*4cDfNgDP3SVE1f66qHyvDC9Bn#S#npv4IxbjgsI?seEq z*B1uTfB5=P-F8n}QAenUvornjl`Yk(v7&Z2Kcd=Q3uvj(gznKZqT`*@=z*s?^tYx- zvetQ=yy@sC`b#^A!8;`}imE3jvDL(Uppv+FmJoT}WilRcj`%5ZNxmkNWHw1iK-Eza zIuT8RlfuYlftVD%*+}+&y^gHT@gTvE8FDPdi3HZz5Xrxn5|~(!c@C!JTADGbIjK)N zcJYWwnwPk`MESNZn5tHJg#jMyg=*Ab`chl-CcS~J%+AT>O=N3Qe z?{+eMuA9SjxlneA2%Yu66YL1Q?edp-0#k=f2}}u02}}u02}}w6p9HEzJp9M~zf)!T A4FCWD literal 0 HcmV?d00001 diff --git a/tests/fixtures/r06_elec.bin b/tests/fixtures/r06_elec.bin new file mode 100644 index 0000000000000000000000000000000000000000..59a3fdc8193d4b500bf1f55048b24ec7d7796ed0 GIT binary patch literal 1584 wcmZQzfB-w6H0RU%T5Z=ivpGhJc{oiJ@^c820z`d4IoqYfdqwDWPG?7|BU=TW2qHnuJ{; zLQ+ZYk%~lwOc$3*WL#73a&KZZNufE-{1Io(51wD1wLWV-m-SlDTAzPy5q)d2!O)P$ zW92<-#;vv&75FKb6>io|FR)r!pCh9%o;NeDdRQbCxN#M?vMp6~^DG{_q?7$|Ib_Pt zh74$@{FPnI$B1`!44NiWxuLx&TG*Ja`8PPnlMlG^(evCAuR<~JODHG}iMYWv;?*ZoMPq$J_RqKfL=}p! z{bLLHkQmQttKa5$kQetH{{cP;wQP%BkEqnHSH$Db5(hqXX9s8!cisOCmLAm-cZL~= zD+Q~>l4>c(`)A5V-e%jcdAsIX^7sNvV(l)fED2(=PRO%o7b{UCLn9MCLnA#yW1hgo z+|by3z2MK$f1B{~UuzyPF-MrBQYn0Pn`8dH>k=b)QO|T%DH6F*Gm`p;8&UWaLQWsf zAff%0#LxU4Nt;xnleTN9hx|s$y6>UQAA@N{Q5+4JpGUiso>Q;qZ|Ej}dHCoo1?!^= ze;dGd-3}Zu@Im?IAlU4RhHy<9W~AOlltvZ0eY>zH_amM<&1Q{)7qgR!nykQAz*Y(g zTb;X!`J6MGV(-N6#x~Yl-kMc%; zCLRg*FQCvP2CoL9kj#%n%|ry87e-)yb~uXr!@+t)AXD!w>a-(~ZXJbn$eJbhP##1p^ZnPM%Nj9SFI)j`>~9wv$n5R5foMQo?hQ8g?YDq*qqKE_t& zLB>7@^Q2jD$i0rKmJDPmTt${R1!l(+@%d3al;q-I!d}4eu^9B0eYqi}v-se621AJ< z={~O8{I(vB@&?e2sMLV8pqmvZ}V($Vk? z>RO&cy&bMl(Y%XPzd4$wrH0dqz|%B1Ac%@{exmzUNa&p9-n8A+oqC;eruxL5o?2#0 zt!95sQw=D+CNZT3FAS*Ib2Z(+L7lq#tI+p4%G7(7BCQylMQ_N+(w*8<#H?eKm>La` zx|VjrZ*C-3M%Bc+p^QkI?vZHEJEYYsi=^0PkmzSgM-cYP=E3brFI>6^&+3psKw){Mj%84xP3Lw?@2l0?`nCBHtNPt+UdkSZHlvU=}l z##H$|!%7DkcdvFvrKFZwaIKW-SyjNScD~7EMx-)LA(xrED`J??#xSNLKZq$G^<$RL z+|PImU6@h}8-`v5voO+#iGQNStY4GXt!z1ONsw00961 literal 0 HcmV?d00001 diff --git a/tests/fixtures/r07_meas.bin b/tests/fixtures/r07_meas.bin new file mode 100644 index 0000000000000000000000000000000000000000..ff6c36570b7e9c5a63020c4f5f65cca3f6346605 GIT binary patch literal 3904 zcmeH|`#0738pn4DxlfWVE>Ut#_TKh|y}zH&^X%{5ZigYdm^xM|QE3K4O3UgtVrr;U zQ%SNJgk6krDM~fMp%Xbpk`cKyCdVY5E=ba;^V9qVbAC9U^{n+g>v`6Czt?*G^7dRQ zUnLT9xg3s6BmCaD_q=yk;GC&D0q$Q9G0=l5;-RP4{%S=$AUu#O_k6 zw6CNg1%WjEZ~6b7TOYoqCpdKwJGX${xG$HjXe?(>1l(XBHRQ6xy}9g*E*0yg@gu7i zo5Y?9^OSwqmCCN&l+E@J2C_SKRBTU8E!&Zn##X6x6ra4(Qx?c|ClAOEdVD6Y$*jar zH~A7>#X$dRntMH$b*{U?a(eX@G0Cp7-mWxRczeIR(E5oytU*h0YTf}^ba*zqMI!)v zTMo)YN)qKE!9ntE=Eqo0imNAQb)W|)*vyS%!E^hh`^VyQ`65Ry-;pci@Wc|~#}@tZ z{ipAZT~Ea^ibWEa0Uv2p=8)9%*-9qzP7c#uJ;2x;T0jmzl9GI72%*c55piBQ84T08NEDSNnVW~0N z1R0=$ zYf|CqhBHvtm}<2ZOGTFWd&&|#_T^Gk zXRWaIgB3;&0DK2Vn;GwLJhcnFh=oiMvmHB);Gt5Ubxidb= za7NWjXPj^o;IeE1>Mj#vRf!OJ3q;uXr3iBiMOfb@2q z#y6M6*k2~bu8+Ikw_+^VCdRnW#i%O~W2w3rJsU)5_)*7tOo$mfg_zkZ!27!ecw0|^ zM%$dxuZoX*CV1Fs!NW2aE_$F7{!CY3q>Urij5^@pPxdJGvctY68$7SD#^Ew6yl=S_ zrOB4q{_A246`5mCvndw)n_$V>g}75XALGpDp^?E{G+Q(WE0-DIkhvcA&CtPz_h;kb zG!3L*%tCAPndtWP1B_(8gAU0Ul$X5(<+bPFQ8Waj&juhG`ar+B3$oUBfbqb6*s<;| zNHQA1@OC}C(5!(Md#}T6lPjQkuN=-t{seYeh2U_f0Gj=BL8mnnmTXLi$5W@lxA6qz z+&BuqbQ}Rc{Umth^$m3S?}b%vyWpBE5*)~OI7dUEmLCLqyVgLbzz=?3=mjP`Iowtd z=!_9VRVxpwwk!vO6*h2c$`a}_%s^MZ5Uk}!aBiIe6a;HSolG67%s8OyJ4%DRhv|Oq z0B!rao93K*K)7!hbF5csQY*bO$=T~e{1ohmapBZ%Wg`49T8E%J}2roX-n{7 z#?;@&fUZi_q*LV_n*G&lvX1{R(w)~s9{aSD1mk9sG+IX*6jj9bXbDlTQjt8nY|`AB zM#58%lan)!kje`QB2>dMP HV1nX5e&@ PathBuf { + Path::new(env!("CARGO_MANIFEST_DIR")) + .join("tests") + .join(sub) +} + +fn fixture(name: &str) -> Reading { + let meas = std::fs::read(dir("fixtures").join(format!("{name}_meas.bin"))).unwrap(); + let elec = std::fs::read(dir("fixtures").join(format!("{name}_elec.bin"))).ok(); + Reading::parse(&meas, elec.as_deref()).unwrap() +} + +fn golden() -> Vec { + serde_json::from_str(&std::fs::read_to_string(dir("golden").join("readings.json")).unwrap()) + .unwrap() +} + +fn text(name: &str) -> String { + std::fs::read_to_string(dir("golden").join(name)) + .unwrap() + .replace("\r\n", "\n") +} + +/// Python values in the golden file: floats as {"f": repr}, lists, ints, strings. +fn same(rust: &Value, py: &Value, path: &str) { + match py { + Value::Object(o) if o.contains_key("f") => { + let want = o["f"].as_str().unwrap(); + let got = pyfmt::repr( + rust.as_f64() + .unwrap_or_else(|| panic!("{path}: not a number: {rust}")), + ); + assert_eq!(got, want, "{path}"); + } + Value::Array(a) => { + let r = rust + .as_array() + .unwrap_or_else(|| panic!("{path}: not a list")); + assert_eq!(r.len(), a.len(), "{path}: length"); + for (i, (x, y)) in r.iter().zip(a).enumerate() { + same(x, y, &format!("{path}[{i}]")); + } + } + other => assert_eq!(rust, other, "{path}"), + } +} + +#[test] +fn parsed_blocks_match_python_exactly() { + for g in golden() { + let name = g["name"].as_str().unwrap(); + let r = fixture(name); + let v = serde_json::to_value(&r).unwrap(); + let keys: Vec<&str> = v.as_object().unwrap().keys().map(|k| k.as_str()).collect(); + let want: Vec<&str> = g["keys"] + .as_array() + .unwrap() + .iter() + .map(|k| k.as_str().unwrap()) + .collect(); + assert_eq!(keys, want, "{name}: key order"); + for k in want { + same(&v[k], &g["values"][k], &format!("{name}.{k}")); + } + assert_eq!( + r.electrical.as_ref().unwrap().harmonics.is_some(), + g["harmonics"].as_bool().unwrap(), + "{name}" + ); + } +} + +#[test] +fn report_text_matches_python() { + for g in golden() { + let name = g["name"].as_str().unwrap(); + let r = fixture(name); + assert_eq!( + format_reading(&r, false), + text(&format!("format_{name}.txt")), + "{name}" + ); + assert_eq!( + format_reading(&r, true), + text(&format!("format_{name}_spectrum.txt")), + "{name} spectrum" + ); + let n: usize = name[1..].parse().unwrap(); + assert_eq!( + format!("{}\n{}", format_quick(&r, Some(n)), format_quick(&r, None)), + text(&format!("quick_{name}.txt")) + ); + } +} + +#[test] +fn csv_matches_python() { + for g in golden() { + let name = g["name"].as_str().unwrap(); + let want = std::fs::read_to_string(dir("golden").join(format!("csv_{name}.txt"))).unwrap(); + assert_eq!(csv_header() + &csv_row("T", &fixture(name)), want, "{name}"); + } +} + +#[test] +fn float_formatting_matches_python() { + let cases: Vec = + serde_json::from_str(&std::fs::read_to_string(dir("golden").join("pyfmt.json")).unwrap()) + .unwrap(); + assert!(cases.len() > 1000); + for c in &cases { + let x = f64::from_bits(c["bits"].as_u64().unwrap()); + assert_eq!(pyfmt::repr(x), c["repr"].as_str().unwrap(), "repr {x:e}"); + assert_eq!(pyfmt::g(x, 6), c["g6"].as_str().unwrap(), "g6 {x:e}"); + for (k, p) in [("f2", 2), ("f1", 1), ("f0", 0)] { + if let Some(w) = c[k].as_str() { + assert_eq!(pyfmt::fixed(x, p), w, "{k} {x:e}"); + } + } + if let Some(w) = c["round1"].as_str() { + assert_eq!(pyfmt::repr(pyfmt::round(x, 1)), w, "round1 {x:e}"); + } + } +} + +#[test] +fn pcap_round_trip_and_report() { + // a capture with two readings, written in memory + let (a, b) = (fixture("r01"), fixture("r02")); + let block = + |n: &str, k: &str| std::fs::read(dir("fixtures").join(format!("{n}_{k}.bin"))).unwrap(); + let file = pcap::write(&[ + (pcap::Dir::Tx, vec![0x8C, 0x13]), + (pcap::Dir::Rx, vec![0x8C, 0x13, 0x0F, 0x40]), + (pcap::Dir::Rx, block("r01", "meas")), + (pcap::Dir::Rx, block("r01", "elec")), + (pcap::Dir::Rx, block("r02", "meas")), + (pcap::Dir::Rx, block("r02", "elec")), + ]); + let msgs = pcap::messages(&file).unwrap(); + assert_eq!(msgs.len(), 6); + assert_eq!(msgs[0].dir, pcap::Dir::Tx); + assert_eq!(pcap::readings(&msgs), vec![a, b]); + let report = pcap_report(&msgs, true, false); + assert_eq!(report.lines().count(), 2); + assert!(pcap::messages(&[]).is_err()); + assert!(pcap::messages(&[0u8; 30]).is_err()); +} + +/// The `--parse` reports of real captures. The captures are not in git +/// (`captures/` is ignored); the test runs where they are. +#[test] +fn parse_reports_of_real_captures() { + let caps = Path::new(env!("CARGO_MANIFEST_DIR")).join("captures"); + let mut checked = 0; + for cap in [ + "usb_capture_20260204_123655_hub1", + "usb_capture_20260204_134301_hub1", + ] { + let path = caps.join(format!("{cap}.pcap")); + if !path.exists() { + eprintln!("skipped: {} not here", path.display()); + continue; + } + let msgs = pcap::read_messages(&path).unwrap(); + assert_eq!( + pcap_report(&msgs, false, false), + text(&format!("parse_{cap}.txt")) + ); + assert_eq!( + pcap_report(&msgs, true, false), + text(&format!("parse_{cap}_quick.txt")) + ); + assert_eq!( + pcap_report(&msgs, false, true), + text(&format!("parse_{cap}_harmonics.txt")) + ); + checked += 1; + } + eprintln!("{checked} capture(s) checked"); +} diff --git a/tests/golden/csv_r01.txt b/tests/golden/csv_r01.txt new file mode 100644 index 0000000..a6e666a --- /dev/null +++ b/tests/golden/csv_r01.txt @@ -0,0 +1,2 @@ +timestamp,Phi_lm,eta_lm_W,CCT_K,Duv,x,y,u,v,u_prime,v_prime,SDCM,Ra,R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15,Phi_e_mW,Phi_euv_mW,Phi_eb_mW,Phi_ey_mW,Phi_er_mW,Phi_efr_mW,Phi_eir_mW,Phi_e_total,CIE_X,CIE_Y,CIE_Z,TLCI,PeakSignal,DarkSignal,Compensate,Voltage_V,Current_A,Power_W,Freq_Hz,PF +T,483.7375183105469,57.40340042114258,5635.47412109375,0.005606670398265123,0.32931944727897644,0.34943076968193054,0.2015872299671173,0.3208470344543457,0.2015872299671173,0.48127055168151855,4.836654186248779,82.90641784667969,81.94468688964844,93.72439575195312,93.53913116455078,76.66526794433594,81.33158874511719,88.99320983886719,83.17845916748047,63.87458801269531,4.212823390960693,83.55355072021484,76.21843719482422,59.73139953613281,86.1976318359375,96.91849517822266,75.6298828125,1501.3740234375,0.0,471.6053466796875,686.2144775390625,333.9613952636719,11.230633735656738,0.0,1503.01220703125,667.4908447265625,708.2540283203125,651.1345825195312,67.85055541992188,53279.0,2154.0,2834.0,230.29359436035156,0.06537289172410965,8.406862258911133,50.02156448364258,0.5584115386009216 diff --git a/tests/golden/csv_r02.txt b/tests/golden/csv_r02.txt new file mode 100644 index 0000000..2b84c4a --- /dev/null +++ b/tests/golden/csv_r02.txt @@ -0,0 +1,2 @@ +timestamp,Phi_lm,eta_lm_W,CCT_K,Duv,x,y,u,v,u_prime,v_prime,SDCM,Ra,R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15,Phi_e_mW,Phi_euv_mW,Phi_eb_mW,Phi_ey_mW,Phi_er_mW,Phi_efr_mW,Phi_eir_mW,Phi_e_total,CIE_X,CIE_Y,CIE_Z,TLCI,PeakSignal,DarkSignal,Compensate,Voltage_V,Current_A,Power_W,Freq_Hz,PF +T,479.5904235839844,57.03839111328125,5661.3740234375,0.005495334509760141,0.3286939859390259,0.34864285588264465,0.20145727694034576,0.32052600383758545,0.20145727694034576,0.4807890057563782,4.661009311676025,83.03077697753906,82.11673736572266,93.9566421508789,93.32406616210938,76.64042663574219,81.5961685180664,89.55091094970703,83.03118896484375,64.03005981445312,4.829061031341553,84.0609130859375,76.2067642211914,60.158180236816406,86.46263885498047,96.80621337890625,75.96227264404297,1492.0255126953125,0.0,470.2662658691406,679.6720581054688,330.6041564941406,11.205649375915527,0.0,1491.7479248046875,662.0042114257812,702.18212890625,649.8577880859375,67.88436889648438,53165.0,2310.0,2834.0,230.289794921875,0.06533221900463104,8.404895782470703,50.02182388305664,0.5585951805114746 diff --git a/tests/golden/csv_r03.txt b/tests/golden/csv_r03.txt new file mode 100644 index 0000000..d3368b2 --- /dev/null +++ b/tests/golden/csv_r03.txt @@ -0,0 +1,2 @@ +timestamp,Phi_lm,eta_lm_W,CCT_K,Duv,x,y,u,v,u_prime,v_prime,SDCM,Ra,R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15,Phi_e_mW,Phi_euv_mW,Phi_eb_mW,Phi_ey_mW,Phi_er_mW,Phi_efr_mW,Phi_eir_mW,Phi_e_total,CIE_X,CIE_Y,CIE_Z,TLCI,PeakSignal,DarkSignal,Compensate,Voltage_V,Current_A,Power_W,Freq_Hz,PF +T,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 diff --git a/tests/golden/csv_r04.txt b/tests/golden/csv_r04.txt new file mode 100644 index 0000000..b652785 --- /dev/null +++ b/tests/golden/csv_r04.txt @@ -0,0 +1,2 @@ +timestamp,Phi_lm,eta_lm_W,CCT_K,Duv,x,y,u,v,u_prime,v_prime,SDCM,Ra,R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15,Phi_e_mW,Phi_euv_mW,Phi_eb_mW,Phi_ey_mW,Phi_er_mW,Phi_efr_mW,Phi_eir_mW,Phi_e_total,CIE_X,CIE_Y,CIE_Z,TLCI,PeakSignal,DarkSignal,Compensate,Voltage_V,Current_A,Power_W,Freq_Hz,PF +T,479.8302917480469,57.09168243408203,5655.5185546875,0.005520321428775787,0.32882028818130493,0.3488074243068695,0.20148152112960815,0.3205926716327667,0.20148152112960815,0.4808890223503113,4.696867942810059,83.00994873046875,82.22040557861328,94.05892181396484,93.2469253540039,76.50690460205078,81.42030334472656,89.34086608886719,83.16636657714844,64.1189193725586,4.818240642547607,84.18575286865234,76.09269714355469,60.0699348449707,86.59054565429688,96.74826049804688,76.01618194580078,1491.9422607421875,0.0,469.8638610839844,679.650634765625,330.7580261230469,11.141565322875977,0.0,1491.4139404296875,662.2772216796875,702.5333251953125,649.290283203125,67.87500762939453,53051.0,2228.0,2834.0,230.30111694335938,0.06532319635152817,8.404557228088379,50.02182388305664,0.558664858341217 diff --git a/tests/golden/csv_r05.txt b/tests/golden/csv_r05.txt new file mode 100644 index 0000000..e2667e4 --- /dev/null +++ b/tests/golden/csv_r05.txt @@ -0,0 +1,2 @@ +timestamp,Phi_lm,eta_lm_W,CCT_K,Duv,x,y,u,v,u_prime,v_prime,SDCM,Ra,R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15,Phi_e_mW,Phi_euv_mW,Phi_eb_mW,Phi_ey_mW,Phi_er_mW,Phi_efr_mW,Phi_eir_mW,Phi_e_total,CIE_X,CIE_Y,CIE_Z,TLCI,PeakSignal,DarkSignal,Compensate,Voltage_V,Current_A,Power_W,Freq_Hz,PF +T,479.61688232421875,57.09785461425781,5655.04931640625,0.005514893215149641,0.32883065938949585,0.34880587458610535,0.20148910582065582,0.3205931782722473,0.20148910582065582,0.48088976740837097,4.689785480499268,83.1019287109375,82.3944320678711,94.21000671386719,93.1120834350586,76.46770477294922,81.47521209716797,89.57075500488281,83.24170684814453,64.343505859375,5.2721099853515625,84.44823455810547,76.06077575683594,60.25636291503906,86.82209777832031,96.66696166992188,76.29528045654297,1491.543701171875,0.0,469.8504333496094,679.9556274414062,331.67364501953125,11.56343936920166,0.0,1493.0426025390625,662.0065307617188,702.2208862304688,648.9866943359375,67.98677825927734,53066.0,2236.0,2834.0,230.29080200195312,0.06529296934604645,8.399910926818848,50.02178955078125,0.5586221218109131 diff --git a/tests/golden/csv_r06.txt b/tests/golden/csv_r06.txt new file mode 100644 index 0000000..1108e41 --- /dev/null +++ b/tests/golden/csv_r06.txt @@ -0,0 +1,2 @@ +timestamp,Phi_lm,eta_lm_W,CCT_K,Duv,x,y,u,v,u_prime,v_prime,SDCM,Ra,R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15,Phi_e_mW,Phi_euv_mW,Phi_eb_mW,Phi_ey_mW,Phi_er_mW,Phi_efr_mW,Phi_eir_mW,Phi_e_total,CIE_X,CIE_Y,CIE_Z,TLCI,PeakSignal,DarkSignal,Compensate,Voltage_V,Current_A,Power_W,Freq_Hz,PF +T,479.6141357421875,57.04836654663086,5654.22216796875,0.005528819747269154,0.32884812355041504,0.34884971380233765,0.20148463547229767,0.32060936093330383,0.20148463547229767,0.48091405630111694,4.7090373039245605,82.99382781982422,82.20687103271484,94.0466079711914,93.27873229980469,76.49690246582031,81.38878631591797,89.25926208496094,83.16966247558594,64.1037368774414,4.81308126449585,84.15076446533203,76.0714340209961,60.03883743286133,86.56330108642578,96.76630401611328,75.97416687011719,1491.4090576171875,0.0,470.1175231933594,679.6602783203125,331.024658203125,11.806631088256836,0.0,1492.6082763671875,661.95458984375,702.2168579101562,648.7780151367188,67.90325927734375,53066.0,2246.0,2834.0,230.29782104492188,0.06530531495809555,8.407149314880371,50.02182388305664,0.5589380860328674 diff --git a/tests/golden/csv_r07.txt b/tests/golden/csv_r07.txt new file mode 100644 index 0000000..fc59493 --- /dev/null +++ b/tests/golden/csv_r07.txt @@ -0,0 +1,2 @@ +timestamp,Phi_lm,eta_lm_W,CCT_K,Duv,x,y,u,v,u_prime,v_prime,SDCM,Ra,R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15,Phi_e_mW,Phi_euv_mW,Phi_eb_mW,Phi_ey_mW,Phi_er_mW,Phi_efr_mW,Phi_eir_mW,Phi_e_total,CIE_X,CIE_Y,CIE_Z,TLCI,PeakSignal,DarkSignal,Compensate,Voltage_V,Current_A,Power_W,Freq_Hz,PF +T,182.61920166015625,0.0,4936.84375,0.002135422546416521,0.3473931849002838,0.35774698853492737,0.21059946715831757,0.32531434297561646,0.21059946715831757,0.4879715144634247,1.5234547853469849,83.53800201416016,81.74681854248047,89.89591979980469,94.66126251220703,81.88838958740234,81.9393081665039,84.4315185546875,86.51227569580078,67.2285385131836,12.525043487548828,75.23241424560547,80.69010925292969,53.97742462158203,84.02236938476562,97.37865447998047,76.29852294921875,558.6363525390625,0.0,152.54922485351562,257.9691162109375,144.27931213378906,5.738129138946533,0.0,560.5353393554688,259.6396484375,267.3780212402344,220.3765106201172,71.05938720703125,55124.0,2518.0,2834.0,0.0,0.0,0.0,0.0,0.0 diff --git a/tests/golden/format_r01.txt b/tests/golden/format_r01.txt new file mode 100644 index 0000000..3d11b3a --- /dev/null +++ b/tests/golden/format_r01.txt @@ -0,0 +1,41 @@ + Device: HPCS6500 + Date: 2026-02-04 Time: 15:38:14 + + --- Photometric --- + Phi (lm): 483.74 + eta (lm/W): 57.40 + CCT (K): 5635 + Duv: 0.00561 + + --- Chromaticity --- + x: 0.3293 y: 0.3494 + u: 0.2016 v: 0.3208 + u': 0.2016 v': 0.4813 + + --- CRI --- + Ra: 82.9 SDCM: 4.84 + R1=82, R2=94, R3=94, R4=77, R5=81, R6=89, R7=83, R8=64 + R9=4, R10=84, R11=76, R12=60, R13=86, R14=97, R15=76 + + --- CIE 1931 --- + X: 667.491 Y: 708.254 Z: 651.135 + TLCI-2012: 68 + + --- Radiometric --- + Phi_e (mW): 1501.374 + Phi_eb (mW): 471.605 + Phi_ey (mW): 686.214 + Phi_er (mW): 333.961 + Phi_efr (mW): 11.231 + + --- Electrical --- + Voltage (V): 230.29 + Current (A): 0.0654 + Power (W): 8.407 + Frequency (Hz): 50.02 + Power Factor: 0.5584 + + --- Sensor --- + Peak Signal: 53279 + Dark Signal: 2154 + Compensate: 2834 \ No newline at end of file diff --git a/tests/golden/format_r01_spectrum.txt b/tests/golden/format_r01_spectrum.txt new file mode 100644 index 0000000..58ced8a --- /dev/null +++ b/tests/golden/format_r01_spectrum.txt @@ -0,0 +1,113 @@ + Device: HPCS6500 + Date: 2026-02-04 Time: 15:38:14 + + --- Photometric --- + Phi (lm): 483.74 + eta (lm/W): 57.40 + CCT (K): 5635 + Duv: 0.00561 + + --- Chromaticity --- + x: 0.3293 y: 0.3494 + u: 0.2016 v: 0.3208 + u': 0.2016 v': 0.4813 + + --- CRI --- + Ra: 82.9 SDCM: 4.84 + R1=82, R2=94, R3=94, R4=77, R5=81, R6=89, R7=83, R8=64 + R9=4, R10=84, R11=76, R12=60, R13=86, R14=97, R15=76 + + --- CIE 1931 --- + X: 667.491 Y: 708.254 Z: 651.135 + TLCI-2012: 68 + + --- Radiometric --- + Phi_e (mW): 1501.374 + Phi_eb (mW): 471.605 + Phi_ey (mW): 686.214 + Phi_er (mW): 333.961 + Phi_efr (mW): 11.231 + + --- Electrical --- + Voltage (V): 230.29 + Current (A): 0.0654 + Power (W): 8.407 + Frequency (Hz): 50.02 + Power Factor: 0.5584 + + --- Sensor --- + Peak Signal: 53279 + Dark Signal: 2154 + Compensate: 2834 + + --- Spectrum (380-1050nm) --- + 380.0nm: 0.0005 [] + 389.6nm: 0.0876 [] + 399.2nm: 0.3179 [] + 408.8nm: 0.7661 [##] + 418.4nm: 1.6232 [####] + 428.0nm: 3.0322 [########] + 437.6nm: 5.2464 [###############] + 447.2nm: 8.7276 [########################] + 456.8nm: 12.7905 [####################################] + 466.4nm: 13.6955 [#######################################] + 476.0nm: 10.7966 [##############################] + 485.6nm: 8.2842 [#######################] + 495.2nm: 6.7507 [###################] + 504.8nm: 5.4679 [###############] + 514.4nm: 4.6912 [#############] + 524.0nm: 4.4910 [############] + 533.6nm: 4.6211 [#############] + 543.2nm: 4.9149 [##############] + 552.8nm: 5.3253 [###############] + 562.4nm: 5.7463 [################] + 572.0nm: 6.0899 [#################] + 581.6nm: 6.3225 [##################] + 591.2nm: 6.4763 [##################] + 600.8nm: 6.5981 [##################] + 610.4nm: 6.7011 [###################] + 620.0nm: 6.8460 [###################] + 629.6nm: 6.9854 [####################] + 639.2nm: 7.1199 [####################] + 648.8nm: 7.2257 [####################] + 658.4nm: 7.2971 [####################] + 668.0nm: 7.3692 [#####################] + 677.6nm: 7.4499 [#####################] + 687.2nm: 7.5612 [#####################] + 696.8nm: 7.5899 [#####################] + 706.4nm: 7.5444 [#####################] + 716.0nm: 7.4506 [#####################] + 725.6nm: 7.2796 [####################] + 735.2nm: 7.0827 [####################] + 744.8nm: 6.7888 [###################] + 754.4nm: 6.4305 [##################] + 764.0nm: 6.0190 [#################] + 773.6nm: 5.6257 [################] + 783.2nm: 5.1849 [##############] + 792.8nm: 4.7472 [#############] + 802.3nm: 4.3186 [############] + 811.9nm: 3.9139 [###########] + 821.5nm: 3.4785 [#########] + 831.1nm: 3.0552 [########] + 840.7nm: 2.6780 [#######] + 850.3nm: 2.3105 [######] + 859.9nm: 2.0011 [#####] + 869.5nm: 1.7210 [####] + 879.1nm: 1.4606 [####] + 888.7nm: 1.2518 [###] + 898.3nm: 1.0460 [##] + 907.9nm: 0.8661 [##] + 917.5nm: 0.7120 [##] + 927.1nm: 0.5761 [#] + 936.7nm: 0.4697 [#] + 946.3nm: 0.3787 [#] + 955.9nm: 0.3071 [] + 965.5nm: 0.2300 [] + 975.1nm: 0.1782 [] + 984.7nm: 0.1421 [] + 994.3nm: 0.1106 [] + 1003.9nm: 0.0824 [] + 1013.5nm: 0.0610 [] + 1023.1nm: 0.0405 [] + 1032.7nm: 0.0208 [] + 1042.3nm: 0.0087 [] \ No newline at end of file diff --git a/tests/golden/format_r02.txt b/tests/golden/format_r02.txt new file mode 100644 index 0000000..bc668e7 --- /dev/null +++ b/tests/golden/format_r02.txt @@ -0,0 +1,43 @@ + Device: HPCS6500 + Date: 2026-02-04 Time: 16:29:39 + + --- Photometric --- + Phi (lm): 479.59 + eta (lm/W): 57.04 + CCT (K): 5661 + Duv: 0.00550 + + --- Chromaticity --- + x: 0.3287 y: 0.3486 + u: 0.2015 v: 0.3205 + u': 0.2015 v': 0.4808 + + --- CRI --- + Ra: 83.0 SDCM: 4.66 + R1=82, R2=94, R3=93, R4=77, R5=82, R6=90, R7=83, R8=64 + R9=5, R10=84, R11=76, R12=60, R13=86, R14=97, R15=76 + + --- CIE 1931 --- + X: 662.004 Y: 702.182 Z: 649.858 + TLCI-2012: 68 + + --- Radiometric --- + Phi_e (mW): 1492.026 + Phi_eb (mW): 470.266 + Phi_ey (mW): 679.672 + Phi_er (mW): 330.604 + Phi_efr (mW): 11.206 + + --- Electrical --- + Voltage (V): 230.29 + Current (A): 0.0653 + Power (W): 8.405 + Frequency (Hz): 50.02 + Power Factor: 0.5586 + UThd (%): 0.8113 + AThd (%): 109.0115 + + --- Sensor --- + Peak Signal: 53165 + Dark Signal: 2310 + Compensate: 2834 \ No newline at end of file diff --git a/tests/golden/format_r02_spectrum.txt b/tests/golden/format_r02_spectrum.txt new file mode 100644 index 0000000..5c7add9 --- /dev/null +++ b/tests/golden/format_r02_spectrum.txt @@ -0,0 +1,218 @@ + Device: HPCS6500 + Date: 2026-02-04 Time: 16:29:39 + + --- Photometric --- + Phi (lm): 479.59 + eta (lm/W): 57.04 + CCT (K): 5661 + Duv: 0.00550 + + --- Chromaticity --- + x: 0.3287 y: 0.3486 + u: 0.2015 v: 0.3205 + u': 0.2015 v': 0.4808 + + --- CRI --- + Ra: 83.0 SDCM: 4.66 + R1=82, R2=94, R3=93, R4=77, R5=82, R6=90, R7=83, R8=64 + R9=5, R10=84, R11=76, R12=60, R13=86, R14=97, R15=76 + + --- CIE 1931 --- + X: 662.004 Y: 702.182 Z: 649.858 + TLCI-2012: 68 + + --- Radiometric --- + Phi_e (mW): 1492.026 + Phi_eb (mW): 470.266 + Phi_ey (mW): 679.672 + Phi_er (mW): 330.604 + Phi_efr (mW): 11.206 + + --- Electrical --- + Voltage (V): 230.29 + Current (A): 0.0653 + Power (W): 8.405 + Frequency (Hz): 50.02 + Power Factor: 0.5586 + UThd (%): 0.8113 + AThd (%): 109.0115 + + --- Voltage Harmonics (%) --- + H 1: 100.0000 + H 2: 0.3370 + H 3: 0.4587 + H 4: 0.1953 + H 5: 0.1626 + H 6: 0.1061 + H 7: 0.1800 + H 8: 0.0513 + H 9: 0.2902 + H10: 0.0447 + H11: 0.2477 + H12: 0.0023 + H13: 0.1861 + H14: 0.0063 + H15: 0.1183 + H16: 0.0155 + H17: 0.1239 + H18: 0.0149 + H19: 0.0590 + H20: 0.0080 + H21: 0.0465 + H23: 0.0217 + H24: 0.0079 + H25: 0.0185 + H26: 0.0076 + H27: 0.0265 + H28: 0.0027 + H29: 0.0136 + H30: 0.0066 + H31: 0.0275 + H32: 0.0042 + H33: 0.0146 + H34: 0.0129 + H35: 0.0164 + H36: 0.0080 + H37: 0.0128 + H38: 0.0066 + H39: 0.0194 + H40: 0.0092 + H41: 0.0086 + H42: 0.0019 + H43: 0.0170 + H44: 0.0057 + H45: 0.0138 + H46: 0.0013 + H47: 0.0083 + H48: 0.0043 + H49: 0.0266 + H50: 0.0067 + + --- Current Harmonics (%) --- + H 1: 100.0000 + H 2: 1.1245 + H 3: 77.3376 + H 4: 1.3714 + H 5: 54.7943 + H 6: 1.2291 + H 7: 35.3840 + H 8: 1.1566 + H 9: 25.6305 + H10: 1.3803 + H11: 20.6588 + H12: 1.3435 + H13: 14.4722 + H14: 0.8883 + H15: 8.2279 + H16: 0.4150 + H17: 5.8570 + H18: 0.4188 + H19: 5.5059 + H20: 0.6645 + H21: 5.3454 + H22: 0.5912 + H23: 5.7325 + H24: 0.5132 + H25: 5.0631 + H26: 0.5359 + H27: 4.0568 + H28: 0.6665 + H29: 3.8878 + H30: 0.6506 + H31: 3.9866 + H32: 0.6108 + H33: 3.3681 + H34: 0.5727 + H35: 2.7296 + H36: 0.6597 + H37: 2.9302 + H38: 0.6761 + H39: 2.9201 + H40: 0.5632 + H41: 2.7267 + H42: 0.5785 + H43: 2.7861 + H44: 0.6036 + H45: 2.7887 + H46: 0.6251 + H47: 2.5635 + H48: 0.5767 + H49: 2.3997 + H50: 0.5808 + + --- Sensor --- + Peak Signal: 53165 + Dark Signal: 2310 + Compensate: 2834 + + --- Spectrum (380-1050nm) --- + 380.0nm: 0.0001 [] + 389.6nm: 0.0770 [] + 399.2nm: 0.3100 [] + 408.8nm: 0.7661 [##] + 418.4nm: 1.6114 [####] + 428.0nm: 3.0064 [########] + 437.6nm: 5.1990 [###############] + 447.2nm: 8.6082 [########################] + 456.8nm: 12.6327 [####################################] + 466.4nm: 13.6560 [#######################################] + 476.0nm: 10.8536 [###############################] + 485.6nm: 8.3290 [########################] + 495.2nm: 6.7889 [###################] + 504.8nm: 5.5147 [###############] + 514.4nm: 4.7041 [#############] + 524.0nm: 4.4857 [############] + 533.6nm: 4.6031 [#############] + 543.2nm: 4.8814 [##############] + 552.8nm: 5.2789 [###############] + 562.4nm: 5.6901 [################] + 572.0nm: 6.0276 [#################] + 581.6nm: 6.2592 [##################] + 591.2nm: 6.4122 [##################] + 600.8nm: 6.5277 [##################] + 610.4nm: 6.6358 [###################] + 620.0nm: 6.7792 [###################] + 629.6nm: 6.9254 [###################] + 639.2nm: 7.0578 [####################] + 648.8nm: 7.1569 [####################] + 658.4nm: 7.2319 [####################] + 668.0nm: 7.2977 [#####################] + 677.6nm: 7.3732 [#####################] + 687.2nm: 7.4891 [#####################] + 696.8nm: 7.5217 [#####################] + 706.4nm: 7.4749 [#####################] + 716.0nm: 7.3825 [#####################] + 725.6nm: 7.2120 [####################] + 735.2nm: 7.0133 [####################] + 744.8nm: 6.7207 [###################] + 754.4nm: 6.3674 [##################] + 764.0nm: 5.9602 [#################] + 773.6nm: 5.5667 [################] + 783.2nm: 5.1329 [##############] + 792.8nm: 4.7013 [#############] + 802.3nm: 4.2745 [############] + 811.9nm: 3.8716 [###########] + 821.5nm: 3.4390 [#########] + 831.1nm: 3.0240 [########] + 840.7nm: 2.6514 [#######] + 850.3nm: 2.2870 [######] + 859.9nm: 1.9779 [#####] + 869.5nm: 1.7045 [####] + 879.1nm: 1.4498 [####] + 888.7nm: 1.2401 [###] + 898.3nm: 1.0367 [##] + 907.9nm: 0.8554 [##] + 917.5nm: 0.7071 [##] + 927.1nm: 0.5781 [#] + 936.7nm: 0.4678 [#] + 946.3nm: 0.3798 [#] + 955.9nm: 0.3085 [] + 965.5nm: 0.2315 [] + 975.1nm: 0.1769 [] + 984.7nm: 0.1405 [] + 994.3nm: 0.1102 [] + 1003.9nm: 0.0810 [] + 1013.5nm: 0.0582 [] + 1023.1nm: 0.0389 [] + 1032.7nm: 0.0225 [] + 1042.3nm: 0.0079 [] \ No newline at end of file diff --git a/tests/golden/format_r03.txt b/tests/golden/format_r03.txt new file mode 100644 index 0000000..5abf686 --- /dev/null +++ b/tests/golden/format_r03.txt @@ -0,0 +1,43 @@ + Device: HPCS6500 + Date: 2026-02-04 Time: 16:50:38 + + --- Photometric --- + Phi (lm): 0.00 + eta (lm/W): 0.00 + CCT (K): 0 + Duv: 0.00000 + + --- Chromaticity --- + x: 0.0000 y: 0.0000 + u: 0.0000 v: 0.0000 + u': 0.0000 v': 0.0000 + + --- CRI --- + Ra: 0.0 SDCM: 0.00 + R1=0, R2=0, R3=0, R4=0, R5=0, R6=0, R7=0, R8=0 + R9=0, R10=0, R11=0, R12=0, R13=0, R14=0, R15=0 + + --- CIE 1931 --- + X: 0.000 Y: 0.000 Z: 0.000 + TLCI-2012: 0 + + --- Radiometric --- + Phi_e (mW): 0.000 + Phi_eb (mW): 0.000 + Phi_ey (mW): 0.000 + Phi_er (mW): 0.000 + Phi_efr (mW): 0.000 + + --- Electrical --- + Voltage (V): 0.00 + Current (A): 0.0000 + Power (W): 0.000 + Frequency (Hz): 0.00 + Power Factor: 0.0000 + UThd (%): 0.8692 + AThd (%): 116.7091 + + --- Sensor --- + Peak Signal: 0 + Dark Signal: 0 + Compensate: 0 \ No newline at end of file diff --git a/tests/golden/format_r03_spectrum.txt b/tests/golden/format_r03_spectrum.txt new file mode 100644 index 0000000..bb92b7d --- /dev/null +++ b/tests/golden/format_r03_spectrum.txt @@ -0,0 +1,219 @@ + Device: HPCS6500 + Date: 2026-02-04 Time: 16:50:38 + + --- Photometric --- + Phi (lm): 0.00 + eta (lm/W): 0.00 + CCT (K): 0 + Duv: 0.00000 + + --- Chromaticity --- + x: 0.0000 y: 0.0000 + u: 0.0000 v: 0.0000 + u': 0.0000 v': 0.0000 + + --- CRI --- + Ra: 0.0 SDCM: 0.00 + R1=0, R2=0, R3=0, R4=0, R5=0, R6=0, R7=0, R8=0 + R9=0, R10=0, R11=0, R12=0, R13=0, R14=0, R15=0 + + --- CIE 1931 --- + X: 0.000 Y: 0.000 Z: 0.000 + TLCI-2012: 0 + + --- Radiometric --- + Phi_e (mW): 0.000 + Phi_eb (mW): 0.000 + Phi_ey (mW): 0.000 + Phi_er (mW): 0.000 + Phi_efr (mW): 0.000 + + --- Electrical --- + Voltage (V): 0.00 + Current (A): 0.0000 + Power (W): 0.000 + Frequency (Hz): 0.00 + Power Factor: 0.0000 + UThd (%): 0.8692 + AThd (%): 116.7091 + + --- Voltage Harmonics (%) --- + H 1: 100.0000 + H 2: 0.3466 + H 3: 0.5529 + H 4: 0.1935 + H 5: 0.1009 + H 6: 0.1319 + H 7: 0.1455 + H 8: 0.0709 + H 9: 0.3610 + H10: 0.0452 + H11: 0.2558 + H12: 0.0099 + H13: 0.1471 + H14: 0.0182 + H15: 0.0881 + H16: 0.0119 + H17: 0.0439 + H18: 0.0054 + H19: 0.0441 + H20: 0.0039 + H21: 0.0444 + H22: 0.0038 + H23: 0.0419 + H24: 0.0070 + H25: 0.0277 + H26: 0.0086 + H27: 0.0180 + H28: 0.0038 + H29: 0.0168 + H30: 0.0031 + H31: 0.0085 + H32: 0.0042 + H33: 0.0141 + H34: 0.0039 + H35: 0.0050 + H36: 0.0076 + H37: 0.0172 + H38: 0.0017 + H39: 0.0135 + H40: 0.0122 + H41: 0.0075 + H42: 0.0091 + H43: 0.0079 + H44: 0.0052 + H45: 0.0028 + H46: 0.0063 + H47: 0.0106 + H48: 0.0055 + H49: 0.0066 + H50: 0.0032 + + --- Current Harmonics (%) --- + H 1: 100.0000 + H 2: 1.3069 + H 3: 79.6826 + H 4: 1.6782 + H 5: 62.0099 + H 6: 1.8375 + H 7: 43.0251 + H 8: 1.4561 + H 9: 27.1434 + H10: 0.8638 + H11: 16.3288 + H12: 0.8914 + H13: 10.5836 + H14: 0.8186 + H15: 7.8296 + H16: 0.6092 + H17: 7.1998 + H18: 0.5320 + H19: 6.8390 + H20: 0.7901 + H21: 5.9471 + H22: 0.8641 + H23: 5.4131 + H24: 0.7893 + H25: 5.4738 + H26: 0.6972 + H27: 5.4525 + H28: 0.6923 + H29: 4.8222 + H30: 0.7761 + H31: 4.3909 + H32: 0.7792 + H33: 4.3903 + H34: 0.7458 + H35: 4.3602 + H36: 0.7061 + H37: 3.9436 + H38: 0.6865 + H39: 3.6134 + H40: 0.6928 + H41: 3.4965 + H42: 0.7969 + H43: 3.1709 + H44: 0.7282 + H45: 2.8721 + H46: 0.6770 + H47: 2.6774 + H48: 0.6486 + H49: 2.6343 + H50: 0.6855 + + --- Sensor --- + Peak Signal: 0 + Dark Signal: 0 + Compensate: 0 + + --- Spectrum (380-1050nm) --- + 380.0nm: 0.0000 [] + 389.6nm: 0.0000 [] + 399.2nm: 0.0000 [] + 408.8nm: 0.0000 [] + 418.4nm: 0.0000 [] + 428.0nm: 0.0000 [] + 437.6nm: 0.0000 [] + 447.2nm: 0.0000 [] + 456.8nm: 0.0000 [] + 466.4nm: 0.0000 [] + 476.0nm: 0.0000 [] + 485.6nm: 0.0000 [] + 495.2nm: 0.0000 [] + 504.8nm: 0.0000 [] + 514.4nm: 0.0000 [] + 524.0nm: 0.0000 [] + 533.6nm: 0.0000 [] + 543.2nm: 0.0000 [] + 552.8nm: 0.0000 [] + 562.4nm: 0.0000 [] + 572.0nm: 0.0000 [] + 581.6nm: 0.0000 [] + 591.2nm: 0.0000 [] + 600.8nm: 0.0000 [] + 610.4nm: 0.0000 [] + 620.0nm: 0.0000 [] + 629.6nm: 0.0000 [] + 639.2nm: 0.0000 [] + 648.8nm: 0.0000 [] + 658.4nm: 0.0000 [] + 668.0nm: 0.0000 [] + 677.6nm: 0.0000 [] + 687.2nm: 0.0000 [] + 696.8nm: 0.0000 [] + 706.4nm: 0.0000 [] + 716.0nm: 0.0000 [] + 725.6nm: 0.0000 [] + 735.2nm: 0.0000 [] + 744.8nm: 0.0000 [] + 754.4nm: 0.0000 [] + 764.0nm: 0.0000 [] + 773.6nm: 0.0000 [] + 783.2nm: 0.0000 [] + 792.8nm: 0.0000 [] + 802.3nm: 0.0000 [] + 811.9nm: 0.0000 [] + 821.5nm: 0.0000 [] + 831.1nm: 0.0000 [] + 840.7nm: 0.0000 [] + 850.3nm: 0.0000 [] + 859.9nm: 0.0000 [] + 869.5nm: 0.0000 [] + 879.1nm: 0.0000 [] + 888.7nm: 0.0000 [] + 898.3nm: 0.0000 [] + 907.9nm: 0.0000 [] + 917.5nm: 0.0000 [] + 927.1nm: 0.0000 [] + 936.7nm: 0.0000 [] + 946.3nm: 0.0000 [] + 955.9nm: 0.0000 [] + 965.5nm: 0.0000 [] + 975.1nm: 0.0000 [] + 984.7nm: 0.0000 [] + 994.3nm: 0.0000 [] + 1003.9nm: 0.0000 [] + 1013.5nm: 0.0000 [] + 1023.1nm: 0.0000 [] + 1032.7nm: 0.0000 [] + 1042.3nm: 0.0000 [] \ No newline at end of file diff --git a/tests/golden/format_r04.txt b/tests/golden/format_r04.txt new file mode 100644 index 0000000..bcd2df7 --- /dev/null +++ b/tests/golden/format_r04.txt @@ -0,0 +1,41 @@ + Device: HPCS6500 + Date: 2026-02-04 Time: 15:58:53 + + --- Photometric --- + Phi (lm): 479.83 + eta (lm/W): 57.09 + CCT (K): 5656 + Duv: 0.00552 + + --- Chromaticity --- + x: 0.3288 y: 0.3488 + u: 0.2015 v: 0.3206 + u': 0.2015 v': 0.4809 + + --- CRI --- + Ra: 83.0 SDCM: 4.70 + R1=82, R2=94, R3=93, R4=77, R5=81, R6=89, R7=83, R8=64 + R9=5, R10=84, R11=76, R12=60, R13=87, R14=97, R15=76 + + --- CIE 1931 --- + X: 662.277 Y: 702.533 Z: 649.290 + TLCI-2012: 68 + + --- Radiometric --- + Phi_e (mW): 1491.942 + Phi_eb (mW): 469.864 + Phi_ey (mW): 679.651 + Phi_er (mW): 330.758 + Phi_efr (mW): 11.142 + + --- Electrical --- + Voltage (V): 230.30 + Current (A): 0.0653 + Power (W): 8.405 + Frequency (Hz): 50.02 + Power Factor: 0.5587 + + --- Sensor --- + Peak Signal: 53051 + Dark Signal: 2228 + Compensate: 2834 \ No newline at end of file diff --git a/tests/golden/format_r04_spectrum.txt b/tests/golden/format_r04_spectrum.txt new file mode 100644 index 0000000..d204dce --- /dev/null +++ b/tests/golden/format_r04_spectrum.txt @@ -0,0 +1,113 @@ + Device: HPCS6500 + Date: 2026-02-04 Time: 15:58:53 + + --- Photometric --- + Phi (lm): 479.83 + eta (lm/W): 57.09 + CCT (K): 5656 + Duv: 0.00552 + + --- Chromaticity --- + x: 0.3288 y: 0.3488 + u: 0.2015 v: 0.3206 + u': 0.2015 v': 0.4809 + + --- CRI --- + Ra: 83.0 SDCM: 4.70 + R1=82, R2=94, R3=93, R4=77, R5=81, R6=89, R7=83, R8=64 + R9=5, R10=84, R11=76, R12=60, R13=87, R14=97, R15=76 + + --- CIE 1931 --- + X: 662.277 Y: 702.533 Z: 649.290 + TLCI-2012: 68 + + --- Radiometric --- + Phi_e (mW): 1491.942 + Phi_eb (mW): 469.864 + Phi_ey (mW): 679.651 + Phi_er (mW): 330.758 + Phi_efr (mW): 11.142 + + --- Electrical --- + Voltage (V): 230.30 + Current (A): 0.0653 + Power (W): 8.405 + Frequency (Hz): 50.02 + Power Factor: 0.5587 + + --- Sensor --- + Peak Signal: 53051 + Dark Signal: 2228 + Compensate: 2834 + + --- Spectrum (380-1050nm) --- + 380.0nm: 0.0000 [] + 389.6nm: 0.0838 [] + 399.2nm: 0.3137 [] + 408.8nm: 0.7712 [##] + 418.4nm: 1.6204 [####] + 428.0nm: 3.0103 [########] + 437.6nm: 5.1952 [###############] + 447.2nm: 8.5932 [########################] + 456.8nm: 12.6190 [####################################] + 466.4nm: 13.6409 [#######################################] + 476.0nm: 10.8421 [###############################] + 485.6nm: 8.3131 [########################] + 495.2nm: 6.7764 [###################] + 504.8nm: 5.5052 [###############] + 514.4nm: 4.6985 [#############] + 524.0nm: 4.4838 [############] + 533.6nm: 4.5985 [#############] + 543.2nm: 4.8779 [##############] + 552.8nm: 5.2744 [###############] + 562.4nm: 5.6922 [################] + 572.0nm: 6.0260 [#################] + 581.6nm: 6.2605 [##################] + 591.2nm: 6.4065 [##################] + 600.8nm: 6.5303 [##################] + 610.4nm: 6.6307 [###################] + 620.0nm: 6.7723 [###################] + 629.6nm: 6.9229 [###################] + 639.2nm: 7.0529 [####################] + 648.8nm: 7.1562 [####################] + 658.4nm: 7.2298 [####################] + 668.0nm: 7.2981 [#####################] + 677.6nm: 7.3778 [#####################] + 687.2nm: 7.4896 [#####################] + 696.8nm: 7.5259 [#####################] + 706.4nm: 7.4780 [#####################] + 716.0nm: 7.3868 [#####################] + 725.6nm: 7.2144 [####################] + 735.2nm: 7.0180 [####################] + 744.8nm: 6.7219 [###################] + 754.4nm: 6.3660 [##################] + 764.0nm: 5.9605 [#################] + 773.6nm: 5.5733 [################] + 783.2nm: 5.1339 [##############] + 792.8nm: 4.7023 [#############] + 802.3nm: 4.2764 [############] + 811.9nm: 3.8736 [###########] + 821.5nm: 3.4459 [#########] + 831.1nm: 3.0290 [########] + 840.7nm: 2.6555 [#######] + 850.3nm: 2.2888 [######] + 859.9nm: 1.9765 [#####] + 869.5nm: 1.7011 [####] + 879.1nm: 1.4485 [####] + 888.7nm: 1.2418 [###] + 898.3nm: 1.0371 [##] + 907.9nm: 0.8565 [##] + 917.5nm: 0.7085 [##] + 927.1nm: 0.5742 [#] + 936.7nm: 0.4662 [#] + 946.3nm: 0.3787 [#] + 955.9nm: 0.3092 [] + 965.5nm: 0.2320 [] + 975.1nm: 0.1777 [] + 984.7nm: 0.1411 [] + 994.3nm: 0.1086 [] + 1003.9nm: 0.0792 [] + 1013.5nm: 0.0565 [] + 1023.1nm: 0.0397 [] + 1032.7nm: 0.0197 [] + 1042.3nm: 0.0046 [] \ No newline at end of file diff --git a/tests/golden/format_r05.txt b/tests/golden/format_r05.txt new file mode 100644 index 0000000..ed526f3 --- /dev/null +++ b/tests/golden/format_r05.txt @@ -0,0 +1,41 @@ + Device: HPCS6500 + Date: 2026-02-04 Time: 16:04:22 + + --- Photometric --- + Phi (lm): 479.62 + eta (lm/W): 57.10 + CCT (K): 5655 + Duv: 0.00551 + + --- Chromaticity --- + x: 0.3288 y: 0.3488 + u: 0.2015 v: 0.3206 + u': 0.2015 v': 0.4809 + + --- CRI --- + Ra: 83.1 SDCM: 4.69 + R1=82, R2=94, R3=93, R4=76, R5=81, R6=90, R7=83, R8=64 + R9=5, R10=84, R11=76, R12=60, R13=87, R14=97, R15=76 + + --- CIE 1931 --- + X: 662.007 Y: 702.221 Z: 648.987 + TLCI-2012: 68 + + --- Radiometric --- + Phi_e (mW): 1491.544 + Phi_eb (mW): 469.850 + Phi_ey (mW): 679.956 + Phi_er (mW): 331.674 + Phi_efr (mW): 11.563 + + --- Electrical --- + Voltage (V): 230.29 + Current (A): 0.0653 + Power (W): 8.400 + Frequency (Hz): 50.02 + Power Factor: 0.5586 + + --- Sensor --- + Peak Signal: 53066 + Dark Signal: 2236 + Compensate: 2834 \ No newline at end of file diff --git a/tests/golden/format_r05_spectrum.txt b/tests/golden/format_r05_spectrum.txt new file mode 100644 index 0000000..2b49e98 --- /dev/null +++ b/tests/golden/format_r05_spectrum.txt @@ -0,0 +1,113 @@ + Device: HPCS6500 + Date: 2026-02-04 Time: 16:04:22 + + --- Photometric --- + Phi (lm): 479.62 + eta (lm/W): 57.10 + CCT (K): 5655 + Duv: 0.00551 + + --- Chromaticity --- + x: 0.3288 y: 0.3488 + u: 0.2015 v: 0.3206 + u': 0.2015 v': 0.4809 + + --- CRI --- + Ra: 83.1 SDCM: 4.69 + R1=82, R2=94, R3=93, R4=76, R5=81, R6=90, R7=83, R8=64 + R9=5, R10=84, R11=76, R12=60, R13=87, R14=97, R15=76 + + --- CIE 1931 --- + X: 662.007 Y: 702.221 Z: 648.987 + TLCI-2012: 68 + + --- Radiometric --- + Phi_e (mW): 1491.544 + Phi_eb (mW): 469.850 + Phi_ey (mW): 679.956 + Phi_er (mW): 331.674 + Phi_efr (mW): 11.563 + + --- Electrical --- + Voltage (V): 230.29 + Current (A): 0.0653 + Power (W): 8.400 + Frequency (Hz): 50.02 + Power Factor: 0.5586 + + --- Sensor --- + Peak Signal: 53066 + Dark Signal: 2236 + Compensate: 2834 + + --- Spectrum (380-1050nm) --- + 380.0nm: 0.0004 [] + 389.6nm: 0.0896 [] + 399.2nm: 0.3198 [] + 408.8nm: 0.7697 [##] + 418.4nm: 1.6099 [####] + 428.0nm: 2.9921 [########] + 437.6nm: 5.1750 [##############] + 447.2nm: 8.5520 [########################] + 456.8nm: 12.5835 [####################################] + 466.4nm: 13.6533 [#######################################] + 476.0nm: 10.8713 [###############################] + 485.6nm: 8.3388 [########################] + 495.2nm: 6.7961 [###################] + 504.8nm: 5.5178 [###############] + 514.4nm: 4.7100 [#############] + 524.0nm: 4.4835 [############] + 533.6nm: 4.5955 [#############] + 543.2nm: 4.8758 [##############] + 552.8nm: 5.2754 [###############] + 562.4nm: 5.6932 [################] + 572.0nm: 6.0259 [#################] + 581.6nm: 6.2639 [##################] + 591.2nm: 6.4078 [##################] + 600.8nm: 6.5338 [##################] + 610.4nm: 6.6373 [###################] + 620.0nm: 6.7757 [###################] + 629.6nm: 6.9260 [####################] + 639.2nm: 7.0568 [####################] + 648.8nm: 7.1664 [####################] + 658.4nm: 7.2312 [####################] + 668.0nm: 7.2992 [#####################] + 677.6nm: 7.3760 [#####################] + 687.2nm: 7.4918 [#####################] + 696.8nm: 7.5267 [#####################] + 706.4nm: 7.4803 [#####################] + 716.0nm: 7.3913 [#####################] + 725.6nm: 7.2224 [####################] + 735.2nm: 7.0243 [####################] + 744.8nm: 6.7270 [###################] + 754.4nm: 6.3784 [##################] + 764.0nm: 5.9711 [#################] + 773.6nm: 5.5765 [################] + 783.2nm: 5.1446 [##############] + 792.8nm: 4.7115 [#############] + 802.3nm: 4.2878 [############] + 811.9nm: 3.8857 [###########] + 821.5nm: 3.4575 [#########] + 831.1nm: 3.0392 [########] + 840.7nm: 2.6646 [#######] + 850.3nm: 2.2973 [######] + 859.9nm: 1.9856 [#####] + 869.5nm: 1.7133 [####] + 879.1nm: 1.4529 [####] + 888.7nm: 1.2538 [###] + 898.3nm: 1.0436 [###] + 907.9nm: 0.8680 [##] + 917.5nm: 0.7157 [##] + 927.1nm: 0.5790 [#] + 936.7nm: 0.4731 [#] + 946.3nm: 0.3838 [#] + 955.9nm: 0.3139 [] + 965.5nm: 0.2378 [] + 975.1nm: 0.1854 [] + 984.7nm: 0.1477 [] + 994.3nm: 0.1152 [] + 1003.9nm: 0.0853 [] + 1013.5nm: 0.0633 [] + 1023.1nm: 0.0463 [] + 1032.7nm: 0.0285 [] + 1042.3nm: 0.0129 [] \ No newline at end of file diff --git a/tests/golden/format_r06.txt b/tests/golden/format_r06.txt new file mode 100644 index 0000000..d84093b --- /dev/null +++ b/tests/golden/format_r06.txt @@ -0,0 +1,41 @@ + Device: HPCS6500 + Date: 2026-02-04 Time: 16:04:31 + + --- Photometric --- + Phi (lm): 479.61 + eta (lm/W): 57.05 + CCT (K): 5654 + Duv: 0.00553 + + --- Chromaticity --- + x: 0.3288 y: 0.3488 + u: 0.2015 v: 0.3206 + u': 0.2015 v': 0.4809 + + --- CRI --- + Ra: 83.0 SDCM: 4.71 + R1=82, R2=94, R3=93, R4=76, R5=81, R6=89, R7=83, R8=64 + R9=5, R10=84, R11=76, R12=60, R13=87, R14=97, R15=76 + + --- CIE 1931 --- + X: 661.955 Y: 702.217 Z: 648.778 + TLCI-2012: 68 + + --- Radiometric --- + Phi_e (mW): 1491.409 + Phi_eb (mW): 470.118 + Phi_ey (mW): 679.660 + Phi_er (mW): 331.025 + Phi_efr (mW): 11.807 + + --- Electrical --- + Voltage (V): 230.30 + Current (A): 0.0653 + Power (W): 8.407 + Frequency (Hz): 50.02 + Power Factor: 0.5589 + + --- Sensor --- + Peak Signal: 53066 + Dark Signal: 2246 + Compensate: 2834 \ No newline at end of file diff --git a/tests/golden/format_r06_spectrum.txt b/tests/golden/format_r06_spectrum.txt new file mode 100644 index 0000000..68d24e7 --- /dev/null +++ b/tests/golden/format_r06_spectrum.txt @@ -0,0 +1,113 @@ + Device: HPCS6500 + Date: 2026-02-04 Time: 16:04:31 + + --- Photometric --- + Phi (lm): 479.61 + eta (lm/W): 57.05 + CCT (K): 5654 + Duv: 0.00553 + + --- Chromaticity --- + x: 0.3288 y: 0.3488 + u: 0.2015 v: 0.3206 + u': 0.2015 v': 0.4809 + + --- CRI --- + Ra: 83.0 SDCM: 4.71 + R1=82, R2=94, R3=93, R4=76, R5=81, R6=89, R7=83, R8=64 + R9=5, R10=84, R11=76, R12=60, R13=87, R14=97, R15=76 + + --- CIE 1931 --- + X: 661.955 Y: 702.217 Z: 648.778 + TLCI-2012: 68 + + --- Radiometric --- + Phi_e (mW): 1491.409 + Phi_eb (mW): 470.118 + Phi_ey (mW): 679.660 + Phi_er (mW): 331.025 + Phi_efr (mW): 11.807 + + --- Electrical --- + Voltage (V): 230.30 + Current (A): 0.0653 + Power (W): 8.407 + Frequency (Hz): 50.02 + Power Factor: 0.5589 + + --- Sensor --- + Peak Signal: 53066 + Dark Signal: 2246 + Compensate: 2834 + + --- Spectrum (380-1050nm) --- + 380.0nm: 0.0007 [] + 389.6nm: 0.1039 [] + 399.2nm: 0.3310 [] + 408.8nm: 0.7735 [##] + 418.4nm: 1.6222 [####] + 428.0nm: 3.0048 [########] + 437.6nm: 5.1925 [##############] + 447.2nm: 8.5847 [########################] + 456.8nm: 12.6066 [####################################] + 466.4nm: 13.6462 [#######################################] + 476.0nm: 10.8482 [###############################] + 485.6nm: 8.3167 [########################] + 495.2nm: 6.7854 [###################] + 504.8nm: 5.5031 [###############] + 514.4nm: 4.7003 [#############] + 524.0nm: 4.4902 [############] + 533.6nm: 4.6031 [#############] + 543.2nm: 4.8753 [##############] + 552.8nm: 5.2749 [###############] + 562.4nm: 5.6866 [################] + 572.0nm: 6.0231 [#################] + 581.6nm: 6.2593 [##################] + 591.2nm: 6.4088 [##################] + 600.8nm: 6.5298 [##################] + 610.4nm: 6.6314 [###################] + 620.0nm: 6.7770 [###################] + 629.6nm: 6.9241 [###################] + 639.2nm: 7.0596 [####################] + 648.8nm: 7.1581 [####################] + 658.4nm: 7.2321 [####################] + 668.0nm: 7.2993 [#####################] + 677.6nm: 7.3692 [#####################] + 687.2nm: 7.4894 [#####################] + 696.8nm: 7.5227 [#####################] + 706.4nm: 7.4804 [#####################] + 716.0nm: 7.3870 [#####################] + 725.6nm: 7.2145 [####################] + 735.2nm: 7.0141 [####################] + 744.8nm: 6.7182 [###################] + 754.4nm: 6.3698 [##################] + 764.0nm: 5.9647 [#################] + 773.6nm: 5.5730 [################] + 783.2nm: 5.1334 [##############] + 792.8nm: 4.7031 [#############] + 802.3nm: 4.2776 [############] + 811.9nm: 3.8751 [###########] + 821.5nm: 3.4468 [#########] + 831.1nm: 3.0270 [########] + 840.7nm: 2.6591 [#######] + 850.3nm: 2.2925 [######] + 859.9nm: 1.9769 [#####] + 869.5nm: 1.7079 [####] + 879.1nm: 1.4541 [####] + 888.7nm: 1.2449 [###] + 898.3nm: 1.0430 [###] + 907.9nm: 0.8654 [##] + 917.5nm: 0.7167 [##] + 927.1nm: 0.5787 [#] + 936.7nm: 0.4744 [#] + 946.3nm: 0.3864 [#] + 955.9nm: 0.3180 [] + 965.5nm: 0.2400 [] + 975.1nm: 0.1895 [] + 984.7nm: 0.1487 [] + 994.3nm: 0.1197 [] + 1003.9nm: 0.0899 [] + 1013.5nm: 0.0693 [] + 1023.1nm: 0.0503 [] + 1032.7nm: 0.0345 [] + 1042.3nm: 0.0189 [] \ No newline at end of file diff --git a/tests/golden/format_r07.txt b/tests/golden/format_r07.txt new file mode 100644 index 0000000..1b2b8e2 --- /dev/null +++ b/tests/golden/format_r07.txt @@ -0,0 +1,41 @@ + Device: HPCS6500 + Date: 2026-02-05 Time: 17:57:56 + + --- Photometric --- + Phi (lm): 182.62 + eta (lm/W): 0.00 + CCT (K): 4937 + Duv: 0.00214 + + --- Chromaticity --- + x: 0.3474 y: 0.3577 + u: 0.2106 v: 0.3253 + u': 0.2106 v': 0.4880 + + --- CRI --- + Ra: 83.5 SDCM: 1.52 + R1=82, R2=90, R3=95, R4=82, R5=82, R6=84, R7=87, R8=67 + R9=13, R10=75, R11=81, R12=54, R13=84, R14=97, R15=76 + + --- CIE 1931 --- + X: 259.640 Y: 267.378 Z: 220.377 + TLCI-2012: 71 + + --- Radiometric --- + Phi_e (mW): 558.636 + Phi_eb (mW): 152.549 + Phi_ey (mW): 257.969 + Phi_er (mW): 144.279 + Phi_efr (mW): 5.738 + + --- Electrical --- + Voltage (V): 0.00 + Current (A): 0.0000 + Power (W): 0.000 + Frequency (Hz): 0.00 + Power Factor: 0.0000 + + --- Sensor --- + Peak Signal: 55124 + Dark Signal: 2518 + Compensate: 2834 \ No newline at end of file diff --git a/tests/golden/format_r07_spectrum.txt b/tests/golden/format_r07_spectrum.txt new file mode 100644 index 0000000..05daace --- /dev/null +++ b/tests/golden/format_r07_spectrum.txt @@ -0,0 +1,113 @@ + Device: HPCS6500 + Date: 2026-02-05 Time: 17:57:56 + + --- Photometric --- + Phi (lm): 182.62 + eta (lm/W): 0.00 + CCT (K): 4937 + Duv: 0.00214 + + --- Chromaticity --- + x: 0.3474 y: 0.3577 + u: 0.2106 v: 0.3253 + u': 0.2106 v': 0.4880 + + --- CRI --- + Ra: 83.5 SDCM: 1.52 + R1=82, R2=90, R3=95, R4=82, R5=82, R6=84, R7=87, R8=67 + R9=13, R10=75, R11=81, R12=54, R13=84, R14=97, R15=76 + + --- CIE 1931 --- + X: 259.640 Y: 267.378 Z: 220.377 + TLCI-2012: 71 + + --- Radiometric --- + Phi_e (mW): 558.636 + Phi_eb (mW): 152.549 + Phi_ey (mW): 257.969 + Phi_er (mW): 144.279 + Phi_efr (mW): 5.738 + + --- Electrical --- + Voltage (V): 0.00 + Current (A): 0.0000 + Power (W): 0.000 + Frequency (Hz): 0.00 + Power Factor: 0.0000 + + --- Sensor --- + Peak Signal: 55124 + Dark Signal: 2518 + Compensate: 2834 + + --- Spectrum (380-1050nm) --- + 380.0nm: 0.0128 [] + 389.6nm: 0.0556 [] + 399.2nm: 0.1567 [#] + 408.8nm: 0.3618 [##] + 418.4nm: 0.7370 [#####] + 428.0nm: 1.3826 [##########] + 437.6nm: 2.5671 [####################] + 447.2nm: 4.3754 [##################################] + 456.8nm: 5.0546 [#######################################] + 466.4nm: 3.6483 [############################] + 476.0nm: 2.4748 [###################] + 485.6nm: 1.9566 [###############] + 495.2nm: 1.4662 [###########] + 504.8nm: 1.1959 [#########] + 514.4nm: 1.2093 [#########] + 524.0nm: 1.3289 [##########] + 533.6nm: 1.5025 [###########] + 543.2nm: 1.7276 [#############] + 552.8nm: 1.9439 [###############] + 562.4nm: 2.1145 [################] + 572.0nm: 2.2373 [#################] + 581.6nm: 2.3242 [##################] + 591.2nm: 2.3852 [##################] + 600.8nm: 2.4435 [###################] + 610.4nm: 2.5010 [###################] + 620.0nm: 2.5665 [####################] + 629.6nm: 2.6256 [####################] + 639.2nm: 2.6859 [####################] + 648.8nm: 2.7312 [#####################] + 658.4nm: 2.7605 [#####################] + 668.0nm: 2.7875 [#####################] + 677.6nm: 2.8117 [#####################] + 687.2nm: 2.8452 [######################] + 696.8nm: 2.8615 [######################] + 706.4nm: 2.8705 [######################] + 716.0nm: 2.8641 [######################] + 725.6nm: 2.8432 [######################] + 735.2nm: 2.8032 [#####################] + 744.8nm: 2.7383 [#####################] + 754.4nm: 2.6451 [####################] + 764.0nm: 2.5241 [###################] + 773.6nm: 2.3959 [##################] + 783.2nm: 2.2367 [#################] + 792.8nm: 2.0679 [################] + 802.3nm: 1.8961 [##############] + 811.9nm: 1.7246 [#############] + 821.5nm: 1.5452 [############] + 831.1nm: 1.3706 [##########] + 840.7nm: 1.2060 [#########] + 850.3nm: 1.0473 [########] + 859.9nm: 0.9111 [#######] + 869.5nm: 0.7856 [######] + 879.1nm: 0.6734 [#####] + 888.7nm: 0.5791 [####] + 898.3nm: 0.4811 [###] + 907.9nm: 0.4019 [###] + 917.5nm: 0.3368 [##] + 927.1nm: 0.2715 [##] + 936.7nm: 0.2226 [#] + 946.3nm: 0.1786 [#] + 955.9nm: 0.1472 [#] + 965.5nm: 0.1139 [] + 975.1nm: 0.0910 [] + 984.7nm: 0.0706 [] + 994.3nm: 0.0585 [] + 1003.9nm: 0.0451 [] + 1013.5nm: 0.0379 [] + 1023.1nm: 0.0298 [] + 1032.7nm: 0.0207 [] + 1042.3nm: 0.0151 [] \ No newline at end of file diff --git a/tests/golden/parse_usb_capture_20260204_123655_hub1.txt b/tests/golden/parse_usb_capture_20260204_123655_hub1.txt new file mode 100644 index 0000000..22f60eb --- /dev/null +++ b/tests/golden/parse_usb_capture_20260204_123655_hub1.txt @@ -0,0 +1,90 @@ + +============================================================ +Reading 1 (t=0.01s) +============================================================ + Device: HPCS6500 + Date: 2026-02-04 Time: 15:58:55 + + --- Photometric --- + Phi (lm): 479.98 + eta (lm/W): 57.09 + CCT (K): 5653 + Duv: 0.00551 + + --- Chromaticity --- + x: 0.3289 y: 0.3488 + u: 0.2015 v: 0.3206 + u': 0.2015 v': 0.4809 + + --- CRI --- + Ra: 83.0 SDCM: 4.69 + R1=82, R2=94, R3=93, R4=77, R5=82, R6=89, R7=83, R8=64 + R9=5, R10=84, R11=76, R12=60, R13=87, R14=97, R15=76 + + --- CIE 1931 --- + X: 662.526 Y: 702.748 Z: 649.286 + TLCI-2012: 68 + + --- Radiometric --- + Phi_e (mW): 1492.631 + Phi_eb (mW): 470.398 + Phi_ey (mW): 680.493 + Phi_er (mW): 331.425 + Phi_efr (mW): 11.458 + + --- Electrical --- + Voltage (V): 230.31 + Current (A): 0.0653 + Power (W): 8.407 + Frequency (Hz): 50.02 + Power Factor: 0.5591 + + --- Sensor --- + Peak Signal: 53066 + Dark Signal: 2219 + Compensate: 2834 + +============================================================ +Reading 2 (t=2.13s) +============================================================ + Device: HPCS6500 + Date: 2026-02-04 Time: 16:02:06 + + --- Photometric --- + Phi (lm): 479.89 + eta (lm/W): 57.09 + CCT (K): 5655 + Duv: 0.00550 + + --- Chromaticity --- + x: 0.3288 y: 0.3488 + u: 0.2015 v: 0.3206 + u': 0.2015 v': 0.4809 + + --- CRI --- + Ra: 83.0 SDCM: 4.67 + R1=82, R2=94, R3=93, R4=77, R5=82, R6=89, R7=83, R8=64 + R9=5, R10=84, R11=76, R12=60, R13=86, R14=97, R15=76 + + --- CIE 1931 --- + X: 662.427 Y: 702.620 Z: 649.490 + TLCI-2012: 68 + + --- Radiometric --- + Phi_e (mW): 1492.469 + Phi_eb (mW): 470.073 + Phi_ey (mW): 679.697 + Phi_er (mW): 330.648 + Phi_efr (mW): 11.237 + + --- Electrical --- + Voltage (V): 230.30 + Current (A): 0.0653 + Power (W): 8.406 + Frequency (Hz): 50.02 + Power Factor: 0.5592 + + --- Sensor --- + Peak Signal: 53055 + Dark Signal: 2246 + Compensate: 2834 diff --git a/tests/golden/parse_usb_capture_20260204_123655_hub1_harmonics.txt b/tests/golden/parse_usb_capture_20260204_123655_hub1_harmonics.txt new file mode 100644 index 0000000..41a207d --- /dev/null +++ b/tests/golden/parse_usb_capture_20260204_123655_hub1_harmonics.txt @@ -0,0 +1,234 @@ + +============================================================ +Reading 1 (t=0.01s) +============================================================ + Device: HPCS6500 + Date: 2026-02-04 Time: 15:58:55 + + --- Photometric --- + Phi (lm): 479.98 + eta (lm/W): 57.09 + CCT (K): 5653 + Duv: 0.00551 + + --- Chromaticity --- + x: 0.3289 y: 0.3488 + u: 0.2015 v: 0.3206 + u': 0.2015 v': 0.4809 + + --- CRI --- + Ra: 83.0 SDCM: 4.69 + R1=82, R2=94, R3=93, R4=77, R5=82, R6=89, R7=83, R8=64 + R9=5, R10=84, R11=76, R12=60, R13=87, R14=97, R15=76 + + --- CIE 1931 --- + X: 662.526 Y: 702.748 Z: 649.286 + TLCI-2012: 68 + + --- Radiometric --- + Phi_e (mW): 1492.631 + Phi_eb (mW): 470.398 + Phi_ey (mW): 680.493 + Phi_er (mW): 331.425 + Phi_efr (mW): 11.458 + + --- Electrical --- + Voltage (V): 230.31 + Current (A): 0.0653 + Power (W): 8.407 + Frequency (Hz): 50.02 + Power Factor: 0.5591 + + --- Sensor --- + Peak Signal: 53066 + Dark Signal: 2219 + Compensate: 2834 + + --- Spectrum (380-1050nm) --- + 380.0nm: 0.0008 [] + 389.6nm: 0.0890 [] + 399.2nm: 0.3229 [] + 408.8nm: 0.7770 [##] + 418.4nm: 1.6247 [####] + 428.0nm: 3.0114 [########] + 437.6nm: 5.1952 [##############] + 447.2nm: 8.5884 [########################] + 456.8nm: 12.6235 [####################################] + 466.4nm: 13.6578 [#######################################] + 476.0nm: 10.8532 [###############################] + 485.6nm: 8.3235 [########################] + 495.2nm: 6.7865 [###################] + 504.8nm: 5.5139 [###############] + 514.4nm: 4.7091 [#############] + 524.0nm: 4.4881 [############] + 533.6nm: 4.6034 [#############] + 543.2nm: 4.8833 [##############] + 552.8nm: 5.2877 [###############] + 562.4nm: 5.6993 [################] + 572.0nm: 6.0321 [#################] + 581.6nm: 6.2673 [##################] + 591.2nm: 6.4150 [##################] + 600.8nm: 6.5413 [##################] + 610.4nm: 6.6433 [###################] + 620.0nm: 6.7819 [###################] + 629.6nm: 6.9311 [####################] + 639.2nm: 7.0607 [####################] + 648.8nm: 7.1652 [####################] + 658.4nm: 7.2412 [####################] + 668.0nm: 7.3020 [#####################] + 677.6nm: 7.3772 [#####################] + 687.2nm: 7.5026 [#####################] + 696.8nm: 7.5342 [#####################] + 706.4nm: 7.4841 [#####################] + 716.0nm: 7.3912 [#####################] + 725.6nm: 7.2247 [####################] + 735.2nm: 7.0265 [####################] + 744.8nm: 6.7293 [###################] + 754.4nm: 6.3794 [##################] + 764.0nm: 5.9717 [#################] + 773.6nm: 5.5819 [################] + 783.2nm: 5.1382 [##############] + 792.8nm: 4.7075 [#############] + 802.3nm: 4.2856 [############] + 811.9nm: 3.8809 [###########] + 821.5nm: 3.4503 [#########] + 831.1nm: 3.0323 [########] + 840.7nm: 2.6561 [#######] + 850.3nm: 2.2916 [######] + 859.9nm: 1.9863 [#####] + 869.5nm: 1.7127 [####] + 879.1nm: 1.4511 [####] + 888.7nm: 1.2506 [###] + 898.3nm: 1.0459 [###] + 907.9nm: 0.8602 [##] + 917.5nm: 0.7136 [##] + 927.1nm: 0.5768 [#] + 936.7nm: 0.4717 [#] + 946.3nm: 0.3844 [#] + 955.9nm: 0.3112 [] + 965.5nm: 0.2369 [] + 975.1nm: 0.1834 [] + 984.7nm: 0.1431 [] + 994.3nm: 0.1127 [] + 1003.9nm: 0.0847 [] + 1013.5nm: 0.0629 [] + 1023.1nm: 0.0458 [] + 1032.7nm: 0.0273 [] + 1042.3nm: 0.0104 [] + +============================================================ +Reading 2 (t=2.13s) +============================================================ + Device: HPCS6500 + Date: 2026-02-04 Time: 16:02:06 + + --- Photometric --- + Phi (lm): 479.89 + eta (lm/W): 57.09 + CCT (K): 5655 + Duv: 0.00550 + + --- Chromaticity --- + x: 0.3288 y: 0.3488 + u: 0.2015 v: 0.3206 + u': 0.2015 v': 0.4809 + + --- CRI --- + Ra: 83.0 SDCM: 4.67 + R1=82, R2=94, R3=93, R4=77, R5=82, R6=89, R7=83, R8=64 + R9=5, R10=84, R11=76, R12=60, R13=86, R14=97, R15=76 + + --- CIE 1931 --- + X: 662.427 Y: 702.620 Z: 649.490 + TLCI-2012: 68 + + --- Radiometric --- + Phi_e (mW): 1492.469 + Phi_eb (mW): 470.073 + Phi_ey (mW): 679.697 + Phi_er (mW): 330.648 + Phi_efr (mW): 11.237 + + --- Electrical --- + Voltage (V): 230.30 + Current (A): 0.0653 + Power (W): 8.406 + Frequency (Hz): 50.02 + Power Factor: 0.5592 + + --- Sensor --- + Peak Signal: 53055 + Dark Signal: 2246 + Compensate: 2834 + + --- Spectrum (380-1050nm) --- + 380.0nm: 0.0003 [] + 389.6nm: 0.0894 [] + 399.2nm: 0.3190 [] + 408.8nm: 0.7735 [##] + 418.4nm: 1.6266 [####] + 428.0nm: 3.0219 [########] + 437.6nm: 5.2066 [###############] + 447.2nm: 8.5984 [########################] + 456.8nm: 12.6300 [####################################] + 466.4nm: 13.6373 [#######################################] + 476.0nm: 10.8302 [###############################] + 485.6nm: 8.3115 [########################] + 495.2nm: 6.7760 [###################] + 504.8nm: 5.5051 [###############] + 514.4nm: 4.7003 [#############] + 524.0nm: 4.4846 [############] + 533.6nm: 4.5981 [#############] + 543.2nm: 4.8781 [##############] + 552.8nm: 5.2836 [###############] + 562.4nm: 5.6906 [################] + 572.0nm: 6.0287 [#################] + 581.6nm: 6.2648 [##################] + 591.2nm: 6.4112 [##################] + 600.8nm: 6.5259 [##################] + 610.4nm: 6.6311 [###################] + 620.0nm: 6.7794 [###################] + 629.6nm: 6.9210 [###################] + 639.2nm: 7.0479 [####################] + 648.8nm: 7.1559 [####################] + 658.4nm: 7.2319 [####################] + 668.0nm: 7.2973 [#####################] + 677.6nm: 7.3794 [#####################] + 687.2nm: 7.4932 [#####################] + 696.8nm: 7.5221 [#####################] + 706.4nm: 7.4767 [#####################] + 716.0nm: 7.3786 [#####################] + 725.6nm: 7.2110 [####################] + 735.2nm: 7.0181 [####################] + 744.8nm: 6.7234 [###################] + 754.4nm: 6.3685 [##################] + 764.0nm: 5.9592 [#################] + 773.6nm: 5.5700 [################] + 783.2nm: 5.1347 [##############] + 792.8nm: 4.6961 [#############] + 802.3nm: 4.2714 [############] + 811.9nm: 3.8696 [###########] + 821.5nm: 3.4402 [#########] + 831.1nm: 3.0220 [########] + 840.7nm: 2.6562 [#######] + 850.3nm: 2.2910 [######] + 859.9nm: 1.9745 [#####] + 869.5nm: 1.7021 [####] + 879.1nm: 1.4475 [####] + 888.7nm: 1.2388 [###] + 898.3nm: 1.0408 [###] + 907.9nm: 0.8597 [##] + 917.5nm: 0.7104 [##] + 927.1nm: 0.5750 [#] + 936.7nm: 0.4669 [#] + 946.3nm: 0.3804 [#] + 955.9nm: 0.3071 [] + 965.5nm: 0.2300 [] + 975.1nm: 0.1785 [] + 984.7nm: 0.1403 [] + 994.3nm: 0.1103 [] + 1003.9nm: 0.0812 [] + 1013.5nm: 0.0610 [] + 1023.1nm: 0.0417 [] + 1032.7nm: 0.0264 [] + 1042.3nm: 0.0066 [] diff --git a/tests/golden/parse_usb_capture_20260204_123655_hub1_quick.txt b/tests/golden/parse_usb_capture_20260204_123655_hub1_quick.txt new file mode 100644 index 0000000..d1369f5 --- /dev/null +++ b/tests/golden/parse_usb_capture_20260204_123655_hub1_quick.txt @@ -0,0 +1,2 @@ + #1 480.0 lm 5653 K + #2 479.9 lm 5655 K diff --git a/tests/golden/parse_usb_capture_20260204_134301_hub1.txt b/tests/golden/parse_usb_capture_20260204_134301_hub1.txt new file mode 100644 index 0000000..8f60b65 --- /dev/null +++ b/tests/golden/parse_usb_capture_20260204_134301_hub1.txt @@ -0,0 +1,47 @@ + +============================================================ +Reading 1 (t=0.01s) +============================================================ + Device: HPCS6500 + Date: 2026-02-04 Time: 17:07:33 + + --- Photometric --- + Phi (lm): 0.00 + eta (lm/W): 0.00 + CCT (K): 0 + Duv: 0.00000 + + --- Chromaticity --- + x: 0.0000 y: 0.0000 + u: 0.0000 v: 0.0000 + u': 0.0000 v': 0.0000 + + --- CRI --- + Ra: 0.0 SDCM: 0.00 + R1=0, R2=0, R3=0, R4=0, R5=0, R6=0, R7=0, R8=0 + R9=0, R10=0, R11=0, R12=0, R13=0, R14=0, R15=0 + + --- CIE 1931 --- + X: 0.000 Y: 0.000 Z: 0.000 + TLCI-2012: 0 + + --- Radiometric --- + Phi_e (mW): 0.000 + Phi_eb (mW): 0.000 + Phi_ey (mW): 0.000 + Phi_er (mW): 0.000 + Phi_efr (mW): 0.000 + + --- Electrical --- + Voltage (V): 0.00 + Current (A): 0.0000 + Power (W): 0.000 + Frequency (Hz): 60.04 + Power Factor: 0.0000 + UThd (%): 0.8692 + AThd (%): 116.7091 + + --- Sensor --- + Peak Signal: 3801 + Dark Signal: 3670 + Compensate: 2836 diff --git a/tests/golden/parse_usb_capture_20260204_134301_hub1_harmonics.txt b/tests/golden/parse_usb_capture_20260204_134301_hub1_harmonics.txt new file mode 100644 index 0000000..9d5f7d5 --- /dev/null +++ b/tests/golden/parse_usb_capture_20260204_134301_hub1_harmonics.txt @@ -0,0 +1,223 @@ + +============================================================ +Reading 1 (t=0.01s) +============================================================ + Device: HPCS6500 + Date: 2026-02-04 Time: 17:07:33 + + --- Photometric --- + Phi (lm): 0.00 + eta (lm/W): 0.00 + CCT (K): 0 + Duv: 0.00000 + + --- Chromaticity --- + x: 0.0000 y: 0.0000 + u: 0.0000 v: 0.0000 + u': 0.0000 v': 0.0000 + + --- CRI --- + Ra: 0.0 SDCM: 0.00 + R1=0, R2=0, R3=0, R4=0, R5=0, R6=0, R7=0, R8=0 + R9=0, R10=0, R11=0, R12=0, R13=0, R14=0, R15=0 + + --- CIE 1931 --- + X: 0.000 Y: 0.000 Z: 0.000 + TLCI-2012: 0 + + --- Radiometric --- + Phi_e (mW): 0.000 + Phi_eb (mW): 0.000 + Phi_ey (mW): 0.000 + Phi_er (mW): 0.000 + Phi_efr (mW): 0.000 + + --- Electrical --- + Voltage (V): 0.00 + Current (A): 0.0000 + Power (W): 0.000 + Frequency (Hz): 60.04 + Power Factor: 0.0000 + UThd (%): 0.8692 + AThd (%): 116.7091 + + --- Voltage Harmonics (%) --- + H 1: 100.0000 + H 2: 0.3466 + H 3: 0.5529 + H 4: 0.1935 + H 5: 0.1009 + H 6: 0.1319 + H 7: 0.1455 + H 8: 0.0709 + H 9: 0.3610 + H10: 0.0452 + H11: 0.2558 + H12: 0.0099 + H13: 0.1471 + H14: 0.0182 + H15: 0.0881 + H16: 0.0119 + H17: 0.0439 + H18: 0.0054 + H19: 0.0441 + H20: 0.0039 + H21: 0.0444 + H22: 0.0038 + H23: 0.0419 + H24: 0.0070 + H25: 0.0277 + H26: 0.0086 + H27: 0.0180 + H28: 0.0038 + H29: 0.0168 + H30: 0.0031 + H31: 0.0085 + H32: 0.0042 + H33: 0.0141 + H34: 0.0039 + H35: 0.0050 + H36: 0.0076 + H37: 0.0172 + H38: 0.0017 + H39: 0.0135 + H40: 0.0122 + H41: 0.0075 + H42: 0.0091 + H43: 0.0079 + H44: 0.0052 + H45: 0.0028 + H46: 0.0063 + H47: 0.0106 + H48: 0.0055 + H49: 0.0066 + H50: 0.0032 + + --- Current Harmonics (%) --- + H 1: 100.0000 + H 2: 1.3069 + H 3: 79.6826 + H 4: 1.6782 + H 5: 62.0099 + H 6: 1.8375 + H 7: 43.0251 + H 8: 1.4561 + H 9: 27.1434 + H10: 0.8638 + H11: 16.3288 + H12: 0.8914 + H13: 10.5836 + H14: 0.8186 + H15: 7.8296 + H16: 0.6092 + H17: 7.1998 + H18: 0.5320 + H19: 6.8390 + H20: 0.7901 + H21: 5.9471 + H22: 0.8641 + H23: 5.4131 + H24: 0.7893 + H25: 5.4738 + H26: 0.6972 + H27: 5.4525 + H28: 0.6923 + H29: 4.8222 + H30: 0.7761 + H31: 4.3909 + H32: 0.7792 + H33: 4.3903 + H34: 0.7458 + H35: 4.3602 + H36: 0.7061 + H37: 3.9436 + H38: 0.6865 + H39: 3.6134 + H40: 0.6928 + H41: 3.4965 + H42: 0.7969 + H43: 3.1709 + H44: 0.7282 + H45: 2.8721 + H46: 0.6770 + H47: 2.6774 + H48: 0.6486 + H49: 2.6343 + H50: 0.6855 + + --- Sensor --- + Peak Signal: 3801 + Dark Signal: 3670 + Compensate: 2836 + + --- Spectrum (380-1050nm) --- + 380.0nm: 0.0000 [] + 389.6nm: 0.0000 [] + 399.2nm: 0.0000 [] + 408.8nm: 0.0000 [] + 418.4nm: 0.0000 [] + 428.0nm: 0.0000 [] + 437.6nm: 0.0000 [] + 447.2nm: 0.0000 [] + 456.8nm: 0.0000 [] + 466.4nm: 0.0000 [] + 476.0nm: 0.0000 [] + 485.6nm: 0.0000 [] + 495.2nm: 0.0000 [] + 504.8nm: 0.0000 [] + 514.4nm: 0.0000 [] + 524.0nm: 0.0000 [] + 533.6nm: 0.0000 [] + 543.2nm: 0.0000 [] + 552.8nm: 0.0000 [] + 562.4nm: 0.0000 [] + 572.0nm: 0.0000 [] + 581.6nm: 0.0000 [] + 591.2nm: 0.0000 [] + 600.8nm: 0.0000 [] + 610.4nm: 0.0000 [] + 620.0nm: 0.0000 [] + 629.6nm: 0.0000 [] + 639.2nm: 0.0000 [] + 648.8nm: 0.0000 [] + 658.4nm: 0.0000 [] + 668.0nm: 0.0000 [] + 677.6nm: 0.0000 [] + 687.2nm: 0.0000 [] + 696.8nm: 0.0000 [] + 706.4nm: 0.0000 [] + 716.0nm: 0.0000 [] + 725.6nm: 0.0000 [] + 735.2nm: 0.0000 [] + 744.8nm: 0.0000 [] + 754.4nm: 0.0000 [] + 764.0nm: 0.0000 [] + 773.6nm: 0.0000 [] + 783.2nm: 0.0000 [] + 792.8nm: 0.0000 [] + 802.3nm: 0.0000 [] + 811.9nm: 0.0000 [] + 821.5nm: 0.0000 [] + 831.1nm: 0.0000 [] + 840.7nm: 0.0000 [] + 850.3nm: 0.0000 [] + 859.9nm: 0.0000 [] + 869.5nm: 0.0000 [] + 879.1nm: 0.0000 [] + 888.7nm: 0.0000 [] + 898.3nm: 0.0000 [] + 907.9nm: 0.0000 [] + 917.5nm: 0.0000 [] + 927.1nm: 0.0000 [] + 936.7nm: 0.0000 [] + 946.3nm: 0.0000 [] + 955.9nm: 0.0000 [] + 965.5nm: 0.0000 [] + 975.1nm: 0.0000 [] + 984.7nm: 0.0000 [] + 994.3nm: 0.0000 [] + 1003.9nm: 0.0000 [] + 1013.5nm: 0.0000 [] + 1023.1nm: 0.0000 [] + 1032.7nm: 0.0000 [] + 1042.3nm: 0.0000 [] diff --git a/tests/golden/parse_usb_capture_20260204_134301_hub1_quick.txt b/tests/golden/parse_usb_capture_20260204_134301_hub1_quick.txt new file mode 100644 index 0000000..bcb27b9 --- /dev/null +++ b/tests/golden/parse_usb_capture_20260204_134301_hub1_quick.txt @@ -0,0 +1 @@ + #1 0.0 lm 0 K diff --git a/tests/golden/pyfmt.json b/tests/golden/pyfmt.json new file mode 100644 index 0000000..39b8163 --- /dev/null +++ b/tests/golden/pyfmt.json @@ -0,0 +1 @@ +[{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":9223372036854775808,"repr":"-0.0","g6":"-0","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4607182418800017408,"repr":"1.0","g6":"1","f2":"1.00","f0":"1","f1":"1.0","round1":"1.0"},{"bits":13830554455654793216,"repr":"-1.0","g6":"-1","f2":"-1.00","f0":"-1","f1":"-1.0","round1":"-1.0"},{"bits":4591870180066957722,"repr":"0.1","g6":"0.1","f2":"0.10","f0":"0","f1":"0.1","round1":"0.1"},{"bits":4602678819172646912,"repr":"0.5","g6":"0.5","f2":"0.50","f0":"0","f1":"0.5","round1":"0.5"},{"bits":4609434218613702656,"repr":"1.5","g6":"1.5","f2":"1.50","f0":"2","f1":"1.5","round1":"1.5"},{"bits":4612811918334230528,"repr":"2.5","g6":"2.5","f2":"2.50","f0":"2","f1":"2.5","round1":"2.5"},{"bits":4593671619917905920,"repr":"0.125","g6":"0.125","f2":"0.12","f0":"0","f1":"0.1","round1":"0.1"},{"bits":4600427019358961664,"repr":"0.375","g6":"0.375","f2":"0.38","f0":"0","f1":"0.4","round1":"0.4"},{"bits":4532020583610935537,"repr":"1e-05","g6":"1e-05","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4547007122018943789,"repr":"0.0001","g6":"0.0001","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4547007085125455641,"repr":"9.99995e-05","g6":"9.99995e-05","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4683220279290232832,"repr":"123456.5","g6":"123456","f2":"123456.50","f0":"123456","f1":"123456.5","round1":"123456.5"},{"bits":4696837142389719040,"repr":"999999.5","g6":"1e+06","f2":"999999.50","f0":"1000000","f1":"999999.5","round1":"999999.5"},{"bits":4831355200913801216,"repr":"1000000000000000.0","g6":"1e+15","f2":"1000000000000000.00","f0":"1000000000000000","f1":"1000000000000000.0","round1":"1000000000000000.0"},{"bits":4846369599423283200,"repr":"1e+16","g6":"1e+16","f2":"10000000000000000.00","f0":"10000000000000000","f1":"10000000000000000.0","round1":"1e+16"},{"bits":4847542438873900484,"repr":"1.2345678901234568e+16","g6":"1.23457e+16","f2":"12345678901234568.00","f0":"12345678901234568","f1":"12345678901234568.0","round1":"1.2345678901234568e+16"},{"bits":4936209963552724370,"repr":"1e+22","g6":"1e+22","f2":"10000000000000000000000.00","f0":"10000000000000000000000","f1":"10000000000000000000000.0","round1":"1e+22"},{"bits":4502148214488346440,"repr":"1e-07","g6":"1e-07","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":1,"repr":"5e-324","g6":"4.94066e-324","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":9218868437227405311,"repr":"1.7976931348623157e+308","g6":"1.79769e+308","f2":null,"f0":null,"f1":null,"round1":"1.7976931348623157e+308"},{"bits":4636737291354636288,"repr":"100.0","g6":"100","f2":"100.00","f0":"100","f1":"100.0","round1":"100.0"},{"bits":4645392646888488960,"repr":"380.0","g6":"380","f2":"380.00","f0":"380","f1":"380.0","round1":"380.0"},{"bits":9221120237041090560,"repr":"nan","g6":"nan","f2":"nan","f0":"nan","f1":"nan","round1":null},{"bits":9218868437227405312,"repr":"inf","g6":"inf","f2":"inf","f0":"inf","f1":"inf","round1":null},{"bits":18442240474082181120,"repr":"-inf","g6":"-inf","f2":"-inf","f0":"-inf","f1":"-inf","round1":null},{"bits":4548686775598520385,"repr":"0.000123456789","g6":"0.000123457","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4712889646492470477,"repr":"12345678.9","g6":"1.23457e+07","f2":"12345678.90","f0":"12345679","f1":"12345678.9","round1":"12345678.9"},{"bits":4607182409792818153,"repr":"0.999999","g6":"0.999999","f2":"1.00","f0":"1","f1":"1.0","round1":"1.0"},{"bits":4607182414296417781,"repr":"0.9999995","g6":"1","f2":"1.00","f0":"1","f1":"1.0","round1":"1.0"},{"bits":4621819117307496543,"repr":"9.9999995","g6":"10","f2":"10.00","f0":"10","f1":"10.0","round1":"10.0"},{"bits":4681608357448201011,"repr":"99999.95","g6":"99999.9","f2":"99999.95","f0":"100000","f1":"99999.9","round1":"99999.9"},{"bits":4698053236609777664,"repr":"1234567.0","g6":"1.23457e+06","f2":"1234567.00","f0":"1234567","f1":"1234567.0","round1":"1234567.0"},{"bits":4599075939470750516,"repr":"0.30000000000000004","g6":"0.3","f2":"0.30","f0":"0","f1":"0.3","round1":"0.3"},{"bits":4645392646888488960,"repr":"380.0","g6":"380","f2":"380.00","f0":"380","f1":"380.0","round1":"380.0"},{"bits":4645426419853101449,"repr":"381.91977077363896","g6":"381.92","f2":"381.92","f0":"382","f1":"381.9","round1":"381.9"},{"bits":4645460192817713938,"repr":"383.8395415472779","g6":"383.84","f2":"383.84","f0":"384","f1":"383.8","round1":"383.8"},{"bits":4645493965782326428,"repr":"385.75931232091693","g6":"385.759","f2":"385.76","f0":"386","f1":"385.8","round1":"385.8"},{"bits":4645527738746938917,"repr":"387.6790830945559","g6":"387.679","f2":"387.68","f0":"388","f1":"387.7","round1":"387.7"},{"bits":4645561511711551406,"repr":"389.59885386819485","g6":"389.599","f2":"389.60","f0":"390","f1":"389.6","round1":"389.6"},{"bits":4645595284676163895,"repr":"391.5186246418338","g6":"391.519","f2":"391.52","f0":"392","f1":"391.5","round1":"391.5"},{"bits":4645629057640776384,"repr":"393.43839541547277","g6":"393.438","f2":"393.44","f0":"393","f1":"393.4","round1":"393.4"},{"bits":4645662830605388873,"repr":"395.3581661891117","g6":"395.358","f2":"395.36","f0":"395","f1":"395.4","round1":"395.4"},{"bits":4645696603570001362,"repr":"397.2779369627507","g6":"397.278","f2":"397.28","f0":"397","f1":"397.3","round1":"397.3"},{"bits":4645730376534613852,"repr":"399.1977077363897","g6":"399.198","f2":"399.20","f0":"399","f1":"399.2","round1":"399.2"},{"bits":4645764149499226341,"repr":"401.11747851002866","g6":"401.117","f2":"401.12","f0":"401","f1":"401.1","round1":"401.1"},{"bits":4645797922463838830,"repr":"403.0372492836676","g6":"403.037","f2":"403.04","f0":"403","f1":"403.0","round1":"403.0"},{"bits":4645831695428451319,"repr":"404.9570200573066","g6":"404.957","f2":"404.96","f0":"405","f1":"405.0","round1":"405.0"},{"bits":4645865468393063808,"repr":"406.87679083094554","g6":"406.877","f2":"406.88","f0":"407","f1":"406.9","round1":"406.9"},{"bits":4645899241357676298,"repr":"408.79656160458455","g6":"408.797","f2":"408.80","f0":"409","f1":"408.8","round1":"408.8"},{"bits":4645933014322288787,"repr":"410.7163323782235","g6":"410.716","f2":"410.72","f0":"411","f1":"410.7","round1":"410.7"},{"bits":4645966787286901276,"repr":"412.63610315186247","g6":"412.636","f2":"412.64","f0":"413","f1":"412.6","round1":"412.6"},{"bits":4646000560251513765,"repr":"414.55587392550143","g6":"414.556","f2":"414.56","f0":"415","f1":"414.6","round1":"414.6"},{"bits":4646034333216126254,"repr":"416.4756446991404","g6":"416.476","f2":"416.48","f0":"416","f1":"416.5","round1":"416.5"},{"bits":4646068106180738743,"repr":"418.39541547277935","g6":"418.395","f2":"418.40","f0":"418","f1":"418.4","round1":"418.4"},{"bits":4646101879145351232,"repr":"420.3151862464183","g6":"420.315","f2":"420.32","f0":"420","f1":"420.3","round1":"420.3"},{"bits":4646135652109963722,"repr":"422.2349570200573","g6":"422.235","f2":"422.23","f0":"422","f1":"422.2","round1":"422.2"},{"bits":4646169425074576211,"repr":"424.1547277936963","g6":"424.155","f2":"424.15","f0":"424","f1":"424.2","round1":"424.2"},{"bits":4646203198039188700,"repr":"426.07449856733524","g6":"426.074","f2":"426.07","f0":"426","f1":"426.1","round1":"426.1"},{"bits":4646236971003801189,"repr":"427.9942693409742","g6":"427.994","f2":"427.99","f0":"428","f1":"428.0","round1":"428.0"},{"bits":4646270743968413678,"repr":"429.91404011461316","g6":"429.914","f2":"429.91","f0":"430","f1":"429.9","round1":"429.9"},{"bits":4646304516933026168,"repr":"431.8338108882522","g6":"431.834","f2":"431.83","f0":"432","f1":"431.8","round1":"431.8"},{"bits":4646338289897638657,"repr":"433.75358166189113","g6":"433.754","f2":"433.75","f0":"434","f1":"433.8","round1":"433.8"},{"bits":4646372062862251146,"repr":"435.6733524355301","g6":"435.673","f2":"435.67","f0":"436","f1":"435.7","round1":"435.7"},{"bits":4646405835826863635,"repr":"437.59312320916905","g6":"437.593","f2":"437.59","f0":"438","f1":"437.6","round1":"437.6"},{"bits":4646439608791476124,"repr":"439.512893982808","g6":"439.513","f2":"439.51","f0":"440","f1":"439.5","round1":"439.5"},{"bits":4646473381756088613,"repr":"441.43266475644697","g6":"441.433","f2":"441.43","f0":"441","f1":"441.4","round1":"441.4"},{"bits":4646507154720701102,"repr":"443.3524355300859","g6":"443.352","f2":"443.35","f0":"443","f1":"443.4","round1":"443.4"},{"bits":4646540927685313592,"repr":"445.27220630372494","g6":"445.272","f2":"445.27","f0":"445","f1":"445.3","round1":"445.3"},{"bits":4646574700649926081,"repr":"447.1919770773639","g6":"447.192","f2":"447.19","f0":"447","f1":"447.2","round1":"447.2"},{"bits":4646608473614538570,"repr":"449.11174785100286","g6":"449.112","f2":"449.11","f0":"449","f1":"449.1","round1":"449.1"},{"bits":4646642246579151059,"repr":"451.0315186246418","g6":"451.032","f2":"451.03","f0":"451","f1":"451.0","round1":"451.0"},{"bits":4646676019543763548,"repr":"452.9512893982808","g6":"452.951","f2":"452.95","f0":"453","f1":"453.0","round1":"453.0"},{"bits":4646709792508376038,"repr":"454.8710601719198","g6":"454.871","f2":"454.87","f0":"455","f1":"454.9","round1":"454.9"},{"bits":4646743565472988527,"repr":"456.79083094555875","g6":"456.791","f2":"456.79","f0":"457","f1":"456.8","round1":"456.8"},{"bits":4646777338437601016,"repr":"458.7106017191977","g6":"458.711","f2":"458.71","f0":"459","f1":"458.7","round1":"458.7"},{"bits":4646811111402213505,"repr":"460.63037249283667","g6":"460.63","f2":"460.63","f0":"461","f1":"460.6","round1":"460.6"},{"bits":4646844884366825994,"repr":"462.55014326647563","g6":"462.55","f2":"462.55","f0":"463","f1":"462.6","round1":"462.6"},{"bits":4646878657331438484,"repr":"464.46991404011465","g6":"464.47","f2":"464.47","f0":"464","f1":"464.5","round1":"464.5"},{"bits":4646912430296050972,"repr":"466.38968481375355","g6":"466.39","f2":"466.39","f0":"466","f1":"466.4","round1":"466.4"},{"bits":4646946203260663462,"repr":"468.30945558739256","g6":"468.309","f2":"468.31","f0":"468","f1":"468.3","round1":"468.3"},{"bits":4646979976225275951,"repr":"470.2292263610315","g6":"470.229","f2":"470.23","f0":"470","f1":"470.2","round1":"470.2"},{"bits":4647013749189888440,"repr":"472.1489971346705","g6":"472.149","f2":"472.15","f0":"472","f1":"472.1","round1":"472.1"},{"bits":4647047522154500929,"repr":"474.06876790830944","g6":"474.069","f2":"474.07","f0":"474","f1":"474.1","round1":"474.1"},{"bits":4647081295119113418,"repr":"475.9885386819484","g6":"475.989","f2":"475.99","f0":"476","f1":"476.0","round1":"476.0"},{"bits":4647115068083725908,"repr":"477.9083094555874","g6":"477.908","f2":"477.91","f0":"478","f1":"477.9","round1":"477.9"},{"bits":4647148841048338397,"repr":"479.8280802292264","g6":"479.828","f2":"479.83","f0":"480","f1":"479.8","round1":"479.8"},{"bits":4647182614012950886,"repr":"481.74785100286533","g6":"481.748","f2":"481.75","f0":"482","f1":"481.7","round1":"481.7"},{"bits":4647216386977563375,"repr":"483.6676217765043","g6":"483.668","f2":"483.67","f0":"484","f1":"483.7","round1":"483.7"},{"bits":4647250159942175864,"repr":"485.58739255014325","g6":"485.587","f2":"485.59","f0":"486","f1":"485.6","round1":"485.6"},{"bits":4647283932906788354,"repr":"487.50716332378227","g6":"487.507","f2":"487.51","f0":"488","f1":"487.5","round1":"487.5"},{"bits":4647317705871400842,"repr":"489.42693409742117","g6":"489.427","f2":"489.43","f0":"489","f1":"489.4","round1":"489.4"},{"bits":4647351478836013332,"repr":"491.3467048710602","g6":"491.347","f2":"491.35","f0":"491","f1":"491.3","round1":"491.3"},{"bits":4647385251800625821,"repr":"493.26647564469914","g6":"493.266","f2":"493.27","f0":"493","f1":"493.3","round1":"493.3"},{"bits":4647419024765238310,"repr":"495.1862464183381","g6":"495.186","f2":"495.19","f0":"495","f1":"495.2","round1":"495.2"},{"bits":4647452797729850799,"repr":"497.10601719197706","g6":"497.106","f2":"497.11","f0":"497","f1":"497.1","round1":"497.1"},{"bits":4647486570694463288,"repr":"499.025787965616","g6":"499.026","f2":"499.03","f0":"499","f1":"499.0","round1":"499.0"},{"bits":4647520343659075778,"repr":"500.94555873925503","g6":"500.946","f2":"500.95","f0":"501","f1":"500.9","round1":"500.9"},{"bits":4647554116623688267,"repr":"502.865329512894","g6":"502.865","f2":"502.87","f0":"503","f1":"502.9","round1":"502.9"},{"bits":4647587889588300756,"repr":"504.78510028653295","g6":"504.785","f2":"504.79","f0":"505","f1":"504.8","round1":"504.8"},{"bits":4647621662552913245,"repr":"506.7048710601719","g6":"506.705","f2":"506.70","f0":"507","f1":"506.7","round1":"506.7"},{"bits":4647655435517525734,"repr":"508.62464183381087","g6":"508.625","f2":"508.62","f0":"509","f1":"508.6","round1":"508.6"},{"bits":4647689208482138224,"repr":"510.5444126074499","g6":"510.544","f2":"510.54","f0":"511","f1":"510.5","round1":"510.5"},{"bits":4647718898446551292,"repr":"512.4641833810888","g6":"512.464","f2":"512.46","f0":"512","f1":"512.5","round1":"512.5"},{"bits":4647735784928857537,"repr":"514.3839541547278","g6":"514.384","f2":"514.38","f0":"514","f1":"514.4","round1":"514.4"},{"bits":4647752671411163782,"repr":"516.3037249283668","g6":"516.304","f2":"516.30","f0":"516","f1":"516.3","round1":"516.3"},{"bits":4647769557893470026,"repr":"518.2234957020057","g6":"518.223","f2":"518.22","f0":"518","f1":"518.2","round1":"518.2"},{"bits":4647786444375776271,"repr":"520.1432664756447","g6":"520.143","f2":"520.14","f0":"520","f1":"520.1","round1":"520.1"},{"bits":4647803330858082515,"repr":"522.0630372492836","g6":"522.063","f2":"522.06","f0":"522","f1":"522.1","round1":"522.1"},{"bits":4647820217340388760,"repr":"523.9828080229227","g6":"523.983","f2":"523.98","f0":"524","f1":"524.0","round1":"524.0"},{"bits":4647837103822695004,"repr":"525.9025787965616","g6":"525.903","f2":"525.90","f0":"526","f1":"525.9","round1":"525.9"},{"bits":4647853990305001249,"repr":"527.8223495702006","g6":"527.822","f2":"527.82","f0":"528","f1":"527.8","round1":"527.8"},{"bits":4647870876787307494,"repr":"529.7421203438396","g6":"529.742","f2":"529.74","f0":"530","f1":"529.7","round1":"529.7"},{"bits":4647887763269613738,"repr":"531.6618911174785","g6":"531.662","f2":"531.66","f0":"532","f1":"531.7","round1":"531.7"},{"bits":4647904649751919983,"repr":"533.5816618911175","g6":"533.582","f2":"533.58","f0":"534","f1":"533.6","round1":"533.6"},{"bits":4647921536234226227,"repr":"535.5014326647564","g6":"535.501","f2":"535.50","f0":"536","f1":"535.5","round1":"535.5"},{"bits":4647938422716532472,"repr":"537.4212034383954","g6":"537.421","f2":"537.42","f0":"537","f1":"537.4","round1":"537.4"},{"bits":4647955309198838716,"repr":"539.3409742120343","g6":"539.341","f2":"539.34","f0":"539","f1":"539.3","round1":"539.3"},{"bits":4647972195681144961,"repr":"541.2607449856733","g6":"541.261","f2":"541.26","f0":"541","f1":"541.3","round1":"541.3"},{"bits":4647989082163451206,"repr":"543.1805157593124","g6":"543.181","f2":"543.18","f0":"543","f1":"543.2","round1":"543.2"},{"bits":4648005968645757450,"repr":"545.1002865329513","g6":"545.1","f2":"545.10","f0":"545","f1":"545.1","round1":"545.1"},{"bits":4648022855128063695,"repr":"547.0200573065903","g6":"547.02","f2":"547.02","f0":"547","f1":"547.0","round1":"547.0"},{"bits":4648039741610369940,"repr":"548.9398280802293","g6":"548.94","f2":"548.94","f0":"549","f1":"548.9","round1":"548.9"},{"bits":4648056628092676184,"repr":"550.8595988538682","g6":"550.86","f2":"550.86","f0":"551","f1":"550.9","round1":"550.9"},{"bits":4648073514574982428,"repr":"552.7793696275071","g6":"552.779","f2":"552.78","f0":"553","f1":"552.8","round1":"552.8"},{"bits":4648090401057288673,"repr":"554.6991404011461","g6":"554.699","f2":"554.70","f0":"555","f1":"554.7","round1":"554.7"},{"bits":4648107287539594918,"repr":"556.6189111747851","g6":"556.619","f2":"556.62","f0":"557","f1":"556.6","round1":"556.6"},{"bits":4648124174021901162,"repr":"558.538681948424","g6":"558.539","f2":"558.54","f0":"559","f1":"558.5","round1":"558.5"},{"bits":4648141060504207407,"repr":"560.458452722063","g6":"560.458","f2":"560.46","f0":"560","f1":"560.5","round1":"560.5"},{"bits":4648157946986513652,"repr":"562.3782234957021","g6":"562.378","f2":"562.38","f0":"562","f1":"562.4","round1":"562.4"},{"bits":4648174833468819896,"repr":"564.297994269341","g6":"564.298","f2":"564.30","f0":"564","f1":"564.3","round1":"564.3"},{"bits":4648191719951126141,"repr":"566.21776504298","g6":"566.218","f2":"566.22","f0":"566","f1":"566.2","round1":"566.2"},{"bits":4648208606433432385,"repr":"568.1375358166189","g6":"568.138","f2":"568.14","f0":"568","f1":"568.1","round1":"568.1"},{"bits":4648225492915738630,"repr":"570.0573065902579","g6":"570.057","f2":"570.06","f0":"570","f1":"570.1","round1":"570.1"},{"bits":4648242379398044874,"repr":"571.9770773638968","g6":"571.977","f2":"571.98","f0":"572","f1":"572.0","round1":"572.0"},{"bits":4648259265880351119,"repr":"573.8968481375358","g6":"573.897","f2":"573.90","f0":"574","f1":"573.9","round1":"573.9"},{"bits":4648276152362657364,"repr":"575.8166189111748","g6":"575.817","f2":"575.82","f0":"576","f1":"575.8","round1":"575.8"},{"bits":4648293038844963608,"repr":"577.7363896848137","g6":"577.736","f2":"577.74","f0":"578","f1":"577.7","round1":"577.7"},{"bits":4648309925327269853,"repr":"579.6561604584527","g6":"579.656","f2":"579.66","f0":"580","f1":"579.7","round1":"579.7"},{"bits":4648326811809576097,"repr":"581.5759312320916","g6":"581.576","f2":"581.58","f0":"582","f1":"581.6","round1":"581.6"},{"bits":4648343698291882342,"repr":"583.4957020057307","g6":"583.496","f2":"583.50","f0":"583","f1":"583.5","round1":"583.5"},{"bits":4648360584774188586,"repr":"585.4154727793696","g6":"585.415","f2":"585.42","f0":"585","f1":"585.4","round1":"585.4"},{"bits":4648377471256494831,"repr":"587.3352435530086","g6":"587.335","f2":"587.34","f0":"587","f1":"587.3","round1":"587.3"},{"bits":4648394357738801076,"repr":"589.2550143266476","g6":"589.255","f2":"589.26","f0":"589","f1":"589.3","round1":"589.3"},{"bits":4648411244221107320,"repr":"591.1747851002865","g6":"591.175","f2":"591.17","f0":"591","f1":"591.2","round1":"591.2"},{"bits":4648428130703413565,"repr":"593.0945558739255","g6":"593.095","f2":"593.09","f0":"593","f1":"593.1","round1":"593.1"},{"bits":4648445017185719810,"repr":"595.0143266475645","g6":"595.014","f2":"595.01","f0":"595","f1":"595.0","round1":"595.0"},{"bits":4648461903668026054,"repr":"596.9340974212034","g6":"596.934","f2":"596.93","f0":"597","f1":"596.9","round1":"596.9"},{"bits":4648478790150332298,"repr":"598.8538681948423","g6":"598.854","f2":"598.85","f0":"599","f1":"598.9","round1":"598.9"},{"bits":4648495676632638543,"repr":"600.7736389684814","g6":"600.774","f2":"600.77","f0":"601","f1":"600.8","round1":"600.8"},{"bits":4648512563114944788,"repr":"602.6934097421204","g6":"602.693","f2":"602.69","f0":"603","f1":"602.7","round1":"602.7"},{"bits":4648529449597251032,"repr":"604.6131805157593","g6":"604.613","f2":"604.61","f0":"605","f1":"604.6","round1":"604.6"},{"bits":4648546336079557277,"repr":"606.5329512893983","g6":"606.533","f2":"606.53","f0":"607","f1":"606.5","round1":"606.5"},{"bits":4648563222561863522,"repr":"608.4527220630373","g6":"608.453","f2":"608.45","f0":"608","f1":"608.5","round1":"608.5"},{"bits":4648580109044169766,"repr":"610.3724928366762","g6":"610.372","f2":"610.37","f0":"610","f1":"610.4","round1":"610.4"},{"bits":4648596995526476011,"repr":"612.2922636103152","g6":"612.292","f2":"612.29","f0":"612","f1":"612.3","round1":"612.3"},{"bits":4648613882008782255,"repr":"614.2120343839541","g6":"614.212","f2":"614.21","f0":"614","f1":"614.2","round1":"614.2"},{"bits":4648630768491088500,"repr":"616.1318051575931","g6":"616.132","f2":"616.13","f0":"616","f1":"616.1","round1":"616.1"},{"bits":4648647654973394744,"repr":"618.051575931232","g6":"618.052","f2":"618.05","f0":"618","f1":"618.1","round1":"618.1"},{"bits":4648664541455700989,"repr":"619.971346704871","g6":"619.971","f2":"619.97","f0":"620","f1":"620.0","round1":"620.0"},{"bits":4648681427938007234,"repr":"621.8911174785101","g6":"621.891","f2":"621.89","f0":"622","f1":"621.9","round1":"621.9"},{"bits":4648698314420313478,"repr":"623.810888252149","g6":"623.811","f2":"623.81","f0":"624","f1":"623.8","round1":"623.8"},{"bits":4648715200902619723,"repr":"625.730659025788","g6":"625.731","f2":"625.73","f0":"626","f1":"625.7","round1":"625.7"},{"bits":4648732087384925967,"repr":"627.6504297994269","g6":"627.65","f2":"627.65","f0":"628","f1":"627.7","round1":"627.7"},{"bits":4648748973867232212,"repr":"629.5702005730659","g6":"629.57","f2":"629.57","f0":"630","f1":"629.6","round1":"629.6"},{"bits":4648765860349538456,"repr":"631.4899713467048","g6":"631.49","f2":"631.49","f0":"631","f1":"631.5","round1":"631.5"},{"bits":4648782746831844701,"repr":"633.4097421203438","g6":"633.41","f2":"633.41","f0":"633","f1":"633.4","round1":"633.4"},{"bits":4648799633314150946,"repr":"635.3295128939828","g6":"635.33","f2":"635.33","f0":"635","f1":"635.3","round1":"635.3"},{"bits":4648816519796457190,"repr":"637.2492836676217","g6":"637.249","f2":"637.25","f0":"637","f1":"637.2","round1":"637.2"},{"bits":4648833406278763435,"repr":"639.1690544412608","g6":"639.169","f2":"639.17","f0":"639","f1":"639.2","round1":"639.2"},{"bits":4648850292761069680,"repr":"641.0888252148998","g6":"641.089","f2":"641.09","f0":"641","f1":"641.1","round1":"641.1"},{"bits":4648867179243375924,"repr":"643.0085959885387","g6":"643.009","f2":"643.01","f0":"643","f1":"643.0","round1":"643.0"},{"bits":4648884065725682168,"repr":"644.9283667621776","g6":"644.928","f2":"644.93","f0":"645","f1":"644.9","round1":"644.9"},{"bits":4648900952207988413,"repr":"646.8481375358166","g6":"646.848","f2":"646.85","f0":"647","f1":"646.8","round1":"646.8"},{"bits":4648917838690294658,"repr":"648.7679083094556","g6":"648.768","f2":"648.77","f0":"649","f1":"648.8","round1":"648.8"},{"bits":4648934725172600902,"repr":"650.6876790830945","g6":"650.688","f2":"650.69","f0":"651","f1":"650.7","round1":"650.7"},{"bits":4648951611654907147,"repr":"652.6074498567335","g6":"652.607","f2":"652.61","f0":"653","f1":"652.6","round1":"652.6"},{"bits":4648968498137213392,"repr":"654.5272206303725","g6":"654.527","f2":"654.53","f0":"655","f1":"654.5","round1":"654.5"},{"bits":4648985384619519636,"repr":"656.4469914040114","g6":"656.447","f2":"656.45","f0":"656","f1":"656.4","round1":"656.4"},{"bits":4649002271101825880,"repr":"658.3667621776503","g6":"658.367","f2":"658.37","f0":"658","f1":"658.4","round1":"658.4"},{"bits":4649019157584132126,"repr":"660.2865329512895","g6":"660.287","f2":"660.29","f0":"660","f1":"660.3","round1":"660.3"},{"bits":4649036044066438370,"repr":"662.2063037249284","g6":"662.206","f2":"662.21","f0":"662","f1":"662.2","round1":"662.2"},{"bits":4649052930548744614,"repr":"664.1260744985673","g6":"664.126","f2":"664.13","f0":"664","f1":"664.1","round1":"664.1"},{"bits":4649069817031050859,"repr":"666.0458452722063","g6":"666.046","f2":"666.05","f0":"666","f1":"666.0","round1":"666.0"},{"bits":4649086703513357104,"repr":"667.9656160458453","g6":"667.966","f2":"667.97","f0":"668","f1":"668.0","round1":"668.0"},{"bits":4649103589995663348,"repr":"669.8853868194842","g6":"669.885","f2":"669.89","f0":"670","f1":"669.9","round1":"669.9"},{"bits":4649120476477969593,"repr":"671.8051575931232","g6":"671.805","f2":"671.81","f0":"672","f1":"671.8","round1":"671.8"},{"bits":4649137362960275838,"repr":"673.7249283667622","g6":"673.725","f2":"673.72","f0":"674","f1":"673.7","round1":"673.7"},{"bits":4649154249442582082,"repr":"675.6446991404011","g6":"675.645","f2":"675.64","f0":"676","f1":"675.6","round1":"675.6"},{"bits":4649171135924888326,"repr":"677.56446991404","g6":"677.564","f2":"677.56","f0":"678","f1":"677.6","round1":"677.6"},{"bits":4649188022407194571,"repr":"679.4842406876791","g6":"679.484","f2":"679.48","f0":"679","f1":"679.5","round1":"679.5"},{"bits":4649204908889500816,"repr":"681.4040114613181","g6":"681.404","f2":"681.40","f0":"681","f1":"681.4","round1":"681.4"},{"bits":4649221795371807060,"repr":"683.323782234957","g6":"683.324","f2":"683.32","f0":"683","f1":"683.3","round1":"683.3"},{"bits":4649238681854113305,"repr":"685.243553008596","g6":"685.244","f2":"685.24","f0":"685","f1":"685.2","round1":"685.2"},{"bits":4649255568336419550,"repr":"687.163323782235","g6":"687.163","f2":"687.16","f0":"687","f1":"687.2","round1":"687.2"},{"bits":4649272454818725794,"repr":"689.0830945558739","g6":"689.083","f2":"689.08","f0":"689","f1":"689.1","round1":"689.1"},{"bits":4649289341301032038,"repr":"691.0028653295128","g6":"691.003","f2":"691.00","f0":"691","f1":"691.0","round1":"691.0"},{"bits":4649306227783338283,"repr":"692.9226361031518","g6":"692.923","f2":"692.92","f0":"693","f1":"692.9","round1":"692.9"},{"bits":4649323114265644528,"repr":"694.8424068767908","g6":"694.842","f2":"694.84","f0":"695","f1":"694.8","round1":"694.8"},{"bits":4649340000747950772,"repr":"696.7621776504297","g6":"696.762","f2":"696.76","f0":"697","f1":"696.8","round1":"696.8"},{"bits":4649356887230257017,"repr":"698.6819484240688","g6":"698.682","f2":"698.68","f0":"699","f1":"698.7","round1":"698.7"},{"bits":4649373773712563262,"repr":"700.6017191977078","g6":"700.602","f2":"700.60","f0":"701","f1":"700.6","round1":"700.6"},{"bits":4649390660194869506,"repr":"702.5214899713467","g6":"702.521","f2":"702.52","f0":"703","f1":"702.5","round1":"702.5"},{"bits":4649407546677175750,"repr":"704.4412607449856","g6":"704.441","f2":"704.44","f0":"704","f1":"704.4","round1":"704.4"},{"bits":4649424433159481996,"repr":"706.3610315186247","g6":"706.361","f2":"706.36","f0":"706","f1":"706.4","round1":"706.4"},{"bits":4649441319641788240,"repr":"708.2808022922636","g6":"708.281","f2":"708.28","f0":"708","f1":"708.3","round1":"708.3"},{"bits":4649458206124094484,"repr":"710.2005730659025","g6":"710.201","f2":"710.20","f0":"710","f1":"710.2","round1":"710.2"},{"bits":4649475092606400729,"repr":"712.1203438395415","g6":"712.12","f2":"712.12","f0":"712","f1":"712.1","round1":"712.1"},{"bits":4649491979088706974,"repr":"714.0401146131805","g6":"714.04","f2":"714.04","f0":"714","f1":"714.0","round1":"714.0"},{"bits":4649508865571013218,"repr":"715.9598853868195","g6":"715.96","f2":"715.96","f0":"716","f1":"716.0","round1":"716.0"},{"bits":4649525752053319463,"repr":"717.8796561604585","g6":"717.88","f2":"717.88","f0":"718","f1":"717.9","round1":"717.9"},{"bits":4649542638535625708,"repr":"719.7994269340975","g6":"719.799","f2":"719.80","f0":"720","f1":"719.8","round1":"719.8"},{"bits":4649559525017931952,"repr":"721.7191977077364","g6":"721.719","f2":"721.72","f0":"722","f1":"721.7","round1":"721.7"},{"bits":4649576411500238196,"repr":"723.6389684813753","g6":"723.639","f2":"723.64","f0":"724","f1":"723.6","round1":"723.6"},{"bits":4649593297982544441,"repr":"725.5587392550143","g6":"725.559","f2":"725.56","f0":"726","f1":"725.6","round1":"725.6"},{"bits":4649610184464850686,"repr":"727.4785100286533","g6":"727.479","f2":"727.48","f0":"727","f1":"727.5","round1":"727.5"},{"bits":4649627070947156930,"repr":"729.3982808022922","g6":"729.398","f2":"729.40","f0":"729","f1":"729.4","round1":"729.4"},{"bits":4649643957429463175,"repr":"731.3180515759312","g6":"731.318","f2":"731.32","f0":"731","f1":"731.3","round1":"731.3"},{"bits":4649660843911769420,"repr":"733.2378223495703","g6":"733.238","f2":"733.24","f0":"733","f1":"733.2","round1":"733.2"},{"bits":4649677730394075664,"repr":"735.1575931232092","g6":"735.158","f2":"735.16","f0":"735","f1":"735.2","round1":"735.2"},{"bits":4649694616876381908,"repr":"737.077363896848","g6":"737.077","f2":"737.08","f0":"737","f1":"737.1","round1":"737.1"},{"bits":4649711503358688153,"repr":"738.9971346704871","g6":"738.997","f2":"739.00","f0":"739","f1":"739.0","round1":"739.0"},{"bits":4649728389840994398,"repr":"740.9169054441261","g6":"740.917","f2":"740.92","f0":"741","f1":"740.9","round1":"740.9"},{"bits":4649745276323300642,"repr":"742.836676217765","g6":"742.837","f2":"742.84","f0":"743","f1":"742.8","round1":"742.8"},{"bits":4649762162805606887,"repr":"744.756446991404","g6":"744.756","f2":"744.76","f0":"745","f1":"744.8","round1":"744.8"},{"bits":4649779049287913132,"repr":"746.676217765043","g6":"746.676","f2":"746.68","f0":"747","f1":"746.7","round1":"746.7"},{"bits":4649795935770219376,"repr":"748.5959885386819","g6":"748.596","f2":"748.60","f0":"749","f1":"748.6","round1":"748.6"},{"bits":4649812822252525620,"repr":"750.5157593123208","g6":"750.516","f2":"750.52","f0":"751","f1":"750.5","round1":"750.5"},{"bits":4649829708734831866,"repr":"752.43553008596","g6":"752.436","f2":"752.44","f0":"752","f1":"752.4","round1":"752.4"},{"bits":4649846595217138110,"repr":"754.3553008595989","g6":"754.355","f2":"754.36","f0":"754","f1":"754.4","round1":"754.4"},{"bits":4649863481699444354,"repr":"756.2750716332378","g6":"756.275","f2":"756.28","f0":"756","f1":"756.3","round1":"756.3"},{"bits":4649880368181750599,"repr":"758.1948424068768","g6":"758.195","f2":"758.19","f0":"758","f1":"758.2","round1":"758.2"},{"bits":4649897254664056844,"repr":"760.1146131805158","g6":"760.115","f2":"760.11","f0":"760","f1":"760.1","round1":"760.1"},{"bits":4649914141146363088,"repr":"762.0343839541547","g6":"762.034","f2":"762.03","f0":"762","f1":"762.0","round1":"762.0"},{"bits":4649931027628669333,"repr":"763.9541547277937","g6":"763.954","f2":"763.95","f0":"764","f1":"764.0","round1":"764.0"},{"bits":4649947914110975578,"repr":"765.8739255014327","g6":"765.874","f2":"765.87","f0":"766","f1":"765.9","round1":"765.9"},{"bits":4649964800593281822,"repr":"767.7936962750716","g6":"767.794","f2":"767.79","f0":"768","f1":"767.8","round1":"767.8"},{"bits":4649981687075588066,"repr":"769.7134670487105","g6":"769.713","f2":"769.71","f0":"770","f1":"769.7","round1":"769.7"},{"bits":4649998573557894311,"repr":"771.6332378223495","g6":"771.633","f2":"771.63","f0":"772","f1":"771.6","round1":"771.6"},{"bits":4650015460040200556,"repr":"773.5530085959886","g6":"773.553","f2":"773.55","f0":"774","f1":"773.6","round1":"773.6"},{"bits":4650032346522506800,"repr":"775.4727793696275","g6":"775.473","f2":"775.47","f0":"775","f1":"775.5","round1":"775.5"},{"bits":4650049233004813045,"repr":"777.3925501432665","g6":"777.393","f2":"777.39","f0":"777","f1":"777.4","round1":"777.4"},{"bits":4650066119487119290,"repr":"779.3123209169055","g6":"779.312","f2":"779.31","f0":"779","f1":"779.3","round1":"779.3"},{"bits":4650083005969425534,"repr":"781.2320916905444","g6":"781.232","f2":"781.23","f0":"781","f1":"781.2","round1":"781.2"},{"bits":4650099892451731778,"repr":"783.1518624641833","g6":"783.152","f2":"783.15","f0":"783","f1":"783.2","round1":"783.2"},{"bits":4650116778934038023,"repr":"785.0716332378223","g6":"785.072","f2":"785.07","f0":"785","f1":"785.1","round1":"785.1"},{"bits":4650133665416344268,"repr":"786.9914040114613","g6":"786.991","f2":"786.99","f0":"787","f1":"787.0","round1":"787.0"},{"bits":4650150551898650512,"repr":"788.9111747851002","g6":"788.911","f2":"788.91","f0":"789","f1":"788.9","round1":"788.9"},{"bits":4650167438380956757,"repr":"790.8309455587392","g6":"790.831","f2":"790.83","f0":"791","f1":"790.8","round1":"790.8"},{"bits":4650184324863263002,"repr":"792.7507163323783","g6":"792.751","f2":"792.75","f0":"793","f1":"792.8","round1":"792.8"},{"bits":4650201211345569246,"repr":"794.6704871060172","g6":"794.67","f2":"794.67","f0":"795","f1":"794.7","round1":"794.7"},{"bits":4650218097827875490,"repr":"796.5902578796561","g6":"796.59","f2":"796.59","f0":"797","f1":"796.6","round1":"796.6"},{"bits":4650234984310181736,"repr":"798.5100286532952","g6":"798.51","f2":"798.51","f0":"799","f1":"798.5","round1":"798.5"},{"bits":4650251870792487980,"repr":"800.4297994269341","g6":"800.43","f2":"800.43","f0":"800","f1":"800.4","round1":"800.4"},{"bits":4650268757274794224,"repr":"802.349570200573","g6":"802.35","f2":"802.35","f0":"802","f1":"802.3","round1":"802.3"},{"bits":4650285643757100469,"repr":"804.269340974212","g6":"804.269","f2":"804.27","f0":"804","f1":"804.3","round1":"804.3"},{"bits":4650302530239406714,"repr":"806.189111747851","g6":"806.189","f2":"806.19","f0":"806","f1":"806.2","round1":"806.2"},{"bits":4650319416721712958,"repr":"808.1088825214899","g6":"808.109","f2":"808.11","f0":"808","f1":"808.1","round1":"808.1"},{"bits":4650336303204019203,"repr":"810.028653295129","g6":"810.029","f2":"810.03","f0":"810","f1":"810.0","round1":"810.0"},{"bits":4650353189686325448,"repr":"811.948424068768","g6":"811.948","f2":"811.95","f0":"812","f1":"811.9","round1":"811.9"},{"bits":4650370076168631692,"repr":"813.8681948424069","g6":"813.868","f2":"813.87","f0":"814","f1":"813.9","round1":"813.9"},{"bits":4650386962650937936,"repr":"815.7879656160458","g6":"815.788","f2":"815.79","f0":"816","f1":"815.8","round1":"815.8"},{"bits":4650403849133244181,"repr":"817.7077363896848","g6":"817.708","f2":"817.71","f0":"818","f1":"817.7","round1":"817.7"},{"bits":4650420735615550426,"repr":"819.6275071633238","g6":"819.628","f2":"819.63","f0":"820","f1":"819.6","round1":"819.6"},{"bits":4650437622097856670,"repr":"821.5472779369627","g6":"821.547","f2":"821.55","f0":"822","f1":"821.5","round1":"821.5"},{"bits":4650454508580162915,"repr":"823.4670487106017","g6":"823.467","f2":"823.47","f0":"823","f1":"823.5","round1":"823.5"},{"bits":4650471395062469160,"repr":"825.3868194842407","g6":"825.387","f2":"825.39","f0":"825","f1":"825.4","round1":"825.4"},{"bits":4650488281544775404,"repr":"827.3065902578796","g6":"827.307","f2":"827.31","f0":"827","f1":"827.3","round1":"827.3"},{"bits":4650505168027081648,"repr":"829.2263610315185","g6":"829.226","f2":"829.23","f0":"829","f1":"829.2","round1":"829.2"},{"bits":4650522054509387893,"repr":"831.1461318051576","g6":"831.146","f2":"831.15","f0":"831","f1":"831.1","round1":"831.1"},{"bits":4650538940991694138,"repr":"833.0659025787966","g6":"833.066","f2":"833.07","f0":"833","f1":"833.1","round1":"833.1"},{"bits":4650555827474000382,"repr":"834.9856733524355","g6":"834.986","f2":"834.99","f0":"835","f1":"835.0","round1":"835.0"},{"bits":4650572713956306627,"repr":"836.9054441260745","g6":"836.905","f2":"836.91","f0":"837","f1":"836.9","round1":"836.9"},{"bits":4650589600438612872,"repr":"838.8252148997135","g6":"838.825","f2":"838.83","f0":"839","f1":"838.8","round1":"838.8"},{"bits":4650606486920919116,"repr":"840.7449856733524","g6":"840.745","f2":"840.74","f0":"841","f1":"840.7","round1":"840.7"},{"bits":4650623373403225360,"repr":"842.6647564469913","g6":"842.665","f2":"842.66","f0":"843","f1":"842.7","round1":"842.7"},{"bits":4650640259885531606,"repr":"844.5845272206304","g6":"844.585","f2":"844.58","f0":"845","f1":"844.6","round1":"844.6"},{"bits":4650657146367837850,"repr":"846.5042979942693","g6":"846.504","f2":"846.50","f0":"847","f1":"846.5","round1":"846.5"},{"bits":4650674032850144094,"repr":"848.4240687679082","g6":"848.424","f2":"848.42","f0":"848","f1":"848.4","round1":"848.4"},{"bits":4650690919332450339,"repr":"850.3438395415473","g6":"850.344","f2":"850.34","f0":"850","f1":"850.3","round1":"850.3"},{"bits":4650707805814756584,"repr":"852.2636103151863","g6":"852.264","f2":"852.26","f0":"852","f1":"852.3","round1":"852.3"},{"bits":4650724692297062828,"repr":"854.1833810888252","g6":"854.183","f2":"854.18","f0":"854","f1":"854.2","round1":"854.2"},{"bits":4650741578779369073,"repr":"856.1031518624642","g6":"856.103","f2":"856.10","f0":"856","f1":"856.1","round1":"856.1"},{"bits":4650758465261675318,"repr":"858.0229226361032","g6":"858.023","f2":"858.02","f0":"858","f1":"858.0","round1":"858.0"},{"bits":4650775351743981562,"repr":"859.9426934097421","g6":"859.943","f2":"859.94","f0":"860","f1":"859.9","round1":"859.9"},{"bits":4650792238226287806,"repr":"861.862464183381","g6":"861.862","f2":"861.86","f0":"862","f1":"861.9","round1":"861.9"},{"bits":4650809124708594051,"repr":"863.78223495702","g6":"863.782","f2":"863.78","f0":"864","f1":"863.8","round1":"863.8"},{"bits":4650826011190900296,"repr":"865.702005730659","g6":"865.702","f2":"865.70","f0":"866","f1":"865.7","round1":"865.7"},{"bits":4650842897673206540,"repr":"867.6217765042979","g6":"867.622","f2":"867.62","f0":"868","f1":"867.6","round1":"867.6"},{"bits":4650859784155512785,"repr":"869.541547277937","g6":"869.542","f2":"869.54","f0":"870","f1":"869.5","round1":"869.5"},{"bits":4650876670637819030,"repr":"871.461318051576","g6":"871.461","f2":"871.46","f0":"871","f1":"871.5","round1":"871.5"},{"bits":4650893557120125274,"repr":"873.3810888252149","g6":"873.381","f2":"873.38","f0":"873","f1":"873.4","round1":"873.4"},{"bits":4650910443602431518,"repr":"875.3008595988538","g6":"875.301","f2":"875.30","f0":"875","f1":"875.3","round1":"875.3"},{"bits":4650927330084737764,"repr":"877.2206303724929","g6":"877.221","f2":"877.22","f0":"877","f1":"877.2","round1":"877.2"},{"bits":4650944216567044008,"repr":"879.1404011461318","g6":"879.14","f2":"879.14","f0":"879","f1":"879.1","round1":"879.1"},{"bits":4650961103049350252,"repr":"881.0601719197707","g6":"881.06","f2":"881.06","f0":"881","f1":"881.1","round1":"881.1"},{"bits":4650977989531656497,"repr":"882.9799426934097","g6":"882.98","f2":"882.98","f0":"883","f1":"883.0","round1":"883.0"},{"bits":4650994876013962742,"repr":"884.8997134670487","g6":"884.9","f2":"884.90","f0":"885","f1":"884.9","round1":"884.9"},{"bits":4651011762496268986,"repr":"886.8194842406876","g6":"886.819","f2":"886.82","f0":"887","f1":"886.8","round1":"886.8"},{"bits":4651028648978575231,"repr":"888.7392550143267","g6":"888.739","f2":"888.74","f0":"889","f1":"888.7","round1":"888.7"},{"bits":4651045535460881476,"repr":"890.6590257879657","g6":"890.659","f2":"890.66","f0":"891","f1":"890.7","round1":"890.7"},{"bits":4651062421943187720,"repr":"892.5787965616046","g6":"892.579","f2":"892.58","f0":"893","f1":"892.6","round1":"892.6"},{"bits":4651079308425493965,"repr":"894.4985673352436","g6":"894.499","f2":"894.50","f0":"894","f1":"894.5","round1":"894.5"},{"bits":4651096194907800209,"repr":"896.4183381088825","g6":"896.418","f2":"896.42","f0":"896","f1":"896.4","round1":"896.4"},{"bits":4651113081390106454,"repr":"898.3381088825215","g6":"898.338","f2":"898.34","f0":"898","f1":"898.3","round1":"898.3"},{"bits":4651129967872412698,"repr":"900.2578796561604","g6":"900.258","f2":"900.26","f0":"900","f1":"900.3","round1":"900.3"},{"bits":4651146854354718943,"repr":"902.1776504297994","g6":"902.178","f2":"902.18","f0":"902","f1":"902.2","round1":"902.2"},{"bits":4651163740837025187,"repr":"904.0974212034383","g6":"904.097","f2":"904.10","f0":"904","f1":"904.1","round1":"904.1"},{"bits":4651180627319331432,"repr":"906.0171919770773","g6":"906.017","f2":"906.02","f0":"906","f1":"906.0","round1":"906.0"},{"bits":4651197513801637677,"repr":"907.9369627507164","g6":"907.937","f2":"907.94","f0":"908","f1":"907.9","round1":"907.9"},{"bits":4651214400283943921,"repr":"909.8567335243553","g6":"909.857","f2":"909.86","f0":"910","f1":"909.9","round1":"909.9"},{"bits":4651231286766250166,"repr":"911.7765042979943","g6":"911.777","f2":"911.78","f0":"912","f1":"911.8","round1":"911.8"},{"bits":4651248173248556410,"repr":"913.6962750716332","g6":"913.696","f2":"913.70","f0":"914","f1":"913.7","round1":"913.7"},{"bits":4651265059730862655,"repr":"915.6160458452722","g6":"915.616","f2":"915.62","f0":"916","f1":"915.6","round1":"915.6"},{"bits":4651281946213168900,"repr":"917.5358166189112","g6":"917.536","f2":"917.54","f0":"918","f1":"917.5","round1":"917.5"},{"bits":4651298832695475144,"repr":"919.4555873925501","g6":"919.456","f2":"919.46","f0":"919","f1":"919.5","round1":"919.5"},{"bits":4651315719177781389,"repr":"921.3753581661891","g6":"921.375","f2":"921.38","f0":"921","f1":"921.4","round1":"921.4"},{"bits":4651332605660087633,"repr":"923.295128939828","g6":"923.295","f2":"923.30","f0":"923","f1":"923.3","round1":"923.3"},{"bits":4651349492142393878,"repr":"925.214899713467","g6":"925.215","f2":"925.21","f0":"925","f1":"925.2","round1":"925.2"},{"bits":4651366378624700122,"repr":"927.134670487106","g6":"927.135","f2":"927.13","f0":"927","f1":"927.1","round1":"927.1"},{"bits":4651383265107006367,"repr":"929.054441260745","g6":"929.054","f2":"929.05","f0":"929","f1":"929.1","round1":"929.1"},{"bits":4651400151589312612,"repr":"930.974212034384","g6":"930.974","f2":"930.97","f0":"931","f1":"931.0","round1":"931.0"},{"bits":4651417038071618856,"repr":"932.8939828080229","g6":"932.894","f2":"932.89","f0":"933","f1":"932.9","round1":"932.9"},{"bits":4651433924553925101,"repr":"934.8137535816619","g6":"934.814","f2":"934.81","f0":"935","f1":"934.8","round1":"934.8"},{"bits":4651450811036231345,"repr":"936.7335243553008","g6":"936.734","f2":"936.73","f0":"937","f1":"936.7","round1":"936.7"},{"bits":4651467697518537590,"repr":"938.6532951289398","g6":"938.653","f2":"938.65","f0":"939","f1":"938.7","round1":"938.7"},{"bits":4651484584000843835,"repr":"940.5730659025788","g6":"940.573","f2":"940.57","f0":"941","f1":"940.6","round1":"940.6"},{"bits":4651501470483150079,"repr":"942.4928366762177","g6":"942.493","f2":"942.49","f0":"942","f1":"942.5","round1":"942.5"},{"bits":4651518356965456324,"repr":"944.4126074498568","g6":"944.413","f2":"944.41","f0":"944","f1":"944.4","round1":"944.4"},{"bits":4651535243447762568,"repr":"946.3323782234957","g6":"946.332","f2":"946.33","f0":"946","f1":"946.3","round1":"946.3"},{"bits":4651552129930068813,"repr":"948.2521489971347","g6":"948.252","f2":"948.25","f0":"948","f1":"948.3","round1":"948.3"},{"bits":4651569016412375057,"repr":"950.1719197707736","g6":"950.172","f2":"950.17","f0":"950","f1":"950.2","round1":"950.2"},{"bits":4651585902894681302,"repr":"952.0916905444126","g6":"952.092","f2":"952.09","f0":"952","f1":"952.1","round1":"952.1"},{"bits":4651602789376987547,"repr":"954.0114613180516","g6":"954.011","f2":"954.01","f0":"954","f1":"954.0","round1":"954.0"},{"bits":4651619675859293791,"repr":"955.9312320916905","g6":"955.931","f2":"955.93","f0":"956","f1":"955.9","round1":"955.9"},{"bits":4651636562341600036,"repr":"957.8510028653295","g6":"957.851","f2":"957.85","f0":"958","f1":"957.9","round1":"957.9"},{"bits":4651653448823906280,"repr":"959.7707736389684","g6":"959.771","f2":"959.77","f0":"960","f1":"959.8","round1":"959.8"},{"bits":4651670335306212525,"repr":"961.6905444126074","g6":"961.691","f2":"961.69","f0":"962","f1":"961.7","round1":"961.7"},{"bits":4651687221788518770,"repr":"963.6103151862465","g6":"963.61","f2":"963.61","f0":"964","f1":"963.6","round1":"963.6"},{"bits":4651704108270825014,"repr":"965.5300859598854","g6":"965.53","f2":"965.53","f0":"966","f1":"965.5","round1":"965.5"},{"bits":4651720994753131259,"repr":"967.4498567335244","g6":"967.45","f2":"967.45","f0":"967","f1":"967.4","round1":"967.4"},{"bits":4651737881235437503,"repr":"969.3696275071633","g6":"969.37","f2":"969.37","f0":"969","f1":"969.4","round1":"969.4"},{"bits":4651754767717743748,"repr":"971.2893982808023","g6":"971.289","f2":"971.29","f0":"971","f1":"971.3","round1":"971.3"},{"bits":4651771654200049992,"repr":"973.2091690544412","g6":"973.209","f2":"973.21","f0":"973","f1":"973.2","round1":"973.2"},{"bits":4651788540682356237,"repr":"975.1289398280802","g6":"975.129","f2":"975.13","f0":"975","f1":"975.1","round1":"975.1"},{"bits":4651805427164662482,"repr":"977.0487106017192","g6":"977.049","f2":"977.05","f0":"977","f1":"977.0","round1":"977.0"},{"bits":4651822313646968726,"repr":"978.9684813753581","g6":"978.968","f2":"978.97","f0":"979","f1":"979.0","round1":"979.0"},{"bits":4651839200129274971,"repr":"980.8882521489971","g6":"980.888","f2":"980.89","f0":"981","f1":"980.9","round1":"980.9"},{"bits":4651856086611581215,"repr":"982.808022922636","g6":"982.808","f2":"982.81","f0":"983","f1":"982.8","round1":"982.8"},{"bits":4651872973093887460,"repr":"984.7277936962751","g6":"984.728","f2":"984.73","f0":"985","f1":"984.7","round1":"984.7"},{"bits":4651889859576193705,"repr":"986.6475644699141","g6":"986.648","f2":"986.65","f0":"987","f1":"986.6","round1":"986.6"},{"bits":4651906746058499949,"repr":"988.567335243553","g6":"988.567","f2":"988.57","f0":"989","f1":"988.6","round1":"988.6"},{"bits":4651923632540806194,"repr":"990.487106017192","g6":"990.487","f2":"990.49","f0":"990","f1":"990.5","round1":"990.5"},{"bits":4651940519023112438,"repr":"992.4068767908309","g6":"992.407","f2":"992.41","f0":"992","f1":"992.4","round1":"992.4"},{"bits":4651957405505418683,"repr":"994.3266475644699","g6":"994.327","f2":"994.33","f0":"994","f1":"994.3","round1":"994.3"},{"bits":4651974291987724927,"repr":"996.2464183381088","g6":"996.246","f2":"996.25","f0":"996","f1":"996.2","round1":"996.2"},{"bits":4651991178470031172,"repr":"998.1661891117478","g6":"998.166","f2":"998.17","f0":"998","f1":"998.2","round1":"998.2"},{"bits":4652008064952337417,"repr":"1000.0859598853868","g6":"1000.09","f2":"1000.09","f0":"1000","f1":"1000.1","round1":"1000.1"},{"bits":4652024951434643661,"repr":"1002.0057306590257","g6":"1002.01","f2":"1002.01","f0":"1002","f1":"1002.0","round1":"1002.0"},{"bits":4652041837916949906,"repr":"1003.9255014326648","g6":"1003.93","f2":"1003.93","f0":"1004","f1":"1003.9","round1":"1003.9"},{"bits":4652058724399256150,"repr":"1005.8452722063037","g6":"1005.85","f2":"1005.85","f0":"1006","f1":"1005.8","round1":"1005.8"},{"bits":4652075610881562395,"repr":"1007.7650429799427","g6":"1007.77","f2":"1007.77","f0":"1008","f1":"1007.8","round1":"1007.8"},{"bits":4652092497363868640,"repr":"1009.6848137535817","g6":"1009.68","f2":"1009.68","f0":"1010","f1":"1009.7","round1":"1009.7"},{"bits":4652109383846174884,"repr":"1011.6045845272206","g6":"1011.6","f2":"1011.60","f0":"1012","f1":"1011.6","round1":"1011.6"},{"bits":4652126270328481129,"repr":"1013.5243553008596","g6":"1013.52","f2":"1013.52","f0":"1014","f1":"1013.5","round1":"1013.5"},{"bits":4652143156810787373,"repr":"1015.4441260744985","g6":"1015.44","f2":"1015.44","f0":"1015","f1":"1015.4","round1":"1015.4"},{"bits":4652160043293093618,"repr":"1017.3638968481375","g6":"1017.36","f2":"1017.36","f0":"1017","f1":"1017.4","round1":"1017.4"},{"bits":4652176929775399862,"repr":"1019.2836676217764","g6":"1019.28","f2":"1019.28","f0":"1019","f1":"1019.3","round1":"1019.3"},{"bits":4652193816257706107,"repr":"1021.2034383954154","g6":"1021.2","f2":"1021.20","f0":"1021","f1":"1021.2","round1":"1021.2"},{"bits":4652210702740012352,"repr":"1023.1232091690545","g6":"1023.12","f2":"1023.12","f0":"1023","f1":"1023.1","round1":"1023.1"},{"bits":4652223002148020482,"repr":"1025.0429799426934","g6":"1025.04","f2":"1025.04","f0":"1025","f1":"1025.0","round1":"1025.0"},{"bits":4652231445389173604,"repr":"1026.9627507163323","g6":"1026.96","f2":"1026.96","f0":"1027","f1":"1027.0","round1":"1027.0"},{"bits":4652239888630326726,"repr":"1028.8825214899712","g6":"1028.88","f2":"1028.88","f0":"1029","f1":"1028.9","round1":"1028.9"},{"bits":4652248331871479849,"repr":"1030.8022922636103","g6":"1030.8","f2":"1030.80","f0":"1031","f1":"1030.8","round1":"1030.8"},{"bits":4652256775112632972,"repr":"1032.7220630372494","g6":"1032.72","f2":"1032.72","f0":"1033","f1":"1032.7","round1":"1032.7"},{"bits":4652265218353786094,"repr":"1034.6418338108883","g6":"1034.64","f2":"1034.64","f0":"1035","f1":"1034.6","round1":"1034.6"},{"bits":4652273661594939216,"repr":"1036.5616045845272","g6":"1036.56","f2":"1036.56","f0":"1037","f1":"1036.6","round1":"1036.6"},{"bits":4652282104836092338,"repr":"1038.4813753581661","g6":"1038.48","f2":"1038.48","f0":"1038","f1":"1038.5","round1":"1038.5"},{"bits":4652290548077245460,"repr":"1040.401146131805","g6":"1040.4","f2":"1040.40","f0":"1040","f1":"1040.4","round1":"1040.4"},{"bits":4652298991318398582,"repr":"1042.320916905444","g6":"1042.32","f2":"1042.32","f0":"1042","f1":"1042.3","round1":"1042.3"},{"bits":4652307434559551705,"repr":"1044.240687679083","g6":"1044.24","f2":"1044.24","f0":"1044","f1":"1044.2","round1":"1044.2"},{"bits":4652315877800704828,"repr":"1046.1604584527222","g6":"1046.16","f2":"1046.16","f0":"1046","f1":"1046.2","round1":"1046.2"},{"bits":4652324321041857950,"repr":"1048.080229226361","g6":"1048.08","f2":"1048.08","f0":"1048","f1":"1048.1","round1":"1048.1"},{"bits":4652332764283011072,"repr":"1050.0","g6":"1050","f2":"1050.00","f0":"1050","f1":"1050.0","round1":"1050.0"},{"bits":13749714944134217728,"repr":"-4.005518349003978e-06","g6":"-4.00552e-06","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13981470944294138503,"repr":"-12972451331.118422","g6":"-1.29725e+10","f2":"-12972451331.12","f0":"-12972451331","f1":"-12972451331.1","round1":"-12972451331.1"},{"bits":4604132371397083136,"repr":"0.6613767147064209","g6":"0.661377","f2":"0.66","f0":"1","f1":"0.7","round1":"0.7"},{"bits":13964573006157053952,"repr":"-943870656.0","g6":"-9.43871e+08","f2":"-943870656.00","f0":"-943870656","f1":"-943870656.0","round1":"-943870656.0"},{"bits":4605352794407305216,"repr":"0.7968708872795105","g6":"0.796871","f2":"0.80","f0":"1","f1":"0.8","round1":"0.8"},{"bits":4582175785615360000,"repr":"0.022615812718868256","g6":"0.0226158","f2":"0.02","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4646372062862251146,"repr":"435.6733524355301","g6":"435.673","f2":"435.67","f0":"436","f1":"435.7","round1":"435.7"},{"bits":4490256617844766084,"repr":"1.5456329604214004e-08","g6":"1.54563e-08","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13974980275125677700,"repr":"-4591208479.308231","g6":"-4.59121e+09","f2":"-4591208479.31","f0":"-4591208479","f1":"-4591208479.3","round1":"-4591208479.3"},{"bits":14043280662687795104,"repr":"-173769505436221.0","g6":"-1.7377e+14","f2":"-173769505436221.00","f0":"-173769505436221","f1":"-173769505436221.0","round1":"-173769505436221.0"},{"bits":13926508745723482794,"repr":"-2739158.2360862093","g6":"-2.73916e+06","f2":"-2739158.24","f0":"-2739158","f1":"-2739158.2","round1":"-2739158.2"},{"bits":13862854220985158511,"repr":"-150.01454488987972","g6":"-150.015","f2":"-150.01","f0":"-150","f1":"-150.0","round1":"-150.0"},{"bits":4779935025520678559,"repr":"373499786862.35345","g6":"3.735e+11","f2":"373499786862.35","f0":"373499786862","f1":"373499786862.4","round1":"373499786862.4"},{"bits":4466201679252276228,"repr":"3.9487783449773506e-10","g6":"3.94878e-10","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4612226449330405376,"repr":"2.239999532699585","g6":"2.24","f2":"2.24","f0":"2","f1":"2.2","round1":"2.2"},{"bits":4436714107575468032,"repr":"4.177968301183332e-12","g6":"4.17797e-12","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4630638461416636416,"repr":"38.66520690917969","g6":"38.6652","f2":"38.67","f0":"39","f1":"38.7","round1":"38.7"},{"bits":13974764641964785664,"repr":"-4385564672.0","g6":"-4.38556e+09","f2":"-4385564672.00","f0":"-4385564672","f1":"-4385564672.0","round1":"-4385564672.0"},{"bits":4646540927685313592,"repr":"445.27220630372494","g6":"445.272","f2":"445.27","f0":"445","f1":"445.3","round1":"445.3"},{"bits":4654786218927276950,"repr":"1607.851","g6":"1607.85","f2":"1607.85","f0":"1608","f1":"1607.9","round1":"1607.9"},{"bits":4792219839986925568,"repr":"2389373091840.0","g6":"2.38937e+12","f2":"2389373091840.00","f0":"2389373091840","f1":"2389373091840.0","round1":"2389373091840.0"},{"bits":4662357079439179776,"repr":"5125.0615234375","g6":"5125.06","f2":"5125.06","f0":"5125","f1":"5125.1","round1":"5125.1"},{"bits":13877296116585725952,"repr":"-1411.8232421875","g6":"-1411.82","f2":"-1411.82","f0":"-1412","f1":"-1411.8","round1":"-1411.8"},{"bits":4604035735706664960,"repr":"0.6506479978561401","g6":"0.650648","f2":"0.65","f0":"1","f1":"0.7","round1":"0.7"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":14038415990182641664,"repr":"-81242989002752.0","g6":"-8.1243e+13","f2":"-81242989002752.00","f0":"-81242989002752","f1":"-81242989002752.0","round1":"-81242989002752.0"},{"bits":4437268159430393856,"repr":"4.625527825347087e-12","g6":"4.62553e-12","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4564367121944936448,"repr":"0.0014580999268218875","g6":"0.0014581","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13966236515173400576,"repr":"-1210610944.0","g6":"-1.21061e+09","f2":"-1210610944.00","f0":"-1210610944","f1":"-1210610944.0","round1":"-1210610944.0"},{"bits":4773235518127166024,"repr":"128587530047.32141","g6":"1.28588e+11","f2":"128587530047.32","f0":"128587530047","f1":"128587530047.3","round1":"128587530047.3"},{"bits":4646270743968413678,"repr":"429.91404011461316","g6":"429.914","f2":"429.91","f0":"430","f1":"429.9","round1":"429.9"},{"bits":4486378641390829568,"repr":"8.76317152176398e-09","g6":"8.76317e-09","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4850532948412050012,"repr":"1.8638997445585264e+16","g6":"1.8639e+16","f2":"18638997445585264.00","f0":"18638997445585264","f1":"18638997445585264.0","round1":"1.8638997445585264e+16"},{"bits":4672264481290584064,"repr":"23775.1640625","g6":"23775.2","f2":"23775.16","f0":"23775","f1":"23775.2","round1":"23775.2"},{"bits":13713119030506684416,"repr":"-1.4335642894991452e-08","g6":"-1.43356e-08","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13800620263478686839,"repr":"-0.010572454097707002","g6":"-0.0105725","f2":"-0.01","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4721792447493963776,"repr":"48604888.0","g6":"4.86049e+07","f2":"48604888.00","f0":"48604888","f1":"48604888.0","round1":"48604888.0"},{"bits":4572608099570941952,"repr":"0.005167808383703232","g6":"0.00516781","f2":"0.01","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13769223490689880059,"repr":"-8.433777555510995e-05","g6":"-8.43378e-05","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13712297667940319232,"repr":"-1.2976812513443292e-08","g6":"-1.29768e-08","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4465202243934617600,"repr":"3.4320823960598545e-10","g6":"3.43208e-10","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13896907499899977728,"repr":"-28398.96875","g6":"-28399","f2":"-28398.97","f0":"-28399","f1":"-28399.0","round1":"-28399.0"},{"bits":13979939255375974278,"repr":"-10050986567.16383","g6":"-1.0051e+10","f2":"-10050986567.16","f0":"-10050986567","f1":"-10050986567.2","round1":"-10050986567.2"},{"bits":13872013556456620032,"repr":"-617.3540649414062","g6":"-617.354","f2":"-617.35","f0":"-617","f1":"-617.4","round1":"-617.4"},{"bits":4829964297351121225,"repr":"826137054665001.1","g6":"8.26137e+14","f2":"826137054665001.12","f0":"826137054665001","f1":"826137054665001.1","round1":"826137054665001.1"},{"bits":4695636664670748672,"repr":"860245.5","g6":"860246","f2":"860245.50","f0":"860246","f1":"860245.5","round1":"860245.5"},{"bits":4841950098613075968,"repr":"5084098817163264.0","g6":"5.0841e+15","f2":"5084098817163264.00","f0":"5084098817163264","f1":"5084098817163264.0","round1":"5084098817163264.0"},{"bits":4769986594423701504,"repr":"79012888576.0","g6":"7.90129e+10","f2":"79012888576.00","f0":"79012888576","f1":"79012888576.0","round1":"79012888576.0"},{"bits":4666155026771724993,"repr":"8966.549","g6":"8966.55","f2":"8966.55","f0":"8967","f1":"8966.5","round1":"8966.5"},{"bits":4764706999432642560,"repr":"33972903936.0","g6":"3.39729e+10","f2":"33972903936.00","f0":"33972903936","f1":"33972903936.0","round1":"33972903936.0"},{"bits":13862416407415941669,"repr":"-137.57113484091056","g6":"-137.571","f2":"-137.57","f0":"-138","f1":"-137.6","round1":"-137.6"},{"bits":4739424068490529611,"repr":"732047572.6292509","g6":"7.32048e+08","f2":"732047572.63","f0":"732047573","f1":"732047572.6","round1":"732047572.6"},{"bits":4593920820899741696,"repr":"0.13191671669483185","g6":"0.131917","f2":"0.13","f0":"0","f1":"0.1","round1":"0.1"},{"bits":4761057389888257477,"repr":"20050748386.43532","g6":"2.00507e+10","f2":"20050748386.44","f0":"20050748386","f1":"20050748386.4","round1":"20050748386.4"},{"bits":4466791900451438592,"repr":"4.2539155531429174e-10","g6":"4.25392e-10","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4645460192817713938,"repr":"383.8395415472779","g6":"383.84","f2":"383.84","f0":"384","f1":"383.8","round1":"383.8"},{"bits":4623981308815605760,"repr":"13.84082317352295","g6":"13.8408","f2":"13.84","f0":"14","f1":"13.8","round1":"13.8"},{"bits":13767821963067303968,"repr":"-6.534353439016692e-05","g6":"-6.53435e-05","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4476970943078471122,"repr":"2.025150352537537e-09","g6":"2.02515e-09","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4578128197698191360,"repr":"0.01209896057844162","g6":"0.012099","f2":"0.01","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4543465013448278016,"repr":"5.651531682815403e-05","g6":"5.65153e-05","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4490138154577166336,"repr":"1.5064367531181233e-08","g6":"1.50644e-08","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4538330266229276672,"repr":"2.611924719531089e-05","g6":"2.61192e-05","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":14003574735601308210,"repr":"-389837264026.2843","g6":"-3.89837e+11","f2":"-389837264026.28","f0":"-389837264026","f1":"-389837264026.3","round1":"-389837264026.3"},{"bits":13849910003164249675,"repr":"-20.76471839751893","g6":"-20.7647","f2":"-20.76","f0":"-21","f1":"-20.8","round1":"-20.8"},{"bits":13709103624694949188,"repr":"-7.692711216991185e-09","g6":"-7.69271e-09","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13728956249622910336,"repr":"-1.7174082762701906e-07","g6":"-1.71741e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4672134963201698693,"repr":"23303.98","g6":"23304","f2":"23303.98","f0":"23304","f1":"23304.0","round1":"23304.0"},{"bits":4586857726780375040,"repr":"0.04646911844611168","g6":"0.0464691","f2":"0.05","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4866904387420684288,"repr":"2.4065246361341133e+17","g6":"2.40652e+17","f2":"240652463613411328.00","f0":"240652463613411328","f1":"240652463613411328.0","round1":"2.4065246361341133e+17"},{"bits":13772929721084615197,"repr":"-0.00014706281475281103","g6":"-0.000147063","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13909518961424702259,"repr":"-201017.58802720308","g6":"-201018","f2":"-201017.59","f0":"-201018","f1":"-201017.6","round1":"-201017.6"},{"bits":13882267717324505088,"repr":"-3036.46875","g6":"-3036.47","f2":"-3036.47","f0":"-3036","f1":"-3036.5","round1":"-3036.5"},{"bits":4498820297822044160,"repr":"5.778001721523651e-08","g6":"5.778e-08","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4672086911812317197,"repr":"23129.170063778805","g6":"23129.2","f2":"23129.17","f0":"23129","f1":"23129.2","round1":"23129.2"},{"bits":13723061249807295796,"repr":"-6.745538565321983e-08","g6":"-6.74554e-08","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4688686914201452544,"repr":"287738.03125","g6":"287738","f2":"287738.03","f0":"287738","f1":"287738.0","round1":"287738.0"},{"bits":13780606296155428917,"repr":"-0.0004661329729568371","g6":"-0.000466133","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13856830521721487360,"repr":"-58.70267868041992","g6":"-58.7027","f2":"-58.70","f0":"-59","f1":"-58.7","round1":"-58.7"},{"bits":14020751741377557936,"repr":"-5419629883373.422","g6":"-5.41963e+12","f2":"-5419629883373.42","f0":"-5419629883373","f1":"-5419629883373.4","round1":"-5419629883373.4"},{"bits":14087925663046565888,"repr":"-1.6542810428879667e+17","g6":"-1.65428e+17","f2":"-165428104288796672.00","f0":"-165428104288796672","f1":"-165428104288796672.0","round1":"-1.6542810428879667e+17"},{"bits":4646541473867628544,"repr":"445.3032531738281","g6":"445.303","f2":"445.30","f0":"445","f1":"445.3","round1":"445.3"},{"bits":13926399254688956416,"repr":"-2688172.5","g6":"-2.68817e+06","f2":"-2688172.50","f0":"-2688172","f1":"-2688172.5","round1":"-2688172.5"},{"bits":4546767246472717347,"repr":"9.674908014568931e-05","g6":"9.67491e-05","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4607427863832952832,"repr":"1.0544997453689575","g6":"1.0545","f2":"1.05","f0":"1","f1":"1.1","round1":"1.1"},{"bits":14089331536302178304,"repr":"-2.10416048468394e+17","g6":"-2.10416e+17","f2":"-210416048468393984.00","f0":"-210416048468393984","f1":"-210416048468393984.0","round1":"-2.10416048468394e+17"},{"bits":4611909761527447552,"repr":"2.0993618965148926","g6":"2.09936","f2":"2.10","f0":"2","f1":"2.1","round1":"2.1"},{"bits":13853585785061638144,"repr":"-35.647438049316406","g6":"-35.6474","f2":"-35.65","f0":"-36","f1":"-35.6","round1":"-35.6"},{"bits":4607286363987902464,"repr":"1.0230804681777954","g6":"1.02308","f2":"1.02","f0":"1","f1":"1.0","round1":"1.0"},{"bits":4695417124850054969,"repr":"834687.701120115","g6":"834688","f2":"834687.70","f0":"834688","f1":"834687.7","round1":"834687.7"},{"bits":4646777338437601016,"repr":"458.7106017191977","g6":"458.711","f2":"458.71","f0":"459","f1":"458.7","round1":"458.7"},{"bits":4797358249548968533,"repr":"5398677760508.583","g6":"5.39868e+12","f2":"5398677760508.58","f0":"5398677760509","f1":"5398677760508.6","round1":"5398677760508.6"},{"bits":4593641811234258944,"repr":"0.124586321413517","g6":"0.124586","f2":"0.12","f0":"0","f1":"0.1","round1":"0.1"},{"bits":13715048250271248869,"repr":"-2.0153377342542575e-08","g6":"-2.01534e-08","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":14085155279217885184,"repr":"-1.10445504923435e+17","g6":"-1.10446e+17","f2":"-110445504923435008.00","f0":"-110445504923435008","f1":"-110445504923435008.0","round1":"-1.10445504923435e+17"},{"bits":13912712021996708331,"repr":"-325751.7631058979","g6":"-325752","f2":"-325751.76","f0":"-325752","f1":"-325751.8","round1":"-325751.8"},{"bits":4593746447911878656,"repr":"0.1270768940448761","g6":"0.127077","f2":"0.13","f0":"0","f1":"0.1","round1":"0.1"},{"bits":4623626315273076736,"repr":"13.210227966308594","g6":"13.2102","f2":"13.21","f0":"13","f1":"13.2","round1":"13.2"},{"bits":13932362864024092672,"repr":"-6736085.0","g6":"-6.73608e+06","f2":"-6736085.00","f0":"-6736085","f1":"-6736085.0","round1":"-6736085.0"},{"bits":4693382423168155648,"repr":"597817.25","g6":"597817","f2":"597817.25","f0":"597817","f1":"597817.2","round1":"597817.2"},{"bits":14088275553631076352,"repr":"-1.7662460299313152e+17","g6":"-1.76625e+17","f2":"-176624602993131520.00","f0":"-176624602993131520","f1":"-176624602993131520.0","round1":"-1.7662460299313152e+17"},{"bits":4783471967636291584,"repr":"628999389184.0","g6":"6.28999e+11","f2":"628999389184.00","f0":"628999389184","f1":"628999389184.0","round1":"628999389184.0"},{"bits":4608201002506518528,"repr":"1.2261710166931152","g6":"1.22617","f2":"1.23","f0":"1","f1":"1.2","round1":"1.2"},{"bits":13994123166058807296,"repr":"-90678763520.0","g6":"-9.06788e+10","f2":"-90678763520.00","f0":"-90678763520","f1":"-90678763520.0","round1":"-90678763520.0"},{"bits":4784501885435581797,"repr":"754721776792.6686","g6":"7.54722e+11","f2":"754721776792.67","f0":"754721776793","f1":"754721776792.7","round1":"754721776792.7"},{"bits":4596746966825697280,"repr":"0.21035802364349365","g6":"0.210358","f2":"0.21","f0":"0","f1":"0.2","round1":"0.2"},{"bits":4554232833233934416,"repr":"0.0003034253398522856","g6":"0.000303425","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13661984702036200936,"repr":"-5.7116109217524734e-12","g6":"-5.71161e-12","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4613875523498541056,"repr":"2.9723355770111084","g6":"2.97234","f2":"2.97","f0":"3","f1":"3.0","round1":"3.0"},{"bits":4664655874785017856,"repr":"7215.8037109375","g6":"7215.8","f2":"7215.80","f0":"7216","f1":"7215.8","round1":"7215.8"},{"bits":4495221266668395855,"repr":"3.3963626861058634e-08","g6":"3.39636e-08","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13953488928221691904,"repr":"-174071856.0","g6":"-1.74072e+08","f2":"-174071856.00","f0":"-174071856","f1":"-174071856.0","round1":"-174071856.0"},{"bits":4609929063270711296,"repr":"1.609877586364746","g6":"1.60988","f2":"1.61","f0":"2","f1":"1.6","round1":"1.6"},{"bits":4786779303738072972,"repr":"1032726940670.9858","g6":"1.03273e+12","f2":"1032726940670.99","f0":"1032726940671","f1":"1032726940671.0","round1":"1032726940671.0"},{"bits":13793965463337892380,"repr":"-0.0036633040163842733","g6":"-0.0036633","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":14001141349282242187,"repr":"-258096528384.73862","g6":"-2.58097e+11","f2":"-258096528384.74","f0":"-258096528385","f1":"-258096528384.7","round1":"-258096528384.7"},{"bits":13717759299216861009,"repr":"-2.9123485852513334e-08","g6":"-2.91235e-08","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":14075410521159719892,"repr":"-2.466114101716155e+16","g6":"-2.46611e+16","f2":"-24661141017161552.00","f0":"-24661141017161552","f1":"-24661141017161552.0","round1":"-2.466114101716155e+16"},{"bits":13664097433968181248,"repr":"-7.560566755993037e-12","g6":"-7.56057e-12","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4646946203260663462,"repr":"468.30945558739256","g6":"468.309","f2":"468.31","f0":"468","f1":"468.3","round1":"468.3"},{"bits":13769776441631703040,"repr":"-9.183165821013972e-05","g6":"-9.18317e-05","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4792561538458189824,"repr":"2556218048512.0","g6":"2.55622e+12","f2":"2556218048512.00","f0":"2556218048512","f1":"2556218048512.0","round1":"2556218048512.0"},{"bits":13950604687086270434,"repr":"-111166249.91915849","g6":"-1.11166e+08","f2":"-111166249.92","f0":"-111166250","f1":"-111166249.9","round1":"-111166249.9"},{"bits":4502417948106901659,"repr":"1.0356989471716241e-07","g6":"1.0357e-07","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4663184032554020766,"repr":"5877.171","g6":"5877.17","f2":"5877.17","f0":"5877","f1":"5877.2","round1":"5877.2"},{"bits":4636010100241203200,"repr":"89.6659927368164","g6":"89.666","f2":"89.67","f0":"90","f1":"89.7","round1":"89.7"},{"bits":14075462061479952384,"repr":"-2.486730229809152e+16","g6":"-2.48673e+16","f2":"-24867302298091520.00","f0":"-24867302298091520","f1":"-24867302298091520.0","round1":"-2.486730229809152e+16"},{"bits":4840415948787242875,"repr":"4026774309350333.5","g6":"4.02677e+15","f2":"4026774309350333.50","f0":"4026774309350334","f1":"4026774309350333.5","round1":"4026774309350333.5"},{"bits":4578504421800935424,"repr":"0.012751605361700058","g6":"0.0127516","f2":"0.01","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4599914913765261312,"repr":"0.3465724289417267","g6":"0.346572","f2":"0.35","f0":"0","f1":"0.3","round1":"0.3"},{"bits":13973494156600665069,"repr":"-3734451353.434073","g6":"-3.73445e+09","f2":"-3734451353.43","f0":"-3734451353","f1":"-3734451353.4","round1":"-3734451353.4"},{"bits":13821444351131123712,"repr":"-0.24714380502700806","g6":"-0.247144","f2":"-0.25","f0":"-0","f1":"-0.2","round1":"-0.2"},{"bits":4593878503123845120,"repr":"0.1307421624660492","g6":"0.130742","f2":"0.13","f0":"0","f1":"0.1","round1":"0.1"},{"bits":13783389153177548829,"repr":"-0.0007457026588235692","g6":"-0.000745703","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":14052506488316887040,"repr":"-722406318538752.0","g6":"-7.22406e+14","f2":"-722406318538752.00","f0":"-722406318538752","f1":"-722406318538752.0","round1":"-722406318538752.0"},{"bits":4733216923062370304,"repr":"266460000.0","g6":"2.6646e+08","f2":"266460000.00","f0":"266460000","f1":"266460000.0","round1":"266460000.0"},{"bits":4533385980838348940,"repr":"1.231307287541765e-05","g6":"1.23131e-05","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4719750741757166559,"repr":"33473713.426395293","g6":"3.34737e+07","f2":"33473713.43","f0":"33473713","f1":"33473713.4","round1":"33473713.4"},{"bits":4811889606825216233,"repr":"51162534538257.82","g6":"5.11625e+13","f2":"51162534538257.82","f0":"51162534538258","f1":"51162534538257.8","round1":"51162534538257.8"},{"bits":13688530734258346264,"repr":"-3.4095693671685195e-10","g6":"-3.40957e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4438942054214533120,"repr":"5.9776892637197765e-12","g6":"5.97769e-12","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13927597762630460030,"repr":"-3246271.2508891216","g6":"-3.24627e+06","f2":"-3246271.25","f0":"-3246271","f1":"-3246271.3","round1":"-3246271.3"},{"bits":14006709613353762816,"repr":"-612594221056.0","g6":"-6.12594e+11","f2":"-612594221056.00","f0":"-612594221056","f1":"-612594221056.0","round1":"-612594221056.0"},{"bits":4595871975150190592,"repr":"0.18607212603092194","g6":"0.186072","f2":"0.19","f0":"0","f1":"0.2","round1":"0.2"},{"bits":4755712177262641868,"repr":"8505029691.828808","g6":"8.50503e+09","f2":"8505029691.83","f0":"8505029692","f1":"8505029691.8","round1":"8505029691.8"},{"bits":4763433187018998726,"repr":"29113695204.753685","g6":"2.91137e+10","f2":"29113695204.75","f0":"29113695205","f1":"29113695204.8","round1":"29113695204.8"},{"bits":4618917504255787008,"repr":"6.422849655151367","g6":"6.42285","f2":"6.42","f0":"6","f1":"6.4","round1":"6.4"},{"bits":4630133075948670471,"repr":"35.07422717896048","g6":"35.0742","f2":"35.07","f0":"35","f1":"35.1","round1":"35.1"},{"bits":4803451570844860416,"repr":"13902280654848.0","g6":"1.39023e+13","f2":"13902280654848.00","f0":"13902280654848","f1":"13902280654848.0","round1":"13902280654848.0"},{"bits":4533697884617406527,"repr":"1.2841458429887455e-05","g6":"1.28415e-05","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13687634949966921728,"repr":"-2.946459742858565e-10","g6":"-2.94646e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4475212920638548169,"repr":"1.5803472311998878e-09","g6":"1.58035e-09","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13889544103151103380,"repr":"-8997.543714693551","g6":"-8997.54","f2":"-8997.54","f0":"-8998","f1":"-8997.5","round1":"-8997.5"},{"bits":4621027957489749293,"repr":"8.594617346686016","g6":"8.59462","f2":"8.59","f0":"9","f1":"8.6","round1":"8.6"},{"bits":14037254948813153274,"repr":"-66735230891079.95","g6":"-6.67352e+13","f2":"-66735230891079.95","f0":"-66735230891080","f1":"-66735230891080.0","round1":"-66735230891080.0"},{"bits":4857717721689630526,"repr":"5.872738409285067e+16","g6":"5.87274e+16","f2":"58727384092850672.00","f0":"58727384092850672","f1":"58727384092850672.0","round1":"5.872738409285067e+16"},{"bits":4613961077636464640,"repr":"3.010329246520996","g6":"3.01033","f2":"3.01","f0":"3","f1":"3.0","round1":"3.0"},{"bits":4635054964475953152,"repr":"76.09269714355469","g6":"76.0927","f2":"76.09","f0":"76","f1":"76.1","round1":"76.1"},{"bits":4830590004604436480,"repr":"904350461329408.0","g6":"9.0435e+14","f2":"904350461329408.00","f0":"904350461329408","f1":"904350461329408.0","round1":"904350461329408.0"},{"bits":14016084999753695232,"repr":"-2630155763712.0","g6":"-2.63016e+12","f2":"-2630155763712.00","f0":"-2630155763712","f1":"-2630155763712.0","round1":"-2630155763712.0"},{"bits":14075568596533116928,"repr":"-2.5293442510749696e+16","g6":"-2.52934e+16","f2":"-25293442510749696.00","f0":"-25293442510749696","f1":"-25293442510749696.0","round1":"-2.5293442510749696e+16"},{"bits":4569930245443944448,"repr":"0.003375695087015629","g6":"0.0033757","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4867989445301721564,"repr":"2.7537431580660416e+17","g6":"2.75374e+17","f2":"275374315806604160.00","f0":"275374315806604160","f1":"275374315806604160.0","round1":"2.7537431580660416e+17"},{"bits":4855193150307696640,"repr":"3.853081303737958e+16","g6":"3.85308e+16","f2":"38530813037379584.00","f0":"38530813037379584","f1":"38530813037379584.0","round1":"3.853081303737958e+16"},{"bits":4586675320593055744,"repr":"0.045203421264886856","g6":"0.0452034","f2":"0.05","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4792411398190001947,"repr":"2482907370685.888","g6":"2.48291e+12","f2":"2482907370685.89","f0":"2482907370686","f1":"2482907370685.9","round1":"2482907370685.9"},{"bits":14052569825418893498,"repr":"-730323456289559.2","g6":"-7.30323e+14","f2":"-730323456289559.25","f0":"-730323456289559","f1":"-730323456289559.2","round1":"-730323456289559.2"},{"bits":13801518603054350336,"repr":"-0.012130824849009514","g6":"-0.0121308","f2":"-0.01","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13930229948519484247,"repr":"-4749652.640810809","g6":"-4.74965e+06","f2":"-4749652.64","f0":"-4749653","f1":"-4749652.6","round1":"-4749652.6"},{"bits":4482258872253284352,"repr":"4.6990829005721935e-09","g6":"4.69908e-09","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4531971655194378240,"repr":"9.917112038237974e-06","g6":"9.91711e-06","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4776332560538009600,"repr":"214250340352.0","g6":"2.1425e+11","f2":"214250340352.00","f0":"214250340352","f1":"214250340352.0","round1":"214250340352.0"},{"bits":13681203269727158272,"repr":"-1.0694929664101238e-10","g6":"-1.06949e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13805030960891497746,"repr":"-0.020822588890280498","g6":"-0.0208226","f2":"-0.02","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4865753067749900288,"repr":"2.0381023414832333e+17","g6":"2.0381e+17","f2":"203810234148323328.00","f0":"203810234148323328","f1":"203810234148323328.0","round1":"2.0381023414832333e+17"},{"bits":13688530734115979264,"repr":"-3.4095692935665056e-10","g6":"-3.40957e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4689772111240101888,"repr":"350904.8125","g6":"350905","f2":"350904.81","f0":"350905","f1":"350904.8","round1":"350904.8"},{"bits":4614687366269894656,"repr":"3.3328661918640137","g6":"3.33287","f2":"3.33","f0":"3","f1":"3.3","round1":"3.3"},{"bits":14074398767963951090,"repr":"-2.0614128234086344e+16","g6":"-2.06141e+16","f2":"-20614128234086344.00","f0":"-20614128234086344","f1":"-20614128234086344.0","round1":"-2.0614128234086344e+16"},{"bits":13831969473127963762,"repr":"-1.31419699579217","g6":"-1.3142","f2":"-1.31","f0":"-1","f1":"-1.3","round1":"-1.3"},{"bits":14033602491255272920,"repr":"-38200406220139.69","g6":"-3.82004e+13","f2":"-38200406220139.69","f0":"-38200406220140","f1":"-38200406220139.7","round1":"-38200406220139.7"},{"bits":4555873849610358845,"repr":"0.0003923850158724684","g6":"0.000392385","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4813446789745082368,"repr":"63328026099712.0","g6":"6.3328e+13","f2":"63328026099712.00","f0":"63328026099712","f1":"63328026099712.0","round1":"63328026099712.0"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4447045466722402304,"repr":"2.0990464574821566e-11","g6":"2.09905e-11","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":14028454394470862939,"repr":"-17087411067400.178","g6":"-1.70874e+13","f2":"-17087411067400.18","f0":"-17087411067400","f1":"-17087411067400.2","round1":"-17087411067400.2"},{"bits":4499304468076045737,"repr":"6.236332961164207e-08","g6":"6.23633e-08","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4859942120379499664,"repr":"8.098755318567962e+16","g6":"8.09876e+16","f2":"80987553185679616.00","f0":"80987553185679616","f1":"80987553185679616.0","round1":"8.098755318567962e+16"},{"bits":4806721747515692464,"repr":"22986502885717.688","g6":"2.29865e+13","f2":"22986502885717.69","f0":"22986502885718","f1":"22986502885717.7","round1":"22986502885717.7"},{"bits":13930001899026644992,"repr":"-4537265.0","g6":"-4.53726e+06","f2":"-4537265.00","f0":"-4537265","f1":"-4537265.0","round1":"-4537265.0"},{"bits":4594165784896339968,"repr":"0.13871583342552185","g6":"0.138716","f2":"0.14","f0":"0","f1":"0.1","round1":"0.1"},{"bits":13741744442570498594,"repr":"-1.2209088624104876e-06","g6":"-1.22091e-06","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4689783274396975104,"repr":"351554.59375","g6":"351555","f2":"351554.59","f0":"351555","f1":"351554.6","round1":"351554.6"},{"bits":13832685720969412608,"repr":"-1.4732359647750854","g6":"-1.47324","f2":"-1.47","f0":"-1","f1":"-1.5","round1":"-1.5"},{"bits":4477925693170122752,"repr":"2.420025735361264e-09","g6":"2.42003e-09","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4613328998036930560,"repr":"2.7296295166015625","g6":"2.72963","f2":"2.73","f0":"3","f1":"2.7","round1":"2.7"},{"bits":4559171395317137408,"repr":"0.0006540094036608934","g6":"0.000654009","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4611906312131837952,"repr":"2.097830057144165","g6":"2.09783","f2":"2.10","f0":"2","f1":"2.1","round1":"2.1"},{"bits":4629631297491304448,"repr":"31.754438400268555","g6":"31.7544","f2":"31.75","f0":"32","f1":"31.8","round1":"31.8"},{"bits":14096687552557762729,"repr":"-6.303127699815354e+17","g6":"-6.30313e+17","f2":"-630312769981535360.00","f0":"-630312769981535360","f1":"-630312769981535360.0","round1":"-6.303127699815354e+17"},{"bits":4658773509884476391,"repr":"2980.912","g6":"2980.91","f2":"2980.91","f0":"2981","f1":"2980.9","round1":"2980.9"},{"bits":14007947062180641260,"repr":"-763649986055.81","g6":"-7.6365e+11","f2":"-763649986055.81","f0":"-763649986056","f1":"-763649986055.8","round1":"-763649986055.8"},{"bits":13857660217598148608,"repr":"-65.196044921875","g6":"-65.196","f2":"-65.20","f0":"-65","f1":"-65.2","round1":"-65.2"},{"bits":4616908789927378944,"repr":"4.6387529373168945","g6":"4.63875","f2":"4.64","f0":"5","f1":"4.6","round1":"4.6"},{"bits":13980620198132548188,"repr":"-11349781802.938652","g6":"-1.13498e+10","f2":"-11349781802.94","f0":"-11349781803","f1":"-11349781802.9","round1":"-11349781802.9"},{"bits":13820174658353961192,"repr":"-0.21190275114185586","g6":"-0.211903","f2":"-0.21","f0":"-0","f1":"-0.2","round1":"-0.2"},{"bits":4733536120493172320,"repr":"283510193.4761715","g6":"2.8351e+08","f2":"283510193.48","f0":"283510193","f1":"283510193.5","round1":"283510193.5"},{"bits":14008915499207185720,"repr":"-881867396522.6631","g6":"-8.81867e+11","f2":"-881867396522.66","f0":"-881867396523","f1":"-881867396522.7","round1":"-881867396522.7"},{"bits":4525716490057416704,"repr":"3.644809794423054e-06","g6":"3.64481e-06","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4452193869253050368,"repr":"4.614787024737055e-11","g6":"4.61479e-11","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4854806579628736512,"repr":"3.5733522312331264e+16","g6":"3.57335e+16","f2":"35733522312331264.00","f0":"35733522312331264","f1":"35733522312331264.0","round1":"3.5733522312331264e+16"},{"bits":4617090163234277932,"repr":"4.7998447944142235","g6":"4.79984","f2":"4.80","f0":"5","f1":"4.8","round1":"4.8"},{"bits":4645561511711551406,"repr":"389.59885386819485","g6":"389.599","f2":"389.60","f0":"390","f1":"389.6","round1":"389.6"},{"bits":13857467332764368896,"repr":"-63.22749328613281","g6":"-63.2275","f2":"-63.23","f0":"-63","f1":"-63.2","round1":"-63.2"},{"bits":13716754968870818636,"repr":"-2.5800435489133637e-08","g6":"-2.58004e-08","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4646608473614538570,"repr":"449.11174785100286","g6":"449.112","f2":"449.11","f0":"449","f1":"449.1","round1":"449.1"},{"bits":13690986992089694208,"repr":"-4.702236933162851e-10","g6":"-4.70224e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4697582477055623168,"repr":"1124959.75","g6":"1.12496e+06","f2":"1124959.75","f0":"1124960","f1":"1124959.8","round1":"1124959.8"},{"bits":13685852894321170953,"repr":"-2.176732501993722e-10","g6":"-2.17673e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13994788411932672000,"repr":"-100829609984.0","g6":"-1.0083e+11","f2":"-100829609984.00","f0":"-100829609984","f1":"-100829609984.0","round1":"-100829609984.0"},{"bits":4670501497610436608,"repr":"17361.466796875","g6":"17361.5","f2":"17361.47","f0":"17361","f1":"17361.5","round1":"17361.5"},{"bits":4641362742650209335,"repr":"203.4632327072629","g6":"203.463","f2":"203.46","f0":"203","f1":"203.5","round1":"203.5"},{"bits":4573757519255568384,"repr":"0.0061647710390388966","g6":"0.00616477","f2":"0.01","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13687782417156312480,"repr":"-3.022698492890887e-10","g6":"-3.0227e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4526252824969712528,"repr":"3.9292156646984164e-06","g6":"3.92922e-06","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4502935440344216391,"repr":"1.104188474508174e-07","g6":"1.10419e-07","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4615638832522461184,"repr":"3.755402088165283","g6":"3.7554","f2":"3.76","f0":"4","f1":"3.8","round1":"3.8"},{"bits":14049763997616439296,"repr":"-471272467202048.0","g6":"-4.71272e+14","f2":"-471272467202048.00","f0":"-471272467202048","f1":"-471272467202048.0","round1":"-471272467202048.0"},{"bits":13746516037176954233,"repr":"-2.555318013312897e-06","g6":"-2.55532e-06","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4448475767604510720,"repr":"2.5612015980280844e-11","g6":"2.5612e-11","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4646574700649926081,"repr":"447.1919770773639","g6":"447.192","f2":"447.19","f0":"447","f1":"447.2","round1":"447.2"},{"bits":4457913946963181568,"repr":"1.0801835120810566e-10","g6":"1.08018e-10","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4580345354032736357,"repr":"0.016265227443775027","g6":"0.0162652","f2":"0.02","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4511281672448114688,"repr":"4.0668408018973423e-07","g6":"4.06684e-07","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13737341600768458752,"repr":"-6.211225809238385e-07","g6":"-6.21123e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13941916643501277184,"repr":"-28980510.0","g6":"-2.89805e+07","f2":"-28980510.00","f0":"-28980510","f1":"-28980510.0","round1":"-28980510.0"},{"bits":13831208006332710912,"repr":"-1.1451174020767212","g6":"-1.14512","f2":"-1.15","f0":"-1","f1":"-1.1","round1":"-1.1"},{"bits":13816903104873518400,"repr":"-0.123049450567426","g6":"-0.123049","f2":"-0.12","f0":"-0","f1":"-0.1","round1":"-0.1"},{"bits":13889898283997855744,"repr":"-9641.794921875","g6":"-9641.79","f2":"-9641.79","f0":"-9642","f1":"-9641.8","round1":"-9641.8"},{"bits":4689898851298719279,"repr":"358282.0548561541","g6":"358282","f2":"358282.05","f0":"358282","f1":"358282.1","round1":"358282.1"},{"bits":4645426419853101449,"repr":"381.91977077363896","g6":"381.92","f2":"381.92","f0":"382","f1":"381.9","round1":"381.9"},{"bits":4684230895010506137,"repr":"145253.78857974408","g6":"145254","f2":"145253.79","f0":"145254","f1":"145253.8","round1":"145253.8"},{"bits":13893609915278163968,"repr":"-16402.42578125","g6":"-16402.4","f2":"-16402.43","f0":"-16402","f1":"-16402.4","round1":"-16402.4"},{"bits":4569851895080624879,"repr":"0.0033417160333651867","g6":"0.00334172","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":14042843171067527168,"repr":"-160097892302848.0","g6":"-1.60098e+14","f2":"-160097892302848.00","f0":"-160097892302848","f1":"-160097892302848.0","round1":"-160097892302848.0"},{"bits":13826640678517473280,"repr":"-0.5654834508895874","g6":"-0.565483","f2":"-0.57","f0":"-1","f1":"-0.6","round1":"-0.6"},{"bits":13953778979312796682,"repr":"-182716052.12600738","g6":"-1.82716e+08","f2":"-182716052.13","f0":"-182716052","f1":"-182716052.1","round1":"-182716052.1"},{"bits":13790708517048616053,"repr":"-0.002250828719383475","g6":"-0.00225083","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4607327450718797824,"repr":"1.0322035551071167","g6":"1.0322","f2":"1.03","f0":"1","f1":"1.0","round1":"1.0"},{"bits":13804315774594056192,"repr":"-0.018341287970542908","g6":"-0.0183413","f2":"-0.02","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4700705963058992828,"repr":"1852203.0066084107","g6":"1.8522e+06","f2":"1852203.01","f0":"1852203","f1":"1852203.0","round1":"1852203.0"},{"bits":4647182614012950886,"repr":"481.74785100286533","g6":"481.748","f2":"481.75","f0":"482","f1":"481.7","round1":"481.7"},{"bits":4726278817849030520,"repr":"96953039.8361491","g6":"9.6953e+07","f2":"96953039.84","f0":"96953040","f1":"96953039.8","round1":"96953039.8"},{"bits":13722438310064558373,"repr":"-5.940774579045589e-08","g6":"-5.94077e-08","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":14007316186753138688,"repr":"-686638825472.0","g6":"-6.86639e+11","f2":"-686638825472.00","f0":"-686638825472","f1":"-686638825472.0","round1":"-686638825472.0"},{"bits":13857660217566953894,"repr":"-65.19604447857145","g6":"-65.196","f2":"-65.20","f0":"-65","f1":"-65.2","round1":"-65.2"},{"bits":13906118418580373504,"repr":"-116560.3828125","g6":"-116560","f2":"-116560.38","f0":"-116560","f1":"-116560.4","round1":"-116560.4"},{"bits":13995791147746721792,"repr":"-116130144256.0","g6":"-1.1613e+11","f2":"-116130144256.00","f0":"-116130144256","f1":"-116130144256.0","round1":"-116130144256.0"},{"bits":14040601372509263660,"repr":"-115389587856220.69","g6":"-1.1539e+14","f2":"-115389587856220.69","f0":"-115389587856221","f1":"-115389587856220.7","round1":"-115389587856220.7"},{"bits":14098689096051153200,"repr":"-8.865103371355156e+17","g6":"-8.8651e+17","f2":"-886510337135515648.00","f0":"-886510337135515648","f1":"-886510337135515648.0","round1":"-8.865103371355156e+17"},{"bits":4829463915300334203,"repr":"763589298316623.4","g6":"7.63589e+14","f2":"763589298316623.38","f0":"763589298316623","f1":"763589298316623.4","round1":"763589298316623.4"},{"bits":4720585534986488558,"repr":"39612689.089620456","g6":"3.96127e+07","f2":"39612689.09","f0":"39612689","f1":"39612689.1","round1":"39612689.1"},{"bits":13843681379029454785,"repr":"-7.659050058431547","g6":"-7.65905","f2":"-7.66","f0":"-8","f1":"-7.7","round1":"-7.7"},{"bits":4649387980622921728,"repr":"702.2168579101562","g6":"702.217","f2":"702.22","f0":"702","f1":"702.2","round1":"702.2"},{"bits":14051434279796211712,"repr":"-588380253454336.0","g6":"-5.8838e+14","f2":"-588380253454336.00","f0":"-588380253454336","f1":"-588380253454336.0","round1":"-588380253454336.0"},{"bits":4665807373839405941,"repr":"8334.172","g6":"8334.17","f2":"8334.17","f0":"8334","f1":"8334.2","round1":"8334.2"},{"bits":4809729208861327360,"repr":"34734398767104.0","g6":"3.47344e+13","f2":"34734398767104.00","f0":"34734398767104","f1":"34734398767104.0","round1":"34734398767104.0"},{"bits":13668630595855450112,"repr":"-1.521665432546726e-11","g6":"-1.52167e-11","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4486754487554520186,"repr":"9.384956841578601e-09","g6":"9.38496e-09","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13826778010064787987,"repr":"-0.5807303154732061","g6":"-0.58073","f2":"-0.58","f0":"-1","f1":"-0.6","round1":"-0.6"},{"bits":4541196049785243838,"repr":"4.1140220998452004e-05","g6":"4.11402e-05","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4599929699190177792,"repr":"0.3473931849002838","g6":"0.347393","f2":"0.35","f0":"0","f1":"0.3","round1":"0.3"},{"bits":4645493965782326428,"repr":"385.75931232091693","g6":"385.759","f2":"385.76","f0":"386","f1":"385.8","round1":"385.8"},{"bits":13677666561727397888,"repr":"-6.12384171150282e-11","g6":"-6.12384e-11","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4870841180653518907,"repr":"4.450293179765265e+17","g6":"4.45029e+17","f2":"445029317976526528.00","f0":"445029317976526528","f1":"445029317976526528.0","round1":"4.450293179765265e+17"},{"bits":4863740787524894720,"repr":"1.4176622751200051e+17","g6":"1.41766e+17","f2":"141766227512000512.00","f0":"141766227512000512","f1":"141766227512000512.0","round1":"1.4176622751200051e+17"},{"bits":4684100599409541120,"repr":"141461.6875","g6":"141462","f2":"141461.69","f0":"141462","f1":"141461.7","round1":"141461.7"},{"bits":13882284951417651200,"repr":"-3044.305908203125","g6":"-3044.31","f2":"-3044.31","f0":"-3044","f1":"-3044.3","round1":"-3044.3"},{"bits":4619628600516149248,"repr":"7.05443000793457","g6":"7.05443","f2":"7.05","f0":"7","f1":"7.1","round1":"7.1"},{"bits":4810601210702725120,"repr":"41096939831296.0","g6":"4.10969e+13","f2":"41096939831296.00","f0":"41096939831296","f1":"41096939831296.0","round1":"41096939831296.0"},{"bits":13912858628332716032,"repr":"-334285.375","g6":"-334285","f2":"-334285.38","f0":"-334285","f1":"-334285.4","round1":"-334285.4"},{"bits":4640742850282514311,"repr":"185.84483195450977","g6":"185.845","f2":"185.84","f0":"186","f1":"185.8","round1":"185.8"},{"bits":4607010864928582329,"repr":"0.9809536941969191","g6":"0.980954","f2":"0.98","f0":"1","f1":"1.0","round1":"1.0"},{"bits":4860618091082448161,"repr":"9.180308443285557e+16","g6":"9.18031e+16","f2":"91803084432855568.00","f0":"91803084432855568","f1":"91803084432855568.0","round1":"9.180308443285557e+16"},{"bits":13994788412043091832,"repr":"-100829611668.87292","g6":"-1.0083e+11","f2":"-100829611668.87","f0":"-100829611669","f1":"-100829611668.9","round1":"-100829611668.9"},{"bits":4564342622644369031,"repr":"0.0014527874878419737","g6":"0.00145279","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13924990804224993331,"repr":"-2064731.8219208836","g6":"-2.06473e+06","f2":"-2064731.82","f0":"-2064732","f1":"-2064731.8","round1":"-2064731.8"},{"bits":13736970383523840000,"repr":"-5.818184263262083e-07","g6":"-5.81818e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4619649450434887680,"repr":"7.072948455810547","g6":"7.07295","f2":"7.07","f0":"7","f1":"7.1","round1":"7.1"},{"bits":13830809067758551040,"repr":"-1.056535243988037","g6":"-1.05654","f2":"-1.06","f0":"-1","f1":"-1.1","round1":"-1.1"},{"bits":4655726196468744192,"repr":"1821.5771484375","g6":"1821.58","f2":"1821.58","f0":"1822","f1":"1821.6","round1":"1821.6"},{"bits":13983505908697169860,"repr":"-16853837903.062386","g6":"-1.68538e+10","f2":"-16853837903.06","f0":"-16853837903","f1":"-16853837903.1","round1":"-16853837903.1"},{"bits":4646878657331438484,"repr":"464.46991404011465","g6":"464.47","f2":"464.47","f0":"464","f1":"464.5","round1":"464.5"},{"bits":13979615659886116864,"repr":"-9433777152.0","g6":"-9.43378e+09","f2":"-9433777152.00","f0":"-9433777152","f1":"-9433777152.0","round1":"-9433777152.0"},{"bits":13778594294568845312,"repr":"-0.00035706214839592576","g6":"-0.000357062","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4571458250389585920,"repr":"0.004170473199337721","g6":"0.00417047","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4867325537418215424,"repr":"2.5412926353440768e+17","g6":"2.54129e+17","f2":"254129263534407680.00","f0":"254129263534407680","f1":"254129263534407680.0","round1":"2.5412926353440768e+17"},{"bits":4620501337870696448,"repr":"7.82957649230957","g6":"7.82958","f2":"7.83","f0":"8","f1":"7.8","round1":"7.8"},{"bits":13727932990112137216,"repr":"-1.446553739015144e-07","g6":"-1.44655e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4651285058589605806,"repr":"917.8896528538223","g6":"917.89","f2":"917.89","f0":"918","f1":"917.9","round1":"917.9"},{"bits":4663677868306031706,"repr":"6326.312","g6":"6326.31","f2":"6326.31","f0":"6326","f1":"6326.3","round1":"6326.3"},{"bits":4692751369206811853,"repr":"524352.9","g6":"524353","f2":"524352.90","f0":"524353","f1":"524352.9","round1":"524352.9"},{"bits":4855193150049428166,"repr":"3.853081097123179e+16","g6":"3.85308e+16","f2":"38530810971231792.00","f0":"38530810971231792","f1":"38530810971231792.0","round1":"3.853081097123179e+16"},{"bits":4673006056786362368,"repr":"26473.0","g6":"26473","f2":"26473.00","f0":"26473","f1":"26473.0","round1":"26473.0"},{"bits":4664722486506553344,"repr":"7276.38671875","g6":"7276.39","f2":"7276.39","f0":"7276","f1":"7276.4","round1":"7276.4"},{"bits":4646405835826863635,"repr":"437.59312320916905","g6":"437.593","f2":"437.59","f0":"438","f1":"437.6","round1":"437.6"},{"bits":13938711175569191498,"repr":"-17039211.41057042","g6":"-1.70392e+07","f2":"-17039211.41","f0":"-17039211","f1":"-17039211.4","round1":"-17039211.4"},{"bits":4738402719782748775,"repr":"610293318.7910889","g6":"6.10293e+08","f2":"610293318.79","f0":"610293319","f1":"610293318.8","round1":"610293318.8"},{"bits":4448419774476163045,"repr":"2.543109242479104e-11","g6":"2.54311e-11","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4710200858626286828,"repr":"7863014.6118709855","g6":"7.86301e+06","f2":"7863014.61","f0":"7863015","f1":"7863014.6","round1":"7863014.6"},{"bits":13831969472895778816,"repr":"-1.3141969442367554","g6":"-1.3142","f2":"-1.31","f0":"-1","f1":"-1.3","round1":"-1.3"},{"bits":4855181281743246158,"repr":"3.843586452177573e+16","g6":"3.84359e+16","f2":"38435864521775728.00","f0":"38435864521775728","f1":"38435864521775728.0","round1":"3.843586452177573e+16"},{"bits":4705645056235667456,"repr":"3907198.5","g6":"3.9072e+06","f2":"3907198.50","f0":"3907198","f1":"3907198.5","round1":"3907198.5"},{"bits":13979578164821622784,"repr":"-9362260992.0","g6":"-9.36226e+09","f2":"-9362260992.00","f0":"-9362260992","f1":"-9362260992.0","round1":"-9362260992.0"},{"bits":4491602934024839610,"repr":"1.991091617430709e-08","g6":"1.99109e-08","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13979219693966196736,"repr":"-8678532096.0","g6":"-8.67853e+09","f2":"-8678532096.00","f0":"-8678532096","f1":"-8678532096.0","round1":"-8678532096.0"},{"bits":4575372821558984704,"repr":"0.0075658224523067474","g6":"0.00756582","f2":"0.01","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13669184546738242619,"repr":"-1.700656616356334e-11","g6":"-1.70066e-11","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4833332502821076992,"repr":"1368425569976320.0","g6":"1.36843e+15","f2":"1368425569976320.00","f0":"1368425569976320","f1":"1368425569976320.0","round1":"1368425569976320.0"},{"bits":4647250159942175864,"repr":"485.58739255014325","g6":"485.587","f2":"485.59","f0":"486","f1":"485.6","round1":"485.6"},{"bits":4775554858730693796,"repr":"190516764689.28625","g6":"1.90517e+11","f2":"190516764689.29","f0":"190516764689","f1":"190516764689.3","round1":"190516764689.3"},{"bits":4792239229079912448,"repr":"2398840422400.0","g6":"2.39884e+12","f2":"2398840422400.00","f0":"2398840422400","f1":"2398840422400.0","round1":"2398840422400.0"},{"bits":4747052825198559273,"repr":"2270897663.7968946","g6":"2.2709e+09","f2":"2270897663.80","f0":"2270897664","f1":"2270897663.8","round1":"2270897663.8"},{"bits":13832540022819485784,"repr":"-1.4408844766362758","g6":"-1.44088","f2":"-1.44","f0":"-1","f1":"-1.4","round1":"-1.4"},{"bits":13831405497644274550,"repr":"-1.1889692823289955","g6":"-1.18897","f2":"-1.19","f0":"-1","f1":"-1.2","round1":"-1.2"},{"bits":13885329987130621952,"repr":"-4762.0556640625","g6":"-4762.06","f2":"-4762.06","f0":"-4762","f1":"-4762.1","round1":"-4762.1"},{"bits":13697062212766177985,"repr":"-1.2654510021592592e-09","g6":"-1.26545e-09","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4580905244631760896,"repr":"0.018207738175988197","g6":"0.0182077","f2":"0.02","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13651097373401362058,"repr":"-1.048213625870659e-12","g6":"-1.04821e-12","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4710747018895556608,"repr":"8371666.0","g6":"8.37167e+06","f2":"8371666.00","f0":"8371666","f1":"8371666.0","round1":"8371666.0"},{"bits":4604893155597221888,"repr":"0.7458407282829285","g6":"0.745841","f2":"0.75","f0":"1","f1":"0.7","round1":"0.7"},{"bits":4646270743968413678,"repr":"429.91404011461316","g6":"429.914","f2":"429.91","f0":"430","f1":"429.9","round1":"429.9"},{"bits":4478204731826634752,"repr":"2.5354334187710492e-09","g6":"2.53543e-09","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4446757332935770112,"repr":"2.0059454097776097e-11","g6":"2.00595e-11","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4674784195258613760,"repr":"33115.66015625","g6":"33115.7","f2":"33115.66","f0":"33116","f1":"33115.7","round1":"33115.7"},{"bits":14062044086504783872,"repr":"-3154824740732928.0","g6":"-3.15482e+15","f2":"-3154824740732928.00","f0":"-3154824740732928","f1":"-3154824740732928.0","round1":"-3154824740732928.0"},{"bits":13851142459234451456,"repr":"-25.143281936645508","g6":"-25.1433","f2":"-25.14","f0":"-25","f1":"-25.1","round1":"-25.1"},{"bits":14098554844583783734,"repr":"-8.69326149312224e+17","g6":"-8.69326e+17","f2":"-869326149312224000.00","f0":"-869326149312224000","f1":"-869326149312224000.0","round1":"-8.69326149312224e+17"},{"bits":14012364100842606804,"repr":"-1506166923917.0518","g6":"-1.50617e+12","f2":"-1506166923917.05","f0":"-1506166923917","f1":"-1506166923917.1","round1":"-1506166923917.1"},{"bits":4616216144846520320,"repr":"4.023560523986816","g6":"4.02356","f2":"4.02","f0":"4","f1":"4.0","round1":"4.0"},{"bits":4643819324282995034,"repr":"290.56696413273096","g6":"290.567","f2":"290.57","f0":"291","f1":"290.6","round1":"290.6"},{"bits":4743382646838222684,"repr":"1334151946.1776953","g6":"1.33415e+09","f2":"1334151946.18","f0":"1334151946","f1":"1334151946.2","round1":"1334151946.2"},{"bits":4531710128289683532,"repr":"9.474068228498268e-06","g6":"9.47407e-06","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4557517197253017600,"repr":"0.00048147107008844614","g6":"0.000481471","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13854502143714656256,"repr":"-42.1585578918457","g6":"-42.1586","f2":"-42.16","f0":"-42","f1":"-42.2","round1":"-42.2"},{"bits":13964698698911842304,"repr":"-958854400.0","g6":"-9.58854e+08","f2":"-958854400.00","f0":"-958854400","f1":"-958854400.0","round1":"-958854400.0"},{"bits":4647047522154500929,"repr":"474.06876790830944","g6":"474.069","f2":"474.07","f0":"474","f1":"474.1","round1":"474.1"},{"bits":14056599857947678672,"repr":"-1342255137932788.0","g6":"-1.34226e+15","f2":"-1342255137932788.00","f0":"-1342255137932788","f1":"-1342255137932788.0","round1":"-1342255137932788.0"},{"bits":4516840809516410189,"repr":"9.251275340699646e-07","g6":"9.25128e-07","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4756521585261674496,"repr":"9963948032.0","g6":"9.96395e+09","f2":"9963948032.00","f0":"9963948032","f1":"9963948032.0","round1":"9963948032.0"},{"bits":13952451048832794226,"repr":"-143140639.8525272","g6":"-1.43141e+08","f2":"-143140639.85","f0":"-143140640","f1":"-143140639.9","round1":"-143140639.9"},{"bits":4816634556884975616,"repr":"106096169582592.0","g6":"1.06096e+14","f2":"106096169582592.00","f0":"106096169582592","f1":"106096169582592.0","round1":"106096169582592.0"},{"bits":4828920298318680169,"repr":"695637175609869.1","g6":"6.95637e+14","f2":"695637175609869.12","f0":"695637175609869","f1":"695637175609869.1","round1":"695637175609869.1"},{"bits":4599012517505664250,"repr":"0.2964793737047128","g6":"0.296479","f2":"0.30","f0":"0","f1":"0.3","round1":"0.3"},{"bits":4636512548600938496,"repr":"96.80621337890625","g6":"96.8062","f2":"96.81","f0":"97","f1":"96.8","round1":"96.8"},{"bits":13923650312399907533,"repr":"-1752624.2474734068","g6":"-1.75262e+06","f2":"-1752624.25","f0":"-1752624","f1":"-1752624.2","round1":"-1752624.2"},{"bits":13911758292608090112,"repr":"-270237.40625","g6":"-270237","f2":"-270237.41","f0":"-270237","f1":"-270237.4","round1":"-270237.4"},{"bits":4514923476686995456,"repr":"7.221220243991411e-07","g6":"7.22122e-07","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13984274987511447552,"repr":"-19461609472.0","g6":"-1.94616e+10","f2":"-19461609472.00","f0":"-19461609472","f1":"-19461609472.0","round1":"-19461609472.0"},{"bits":13953286734440231835,"repr":"-168046011.7401398","g6":"-1.68046e+08","f2":"-168046011.74","f0":"-168046012","f1":"-168046011.7","round1":"-168046011.7"},{"bits":13787968977541837679,"repr":"-0.0015079339227199414","g6":"-0.00150793","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4780469879635624306,"repr":"406144691339.0226","g6":"4.06145e+11","f2":"406144691339.02","f0":"406144691339","f1":"406144691339.0","round1":"406144691339.0"},{"bits":4590316433260541260,"repr":"0.07843743151348298","g6":"0.0784374","f2":"0.08","f0":"0","f1":"0.1","round1":"0.1"},{"bits":4602334559827132416,"repr":"0.48088976740837097","g6":"0.48089","f2":"0.48","f0":"0","f1":"0.5","round1":"0.5"},{"bits":4706320366828519424,"repr":"4249025.0","g6":"4.24902e+06","f2":"4249025.00","f0":"4249025","f1":"4249025.0","round1":"4249025.0"},{"bits":13858145500584214528,"repr":"-72.09233093261719","g6":"-72.0923","f2":"-72.09","f0":"-72","f1":"-72.1","round1":"-72.1"},{"bits":4657759293970736742,"repr":"2519.7","g6":"2519.7","f2":"2519.70","f0":"2520","f1":"2519.7","round1":"2519.7"},{"bits":13813482739652886528,"repr":"-0.0755823478102684","g6":"-0.0755823","f2":"-0.08","f0":"-0","f1":"-0.1","round1":"-0.1"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4603333729744584704,"repr":"0.5727096796035767","g6":"0.57271","f2":"0.57","f0":"1","f1":"0.6","round1":"0.6"},{"bits":4709999925977415680,"repr":"7675881.5","g6":"7.67588e+06","f2":"7675881.50","f0":"7675882","f1":"7675881.5","round1":"7675881.5"},{"bits":4599955937682259968,"repr":"0.34884971380233765","g6":"0.34885","f2":"0.35","f0":"0","f1":"0.3","round1":"0.3"},{"bits":4867193763042494998,"repr":"2.4991248351135405e+17","g6":"2.49912e+17","f2":"249912483511354048.00","f0":"249912483511354048","f1":"249912483511354048.0","round1":"2.4991248351135405e+17"},{"bits":4646000560251513765,"repr":"414.55587392550143","g6":"414.556","f2":"414.56","f0":"415","f1":"414.6","round1":"414.6"},{"bits":4645493965782326428,"repr":"385.75931232091693","g6":"385.759","f2":"385.76","f0":"386","f1":"385.8","round1":"385.8"},{"bits":4531750964205453312,"repr":"9.543246960674878e-06","g6":"9.54325e-06","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4657556406587621376,"repr":"2427.4375","g6":"2427.44","f2":"2427.44","f0":"2427","f1":"2427.4","round1":"2427.4"},{"bits":4627456100566827008,"repr":"24.026586532592773","g6":"24.0266","f2":"24.03","f0":"24","f1":"24.0","round1":"24.0"},{"bits":4630303045408784384,"repr":"36.28193283081055","g6":"36.2819","f2":"36.28","f0":"36","f1":"36.3","round1":"36.3"},{"bits":14051767428061331456,"repr":"-630023786594304.0","g6":"-6.30024e+14","f2":"-630023786594304.00","f0":"-630023786594304","f1":"-630023786594304.0","round1":"-630023786594304.0"},{"bits":4622467381852025659,"repr":"11.151548657414983","g6":"11.1515","f2":"11.15","f0":"11","f1":"11.2","round1":"11.2"},{"bits":4589287814981484544,"repr":"0.0641624853014946","g6":"0.0641625","f2":"0.06","f0":"0","f1":"0.1","round1":"0.1"},{"bits":4673586304806467666,"repr":"28583.93","g6":"28583.9","f2":"28583.93","f0":"28584","f1":"28583.9","round1":"28583.9"},{"bits":4663606210547679232,"repr":"6261.1396484375","g6":"6261.14","f2":"6261.14","f0":"6261","f1":"6261.1","round1":"6261.1"},{"bits":4709657410925494272,"repr":"7356889.5","g6":"7.35689e+06","f2":"7356889.50","f0":"7356890","f1":"7356889.5","round1":"7356889.5"},{"bits":13840907215550021632,"repr":"-5.195097923278809","g6":"-5.1951","f2":"-5.20","f0":"-5","f1":"-5.2","round1":"-5.2"},{"bits":4784359021190578176,"repr":"737282293760.0","g6":"7.37282e+11","f2":"737282293760.00","f0":"737282293760","f1":"737282293760.0","round1":"737282293760.0"},{"bits":14006848731648463070,"repr":"-629576434764.5271","g6":"-6.29576e+11","f2":"-629576434764.53","f0":"-629576434765","f1":"-629576434764.5","round1":"-629576434764.5"},{"bits":4775283666835794541,"repr":"182240644849.83145","g6":"1.82241e+11","f2":"182240644849.83","f0":"182240644850","f1":"182240644849.8","round1":"182240644849.8"},{"bits":13717500163998087945,"repr":"-2.826607933651827e-08","g6":"-2.82661e-08","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13851097449922190477,"repr":"-24.983376737302525","g6":"-24.9834","f2":"-24.98","f0":"-25","f1":"-25.0","round1":"-25.0"},{"bits":4645426419853101449,"repr":"381.91977077363896","g6":"381.92","f2":"381.92","f0":"382","f1":"381.9","round1":"381.9"},{"bits":4630176672438550528,"repr":"35.38399887084961","g6":"35.384","f2":"35.38","f0":"35","f1":"35.4","round1":"35.4"},{"bits":4585076673273218417,"repr":"0.03411057712277","g6":"0.0341106","f2":"0.03","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4509934810432536576,"repr":"3.353817987772345e-07","g6":"3.35382e-07","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13737396704750973371,"repr":"-6.269569420131894e-07","g6":"-6.26957e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":14079280683079958528,"repr":"-4.425478037726822e+16","g6":"-4.42548e+16","f2":"-44254780377268224.00","f0":"-44254780377268224","f1":"-44254780377268224.0","round1":"-4.425478037726822e+16"},{"bits":13949469846040530843,"repr":"-94255800.5671982","g6":"-9.42558e+07","f2":"-94255800.57","f0":"-94255801","f1":"-94255800.6","round1":"-94255800.6"},{"bits":4834877280687751168,"repr":"1754620036644864.0","g6":"1.75462e+15","f2":"1754620036644864.00","f0":"1754620036644864","f1":"1754620036644864.0","round1":"1754620036644864.0"},{"bits":4752622766421704704,"repr":"5558737920.0","g6":"5.55874e+09","f2":"5558737920.00","f0":"5558737920","f1":"5558737920.0","round1":"5558737920.0"},{"bits":4661349614329266176,"repr":"4208.77734375","g6":"4208.78","f2":"4208.78","f0":"4209","f1":"4208.8","round1":"4208.8"},{"bits":4712299652635199808,"repr":"11246729.703678727","g6":"1.12467e+07","f2":"11246729.70","f0":"11246730","f1":"11246729.7","round1":"11246729.7"},{"bits":4648125033141501952,"repr":"558.6363525390625","g6":"558.636","f2":"558.64","f0":"559","f1":"558.6","round1":"558.6"},{"bits":13742241454615429120,"repr":"-1.3261552567200852e-06","g6":"-1.32616e-06","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4601917509375885312,"repr":"0.45773881673812866","g6":"0.457739","f2":"0.46","f0":"0","f1":"0.5","round1":"0.5"},{"bits":13708959764449483463,"repr":"-7.45471440505845e-09","g6":"-7.45471e-09","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13987492837676023808,"repr":"-31736733696.0","g6":"-3.17367e+10","f2":"-31736733696.00","f0":"-31736733696","f1":"-31736733696.0","round1":"-31736733696.0"},{"bits":13898440615081790117,"repr":"-35184.81858052806","g6":"-35184.8","f2":"-35184.82","f0":"-35185","f1":"-35184.8","round1":"-35184.8"},{"bits":13973902684978151424,"repr":"-3929252864.0","g6":"-3.92925e+09","f2":"-3929252864.00","f0":"-3929252864","f1":"-3929252864.0","round1":"-3929252864.0"},{"bits":13983505908655718400,"repr":"-16853837824.0","g6":"-1.68538e+10","f2":"-16853837824.00","f0":"-16853837824","f1":"-16853837824.0","round1":"-16853837824.0"},{"bits":4654274123323670528,"repr":"1491.4139404296875","g6":"1491.41","f2":"1491.41","f0":"1491","f1":"1491.4","round1":"1491.4"},{"bits":4751133286258966528,"repr":"4216613120.0","g6":"4.21661e+09","f2":"4216613120.00","f0":"4216613120","f1":"4216613120.0","round1":"4216613120.0"},{"bits":4676900447257351946,"repr":"48513.42","g6":"48513.4","f2":"48513.42","f0":"48513","f1":"48513.4","round1":"48513.4"},{"bits":13670742725480153088,"repr":"-2.2041313219034464e-11","g6":"-2.20413e-11","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4646304516933026168,"repr":"431.8338108882522","g6":"431.834","f2":"431.83","f0":"432","f1":"431.8","round1":"431.8"},{"bits":4662940323113074688,"repr":"5655.5185546875","g6":"5655.52","f2":"5655.52","f0":"5656","f1":"5655.5","round1":"5655.5"},{"bits":4873280104773451776,"repr":"6.257801710010368e+17","g6":"6.2578e+17","f2":"625780171001036800.00","f0":"625780171001036800","f1":"625780171001036800.0","round1":"6.257801710010368e+17"},{"bits":4579566167597749936,"repr":"0.014593440720953893","g6":"0.0145934","f2":"0.01","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4760348735056117760,"repr":"17347444736.0","g6":"1.73474e+10","f2":"17347444736.00","f0":"17347444736","f1":"17347444736.0","round1":"17347444736.0"},{"bits":13690986991877095018,"repr":"-4.702236713340441e-10","g6":"-4.70224e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4602229459829915648,"repr":"0.4750555455684662","g6":"0.475056","f2":"0.48","f0":"0","f1":"0.5","round1":"0.5"},{"bits":14083034481744161657,"repr":"-7.651274534385858e+16","g6":"-7.65127e+16","f2":"-76512745343858576.00","f0":"-76512745343858576","f1":"-76512745343858576.0","round1":"-7.651274534385858e+16"},{"bits":13876816903462191104,"repr":"-1302.86279296875","g6":"-1302.86","f2":"-1302.86","f0":"-1303","f1":"-1302.9","round1":"-1302.9"},{"bits":4816634556769728737,"repr":"106096167781859.52","g6":"1.06096e+14","f2":"106096167781859.52","f0":"106096167781860","f1":"106096167781859.5","round1":"106096167781859.5"},{"bits":4533242102225567744,"repr":"1.2069333024555817e-05","g6":"1.20693e-05","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13661703296913669929,"repr":"-5.484293674066186e-12","g6":"-5.48429e-12","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4510492809655025059,"repr":"3.6492203165161125e-07","g6":"3.64922e-07","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13667656637932896256,"repr":"-1.331077088828625e-11","g6":"-1.33108e-11","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4768724556938477568,"repr":"64237600768.0","g6":"6.42376e+10","f2":"64237600768.00","f0":"64237600768","f1":"64237600768.0","round1":"64237600768.0"},{"bits":4826483128421842944,"repr":"476970445963264.0","g6":"4.7697e+14","f2":"476970445963264.00","f0":"476970445963264","f1":"476970445963264.0","round1":"476970445963264.0"},{"bits":4743873870258241536,"repr":"1451268736.0","g6":"1.45127e+09","f2":"1451268736.00","f0":"1451268736","f1":"1451268736.0","round1":"1451268736.0"},{"bits":13937792651874009088,"repr":"-15197330.0","g6":"-1.51973e+07","f2":"-15197330.00","f0":"-15197330","f1":"-15197330.0","round1":"-15197330.0"},{"bits":13821689382462783910,"repr":"-0.25788958136220186","g6":"-0.25789","f2":"-0.26","f0":"-0","f1":"-0.3","round1":"-0.3"},{"bits":13656093965886160896,"repr":"-2.2955454811318665e-12","g6":"-2.29555e-12","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13921357853498186060,"repr":"-1218869.5658355532","g6":"-1.21887e+06","f2":"-1218869.57","f0":"-1218870","f1":"-1218869.6","round1":"-1218869.6"},{"bits":4802092478909906944,"repr":"11247804219392.0","g6":"1.12478e+13","f2":"11247804219392.00","f0":"11247804219392","f1":"11247804219392.0","round1":"11247804219392.0"},{"bits":4433257260890036088,"repr":"2.5117642969317127e-12","g6":"2.51176e-12","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13982190704205073122,"repr":"-14345284413.192814","g6":"-1.43453e+10","f2":"-14345284413.19","f0":"-14345284413","f1":"-14345284413.2","round1":"-14345284413.2"},{"bits":13718350583168425968,"repr":"-3.2357438287317576e-08","g6":"-3.23574e-08","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4679893417551399485,"repr":"75044.29","g6":"75044.3","f2":"75044.29","f0":"75044","f1":"75044.3","round1":"75044.3"},{"bits":13783389153108426752,"repr":"-0.0007457026513293386","g6":"-0.000745703","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13977876026869415936,"repr":"-7352812544.0","g6":"-7.35281e+09","f2":"-7352812544.00","f0":"-7352812544","f1":"-7352812544.0","round1":"-7352812544.0"},{"bits":4622467381699018752,"repr":"11.151548385620117","g6":"11.1515","f2":"11.15","f0":"11","f1":"11.2","round1":"11.2"},{"bits":13987901662210845047,"repr":"-33296275531.102993","g6":"-3.32963e+10","f2":"-33296275531.10","f0":"-33296275531","f1":"-33296275531.1","round1":"-33296275531.1"},{"bits":13661922508837563011,"repr":"-5.661371655984943e-12","g6":"-5.66137e-12","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13969046592552960000,"repr":"-1880585600.0","g6":"-1.88059e+09","f2":"-1880585600.00","f0":"-1880585600","f1":"-1880585600.0","round1":"-1880585600.0"},{"bits":4743588280165990400,"repr":"1383178752.0","g6":"1.38318e+09","f2":"1383178752.00","f0":"1383178752","f1":"1383178752.0","round1":"1383178752.0"},{"bits":14049098524646178816,"repr":"-429680406560768.0","g6":"-4.2968e+14","f2":"-429680406560768.00","f0":"-429680406560768","f1":"-429680406560768.0","round1":"-429680406560768.0"},{"bits":4853666624027512993,"repr":"3.1173699907437188e+16","g6":"3.11737e+16","f2":"31173699907437188.00","f0":"31173699907437188","f1":"31173699907437188.0","round1":"3.1173699907437188e+16"},{"bits":4579505801410133918,"repr":"0.014488722078141166","g6":"0.0144887","f2":"0.01","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13672997567307866180,"repr":"-2.95503697646001e-11","g6":"-2.95504e-11","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4617105066174709760,"repr":"4.81308126449585","g6":"4.81308","f2":"4.81","f0":"5","f1":"4.8","round1":"4.8"},{"bits":13898836903101539628,"repr":"-38068.193415234186","g6":"-38068.2","f2":"-38068.19","f0":"-38068","f1":"-38068.2","round1":"-38068.2"},{"bits":14060961529797279744,"repr":"-2613546386980864.0","g6":"-2.61355e+15","f2":"-2613546386980864.00","f0":"-2613546386980864","f1":"-2613546386980864.0","round1":"-2613546386980864.0"},{"bits":4620656621876412416,"repr":"7.967496395111084","g6":"7.9675","f2":"7.97","f0":"8","f1":"8.0","round1":"8.0"},{"bits":4733093972107329536,"repr":"262795776.0","g6":"2.62796e+08","f2":"262795776.00","f0":"262795776","f1":"262795776.0","round1":"262795776.0"},{"bits":14075333000933933056,"repr":"-2.435106011401421e+16","g6":"-2.43511e+16","f2":"-24351060114014208.00","f0":"-24351060114014208","f1":"-24351060114014208.0","round1":"-2.435106011401421e+16"},{"bits":4852985396359358238,"repr":"2.844878923481817e+16","g6":"2.84488e+16","f2":"28448789234818168.00","f0":"28448789234818168","f1":"28448789234818168.0","round1":"2.844878923481817e+16"},{"bits":14064891650895773696,"repr":"-4653614245085184.0","g6":"-4.65361e+15","f2":"-4653614245085184.00","f0":"-4653614245085184","f1":"-4653614245085184.0","round1":"-4653614245085184.0"},{"bits":13711948373282521088,"repr":"-1.2398952975445354e-08","g6":"-1.2399e-08","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13740547207102474979,"repr":"-9.673843906511316e-07","g6":"-9.67384e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4666210783556125327,"repr":"9067.97","g6":"9067.97","f2":"9067.97","f0":"9068","f1":"9068.0","round1":"9068.0"},{"bits":14011941690974142464,"repr":"-1403039514624.0","g6":"-1.40304e+12","f2":"-1403039514624.00","f0":"-1403039514624","f1":"-1403039514624.0","round1":"-1403039514624.0"},{"bits":4628333393271062528,"repr":"27.143356323242188","g6":"27.1434","f2":"27.14","f0":"27","f1":"27.1","round1":"27.1"},{"bits":4655707942857736192,"repr":"1817.4267578125","g6":"1817.43","f2":"1817.43","f0":"1817","f1":"1817.4","round1":"1817.4"},{"bits":4615937038544273408,"repr":"3.8878321647644043","g6":"3.88783","f2":"3.89","f0":"4","f1":"3.9","round1":"3.9"},{"bits":4641636222586796900,"repr":"211.236","g6":"211.236","f2":"211.24","f0":"211","f1":"211.2","round1":"211.2"},{"bits":13665517731555426724,"repr":"-9.855181264245576e-12","g6":"-9.85518e-12","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4673792004175495731,"repr":"29332.25994515624","g6":"29332.3","f2":"29332.26","f0":"29332","f1":"29332.3","round1":"29332.3"},{"bits":14016633762893266944,"repr":"-2898106515456.0","g6":"-2.89811e+12","f2":"-2898106515456.00","f0":"-2898106515456","f1":"-2898106515456.0","round1":"-2898106515456.0"},{"bits":4648158327191109632,"repr":"562.4214477539062","g6":"562.421","f2":"562.42","f0":"562","f1":"562.4","round1":"562.4"},{"bits":14070975124715077632,"repr":"-1.2466976874037248e+16","g6":"-1.2467e+16","f2":"-12466976874037248.00","f0":"-12466976874037248","f1":"-12466976874037248.0","round1":"-1.2466976874037248e+16"},{"bits":14033536810275171182,"repr":"-37687273563094.86","g6":"-3.76873e+13","f2":"-37687273563094.86","f0":"-37687273563095","f1":"-37687273563094.9","round1":"-37687273563094.9"},{"bits":13942873532047183852,"repr":"-32545197.61677544","g6":"-3.25452e+07","f2":"-32545197.62","f0":"-32545198","f1":"-32545197.6","round1":"-32545197.6"},{"bits":13682540282353896730,"repr":"-1.3204423781686027e-10","g6":"-1.32044e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13996407916751905909,"repr":"-125541292406.39241","g6":"-1.25541e+11","f2":"-125541292406.39","f0":"-125541292406","f1":"-125541292406.4","round1":"-125541292406.4"},{"bits":4693103925033277850,"repr":"565395.8","g6":"565396","f2":"565395.80","f0":"565396","f1":"565395.8","round1":"565395.8"},{"bits":4526613625273894515,"repr":"4.234825409719933e-06","g6":"4.23483e-06","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13844481462100819968,"repr":"-8.739333152770996","g6":"-8.73933","f2":"-8.74","f0":"-9","f1":"-8.7","round1":"-8.7"},{"bits":13681899839334383616,"repr":"-1.1595224780336366e-10","g6":"-1.15952e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13885470358145340701,"repr":"-4889.722358231692","g6":"-4889.72","f2":"-4889.72","f0":"-4890","f1":"-4889.7","round1":"-4889.7"},{"bits":13726396522470309888,"repr":"-1.1159735180399366e-07","g6":"-1.11597e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4530320961286701056,"repr":"7.375061159109464e-06","g6":"7.37506e-06","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13814030658831384576,"repr":"-0.08318625390529633","g6":"-0.0831863","f2":"-0.08","f0":"-0","f1":"-0.1","round1":"-0.1"},{"bits":13977695689796883073,"repr":"-7180829709.629518","g6":"-7.18083e+09","f2":"-7180829709.63","f0":"-7180829710","f1":"-7180829709.6","round1":"-7180829709.6"},{"bits":14084594431801237616,"repr":"-1.0147194625707392e+17","g6":"-1.01472e+17","f2":"-101471946257073920.00","f0":"-101471946257073920","f1":"-101471946257073920.0","round1":"-1.0147194625707392e+17"},{"bits":4653158192322358073,"repr":"1237.6806071202284","g6":"1237.68","f2":"1237.68","f0":"1238","f1":"1237.7","round1":"1237.7"},{"bits":14079446354011196367,"repr":"-4.5580147827170936e+16","g6":"-4.55801e+16","f2":"-45580147827170936.00","f0":"-45580147827170936","f1":"-45580147827170936.0","round1":"-4.5580147827170936e+16"},{"bits":13857561571326164992,"repr":"-63.897098541259766","g6":"-63.8971","f2":"-63.90","f0":"-64","f1":"-63.9","round1":"-63.9"},{"bits":4617535280163848192,"repr":"5.195188045501709","g6":"5.19519","f2":"5.20","f0":"5","f1":"5.2","round1":"5.2"},{"bits":13706088391077971066,"repr":"-5.0775031166750625e-09","g6":"-5.0775e-09","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13656517403390259086,"repr":"-2.4665705270390276e-12","g6":"-2.46657e-12","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13953299405964317298,"repr":"-168423652.58607823","g6":"-1.68424e+08","f2":"-168423652.59","f0":"-168423653","f1":"-168423652.6","round1":"-168423652.6"},{"bits":14063693107723927207,"repr":"-3979335350304595.5","g6":"-3.97934e+15","f2":"-3979335350304595.50","f0":"-3979335350304596","f1":"-3979335350304595.5","round1":"-3979335350304595.5"},{"bits":14036989515226885425,"repr":"-64661530998362.38","g6":"-6.46615e+13","f2":"-64661530998362.38","f0":"-64661530998362","f1":"-64661530998362.4","round1":"-64661530998362.4"},{"bits":4540687487642128554,"repr":"3.7694069870892785e-05","g6":"3.76941e-05","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4733666988390350848,"repr":"291310528.0","g6":"2.91311e+08","f2":"291310528.00","f0":"291310528","f1":"291310528.0","round1":"291310528.0"},{"bits":4829790341823463424,"repr":"804392613707776.0","g6":"8.04393e+14","f2":"804392613707776.00","f0":"804392613707776","f1":"804392613707776.0","round1":"804392613707776.0"},{"bits":4429379628800390474,"repr":"1.3822952859887026e-12","g6":"1.3823e-12","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4719750741911142400,"repr":"33473714.0","g6":"3.34737e+07","f2":"33473714.00","f0":"33473714","f1":"33473714.0","round1":"33473714.0"},{"bits":4665073993609379840,"repr":"7596.08056640625","g6":"7596.08","f2":"7596.08","f0":"7596","f1":"7596.1","round1":"7596.1"},{"bits":4869906355043331992,"repr":"3.85200478924564e+17","g6":"3.852e+17","f2":"385200478924563968.00","f0":"385200478924563968","f1":"385200478924563968.0","round1":"3.85200478924564e+17"},{"bits":4427962898572115968,"repr":"1.0961888948640697e-12","g6":"1.09619e-12","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4824863548997690204,"repr":"375746731953717.75","g6":"3.75747e+14","f2":"375746731953717.75","f0":"375746731953718","f1":"375746731953717.8","round1":"375746731953717.8"},{"bits":4565264501137473536,"repr":"0.0016526880208402872","g6":"0.00165269","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4712017049851789312,"repr":"10720341.0","g6":"1.07203e+07","f2":"10720341.00","f0":"10720341","f1":"10720341.0","round1":"10720341.0"},{"bits":14066677147183874048,"repr":"-6439110533185536.0","g6":"-6.43911e+15","f2":"-6439110533185536.00","f0":"-6439110533185536","f1":"-6439110533185536.0","round1":"-6439110533185536.0"},{"bits":14078063897696370845,"repr":"-3.5274647163765364e+16","g6":"-3.52746e+16","f2":"-35274647163765364.00","f0":"-35274647163765364","f1":"-35274647163765364.0","round1":"-3.5274647163765364e+16"},{"bits":4693492713203852902,"repr":"610656.7","g6":"610657","f2":"610656.70","f0":"610657","f1":"610656.7","round1":"610656.7"},{"bits":13674747925298543024,"repr":"-4.0861793162374775e-11","g6":"-4.08618e-11","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4618220576555663360,"repr":"5.803853511810303","g6":"5.80385","f2":"5.80","f0":"6","f1":"5.8","round1":"5.8"},{"bits":13939823401532129280,"repr":"-21182576.0","g6":"-2.11826e+07","f2":"-21182576.00","f0":"-21182576","f1":"-21182576.0","round1":"-21182576.0"},{"bits":4594361810867367428,"repr":"0.1441566470870016","g6":"0.144157","f2":"0.14","f0":"0","f1":"0.1","round1":"0.1"},{"bits":13695663527393210361,"repr":"-9.762096462641794e-10","g6":"-9.7621e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4459725201776555311,"repr":"1.4644122015228002e-10","g6":"1.46441e-10","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4504776279948879666,"repr":"1.5035502396836526e-07","g6":"1.50355e-07","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4646844884366825994,"repr":"462.55014326647563","g6":"462.55","f2":"462.55","f0":"463","f1":"462.6","round1":"462.6"},{"bits":13977084179318308864,"repr":"-6597647872.0","g6":"-6.59765e+09","f2":"-6597647872.00","f0":"-6597647872","f1":"-6597647872.0","round1":"-6597647872.0"},{"bits":4564037606285482270,"repr":"0.0013866476080522448","g6":"0.00138665","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13922123265685803249,"repr":"-1397080.9781389798","g6":"-1.39708e+06","f2":"-1397080.98","f0":"-1397081","f1":"-1397081.0","round1":"-1397081.0"},{"bits":4622666336395329536,"repr":"11.504962921142578","g6":"11.505","f2":"11.50","f0":"12","f1":"11.5","round1":"11.5"},{"bits":4535462857478766592,"repr":"1.6404088455601595e-05","g6":"1.64041e-05","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":14044276939628908189,"repr":"-204903159846004.9","g6":"-2.04903e+14","f2":"-204903159846004.91","f0":"-204903159846005","f1":"-204903159846004.9","round1":"-204903159846004.9"},{"bits":4613259169384890368,"repr":"2.6986193656921387","g6":"2.69862","f2":"2.70","f0":"3","f1":"2.7","round1":"2.7"},{"bits":4772973465005195264,"repr":"124588916736.0","g6":"1.24589e+11","f2":"124588916736.00","f0":"124588916736","f1":"124588916736.0","round1":"124588916736.0"},{"bits":13853522678033416192,"repr":"-35.19903564453125","g6":"-35.199","f2":"-35.20","f0":"-35","f1":"-35.2","round1":"-35.2"},{"bits":13939010237223143921,"repr":"-18153302.888681356","g6":"-1.81533e+07","f2":"-18153302.89","f0":"-18153303","f1":"-18153302.9","round1":"-18153302.9"},{"bits":13693592656099793830,"repr":"-7.396430373139831e-10","g6":"-7.39643e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4698414910437064704,"repr":"1318775.75","g6":"1.31878e+06","f2":"1318775.75","f0":"1318776","f1":"1318775.8","round1":"1318775.8"},{"bits":13846119522054665205,"repr":"-11.649112155131641","g6":"-11.6491","f2":"-11.65","f0":"-12","f1":"-11.6","round1":"-11.6"},{"bits":4502639962028948641,"repr":"1.0650822450970837e-07","g6":"1.06508e-07","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13948516551605015586,"repr":"-80050606.51838735","g6":"-8.00506e+07","f2":"-80050606.52","f0":"-80050607","f1":"-80050606.5","round1":"-80050606.5"},{"bits":13947510662847528960,"repr":"-66085280.0","g6":"-6.60853e+07","f2":"-66085280.00","f0":"-66085280","f1":"-66085280.0","round1":"-66085280.0"},{"bits":13706730935283710195,"repr":"-5.609003226370754e-09","g6":"-5.609e-09","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":14083547591354613760,"repr":"-8.472249911109222e+16","g6":"-8.47225e+16","f2":"-84722499111092224.00","f0":"-84722499111092224","f1":"-84722499111092224.0","round1":"-8.472249911109222e+16"},{"bits":14097177770106029246,"repr":"-6.930606161596495e+17","g6":"-6.93061e+17","f2":"-693060616159649536.00","f0":"-693060616159649536","f1":"-693060616159649536.0","round1":"-6.930606161596495e+17"},{"bits":4545335589279151457,"repr":"7.734650715170633e-05","g6":"7.73465e-05","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13817914301404413952,"repr":"-0.14916524291038513","g6":"-0.149165","f2":"-0.15","f0":"-0","f1":"-0.1","round1":"-0.1"},{"bits":14054755720582478564,"repr":"-1003560351737692.5","g6":"-1.00356e+15","f2":"-1003560351737692.50","f0":"-1003560351737692","f1":"-1003560351737692.5","round1":"-1003560351737692.5"},{"bits":13752167746269872128,"repr":"-6.083122570998967e-06","g6":"-6.08312e-06","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4618146577490378752,"repr":"5.738129138946533","g6":"5.73813","f2":"5.74","f0":"6","f1":"5.7","round1":"5.7"},{"bits":13687434413687463911,"repr":"-2.842784916307926e-10","g6":"-2.84278e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4646878657331438484,"repr":"464.46991404011465","g6":"464.47","f2":"464.47","f0":"464","f1":"464.5","round1":"464.5"},{"bits":14092584644927029248,"repr":"-3.4080067277553664e+17","g6":"-3.40801e+17","f2":"-340800672775536640.00","f0":"-340800672775536640","f1":"-340800672775536640.0","round1":"-3.4080067277553664e+17"},{"bits":4747320794204720426,"repr":"2398675243.1812944","g6":"2.39868e+09","f2":"2398675243.18","f0":"2398675243","f1":"2398675243.2","round1":"2398675243.2"},{"bits":4699440237242220544,"repr":"1557503.25","g6":"1.5575e+06","f2":"1557503.25","f0":"1557503","f1":"1557503.2","round1":"1557503.2"},{"bits":14033048841746382848,"repr":"-34529695760384.0","g6":"-3.45297e+13","f2":"-34529695760384.00","f0":"-34529695760384","f1":"-34529695760384.0","round1":"-34529695760384.0"},{"bits":4778011723117766308,"repr":"265494315564.30188","g6":"2.65494e+11","f2":"265494315564.30","f0":"265494315564","f1":"265494315564.3","round1":"265494315564.3"},{"bits":13978043222575123460,"repr":"-7512262794.3466835","g6":"-7.51226e+09","f2":"-7512262794.35","f0":"-7512262794","f1":"-7512262794.3","round1":"-7512262794.3"},{"bits":4662408571802091520,"repr":"5171.8935546875","g6":"5171.89","f2":"5171.89","f0":"5172","f1":"5171.9","round1":"5171.9"},{"bits":13789176835045168529,"repr":"-0.0017698462685527864","g6":"-0.00176985","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13786776621499389109,"repr":"-0.0012493829204001498","g6":"-0.00124938","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13777390772791803904,"repr":"-0.0002918191021308303","g6":"-0.000291819","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4440673598197202944,"repr":"7.476881093426702e-12","g6":"7.47688e-12","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13893708333380009984,"repr":"-16760.46875","g6":"-16760.5","f2":"-16760.47","f0":"-16760","f1":"-16760.5","round1":"-16760.5"},{"bits":4759383391764217856,"repr":"15422410752.0","g6":"1.54224e+10","f2":"15422410752.00","f0":"15422410752","f1":"15422410752.0","round1":"15422410752.0"},{"bits":4446435740704033134,"repr":"1.9020333553867938e-11","g6":"1.90203e-11","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":14048641112626680112,"repr":"-401092155342099.0","g6":"-4.01092e+14","f2":"-401092155342099.00","f0":"-401092155342099","f1":"-401092155342099.0","round1":"-401092155342099.0"},{"bits":13969316014240825344,"repr":"-1944820736.0","g6":"-1.94482e+09","f2":"-1944820736.00","f0":"-1944820736","f1":"-1944820736.0","round1":"-1944820736.0"},{"bits":13781674784699973632,"repr":"-0.0005598304560407996","g6":"-0.00055983","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4838790495971269168,"repr":"3214047901363480.0","g6":"3.21405e+15","f2":"3214047901363480.00","f0":"3214047901363480","f1":"3214047901363480.0","round1":"3214047901363480.0"},{"bits":14064311975802830848,"repr":"-4288769389756416.0","g6":"-4.28877e+15","f2":"-4288769389756416.00","f0":"-4288769389756416","f1":"-4288769389756416.0","round1":"-4288769389756416.0"},{"bits":4772222269319544832,"repr":"113126580224.0","g6":"1.13127e+11","f2":"113126580224.00","f0":"113126580224","f1":"113126580224.0","round1":"113126580224.0"},{"bits":13999443893951660032,"repr":"-206294302720.0","g6":"-2.06294e+11","f2":"-206294302720.00","f0":"-206294302720","f1":"-206294302720.0","round1":"-206294302720.0"},{"bits":4632236763165753344,"repr":"50.02182388305664","g6":"50.0218","f2":"50.02","f0":"50","f1":"50.0","round1":"50.0"},{"bits":4633804666772126161,"repr":"61.16244906185933","g6":"61.1624","f2":"61.16","f0":"61","f1":"61.2","round1":"61.2"},{"bits":13753697425525174411,"repr":"-7.378811298971423e-06","g6":"-7.37881e-06","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4456527710834917376,"repr":"9.010166918121953e-11","g6":"9.01017e-11","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4623657553107091456,"repr":"13.265717506408691","g6":"13.2657","f2":"13.27","f0":"13","f1":"13.3","round1":"13.3"},{"bits":13965127449798021152,"repr":"-1009965488.5356483","g6":"-1.00997e+09","f2":"-1009965488.54","f0":"-1009965489","f1":"-1009965488.5","round1":"-1009965488.5"},{"bits":4647182614012950886,"repr":"481.74785100286533","g6":"481.748","f2":"481.75","f0":"482","f1":"481.7","round1":"481.7"},{"bits":4528577268106387806,"repr":"5.898095585481508e-06","g6":"5.8981e-06","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":14065203553031421952,"repr":"-4965516380733440.0","g6":"-4.96552e+15","f2":"-4965516380733440.00","f0":"-4965516380733440","f1":"-4965516380733440.0","round1":"-4965516380733440.0"},{"bits":4510092574244995072,"repr":"3.4373374546703417e-07","g6":"3.43734e-07","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4549644152367066245,"repr":"0.00014940653830861433","g6":"0.000149407","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4839731910139707392,"repr":"3684754985582592.0","g6":"3.68475e+15","f2":"3684754985582592.00","f0":"3684754985582592","f1":"3684754985582592.0","round1":"3684754985582592.0"},{"bits":4494664111119925248,"repr":"3.0276680718088755e-08","g6":"3.02767e-08","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13705114671441848534,"repr":"-4.272061111612315e-09","g6":"-4.27206e-09","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4646979976225275951,"repr":"470.2292263610315","g6":"470.229","f2":"470.23","f0":"470","f1":"470.2","round1":"470.2"},{"bits":4635022396812689408,"repr":"75.6298828125","g6":"75.6299","f2":"75.63","f0":"76","f1":"75.6","round1":"75.6"},{"bits":4599446904063918080,"repr":"0.3205926716327667","g6":"0.320593","f2":"0.32","f0":"0","f1":"0.3","round1":"0.3"},{"bits":4450364849913856000,"repr":"3.432810979919765e-11","g6":"3.43281e-11","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4776546309249171456,"repr":"220773433344.0","g6":"2.20773e+11","f2":"220773433344.00","f0":"220773433344","f1":"220773433344.0","round1":"220773433344.0"},{"bits":4712299652794286080,"repr":"11246730.0","g6":"1.12467e+07","f2":"11246730.00","f0":"11246730","f1":"11246730.0","round1":"11246730.0"},{"bits":4873329078138044416,"repr":"6.320487616688947e+17","g6":"6.32049e+17","f2":"632048761668894720.00","f0":"632048761668894720","f1":"632048761668894720.0","round1":"6.320487616688947e+17"},{"bits":13710672632604619473,"repr":"-1.0288417064634409e-08","g6":"-1.02884e-08","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4443383756383846400,"repr":"1.1855377790581656e-11","g6":"1.18554e-11","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4700774592313032704,"repr":"1868182.0","g6":"1.86818e+06","f2":"1868182.00","f0":"1868182","f1":"1868182.0","round1":"1868182.0"},{"bits":14075462061543332380,"repr":"-2.4867302551611504e+16","g6":"-2.48673e+16","f2":"-24867302551611504.00","f0":"-24867302551611504","f1":"-24867302551611504.0","round1":"-2.4867302551611504e+16"},{"bits":4645846329115803648,"repr":"405.7888488769531","g6":"405.789","f2":"405.79","f0":"406","f1":"405.8","round1":"405.8"},{"bits":13669888718477983744,"repr":"-1.9281867769116445e-11","g6":"-1.92819e-11","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13985754651135957451,"repr":"-25106078254.46269","g6":"-2.51061e+10","f2":"-25106078254.46","f0":"-25106078254","f1":"-25106078254.5","round1":"-25106078254.5"},{"bits":4635423618698838016,"repr":"81.33158874511719","g6":"81.3316","f2":"81.33","f0":"81","f1":"81.3","round1":"81.3"},{"bits":13664341781636972544,"repr":"-7.955331705888913e-12","g6":"-7.95533e-12","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4617190959078178816,"repr":"4.889369487762451","g6":"4.88937","f2":"4.89","f0":"5","f1":"4.9","round1":"4.9"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13826424108041160278,"repr":"-0.5414392979639142","g6":"-0.541439","f2":"-0.54","f0":"-1","f1":"-0.5","round1":"-0.5"},{"bits":4858162798170673911,"repr":"6.228799594119775e+16","g6":"6.2288e+16","f2":"62287995941197752.00","f0":"62287995941197752","f1":"62287995941197752.0","round1":"6.228799594119775e+16"},{"bits":4753746451889565111,"repr":"6630367890.417411","g6":"6.63037e+09","f2":"6630367890.42","f0":"6630367890","f1":"6630367890.4","round1":"6630367890.4"},{"bits":4665099603962494976,"repr":"7619.373046875","g6":"7619.37","f2":"7619.37","f0":"7619","f1":"7619.4","round1":"7619.4"},{"bits":4646507154720701102,"repr":"443.3524355300859","g6":"443.352","f2":"443.35","f0":"443","f1":"443.4","round1":"443.4"},{"bits":14012612535874748416,"repr":"-1566820007936.0","g6":"-1.56682e+12","f2":"-1566820007936.00","f0":"-1566820007936","f1":"-1566820007936.0","round1":"-1566820007936.0"},{"bits":4670315319310855277,"repr":"16684.154088657746","g6":"16684.2","f2":"16684.15","f0":"16684","f1":"16684.2","round1":"16684.2"},{"bits":4542288976592565456,"repr":"4.854618111636291e-05","g6":"4.85462e-05","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4439831260811028079,"repr":"6.695984632054633e-12","g6":"6.69598e-12","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4645063535892627456,"repr":"361.2922058105469","g6":"361.292","f2":"361.29","f0":"361","f1":"361.3","round1":"361.3"},{"bits":13691573332435009536,"repr":"-5.30849864066596e-10","g6":"-5.3085e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4639571365253349376,"repr":"152.54922485351562","g6":"152.549","f2":"152.55","f0":"153","f1":"152.5","round1":"152.5"},{"bits":13915108550133533858,"repr":"-465248.060263822","g6":"-465248","f2":"-465248.06","f0":"-465248","f1":"-465248.1","round1":"-465248.1"},{"bits":4487307159558687225,"repr":"1.0299275975474203e-08","g6":"1.02993e-08","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13836117410576334848,"repr":"-2.4704482555389404","g6":"-2.47045","f2":"-2.47","f0":"-2","f1":"-2.5","round1":"-2.5"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13875290309950177280,"repr":"-989.8778076171875","g6":"-989.878","f2":"-989.88","f0":"-990","f1":"-989.9","round1":"-989.9"},{"bits":4549009045103910133,"repr":"0.00013219192144673484","g6":"0.000132192","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13990253776785110827,"repr":"-50178022763.98275","g6":"-5.0178e+10","f2":"-50178022763.98","f0":"-50178022764","f1":"-50178022764.0","round1":"-50178022764.0"},{"bits":4862121576801239040,"repr":"1.1585885593350963e+17","g6":"1.15859e+17","f2":"115858855933509632.00","f0":"115858855933509632","f1":"115858855933509632.0","round1":"1.1585885593350963e+17"},{"bits":13858703395528168517,"repr":"-80.02049492749309","g6":"-80.0205","f2":"-80.02","f0":"-80","f1":"-80.0","round1":"-80.0"},{"bits":4872686946167554048,"repr":"5.6315831087477555e+17","g6":"5.63158e+17","f2":"563158310874775552.00","f0":"563158310874775552","f1":"563158310874775552.0","round1":"5.6315831087477555e+17"},{"bits":4689584212863352832,"repr":"339967.6875","g6":"339968","f2":"339967.69","f0":"339968","f1":"339967.7","round1":"339967.7"},{"bits":13857467332562153586,"repr":"-63.22749184930662","g6":"-63.2275","f2":"-63.23","f0":"-63","f1":"-63.2","round1":"-63.2"},{"bits":13846188673449464387,"repr":"-11.771949708237235","g6":"-11.7719","f2":"-11.77","f0":"-12","f1":"-11.8","round1":"-11.8"},{"bits":4797319966985657032,"repr":"5361292444774.695","g6":"5.36129e+12","f2":"5361292444774.70","f0":"5361292444775","f1":"5361292444774.7","round1":"5361292444774.7"},{"bits":4463179946235265024,"repr":"2.386578989987953e-10","g6":"2.38658e-10","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4619386102904520704,"repr":"6.839048862457275","g6":"6.83905","f2":"6.84","f0":"7","f1":"6.8","round1":"6.8"},{"bits":14012236439232304774,"repr":"-1474999538589.4077","g6":"-1.475e+12","f2":"-1474999538589.41","f0":"-1474999538589","f1":"-1474999538589.4","round1":"-1474999538589.4"},{"bits":14029527996671459328,"repr":"-20776394686464.0","g6":"-2.07764e+13","f2":"-20776394686464.00","f0":"-20776394686464","f1":"-20776394686464.0","round1":"-20776394686464.0"},{"bits":4603537016452284416,"repr":"0.5952790379524231","g6":"0.595279","f2":"0.60","f0":"1","f1":"0.6","round1":"0.6"},{"bits":4620679561296740352,"repr":"7.987870693206787","g6":"7.98787","f2":"7.99","f0":"8","f1":"8.0","round1":"8.0"},{"bits":14077537776761307136,"repr":"-3.317016342351053e+16","g6":"-3.31702e+16","f2":"-33170163423510528.00","f0":"-33170163423510528","f1":"-33170163423510528.0","round1":"-3.317016342351053e+16"},{"bits":4830087845618122752,"repr":"841580588040192.0","g6":"8.41581e+14","f2":"841580588040192.00","f0":"841580588040192","f1":"841580588040192.0","round1":"841580588040192.0"},{"bits":4523143784899890670,"repr":"2.555226778425246e-06","g6":"2.55523e-06","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13982519123276464128,"repr":"-14971694080.0","g6":"-1.49717e+10","f2":"-14971694080.00","f0":"-14971694080","f1":"-14971694080.0","round1":"-14971694080.0"},{"bits":14021947537234067456,"repr":"-6587399274496.0","g6":"-6.5874e+12","f2":"-6587399274496.00","f0":"-6587399274496","f1":"-6587399274496.0","round1":"-6587399274496.0"},{"bits":14092128264386510848,"repr":"-3.1159231818235904e+17","g6":"-3.11592e+17","f2":"-311592318182359040.00","f0":"-311592318182359040","f1":"-311592318182359040.0","round1":"-3.1159231818235904e+17"},{"bits":4613774031810723840,"repr":"2.9272642135620117","g6":"2.92726","f2":"2.93","f0":"3","f1":"2.9","round1":"2.9"},{"bits":4713327132451799040,"repr":"13160560.0","g6":"1.31606e+07","f2":"13160560.00","f0":"13160560","f1":"13160560.0","round1":"13160560.0"},{"bits":13795221307371022540,"repr":"-0.0045096290959866885","g6":"-0.00450963","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13713254319829024768,"repr":"-1.4559460304042204e-08","g6":"-1.45595e-08","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13844173731036455178,"repr":"-8.192692971890683","g6":"-8.19269","f2":"-8.19","f0":"-8","f1":"-8.2","round1":"-8.2"},{"bits":4447045466604967300,"repr":"2.0990464195368603e-11","g6":"2.09905e-11","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13966822504405139456,"repr":"-1350321664.0","g6":"-1.35032e+09","f2":"-1350321664.00","f0":"-1350321664","f1":"-1350321664.0","round1":"-1350321664.0"},{"bits":13786630069527955420,"repr":"-0.001217604527238062","g6":"-0.0012176","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13946790770494144512,"repr":"-60721664.0","g6":"-6.07217e+07","f2":"-60721664.00","f0":"-60721664","f1":"-60721664.0","round1":"-60721664.0"},{"bits":4639859979539447808,"repr":"160.75213623046875","g6":"160.752","f2":"160.75","f0":"161","f1":"160.8","round1":"160.8"},{"bits":4633225661132046336,"repr":"57.04836654663086","g6":"57.0484","f2":"57.05","f0":"57","f1":"57.0","round1":"57.0"},{"bits":4652349326750646272,"repr":"1053.765869140625","g6":"1053.77","f2":"1053.77","f0":"1054","f1":"1053.8","round1":"1053.8"},{"bits":13962239970629986330,"repr":"-665751148.3215363","g6":"-6.65751e+08","f2":"-665751148.32","f0":"-665751148","f1":"-665751148.3","round1":"-665751148.3"},{"bits":14022999495520813056,"repr":"-7614702288896.0","g6":"-7.6147e+12","f2":"-7614702288896.00","f0":"-7614702288896","f1":"-7614702288896.0","round1":"-7614702288896.0"},{"bits":4696080248893079552,"repr":"911885.5","g6":"911886","f2":"911885.50","f0":"911886","f1":"911885.5","round1":"911885.5"},{"bits":4646912430296050972,"repr":"466.38968481375355","g6":"466.39","f2":"466.39","f0":"466","f1":"466.4","round1":"466.4"},{"bits":4805217470807801856,"repr":"17351304019968.0","g6":"1.73513e+13","f2":"17351304019968.00","f0":"17351304019968","f1":"17351304019968.0","round1":"17351304019968.0"},{"bits":4646980627831193600,"repr":"470.2662658691406","g6":"470.266","f2":"470.27","f0":"470","f1":"470.3","round1":"470.3"},{"bits":13684554532313366528,"repr":"-1.8411137892027085e-10","g6":"-1.84111e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4684414561518878720,"repr":"150599.1875","g6":"150599","f2":"150599.19","f0":"150599","f1":"150599.2","round1":"150599.2"},{"bits":14012033949556015104,"repr":"-1425563582464.0","g6":"-1.42556e+12","f2":"-1425563582464.00","f0":"-1425563582464","f1":"-1425563582464.0","round1":"-1425563582464.0"},{"bits":4645460192817713938,"repr":"383.8395415472779","g6":"383.84","f2":"383.84","f0":"384","f1":"383.8","round1":"383.8"},{"bits":4599290389550071808,"repr":"0.3119043707847595","g6":"0.311904","f2":"0.31","f0":"0","f1":"0.3","round1":"0.3"},{"bits":14032168329636753644,"repr":"-31090195332144.92","g6":"-3.10902e+13","f2":"-31090195332144.92","f0":"-31090195332145","f1":"-31090195332144.9","round1":"-31090195332144.9"},{"bits":4563939128990760960,"repr":"0.0013652937486767769","g6":"0.00136529","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4649034286844870656,"repr":"662.0065307617188","g6":"662.007","f2":"662.01","f0":"662","f1":"662.0","round1":"662.0"},{"bits":13718508499619264011,"repr":"-3.3402441699608876e-08","g6":"-3.34024e-08","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4526761742289600512,"repr":"4.360285402071895e-06","g6":"4.36029e-06","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13980429682353373184,"repr":"-10986401792.0","g6":"-1.09864e+10","f2":"-10986401792.00","f0":"-10986401792","f1":"-10986401792.0","round1":"-10986401792.0"},{"bits":4816750939178307952,"repr":"107914642915909.75","g6":"1.07915e+14","f2":"107914642915909.75","f0":"107914642915910","f1":"107914642915909.8","round1":"107914642915909.8"},{"bits":4697947425795473408,"repr":"1209931.0","g6":"1.20993e+06","f2":"1209931.00","f0":"1209931","f1":"1209931.0","round1":"1209931.0"},{"bits":13896049300472856576,"repr":"-25276.857421875","g6":"-25276.9","f2":"-25276.86","f0":"-25277","f1":"-25276.9","round1":"-25276.9"},{"bits":13691924583987281920,"repr":"-5.67168423337705e-10","g6":"-5.67168e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13836851037161390080,"repr":"-2.796243906021118","g6":"-2.79624","f2":"-2.80","f0":"-3","f1":"-2.8","round1":"-2.8"},{"bits":13853915354008387584,"repr":"-37.989166259765625","g6":"-37.9892","f2":"-37.99","f0":"-38","f1":"-38.0","round1":"-38.0"},{"bits":4661349614334167359,"repr":"4208.7773482076","g6":"4208.78","f2":"4208.78","f0":"4209","f1":"4208.8","round1":"4208.8"},{"bits":4636319225143623680,"repr":"94.05892181396484","g6":"94.0589","f2":"94.06","f0":"94","f1":"94.1","round1":"94.1"},{"bits":13946252916571504640,"repr":"-56714340.0","g6":"-5.67143e+07","f2":"-56714340.00","f0":"-56714340","f1":"-56714340.0","round1":"-56714340.0"},{"bits":4523693700432764864,"repr":"2.78812506570092e-06","g6":"2.78813e-06","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4684580143245557760,"repr":"155418.25","g6":"155418","f2":"155418.25","f0":"155418","f1":"155418.2","round1":"155418.2"},{"bits":4568406893021626368,"repr":"0.0027150462847203016","g6":"0.00271505","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4716631710354112512,"repr":"21854416.0","g6":"2.18544e+07","f2":"21854416.00","f0":"21854416","f1":"21854416.0","round1":"21854416.0"},{"bits":13925948700413070342,"repr":"-2478366.8158888845","g6":"-2.47837e+06","f2":"-2478366.82","f0":"-2478367","f1":"-2478366.8","round1":"-2478366.8"},{"bits":4623715217338007552,"repr":"13.368149757385254","g6":"13.3681","f2":"13.37","f0":"13","f1":"13.4","round1":"13.4"},{"bits":4605329322566018654,"repr":"0.7942649894168416","g6":"0.794265","f2":"0.79","f0":"1","f1":"0.8","round1":"0.8"},{"bits":4753058750162534400,"repr":"5974524416.0","g6":"5.97452e+09","f2":"5974524416.00","f0":"5974524416","f1":"5974524416.0","round1":"5974524416.0"},{"bits":14092584644999034935,"repr":"-3.408006773839006e+17","g6":"-3.40801e+17","f2":"-340800677383900608.00","f0":"-340800677383900608","f1":"-340800677383900608.0","round1":"-3.408006773839006e+17"},{"bits":13952118241485651968,"repr":"-133719968.0","g6":"-1.3372e+08","f2":"-133719968.00","f0":"-133719968","f1":"-133719968.0","round1":"-133719968.0"},{"bits":13662979188766801920,"repr":"-6.5149509051454224e-12","g6":"-6.51495e-12","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4846100390308859501,"repr":"9461581771152602.0","g6":"9.46158e+15","f2":"9461581771152602.00","f0":"9461581771152602","f1":"9461581771152602.0","round1":"9461581771152602.0"},{"bits":13777219705985965726,"repr":"-0.00028254555200433486","g6":"-0.000282546","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4684983453559554048,"repr":"167156.125","g6":"167156","f2":"167156.12","f0":"167156","f1":"167156.1","round1":"167156.1"},{"bits":4642825226571218944,"repr":"245.02952575683594","g6":"245.03","f2":"245.03","f0":"245","f1":"245.0","round1":"245.0"},{"bits":4646709792508376038,"repr":"454.8710601719198","g6":"454.871","f2":"454.87","f0":"455","f1":"454.9","round1":"454.9"},{"bits":4721461461449922470,"repr":"46138849.80241327","g6":"4.61388e+07","f2":"46138849.80","f0":"46138850","f1":"46138849.8","round1":"46138849.8"},{"bits":4623366638866006016,"repr":"12.748950004577637","g6":"12.749","f2":"12.75","f0":"13","f1":"12.7","round1":"12.7"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4647081295119113418,"repr":"475.9885386819484","g6":"475.989","f2":"475.99","f0":"476","f1":"476.0","round1":"476.0"},{"bits":4570297246641291264,"repr":"0.0035348564852029085","g6":"0.00353486","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13872386972472880273,"repr":"-659.8065509846366","g6":"-659.807","f2":"-659.81","f0":"-660","f1":"-659.8","round1":"-659.8"},{"bits":4856959150708024690,"repr":"5.265881624000398e+16","g6":"5.26588e+16","f2":"52658816240003984.00","f0":"52658816240003984","f1":"52658816240003984.0","round1":"5.265881624000398e+16"},{"bits":4475105966052899190,"repr":"1.5582295412817684e-09","g6":"1.55823e-09","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4580853138625396736,"repr":"0.018026959151029587","g6":"0.018027","f2":"0.02","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4870996148613556465,"repr":"4.5494726741893024e+17","g6":"4.54947e+17","f2":"454947267418930240.00","f0":"454947267418930240","f1":"454947267418930240.0","round1":"4.5494726741893024e+17"},{"bits":13968926352732195210,"repr":"-1851918192.7818322","g6":"-1.85192e+09","f2":"-1851918192.78","f0":"-1851918193","f1":"-1851918192.8","round1":"-1851918192.8"},{"bits":4763433186757705728,"repr":"29113694208.0","g6":"2.91137e+10","f2":"29113694208.00","f0":"29113694208","f1":"29113694208.0","round1":"29113694208.0"},{"bits":13804388800849248256,"repr":"-0.0185946486890316","g6":"-0.0185946","f2":"-0.02","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13968326552560074752,"repr":"-1708914688.0","g6":"-1.70891e+09","f2":"-1708914688.00","f0":"-1708914688","f1":"-1708914688.0","round1":"-1708914688.0"},{"bits":4689372047402186714,"repr":"327618.03227889317","g6":"327618","f2":"327618.03","f0":"327618","f1":"327618.0","round1":"327618.0"},{"bits":14031418978768503828,"repr":"-28163043503044.08","g6":"-2.8163e+13","f2":"-28163043503044.08","f0":"-28163043503044","f1":"-28163043503044.1","round1":"-28163043503044.1"},{"bits":13973489719663936538,"repr":"-3732335657.133313","g6":"-3.73234e+09","f2":"-3732335657.13","f0":"-3732335657","f1":"-3732335657.1","round1":"-3732335657.1"},{"bits":4695347898987053056,"repr":"826628.75","g6":"826629","f2":"826628.75","f0":"826629","f1":"826628.8","round1":"826628.8"},{"bits":4705645056017954020,"repr":"3907198.398619281","g6":"3.9072e+06","f2":"3907198.40","f0":"3907198","f1":"3907198.4","round1":"3907198.4"},{"bits":4566818531758789714,"repr":"0.002026204391976574","g6":"0.0020262","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13743514948021247925,"repr":"-1.59582797492999e-06","g6":"-1.59583e-06","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4718286913470218552,"repr":"28020528.11041376","g6":"2.80205e+07","f2":"28020528.11","f0":"28020528","f1":"28020528.1","round1":"28020528.1"},{"bits":14069987569462935552,"repr":"-1.0491866369753088e+16","g6":"-1.04919e+16","f2":"-10491866369753088.00","f0":"-10491866369753088","f1":"-10491866369753088.0","round1":"-1.0491866369753088e+16"},{"bits":4645493965782326428,"repr":"385.75931232091693","g6":"385.759","f2":"385.76","f0":"386","f1":"385.8","round1":"385.8"},{"bits":13702365378364047360,"repr":"-2.8615947389454277e-09","g6":"-2.86159e-09","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4653779163665965193,"repr":"1378.8731438611014","g6":"1378.87","f2":"1378.87","f0":"1379","f1":"1378.9","round1":"1378.9"},{"bits":13769558925697351680,"repr":"-8.888376760296524e-05","g6":"-8.88838e-05","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":14017110081076714317,"repr":"-3130683753467.4126","g6":"-3.13068e+12","f2":"-3130683753467.41","f0":"-3130683753467","f1":"-3130683753467.4","round1":"-3130683753467.4"},{"bits":13868751784345862144,"repr":"-379.2667541503906","g6":"-379.267","f2":"-379.27","f0":"-379","f1":"-379.3","round1":"-379.3"},{"bits":13745926998801252352,"repr":"-2.305850557604572e-06","g6":"-2.30585e-06","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4676079149340821688,"repr":"42537.691170708684","g6":"42537.7","f2":"42537.69","f0":"42538","f1":"42537.7","round1":"42537.7"},{"bits":13985808658387173436,"repr":"-25312099568.00023","g6":"-2.53121e+10","f2":"-25312099568.00","f0":"-25312099568","f1":"-25312099568.0","round1":"-25312099568.0"},{"bits":4689356608587694080,"repr":"326719.375","g6":"326719","f2":"326719.38","f0":"326719","f1":"326719.4","round1":"326719.4"},{"bits":4659769042968209621,"repr":"3433.6280325475186","g6":"3433.63","f2":"3433.63","f0":"3434","f1":"3433.6","round1":"3433.6"},{"bits":4596206108573433856,"repr":"0.1953461915254593","g6":"0.195346","f2":"0.20","f0":"0","f1":"0.2","round1":"0.2"},{"bits":4873340886444594574,"repr":"6.33560224907315e+17","g6":"6.3356e+17","f2":"633560224907314944.00","f0":"633560224907314944","f1":"633560224907314944.0","round1":"6.33560224907315e+17"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13737813319174062080,"repr":"-6.710677098453743e-07","g6":"-6.71068e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4674760676683420795,"repr":"32944.54","g6":"32944.5","f2":"32944.54","f0":"32945","f1":"32944.5","round1":"32944.5"},{"bits":13978536299171151872,"repr":"-7982497280.0","g6":"-7.9825e+09","f2":"-7982497280.00","f0":"-7982497280","f1":"-7982497280.0","round1":"-7982497280.0"},{"bits":4701991482712653824,"repr":"2205870.75","g6":"2.20587e+06","f2":"2205870.75","f0":"2205871","f1":"2205870.8","round1":"2205870.8"},{"bits":4669805165300154368,"repr":"15606.1123046875","g6":"15606.1","f2":"15606.11","f0":"15606","f1":"15606.1","round1":"15606.1"},{"bits":13854990576326507679,"repr":"-45.629080334439315","g6":"-45.6291","f2":"-45.63","f0":"-46","f1":"-45.6","round1":"-45.6"},{"bits":4666267307859771392,"repr":"9170.787109375","g6":"9170.79","f2":"9170.79","f0":"9171","f1":"9170.8","round1":"9170.8"},{"bits":4457530582477307904,"repr":"1.0306348136035481e-10","g6":"1.03063e-10","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4519188141378109440,"repr":"1.3936476079834392e-06","g6":"1.39365e-06","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":14096554771758620017,"repr":"-6.133168276912682e+17","g6":"-6.13317e+17","f2":"-613316827691268224.00","f0":"-613316827691268224","f1":"-613316827691268224.0","round1":"-6.133168276912682e+17"},{"bits":13767280156247800414,"repr":"-5.951791950275087e-05","g6":"-5.95179e-05","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4870667082640916480,"repr":"4.338870451699712e+17","g6":"4.33887e+17","f2":"433887045169971200.00","f0":"433887045169971200","f1":"433887045169971200.0","round1":"4.338870451699712e+17"},{"bits":4645899241357676298,"repr":"408.79656160458455","g6":"408.797","f2":"408.80","f0":"409","f1":"408.8","round1":"408.8"},{"bits":14041241586166802984,"repr":"-125392926255272.62","g6":"-1.25393e+14","f2":"-125392926255272.62","f0":"-125392926255273","f1":"-125392926255272.6","round1":"-125392926255272.6"},{"bits":4765382314320461824,"repr":"38738313216.0","g6":"3.87383e+10","f2":"38738313216.00","f0":"38738313216","f1":"38738313216.0","round1":"38738313216.0"},{"bits":13795053025322074112,"repr":"-0.00436366768553853","g6":"-0.00436367","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13892553516188665900,"repr":"-14471.634140912523","g6":"-14471.6","f2":"-14471.63","f0":"-14472","f1":"-14471.6","round1":"-14471.6"},{"bits":13898592113311875072,"repr":"-36287.11328125","g6":"-36287.1","f2":"-36287.11","f0":"-36287","f1":"-36287.1","round1":"-36287.1"},{"bits":4443965173346268818,"repr":"1.279470755449825e-11","g6":"1.27947e-11","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4646169425074576211,"repr":"424.1547277936963","g6":"424.155","f2":"424.15","f0":"424","f1":"424.2","round1":"424.2"},{"bits":4686320019464781824,"repr":"206055.3125","g6":"206055","f2":"206055.31","f0":"206055","f1":"206055.3","round1":"206055.3"},{"bits":14018259763328264497,"repr":"-3692052040357.149","g6":"-3.69205e+12","f2":"-3692052040357.15","f0":"-3692052040357","f1":"-3692052040357.1","round1":"-3692052040357.1"},{"bits":13667054794903126016,"repr":"-1.233844103276649e-11","g6":"-1.23384e-11","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13912293782688104448,"repr":"-301407.03125","g6":"-301407","f2":"-301407.03","f0":"-301407","f1":"-301407.0","round1":"-301407.0"},{"bits":4690686772844167168,"repr":"404145.125","g6":"404145","f2":"404145.12","f0":"404145","f1":"404145.1","round1":"404145.1"},{"bits":13773244103331250281,"repr":"-0.00015558416262262682","g6":"-0.000155584","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4550401219201335296,"repr":"0.00016992687596939504","g6":"0.000169927","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":14064845093488776037,"repr":"-4607056838087525.0","g6":"-4.60706e+15","f2":"-4607056838087525.00","f0":"-4607056838087525","f1":"-4607056838087525.0","round1":"-4607056838087525.0"},{"bits":4805341661120171348,"repr":"17595540403213.33","g6":"1.75955e+13","f2":"17595540403213.33","f0":"17595540403213","f1":"17595540403213.3","round1":"17595540403213.3"},{"bits":4646236971003801189,"repr":"427.9942693409742","g6":"427.994","f2":"427.99","f0":"428","f1":"428.0","round1":"428.0"},{"bits":4464150068215152640,"repr":"2.8881202984720744e-10","g6":"2.88812e-10","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13726474083137224704,"repr":"-1.1262385868349156e-07","g6":"-1.12624e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4772763456673677312,"repr":"121384443904.0","g6":"1.21384e+11","f2":"121384443904.00","f0":"121384443904","f1":"121384443904.0","round1":"121384443904.0"},{"bits":14079790465096351744,"repr":"-4.833303650841395e+16","g6":"-4.8333e+16","f2":"-48333036508413952.00","f0":"-48333036508413952","f1":"-48333036508413952.0","round1":"-4.833303650841395e+16"},{"bits":4701272326409289728,"repr":"1984069.75","g6":"1.98407e+06","f2":"1984069.75","f0":"1984070","f1":"1984069.8","round1":"1984069.8"},{"bits":4623899509015969792,"repr":"13.695517539978027","g6":"13.6955","f2":"13.70","f0":"14","f1":"13.7","round1":"13.7"},{"bits":4647115068083725908,"repr":"477.9083094555874","g6":"477.908","f2":"477.91","f0":"478","f1":"477.9","round1":"477.9"},{"bits":4832961182684130727,"repr":"1275595535739753.8","g6":"1.2756e+15","f2":"1275595535739753.75","f0":"1275595535739754","f1":"1275595535739753.8","round1":"1275595535739753.8"},{"bits":13761249785329745920,"repr":"-2.458605740685016e-05","g6":"-2.45861e-05","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4650442205215132974,"repr":"822.068318047013","g6":"822.068","f2":"822.07","f0":"822","f1":"822.1","round1":"822.1"},{"bits":4645764149499226341,"repr":"401.11747851002866","g6":"401.117","f2":"401.12","f0":"401","f1":"401.1","round1":"401.1"},{"bits":4604454776875253760,"repr":"0.6971709132194519","g6":"0.697171","f2":"0.70","f0":"1","f1":"0.7","round1":"0.7"},{"bits":13730887814634029650,"repr":"-2.228689277576965e-07","g6":"-2.22869e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4861165842878348911,"repr":"1.0056711316726757e+17","g6":"1.00567e+17","f2":"100567113167267568.00","f0":"100567113167267568","f1":"100567113167267568.0","round1":"1.0056711316726757e+17"},{"bits":13660691006822023168,"repr":"-4.666572250150436e-12","g6":"-4.66657e-12","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4701717202343034880,"repr":"2087650.5","g6":"2.08765e+06","f2":"2087650.50","f0":"2087650","f1":"2087650.5","round1":"2087650.5"},{"bits":13765644275613835218,"repr":"-4.8432761144800684e-05","g6":"-4.84328e-05","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13651097373269557248,"repr":"-1.0482135992528896e-12","g6":"-1.04821e-12","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4832553314646335234,"repr":"1173628526290880.5","g6":"1.17363e+15","f2":"1173628526290880.50","f0":"1173628526290880","f1":"1173628526290880.5","round1":"1173628526290880.5"},{"bits":14022792727634763303,"repr":"-7412780525175.538","g6":"-7.41278e+12","f2":"-7412780525175.54","f0":"-7412780525176","f1":"-7412780525175.5","round1":"-7412780525175.5"},{"bits":4690215509463672942,"repr":"376713.9859472577","g6":"376714","f2":"376713.99","f0":"376714","f1":"376714.0","round1":"376714.0"},{"bits":4645899241357676298,"repr":"408.79656160458455","g6":"408.797","f2":"408.80","f0":"409","f1":"408.8","round1":"408.8"},{"bits":4759404747699181761,"repr":"15463143965.355837","g6":"1.54631e+10","f2":"15463143965.36","f0":"15463143965","f1":"15463143965.4","round1":"15463143965.4"},{"bits":14091476988430647296,"repr":"-2.7907051657940173e+17","g6":"-2.79071e+17","f2":"-279070516579401728.00","f0":"-279070516579401728","f1":"-279070516579401728.0","round1":"-2.7907051657940173e+17"},{"bits":14056672464886288819,"repr":"-1360406872585324.8","g6":"-1.36041e+15","f2":"-1360406872585324.75","f0":"-1360406872585325","f1":"-1360406872585324.8","round1":"-1360406872585324.8"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4710100393853667856,"repr":"7769449.501177326","g6":"7.76945e+06","f2":"7769449.50","f0":"7769450","f1":"7769449.5","round1":"7769449.5"},{"bits":4647115068083725908,"repr":"477.9083094555874","g6":"477.908","f2":"477.91","f0":"478","f1":"477.9","round1":"477.9"},{"bits":4761171197279136970,"repr":"20484889129.23124","g6":"2.04849e+10","f2":"20484889129.23","f0":"20484889129","f1":"20484889129.2","round1":"20484889129.2"},{"bits":4646169425074576211,"repr":"424.1547277936963","g6":"424.155","f2":"424.15","f0":"424","f1":"424.2","round1":"424.2"},{"bits":4430106687427636814,"repr":"1.5291236064593059e-12","g6":"1.52912e-12","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4635121696100840664,"repr":"77.04101056974048","g6":"77.041","f2":"77.04","f0":"77","f1":"77.0","round1":"77.0"},{"bits":4837963473461706752,"repr":"2800536646582272.0","g6":"2.80054e+15","f2":"2800536646582272.00","f0":"2800536646582272","f1":"2800536646582272.0","round1":"2800536646582272.0"},{"bits":4447386197752283136,"repr":"2.2091425910808482e-11","g6":"2.20914e-11","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4708890789864800256,"repr":"6642918.0","g6":"6.64292e+06","f2":"6642918.00","f0":"6642918","f1":"6642918.0","round1":"6642918.0"},{"bits":4645629057640776384,"repr":"393.43839541547277","g6":"393.438","f2":"393.44","f0":"393","f1":"393.4","round1":"393.4"},{"bits":4619654575941484544,"repr":"7.077500820159912","g6":"7.0775","f2":"7.08","f0":"7","f1":"7.1","round1":"7.1"},{"bits":4686530101347614720,"repr":"212169.5","g6":"212170","f2":"212169.50","f0":"212170","f1":"212169.5","round1":"212169.5"},{"bits":4850068370549056817,"repr":"1.7397542251547234e+16","g6":"1.73975e+16","f2":"17397542251547234.00","f0":"17397542251547234","f1":"17397542251547234.0","round1":"1.7397542251547234e+16"},{"bits":4630918218994473883,"repr":"40.65300405624222","g6":"40.653","f2":"40.65","f0":"41","f1":"40.7","round1":"40.7"},{"bits":4636003398481608704,"repr":"89.57075500488281","g6":"89.5708","f2":"89.57","f0":"90","f1":"89.6","round1":"89.6"},{"bits":4621070308294524928,"repr":"8.66984748840332","g6":"8.66985","f2":"8.67","f0":"9","f1":"8.7","round1":"8.7"},{"bits":4500591421313068820,"repr":"7.939601388248776e-08","g6":"7.9396e-08","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4627502854507069440,"repr":"24.192689895629883","g6":"24.1927","f2":"24.19","f0":"24","f1":"24.2","round1":"24.2"},{"bits":4495571798031089135,"repr":"3.628324883955203e-08","g6":"3.62832e-08","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4753721742252310528,"repr":"6606802944.0","g6":"6.6068e+09","f2":"6606802944.00","f0":"6606802944","f1":"6606802944.0","round1":"6606802944.0"},{"bits":13766476705231273984,"repr":"-5.4073523642728105e-05","g6":"-5.40735e-05","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4529621338742810820,"repr":"6.782457813792566e-06","g6":"6.78246e-06","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4761560024340387964,"repr":"21968146656.58641","g6":"2.19681e+10","f2":"21968146656.59","f0":"21968146657","f1":"21968146656.6","round1":"21968146656.6"},{"bits":13989466230193389568,"repr":"-44169519104.0","g6":"-4.41695e+10","f2":"-44169519104.00","f0":"-44169519104","f1":"-44169519104.0","round1":"-44169519104.0"},{"bits":13858547237866438656,"repr":"-77.80136108398438","g6":"-77.8014","f2":"-77.80","f0":"-78","f1":"-77.8","round1":"-77.8"},{"bits":13706088391307689984,"repr":"-5.077503306694098e-09","g6":"-5.0775e-09","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4580407043457810432,"repr":"0.016479255631566048","g6":"0.0164793","f2":"0.02","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4647283932906788354,"repr":"487.50716332378227","g6":"487.507","f2":"487.51","f0":"488","f1":"487.5","round1":"487.5"},{"bits":4776847006349199010,"repr":"229949980586.05182","g6":"2.2995e+11","f2":"229949980586.05","f0":"229949980586","f1":"229949980586.1","round1":"229949980586.1"},{"bits":13946174230644047306,"repr":"-56128084.15563543","g6":"-5.61281e+07","f2":"-56128084.16","f0":"-56128084","f1":"-56128084.2","round1":"-56128084.2"},{"bits":4642825226503654185,"repr":"245.02952383653","g6":"245.03","f2":"245.03","f0":"245","f1":"245.0","round1":"245.0"},{"bits":14057337490616877056,"repr":"-1526663305232384.0","g6":"-1.52666e+15","f2":"-1526663305232384.00","f0":"-1526663305232384","f1":"-1526663305232384.0","round1":"-1526663305232384.0"},{"bits":4674779744963825500,"repr":"33083.28","g6":"33083.3","f2":"33083.28","f0":"33083","f1":"33083.3","round1":"33083.3"},{"bits":4693024786610126848,"repr":"556182.875","g6":"556183","f2":"556182.88","f0":"556183","f1":"556182.9","round1":"556182.9"},{"bits":4646709792508376038,"repr":"454.8710601719198","g6":"454.871","f2":"454.87","f0":"455","f1":"454.9","round1":"454.9"},{"bits":13727123690909221948,"repr":"-1.2323340236851829e-07","g6":"-1.23233e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4612728727854801793,"repr":"2.463056005723445","g6":"2.46306","f2":"2.46","f0":"2","f1":"2.5","round1":"2.5"},{"bits":4710257908019888128,"repr":"7916146.0","g6":"7.91615e+06","f2":"7916146.00","f0":"7916146","f1":"7916146.0","round1":"7916146.0"},{"bits":4677539755544543232,"repr":"53165.0","g6":"53165","f2":"53165.00","f0":"53165","f1":"53165.0","round1":"53165.0"},{"bits":13963889447690188974,"repr":"-862384136.7986047","g6":"-8.62384e+08","f2":"-862384136.80","f0":"-862384137","f1":"-862384136.8","round1":"-862384136.8"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4837917953250820096,"repr":"2777776541138944.0","g6":"2.77778e+15","f2":"2777776541138944.00","f0":"2777776541138944","f1":"2777776541138944.0","round1":"2777776541138944.0"},{"bits":4646405835826863635,"repr":"437.59312320916905","g6":"437.593","f2":"437.59","f0":"438","f1":"437.6","round1":"437.6"},{"bits":14029527996889777598,"repr":"-20776395539269.742","g6":"-2.07764e+13","f2":"-20776395539269.74","f0":"-20776395539270","f1":"-20776395539269.7","round1":"-20776395539269.7"},{"bits":13767166172036333568,"repr":"-5.874553244211711e-05","g6":"-5.87455e-05","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13811891635693488139,"repr":"-0.058000672340782065","g6":"-0.0580007","f2":"-0.06","f0":"-0","f1":"-0.1","round1":"-0.1"},{"bits":4862642062413004800,"repr":"1.241866257217618e+17","g6":"1.24187e+17","f2":"124186625721761792.00","f0":"124186625721761792","f1":"124186625721761792.0","round1":"1.241866257217618e+17"},{"bits":13705114671218950144,"repr":"-4.2720609272350885e-09","g6":"-4.27206e-09","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4559479585527300096,"repr":"0.0006874234532006085","g6":"0.000687423","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13845442663746763117,"repr":"-10.446770270584887","g6":"-10.4468","f2":"-10.45","f0":"-10","f1":"-10.4","round1":"-10.4"},{"bits":4445603756796542976,"repr":"1.6332048560774304e-11","g6":"1.6332e-11","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":14041817031976681472,"repr":"-134384267034624.0","g6":"-1.34384e+14","f2":"-134384267034624.00","f0":"-134384267034624","f1":"-134384267034624.0","round1":"-134384267034624.0"},{"bits":13931364176777439825,"repr":"-5805985.022211627","g6":"-5.80599e+06","f2":"-5805985.02","f0":"-5805985","f1":"-5805985.0","round1":"-5805985.0"},{"bits":14043875581743011874,"repr":"-192360725911745.06","g6":"-1.92361e+14","f2":"-192360725911745.06","f0":"-192360725911745","f1":"-192360725911745.1","round1":"-192360725911745.1"},{"bits":4865753067818726685,"repr":"2.0381023635076803e+17","g6":"2.0381e+17","f2":"203810236350768032.00","f0":"203810236350768032","f1":"203810236350768032.0","round1":"2.0381023635076803e+17"},{"bits":13688531118736625129,"repr":"-3.40976813777991e-10","g6":"-3.40977e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13811891635732086784,"repr":"-0.05800067260861397","g6":"-0.0580007","f2":"-0.06","f0":"-0","f1":"-0.1","round1":"-0.1"},{"bits":4671922561156187351,"repr":"22531.265859846808","g6":"22531.3","f2":"22531.27","f0":"22531","f1":"22531.3","round1":"22531.3"},{"bits":4600296683800016849,"repr":"0.36776492307660386","g6":"0.367765","f2":"0.37","f0":"0","f1":"0.4","round1":"0.4"},{"bits":4606469148749332480,"repr":"0.920811116695404","g6":"0.920811","f2":"0.92","f0":"1","f1":"0.9","round1":"0.9"},{"bits":13881060904159743938,"repr":"-2487.673660309957","g6":"-2487.67","f2":"-2487.67","f0":"-2488","f1":"-2487.7","round1":"-2487.7"},{"bits":4474956732065382400,"repr":"1.527368675979801e-09","g6":"1.52737e-09","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4676391180959156797,"repr":"44808.02","g6":"44808","f2":"44808.02","f0":"44808","f1":"44808.0","round1":"44808.0"},{"bits":4784308350777032704,"repr":"731096940544.0","g6":"7.31097e+11","f2":"731096940544.00","f0":"731096940544","f1":"731096940544.0","round1":"731096940544.0"},{"bits":13830809067591328214,"repr":"-1.0565352068571108","g6":"-1.05654","f2":"-1.06","f0":"-1","f1":"-1.1","round1":"-1.1"},{"bits":4645865468393063808,"repr":"406.87679083094554","g6":"406.877","f2":"406.88","f0":"407","f1":"406.9","round1":"406.9"},{"bits":4740703536320412504,"repr":"884572023.6326704","g6":"8.84572e+08","f2":"884572023.63","f0":"884572024","f1":"884572023.6","round1":"884572023.6"},{"bits":13660373469152411648,"repr":"-4.410067363375125e-12","g6":"-4.41007e-12","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4468670319430729728,"repr":"5.793457935610036e-10","g6":"5.79346e-10","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4815733009894515771,"repr":"92009497856656.92","g6":"9.20095e+13","f2":"92009497856656.92","f0":"92009497856657","f1":"92009497856656.9","round1":"92009497856656.9"},{"bits":4477340778608854362,"repr":"2.178110742820678e-09","g6":"2.17811e-09","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4705103488776929280,"repr":"3655011.5","g6":"3.65501e+06","f2":"3655011.50","f0":"3655012","f1":"3655011.5","round1":"3655011.5"},{"bits":4623012727655235584,"repr":"12.120277404785156","g6":"12.1203","f2":"12.12","f0":"12","f1":"12.1","round1":"12.1"},{"bits":13804955920679043072,"repr":"-0.020562240853905678","g6":"-0.0205622","f2":"-0.02","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4588782753134149632,"repr":"0.059826672077178955","g6":"0.0598267","f2":"0.06","f0":"0","f1":"0.1","round1":"0.1"},{"bits":13840760870444990464,"repr":"-5.065117359161377","g6":"-5.06512","f2":"-5.07","f0":"-5","f1":"-5.1","round1":"-5.1"},{"bits":4646405835826863635,"repr":"437.59312320916905","g6":"437.593","f2":"437.59","f0":"438","f1":"437.6","round1":"437.6"},{"bits":13691573332278415878,"repr":"-5.308498478751912e-10","g6":"-5.3085e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4656905335179575296,"repr":"2131.364501953125","g6":"2131.36","f2":"2131.36","f0":"2131","f1":"2131.4","round1":"2131.4"},{"bits":14027346353001070592,"repr":"-14923267571712.0","g6":"-1.49233e+13","f2":"-14923267571712.00","f0":"-14923267571712","f1":"-14923267571712.0","round1":"-14923267571712.0"},{"bits":13931534564226689296,"repr":"-5964670.700128809","g6":"-5.96467e+06","f2":"-5964670.70","f0":"-5964671","f1":"-5964670.7","round1":"-5964670.7"},{"bits":4474956732257162686,"repr":"1.5273687156390347e-09","g6":"1.52737e-09","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4605154854933889024,"repr":"0.774895191192627","g6":"0.774895","f2":"0.77","f0":"1","f1":"0.8","round1":"0.8"},{"bits":13664167124836820748,"repr":"-7.673158426716814e-12","g6":"-7.67316e-12","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4504881168302211072,"repr":"1.5313139556383248e-07","g6":"1.53131e-07","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13871242639818293093,"repr":"-529.7109901830378","g6":"-529.711","f2":"-529.71","f0":"-530","f1":"-529.7","round1":"-529.7"},{"bits":4529409817238549124,"repr":"6.603292130630119e-06","g6":"6.60329e-06","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4645899241357676298,"repr":"408.79656160458455","g6":"408.797","f2":"408.80","f0":"409","f1":"408.8","round1":"408.8"},{"bits":4662261469172203520,"repr":"5038.1044921875","g6":"5038.1","f2":"5038.10","f0":"5038","f1":"5038.1","round1":"5038.1"},{"bits":4666464996691781091,"repr":"9530.381","g6":"9530.38","f2":"9530.38","f0":"9530","f1":"9530.4","round1":"9530.4"},{"bits":4576510566140371831,"repr":"0.009292817139611149","g6":"0.00929282","f2":"0.01","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4678306211356370534,"repr":"58741.7","g6":"58741.7","f2":"58741.70","f0":"58742","f1":"58741.7","round1":"58741.7"},{"bits":4526938523937263816,"repr":"4.510025282112615e-06","g6":"4.51003e-06","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13844719199814942720,"repr":"-9.161640167236328","g6":"-9.16164","f2":"-9.16","f0":"-9","f1":"-9.2","round1":"-9.2"},{"bits":14043247438085488640,"repr":"-172731236614144.0","g6":"-1.72731e+14","f2":"-172731236614144.00","f0":"-172731236614144","f1":"-172731236614144.0","round1":"-172731236614144.0"},{"bits":13837739395848863744,"repr":"-3.1907544136047363","g6":"-3.19075","f2":"-3.19","f0":"-3","f1":"-3.2","round1":"-3.2"},{"bits":14041323878651559914,"repr":"-126678746329599.66","g6":"-1.26679e+14","f2":"-126678746329599.66","f0":"-126678746329600","f1":"-126678746329599.7","round1":"-126678746329599.7"},{"bits":4744709467957042550,"repr":"1650490752.0486732","g6":"1.65049e+09","f2":"1650490752.05","f0":"1650490752","f1":"1650490752.0","round1":"1650490752.0"},{"bits":4530320961158505471,"repr":"7.37506105052358e-06","g6":"7.37506e-06","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13940419988595671040,"repr":"-23405036.0","g6":"-2.3405e+07","f2":"-23405036.00","f0":"-23405036","f1":"-23405036.0","round1":"-23405036.0"},{"bits":4649461526569156608,"repr":"710.5780639648438","g6":"710.578","f2":"710.58","f0":"711","f1":"710.6","round1":"710.6"},{"bits":4646946203260663462,"repr":"468.30945558739256","g6":"468.309","f2":"468.31","f0":"468","f1":"468.3","round1":"468.3"},{"bits":4613322412778323968,"repr":"2.7267050743103027","g6":"2.72671","f2":"2.73","f0":"3","f1":"2.7","round1":"2.7"},{"bits":4867680742942881970,"repr":"2.6549584032373715e+17","g6":"2.65496e+17","f2":"265495840323737152.00","f0":"265495840323737152","f1":"265495840323737152.0","round1":"2.6549584032373715e+17"},{"bits":4599433408739803136,"repr":"0.3198435306549072","g6":"0.319844","f2":"0.32","f0":"0","f1":"0.3","round1":"0.3"},{"bits":14085015020497007965,"repr":"-1.082013653893995e+17","g6":"-1.08201e+17","f2":"-108201365389399504.00","f0":"-108201365389399504","f1":"-108201365389399504.0","round1":"-1.082013653893995e+17"},{"bits":4603611802570326016,"repr":"0.603581964969635","g6":"0.603582","f2":"0.60","f0":"1","f1":"0.6","round1":"0.6"},{"bits":14083189483357519457,"repr":"-7.899277115758338e+16","g6":"-7.89928e+16","f2":"-78992771157583376.00","f0":"-78992771157583376","f1":"-78992771157583376.0","round1":"-7.899277115758338e+16"},{"bits":13871766438327838157,"repr":"-589.2599863365118","g6":"-589.26","f2":"-589.26","f0":"-589","f1":"-589.3","round1":"-589.3"},{"bits":4461662536848118737,"repr":"1.9652015800278934e-10","g6":"1.9652e-10","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4618381905190977536,"repr":"5.947142124176025","g6":"5.94714","f2":"5.95","f0":"6","f1":"5.9","round1":"5.9"},{"bits":13867998092897246678,"repr":"-336.42435544493253","g6":"-336.424","f2":"-336.42","f0":"-336","f1":"-336.4","round1":"-336.4"},{"bits":13839160635340917398,"repr":"-3.821911536638548","g6":"-3.82191","f2":"-3.82","f0":"-4","f1":"-3.8","round1":"-3.8"},{"bits":4606816474701496320,"repr":"0.9593720436096191","g6":"0.959372","f2":"0.96","f0":"1","f1":"1.0","round1":"1.0"},{"bits":4864358503310978415,"repr":"1.591841721028234e+17","g6":"1.59184e+17","f2":"159184172102823392.00","f0":"159184172102823392","f1":"159184172102823392.0","round1":"1.591841721028234e+17"},{"bits":4693784039117553664,"repr":"644571.5","g6":"644572","f2":"644571.50","f0":"644572","f1":"644571.5","round1":"644571.5"},{"bits":4712798043101474382,"repr":"12175054.288108017","g6":"1.21751e+07","f2":"12175054.29","f0":"12175054","f1":"12175054.3","round1":"12175054.3"},{"bits":4757136297580082711,"repr":"11136418732.088911","g6":"1.11364e+10","f2":"11136418732.09","f0":"11136418732","f1":"11136418732.1","round1":"11136418732.1"},{"bits":13847888408938020864,"repr":"-14.79128646850586","g6":"-14.7913","f2":"-14.79","f0":"-15","f1":"-14.8","round1":"-14.8"},{"bits":13670621862952960000,"repr":"-2.165078533122866e-11","g6":"-2.16508e-11","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13808728000402817024,"repr":"-0.03604854270815849","g6":"-0.0360485","f2":"-0.04","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4666393089730836169,"repr":"9399.583","g6":"9399.58","f2":"9399.58","f0":"9400","f1":"9399.6","round1":"9399.6"},{"bits":13737813318966109317,"repr":"-6.710676878275191e-07","g6":"-6.71068e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4442174198567141376,"repr":"9.901231744213757e-12","g6":"9.90123e-12","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13880366105789869122,"repr":"-2171.715942209151","g6":"-2171.72","f2":"-2171.72","f0":"-2172","f1":"-2171.7","round1":"-2171.7"},{"bits":4494664110879036601,"repr":"3.027667912402141e-08","g6":"3.02767e-08","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4547274474956783616,"repr":"0.00010362330795032904","g6":"0.000103623","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4866805121828043280,"repr":"2.3747596464889907e+17","g6":"2.37476e+17","f2":"237475964648899072.00","f0":"237475964648899072","f1":"237475964648899072.0","round1":"2.3747596464889907e+17"},{"bits":4553185395780616192,"repr":"0.00024664364173077047","g6":"0.000246644","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4587052454029539551,"repr":"0.04782031016826393","g6":"0.0478203","f2":"0.05","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13769284052085374976,"repr":"-8.515853551216424e-05","g6":"-8.51585e-05","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":14013288256665349818,"repr":"-1731790904078.9204","g6":"-1.73179e+12","f2":"-1731790904078.92","f0":"-1731790904079","f1":"-1731790904078.9","round1":"-1731790904078.9"},{"bits":4843334538592199805,"repr":"6468538796287101.0","g6":"6.46854e+15","f2":"6468538796287101.00","f0":"6468538796287101","f1":"6468538796287101.0","round1":"6468538796287101.0"},{"bits":4677319926156748354,"repr":"51565.530692052576","g6":"51565.5","f2":"51565.53","f0":"51566","f1":"51565.5","round1":"51565.5"},{"bits":4682057218789474304,"repr":"106531.7421875","g6":"106532","f2":"106531.74","f0":"106532","f1":"106531.7","round1":"106531.7"},{"bits":4700786344417296384,"repr":"1870918.25","g6":"1.87092e+06","f2":"1870918.25","f0":"1870918","f1":"1870918.2","round1":"1870918.2"},{"bits":4635624462643888128,"repr":"84.18575286865234","g6":"84.1858","f2":"84.19","f0":"84","f1":"84.2","round1":"84.2"},{"bits":13888405822833655300,"repr":"-7559.51193949534","g6":"-7559.51","f2":"-7559.51","f0":"-7560","f1":"-7559.5","round1":"-7559.5"},{"bits":13868705581421241242,"repr":"-376.64042195357035","g6":"-376.64","f2":"-376.64","f0":"-377","f1":"-376.6","round1":"-376.6"},{"bits":4873340886613753856,"repr":"6.33560246559703e+17","g6":"6.3356e+17","f2":"633560246559703040.00","f0":"633560246559703040","f1":"633560246559703040.0","round1":"6.33560246559703e+17"},{"bits":4733502017085898752,"repr":"281477472.0","g6":"2.81477e+08","f2":"281477472.00","f0":"281477472","f1":"281477472.0","round1":"281477472.0"},{"bits":4597288956264972288,"repr":"0.22540125250816345","g6":"0.225401","f2":"0.23","f0":"0","f1":"0.2","round1":"0.2"},{"bits":4523694378602697845,"repr":"2.788412281839456e-06","g6":"2.78841e-06","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4526252825172246528,"repr":"3.929215836251387e-06","g6":"3.92922e-06","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4549644152295391232,"repr":"0.0001494065363658592","g6":"0.000149407","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13737969206143229828,"repr":"-6.875728847119616e-07","g6":"-6.87573e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4649189570850586624,"repr":"679.6602783203125","g6":"679.66","f2":"679.66","f0":"680","f1":"679.7","round1":"679.7"},{"bits":4645493965782326428,"repr":"385.75931232091693","g6":"385.759","f2":"385.76","f0":"386","f1":"385.8","round1":"385.8"},{"bits":4634477354725408768,"repr":"67.88436889648438","g6":"67.8844","f2":"67.88","f0":"68","f1":"67.9","round1":"67.9"},{"bits":14058153663995593698,"repr":"-1730706649911544.5","g6":"-1.73071e+15","f2":"-1730706649911544.50","f0":"-1730706649911544","f1":"-1730706649911544.5","round1":"-1730706649911544.5"},{"bits":4621499114071261184,"repr":"9.431559562683105","g6":"9.43156","f2":"9.43","f0":"9","f1":"9.4","round1":"9.4"},{"bits":4783471967823851483,"repr":"628999412079.4955","g6":"6.28999e+11","f2":"628999412079.50","f0":"628999412079","f1":"628999412079.5","round1":"628999412079.5"},{"bits":13855269047706320896,"repr":"-47.60773849487305","g6":"-47.6077","f2":"-47.61","f0":"-48","f1":"-47.6","round1":"-47.6"},{"bits":14091993254237044736,"repr":"-3.029516686165279e+17","g6":"-3.02952e+17","f2":"-302951668616527872.00","f0":"-302951668616527872","f1":"-302951668616527872.0","round1":"-3.029516686165279e+17"},{"bits":4617539520907182080,"repr":"5.1989545822143555","g6":"5.19895","f2":"5.20","f0":"5","f1":"5.2","round1":"5.2"},{"bits":13829823561498141176,"repr":"-0.9188544478720919","g6":"-0.918854","f2":"-0.92","f0":"-1","f1":"-0.9","round1":"-0.9"},{"bits":13862106380250767356,"repr":"-128.75963283679437","g6":"-128.76","f2":"-128.76","f0":"-129","f1":"-128.8","round1":"-128.8"},{"bits":13990820517505737857,"repr":"-54501911318.5713","g6":"-5.45019e+10","f2":"-54501911318.57","f0":"-54501911319","f1":"-54501911318.6","round1":"-54501911318.6"},{"bits":13921897784291622912,"repr":"-1344582.0","g6":"-1.34458e+06","f2":"-1344582.00","f0":"-1344582","f1":"-1344582.0","round1":"-1344582.0"},{"bits":4621491574793043968,"repr":"9.418167114257812","g6":"9.41817","f2":"9.42","f0":"9","f1":"9.4","round1":"9.4"},{"bits":13999078975813451776,"repr":"-195157884928.0","g6":"-1.95158e+11","f2":"-195157884928.00","f0":"-195157884928","f1":"-195157884928.0","round1":"-195157884928.0"},{"bits":13664567841977521076,"repr":"-8.320551883562508e-12","g6":"-8.32055e-12","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4550733907368083456,"repr":"0.0001789444067981094","g6":"0.000178944","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13751760475996028928,"repr":"-5.738151230616495e-06","g6":"-5.73815e-06","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4570917429181415424,"repr":"0.0038038177881389856","g6":"0.00380382","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4711115277981450240,"repr":"9040660.0","g6":"9.04066e+06","f2":"9040660.00","f0":"9040660","f1":"9040660.0","round1":"9040660.0"},{"bits":13674747925291335680,"repr":"-4.0861793115798406e-11","g6":"-4.08618e-11","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4646203198039188700,"repr":"426.07449856733524","g6":"426.074","f2":"426.07","f0":"426","f1":"426.1","round1":"426.1"},{"bits":4700746479604596736,"repr":"1861636.5","g6":"1.86164e+06","f2":"1861636.50","f0":"1861636","f1":"1861636.5","round1":"1861636.5"},{"bits":14089499769634291712,"repr":"-2.1579951509602304e+17","g6":"-2.158e+17","f2":"-215799515096023040.00","f0":"-215799515096023040","f1":"-215799515096023040.0","round1":"-2.1579951509602304e+17"},{"bits":4868238349468840454,"repr":"2.8333924915440864e+17","g6":"2.83339e+17","f2":"283339249154408640.00","f0":"283339249154408640","f1":"283339249154408640.0","round1":"2.8333924915440864e+17"},{"bits":14032291293804101632,"repr":"-31570524110848.0","g6":"-3.15705e+13","f2":"-31570524110848.00","f0":"-31570524110848","f1":"-31570524110848.0","round1":"-31570524110848.0"},{"bits":13873985509086199808,"repr":"-841.5391235351562","g6":"-841.539","f2":"-841.54","f0":"-842","f1":"-841.5","round1":"-841.5"},{"bits":4646608473614538570,"repr":"449.11174785100286","g6":"449.112","f2":"449.11","f0":"449","f1":"449.1","round1":"449.1"},{"bits":13754847656612462592,"repr":"-9.076795322471298e-06","g6":"-9.0768e-06","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13922169717461614592,"repr":"-1407896.375","g6":"-1.4079e+06","f2":"-1407896.38","f0":"-1407896","f1":"-1407896.4","round1":"-1407896.4"},{"bits":4509210707385049190,"repr":"2.970481026254182e-07","g6":"2.97048e-07","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13966236515219202061,"repr":"-1210610954.919925","g6":"-1.21061e+09","f2":"-1210610954.92","f0":"-1210610955","f1":"-1210610954.9","round1":"-1210610954.9"},{"bits":4629774356409483264,"repr":"32.52537155151367","g6":"32.5254","f2":"32.53","f0":"33","f1":"32.5","round1":"32.5"},{"bits":4489160076076365974,"repr":"1.3364669215680464e-08","g6":"1.33647e-08","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4645730376534613852,"repr":"399.1977077363897","g6":"399.198","f2":"399.20","f0":"399","f1":"399.2","round1":"399.2"},{"bits":13955537312931542804,"repr":"-235118477.49700224","g6":"-2.35118e+08","f2":"-235118477.50","f0":"-235118477","f1":"-235118477.5","round1":"-235118477.5"},{"bits":13847163765792570851,"repr":"-13.504061660961218","g6":"-13.5041","f2":"-13.50","f0":"-14","f1":"-13.5","round1":"-13.5"},{"bits":13963579038880873706,"repr":"-825380523.1698277","g6":"-8.25381e+08","f2":"-825380523.17","f0":"-825380523","f1":"-825380523.2","round1":"-825380523.2"},{"bits":13912994243250923661,"repr":"-342179.2021738373","g6":"-342179","f2":"-342179.20","f0":"-342179","f1":"-342179.2","round1":"-342179.2"},{"bits":4698048993718960128,"repr":"1233579.125","g6":"1.23358e+06","f2":"1233579.12","f0":"1233579","f1":"1233579.1","round1":"1233579.1"},{"bits":14042519294563057664,"repr":"-149976751538176.0","g6":"-1.49977e+14","f2":"-149976751538176.00","f0":"-149976751538176","f1":"-149976751538176.0","round1":"-149976751538176.0"},{"bits":4870996148539621376,"repr":"4.5494726268708454e+17","g6":"4.54947e+17","f2":"454947262687084544.00","f0":"454947262687084544","f1":"454947262687084544.0","round1":"4.5494726268708454e+17"},{"bits":4712123988829517206,"repr":"10919530.36812858","g6":"1.09195e+07","f2":"10919530.37","f0":"10919530","f1":"10919530.4","round1":"10919530.4"},{"bits":4647047522154500929,"repr":"474.06876790830944","g6":"474.069","f2":"474.07","f0":"474","f1":"474.1","round1":"474.1"},{"bits":13749499865593806848,"repr":"-3.823339739028597e-06","g6":"-3.82334e-06","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4828370972386459079,"repr":"626971434082232.9","g6":"6.26971e+14","f2":"626971434082232.88","f0":"626971434082233","f1":"626971434082232.9","round1":"626971434082232.9"},{"bits":4594178634364747776,"repr":"0.1390724778175354","g6":"0.139072","f2":"0.14","f0":"0","f1":"0.1","round1":"0.1"},{"bits":4635378478592557056,"repr":"80.69010925292969","g6":"80.6901","f2":"80.69","f0":"81","f1":"80.7","round1":"80.7"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":14027330290233984501,"repr":"-14891894979746.979","g6":"-1.48919e+13","f2":"-14891894979746.98","f0":"-14891894979747","f1":"-14891894979747.0","round1":"-14891894979747.0"},{"bits":4809051977344352256,"repr":"32088963153920.0","g6":"3.2089e+13","f2":"32088963153920.00","f0":"32088963153920","f1":"32088963153920.0","round1":"32088963153920.0"},{"bits":4698449299703332864,"repr":"1326782.625","g6":"1.32678e+06","f2":"1326782.62","f0":"1326783","f1":"1326782.6","round1":"1326782.6"},{"bits":4438406944455154624,"repr":"5.545431042483636e-12","g6":"5.54543e-12","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4468187224240963253,"repr":"5.293949216869468e-10","g6":"5.29395e-10","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4852364971251597312,"repr":"2.5967088803774464e+16","g6":"2.59671e+16","f2":"25967088803774464.00","f0":"25967088803774464","f1":"25967088803774464.0","round1":"2.5967088803774464e+16"},{"bits":4801895385008177152,"repr":"10862855192576.0","g6":"1.08629e+13","f2":"10862855192576.00","f0":"10862855192576","f1":"10862855192576.0","round1":"10862855192576.0"},{"bits":4691073519616786432,"repr":"426656.75","g6":"426657","f2":"426656.75","f0":"426657","f1":"426656.8","round1":"426656.8"},{"bits":4837278603345395712,"repr":"2458101588426752.0","g6":"2.4581e+15","f2":"2458101588426752.00","f0":"2458101588426752","f1":"2458101588426752.0","round1":"2458101588426752.0"},{"bits":4805722440881643340,"repr":"19082961346463.297","g6":"1.9083e+13","f2":"19082961346463.30","f0":"19082961346463","f1":"19082961346463.3","round1":"19082961346463.3"},{"bits":4824000966426624000,"repr":"321835321262080.0","g6":"3.21835e+14","f2":"321835321262080.00","f0":"321835321262080","f1":"321835321262080.0","round1":"321835321262080.0"},{"bits":13730486356222672896,"repr":"-2.1224241208983585e-07","g6":"-2.12242e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":14072646434465775616,"repr":"-1.5809596375433216e+16","g6":"-1.58096e+16","f2":"-15809596375433216.00","f0":"-15809596375433216","f1":"-15809596375433216.0","round1":"-1.5809596375433216e+16"},{"bits":14045063059274203136,"repr":"-229469398761472.0","g6":"-2.29469e+14","f2":"-229469398761472.00","f0":"-229469398761472","f1":"-229469398761472.0","round1":"-229469398761472.0"},{"bits":13998743087896068096,"repr":"-184907399168.0","g6":"-1.84907e+11","f2":"-184907399168.00","f0":"-184907399168","f1":"-184907399168.0","round1":"-184907399168.0"},{"bits":13671422640814817280,"repr":"-2.4238238152674008e-11","g6":"-2.42382e-11","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4647047522154500929,"repr":"474.06876790830944","g6":"474.069","f2":"474.07","f0":"474","f1":"474.1","round1":"474.1"},{"bits":4674531803652947968,"repr":"32023.634765625","g6":"32023.6","f2":"32023.63","f0":"32024","f1":"32023.6","round1":"32023.6"},{"bits":4609784729284116480,"repr":"1.5778290033340454","g6":"1.57783","f2":"1.58","f0":"2","f1":"1.6","round1":"1.6"},{"bits":13829346624026458159,"repr":"-0.8659037516351925","g6":"-0.865904","f2":"-0.87","f0":"-1","f1":"-0.9","round1":"-0.9"},{"bits":13870636387004317696,"repr":"-486.3940124511719","g6":"-486.394","f2":"-486.39","f0":"-486","f1":"-486.4","round1":"-486.4"},{"bits":13738970750630760697,"repr":"-7.936155320969078e-07","g6":"-7.93616e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4803451570661491982,"repr":"13902280296706.527","g6":"1.39023e+13","f2":"13902280296706.53","f0":"13902280296707","f1":"13902280296706.5","round1":"13902280296706.5"},{"bits":13925250631447298272,"repr":"-2153303.12265788","g6":"-2.1533e+06","f2":"-2153303.12","f0":"-2153303","f1":"-2153303.1","round1":"-2153303.1"},{"bits":14011522836636631040,"repr":"-1300780154880.0","g6":"-1.30078e+12","f2":"-1300780154880.00","f0":"-1300780154880","f1":"-1300780154880.0","round1":"-1300780154880.0"},{"bits":13756614006822185037,"repr":"-1.2069108970520206e-05","g6":"-1.20691e-05","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13720836071565106164,"repr":"-4.8805020802992514e-08","g6":"-4.8805e-08","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13926220122170548055,"repr":"-2604757.4208792853","g6":"-2.60476e+06","f2":"-2604757.42","f0":"-2604757","f1":"-2604757.4","round1":"-2604757.4"},{"bits":4769729632672003264,"repr":"75091963409.70605","g6":"7.5092e+10","f2":"75091963409.71","f0":"75091963410","f1":"75091963409.7","round1":"75091963409.7"},{"bits":4682120801485324288,"repr":"107456.9921875","g6":"107457","f2":"107456.99","f0":"107457","f1":"107457.0","round1":"107457.0"},{"bits":4649057808770138112,"repr":"664.6806640625","g6":"664.681","f2":"664.68","f0":"665","f1":"664.7","round1":"664.7"},{"bits":13778225505054490624,"repr":"-0.0003370700287632644","g6":"-0.00033707","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4829009658502971392,"repr":"706807198646272.0","g6":"7.06807e+14","f2":"706807198646272.00","f0":"706807198646272","f1":"706807198646272.0","round1":"706807198646272.0"},{"bits":4636295684964745216,"repr":"93.72439575195312","g6":"93.7244","f2":"93.72","f0":"94","f1":"93.7","round1":"93.7"},{"bits":4522808544868696064,"repr":"2.413247102595051e-06","g6":"2.41325e-06","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13969101441775497834,"repr":"-1893662673.7022958","g6":"-1.89366e+09","f2":"-1893662673.70","f0":"-1893662674","f1":"-1893662673.7","round1":"-1893662673.7"},{"bits":4629687285261856079,"repr":"31.953346918552878","g6":"31.9533","f2":"31.95","f0":"32","f1":"32.0","round1":"32.0"},{"bits":4712431339436432928,"repr":"11492015.48521334","g6":"1.1492e+07","f2":"11492015.49","f0":"11492015","f1":"11492015.5","round1":"11492015.5"},{"bits":4846514083848294666,"repr":"1.0288968850022932e+16","g6":"1.0289e+16","f2":"10288968850022932.00","f0":"10288968850022932","f1":"10288968850022932.0","round1":"1.0288968850022932e+16"},{"bits":4578215176691515392,"repr":"0.012249845080077648","g6":"0.0122498","f2":"0.01","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4613317188688174746,"repr":"2.7243851122437492","g6":"2.72439","f2":"2.72","f0":"3","f1":"2.7","round1":"2.7"},{"bits":4592807345259544576,"repr":"0.11300577968358994","g6":"0.113006","f2":"0.11","f0":"0","f1":"0.1","round1":"0.1"},{"bits":4469869794541348431,"repr":"7.033686131539647e-10","g6":"7.03369e-10","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4693429983488507904,"repr":"603354.0","g6":"603354","f2":"603354.00","f0":"603354","f1":"603354.0","round1":"603354.0"},{"bits":4535819590483050496,"repr":"1.76127468876075e-05","g6":"1.76127e-05","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4696264500505829746,"repr":"933335.2107954456","g6":"933335","f2":"933335.21","f0":"933335","f1":"933335.2","round1":"933335.2"},{"bits":13837920265528237230,"repr":"-3.271076686603542","g6":"-3.27108","f2":"-3.27","f0":"-3","f1":"-3.3","round1":"-3.3"},{"bits":13800022344896348160,"repr":"-0.009535230696201324","g6":"-0.00953523","f2":"-0.01","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4869932072539521024,"repr":"3.86846398680662e+17","g6":"3.86846e+17","f2":"386846398680662016.00","f0":"386846398680662016","f1":"386846398680662016.0","round1":"3.86846398680662e+17"},{"bits":13652003609686649386,"repr":"-1.2312265862177665e-12","g6":"-1.23123e-12","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4598640985946273916,"repr":"0.2758552291242109","g6":"0.275855","f2":"0.28","f0":"0","f1":"0.3","round1":"0.3"},{"bits":4839049689205104316,"repr":"3343644518281054.0","g6":"3.34364e+15","f2":"3343644518281054.00","f0":"3343644518281054","f1":"3343644518281054.0","round1":"3343644518281054.0"},{"bits":14027211869590630441,"repr":"-14660604660696.08","g6":"-1.46606e+13","f2":"-14660604660696.08","f0":"-14660604660696","f1":"-14660604660696.1","round1":"-14660604660696.1"},{"bits":13853242479735734272,"repr":"-33.208106994628906","g6":"-33.2081","f2":"-33.21","f0":"-33","f1":"-33.2","round1":"-33.2"},{"bits":4647250159942175864,"repr":"485.58739255014325","g6":"485.587","f2":"485.59","f0":"486","f1":"485.6","round1":"485.6"},{"bits":13866743903915900562,"repr":"-265.13196584766513","g6":"-265.132","f2":"-265.13","f0":"-265","f1":"-265.1","round1":"-265.1"},{"bits":4624052197250826240,"repr":"13.96674633026123","g6":"13.9667","f2":"13.97","f0":"14","f1":"14.0","round1":"14.0"},{"bits":4647182614012950886,"repr":"481.74785100286533","g6":"481.748","f2":"481.75","f0":"482","f1":"481.7","round1":"481.7"},{"bits":4580224714579902464,"repr":"0.015846675261855125","g6":"0.0158467","f2":"0.02","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4475664200688992256,"repr":"1.673669758339713e-09","g6":"1.67367e-09","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4634605068262309888,"repr":"69.69928741455078","g6":"69.6993","f2":"69.70","f0":"70","f1":"69.7","round1":"69.7"},{"bits":4593106547176898560,"repr":"0.11715804040431976","g6":"0.117158","f2":"0.12","f0":"0","f1":"0.1","round1":"0.1"},{"bits":4672118819622223872,"repr":"23245.25","g6":"23245.2","f2":"23245.25","f0":"23245","f1":"23245.2","round1":"23245.2"},{"bits":4833566949106039575,"repr":"1427037141216965.8","g6":"1.42704e+15","f2":"1427037141216965.75","f0":"1427037141216966","f1":"1427037141216965.8","round1":"1427037141216965.8"},{"bits":13973902684845631477,"repr":"-3929252800.809565","g6":"-3.92925e+09","f2":"-3929252800.81","f0":"-3929252801","f1":"-3929252800.8","round1":"-3929252800.8"},{"bits":13781391654561322889,"repr":"-0.0005291334248986739","g6":"-0.000529133","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4622434045773479936,"repr":"11.092331886291504","g6":"11.0923","f2":"11.09","f0":"11","f1":"11.1","round1":"11.1"},{"bits":4458867764503057036,"repr":"1.2427698611733936e-10","g6":"1.24277e-10","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4541569964761535645,"repr":"4.367396743357977e-05","g6":"4.3674e-05","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13822095700638302208,"repr":"-0.28044477105140686","g6":"-0.280445","f2":"-0.28","f0":"-0","f1":"-0.3","round1":"-0.3"},{"bits":13820174658403565568,"repr":"-0.21190275251865387","g6":"-0.211903","f2":"-0.21","f0":"-0","f1":"-0.2","round1":"-0.2"},{"bits":4519188141433140071,"repr":"1.3936476196366286e-06","g6":"1.39365e-06","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4646676019543763548,"repr":"452.9512893982808","g6":"452.951","f2":"452.95","f0":"453","f1":"453.0","round1":"453.0"},{"bits":4868593812269694976,"repr":"3.0119774141179494e+17","g6":"3.01198e+17","f2":"301197741411794944.00","f0":"301197741411794944","f1":"301197741411794944.0","round1":"3.0119774141179494e+17"},{"bits":13879910263145563933,"repr":"-2006.2113536451427","g6":"-2006.21","f2":"-2006.21","f0":"-2006","f1":"-2006.2","round1":"-2006.2"},{"bits":4646405835826863635,"repr":"437.59312320916905","g6":"437.593","f2":"437.59","f0":"438","f1":"437.6","round1":"437.6"},{"bits":4683345846417227776,"repr":"125283.7421875","g6":"125284","f2":"125283.74","f0":"125284","f1":"125283.7","round1":"125283.7"},{"bits":4596426283629412352,"repr":"0.20145727694034576","g6":"0.201457","f2":"0.20","f0":"0","f1":"0.2","round1":"0.2"},{"bits":4590366329405641225,"repr":"0.07912987962760822","g6":"0.0791299","f2":"0.08","f0":"0","f1":"0.1","round1":"0.1"},{"bits":13888080525369274325,"repr":"-7263.655619140675","g6":"-7263.66","f2":"-7263.66","f0":"-7264","f1":"-7263.7","round1":"-7263.7"},{"bits":13889832437697959883,"repr":"-9522.021200101726","g6":"-9522.02","f2":"-9522.02","f0":"-9522","f1":"-9522.0","round1":"-9522.0"},{"bits":4740054393959743488,"repr":"807188224.0","g6":"8.07188e+08","f2":"807188224.00","f0":"807188224","f1":"807188224.0","round1":"807188224.0"},{"bits":4635543217431904256,"repr":"83.03118896484375","g6":"83.0312","f2":"83.03","f0":"83","f1":"83.0","round1":"83.0"},{"bits":13750427419219018882,"repr":"-4.609008219928357e-06","g6":"-4.60901e-06","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":14029600951522820096,"repr":"-21061374574592.0","g6":"-2.10614e+13","f2":"-21061374574592.00","f0":"-21061374574592","f1":"-21061374574592.0","round1":"-21061374574592.0"},{"bits":4680485199018983424,"repr":"83655.84375","g6":"83655.8","f2":"83655.84","f0":"83656","f1":"83655.8","round1":"83655.8"},{"bits":4646388217014289864,"repr":"436.5916096662081","g6":"436.592","f2":"436.59","f0":"437","f1":"436.6","round1":"436.6"},{"bits":13988292746667229120,"repr":"-35216550306.99951","g6":"-3.52166e+10","f2":"-35216550307.00","f0":"-35216550307","f1":"-35216550307.0","round1":"-35216550307.0"},{"bits":13876816903669941493,"repr":"-1302.8628402057195","g6":"-1302.86","f2":"-1302.86","f0":"-1303","f1":"-1302.9","round1":"-1302.9"},{"bits":13688153856807922756,"repr":"-3.2147282919818066e-10","g6":"-3.21473e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13791342021570451351,"repr":"-0.0025255675109247633","g6":"-0.00252557","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4693098461942251520,"repr":"564759.8125","g6":"564760","f2":"564759.81","f0":"564760","f1":"564759.8","round1":"564759.8"},{"bits":4612535863606247424,"repr":"2.3774070739746094","g6":"2.37741","f2":"2.38","f0":"2","f1":"2.4","round1":"2.4"},{"bits":4692828447548899328,"repr":"533326.0","g6":"533326","f2":"533326.00","f0":"533326","f1":"533326.0","round1":"533326.0"},{"bits":13776961210205698377,"repr":"-0.0002685324676771251","g6":"-0.000268532","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13755126569415754527,"repr":"-9.549291990069952e-06","g6":"-9.54929e-06","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4540204050401984512,"repr":"3.441817170823924e-05","g6":"3.44182e-05","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13691832292226500037,"repr":"-5.576256789355606e-10","g6":"-5.57626e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4438406944239124480,"repr":"5.545430867975876e-12","g6":"5.54543e-12","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13726699906075197440,"repr":"-1.1561260038206456e-07","g6":"-1.15613e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4620650032859709440,"repr":"7.961644172668457","g6":"7.96164","f2":"7.96","f0":"8","f1":"8.0","round1":"8.0"},{"bits":4475105966072791040,"repr":"1.5582295453953066e-09","g6":"1.55823e-09","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4635615677825155072,"repr":"84.0609130859375","g6":"84.0609","f2":"84.06","f0":"84","f1":"84.1","round1":"84.1"},{"bits":14055463517465608192,"repr":"-1092034962128896.0","g6":"-1.09203e+15","f2":"-1092034962128896.00","f0":"-1092034962128896","f1":"-1092034962128896.0","round1":"-1092034962128896.0"},{"bits":4700788655646572544,"repr":"1871456.375","g6":"1.87146e+06","f2":"1871456.38","f0":"1871456","f1":"1871456.4","round1":"1871456.4"},{"bits":13751591775586222080,"repr":"-5.595256425294792e-06","g6":"-5.59526e-06","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13844721373068394496,"repr":"-9.16550064086914","g6":"-9.1655","f2":"-9.17","f0":"-9","f1":"-9.2","round1":"-9.2"},{"bits":13941347145870213120,"repr":"-26858966.0","g6":"-2.6859e+07","f2":"-26858966.00","f0":"-26858966","f1":"-26858966.0","round1":"-26858966.0"},{"bits":13906679422287451798,"repr":"-124724.06120070288","g6":"-124724","f2":"-124724.06","f0":"-124724","f1":"-124724.1","round1":"-124724.1"},{"bits":4768899502324154365,"repr":"65572328136.74998","g6":"6.55723e+10","f2":"65572328136.75","f0":"65572328137","f1":"65572328136.7","round1":"65572328136.7"},{"bits":4812212501846276948,"repr":"53685151890294.66","g6":"5.36852e+13","f2":"53685151890294.66","f0":"53685151890295","f1":"53685151890294.7","round1":"53685151890294.7"},{"bits":4646811111402213505,"repr":"460.63037249283667","g6":"460.63","f2":"460.63","f0":"461","f1":"460.6","round1":"460.6"},{"bits":13898440615319830528,"repr":"-35184.8203125","g6":"-35184.8","f2":"-35184.82","f0":"-35185","f1":"-35184.8","round1":"-35184.8"},{"bits":4869927570876923904,"repr":"3.8655829227444634e+17","g6":"3.86558e+17","f2":"386558292274446336.00","f0":"386558292274446336","f1":"386558292274446336.0","round1":"3.8655829227444634e+17"},{"bits":13947510662903742840,"repr":"-66085280.41882604","g6":"-6.60853e+07","f2":"-66085280.42","f0":"-66085280","f1":"-66085280.4","round1":"-66085280.4"},{"bits":4463190993428021248,"repr":"2.392290254782381e-10","g6":"2.39229e-10","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4570514966586589184,"repr":"0.0036292774602770805","g6":"0.00362928","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4662913981004906496,"repr":"5631.560546875","g6":"5631.56","f2":"5631.56","f0":"5632","f1":"5631.6","round1":"5631.6"},{"bits":4596427157118386176,"repr":"0.20148152112960815","g6":"0.201482","f2":"0.20","f0":"0","f1":"0.2","round1":"0.2"},{"bits":4635552729710723072,"repr":"83.16636657714844","g6":"83.1664","f2":"83.17","f0":"83","f1":"83.2","round1":"83.2"},{"bits":14010919320180228096,"repr":"-1153437270016.0","g6":"-1.15344e+12","f2":"-1153437270016.00","f0":"-1153437270016","f1":"-1153437270016.0","round1":"-1153437270016.0"},{"bits":4622660365317046272,"repr":"11.494356155395508","g6":"11.4944","f2":"11.49","f0":"11","f1":"11.5","round1":"11.5"},{"bits":4576447310707294208,"repr":"0.009183086454868317","g6":"0.00918309","f2":"0.01","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4783086068582842368,"repr":"581892571136.0","g6":"5.81893e+11","f2":"581892571136.00","f0":"581892571136","f1":"581892571136.0","round1":"581892571136.0"},{"bits":14022197112926030107,"repr":"-6831125536178.276","g6":"-6.83113e+12","f2":"-6831125536178.28","f0":"-6831125536178","f1":"-6831125536178.3","round1":"-6831125536178.3"},{"bits":13897904054404850169,"repr":"-32024.412918837716","g6":"-32024.4","f2":"-32024.41","f0":"-32024","f1":"-32024.4","round1":"-32024.4"},{"bits":13687187450796357633,"repr":"-2.7151080940934524e-10","g6":"-2.71511e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4573195313405231104,"repr":"0.005677135195583105","g6":"0.00567714","f2":"0.01","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4694284857215077581,"repr":"702874.4","g6":"702874","f2":"702874.40","f0":"702874","f1":"702874.4","round1":"702874.4"},{"bits":13835291640805813643,"repr":"-2.103732810630111","g6":"-2.10373","f2":"-2.10","f0":"-2","f1":"-2.1","round1":"-2.1"},{"bits":13742323573316386816,"repr":"-1.3435445680443081e-06","g6":"-1.34354e-06","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13700126923344039250,"repr":"-1.9357914416340736e-09","g6":"-1.93579e-09","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4749088928922674306,"repr":"3241787577.4107065","g6":"3.24179e+09","f2":"3241787577.41","f0":"3241787577","f1":"3241787577.4","round1":"3241787577.4"},{"bits":4749088929070710784,"repr":"3241787648.0","g6":"3.24179e+09","f2":"3241787648.00","f0":"3241787648","f1":"3241787648.0","round1":"3241787648.0"},{"bits":13694938639564275712,"repr":"-8.788144656435293e-10","g6":"-8.78814e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13964573005963601753,"repr":"-943870632.9387008","g6":"-9.43871e+08","f2":"-943870632.94","f0":"-943870633","f1":"-943870632.9","round1":"-943870632.9"},{"bits":4540156809569891458,"repr":"3.409805537833104e-05","g6":"3.40981e-05","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13750868225535691497,"repr":"-4.982385693507875e-06","g6":"-4.98239e-06","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4787396987924250624,"repr":"1116744056832.0","g6":"1.11674e+12","f2":"1116744056832.00","f0":"1116744056832","f1":"1116744056832.0","round1":"1116744056832.0"},{"bits":13769725901761411111,"repr":"-9.114671524554416e-05","g6":"-9.11467e-05","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4820160620882034688,"repr":"181644350717952.0","g6":"1.81644e+14","f2":"181644350717952.00","f0":"181644350717952","f1":"181644350717952.0","round1":"181644350717952.0"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13777078700468076544,"repr":"-0.0002749016275629401","g6":"-0.000274902","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4827773781129370893,"repr":"557636240183760.8","g6":"5.57636e+14","f2":"557636240183760.81","f0":"557636240183761","f1":"557636240183760.8","round1":"557636240183760.8"},{"bits":4658450446979956736,"repr":"2834.0","g6":"2834","f2":"2834.00","f0":"2834","f1":"2834.0","round1":"2834.0"},{"bits":4799078469503811584,"repr":"7078580060160.0","g6":"7.07858e+12","f2":"7078580060160.00","f0":"7078580060160","f1":"7078580060160.0","round1":"7078580060160.0"},{"bits":13769755144499494912,"repr":"-9.154302824754268e-05","g6":"-9.1543e-05","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4521991125619179520,"repr":"2.0670565845648525e-06","g6":"2.06706e-06","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":14069562415846319725,"repr":"-9641559136521434.0","g6":"-9.64156e+15","f2":"-9641559136521434.00","f0":"-9641559136521434","f1":"-9641559136521434.0","round1":"-9641559136521434.0"},{"bits":4697939743700814144,"repr":"1208142.3729558736","g6":"1.20814e+06","f2":"1208142.37","f0":"1208142","f1":"1208142.4","round1":"1208142.4"},{"bits":4803624096728455783,"repr":"14239245271245.201","g6":"1.42392e+13","f2":"14239245271245.20","f0":"14239245271245","f1":"14239245271245.2","round1":"14239245271245.2"},{"bits":4846100390472581120,"repr":"9461582098595840.0","g6":"9.46158e+15","f2":"9461582098595840.00","f0":"9461582098595840","f1":"9461582098595840.0","round1":"9461582098595840.0"},{"bits":4617090163175063552,"repr":"4.799844741821289","g6":"4.79984","f2":"4.80","f0":"5","f1":"4.8","round1":"4.8"},{"bits":4647047522154500929,"repr":"474.06876790830944","g6":"474.069","f2":"474.07","f0":"474","f1":"474.1","round1":"474.1"},{"bits":4806142176729759744,"repr":"20722554503168.0","g6":"2.07226e+13","f2":"20722554503168.00","f0":"20722554503168","f1":"20722554503168.0","round1":"20722554503168.0"},{"bits":13849395329530301657,"repr":"-18.936230338073845","g6":"-18.9362","f2":"-18.94","f0":"-19","f1":"-18.9","round1":"-18.9"},{"bits":4549067895996416000,"repr":"0.00013378707808442414","g6":"0.000133787","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4596647724627001344,"repr":"0.20760349929332733","g6":"0.207603","f2":"0.21","f0":"0","f1":"0.2","round1":"0.2"},{"bits":13726960169282174976,"repr":"-1.1905715524562765e-07","g6":"-1.19057e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13844719199803586314,"repr":"-9.161640147063299","g6":"-9.16164","f2":"-9.16","f0":"-9","f1":"-9.2","round1":"-9.2"},{"bits":13697180571451973715,"repr":"-1.28992700471363e-09","g6":"-1.28993e-09","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4587076371754254336,"repr":"0.04798627272248268","g6":"0.0479863","f2":"0.05","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13686775010004303872,"repr":"-2.5018812022103987e-10","g6":"-2.50188e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13958733620161019904,"repr":"-392316256.0","g6":"-3.92316e+08","f2":"-392316256.00","f0":"-392316256","f1":"-392316256.0","round1":"-392316256.0"},{"bits":13952178965880766464,"repr":"-135031936.0","g6":"-1.35032e+08","f2":"-135031936.00","f0":"-135031936","f1":"-135031936.0","round1":"-135031936.0"},{"bits":4591130870273802240,"repr":"0.08974001556634903","g6":"0.08974","f2":"0.09","f0":"0","f1":"0.1","round1":"0.1"},{"bits":4635052718208057344,"repr":"76.06077575683594","g6":"76.0608","f2":"76.06","f0":"76","f1":"76.1","round1":"76.1"},{"bits":4616974221606649856,"repr":"4.696867942810059","g6":"4.69687","f2":"4.70","f0":"5","f1":"4.7","round1":"4.7"},{"bits":4781525301626667008,"repr":"470562537472.0","g6":"4.70563e+11","f2":"470562537472.00","f0":"470562537472","f1":"470562537472.0","round1":"470562537472.0"},{"bits":4693946794326255206,"repr":"663518.7","g6":"663519","f2":"663518.70","f0":"663519","f1":"663518.7","round1":"663518.7"},{"bits":4580345353768796160,"repr":"0.016265226528048515","g6":"0.0162652","f2":"0.02","f0":"0","f1":"0.0","round1":"0.0"},{"bits":14052593422278721426,"repr":"-733273063768050.2","g6":"-7.33273e+14","f2":"-733273063768050.25","f0":"-733273063768050","f1":"-733273063768050.2","round1":"-733273063768050.2"},{"bits":4563387394270691328,"repr":"0.0012456553522497416","g6":"0.00124566","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13909281605785211586,"repr":"-194109.62973751692","g6":"-194110","f2":"-194109.63","f0":"-194110","f1":"-194109.6","round1":"-194109.6"},{"bits":4472279295581964562,"repr":"9.736877883734532e-10","g6":"9.73688e-10","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4604813187064266752,"repr":"0.7369624376296997","g6":"0.736962","f2":"0.74","f0":"1","f1":"0.7","round1":"0.7"},{"bits":4656203843539828736,"repr":"1930.1815185546875","g6":"1930.18","f2":"1930.18","f0":"1930","f1":"1930.2","round1":"1930.2"},{"bits":4615055854062796800,"repr":"3.4965076446533203","g6":"3.49651","f2":"3.50","f0":"3","f1":"3.5","round1":"3.5"},{"bits":4646068106180738743,"repr":"418.39541547277935","g6":"418.395","f2":"418.40","f0":"418","f1":"418.4","round1":"418.4"},{"bits":4788362359670308864,"repr":"1352430518272.0","g6":"1.35243e+12","f2":"1352430518272.00","f0":"1352430518272","f1":"1352430518272.0","round1":"1352430518272.0"},{"bits":4646135652109963722,"repr":"422.2349570200573","g6":"422.235","f2":"422.23","f0":"422","f1":"422.2","round1":"422.2"},{"bits":4566026981095697719,"repr":"0.0018180245062769504","g6":"0.00181802","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13796266047925839461,"repr":"-0.005415797079359662","g6":"-0.0054158","f2":"-0.01","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13934292557643807025,"repr":"-8677896.460262867","g6":"-8.6779e+06","f2":"-8677896.46","f0":"-8677896","f1":"-8677896.5","round1":"-8677896.5"},{"bits":13729252120060755968,"repr":"-1.795724529074505e-07","g6":"-1.79572e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4630632490689571613,"repr":"38.62278234174867","g6":"38.6228","f2":"38.62","f0":"39","f1":"38.6","round1":"38.6"},{"bits":13986941749348532224,"repr":"-29634498560.0","g6":"-2.96345e+10","f2":"-29634498560.00","f0":"-29634498560","f1":"-29634498560.0","round1":"-29634498560.0"},{"bits":13929225132716326912,"repr":"-4004074.5","g6":"-4.00407e+06","f2":"-4004074.50","f0":"-4004074","f1":"-4004074.5","round1":"-4004074.5"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4670675394707399958,"repr":"17994.10075024244","g6":"17994.1","f2":"17994.10","f0":"17994","f1":"17994.1","round1":"17994.1"},{"bits":4633650909065248768,"repr":"60.0699348449707","g6":"60.0699","f2":"60.07","f0":"60","f1":"60.1","round1":"60.1"},{"bits":4694476875753953690,"repr":"725228.3","g6":"725228","f2":"725228.30","f0":"725228","f1":"725228.3","round1":"725228.3"},{"bits":14017682910332379667,"repr":"-3410385538460.2593","g6":"-3.41039e+12","f2":"-3410385538460.26","f0":"-3410385538460","f1":"-3410385538460.3","round1":"-3410385538460.3"},{"bits":4810356391124402176,"repr":"39184286875648.0","g6":"3.91843e+13","f2":"39184286875648.00","f0":"39184286875648","f1":"39184286875648.0","round1":"39184286875648.0"},{"bits":13873165794713534464,"repr":"-748.348388671875","g6":"-748.348","f2":"-748.35","f0":"-748","f1":"-748.3","round1":"-748.3"},{"bits":13983153753012830208,"repr":"-16182154240.0","g6":"-1.61822e+10","f2":"-16182154240.00","f0":"-16182154240","f1":"-16182154240.0","round1":"-16182154240.0"},{"bits":4572624220730687488,"repr":"0.005181791260838509","g6":"0.00518179","f2":"0.01","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13982761854426939392,"repr":"-15434667008.0","g6":"-1.54347e+10","f2":"-15434667008.00","f0":"-15434667008","f1":"-15434667008.0","round1":"-15434667008.0"},{"bits":13985808658592694272,"repr":"-25312100352.0","g6":"-2.53121e+10","f2":"-25312100352.00","f0":"-25312100352","f1":"-25312100352.0","round1":"-25312100352.0"},{"bits":4645629057640776384,"repr":"393.43839541547277","g6":"393.438","f2":"393.44","f0":"393","f1":"393.4","round1":"393.4"},{"bits":4596566832445526466,"repr":"0.20535829023368818","g6":"0.205358","f2":"0.21","f0":"0","f1":"0.2","round1":"0.2"},{"bits":13781391654550241280,"repr":"-0.0005291334236972034","g6":"-0.000529133","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":14051145694184078364,"repr":"-557628502679489.75","g6":"-5.57629e+14","f2":"-557628502679489.75","f0":"-557628502679490","f1":"-557628502679489.8","round1":"-557628502679489.8"},{"bits":14075258791952121856,"repr":"-2.405422418676941e+16","g6":"-2.40542e+16","f2":"-24054224186769408.00","f0":"-24054224186769408","f1":"-24054224186769408.0","round1":"-2.405422418676941e+16"},{"bits":4636050534137069568,"repr":"90.24059295654297","g6":"90.2406","f2":"90.24","f0":"90","f1":"90.2","round1":"90.2"},{"bits":13994895316964732498,"repr":"-102460851317.93094","g6":"-1.02461e+11","f2":"-102460851317.93","f0":"-102460851318","f1":"-102460851317.9","round1":"-102460851317.9"},{"bits":4823231306350320564,"repr":"277603271601885.62","g6":"2.77603e+14","f2":"277603271601885.62","f0":"277603271601886","f1":"277603271601885.6","round1":"277603271601885.6"},{"bits":13811251356296951638,"repr":"-0.05355784153935754","g6":"-0.0535578","f2":"-0.05","f0":"-0","f1":"-0.1","round1":"-0.1"},{"bits":4809246794594711530,"repr":"32849968038135.914","g6":"3.285e+13","f2":"32849968038135.91","f0":"32849968038136","f1":"32849968038135.9","round1":"32849968038135.9"},{"bits":13885329987306134254,"repr":"-4762.055823690009","g6":"-4762.06","f2":"-4762.06","f0":"-4762","f1":"-4762.1","round1":"-4762.1"},{"bits":4646541473770025894,"repr":"445.3032476257598","g6":"445.303","f2":"445.30","f0":"445","f1":"445.3","round1":"445.3"},{"bits":4595181131271241728,"repr":"0.16689735651016235","g6":"0.166897","f2":"0.17","f0":"0","f1":"0.2","round1":"0.2"},{"bits":4616077104943988736,"repr":"3.9500341415405273","g6":"3.95003","f2":"3.95","f0":"4","f1":"4.0","round1":"4.0"},{"bits":4654279376068673536,"repr":"1492.6082763671875","g6":"1492.61","f2":"1492.61","f0":"1493","f1":"1492.6","round1":"1492.6"},{"bits":4755844674594377040,"repr":"8672843396.194","g6":"8.67284e+09","f2":"8672843396.19","f0":"8672843396","f1":"8672843396.2","round1":"8672843396.2"},{"bits":13902854536714005854,"repr":"-69064.65057771417","g6":"-69064.7","f2":"-69064.65","f0":"-69065","f1":"-69064.7","round1":"-69064.7"},{"bits":14057813238238674944,"repr":"-1645600210681856.0","g6":"-1.6456e+15","f2":"-1645600210681856.00","f0":"-1645600210681856","f1":"-1645600210681856.0","round1":"-1645600210681856.0"},{"bits":4623029315892674560,"repr":"12.149744033813477","g6":"12.1497","f2":"12.15","f0":"12","f1":"12.1","round1":"12.1"},{"bits":13910465086500560464,"repr":"-228553.4518258446","g6":"-228553","f2":"-228553.45","f0":"-228553","f1":"-228553.5","round1":"-228553.5"},{"bits":13760415611412807680,"repr":"-2.1759766241302714e-05","g6":"-2.17598e-05","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4621105816399773696,"repr":"8.732922554016113","g6":"8.73292","f2":"8.73","f0":"9","f1":"8.7","round1":"8.7"},{"bits":4701848103282540544,"repr":"2139104.5","g6":"2.1391e+06","f2":"2139104.50","f0":"2139104","f1":"2139104.5","round1":"2139104.5"},{"bits":4704379969323663360,"repr":"3318096.5","g6":"3.3181e+06","f2":"3318096.50","f0":"3318096","f1":"3318096.5","round1":"3318096.5"},{"bits":4805508494570553344,"repr":"18247233568768.0","g6":"1.82472e+13","f2":"18247233568768.00","f0":"18247233568768","f1":"18247233568768.0","round1":"18247233568768.0"},{"bits":4622836160475955200,"repr":"11.806631088256836","g6":"11.8066","f2":"11.81","f0":"12","f1":"11.8","round1":"11.8"},{"bits":13943555120911351808,"repr":"-36614196.0","g6":"-3.66142e+07","f2":"-36614196.00","f0":"-36614196","f1":"-36614196.0","round1":"-36614196.0"},{"bits":4722127179330300524,"repr":"51098834.52498326","g6":"5.10988e+07","f2":"51098834.52","f0":"51098835","f1":"51098834.5","round1":"51098834.5"},{"bits":4787396987685555851,"repr":"1116743998556.909","g6":"1.11674e+12","f2":"1116743998556.91","f0":"1116743998557","f1":"1116743998556.9","round1":"1116743998556.9"},{"bits":4635552961638957056,"repr":"83.16966247558594","g6":"83.1697","f2":"83.17","f0":"83","f1":"83.2","round1":"83.2"},{"bits":13710105171961315328,"repr":"-9.349632179578293e-09","g6":"-9.34963e-09","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4619634421807448064,"repr":"7.059600353240967","g6":"7.0596","f2":"7.06","f0":"7","f1":"7.1","round1":"7.1"},{"bits":4483927299007184896,"repr":"6.079173164863505e-09","g6":"6.07917e-09","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4623986388151304192,"repr":"13.849845886230469","g6":"13.8498","f2":"13.85","f0":"14","f1":"13.8","round1":"13.8"},{"bits":4607430262035316736,"repr":"1.0550322532653809","g6":"1.05503","f2":"1.06","f0":"1","f1":"1.1","round1":"1.1"},{"bits":4635606544577200128,"repr":"83.93112182617188","g6":"83.9311","f2":"83.93","f0":"84","f1":"83.9","round1":"83.9"},{"bits":4636267514274250752,"repr":"93.32406616210938","g6":"93.3241","f2":"93.32","f0":"93","f1":"93.3","round1":"93.3"},{"bits":4538938478182270067,"repr":"2.8179949447708048e-05","g6":"2.81799e-05","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4602334997376925696,"repr":"0.48091405630111694","g6":"0.480914","f2":"0.48","f0":"0","f1":"0.5","round1":"0.5"},{"bits":4645493965782326428,"repr":"385.75931232091693","g6":"385.759","f2":"385.76","f0":"386","f1":"385.8","round1":"385.8"},{"bits":4568156631719739392,"repr":"0.0026065127458423376","g6":"0.00260651","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13703036593705582592,"repr":"-3.139202897628479e-09","g6":"-3.1392e-09","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13979572167477312365,"repr":"-9350821965.529016","g6":"-9.35082e+09","f2":"-9350821965.53","f0":"-9350821966","f1":"-9350821965.5","round1":"-9350821965.5"},{"bits":13925514262390098996,"repr":"-2276065.8468566183","g6":"-2.27607e+06","f2":"-2276065.85","f0":"-2276066","f1":"-2276065.8","round1":"-2276065.8"},{"bits":4449136329532547675,"repr":"2.7746406684432475e-11","g6":"2.77464e-11","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13874527473559364165,"repr":"-903.1533506466736","g6":"-903.153","f2":"-903.15","f0":"-903","f1":"-903.2","round1":"-903.2"},{"bits":4604272825417596928,"repr":"0.6769702434539795","g6":"0.67697","f2":"0.68","f0":"1","f1":"0.7","round1":"0.7"},{"bits":4611170038773186560,"repr":"1.8854295015335083","g6":"1.88543","f2":"1.89","f0":"2","f1":"1.9","round1":"1.9"},{"bits":4875708614647372501,"repr":"9.366294348628896e+17","g6":"9.36629e+17","f2":"936629434862889600.00","f0":"936629434862889600","f1":"936629434862889600.0","round1":"9.366294348628896e+17"},{"bits":4495940862701838125,"repr":"3.872551396292668e-08","g6":"3.87255e-08","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4646844884366825994,"repr":"462.55014326647563","g6":"462.55","f2":"462.55","f0":"463","f1":"462.6","round1":"462.6"},{"bits":13969101441969684480,"repr":"-1893662720.0","g6":"-1.89366e+09","f2":"-1893662720.00","f0":"-1893662720","f1":"-1893662720.0","round1":"-1893662720.0"},{"bits":4433134466994927767,"repr":"2.4621682376673215e-12","g6":"2.46217e-12","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13992045141644092339,"repr":"-63845052022.569725","g6":"-6.38451e+10","f2":"-63845052022.57","f0":"-63845052023","f1":"-63845052022.6","round1":"-63845052022.6"},{"bits":13740252315116630610,"repr":"-9.293064500422621e-07","g6":"-9.29306e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13959221024860930048,"repr":"-421367840.0","g6":"-4.21368e+08","f2":"-421367840.00","f0":"-421367840","f1":"-421367840.0","round1":"-421367840.0"},{"bits":4703437600885571584,"repr":"2879272.0","g6":"2.87927e+06","f2":"2879272.00","f0":"2879272","f1":"2879272.0","round1":"2879272.0"},{"bits":13793965463367057408,"repr":"-0.003663304029032588","g6":"-0.0036633","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4645561511711551406,"repr":"389.59885386819485","g6":"389.599","f2":"389.60","f0":"390","f1":"389.6","round1":"389.6"},{"bits":13658946648232343675,"repr":"-3.447734705025753e-12","g6":"-3.44773e-12","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":14043108677355831296,"repr":"-168394963812352.0","g6":"-1.68395e+14","f2":"-168394963812352.00","f0":"-168394963812352","f1":"-168394963812352.0","round1":"-168394963812352.0"},{"bits":4623667801435930624,"repr":"13.28392219543457","g6":"13.2839","f2":"13.28","f0":"13","f1":"13.3","round1":"13.3"},{"bits":13787890749670424576,"repr":"-0.0014909709570929408","g6":"-0.00149097","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13935670297862309975,"repr":"-11244137.595157785","g6":"-1.12441e+07","f2":"-11244137.60","f0":"-11244138","f1":"-11244137.6","round1":"-11244137.6"},{"bits":4813386438475251712,"repr":"62856531804160.0","g6":"6.28565e+13","f2":"62856531804160.00","f0":"62856531804160","f1":"62856531804160.0","round1":"62856531804160.0"},{"bits":13736685944858097924,"repr":"-5.517023111566344e-07","g6":"-5.51702e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4554928935077490814,"repr":"0.00034116109640503617","g6":"0.000341161","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4609827209103147612,"repr":"1.5872614179681","g6":"1.58726","f2":"1.59","f0":"2","f1":"1.6","round1":"1.6"},{"bits":14050439360285769728,"repr":"-513482634035200.0","g6":"-5.13483e+14","f2":"-513482634035200.00","f0":"-513482634035200","f1":"-513482634035200.0","round1":"-513482634035200.0"},{"bits":13737969206085812224,"repr":"-6.875728786326363e-07","g6":"-6.87573e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4645595284676163895,"repr":"391.5186246418338","g6":"391.519","f2":"391.52","f0":"392","f1":"391.5","round1":"391.5"},{"bits":4645966787286901276,"repr":"412.63610315186247","g6":"412.636","f2":"412.64","f0":"413","f1":"412.6","round1":"412.6"},{"bits":4445474221783085282,"repr":"1.5913498358512585e-11","g6":"1.59135e-11","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4621873992775499776,"repr":"10.097477912902832","g6":"10.0975","f2":"10.10","f0":"10","f1":"10.1","round1":"10.1"},{"bits":4618280397397032960,"repr":"5.856985092163086","g6":"5.85699","f2":"5.86","f0":"6","f1":"5.9","round1":"5.9"},{"bits":13767772335803203584,"repr":"-6.467095954576507e-05","g6":"-6.4671e-05","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4722477458807324672,"repr":"53708620.0","g6":"5.37086e+07","f2":"53708620.00","f0":"53708620","f1":"53708620.0","round1":"53708620.0"},{"bits":4796255578834390136,"repr":"4359948700953.5586","g6":"4.35995e+12","f2":"4359948700953.56","f0":"4359948700954","f1":"4359948700953.6","round1":"4359948700953.6"},{"bits":4436003201237702441,"repr":"3.620840770963318e-12","g6":"3.62084e-12","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4869932072572821353,"repr":"3.868464008118831e+17","g6":"3.86846e+17","f2":"386846400811883072.00","f0":"386846400811883072","f1":"386846400811883072.0","round1":"3.868464008118831e+17"},{"bits":4741989539793338368,"repr":"1037875584.0","g6":"1.03788e+09","f2":"1037875584.00","f0":"1037875584","f1":"1037875584.0","round1":"1037875584.0"},{"bits":4620441136582977393,"repr":"7.7761070077193475","g6":"7.77611","f2":"7.78","f0":"8","f1":"7.8","round1":"7.8"},{"bits":13652003609758400512,"repr":"-1.231226600707791e-12","g6":"-1.23123e-12","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13713160372788133888,"repr":"-1.440403796237888e-08","g6":"-1.4404e-08","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13975925717455750983,"repr":"-5492852547.142402","g6":"-5.49285e+09","f2":"-5492852547.14","f0":"-5492852547","f1":"-5492852547.1","round1":"-5492852547.1"},{"bits":13822642593856487424,"repr":"-0.31080344319343567","g6":"-0.310803","f2":"-0.31","f0":"-0","f1":"-0.3","round1":"-0.3"},{"bits":4618228820208517120,"repr":"5.811175346374512","g6":"5.81118","f2":"5.81","f0":"6","f1":"5.8","round1":"5.8"},{"bits":13723671318476357632,"repr":"-7.55295772592035e-08","g6":"-7.55296e-08","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":14025758537293634399,"repr":"-11822065018125.686","g6":"-1.18221e+13","f2":"-11822065018125.69","f0":"-11822065018126","f1":"-11822065018125.7","round1":"-11822065018125.7"},{"bits":13997120338942274308,"repr":"-136411992332.66803","g6":"-1.36412e+11","f2":"-136411992332.67","f0":"-136411992333","f1":"-136411992332.7","round1":"-136411992332.7"},{"bits":4627527077210920802,"repr":"24.27874622694015","g6":"24.2787","f2":"24.28","f0":"24","f1":"24.3","round1":"24.3"},{"bits":4436451681413871560,"repr":"3.965982136047288e-12","g6":"3.96598e-12","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13993260653501379585,"repr":"-77517866342.45314","g6":"-7.75179e+10","f2":"-77517866342.45","f0":"-77517866342","f1":"-77517866342.5","round1":"-77517866342.5"},{"bits":14032886246952998211,"repr":"-33894559848725.26","g6":"-3.38946e+13","f2":"-33894559848725.26","f0":"-33894559848725","f1":"-33894559848725.3","round1":"-33894559848725.3"},{"bits":14051370047362437449,"repr":"-580351199232553.1","g6":"-5.80351e+14","f2":"-580351199232553.12","f0":"-580351199232553","f1":"-580351199232553.1","round1":"-580351199232553.1"},{"bits":13788163027734201216,"repr":"-0.0015500118507462968","g6":"-0.00155001","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13988463391300124672,"repr":"-36518465536.0","g6":"-3.65185e+10","f2":"-36518465536.00","f0":"-36518465536","f1":"-36518465536.0","round1":"-36518465536.0"},{"bits":13981929615768487826,"repr":"-13847297740.628696","g6":"-1.38473e+10","f2":"-13847297740.63","f0":"-13847297741","f1":"-13847297740.6","round1":"-13847297740.6"},{"bits":4635433725293756416,"repr":"81.47521209716797","g6":"81.4752","f2":"81.48","f0":"81","f1":"81.5","round1":"81.5"},{"bits":13805146629095970596,"repr":"-0.021223893589726775","g6":"-0.0212239","f2":"-0.02","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4616325629151586562,"repr":"4.120802121042518","g6":"4.1208","f2":"4.12","f0":"4","f1":"4.1","round1":"4.1"},{"bits":4716914032562677828,"repr":"22906148.184608713","g6":"2.29061e+07","f2":"22906148.18","f0":"22906148","f1":"22906148.2","round1":"22906148.2"},{"bits":4817266238486081276,"repr":"115966194599867.94","g6":"1.15966e+14","f2":"115966194599867.94","f0":"115966194599868","f1":"115966194599867.9","round1":"115966194599867.9"},{"bits":4466791900375259296,"repr":"4.2539155137591444e-10","g6":"4.25392e-10","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4850966396367605304,"repr":"2.037278926780643e+16","g6":"2.03728e+16","f2":"20372789267806432.00","f0":"20372789267806432","f1":"20372789267806432.0","round1":"2.037278926780643e+16"},{"bits":4454899479606198272,"repr":"6.905727378825333e-11","g6":"6.90573e-11","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4711627153257529344,"repr":"9994102.0","g6":"9.9941e+06","f2":"9994102.00","f0":"9994102","f1":"9994102.0","round1":"9994102.0"},{"bits":4571462986664771584,"repr":"0.00417458126321435","g6":"0.00417458","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13958264954940293120,"repr":"-364381632.0","g6":"-3.64382e+08","f2":"-364381632.00","f0":"-364381632","f1":"-364381632.0","round1":"-364381632.0"},{"bits":13713254319858022633,"repr":"-1.4559460352015148e-08","g6":"-1.45595e-08","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13853242479481968127,"repr":"-33.208105191512","g6":"-33.2081","f2":"-33.21","f0":"-33","f1":"-33.2","round1":"-33.2"},{"bits":14074696412155609088,"repr":"-2.1804705000718336e+16","g6":"-2.18047e+16","f2":"-21804705000718336.00","f0":"-21804705000718336","f1":"-21804705000718336.0","round1":"-2.1804705000718336e+16"},{"bits":14066681439466815488,"repr":"-6443402816126976.0","g6":"-6.4434e+15","f2":"-6443402816126976.00","f0":"-6443402816126976","f1":"-6443402816126976.0","round1":"-6443402816126976.0"},{"bits":14082799426842132480,"repr":"-7.275186691139174e+16","g6":"-7.27519e+16","f2":"-72751866911391744.00","f0":"-72751866911391744","f1":"-72751866911391744.0","round1":"-7.275186691139174e+16"},{"bits":4847725026311036064,"repr":"1.2710853775505728e+16","g6":"1.27109e+16","f2":"12710853775505728.00","f0":"12710853775505728","f1":"12710853775505728.0","round1":"1.2710853775505728e+16"},{"bits":13979444718020131148,"repr":"-9107731417.621727","g6":"-9.10773e+09","f2":"-9107731417.62","f0":"-9107731418","f1":"-9107731417.6","round1":"-9107731417.6"},{"bits":4790831001108480000,"repr":"1955126181888.0","g6":"1.95513e+12","f2":"1955126181888.00","f0":"1955126181888","f1":"1955126181888.0","round1":"1955126181888.0"},{"bits":4692769200622534656,"repr":"526428.75","g6":"526429","f2":"526428.75","f0":"526429","f1":"526428.8","round1":"526428.8"},{"bits":4712431339175936000,"repr":"11492015.0","g6":"1.1492e+07","f2":"11492015.00","f0":"11492015","f1":"11492015.0","round1":"11492015.0"},{"bits":13848899683683926016,"repr":"-17.175342559814453","g6":"-17.1753","f2":"-17.18","f0":"-17","f1":"-17.2","round1":"-17.2"},{"bits":4856959150665498624,"repr":"5.265881589979546e+16","g6":"5.26588e+16","f2":"52658815899795456.00","f0":"52658815899795456","f1":"52658815899795456.0","round1":"5.265881589979546e+16"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4572474464884752384,"repr":"0.005051898770034313","g6":"0.0050519","f2":"0.01","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4510292231970297446,"repr":"3.5430353743609413e-07","g6":"3.54304e-07","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13769550832368353280,"repr":"-8.877408254193142e-05","g6":"-8.87741e-05","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4693434581049635222,"repr":"603889.2265582557","g6":"603889","f2":"603889.23","f0":"603889","f1":"603889.2","round1":"603889.2"},{"bits":4820334741540569088,"repr":"187085621297152.0","g6":"1.87086e+14","f2":"187085621297152.00","f0":"187085621297152","f1":"187085621297152.0","round1":"187085621297152.0"},{"bits":4810280116985796025,"repr":"38588395167787.445","g6":"3.85884e+13","f2":"38588395167787.45","f0":"38588395167787","f1":"38588395167787.4","round1":"38588395167787.4"},{"bits":4599955175862435840,"repr":"0.3488074243068695","g6":"0.348807","f2":"0.35","f0":"0","f1":"0.3","round1":"0.3"},{"bits":4611240138726118512,"repr":"1.9009948178875469","g6":"1.90099","f2":"1.90","f0":"2","f1":"1.9","round1":"1.9"},{"bits":4525103566012022784,"repr":"3.3852263641165337e-06","g6":"3.38523e-06","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4448954183026961893,"repr":"2.715785958261669e-11","g6":"2.71579e-11","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13994895316889894912,"repr":"-102460850176.0","g6":"-1.02461e+11","f2":"-102460850176.00","f0":"-102460850176","f1":"-102460850176.0","round1":"-102460850176.0"},{"bits":4603726770791776256,"repr":"0.616346001625061","g6":"0.616346","f2":"0.62","f0":"1","f1":"0.6","round1":"0.6"},{"bits":13892581129950593024,"repr":"-14521.86328125","g6":"-14521.9","f2":"-14521.86","f0":"-14522","f1":"-14521.9","round1":"-14521.9"},{"bits":4445870114025242624,"repr":"1.71926951841872e-11","g6":"1.71927e-11","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4676123469119246828,"repr":"42860.16","g6":"42860.2","f2":"42860.16","f0":"42860","f1":"42860.2","round1":"42860.2"},{"bits":4567024312984272896,"repr":"0.002115447772666812","g6":"0.00211545","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4580983063533584384,"repr":"0.018477726727724075","g6":"0.0184777","f2":"0.02","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4602797813389066240,"repr":"0.5132110118865967","g6":"0.513211","f2":"0.51","f0":"1","f1":"0.5","round1":"0.5"},{"bits":4635442236845195264,"repr":"81.5961685180664","g6":"81.5962","f2":"81.60","f0":"82","f1":"81.6","round1":"81.6"},{"bits":13985520308287513622,"repr":"-24212131231.28524","g6":"-2.42121e+10","f2":"-24212131231.29","f0":"-24212131231","f1":"-24212131231.3","round1":"-24212131231.3"},{"bits":4518367591841449380,"repr":"1.219889484882109e-06","g6":"1.21989e-06","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4643822207665963008,"repr":"290.7308654785156","g6":"290.731","f2":"290.73","f0":"291","f1":"290.7","round1":"290.7"},{"bits":13928448844699226684,"repr":"-3642587.2226355355","g6":"-3.64259e+06","f2":"-3642587.22","f0":"-3642587","f1":"-3642587.2","round1":"-3642587.2"},{"bits":13823908395648046428,"repr":"-0.38106955787346464","g6":"-0.38107","f2":"-0.38","f0":"-0","f1":"-0.4","round1":"-0.4"},{"bits":4645831695428451319,"repr":"404.9570200573066","g6":"404.957","f2":"404.96","f0":"405","f1":"405.0","round1":"405.0"},{"bits":4616617842344869114,"repr":"4.380339573267742","g6":"4.38034","f2":"4.38","f0":"4","f1":"4.4","round1":"4.4"},{"bits":4639850151068447396,"repr":"160.4727942835499","g6":"160.473","f2":"160.47","f0":"160","f1":"160.5","round1":"160.5"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13745926998813744128,"repr":"-2.3058505628950447e-06","g6":"-2.30585e-06","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4662295388139552768,"repr":"5068.95361328125","g6":"5068.95","f2":"5068.95","f0":"5069","f1":"5069.0","round1":"5069.0"},{"bits":4665976654537949184,"repr":"8642.091796875","g6":"8642.09","f2":"8642.09","f0":"8642","f1":"8642.1","round1":"8642.1"},{"bits":13679829341654513233,"repr":"-8.919169250453857e-11","g6":"-8.91917e-11","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4536914943508742144,"repr":"2.1323947294149548e-05","g6":"2.13239e-05","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4619792280109187072,"repr":"7.1998066902160645","g6":"7.19981","f2":"7.20","f0":"7","f1":"7.2","round1":"7.2"},{"bits":4837185792323354624,"repr":"2411696077406208.0","g6":"2.4117e+15","f2":"2411696077406208.00","f0":"2411696077406208","f1":"2411696077406208.0","round1":"2411696077406208.0"},{"bits":4625231158257385472,"repr":"16.12200355529785","g6":"16.122","f2":"16.12","f0":"16","f1":"16.1","round1":"16.1"},{"bits":4647182614012950886,"repr":"481.74785100286533","g6":"481.748","f2":"481.75","f0":"482","f1":"481.7","round1":"481.7"},{"bits":4601934896477241344,"repr":"0.45870399475097656","g6":"0.458704","f2":"0.46","f0":"0","f1":"0.5","round1":"0.5"},{"bits":4596430965680635904,"repr":"0.2015872299671173","g6":"0.201587","f2":"0.20","f0":"0","f1":"0.2","round1":"0.2"},{"bits":4648938656176799744,"repr":"651.1345825195312","g6":"651.135","f2":"651.13","f0":"651","f1":"651.1","round1":"651.1"},{"bits":13991288225113571328,"repr":"-58070237184.0","g6":"-5.80702e+10","f2":"-58070237184.00","f0":"-58070237184","f1":"-58070237184.0","round1":"-58070237184.0"},{"bits":4594856626090934272,"repr":"0.15789052844047546","g6":"0.157891","f2":"0.16","f0":"0","f1":"0.2","round1":"0.2"},{"bits":4647148841048338397,"repr":"479.8280802292264","g6":"479.828","f2":"479.83","f0":"480","f1":"479.8","round1":"479.8"},{"bits":4645460192817713938,"repr":"383.8395415472779","g6":"383.84","f2":"383.84","f0":"384","f1":"383.8","round1":"383.8"},{"bits":4836251290654736384,"repr":"2098122528391168.0","g6":"2.09812e+15","f2":"2098122528391168.00","f0":"2098122528391168","f1":"2098122528391168.0","round1":"2098122528391168.0"},{"bits":13802933827899612333,"repr":"-0.014585848611871144","g6":"-0.0145858","f2":"-0.01","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4691839000900534272,"repr":"471213.625","g6":"471214","f2":"471213.62","f0":"471214","f1":"471213.6","round1":"471213.6"},{"bits":13653849621061959680,"repr":"-1.6040256145891107e-12","g6":"-1.60403e-12","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4573883143827750912,"repr":"0.006273732986301184","g6":"0.00627373","f2":"0.01","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4636318358633971712,"repr":"94.0466079711914","g6":"94.0466","f2":"94.05","f0":"94","f1":"94.0","round1":"94.0"},{"bits":4841950098777798393,"repr":"5084098981885689.0","g6":"5.0841e+15","f2":"5084098981885689.00","f0":"5084098981885689","f1":"5084098981885689.0","round1":"5084098981885689.0"},{"bits":4875708614574080000,"repr":"9.366294254814495e+17","g6":"9.36629e+17","f2":"936629425481449472.00","f0":"936629425481449472","f1":"936629425481449472.0","round1":"9.366294254814495e+17"},{"bits":4807769727654989506,"repr":"27080175304846.758","g6":"2.70802e+13","f2":"27080175304846.76","f0":"27080175304847","f1":"27080175304846.8","round1":"27080175304846.8"},{"bits":14017183778015805440,"repr":"-3166668587008.0","g6":"-3.16667e+12","f2":"-3166668587008.00","f0":"-3166668587008","f1":"-3166668587008.0","round1":"-3166668587008.0"},{"bits":13679759251545952088,"repr":"-8.828579908370238e-11","g6":"-8.82858e-11","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4645561511711551406,"repr":"389.59885386819485","g6":"389.599","f2":"389.60","f0":"390","f1":"389.6","round1":"389.6"},{"bits":4662352747887352349,"repr":"5121.122","g6":"5121.12","f2":"5121.12","f0":"5121","f1":"5121.1","round1":"5121.1"},{"bits":4747052825198985216,"repr":"2270897664.0","g6":"2.2709e+09","f2":"2270897664.00","f0":"2270897664","f1":"2270897664.0","round1":"2270897664.0"},{"bits":13795874342062681045,"repr":"-0.005076046401110331","g6":"-0.00507605","f2":"-0.01","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4563382621086436589,"repr":"0.0012446203329020092","g6":"0.00124462","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13670269159701741568,"repr":"-2.0511139661727462e-11","g6":"-2.05111e-11","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4647047522154500929,"repr":"474.06876790830944","g6":"474.069","f2":"474.07","f0":"474","f1":"474.1","round1":"474.1"},{"bits":13777292056328337099,"repr":"-0.0002864676719232905","g6":"-0.000286468","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4554394515510657024,"repr":"0.0003121901536360383","g6":"0.00031219","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4834145057483259904,"repr":"1571564235522048.0","g6":"1.57156e+15","f2":"1571564235522048.00","f0":"1571564235522048","f1":"1571564235522048.0","round1":"1571564235522048.0"},{"bits":4563150710062671687,"repr":"0.0011943326457441604","g6":"0.00119433","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4816455830634771330,"repr":"103303571923150.03","g6":"1.03304e+14","f2":"103303571923150.03","f0":"103303571923150","f1":"103303571923150.0","round1":"103303571923150.0"},{"bits":13826778010096762880,"repr":"-0.5807303190231323","g6":"-0.58073","f2":"-0.58","f0":"-1","f1":"-0.6","round1":"-0.6"},{"bits":4836251290872413121,"repr":"2098122582810352.2","g6":"2.09812e+15","f2":"2098122582810352.25","f0":"2098122582810352","f1":"2098122582810352.2","round1":"2098122582810352.2"},{"bits":14078113813480079360,"repr":"-3.5474310298599424e+16","g6":"-3.54743e+16","f2":"-35474310298599424.00","f0":"-35474310298599424","f1":"-35474310298599424.0","round1":"-3.5474310298599424e+16"},{"bits":4647148841048338397,"repr":"479.8280802292264","g6":"479.828","f2":"479.83","f0":"480","f1":"479.8","round1":"479.8"},{"bits":4694987761254819430,"repr":"784703.2","g6":"784703","f2":"784703.20","f0":"784703","f1":"784703.2","round1":"784703.2"},{"bits":4611024998801342464,"repr":"1.8532241582870483","g6":"1.85322","f2":"1.85","f0":"2","f1":"1.9","round1":"1.9"},{"bits":4769975301724589799,"repr":"78840575662.30821","g6":"7.88406e+10","f2":"78840575662.31","f0":"78840575662","f1":"78840575662.3","round1":"78840575662.3"},{"bits":4545335589280415744,"repr":"7.734650716884062e-05","g6":"7.73465e-05","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13949469846002466816,"repr":"-94255800.0","g6":"-9.42558e+07","f2":"-94255800.00","f0":"-94255800","f1":"-94255800.0","round1":"-94255800.0"},{"bits":4477538882336589862,"repr":"2.2600445242493226e-09","g6":"2.26004e-09","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4710528422240059392,"repr":"8168082.0","g6":"8.16808e+06","f2":"8168082.00","f0":"8168082","f1":"8168082.0","round1":"8168082.0"},{"bits":4822966685289569653,"repr":"269333863453419.66","g6":"2.69334e+14","f2":"269333863453419.66","f0":"269333863453420","f1":"269333863453419.7","round1":"269333863453419.7"},{"bits":4694784174651028275,"repr":"761002.6","g6":"761003","f2":"761002.60","f0":"761003","f1":"761002.6","round1":"761002.6"},{"bits":4872686946020912671,"repr":"5.631583014897274e+17","g6":"5.63158e+17","f2":"563158301489727424.00","f0":"563158301489727424","f1":"563158301489727424.0","round1":"5.631583014897274e+17"},{"bits":13687669688256651324,"repr":"-2.964419017719547e-10","g6":"-2.96442e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13965598172357539957,"repr":"-1066079990.4314104","g6":"-1.06608e+09","f2":"-1066079990.43","f0":"-1066079990","f1":"-1066079990.4","round1":"-1066079990.4"},{"bits":14023263298474690049,"repr":"-7872322361041.501","g6":"-7.87232e+12","f2":"-7872322361041.50","f0":"-7872322361042","f1":"-7872322361041.5","round1":"-7872322361041.5"},{"bits":4618990056453963776,"repr":"6.487288951873779","g6":"6.48729","f2":"6.49","f0":"6","f1":"6.5","round1":"6.5"},{"bits":13665127808330071381,"repr":"-9.225226318155566e-12","g6":"-9.22523e-12","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13754210511494114832,"repr":"-7.997429507625712e-06","g6":"-7.99743e-06","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4693726688419250176,"repr":"637895.0","g6":"637895","f2":"637895.00","f0":"637895","f1":"637895.0","round1":"637895.0"},{"bits":14060419689608118272,"repr":"-2342626292400128.0","g6":"-2.34263e+15","f2":"-2342626292400128.00","f0":"-2342626292400128","f1":"-2342626292400128.0","round1":"-2342626292400128.0"},{"bits":4797525991227112675,"repr":"5562487993071.222","g6":"5.56249e+12","f2":"5562487993071.22","f0":"5562487993071","f1":"5562487993071.2","round1":"5562487993071.2"},{"bits":13736088604726263808,"repr":"-4.884564646090439e-07","g6":"-4.88456e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4479188066919271741,"repr":"2.9421312809072256e-09","g6":"2.94213e-09","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":14074459385623273760,"repr":"-2.0856598871377024e+16","g6":"-2.08566e+16","f2":"-20856598871377024.00","f0":"-20856598871377024","f1":"-20856598871377024.0","round1":"-2.0856598871377024e+16"},{"bits":13931534564011802624,"repr":"-5964670.5","g6":"-5.96467e+06","f2":"-5964670.50","f0":"-5964670","f1":"-5964670.5","round1":"-5964670.5"},{"bits":4662295388402108074,"repr":"5068.95385207391","g6":"5068.95","f2":"5068.95","f0":"5069","f1":"5069.0","round1":"5069.0"},{"bits":4784371059246436261,"repr":"738751783000.4889","g6":"7.38752e+11","f2":"738751783000.49","f0":"738751783000","f1":"738751783000.5","round1":"738751783000.5"},{"bits":4604534900563902464,"repr":"0.7060664296150208","g6":"0.706066","f2":"0.71","f0":"1","f1":"0.7","round1":"0.7"},{"bits":4868758538224140288,"repr":"3.117402024962949e+17","g6":"3.1174e+17","f2":"311740202496294912.00","f0":"311740202496294912","f1":"311740202496294912.0","round1":"3.117402024962949e+17"},{"bits":4579505801479061504,"repr":"0.014488722197711468","g6":"0.0144887","f2":"0.01","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4646743565472988527,"repr":"456.79083094555875","g6":"456.791","f2":"456.79","f0":"457","f1":"456.8","round1":"456.8"},{"bits":4623033727897829376,"repr":"12.157581329345703","g6":"12.1576","f2":"12.16","f0":"12","f1":"12.2","round1":"12.2"},{"bits":13959159081231974400,"repr":"-417675712.0","g6":"-4.17676e+08","f2":"-417675712.00","f0":"-417675712","f1":"-417675712.0","round1":"-417675712.0"},{"bits":4607409465266798592,"repr":"1.0504144430160522","g6":"1.05041","f2":"1.05","f0":"1","f1":"1.1","round1":"1.1"},{"bits":4672175922758612419,"repr":"23452.99","g6":"23453","f2":"23452.99","f0":"23453","f1":"23453.0","round1":"23453.0"},{"bits":14051586623359942656,"repr":"-607423198920704.0","g6":"-6.07423e+14","f2":"-607423198920704.00","f0":"-607423198920704","f1":"-607423198920704.0","round1":"-607423198920704.0"},{"bits":13913101179094564864,"repr":"-348403.6875","g6":"-348404","f2":"-348403.69","f0":"-348404","f1":"-348403.7","round1":"-348403.7"},{"bits":4599966405054431232,"repr":"0.34943076968193054","g6":"0.349431","f2":"0.35","f0":"0","f1":"0.3","round1":"0.3"},{"bits":13779927931306377216,"repr":"-0.0004293587408028543","g6":"-0.000429359","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4652349326491852351,"repr":"1053.7658102977","g6":"1053.77","f2":"1053.77","f0":"1054","f1":"1053.8","round1":"1053.8"},{"bits":14073440397563032836,"repr":"-1.7397522569947656e+16","g6":"-1.73975e+16","f2":"-17397522569947656.00","f0":"-17397522569947656","f1":"-17397522569947656.0","round1":"-1.7397522569947656e+16"},{"bits":4497224039403618304,"repr":"4.72168650844651e-08","g6":"4.72169e-08","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4635784684251381760,"repr":"86.46263885498047","g6":"86.4626","f2":"86.46","f0":"86","f1":"86.5","round1":"86.5"},{"bits":4636088673698869804,"repr":"90.78258872818759","g6":"90.7826","f2":"90.78","f0":"91","f1":"90.8","round1":"90.8"},{"bits":14051434279571601575,"repr":"-588380225378068.9","g6":"-5.8838e+14","f2":"-588380225378068.88","f0":"-588380225378069","f1":"-588380225378068.9","round1":"-588380225378068.9"},{"bits":4504776279832133632,"repr":"1.5035502087812347e-07","g6":"1.50355e-07","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4694615112068104192,"repr":"741321.125","g6":"741321","f2":"741321.12","f0":"741321","f1":"741321.1","round1":"741321.1"},{"bits":4429362075708521539,"repr":"1.3787504673157668e-12","g6":"1.37875e-12","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13672191732018577408,"repr":"-2.6723305859843727e-11","g6":"-2.67233e-11","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4616960472342593536,"repr":"4.684656143188477","g6":"4.68466","f2":"4.68","f0":"5","f1":"4.7","round1":"4.7"},{"bits":4620869473476280320,"repr":"8.313093185424805","g6":"8.31309","f2":"8.31","f0":"8","f1":"8.3","round1":"8.3"},{"bits":4438357439435364959,"repr":"5.505441205965995e-12","g6":"5.50544e-12","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4552091516465577984,"repr":"0.00021574247512035072","g6":"0.000215742","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4721461461208006656,"repr":"46138848.0","g6":"4.61388e+07","f2":"46138848.00","f0":"46138848","f1":"46138848.0","round1":"46138848.0"},{"bits":4807416177669050272,"repr":"25699120672271.625","g6":"2.56991e+13","f2":"25699120672271.62","f0":"25699120672272","f1":"25699120672271.6","round1":"25699120672271.6"},{"bits":4515225403761098752,"repr":"7.540897968283389e-07","g6":"7.5409e-07","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13780033326208485808,"repr":"-0.0004350722098946059","g6":"-0.000435072","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13721528381518561911,"repr":"-5.338634377400118e-08","g6":"-5.33863e-08","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4646574700649926081,"repr":"447.1919770773639","g6":"447.192","f2":"447.19","f0":"447","f1":"447.2","round1":"447.2"},{"bits":14038415990309183699,"repr":"-81242990979971.3","g6":"-8.1243e+13","f2":"-81242990979971.30","f0":"-81242990979971","f1":"-81242990979971.3","round1":"-81242990979971.3"},{"bits":14021295638940990873,"repr":"-5950779847663.399","g6":"-5.95078e+12","f2":"-5950779847663.40","f0":"-5950779847663","f1":"-5950779847663.4","round1":"-5950779847663.4"},{"bits":4699169769729818624,"repr":"1494530.125","g6":"1.49453e+06","f2":"1494530.12","f0":"1494530","f1":"1494530.1","round1":"1494530.1"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13985907860092600062,"repr":"-25690524042.436516","g6":"-2.56905e+10","f2":"-25690524042.44","f0":"-25690524042","f1":"-25690524042.4","round1":"-25690524042.4"},{"bits":13915076005057265664,"repr":"-463353.6875","g6":"-463354","f2":"-463353.69","f0":"-463354","f1":"-463353.7","round1":"-463353.7"},{"bits":14027330290360254464,"repr":"-14891895226368.0","g6":"-1.48919e+13","f2":"-14891895226368.00","f0":"-14891895226368","f1":"-14891895226368.0","round1":"-14891895226368.0"},{"bits":4696825542756794368,"repr":"998649.125","g6":"998649","f2":"998649.12","f0":"998649","f1":"998649.1","round1":"998649.1"},{"bits":14017530977756716989,"repr":"-3336199710499.9673","g6":"-3.3362e+12","f2":"-3336199710499.97","f0":"-3336199710500","f1":"-3336199710500.0","round1":"-3336199710500.0"},{"bits":4481869411598204928,"repr":"4.376928597338292e-09","g6":"4.37693e-09","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4875850603711659940,"repr":"9.548040350916818e+17","g6":"9.54804e+17","f2":"954804035091681792.00","f0":"954804035091681792","f1":"954804035091681792.0","round1":"9.548040350916818e+17"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13824143863643855821,"repr":"-0.39414065739896104","g6":"-0.394141","f2":"-0.39","f0":"-0","f1":"-0.4","round1":"-0.4"},{"bits":4633294545824561396,"repr":"57.5378217253473","g6":"57.5378","f2":"57.54","f0":"58","f1":"57.5","round1":"57.5"},{"bits":4583327536393486336,"repr":"0.026611750945448875","g6":"0.0266118","f2":"0.03","f0":"0","f1":"0.0","round1":"0.0"},{"bits":14015962069199749120,"repr":"-2570131079168.0","g6":"-2.57013e+12","f2":"-2570131079168.00","f0":"-2570131079168","f1":"-2570131079168.0","round1":"-2570131079168.0"},{"bits":4573691225361612800,"repr":"0.006107270251959562","g6":"0.00610727","f2":"0.01","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4674898178858811392,"repr":"33945.0","g6":"33945","f2":"33945.00","f0":"33945","f1":"33945.0","round1":"33945.0"},{"bits":13703662627064905728,"repr":"-3.39812422645025e-09","g6":"-3.39812e-09","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13943653047144868910,"repr":"-37343803.29537235","g6":"-3.73438e+07","f2":"-37343803.30","f0":"-37343803","f1":"-37343803.3","round1":"-37343803.3"},{"bits":4586601640965963776,"repr":"0.04469216614961624","g6":"0.0446922","f2":"0.04","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4496982422111042871,"repr":"4.561797596385749e-08","g6":"4.5618e-08","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4751575504817489088,"repr":"4559991425.50116","g6":"4.55999e+09","f2":"4559991425.50","f0":"4559991426","f1":"4559991425.5","round1":"4559991425.5"},{"bits":13989503715057336320,"repr":"-44455505920.0","g6":"-4.44555e+10","f2":"-44455505920.00","f0":"-44455505920","f1":"-44455505920.0","round1":"-44455505920.0"},{"bits":4772455878237698843,"repr":"116691169429.23088","g6":"1.16691e+11","f2":"116691169429.23","f0":"116691169429","f1":"116691169429.2","round1":"116691169429.2"},{"bits":14089691030970433536,"repr":"-2.219198778525614e+17","g6":"-2.2192e+17","f2":"-221919877852561408.00","f0":"-221919877852561408","f1":"-221919877852561408.0","round1":"-2.219198778525614e+17"},{"bits":13676444309597978624,"repr":"-5.182441975559726e-11","g6":"-5.18244e-11","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4576215393747599360,"repr":"0.008780774660408497","g6":"0.00878077","f2":"0.01","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13931269785776368248,"repr":"-5718076.552073114","g6":"-5.71808e+06","f2":"-5718076.55","f0":"-5718077","f1":"-5718076.6","round1":"-5718076.6"},{"bits":4647250159942175864,"repr":"485.58739255014325","g6":"485.587","f2":"485.59","f0":"486","f1":"485.6","round1":"485.6"},{"bits":4465318456622841856,"repr":"3.4921629477047134e-10","g6":"3.49216e-10","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13934315533694328818,"repr":"-8720692.68931577","g6":"-8.72069e+06","f2":"-8720692.69","f0":"-8720693","f1":"-8720692.7","round1":"-8720692.7"},{"bits":4868653774308114432,"repr":"3.050353118706401e+17","g6":"3.05035e+17","f2":"305035311870640128.00","f0":"305035311870640128","f1":"305035311870640128.0","round1":"3.050353118706401e+17"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4740929788825305088,"repr":"911543424.0","g6":"9.11543e+08","f2":"911543424.00","f0":"911543424","f1":"911543424.0","round1":"911543424.0"},{"bits":4490367801287459999,"repr":"1.5824204757147232e-08","g6":"1.58242e-08","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4445474221656637440,"repr":"1.5913497949937572e-11","g6":"1.59135e-11","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13981377062007553858,"repr":"-12793385080.155888","g6":"-1.27934e+10","f2":"-12793385080.16","f0":"-12793385080","f1":"-12793385080.2","round1":"-12793385080.2"},{"bits":4448954182937870336,"repr":"2.7157859294746345e-11","g6":"2.71579e-11","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4613219379197247488,"repr":"2.6809489727020264","g6":"2.68095","f2":"2.68","f0":"3","f1":"2.7","round1":"2.7"},{"bits":4653328948661321728,"repr":"1276.506103515625","g6":"1276.51","f2":"1276.51","f0":"1277","f1":"1276.5","round1":"1276.5"},{"bits":4769842839720820736,"repr":"76819365888.0","g6":"7.68194e+10","f2":"76819365888.00","f0":"76819365888","f1":"76819365888.0","round1":"76819365888.0"},{"bits":13985754650989559808,"repr":"-25106077696.0","g6":"-2.51061e+10","f2":"-25106077696.00","f0":"-25106077696","f1":"-25106077696.0","round1":"-25106077696.0"},{"bits":4864436585474299622,"repr":"1.61682801329102e+17","g6":"1.61683e+17","f2":"161682801329102016.00","f0":"161682801329102016","f1":"161682801329102016.0","round1":"1.61682801329102e+17"},{"bits":13776767118307491840,"repr":"-0.00025801072479225695","g6":"-0.000258011","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4559171395462234188,"repr":"0.0006540094193923178","g6":"0.000654009","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4646135652109963722,"repr":"422.2349570200573","g6":"422.235","f2":"422.23","f0":"422","f1":"422.2","round1":"422.2"},{"bits":13795378899523207168,"repr":"-0.00464631849899888","g6":"-0.00464632","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4623306907145207808,"repr":"12.642845153808594","g6":"12.6428","f2":"12.64","f0":"13","f1":"12.6","round1":"12.6"},{"bits":4634206131835633664,"repr":"64.03005981445312","g6":"64.0301","f2":"64.03","f0":"64","f1":"64.0","round1":"64.0"},{"bits":13712515797808860022,"repr":"-1.3337678109994656e-08","g6":"-1.33377e-08","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4555800940669566976,"repr":"0.00038843261427246034","g6":"0.000388433","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4809729209065071835,"repr":"34734399562980.855","g6":"3.47344e+13","f2":"34734399562980.86","f0":"34734399562981","f1":"34734399562980.9","round1":"34734399562980.9"},{"bits":13709854935892361216,"repr":"-8.935651329977645e-09","g6":"-8.93565e-09","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13880224002233860096,"repr":"-2107.0947265625","g6":"-2107.09","f2":"-2107.09","f0":"-2107","f1":"-2107.1","round1":"-2107.1"},{"bits":4623985861480939520,"repr":"13.848910331726074","g6":"13.8489","f2":"13.85","f0":"14","f1":"13.8","round1":"13.8"},{"bits":4567937940061411022,"repr":"0.002511670357416707","g6":"0.00251167","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13858254261251694148,"repr":"-73.63791297689846","g6":"-73.6379","f2":"-73.64","f0":"-74","f1":"-73.6","round1":"-73.6"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4429379628968181760,"repr":"1.382295319873883e-12","g6":"1.3823e-12","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13708959764313014272,"repr":"-7.454714179289113e-09","g6":"-7.45471e-09","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4648915549790151114,"repr":"648.5076904902755","g6":"648.508","f2":"648.51","f0":"649","f1":"648.5","round1":"648.5"},{"bits":13828094823984267264,"repr":"-0.7269260287284851","g6":"-0.726926","f2":"-0.73","f0":"-1","f1":"-0.7","round1":"-0.7"},{"bits":4648917927590887424,"repr":"648.7780151367188","g6":"648.778","f2":"648.78","f0":"649","f1":"648.8","round1":"648.8"},{"bits":4475795426512992453,"repr":"1.7008066227095278e-09","g6":"1.70081e-09","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4710200858506166272,"repr":"7863014.5","g6":"7.86301e+06","f2":"7863014.50","f0":"7863014","f1":"7863014.5","round1":"7863014.5"},{"bits":4645063536098261450,"repr":"361.2922174994861","g6":"361.292","f2":"361.29","f0":"361","f1":"361.3","round1":"361.3"},{"bits":13855489599108808704,"repr":"-49.17485046386719","g6":"-49.1749","f2":"-49.17","f0":"-49","f1":"-49.2","round1":"-49.2"},{"bits":4740703536390602752,"repr":"884572032.0","g6":"8.84572e+08","f2":"884572032.00","f0":"884572032","f1":"884572032.0","round1":"884572032.0"},{"bits":14021061298403572974,"repr":"-5721931666591.232","g6":"-5.72193e+12","f2":"-5721931666591.23","f0":"-5721931666591","f1":"-5721931666591.2","round1":"-5721931666591.2"},{"bits":4751642558940103136,"repr":"4623939220.047333","g6":"4.62394e+09","f2":"4623939220.05","f0":"4623939220","f1":"4623939220.0","round1":"4623939220.0"},{"bits":4622017608965685248,"repr":"10.352591514587402","g6":"10.3526","f2":"10.35","f0":"10","f1":"10.4","round1":"10.4"},{"bits":4689147767950409728,"repr":"314563.25","g6":"314563","f2":"314563.25","f0":"314563","f1":"314563.2","round1":"314563.2"},{"bits":13710820654457028608,"repr":"-1.0533298677728453e-08","g6":"-1.05333e-08","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4839731909998648676,"repr":"3684754915053234.0","g6":"3.68475e+15","f2":"3684754915053234.00","f0":"3684754915053234","f1":"3684754915053234.0","round1":"3684754915053234.0"},{"bits":4535295818147561472,"repr":"1.5838137187529355e-05","g6":"1.58381e-05","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4516075130828357632,"repr":"8.440581495960942e-07","g6":"8.44058e-07","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4612506490861780992,"repr":"2.364362955093384","g6":"2.36436","f2":"2.36","f0":"2","f1":"2.4","round1":"2.4"},{"bits":14024510269057662976,"repr":"-9384041119744.0","g6":"-9.38404e+12","f2":"-9384041119744.00","f0":"-9384041119744","f1":"-9384041119744.0","round1":"-9384041119744.0"},{"bits":4646338289897638657,"repr":"433.75358166189113","g6":"433.754","f2":"433.75","f0":"434","f1":"433.8","round1":"433.8"},{"bits":4653594024379154432,"repr":"1336.77734375","g6":"1336.78","f2":"1336.78","f0":"1337","f1":"1336.8","round1":"1336.8"},{"bits":4477949066919018496,"repr":"2.4296928913258853e-09","g6":"2.42969e-09","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4603500103892729856,"repr":"0.5911809206008911","g6":"0.591181","f2":"0.59","f0":"1","f1":"0.6","round1":"0.6"},{"bits":13776304611416494083,"repr":"-0.00023853940049589636","g6":"-0.000238539","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":0,"repr":"0.0","g6":"0","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4603209686257238016,"repr":"0.5589380860328674","g6":"0.558938","f2":"0.56","f0":"1","f1":"0.6","round1":"0.6"},{"bits":4543922634805459198,"repr":"5.961627976335154e-05","g6":"5.96163e-05","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4592381436861549887,"repr":"0.10709511331065345","g6":"0.107095","f2":"0.11","f0":"0","f1":"0.1","round1":"0.1"},{"bits":13928378338751871676,"repr":"-3609755.332427351","g6":"-3.60976e+06","f2":"-3609755.33","f0":"-3609755","f1":"-3609755.3","round1":"-3609755.3"},{"bits":13957739259374669414,"repr":"-333047734.55100095","g6":"-3.33048e+08","f2":"-333047734.55","f0":"-333047735","f1":"-333047734.6","round1":"-333047734.6"},{"bits":13823908395880546304,"repr":"-0.3810695707798004","g6":"-0.38107","f2":"-0.38","f0":"-0","f1":"-0.4","round1":"-0.4"},{"bits":4646169425074576211,"repr":"424.1547277936963","g6":"424.155","f2":"424.15","f0":"424","f1":"424.2","round1":"424.2"},{"bits":4673001278266030684,"repr":"26455.615844304077","g6":"26455.6","f2":"26455.62","f0":"26456","f1":"26455.6","round1":"26455.6"},{"bits":4613852014458175488,"repr":"2.96189546585083","g6":"2.9619","f2":"2.96","f0":"3","f1":"3.0","round1":"3.0"},{"bits":4647148841048338397,"repr":"479.8280802292264","g6":"479.828","f2":"479.83","f0":"480","f1":"479.8","round1":"479.8"},{"bits":4621348806858899456,"repr":"9.164560317993164","g6":"9.16456","f2":"9.16","f0":"9","f1":"9.2","round1":"9.2"},{"bits":13923620547213656064,"repr":"-1745694.0","g6":"-1.74569e+06","f2":"-1745694.00","f0":"-1745694","f1":"-1745694.0","round1":"-1745694.0"},{"bits":4621625167066431488,"repr":"9.655474662780762","g6":"9.65547","f2":"9.66","f0":"10","f1":"9.7","round1":"9.7"},{"bits":4783155581529778527,"repr":"590378038291.2928","g6":"5.90378e+11","f2":"590378038291.29","f0":"590378038291","f1":"590378038291.3","round1":"590378038291.3"},{"bits":14047071429468356608,"repr":"-302986957946880.0","g6":"-3.02987e+14","f2":"-302986957946880.00","f0":"-302986957946880","f1":"-302986957946880.0","round1":"-302986957946880.0"},{"bits":4691754460911763456,"repr":"466292.75","g6":"466293","f2":"466292.75","f0":"466293","f1":"466292.8","round1":"466292.8"},{"bits":4854806579566213293,"repr":"3.5733522062238388e+16","g6":"3.57335e+16","f2":"35733522062238388.00","f0":"35733522062238388","f1":"35733522062238388.0","round1":"3.5733522062238388e+16"},{"bits":4433134467082616832,"repr":"2.462168273084653e-12","g6":"2.46217e-12","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4604020157860282368,"repr":"0.6489185094833374","g6":"0.648919","f2":"0.65","f0":"1","f1":"0.6","round1":"0.6"},{"bits":13933731911156367360,"repr":"-8011109.5","g6":"-8.01111e+06","f2":"-8011109.50","f0":"-8011110","f1":"-8011109.5","round1":"-8011109.5"},{"bits":4753746451736035328,"repr":"6630367744.0","g6":"6.63037e+09","f2":"6630367744.00","f0":"6630367744","f1":"6630367744.0","round1":"6630367744.0"},{"bits":4597237840473414151,"repr":"0.22398250429041885","g6":"0.223983","f2":"0.22","f0":"0","f1":"0.2","round1":"0.2"},{"bits":13879729462015190106,"repr":"-1965.1019361077547","g6":"-1965.1","f2":"-1965.10","f0":"-1965","f1":"-1965.1","round1":"-1965.1"},{"bits":4429134746002551500,"repr":"1.332841598801168e-12","g6":"1.33284e-12","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13676444309809261554,"repr":"-5.1824421120981195e-11","g6":"-5.18244e-11","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4438338784603967167,"repr":"5.49037195317039e-12","g6":"5.49037e-12","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4673020111293744415,"repr":"26524.13","g6":"26524.1","f2":"26524.13","f0":"26524","f1":"26524.1","round1":"26524.1"},{"bits":4593641810995684126,"repr":"0.1245863181026263","g6":"0.124586","f2":"0.12","f0":"0","f1":"0.1","round1":"0.1"},{"bits":4802888228975673344,"repr":"12802003566592.0","g6":"1.2802e+13","f2":"12802003566592.00","f0":"12802003566592","f1":"12802003566592.0","round1":"12802003566592.0"},{"bits":14008281473337269804,"repr":"-804471660448.9429","g6":"-8.04472e+11","f2":"-804471660448.94","f0":"-804471660449","f1":"-804471660448.9","round1":"-804471660448.9"},{"bits":13955275885872414720,"repr":"-227327344.0","g6":"-2.27327e+08","f2":"-227327344.00","f0":"-227327344","f1":"-227327344.0","round1":"-227327344.0"},{"bits":4868034973673717760,"repr":"2.7683122371048243e+17","g6":"2.76831e+17","f2":"276831223710482432.00","f0":"276831223710482432","f1":"276831223710482432.0","round1":"2.7683122371048243e+17"},{"bits":14079019227482685440,"repr":"-4.216313559908352e+16","g6":"-4.21631e+16","f2":"-42163135599083520.00","f0":"-42163135599083520","f1":"-42163135599083520.0","round1":"-4.216313559908352e+16"},{"bits":4538292424531283959,"repr":"2.599103453539139e-05","g6":"2.5991e-05","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4554424174944190464,"repr":"0.00031379799474962056","g6":"0.000313798","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4602341419426775040,"repr":"0.48127055168151855","g6":"0.481271","f2":"0.48","f0":"0","f1":"0.5","round1":"0.5"},{"bits":13832051113954168422,"repr":"-1.3323249007925368","g6":"-1.33232","f2":"-1.33","f0":"-1","f1":"-1.3","round1":"-1.3"},{"bits":4703005152439697408,"repr":"2677897.5","g6":"2.6779e+06","f2":"2677897.50","f0":"2677898","f1":"2677897.5","round1":"2677897.5"},{"bits":4851758276519395328,"repr":"2.354030987496653e+16","g6":"2.35403e+16","f2":"23540309874966528.00","f0":"23540309874966528","f1":"23540309874966528.0","round1":"2.354030987496653e+16"},{"bits":4595654181116706816,"repr":"0.18002712726593018","g6":"0.180027","f2":"0.18","f0":"0","f1":"0.2","round1":"0.2"},{"bits":4693226713960677376,"repr":"579690.3125","g6":"579690","f2":"579690.31","f0":"579690","f1":"579690.3","round1":"579690.3"},{"bits":4481640430860254550,"repr":"4.187520170257654e-09","g6":"4.18752e-09","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4805295828728020992,"repr":"17504346832896.0","g6":"1.75043e+13","f2":"17504346832896.00","f0":"17504346832896","f1":"17504346832896.0","round1":"17504346832896.0"},{"bits":4577599626810490880,"repr":"0.011182036250829697","g6":"0.011182","f2":"0.01","f0":"0","f1":"0.0","round1":"0.0"},{"bits":13692420057091152279,"repr":"-6.183991415330842e-10","g6":"-6.18399e-10","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4616612276122681344,"repr":"4.375395774841309","g6":"4.3754","f2":"4.38","f0":"4","f1":"4.4","round1":"4.4"},{"bits":13737181952053151542,"repr":"-6.042191156923349e-07","g6":"-6.04219e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4775260136732098560,"repr":"181522563072.0","g6":"1.81523e+11","f2":"181522563072.00","f0":"181522563072","f1":"181522563072.0","round1":"181522563072.0"},{"bits":13898303216094806016,"repr":"-34185.109375","g6":"-34185.1","f2":"-34185.11","f0":"-34185","f1":"-34185.1","round1":"-34185.1"},{"bits":13727932990268916373,"repr":"-1.4465537805142413e-07","g6":"-1.44655e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4645561511711551406,"repr":"389.59885386819485","g6":"389.599","f2":"389.60","f0":"390","f1":"389.6","round1":"389.6"},{"bits":4667437261808015440,"repr":"11298.92094386756","g6":"11298.9","f2":"11298.92","f0":"11299","f1":"11298.9","round1":"11298.9"},{"bits":4763715859493421056,"repr":"30192005120.0","g6":"3.0192e+10","f2":"30192005120.00","f0":"30192005120","f1":"30192005120.0","round1":"30192005120.0"},{"bits":4695708981317131610,"repr":"868664.2656621144","g6":"868664","f2":"868664.27","f0":"868664","f1":"868664.3","round1":"868664.3"},{"bits":4512702427137369173,"repr":"4.869592561469177e-07","g6":"4.86959e-07","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4620471721386835968,"repr":"7.803271770477295","g6":"7.80327","f2":"7.80","f0":"8","f1":"7.8","round1":"7.8"},{"bits":13653717635643211776,"repr":"-1.5773713715402926e-12","g6":"-1.57737e-12","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4645629057640776384,"repr":"393.43839541547277","g6":"393.438","f2":"393.44","f0":"393","f1":"393.4","round1":"393.4"},{"bits":4643577922312808098,"repr":"276.84485082757067","g6":"276.845","f2":"276.84","f0":"277","f1":"276.8","round1":"276.8"},{"bits":13871940073861152768,"repr":"-609.0000610351562","g6":"-609","f2":"-609.00","f0":"-609","f1":"-609.0","round1":"-609.0"},{"bits":4570514966505790010,"repr":"0.0036292774252360245","g6":"0.00362928","f2":"0.00","f0":"0","f1":"0.0","round1":"0.0"},{"bits":4674890724406198272,"repr":"33890.76171875","g6":"33890.8","f2":"33890.76","f0":"33891","f1":"33890.8","round1":"33890.8"},{"bits":4828920298487152640,"repr":"695637196668928.0","g6":"6.95637e+14","f2":"695637196668928.00","f0":"695637196668928","f1":"695637196668928.0","round1":"695637196668928.0"},{"bits":4645966787286901276,"repr":"412.63610315186247","g6":"412.636","f2":"412.64","f0":"413","f1":"412.6","round1":"412.6"},{"bits":13854404144930604092,"repr":"-41.462234650629824","g6":"-41.4622","f2":"-41.46","f0":"-41","f1":"-41.5","round1":"-41.5"},{"bits":13866879450798358528,"repr":"-272.8369140625","g6":"-272.837","f2":"-272.84","f0":"-273","f1":"-272.8","round1":"-272.8"},{"bits":4645426419853101449,"repr":"381.91977077363896","g6":"381.92","f2":"381.92","f0":"382","f1":"381.9","round1":"381.9"},{"bits":13881060903991902208,"repr":"-2487.673583984375","g6":"-2487.67","f2":"-2487.67","f0":"-2488","f1":"-2487.7","round1":"-2487.7"},{"bits":13728011729210703872,"repr":"-1.4673958048661007e-07","g6":"-1.4674e-07","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":13948596172804393751,"repr":"-81237054.84476887","g6":"-8.12371e+07","f2":"-81237054.84","f0":"-81237055","f1":"-81237054.8","round1":"-81237054.8"},{"bits":4645696603570001362,"repr":"397.2779369627507","g6":"397.278","f2":"397.28","f0":"397","f1":"397.3","round1":"397.3"},{"bits":4645527738746938917,"repr":"387.6790830945559","g6":"387.679","f2":"387.68","f0":"388","f1":"387.7","round1":"387.7"},{"bits":4647148841048338397,"repr":"479.8280802292264","g6":"479.828","f2":"479.83","f0":"480","f1":"479.8","round1":"479.8"},{"bits":13873165794509346860,"repr":"-748.348365458432","g6":"-748.348","f2":"-748.35","f0":"-748","f1":"-748.3","round1":"-748.3"},{"bits":13992045141695660032,"repr":"-63845052416.0","g6":"-6.38451e+10","f2":"-63845052416.00","f0":"-63845052416","f1":"-63845052416.0","round1":"-63845052416.0"},{"bits":4647145182523817984,"repr":"479.6201171875","g6":"479.62","f2":"479.62","f0":"480","f1":"479.6","round1":"479.6"},{"bits":13721400145675812864,"repr":"-5.2537750150349893e-08","g6":"-5.25378e-08","f2":"-0.00","f0":"-0","f1":"-0.0","round1":"-0.0"},{"bits":4706455081698983936,"repr":"4374488.0","g6":"4.37449e+06","f2":"4374488.00","f0":"4374488","f1":"4374488.0","round1":"4374488.0"},{"bits":4657298158794047488,"repr":"2310.0","g6":"2310","f2":"2310.00","f0":"2310","f1":"2310.0","round1":"2310.0"}] \ No newline at end of file diff --git a/tests/golden/quick_r01.txt b/tests/golden/quick_r01.txt new file mode 100644 index 0000000..d7b06db --- /dev/null +++ b/tests/golden/quick_r01.txt @@ -0,0 +1,2 @@ + #1 483.7 lm 5635 K + 483.7 lm 5635 K \ No newline at end of file diff --git a/tests/golden/quick_r02.txt b/tests/golden/quick_r02.txt new file mode 100644 index 0000000..f809c92 --- /dev/null +++ b/tests/golden/quick_r02.txt @@ -0,0 +1,2 @@ + #2 479.6 lm 5661 K + 479.6 lm 5661 K \ No newline at end of file diff --git a/tests/golden/quick_r03.txt b/tests/golden/quick_r03.txt new file mode 100644 index 0000000..05ffe28 --- /dev/null +++ b/tests/golden/quick_r03.txt @@ -0,0 +1,2 @@ + #3 0.0 lm 0 K + 0.0 lm 0 K \ No newline at end of file diff --git a/tests/golden/quick_r04.txt b/tests/golden/quick_r04.txt new file mode 100644 index 0000000..bbc7efd --- /dev/null +++ b/tests/golden/quick_r04.txt @@ -0,0 +1,2 @@ + #4 479.8 lm 5656 K + 479.8 lm 5656 K \ No newline at end of file diff --git a/tests/golden/quick_r05.txt b/tests/golden/quick_r05.txt new file mode 100644 index 0000000..187569b --- /dev/null +++ b/tests/golden/quick_r05.txt @@ -0,0 +1,2 @@ + #5 479.6 lm 5655 K + 479.6 lm 5655 K \ No newline at end of file diff --git a/tests/golden/quick_r06.txt b/tests/golden/quick_r06.txt new file mode 100644 index 0000000..285241f --- /dev/null +++ b/tests/golden/quick_r06.txt @@ -0,0 +1,2 @@ + #6 479.6 lm 5654 K + 479.6 lm 5654 K \ No newline at end of file diff --git a/tests/golden/quick_r07.txt b/tests/golden/quick_r07.txt new file mode 100644 index 0000000..06a6622 --- /dev/null +++ b/tests/golden/quick_r07.txt @@ -0,0 +1,2 @@ + #7 182.6 lm 4937 K + 182.6 lm 4937 K \ No newline at end of file diff --git a/tests/golden/readings.json b/tests/golden/readings.json new file mode 100644 index 0000000..2f9c31d --- /dev/null +++ b/tests/golden/readings.json @@ -0,0 +1,17317 @@ +[ + { + "name": "r01", + "source": "usb_capture_20260204_123319_hub1#0", + "harmonics": false, + "keys": [ + "device", + "Phi_lm", + "eta_lm_W", + "CCT_K", + "Duv", + "x", + "y", + "u", + "v", + "u_prime", + "v_prime", + "SDCM", + "Ra", + "R1", + "R2", + "R3", + "R4", + "R5", + "R6", + "R7", + "R8", + "R9", + "R10", + "R11", + "R12", + "R13", + "R14", + "R15", + "Phi_e_mW", + "Phi_euv_mW", + "Phi_eb_mW", + "Phi_ey_mW", + "Phi_er_mW", + "Phi_efr_mW", + "Phi_eir_mW", + "Phi_e_total", + "CIE_X", + "CIE_Y", + "CIE_Z", + "TLCI", + "PeakSignal", + "DarkSignal", + "Compensate", + "test_date", + "test_time", + "spectrum", + "spectrum_nm", + "Voltage_V", + "Current_A", + "Power_W", + "Freq_Hz", + "PF" + ], + "values": { + "device": "HPCS6500", + "Phi_lm": { + "f": "483.7375183105469" + }, + "eta_lm_W": { + "f": "57.40340042114258" + }, + "CCT_K": { + "f": "5635.47412109375" + }, + "Duv": { + "f": "0.005606670398265123" + }, + "x": { + "f": "0.32931944727897644" + }, + "y": { + "f": "0.34943076968193054" + }, + "u": { + "f": "0.2015872299671173" + }, + "v": { + "f": "0.3208470344543457" + }, + "u_prime": { + "f": "0.2015872299671173" + }, + "v_prime": { + "f": "0.48127055168151855" + }, + "SDCM": { + "f": "4.836654186248779" + }, + "Ra": { + "f": "82.90641784667969" + }, + "R1": { + "f": "81.94468688964844" + }, + "R2": { + "f": "93.72439575195312" + }, + "R3": { + "f": "93.53913116455078" + }, + "R4": { + "f": "76.66526794433594" + }, + "R5": { + "f": "81.33158874511719" + }, + "R6": { + "f": "88.99320983886719" + }, + "R7": { + "f": "83.17845916748047" + }, + "R8": { + "f": "63.87458801269531" + }, + "R9": { + "f": "4.212823390960693" + }, + "R10": { + "f": "83.55355072021484" + }, + "R11": { + "f": "76.21843719482422" + }, + "R12": { + "f": "59.73139953613281" + }, + "R13": { + "f": "86.1976318359375" + }, + "R14": { + "f": "96.91849517822266" + }, + "R15": { + "f": "75.6298828125" + }, + "Phi_e_mW": { + "f": "1501.3740234375" + }, + "Phi_euv_mW": { + "f": "0.0" + }, + "Phi_eb_mW": { + "f": "471.6053466796875" + }, + "Phi_ey_mW": { + "f": "686.2144775390625" + }, + "Phi_er_mW": { + "f": "333.9613952636719" + }, + "Phi_efr_mW": { + "f": "11.230633735656738" + }, + "Phi_eir_mW": { + "f": "0.0" + }, + "Phi_e_total": { + "f": "1503.01220703125" + }, + "CIE_X": { + "f": "667.4908447265625" + }, + "CIE_Y": { + "f": "708.2540283203125" + }, + "CIE_Z": { + "f": "651.1345825195312" + }, + "TLCI": { + "f": "67.85055541992188" + }, + "PeakSignal": { + "f": "53279.0" + }, + "DarkSignal": { + "f": "2154.0" + }, + "Compensate": { + "f": "2834.0" + }, + "test_date": "2026-02-04", + "test_time": "15:38:14", + "spectrum": [ + { + "f": "0.0005287560634315014" + }, + { + "f": "0.00511894328519702" + }, + { + "f": "0.015846675261855125" + }, + { + "f": "0.033599670976400375" + }, + { + "f": "0.058598920702934265" + }, + { + "f": "0.08762522786855698" + }, + { + "f": "0.12458469718694687" + }, + { + "f": "0.16689735651016235" + }, + { + "f": "0.21035802364349365" + }, + { + "f": "0.2603340446949005" + }, + { + "f": "0.3178972005844116" + }, + { + "f": "0.3835609257221222" + }, + { + "f": "0.4599207937717438" + }, + { + "f": "0.5480003952980042" + }, + { + "f": "0.6489185094833374" + }, + { + "f": "0.7660647034645081" + }, + { + "f": "0.900938093662262" + }, + { + "f": "1.0550322532653809" + }, + { + "f": "1.2270479202270508" + }, + { + "f": "1.4158927202224731" + }, + { + "f": "1.6232318878173828" + }, + { + "f": "1.8532241582870483" + }, + { + "f": "2.1086971759796143" + }, + { + "f": "2.3906655311584473" + }, + { + "f": "2.6986193656921387" + }, + { + "f": "3.0322303771972656" + }, + { + "f": "3.394322633743286" + }, + { + "f": "3.788742780685425" + }, + { + "f": "4.215726852416992" + }, + { + "f": "4.681450366973877" + }, + { + "f": "5.246369361877441" + }, + { + "f": "5.865339279174805" + }, + { + "f": "6.487288951873779" + }, + { + "f": "7.17447566986084" + }, + { + "f": "7.923381328582764" + }, + { + "f": "8.727624893188477" + }, + { + "f": "9.571680068969727" + }, + { + "f": "10.43272590637207" + }, + { + "f": "11.280016899108887" + }, + { + "f": "12.079808235168457" + }, + { + "f": "12.79052448272705" + }, + { + "f": "13.368149757385254" + }, + { + "f": "13.775572776794434" + }, + { + "f": "13.96674633026123" + }, + { + "f": "13.933028221130371" + }, + { + "f": "13.695517539978027" + }, + { + "f": "13.28392219543457" + }, + { + "f": "12.745455741882324" + }, + { + "f": "12.120277404785156" + }, + { + "f": "11.454957962036133" + }, + { + "f": "10.796585083007812" + }, + { + "f": "10.174885749816895" + }, + { + "f": "9.611307144165039" + }, + { + "f": "9.11073112487793" + }, + { + "f": "8.66984748840332" + }, + { + "f": "8.284205436706543" + }, + { + "f": "7.9399824142456055" + }, + { + "f": "7.6251349449157715" + }, + { + "f": "7.327723979949951" + }, + { + "f": "7.037724494934082" + }, + { + "f": "6.7506890296936035" + }, + { + "f": "6.468513488769531" + }, + { + "f": "6.194633483886719" + }, + { + "f": "5.934451103210449" + }, + { + "f": "5.691809177398682" + }, + { + "f": "5.467921257019043" + }, + { + "f": "5.257404804229736" + }, + { + "f": "5.073882102966309" + }, + { + "f": "4.919445991516113" + }, + { + "f": "4.792314529418945" + }, + { + "f": "4.69115686416626" + }, + { + "f": "4.615478515625" + }, + { + "f": "4.560397624969482" + }, + { + "f": "4.524904251098633" + }, + { + "f": "4.498828887939453" + }, + { + "f": "4.491034507751465" + }, + { + "f": "4.503248691558838" + }, + { + "f": "4.5245561599731445" + }, + { + "f": "4.552165985107422" + }, + { + "f": "4.584141254425049" + }, + { + "f": "4.621109485626221" + }, + { + "f": "4.664920806884766" + }, + { + "f": "4.715188503265381" + }, + { + "f": "4.775022029876709" + }, + { + "f": "4.842627048492432" + }, + { + "f": "4.91486120223999" + }, + { + "f": "4.9917683601379395" + }, + { + "f": "5.0705718994140625" + }, + { + "f": "5.15234899520874" + }, + { + "f": "5.237154006958008" + }, + { + "f": "5.325319766998291" + }, + { + "f": "5.415438652038574" + }, + { + "f": "5.504030227661133" + }, + { + "f": "5.58803653717041" + }, + { + "f": "5.668235778808594" + }, + { + "f": "5.746273994445801" + }, + { + "f": "5.821644306182861" + }, + { + "f": "5.895309925079346" + }, + { + "f": "5.964491367340088" + }, + { + "f": "6.029219627380371" + }, + { + "f": "6.089900493621826" + }, + { + "f": "6.145239353179932" + }, + { + "f": "6.194910526275635" + }, + { + "f": "6.240137577056885" + }, + { + "f": "6.28231954574585" + }, + { + "f": "6.322454929351807" + }, + { + "f": "6.358987808227539" + }, + { + "f": "6.392127990722656" + }, + { + "f": "6.422891139984131" + }, + { + "f": "6.450737953186035" + }, + { + "f": "6.476284980773926" + }, + { + "f": "6.504566192626953" + }, + { + "f": "6.531591415405273" + }, + { + "f": "6.554945945739746" + }, + { + "f": "6.577888011932373" + }, + { + "f": "6.598112106323242" + }, + { + "f": "6.6155242919921875" + }, + { + "f": "6.632884502410889" + }, + { + "f": "6.65272331237793" + }, + { + "f": "6.676412105560303" + }, + { + "f": "6.701122283935547" + }, + { + "f": "6.726459503173828" + }, + { + "f": "6.7531819343566895" + }, + { + "f": "6.782238483428955" + }, + { + "f": "6.814783096313477" + }, + { + "f": "6.8459601402282715" + }, + { + "f": "6.875178813934326" + }, + { + "f": "6.902880668640137" + }, + { + "f": "6.928682327270508" + }, + { + "f": "6.956238746643066" + }, + { + "f": "6.985379695892334" + }, + { + "f": "7.014392852783203" + }, + { + "f": "7.043094635009766" + }, + { + "f": "7.069706916809082" + }, + { + "f": "7.094996929168701" + }, + { + "f": "7.119927406311035" + }, + { + "f": "7.144545078277588" + }, + { + "f": "7.167855739593506" + }, + { + "f": "7.188852310180664" + }, + { + "f": "7.207385540008545" + }, + { + "f": "7.225704193115234" + }, + { + "f": "7.242874622344971" + }, + { + "f": "7.258177757263184" + }, + { + "f": "7.272360324859619" + }, + { + "f": "7.2848076820373535" + }, + { + "f": "7.297064304351807" + }, + { + "f": "7.3107476234436035" + }, + { + "f": "7.325179100036621" + }, + { + "f": "7.34049654006958" + }, + { + "f": "7.355605602264404" + }, + { + "f": "7.369230270385742" + }, + { + "f": "7.382935047149658" + }, + { + "f": "7.39801025390625" + }, + { + "f": "7.415108680725098" + }, + { + "f": "7.432919979095459" + }, + { + "f": "7.449892520904541" + }, + { + "f": "7.467884540557861" + }, + { + "f": "7.487949848175049" + }, + { + "f": "7.513704299926758" + }, + { + "f": "7.540598392486572" + }, + { + "f": "7.561187744140625" + }, + { + "f": "7.5771803855896" + }, + { + "f": "7.588768482208252" + }, + { + "f": "7.594308853149414" + }, + { + "f": "7.594383239746094" + }, + { + "f": "7.589938163757324" + }, + { + "f": "7.581970691680908" + }, + { + "f": "7.572944641113281" + }, + { + "f": "7.563446044921875" + }, + { + "f": "7.553679943084717" + }, + { + "f": "7.544432163238525" + }, + { + "f": "7.535065650939941" + }, + { + "f": "7.523033618927002" + }, + { + "f": "7.50484561920166" + }, + { + "f": "7.480123043060303" + }, + { + "f": "7.450575351715088" + }, + { + "f": "7.419229507446289" + }, + { + "f": "7.386904716491699" + }, + { + "f": "7.353113651275635" + }, + { + "f": "7.31752872467041" + }, + { + "f": "7.279629707336426" + }, + { + "f": "7.239462375640869" + }, + { + "f": "7.198157787322998" + }, + { + "f": "7.166077136993408" + }, + { + "f": "7.131350517272949" + }, + { + "f": "7.082704544067383" + }, + { + "f": "7.02974271774292" + }, + { + "f": "6.9726433753967285" + }, + { + "f": "6.9134602546691895" + }, + { + "f": "6.852541446685791" + }, + { + "f": "6.78883171081543" + }, + { + "f": "6.722431659698486" + }, + { + "f": "6.654323577880859" + }, + { + "f": "6.582479476928711" + }, + { + "f": "6.507891654968262" + }, + { + "f": "6.430513858795166" + }, + { + "f": "6.3501973152160645" + }, + { + "f": "6.269205093383789" + }, + { + "f": "6.186713695526123" + }, + { + "f": "6.102875232696533" + }, + { + "f": "6.018960952758789" + }, + { + "f": "5.934681415557861" + }, + { + "f": "5.850903034210205" + }, + { + "f": "5.781527519226074" + }, + { + "f": "5.7110490798950195" + }, + { + "f": "5.6257147789001465" + }, + { + "f": "5.539093494415283" + }, + { + "f": "5.450788497924805" + }, + { + "f": "5.361730098724365" + }, + { + "f": "5.273162841796875" + }, + { + "f": "5.1849164962768555" + }, + { + "f": "5.096785545349121" + }, + { + "f": "5.008652687072754" + }, + { + "f": "4.920080661773682" + }, + { + "f": "4.832667350769043" + }, + { + "f": "4.747199535369873" + }, + { + "f": "4.662315845489502" + }, + { + "f": "4.57733678817749" + }, + { + "f": "4.491639614105225" + }, + { + "f": "4.405312538146973" + }, + { + "f": "4.318569183349609" + }, + { + "f": "4.245606899261475" + }, + { + "f": "4.172275543212891" + }, + { + "f": "4.0858025550842285" + }, + { + "f": "4.000112533569336" + }, + { + "f": "3.9139349460601807" + }, + { + "f": "3.8276431560516357" + }, + { + "f": "3.7404980659484863" + }, + { + "f": "3.6529951095581055" + }, + { + "f": "3.565577745437622" + }, + { + "f": "3.4784624576568604" + }, + { + "f": "3.392516613006592" + }, + { + "f": "3.307551622390747" + }, + { + "f": "3.2229034900665283" + }, + { + "f": "3.1389458179473877" + }, + { + "f": "3.055190324783325" + }, + { + "f": "2.983738899230957" + }, + { + "f": "2.913844585418701" + }, + { + "f": "2.833744764328003" + }, + { + "f": "2.754784345626831" + }, + { + "f": "2.6779792308807373" + }, + { + "f": "2.6025681495666504" + }, + { + "f": "2.527838706970215" + }, + { + "f": "2.4541594982147217" + }, + { + "f": "2.381134271621704" + }, + { + "f": "2.3104922771453857" + }, + { + "f": "2.2426328659057617" + }, + { + "f": "2.177119493484497" + }, + { + "f": "2.114001750946045" + }, + { + "f": "2.0526626110076904" + }, + { + "f": "2.0010738372802734" + }, + { + "f": "1.950684905052185" + }, + { + "f": "1.8924812078475952" + }, + { + "f": "1.8343702554702759" + }, + { + "f": "1.777320146560669" + }, + { + "f": "1.7210323810577393" + }, + { + "f": "1.6656296253204346" + }, + { + "f": "1.6114801168441772" + }, + { + "f": "1.5589139461517334" + }, + { + "f": "1.5085227489471436" + }, + { + "f": "1.4606192111968994" + }, + { + "f": "1.414538860321045" + }, + { + "f": "1.370144248008728" + }, + { + "f": "1.3325247764587402" + }, + { + "f": "1.2950080633163452" + }, + { + "f": "1.2518020868301392" + }, + { + "f": "1.2086385488510132" + }, + { + "f": "1.1658124923706055" + }, + { + "f": "1.1243211030960083" + }, + { + "f": "1.084350347518921" + }, + { + "f": "1.0460314750671387" + }, + { + "f": "1.0094575881958008" + }, + { + "f": "0.9731119871139526" + }, + { + "f": "0.93687903881073" + }, + { + "f": "0.9013620018959045" + }, + { + "f": "0.866069495677948" + }, + { + "f": "0.8361824750900269" + }, + { + "f": "0.8067375421524048" + }, + { + "f": "0.7735456824302673" + }, + { + "f": "0.7418630123138428" + }, + { + "f": "0.7120286822319031" + }, + { + "f": "0.6835533380508423" + }, + { + "f": "0.6555176377296448" + }, + { + "f": "0.6281888484954834" + }, + { + "f": "0.6017606854438782" + }, + { + "f": "0.5761427283287048" + }, + { + "f": "0.551688551902771" + }, + { + "f": "0.531761109828949" + }, + { + "f": "0.5125730037689209" + }, + { + "f": "0.49097129702568054" + }, + { + "f": "0.4696700870990753" + }, + { + "f": "0.44881439208984375" + }, + { + "f": "0.4289717376232147" + }, + { + "f": "0.410896360874176" + }, + { + "f": "0.39439699053764343" + }, + { + "f": "0.37865084409713745" + }, + { + "f": "0.36336785554885864" + }, + { + "f": "0.3484576344490051" + }, + { + "f": "0.33369123935699463" + }, + { + "f": "0.3205435574054718" + }, + { + "f": "0.3070681691169739" + }, + { + "f": "0.2909424602985382" + }, + { + "f": "0.2742050588130951" + }, + { + "f": "0.25787413120269775" + }, + { + "f": "0.24321070313453674" + }, + { + "f": "0.22995059192180634" + }, + { + "f": "0.2180364578962326" + }, + { + "f": "0.20684735476970673" + }, + { + "f": "0.19573496282100677" + }, + { + "f": "0.1866772323846817" + }, + { + "f": "0.1781800240278244" + }, + { + "f": "0.16920986771583557" + }, + { + "f": "0.16155433654785156" + }, + { + "f": "0.15504269301891327" + }, + { + "f": "0.14874710142612457" + }, + { + "f": "0.14207027852535248" + }, + { + "f": "0.1349063366651535" + }, + { + "f": "0.12755036354064941" + }, + { + "f": "0.12084780633449554" + }, + { + "f": "0.11566480249166489" + }, + { + "f": "0.11063123494386673" + }, + { + "f": "0.10537438839673996" + }, + { + "f": "0.10008314251899719" + }, + { + "f": "0.09443690627813339" + }, + { + "f": "0.08857259899377823" + }, + { + "f": "0.08243785798549652" + }, + { + "f": "0.07677596807479858" + }, + { + "f": "0.07194723188877106" + }, + { + "f": "0.0676468014717102" + }, + { + "f": "0.0643005445599556" + }, + { + "f": "0.06096305698156357" + }, + { + "f": "0.05704699084162712" + }, + { + "f": "0.05317019671201706" + }, + { + "f": "0.04917439445853233" + }, + { + "f": "0.045043572783470154" + }, + { + "f": "0.040470659732818604" + }, + { + "f": "0.03541044890880585" + }, + { + "f": "0.030452536419034004" + }, + { + "f": "0.02640998549759388" + }, + { + "f": "0.023366201668977737" + }, + { + "f": "0.02083449251949787" + }, + { + "f": "0.018040301278233528" + }, + { + "f": "0.015390072017908096" + }, + { + "f": "0.013166023418307304" + }, + { + "f": "0.010934486985206604" + }, + { + "f": "0.008657503873109818" + }, + { + "f": "0.0058868820779025555" + }, + { + "f": "0.0031181166414171457" + }, + { + "f": "0.001569669577293098" + }, + { + "f": "0.0005262282211333513" + } + ], + "spectrum_nm": [ + { + "f": "380.0" + }, + { + "f": "381.91977077363896" + }, + { + "f": "383.8395415472779" + }, + { + "f": "385.75931232091693" + }, + { + "f": "387.6790830945559" + }, + { + "f": "389.59885386819485" + }, + { + "f": "391.5186246418338" + }, + { + "f": "393.43839541547277" + }, + { + "f": "395.3581661891117" + }, + { + "f": "397.2779369627507" + }, + { + "f": "399.1977077363897" + }, + { + "f": "401.11747851002866" + }, + { + "f": "403.0372492836676" + }, + { + "f": "404.9570200573066" + }, + { + "f": "406.87679083094554" + }, + { + "f": "408.79656160458455" + }, + { + "f": "410.7163323782235" + }, + { + "f": "412.63610315186247" + }, + { + "f": "414.55587392550143" + }, + { + "f": "416.4756446991404" + }, + { + "f": "418.39541547277935" + }, + { + "f": "420.3151862464183" + }, + { + "f": "422.2349570200573" + }, + { + "f": "424.1547277936963" + }, + { + "f": "426.07449856733524" + }, + { + "f": "427.9942693409742" + }, + { + "f": "429.91404011461316" + }, + { + "f": "431.8338108882522" + }, + { + "f": "433.75358166189113" + }, + { + "f": "435.6733524355301" + }, + { + "f": "437.59312320916905" + }, + { + "f": "439.512893982808" + }, + { + "f": "441.43266475644697" + }, + { + "f": "443.3524355300859" + }, + { + "f": "445.27220630372494" + }, + { + "f": "447.1919770773639" + }, + { + "f": "449.11174785100286" + }, + { + "f": "451.0315186246418" + }, + { + "f": "452.9512893982808" + }, + { + "f": "454.8710601719198" + }, + { + "f": "456.79083094555875" + }, + { + "f": "458.7106017191977" + }, + { + "f": "460.63037249283667" + }, + { + "f": "462.55014326647563" + }, + { + "f": "464.46991404011465" + }, + { + "f": "466.38968481375355" + }, + { + "f": "468.30945558739256" + }, + { + "f": "470.2292263610315" + }, + { + "f": "472.1489971346705" + }, + { + "f": "474.06876790830944" + }, + { + "f": "475.9885386819484" + }, + { + "f": "477.9083094555874" + }, + { + "f": "479.8280802292264" + }, + { + "f": "481.74785100286533" + }, + { + "f": "483.6676217765043" + }, + { + "f": "485.58739255014325" + }, + { + "f": "487.50716332378227" + }, + { + "f": "489.42693409742117" + }, + { + "f": "491.3467048710602" + }, + { + "f": "493.26647564469914" + }, + { + "f": "495.1862464183381" + }, + { + "f": "497.10601719197706" + }, + { + "f": "499.025787965616" + }, + { + "f": "500.94555873925503" + }, + { + "f": "502.865329512894" + }, + { + "f": "504.78510028653295" + }, + { + "f": "506.7048710601719" + }, + { + "f": "508.62464183381087" + }, + { + "f": "510.5444126074499" + }, + { + "f": "512.4641833810888" + }, + { + "f": "514.3839541547278" + }, + { + "f": "516.3037249283668" + }, + { + "f": "518.2234957020057" + }, + { + "f": "520.1432664756447" + }, + { + "f": "522.0630372492836" + }, + { + "f": "523.9828080229227" + }, + { + "f": "525.9025787965616" + }, + { + "f": "527.8223495702006" + }, + { + "f": "529.7421203438396" + }, + { + "f": "531.6618911174785" + }, + { + "f": "533.5816618911175" + }, + { + "f": "535.5014326647564" + }, + { + "f": "537.4212034383954" + }, + { + "f": "539.3409742120343" + }, + { + "f": "541.2607449856733" + }, + { + "f": "543.1805157593124" + }, + { + "f": "545.1002865329513" + }, + { + "f": "547.0200573065903" + }, + { + "f": "548.9398280802293" + }, + { + "f": "550.8595988538682" + }, + { + "f": "552.7793696275071" + }, + { + "f": "554.6991404011461" + }, + { + "f": "556.6189111747851" + }, + { + "f": "558.538681948424" + }, + { + "f": "560.458452722063" + }, + { + "f": "562.3782234957021" + }, + { + "f": "564.297994269341" + }, + { + "f": "566.21776504298" + }, + { + "f": "568.1375358166189" + }, + { + "f": "570.0573065902579" + }, + { + "f": "571.9770773638968" + }, + { + "f": "573.8968481375358" + }, + { + "f": "575.8166189111748" + }, + { + "f": "577.7363896848137" + }, + { + "f": "579.6561604584527" + }, + { + "f": "581.5759312320916" + }, + { + "f": "583.4957020057307" + }, + { + "f": "585.4154727793696" + }, + { + "f": "587.3352435530086" + }, + { + "f": "589.2550143266476" + }, + { + "f": "591.1747851002865" + }, + { + "f": "593.0945558739255" + }, + { + "f": "595.0143266475645" + }, + { + "f": "596.9340974212034" + }, + { + "f": "598.8538681948423" + }, + { + "f": "600.7736389684814" + }, + { + "f": "602.6934097421204" + }, + { + "f": "604.6131805157593" + }, + { + "f": "606.5329512893983" + }, + { + "f": "608.4527220630373" + }, + { + "f": "610.3724928366762" + }, + { + "f": "612.2922636103152" + }, + { + "f": "614.2120343839541" + }, + { + "f": "616.1318051575931" + }, + { + "f": "618.051575931232" + }, + { + "f": "619.971346704871" + }, + { + "f": "621.8911174785101" + }, + { + "f": "623.810888252149" + }, + { + "f": "625.730659025788" + }, + { + "f": "627.6504297994269" + }, + { + "f": "629.5702005730659" + }, + { + "f": "631.4899713467048" + }, + { + "f": "633.4097421203438" + }, + { + "f": "635.3295128939828" + }, + { + "f": "637.2492836676217" + }, + { + "f": "639.1690544412608" + }, + { + "f": "641.0888252148998" + }, + { + "f": "643.0085959885387" + }, + { + "f": "644.9283667621776" + }, + { + "f": "646.8481375358166" + }, + { + "f": "648.7679083094556" + }, + { + "f": "650.6876790830945" + }, + { + "f": "652.6074498567335" + }, + { + "f": "654.5272206303725" + }, + { + "f": "656.4469914040114" + }, + { + "f": "658.3667621776503" + }, + { + "f": "660.2865329512895" + }, + { + "f": "662.2063037249284" + }, + { + "f": "664.1260744985673" + }, + { + "f": "666.0458452722063" + }, + { + "f": "667.9656160458453" + }, + { + "f": "669.8853868194842" + }, + { + "f": "671.8051575931232" + }, + { + "f": "673.7249283667622" + }, + { + "f": "675.6446991404011" + }, + { + "f": "677.56446991404" + }, + { + "f": "679.4842406876791" + }, + { + "f": "681.4040114613181" + }, + { + "f": "683.323782234957" + }, + { + "f": "685.243553008596" + }, + { + "f": "687.163323782235" + }, + { + "f": "689.0830945558739" + }, + { + "f": "691.0028653295128" + }, + { + "f": "692.9226361031518" + }, + { + "f": "694.8424068767908" + }, + { + "f": "696.7621776504297" + }, + { + "f": "698.6819484240688" + }, + { + "f": "700.6017191977078" + }, + { + "f": "702.5214899713467" + }, + { + "f": "704.4412607449856" + }, + { + "f": "706.3610315186247" + }, + { + "f": "708.2808022922636" + }, + { + "f": "710.2005730659025" + }, + { + "f": "712.1203438395415" + }, + { + "f": "714.0401146131805" + }, + { + "f": "715.9598853868195" + }, + { + "f": "717.8796561604585" + }, + { + "f": "719.7994269340975" + }, + { + "f": "721.7191977077364" + }, + { + "f": "723.6389684813753" + }, + { + "f": "725.5587392550143" + }, + { + "f": "727.4785100286533" + }, + { + "f": "729.3982808022922" + }, + { + "f": "731.3180515759312" + }, + { + "f": "733.2378223495703" + }, + { + "f": "735.1575931232092" + }, + { + "f": "737.077363896848" + }, + { + "f": "738.9971346704871" + }, + { + "f": "740.9169054441261" + }, + { + "f": "742.836676217765" + }, + { + "f": "744.756446991404" + }, + { + "f": "746.676217765043" + }, + { + "f": "748.5959885386819" + }, + { + "f": "750.5157593123208" + }, + { + "f": "752.43553008596" + }, + { + "f": "754.3553008595989" + }, + { + "f": "756.2750716332378" + }, + { + "f": "758.1948424068768" + }, + { + "f": "760.1146131805158" + }, + { + "f": "762.0343839541547" + }, + { + "f": "763.9541547277937" + }, + { + "f": "765.8739255014327" + }, + { + "f": "767.7936962750716" + }, + { + "f": "769.7134670487105" + }, + { + "f": "771.6332378223495" + }, + { + "f": "773.5530085959886" + }, + { + "f": "775.4727793696275" + }, + { + "f": "777.3925501432665" + }, + { + "f": "779.3123209169055" + }, + { + "f": "781.2320916905444" + }, + { + "f": "783.1518624641833" + }, + { + "f": "785.0716332378223" + }, + { + "f": "786.9914040114613" + }, + { + "f": "788.9111747851002" + }, + { + "f": "790.8309455587392" + }, + { + "f": "792.7507163323783" + }, + { + "f": "794.6704871060172" + }, + { + "f": "796.5902578796561" + }, + { + "f": "798.5100286532952" + }, + { + "f": "800.4297994269341" + }, + { + "f": "802.349570200573" + }, + { + "f": "804.269340974212" + }, + { + "f": "806.189111747851" + }, + { + "f": "808.1088825214899" + }, + { + "f": "810.028653295129" + }, + { + "f": "811.948424068768" + }, + { + "f": "813.8681948424069" + }, + { + "f": "815.7879656160458" + }, + { + "f": "817.7077363896848" + }, + { + "f": "819.6275071633238" + }, + { + "f": "821.5472779369627" + }, + { + "f": "823.4670487106017" + }, + { + "f": "825.3868194842407" + }, + { + "f": "827.3065902578796" + }, + { + "f": "829.2263610315185" + }, + { + "f": "831.1461318051576" + }, + { + "f": "833.0659025787966" + }, + { + "f": "834.9856733524355" + }, + { + "f": "836.9054441260745" + }, + { + "f": "838.8252148997135" + }, + { + "f": "840.7449856733524" + }, + { + "f": "842.6647564469913" + }, + { + "f": "844.5845272206304" + }, + { + "f": "846.5042979942693" + }, + { + "f": "848.4240687679082" + }, + { + "f": "850.3438395415473" + }, + { + "f": "852.2636103151863" + }, + { + "f": "854.1833810888252" + }, + { + "f": "856.1031518624642" + }, + { + "f": "858.0229226361032" + }, + { + "f": "859.9426934097421" + }, + { + "f": "861.862464183381" + }, + { + "f": "863.78223495702" + }, + { + "f": "865.702005730659" + }, + { + "f": "867.6217765042979" + }, + { + "f": "869.541547277937" + }, + { + "f": "871.461318051576" + }, + { + "f": "873.3810888252149" + }, + { + "f": "875.3008595988538" + }, + { + "f": "877.2206303724929" + }, + { + "f": "879.1404011461318" + }, + { + "f": "881.0601719197707" + }, + { + "f": "882.9799426934097" + }, + { + "f": "884.8997134670487" + }, + { + "f": "886.8194842406876" + }, + { + "f": "888.7392550143267" + }, + { + "f": "890.6590257879657" + }, + { + "f": "892.5787965616046" + }, + { + "f": "894.4985673352436" + }, + { + "f": "896.4183381088825" + }, + { + "f": "898.3381088825215" + }, + { + "f": "900.2578796561604" + }, + { + "f": "902.1776504297994" + }, + { + "f": "904.0974212034383" + }, + { + "f": "906.0171919770773" + }, + { + "f": "907.9369627507164" + }, + { + "f": "909.8567335243553" + }, + { + "f": "911.7765042979943" + }, + { + "f": "913.6962750716332" + }, + { + "f": "915.6160458452722" + }, + { + "f": "917.5358166189112" + }, + { + "f": "919.4555873925501" + }, + { + "f": "921.3753581661891" + }, + { + "f": "923.295128939828" + }, + { + "f": "925.214899713467" + }, + { + "f": "927.134670487106" + }, + { + "f": "929.054441260745" + }, + { + "f": "930.974212034384" + }, + { + "f": "932.8939828080229" + }, + { + "f": "934.8137535816619" + }, + { + "f": "936.7335243553008" + }, + { + "f": "938.6532951289398" + }, + { + "f": "940.5730659025788" + }, + { + "f": "942.4928366762177" + }, + { + "f": "944.4126074498568" + }, + { + "f": "946.3323782234957" + }, + { + "f": "948.2521489971347" + }, + { + "f": "950.1719197707736" + }, + { + "f": "952.0916905444126" + }, + { + "f": "954.0114613180516" + }, + { + "f": "955.9312320916905" + }, + { + "f": "957.8510028653295" + }, + { + "f": "959.7707736389684" + }, + { + "f": "961.6905444126074" + }, + { + "f": "963.6103151862465" + }, + { + "f": "965.5300859598854" + }, + { + "f": "967.4498567335244" + }, + { + "f": "969.3696275071633" + }, + { + "f": "971.2893982808023" + }, + { + "f": "973.2091690544412" + }, + { + "f": "975.1289398280802" + }, + { + "f": "977.0487106017192" + }, + { + "f": "978.9684813753581" + }, + { + "f": "980.8882521489971" + }, + { + "f": "982.808022922636" + }, + { + "f": "984.7277936962751" + }, + { + "f": "986.6475644699141" + }, + { + "f": "988.567335243553" + }, + { + "f": "990.487106017192" + }, + { + "f": "992.4068767908309" + }, + { + "f": "994.3266475644699" + }, + { + "f": "996.2464183381088" + }, + { + "f": "998.1661891117478" + }, + { + "f": "1000.0859598853868" + }, + { + "f": "1002.0057306590257" + }, + { + "f": "1003.9255014326648" + }, + { + "f": "1005.8452722063037" + }, + { + "f": "1007.7650429799427" + }, + { + "f": "1009.6848137535817" + }, + { + "f": "1011.6045845272206" + }, + { + "f": "1013.5243553008596" + }, + { + "f": "1015.4441260744985" + }, + { + "f": "1017.3638968481375" + }, + { + "f": "1019.2836676217764" + }, + { + "f": "1021.2034383954154" + }, + { + "f": "1023.1232091690545" + }, + { + "f": "1025.0429799426934" + }, + { + "f": "1026.9627507163323" + }, + { + "f": "1028.8825214899712" + }, + { + "f": "1030.8022922636103" + }, + { + "f": "1032.7220630372494" + }, + { + "f": "1034.6418338108883" + }, + { + "f": "1036.5616045845272" + }, + { + "f": "1038.4813753581661" + }, + { + "f": "1040.401146131805" + }, + { + "f": "1042.320916905444" + }, + { + "f": "1044.240687679083" + }, + { + "f": "1046.1604584527222" + }, + { + "f": "1048.080229226361" + }, + { + "f": "1050.0" + } + ], + "Voltage_V": { + "f": "230.29359436035156" + }, + "Current_A": { + "f": "0.06537289172410965" + }, + "Power_W": { + "f": "8.406862258911133" + }, + "Freq_Hz": { + "f": "50.02156448364258" + }, + "PF": { + "f": "0.5584115386009216" + } + } + }, + { + "name": "r02", + "source": "usb_capture_20260204_130757_hub1#0", + "harmonics": true, + "keys": [ + "device", + "Phi_lm", + "eta_lm_W", + "CCT_K", + "Duv", + "x", + "y", + "u", + "v", + "u_prime", + "v_prime", + "SDCM", + "Ra", + "R1", + "R2", + "R3", + "R4", + "R5", + "R6", + "R7", + "R8", + "R9", + "R10", + "R11", + "R12", + "R13", + "R14", + "R15", + "Phi_e_mW", + "Phi_euv_mW", + "Phi_eb_mW", + "Phi_ey_mW", + "Phi_er_mW", + "Phi_efr_mW", + "Phi_eir_mW", + "Phi_e_total", + "CIE_X", + "CIE_Y", + "CIE_Z", + "TLCI", + "PeakSignal", + "DarkSignal", + "Compensate", + "test_date", + "test_time", + "spectrum", + "spectrum_nm", + "Voltage_V", + "Current_A", + "Power_W", + "Freq_Hz", + "PF", + "V_harmonics", + "UThd", + "I_harmonics", + "AThd", + "V_waveform", + "I_waveform" + ], + "values": { + "device": "HPCS6500", + "Phi_lm": { + "f": "479.5904235839844" + }, + "eta_lm_W": { + "f": "57.03839111328125" + }, + "CCT_K": { + "f": "5661.3740234375" + }, + "Duv": { + "f": "0.005495334509760141" + }, + "x": { + "f": "0.3286939859390259" + }, + "y": { + "f": "0.34864285588264465" + }, + "u": { + "f": "0.20145727694034576" + }, + "v": { + "f": "0.32052600383758545" + }, + "u_prime": { + "f": "0.20145727694034576" + }, + "v_prime": { + "f": "0.4807890057563782" + }, + "SDCM": { + "f": "4.661009311676025" + }, + "Ra": { + "f": "83.03077697753906" + }, + "R1": { + "f": "82.11673736572266" + }, + "R2": { + "f": "93.9566421508789" + }, + "R3": { + "f": "93.32406616210938" + }, + "R4": { + "f": "76.64042663574219" + }, + "R5": { + "f": "81.5961685180664" + }, + "R6": { + "f": "89.55091094970703" + }, + "R7": { + "f": "83.03118896484375" + }, + "R8": { + "f": "64.03005981445312" + }, + "R9": { + "f": "4.829061031341553" + }, + "R10": { + "f": "84.0609130859375" + }, + "R11": { + "f": "76.2067642211914" + }, + "R12": { + "f": "60.158180236816406" + }, + "R13": { + "f": "86.46263885498047" + }, + "R14": { + "f": "96.80621337890625" + }, + "R15": { + "f": "75.96227264404297" + }, + "Phi_e_mW": { + "f": "1492.0255126953125" + }, + "Phi_euv_mW": { + "f": "0.0" + }, + "Phi_eb_mW": { + "f": "470.2662658691406" + }, + "Phi_ey_mW": { + "f": "679.6720581054688" + }, + "Phi_er_mW": { + "f": "330.6041564941406" + }, + "Phi_efr_mW": { + "f": "11.205649375915527" + }, + "Phi_eir_mW": { + "f": "0.0" + }, + "Phi_e_total": { + "f": "1491.7479248046875" + }, + "CIE_X": { + "f": "662.0042114257812" + }, + "CIE_Y": { + "f": "702.18212890625" + }, + "CIE_Z": { + "f": "649.8577880859375" + }, + "TLCI": { + "f": "67.88436889648438" + }, + "PeakSignal": { + "f": "53165.0" + }, + "DarkSignal": { + "f": "2310.0" + }, + "Compensate": { + "f": "2834.0" + }, + "test_date": "2026-02-04", + "test_time": "16:29:39", + "spectrum": [ + { + "f": "0.0001243700971826911" + }, + { + "f": "0.0032512827310711145" + }, + { + "f": "0.012137440964579582" + }, + { + "f": "0.027741486206650734" + }, + { + "f": "0.04990553483366966" + }, + { + "f": "0.07703348249197006" + }, + { + "f": "0.11300577968358994" + }, + { + "f": "0.15573564171791077" + }, + { + "f": "0.20076626539230347" + }, + { + "f": "0.25153154134750366" + }, + { + "f": "0.30999207496643066" + }, + { + "f": "0.37835678458213806" + }, + { + "f": "0.45773881673812866" + }, + { + "f": "0.5490326881408691" + }, + { + "f": "0.6518341898918152" + }, + { + "f": "0.76610267162323" + }, + { + "f": "0.8964504599571228" + }, + { + "f": "1.044393539428711" + }, + { + "f": "1.2122725248336792" + }, + { + "f": "1.4018479585647583" + }, + { + "f": "1.6114217042922974" + }, + { + "f": "1.8437706232070923" + }, + { + "f": "2.097830057144165" + }, + { + "f": "2.3755345344543457" + }, + { + "f": "2.6784331798553467" + }, + { + "f": "3.0063562393188477" + }, + { + "f": "3.3650834560394287" + }, + { + "f": "3.755402088165283" + }, + { + "f": "4.178037166595459" + }, + { + "f": "4.639193534851074" + }, + { + "f": "5.1989545822143555" + }, + { + "f": "5.811175346374512" + }, + { + "f": "6.422849655151367" + }, + { + "f": "7.095149040222168" + }, + { + "f": "7.824784755706787" + }, + { + "f": "8.608233451843262" + }, + { + "f": "9.431559562683105" + }, + { + "f": "10.275625228881836" + }, + { + "f": "11.114548683166504" + }, + { + "f": "11.91490650177002" + }, + { + "f": "12.632709503173828" + }, + { + "f": "13.222977638244629" + }, + { + "f": "13.6466646194458" + }, + { + "f": "13.861893653869629" + }, + { + "f": "13.860157012939453" + }, + { + "f": "13.656041145324707" + }, + { + "f": "13.27597427368164" + }, + { + "f": "12.762628555297852" + }, + { + "f": "12.157581329345703" + }, + { + "f": "11.504962921142578" + }, + { + "f": "10.853554725646973" + }, + { + "f": "10.233413696289062" + }, + { + "f": "9.667533874511719" + }, + { + "f": "9.164560317993164" + }, + { + "f": "8.720627784729004" + }, + { + "f": "8.329019546508789" + }, + { + "f": "7.979335784912109" + }, + { + "f": "7.6604228019714355" + }, + { + "f": "7.361161231994629" + }, + { + "f": "7.072948455810547" + }, + { + "f": "6.7888689041137695" + }, + { + "f": "6.509037494659424" + }, + { + "f": "6.238415718078613" + }, + { + "f": "5.981047630310059" + }, + { + "f": "5.739508628845215" + }, + { + "f": "5.514701843261719" + }, + { + "f": "5.30023717880249" + }, + { + "f": "5.110308647155762" + }, + { + "f": "4.947151184082031" + }, + { + "f": "4.81164026260376" + }, + { + "f": "4.704124450683594" + }, + { + "f": "4.623203754425049" + }, + { + "f": "4.564770698547363" + }, + { + "f": "4.527156352996826" + }, + { + "f": "4.497572898864746" + }, + { + "f": "4.4857401847839355" + }, + { + "f": "4.493281841278076" + }, + { + "f": "4.509749412536621" + }, + { + "f": "4.534407138824463" + }, + { + "f": "4.565922737121582" + }, + { + "f": "4.603116989135742" + }, + { + "f": "4.6460113525390625" + }, + { + "f": "4.693967819213867" + }, + { + "f": "4.749835014343262" + }, + { + "f": "4.8128981590271" + }, + { + "f": "4.88137149810791" + }, + { + "f": "4.9545769691467285" + }, + { + "f": "5.030944347381592" + }, + { + "f": "5.110267639160156" + }, + { + "f": "5.193228721618652" + }, + { + "f": "5.278942108154297" + }, + { + "f": "5.36573600769043" + }, + { + "f": "5.451056957244873" + }, + { + "f": "5.5340094566345215" + }, + { + "f": "5.613194942474365" + }, + { + "f": "5.690127372741699" + }, + { + "f": "5.764080047607422" + }, + { + "f": "5.835245609283447" + }, + { + "f": "5.903772354125977" + }, + { + "f": "5.968437671661377" + }, + { + "f": "6.027576446533203" + }, + { + "f": "6.080965518951416" + }, + { + "f": "6.129768371582031" + }, + { + "f": "6.175669193267822" + }, + { + "f": "6.2189130783081055" + }, + { + "f": "6.259222984313965" + }, + { + "f": "6.294785976409912" + }, + { + "f": "6.326983451843262" + }, + { + "f": "6.35761833190918" + }, + { + "f": "6.385616302490234" + }, + { + "f": "6.412233829498291" + }, + { + "f": "6.441153049468994" + }, + { + "f": "6.467690944671631" + }, + { + "f": "6.489528656005859" + }, + { + "f": "6.509487628936768" + }, + { + "f": "6.527669429779053" + }, + { + "f": "6.546085834503174" + }, + { + "f": "6.565158843994141" + }, + { + "f": "6.586619853973389" + }, + { + "f": "6.61081075668335" + }, + { + "f": "6.635824680328369" + }, + { + "f": "6.662163734436035" + }, + { + "f": "6.689615249633789" + }, + { + "f": "6.71878719329834" + }, + { + "f": "6.7495598793029785" + }, + { + "f": "6.7791571617126465" + }, + { + "f": "6.806814670562744" + }, + { + "f": "6.834866046905518" + }, + { + "f": "6.863710403442383" + }, + { + "f": "6.8941473960876465" + }, + { + "f": "6.925388336181641" + }, + { + "f": "6.953792095184326" + }, + { + "f": "6.980661392211914" + }, + { + "f": "7.0070672035217285" + }, + { + "f": "7.03272819519043" + }, + { + "f": "7.057784080505371" + }, + { + "f": "7.080912113189697" + }, + { + "f": "7.101639270782471" + }, + { + "f": "7.120558738708496" + }, + { + "f": "7.139038562774658" + }, + { + "f": "7.156932353973389" + }, + { + "f": "7.173377513885498" + }, + { + "f": "7.1881608963012695" + }, + { + "f": "7.202514171600342" + }, + { + "f": "7.216991901397705" + }, + { + "f": "7.231939315795898" + }, + { + "f": "7.246293544769287" + }, + { + "f": "7.259352684020996" + }, + { + "f": "7.272000312805176" + }, + { + "f": "7.284794807434082" + }, + { + "f": "7.297682762145996" + }, + { + "f": "7.3115315437316895" + }, + { + "f": "7.32651424407959" + }, + { + "f": "7.342409610748291" + }, + { + "f": "7.358125686645508" + }, + { + "f": "7.373204708099365" + }, + { + "f": "7.389715194702148" + }, + { + "f": "7.41038179397583" + }, + { + "f": "7.438098430633545" + }, + { + "f": "7.466434478759766" + }, + { + "f": "7.489097595214844" + }, + { + "f": "7.505233287811279" + }, + { + "f": "7.51546573638916" + }, + { + "f": "7.52156400680542" + }, + { + "f": "7.5233659744262695" + }, + { + "f": "7.521650314331055" + }, + { + "f": "7.516630172729492" + }, + { + "f": "7.508793830871582" + }, + { + "f": "7.49846076965332" + }, + { + "f": "7.487044811248779" + }, + { + "f": "7.474906921386719" + }, + { + "f": "7.462644100189209" + }, + { + "f": "7.449568748474121" + }, + { + "f": "7.432219982147217" + }, + { + "f": "7.409575939178467" + }, + { + "f": "7.38245964050293" + }, + { + "f": "7.352193832397461" + }, + { + "f": "7.320746898651123" + }, + { + "f": "7.287636756896973" + }, + { + "f": "7.251523494720459" + }, + { + "f": "7.212021827697754" + }, + { + "f": "7.168947219848633" + }, + { + "f": "7.125551700592041" + }, + { + "f": "7.093477249145508" + }, + { + "f": "7.060227394104004" + }, + { + "f": "7.013303279876709" + }, + { + "f": "6.960612773895264" + }, + { + "f": "6.9033379554748535" + }, + { + "f": "6.84409236907959" + }, + { + "f": "6.783590793609619" + }, + { + "f": "6.720737934112549" + }, + { + "f": "6.654520034790039" + }, + { + "f": "6.586090564727783" + }, + { + "f": "6.515477180480957" + }, + { + "f": "6.44291877746582" + }, + { + "f": "6.367424011230469" + }, + { + "f": "6.288345813751221" + }, + { + "f": "6.206958770751953" + }, + { + "f": "6.124075889587402" + }, + { + "f": "6.04174280166626" + }, + { + "f": "5.960176944732666" + }, + { + "f": "5.87764310836792" + }, + { + "f": "5.7949652671813965" + }, + { + "f": "5.724981307983398" + }, + { + "f": "5.653476715087891" + }, + { + "f": "5.566742897033691" + }, + { + "f": "5.479261875152588" + }, + { + "f": "5.392475128173828" + }, + { + "f": "5.305967807769775" + }, + { + "f": "5.2197370529174805" + }, + { + "f": "5.1329193115234375" + }, + { + "f": "5.045190811157227" + }, + { + "f": "4.9583611488342285" + }, + { + "f": "4.872622013092041" + }, + { + "f": "4.7866363525390625" + }, + { + "f": "4.701251029968262" + }, + { + "f": "4.616371154785156" + }, + { + "f": "4.531428337097168" + }, + { + "f": "4.44683313369751" + }, + { + "f": "4.3616437911987305" + }, + { + "f": "4.274501323699951" + }, + { + "f": "4.201410293579102" + }, + { + "f": "4.128857135772705" + }, + { + "f": "4.0432939529418945" + }, + { + "f": "3.958092451095581" + }, + { + "f": "3.8716390132904053" + }, + { + "f": "3.7835564613342285" + }, + { + "f": "3.6954636573791504" + }, + { + "f": "3.6080679893493652" + }, + { + "f": "3.522736072540283" + }, + { + "f": "3.4390106201171875" + }, + { + "f": "3.3565330505371094" + }, + { + "f": "3.274026870727539" + }, + { + "f": "3.1906816959381104" + }, + { + "f": "3.1071574687957764" + }, + { + "f": "3.0240094661712646" + }, + { + "f": "2.953989028930664" + }, + { + "f": "2.885197401046753" + }, + { + "f": "2.806143045425415" + }, + { + "f": "2.727999687194824" + }, + { + "f": "2.651399612426758" + }, + { + "f": "2.5759434700012207" + }, + { + "f": "2.501807451248169" + }, + { + "f": "2.429224729537964" + }, + { + "f": "2.3573646545410156" + }, + { + "f": "2.2869858741760254" + }, + { + "f": "2.2186617851257324" + }, + { + "f": "2.1527483463287354" + }, + { + "f": "2.089843273162842" + }, + { + "f": "2.0290019512176514" + }, + { + "f": "1.9779424667358398" + }, + { + "f": "1.9275447130203247" + }, + { + "f": "1.869681477546692" + }, + { + "f": "1.8132187128067017" + }, + { + "f": "1.7582694292068481" + }, + { + "f": "1.7045379877090454" + }, + { + "f": "1.6516298055648804" + }, + { + "f": "1.5998014211654663" + }, + { + "f": "1.5482993125915527" + }, + { + "f": "1.4981107711791992" + }, + { + "f": "1.4498218297958374" + }, + { + "f": "1.4031208753585815" + }, + { + "f": "1.3584867715835571" + }, + { + "f": "1.3205045461654663" + }, + { + "f": "1.2828799486160278" + }, + { + "f": "1.2400692701339722" + }, + { + "f": "1.1975815296173096" + }, + { + "f": "1.1560946702957153" + }, + { + "f": "1.115478277206421" + }, + { + "f": "1.075560212135315" + }, + { + "f": "1.0367223024368286" + }, + { + "f": "0.9987430572509766" + }, + { + "f": "0.9613146781921387" + }, + { + "f": "0.924942135810852" + }, + { + "f": "0.8897154927253723" + }, + { + "f": "0.8554232716560364" + }, + { + "f": "0.8269544243812561" + }, + { + "f": "0.7989344596862793" + }, + { + "f": "0.7672690749168396" + }, + { + "f": "0.736873984336853" + }, + { + "f": "0.707127571105957" + }, + { + "f": "0.6787131428718567" + }, + { + "f": "0.6519750356674194" + }, + { + "f": "0.6265507340431213" + }, + { + "f": "0.602139413356781" + }, + { + "f": "0.5781095623970032" + }, + { + "f": "0.5534688830375671" + }, + { + "f": "0.5324038863182068" + }, + { + "f": "0.5120566487312317" + }, + { + "f": "0.4891791343688965" + }, + { + "f": "0.46782490611076355" + }, + { + "f": "0.44780707359313965" + }, + { + "f": "0.4293953776359558" + }, + { + "f": "0.41206079721450806" + }, + { + "f": "0.395607590675354" + }, + { + "f": "0.3797534108161926" + }, + { + "f": "0.3642752170562744" + }, + { + "f": "0.34977734088897705" + }, + { + "f": "0.33497217297554016" + }, + { + "f": "0.3217671513557434" + }, + { + "f": "0.3085041046142578" + }, + { + "f": "0.29283055663108826" + }, + { + "f": "0.2768459618091583" + }, + { + "f": "0.2612651586532593" + }, + { + "f": "0.2461346536874771" + }, + { + "f": "0.23145164549350739" + }, + { + "f": "0.21781836450099945" + }, + { + "f": "0.2051093727350235" + }, + { + "f": "0.19336619973182678" + }, + { + "f": "0.18464961647987366" + }, + { + "f": "0.17689435184001923" + }, + { + "f": "0.16852933168411255" + }, + { + "f": "0.1609082967042923" + }, + { + "f": "0.15411126613616943" + }, + { + "f": "0.1475057452917099" + }, + { + "f": "0.1405080109834671" + }, + { + "f": "0.1336326152086258" + }, + { + "f": "0.126814603805542" + }, + { + "f": "0.1203402578830719" + }, + { + "f": "0.11525984853506088" + }, + { + "f": "0.11021679639816284" + }, + { + "f": "0.10431938618421555" + }, + { + "f": "0.09867406636476517" + }, + { + "f": "0.09316820651292801" + }, + { + "f": "0.08727356791496277" + }, + { + "f": "0.08099933713674545" + }, + { + "f": "0.07483004778623581" + }, + { + "f": "0.06936401128768921" + }, + { + "f": "0.06474901735782623" + }, + { + "f": "0.06146140396595001" + }, + { + "f": "0.05824131891131401" + }, + { + "f": "0.054119765758514404" + }, + { + "f": "0.05018780380487442" + }, + { + "f": "0.046140678226947784" + }, + { + "f": "0.04252378270030022" + }, + { + "f": "0.03893665596842766" + }, + { + "f": "0.03482336178421974" + }, + { + "f": "0.03074120730161667" + }, + { + "f": "0.027150031179189682" + }, + { + "f": "0.024748170748353004" + }, + { + "f": "0.02248377725481987" + }, + { + "f": "0.019864752888679504" + }, + { + "f": "0.017176862806081772" + }, + { + "f": "0.014046492986381054" + }, + { + "f": "0.011077369563281536" + }, + { + "f": "0.007853473536670208" + }, + { + "f": "0.004727139137685299" + }, + { + "f": "0.002120141638442874" + }, + { + "f": "0.0007204814464785159" + }, + { + "f": "8.168820932041854e-05" + } + ], + "spectrum_nm": [ + { + "f": "380.0" + }, + { + "f": "381.91977077363896" + }, + { + "f": "383.8395415472779" + }, + { + "f": "385.75931232091693" + }, + { + "f": "387.6790830945559" + }, + { + "f": "389.59885386819485" + }, + { + "f": "391.5186246418338" + }, + { + "f": "393.43839541547277" + }, + { + "f": "395.3581661891117" + }, + { + "f": "397.2779369627507" + }, + { + "f": "399.1977077363897" + }, + { + "f": "401.11747851002866" + }, + { + "f": "403.0372492836676" + }, + { + "f": "404.9570200573066" + }, + { + "f": "406.87679083094554" + }, + { + "f": "408.79656160458455" + }, + { + "f": "410.7163323782235" + }, + { + "f": "412.63610315186247" + }, + { + "f": "414.55587392550143" + }, + { + "f": "416.4756446991404" + }, + { + "f": "418.39541547277935" + }, + { + "f": "420.3151862464183" + }, + { + "f": "422.2349570200573" + }, + { + "f": "424.1547277936963" + }, + { + "f": "426.07449856733524" + }, + { + "f": "427.9942693409742" + }, + { + "f": "429.91404011461316" + }, + { + "f": "431.8338108882522" + }, + { + "f": "433.75358166189113" + }, + { + "f": "435.6733524355301" + }, + { + "f": "437.59312320916905" + }, + { + "f": "439.512893982808" + }, + { + "f": "441.43266475644697" + }, + { + "f": "443.3524355300859" + }, + { + "f": "445.27220630372494" + }, + { + "f": "447.1919770773639" + }, + { + "f": "449.11174785100286" + }, + { + "f": "451.0315186246418" + }, + { + "f": "452.9512893982808" + }, + { + "f": "454.8710601719198" + }, + { + "f": "456.79083094555875" + }, + { + "f": "458.7106017191977" + }, + { + "f": "460.63037249283667" + }, + { + "f": "462.55014326647563" + }, + { + "f": "464.46991404011465" + }, + { + "f": "466.38968481375355" + }, + { + "f": "468.30945558739256" + }, + { + "f": "470.2292263610315" + }, + { + "f": "472.1489971346705" + }, + { + "f": "474.06876790830944" + }, + { + "f": "475.9885386819484" + }, + { + "f": "477.9083094555874" + }, + { + "f": "479.8280802292264" + }, + { + "f": "481.74785100286533" + }, + { + "f": "483.6676217765043" + }, + { + "f": "485.58739255014325" + }, + { + "f": "487.50716332378227" + }, + { + "f": "489.42693409742117" + }, + { + "f": "491.3467048710602" + }, + { + "f": "493.26647564469914" + }, + { + "f": "495.1862464183381" + }, + { + "f": "497.10601719197706" + }, + { + "f": "499.025787965616" + }, + { + "f": "500.94555873925503" + }, + { + "f": "502.865329512894" + }, + { + "f": "504.78510028653295" + }, + { + "f": "506.7048710601719" + }, + { + "f": "508.62464183381087" + }, + { + "f": "510.5444126074499" + }, + { + "f": "512.4641833810888" + }, + { + "f": "514.3839541547278" + }, + { + "f": "516.3037249283668" + }, + { + "f": "518.2234957020057" + }, + { + "f": "520.1432664756447" + }, + { + "f": "522.0630372492836" + }, + { + "f": "523.9828080229227" + }, + { + "f": "525.9025787965616" + }, + { + "f": "527.8223495702006" + }, + { + "f": "529.7421203438396" + }, + { + "f": "531.6618911174785" + }, + { + "f": "533.5816618911175" + }, + { + "f": "535.5014326647564" + }, + { + "f": "537.4212034383954" + }, + { + "f": "539.3409742120343" + }, + { + "f": "541.2607449856733" + }, + { + "f": "543.1805157593124" + }, + { + "f": "545.1002865329513" + }, + { + "f": "547.0200573065903" + }, + { + "f": "548.9398280802293" + }, + { + "f": "550.8595988538682" + }, + { + "f": "552.7793696275071" + }, + { + "f": "554.6991404011461" + }, + { + "f": "556.6189111747851" + }, + { + "f": "558.538681948424" + }, + { + "f": "560.458452722063" + }, + { + "f": "562.3782234957021" + }, + { + "f": "564.297994269341" + }, + { + "f": "566.21776504298" + }, + { + "f": "568.1375358166189" + }, + { + "f": "570.0573065902579" + }, + { + "f": "571.9770773638968" + }, + { + "f": "573.8968481375358" + }, + { + "f": "575.8166189111748" + }, + { + "f": "577.7363896848137" + }, + { + "f": "579.6561604584527" + }, + { + "f": "581.5759312320916" + }, + { + "f": "583.4957020057307" + }, + { + "f": "585.4154727793696" + }, + { + "f": "587.3352435530086" + }, + { + "f": "589.2550143266476" + }, + { + "f": "591.1747851002865" + }, + { + "f": "593.0945558739255" + }, + { + "f": "595.0143266475645" + }, + { + "f": "596.9340974212034" + }, + { + "f": "598.8538681948423" + }, + { + "f": "600.7736389684814" + }, + { + "f": "602.6934097421204" + }, + { + "f": "604.6131805157593" + }, + { + "f": "606.5329512893983" + }, + { + "f": "608.4527220630373" + }, + { + "f": "610.3724928366762" + }, + { + "f": "612.2922636103152" + }, + { + "f": "614.2120343839541" + }, + { + "f": "616.1318051575931" + }, + { + "f": "618.051575931232" + }, + { + "f": "619.971346704871" + }, + { + "f": "621.8911174785101" + }, + { + "f": "623.810888252149" + }, + { + "f": "625.730659025788" + }, + { + "f": "627.6504297994269" + }, + { + "f": "629.5702005730659" + }, + { + "f": "631.4899713467048" + }, + { + "f": "633.4097421203438" + }, + { + "f": "635.3295128939828" + }, + { + "f": "637.2492836676217" + }, + { + "f": "639.1690544412608" + }, + { + "f": "641.0888252148998" + }, + { + "f": "643.0085959885387" + }, + { + "f": "644.9283667621776" + }, + { + "f": "646.8481375358166" + }, + { + "f": "648.7679083094556" + }, + { + "f": "650.6876790830945" + }, + { + "f": "652.6074498567335" + }, + { + "f": "654.5272206303725" + }, + { + "f": "656.4469914040114" + }, + { + "f": "658.3667621776503" + }, + { + "f": "660.2865329512895" + }, + { + "f": "662.2063037249284" + }, + { + "f": "664.1260744985673" + }, + { + "f": "666.0458452722063" + }, + { + "f": "667.9656160458453" + }, + { + "f": "669.8853868194842" + }, + { + "f": "671.8051575931232" + }, + { + "f": "673.7249283667622" + }, + { + "f": "675.6446991404011" + }, + { + "f": "677.56446991404" + }, + { + "f": "679.4842406876791" + }, + { + "f": "681.4040114613181" + }, + { + "f": "683.323782234957" + }, + { + "f": "685.243553008596" + }, + { + "f": "687.163323782235" + }, + { + "f": "689.0830945558739" + }, + { + "f": "691.0028653295128" + }, + { + "f": "692.9226361031518" + }, + { + "f": "694.8424068767908" + }, + { + "f": "696.7621776504297" + }, + { + "f": "698.6819484240688" + }, + { + "f": "700.6017191977078" + }, + { + "f": "702.5214899713467" + }, + { + "f": "704.4412607449856" + }, + { + "f": "706.3610315186247" + }, + { + "f": "708.2808022922636" + }, + { + "f": "710.2005730659025" + }, + { + "f": "712.1203438395415" + }, + { + "f": "714.0401146131805" + }, + { + "f": "715.9598853868195" + }, + { + "f": "717.8796561604585" + }, + { + "f": "719.7994269340975" + }, + { + "f": "721.7191977077364" + }, + { + "f": "723.6389684813753" + }, + { + "f": "725.5587392550143" + }, + { + "f": "727.4785100286533" + }, + { + "f": "729.3982808022922" + }, + { + "f": "731.3180515759312" + }, + { + "f": "733.2378223495703" + }, + { + "f": "735.1575931232092" + }, + { + "f": "737.077363896848" + }, + { + "f": "738.9971346704871" + }, + { + "f": "740.9169054441261" + }, + { + "f": "742.836676217765" + }, + { + "f": "744.756446991404" + }, + { + "f": "746.676217765043" + }, + { + "f": "748.5959885386819" + }, + { + "f": "750.5157593123208" + }, + { + "f": "752.43553008596" + }, + { + "f": "754.3553008595989" + }, + { + "f": "756.2750716332378" + }, + { + "f": "758.1948424068768" + }, + { + "f": "760.1146131805158" + }, + { + "f": "762.0343839541547" + }, + { + "f": "763.9541547277937" + }, + { + "f": "765.8739255014327" + }, + { + "f": "767.7936962750716" + }, + { + "f": "769.7134670487105" + }, + { + "f": "771.6332378223495" + }, + { + "f": "773.5530085959886" + }, + { + "f": "775.4727793696275" + }, + { + "f": "777.3925501432665" + }, + { + "f": "779.3123209169055" + }, + { + "f": "781.2320916905444" + }, + { + "f": "783.1518624641833" + }, + { + "f": "785.0716332378223" + }, + { + "f": "786.9914040114613" + }, + { + "f": "788.9111747851002" + }, + { + "f": "790.8309455587392" + }, + { + "f": "792.7507163323783" + }, + { + "f": "794.6704871060172" + }, + { + "f": "796.5902578796561" + }, + { + "f": "798.5100286532952" + }, + { + "f": "800.4297994269341" + }, + { + "f": "802.349570200573" + }, + { + "f": "804.269340974212" + }, + { + "f": "806.189111747851" + }, + { + "f": "808.1088825214899" + }, + { + "f": "810.028653295129" + }, + { + "f": "811.948424068768" + }, + { + "f": "813.8681948424069" + }, + { + "f": "815.7879656160458" + }, + { + "f": "817.7077363896848" + }, + { + "f": "819.6275071633238" + }, + { + "f": "821.5472779369627" + }, + { + "f": "823.4670487106017" + }, + { + "f": "825.3868194842407" + }, + { + "f": "827.3065902578796" + }, + { + "f": "829.2263610315185" + }, + { + "f": "831.1461318051576" + }, + { + "f": "833.0659025787966" + }, + { + "f": "834.9856733524355" + }, + { + "f": "836.9054441260745" + }, + { + "f": "838.8252148997135" + }, + { + "f": "840.7449856733524" + }, + { + "f": "842.6647564469913" + }, + { + "f": "844.5845272206304" + }, + { + "f": "846.5042979942693" + }, + { + "f": "848.4240687679082" + }, + { + "f": "850.3438395415473" + }, + { + "f": "852.2636103151863" + }, + { + "f": "854.1833810888252" + }, + { + "f": "856.1031518624642" + }, + { + "f": "858.0229226361032" + }, + { + "f": "859.9426934097421" + }, + { + "f": "861.862464183381" + }, + { + "f": "863.78223495702" + }, + { + "f": "865.702005730659" + }, + { + "f": "867.6217765042979" + }, + { + "f": "869.541547277937" + }, + { + "f": "871.461318051576" + }, + { + "f": "873.3810888252149" + }, + { + "f": "875.3008595988538" + }, + { + "f": "877.2206303724929" + }, + { + "f": "879.1404011461318" + }, + { + "f": "881.0601719197707" + }, + { + "f": "882.9799426934097" + }, + { + "f": "884.8997134670487" + }, + { + "f": "886.8194842406876" + }, + { + "f": "888.7392550143267" + }, + { + "f": "890.6590257879657" + }, + { + "f": "892.5787965616046" + }, + { + "f": "894.4985673352436" + }, + { + "f": "896.4183381088825" + }, + { + "f": "898.3381088825215" + }, + { + "f": "900.2578796561604" + }, + { + "f": "902.1776504297994" + }, + { + "f": "904.0974212034383" + }, + { + "f": "906.0171919770773" + }, + { + "f": "907.9369627507164" + }, + { + "f": "909.8567335243553" + }, + { + "f": "911.7765042979943" + }, + { + "f": "913.6962750716332" + }, + { + "f": "915.6160458452722" + }, + { + "f": "917.5358166189112" + }, + { + "f": "919.4555873925501" + }, + { + "f": "921.3753581661891" + }, + { + "f": "923.295128939828" + }, + { + "f": "925.214899713467" + }, + { + "f": "927.134670487106" + }, + { + "f": "929.054441260745" + }, + { + "f": "930.974212034384" + }, + { + "f": "932.8939828080229" + }, + { + "f": "934.8137535816619" + }, + { + "f": "936.7335243553008" + }, + { + "f": "938.6532951289398" + }, + { + "f": "940.5730659025788" + }, + { + "f": "942.4928366762177" + }, + { + "f": "944.4126074498568" + }, + { + "f": "946.3323782234957" + }, + { + "f": "948.2521489971347" + }, + { + "f": "950.1719197707736" + }, + { + "f": "952.0916905444126" + }, + { + "f": "954.0114613180516" + }, + { + "f": "955.9312320916905" + }, + { + "f": "957.8510028653295" + }, + { + "f": "959.7707736389684" + }, + { + "f": "961.6905444126074" + }, + { + "f": "963.6103151862465" + }, + { + "f": "965.5300859598854" + }, + { + "f": "967.4498567335244" + }, + { + "f": "969.3696275071633" + }, + { + "f": "971.2893982808023" + }, + { + "f": "973.2091690544412" + }, + { + "f": "975.1289398280802" + }, + { + "f": "977.0487106017192" + }, + { + "f": "978.9684813753581" + }, + { + "f": "980.8882521489971" + }, + { + "f": "982.808022922636" + }, + { + "f": "984.7277936962751" + }, + { + "f": "986.6475644699141" + }, + { + "f": "988.567335243553" + }, + { + "f": "990.487106017192" + }, + { + "f": "992.4068767908309" + }, + { + "f": "994.3266475644699" + }, + { + "f": "996.2464183381088" + }, + { + "f": "998.1661891117478" + }, + { + "f": "1000.0859598853868" + }, + { + "f": "1002.0057306590257" + }, + { + "f": "1003.9255014326648" + }, + { + "f": "1005.8452722063037" + }, + { + "f": "1007.7650429799427" + }, + { + "f": "1009.6848137535817" + }, + { + "f": "1011.6045845272206" + }, + { + "f": "1013.5243553008596" + }, + { + "f": "1015.4441260744985" + }, + { + "f": "1017.3638968481375" + }, + { + "f": "1019.2836676217764" + }, + { + "f": "1021.2034383954154" + }, + { + "f": "1023.1232091690545" + }, + { + "f": "1025.0429799426934" + }, + { + "f": "1026.9627507163323" + }, + { + "f": "1028.8825214899712" + }, + { + "f": "1030.8022922636103" + }, + { + "f": "1032.7220630372494" + }, + { + "f": "1034.6418338108883" + }, + { + "f": "1036.5616045845272" + }, + { + "f": "1038.4813753581661" + }, + { + "f": "1040.401146131805" + }, + { + "f": "1042.320916905444" + }, + { + "f": "1044.240687679083" + }, + { + "f": "1046.1604584527222" + }, + { + "f": "1048.080229226361" + }, + { + "f": "1050.0" + } + ], + "Voltage_V": { + "f": "230.289794921875" + }, + "Current_A": { + "f": "0.06533221900463104" + }, + "Power_W": { + "f": "8.404895782470703" + }, + "Freq_Hz": { + "f": "50.02182388305664" + }, + "PF": { + "f": "0.5585951805114746" + }, + "V_harmonics": [ + { + "f": "100.0" + }, + { + "f": "0.3370094895362854" + }, + { + "f": "0.45873573422431946" + }, + { + "f": "0.1953461915254593" + }, + { + "f": "0.16264618933200836" + }, + { + "f": "0.10606563836336136" + }, + { + "f": "0.18002712726593018" + }, + { + "f": "0.05133896321058273" + }, + { + "f": "0.2902267277240753" + }, + { + "f": "0.04469216614961624" + }, + { + "f": "0.24768052995204926" + }, + { + "f": "0.002345734043046832" + }, + { + "f": "0.18607212603092194" + }, + { + "f": "0.006307718809694052" + }, + { + "f": "0.11829172819852829" + }, + { + "f": "0.01552392914891243" + }, + { + "f": "0.12394212931394577" + }, + { + "f": "0.014938616193830967" + }, + { + "f": "0.058952346444129944" + }, + { + "f": "0.007981196977198124" + }, + { + "f": "0.04646911844611168" + }, + { + "f": "0.0001789444067981094" + }, + { + "f": "0.021692654117941856" + }, + { + "f": "0.007891503162682056" + }, + { + "f": "0.018477726727724075" + }, + { + "f": "0.0075658224523067474" + }, + { + "f": "0.026464218273758888" + }, + { + "f": "0.0027150462847203016" + }, + { + "f": "0.013608989305794239" + }, + { + "f": "0.006588586140424013" + }, + { + "f": "0.027468964457511902" + }, + { + "f": "0.004170473199337721" + }, + { + "f": "0.014578674919903278" + }, + { + "f": "0.01291683129966259" + }, + { + "f": "0.016357073560357094" + }, + { + "f": "0.008036517538130283" + }, + { + "f": "0.012766135856509209" + }, + { + "f": "0.006607217248529196" + }, + { + "f": "0.019382918253540993" + }, + { + "f": "0.009183086454868317" + }, + { + "f": "0.00855016428977251" + }, + { + "f": "0.00191094062756747" + }, + { + "f": "0.017044665291905403" + }, + { + "f": "0.005677135195583105" + }, + { + "f": "0.013780717737972736" + }, + { + "f": "0.0013312323717400432" + }, + { + "f": "0.008347082883119583" + }, + { + "f": "0.004342800471931696" + }, + { + "f": "0.026611750945448875" + }, + { + "f": "0.006742819212377071" + } + ], + "UThd": { + "f": "0.8112547993659973" + }, + "I_harmonics": [ + { + "f": "100.0" + }, + { + "f": "1.1245448589324951" + }, + { + "f": "77.337646484375" + }, + { + "f": "1.371403694152832" + }, + { + "f": "54.7943000793457" + }, + { + "f": "1.2290586233139038" + }, + { + "f": "35.38399887084961" + }, + { + "f": "1.1565972566604614" + }, + { + "f": "25.630525588989258" + }, + { + "f": "1.380294680595398" + }, + { + "f": "20.658836364746094" + }, + { + "f": "1.3434771299362183" + }, + { + "f": "14.472214698791504" + }, + { + "f": "0.8882644772529602" + }, + { + "f": "8.22793960571289" + }, + { + "f": "0.4149932265281677" + }, + { + "f": "5.856985092163086" + }, + { + "f": "0.41883379220962524" + }, + { + "f": "5.505893707275391" + }, + { + "f": "0.6645488142967224" + }, + { + "f": "5.345402717590332" + }, + { + "f": "0.5911809206008911" + }, + { + "f": "5.732526779174805" + }, + { + "f": "0.5132110118865967" + }, + { + "f": "5.06308126449585" + }, + { + "f": "0.5358573794364929" + }, + { + "f": "4.056782245635986" + }, + { + "f": "0.666509747505188" + }, + { + "f": "3.8878321647644043" + }, + { + "f": "0.6506479978561401" + }, + { + "f": "3.9865949153900146" + }, + { + "f": "0.6108392477035522" + }, + { + "f": "3.3680503368377686" + }, + { + "f": "0.5727096796035767" + }, + { + "f": "2.7296295166015625" + }, + { + "f": "0.65972501039505" + }, + { + "f": "2.9302003383636475" + }, + { + "f": "0.6761002540588379" + }, + { + "f": "2.920140027999878" + }, + { + "f": "0.5631870627403259" + }, + { + "f": "2.7267050743103027" + }, + { + "f": "0.5785300135612488" + }, + { + "f": "2.7860965728759766" + }, + { + "f": "0.603581964969635" + }, + { + "f": "2.788695812225342" + }, + { + "f": "0.6251001954078674" + }, + { + "f": "2.563530683517456" + }, + { + "f": "0.5767498016357422" + }, + { + "f": "2.399686813354492" + }, + { + "f": "0.5807647109031677" + } + ], + "AThd": { + "f": "109.011474609375" + }, + "V_waveform": [ + 351, + 557, + 732, + 937, + 1129, + 1319, + 1517, + 1723, + 1896, + 2084, + 2274, + 2454, + 2631, + 2776, + 2934, + 3085, + 3199, + 3268, + 3432, + 3564, + 3701, + 3796, + 3937, + 4032, + 4086, + 4137, + 4193, + 4219, + 4248, + 4250, + 4263, + 4279, + 4265, + 4257, + 4251, + 4213, + 4170, + 4112, + 4041, + 3966, + 3885, + 3780, + 3671, + 3549, + 3426, + 3290, + 3132, + 2991, + 2829, + 2655, + 2483, + 2320, + 2150, + 1955, + 1754, + 1569, + 1361, + 1172, + 974, + 760, + 556, + 349, + 141, + -73, + -290, + -500, + -712, + -924, + -1119, + -1333, + -1524, + -1719, + -1918, + -2102, + -2284, + -2463, + -2633, + -2786, + -2956, + -3095, + -3211, + -3311, + -3443, + -3579, + -3714, + -3848, + -3956, + -4036, + -4110, + -4162, + -4193, + -4213, + -4257, + -4275, + -4271, + -4281, + -4266, + -4252, + -4248, + -4201, + -4158, + -4122, + -4048, + -3967, + -3855, + -3803, + -3673, + -3554, + -3426, + -3294, + -3128, + -3001, + -2820, + -2651, + -2492, + -2304, + -2118, + -1927, + -1709, + -1515, + -1321, + -1116, + -910, + -707, + -486, + -301, + -72, + 135 + ], + "I_waveform": [ + 424, + 470, + 352, + 365, + 515, + 316, + 417, + 405, + 376, + 548, + 247, + 353, + 551, + 155, + 339, + 301, + 6235, + 6923, + 7938, + 8185, + 8270, + 8014, + 6884, + 5849, + 4852, + 3800, + 3328, + 2777, + 2434, + 2223, + 1624, + 1402, + 943, + 603, + 377, + -159, + 98, + -306, + -82, + -60, + -341, + -28, + -371, + -352, + -61, + -467, + -292, + -195, + -461, + -234, + -458, + -413, + -189, + -529, + -441, + -353, + -461, + -377, + -438, + -409, + -419, + -499, + -462, + -447, + -435, + -452, + -406, + -419, + -552, + -300, + -382, + -502, + -289, + -457, + -356, + -330, + -542, + -188, + -316, + -1504, + -6487, + -7086, + -8169, + -8403, + -8189, + -7918, + -6765, + -5694, + -4738, + -3721, + -3301, + -2889, + -2471, + -2272, + -1586, + -1151, + -876, + -482, + -313, + 235, + -111, + 247, + 202, + -52, + 321, + 121, + 187, + 385, + 93, + 434, + 358, + 72, + 503, + 347, + 293, + 379, + 294, + 517, + 436, + 250, + 518, + 461, + 387, + 448, + 411, + 439, + 420, + 462 + ] + } + }, + { + "name": "r03", + "source": "usb_capture_20260204_133035_hub1#0", + "harmonics": true, + "keys": [ + "device", + "Phi_lm", + "eta_lm_W", + "CCT_K", + "Duv", + "x", + "y", + "u", + "v", + "u_prime", + "v_prime", + "SDCM", + "Ra", + "R1", + "R2", + "R3", + "R4", + "R5", + "R6", + "R7", + "R8", + "R9", + "R10", + "R11", + "R12", + "R13", + "R14", + "R15", + "Phi_e_mW", + "Phi_euv_mW", + "Phi_eb_mW", + "Phi_ey_mW", + "Phi_er_mW", + "Phi_efr_mW", + "Phi_eir_mW", + "Phi_e_total", + "CIE_X", + "CIE_Y", + "CIE_Z", + "TLCI", + "PeakSignal", + "DarkSignal", + "Compensate", + "test_date", + "test_time", + "spectrum", + "spectrum_nm", + "Voltage_V", + "Current_A", + "Power_W", + "Freq_Hz", + "PF", + "V_harmonics", + "UThd", + "I_harmonics", + "AThd", + "V_waveform", + "I_waveform" + ], + "values": { + "device": "HPCS6500", + "Phi_lm": { + "f": "0.0" + }, + "eta_lm_W": { + "f": "0.0" + }, + "CCT_K": { + "f": "0.0" + }, + "Duv": { + "f": "0.0" + }, + "x": { + "f": "0.0" + }, + "y": { + "f": "0.0" + }, + "u": { + "f": "0.0" + }, + "v": { + "f": "0.0" + }, + "u_prime": { + "f": "0.0" + }, + "v_prime": { + "f": "0.0" + }, + "SDCM": { + "f": "0.0" + }, + "Ra": { + "f": "0.0" + }, + "R1": { + "f": "0.0" + }, + "R2": { + "f": "0.0" + }, + "R3": { + "f": "0.0" + }, + "R4": { + "f": "0.0" + }, + "R5": { + "f": "0.0" + }, + "R6": { + "f": "0.0" + }, + "R7": { + "f": "0.0" + }, + "R8": { + "f": "0.0" + }, + "R9": { + "f": "0.0" + }, + "R10": { + "f": "0.0" + }, + "R11": { + "f": "0.0" + }, + "R12": { + "f": "0.0" + }, + "R13": { + "f": "0.0" + }, + "R14": { + "f": "0.0" + }, + "R15": { + "f": "0.0" + }, + "Phi_e_mW": { + "f": "0.0" + }, + "Phi_euv_mW": { + "f": "0.0" + }, + "Phi_eb_mW": { + "f": "0.0" + }, + "Phi_ey_mW": { + "f": "0.0" + }, + "Phi_er_mW": { + "f": "0.0" + }, + "Phi_efr_mW": { + "f": "0.0" + }, + "Phi_eir_mW": { + "f": "0.0" + }, + "Phi_e_total": { + "f": "0.0" + }, + "CIE_X": { + "f": "0.0" + }, + "CIE_Y": { + "f": "0.0" + }, + "CIE_Z": { + "f": "0.0" + }, + "TLCI": { + "f": "0.0" + }, + "PeakSignal": { + "f": "0.0" + }, + "DarkSignal": { + "f": "0.0" + }, + "Compensate": { + "f": "0.0" + }, + "test_date": "2026-02-04", + "test_time": "16:50:38", + "spectrum": [ + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + } + ], + "spectrum_nm": [ + { + "f": "380.0" + }, + { + "f": "381.91977077363896" + }, + { + "f": "383.8395415472779" + }, + { + "f": "385.75931232091693" + }, + { + "f": "387.6790830945559" + }, + { + "f": "389.59885386819485" + }, + { + "f": "391.5186246418338" + }, + { + "f": "393.43839541547277" + }, + { + "f": "395.3581661891117" + }, + { + "f": "397.2779369627507" + }, + { + "f": "399.1977077363897" + }, + { + "f": "401.11747851002866" + }, + { + "f": "403.0372492836676" + }, + { + "f": "404.9570200573066" + }, + { + "f": "406.87679083094554" + }, + { + "f": "408.79656160458455" + }, + { + "f": "410.7163323782235" + }, + { + "f": "412.63610315186247" + }, + { + "f": "414.55587392550143" + }, + { + "f": "416.4756446991404" + }, + { + "f": "418.39541547277935" + }, + { + "f": "420.3151862464183" + }, + { + "f": "422.2349570200573" + }, + { + "f": "424.1547277936963" + }, + { + "f": "426.07449856733524" + }, + { + "f": "427.9942693409742" + }, + { + "f": "429.91404011461316" + }, + { + "f": "431.8338108882522" + }, + { + "f": "433.75358166189113" + }, + { + "f": "435.6733524355301" + }, + { + "f": "437.59312320916905" + }, + { + "f": "439.512893982808" + }, + { + "f": "441.43266475644697" + }, + { + "f": "443.3524355300859" + }, + { + "f": "445.27220630372494" + }, + { + "f": "447.1919770773639" + }, + { + "f": "449.11174785100286" + }, + { + "f": "451.0315186246418" + }, + { + "f": "452.9512893982808" + }, + { + "f": "454.8710601719198" + }, + { + "f": "456.79083094555875" + }, + { + "f": "458.7106017191977" + }, + { + "f": "460.63037249283667" + }, + { + "f": "462.55014326647563" + }, + { + "f": "464.46991404011465" + }, + { + "f": "466.38968481375355" + }, + { + "f": "468.30945558739256" + }, + { + "f": "470.2292263610315" + }, + { + "f": "472.1489971346705" + }, + { + "f": "474.06876790830944" + }, + { + "f": "475.9885386819484" + }, + { + "f": "477.9083094555874" + }, + { + "f": "479.8280802292264" + }, + { + "f": "481.74785100286533" + }, + { + "f": "483.6676217765043" + }, + { + "f": "485.58739255014325" + }, + { + "f": "487.50716332378227" + }, + { + "f": "489.42693409742117" + }, + { + "f": "491.3467048710602" + }, + { + "f": "493.26647564469914" + }, + { + "f": "495.1862464183381" + }, + { + "f": "497.10601719197706" + }, + { + "f": "499.025787965616" + }, + { + "f": "500.94555873925503" + }, + { + "f": "502.865329512894" + }, + { + "f": "504.78510028653295" + }, + { + "f": "506.7048710601719" + }, + { + "f": "508.62464183381087" + }, + { + "f": "510.5444126074499" + }, + { + "f": "512.4641833810888" + }, + { + "f": "514.3839541547278" + }, + { + "f": "516.3037249283668" + }, + { + "f": "518.2234957020057" + }, + { + "f": "520.1432664756447" + }, + { + "f": "522.0630372492836" + }, + { + "f": "523.9828080229227" + }, + { + "f": "525.9025787965616" + }, + { + "f": "527.8223495702006" + }, + { + "f": "529.7421203438396" + }, + { + "f": "531.6618911174785" + }, + { + "f": "533.5816618911175" + }, + { + "f": "535.5014326647564" + }, + { + "f": "537.4212034383954" + }, + { + "f": "539.3409742120343" + }, + { + "f": "541.2607449856733" + }, + { + "f": "543.1805157593124" + }, + { + "f": "545.1002865329513" + }, + { + "f": "547.0200573065903" + }, + { + "f": "548.9398280802293" + }, + { + "f": "550.8595988538682" + }, + { + "f": "552.7793696275071" + }, + { + "f": "554.6991404011461" + }, + { + "f": "556.6189111747851" + }, + { + "f": "558.538681948424" + }, + { + "f": "560.458452722063" + }, + { + "f": "562.3782234957021" + }, + { + "f": "564.297994269341" + }, + { + "f": "566.21776504298" + }, + { + "f": "568.1375358166189" + }, + { + "f": "570.0573065902579" + }, + { + "f": "571.9770773638968" + }, + { + "f": "573.8968481375358" + }, + { + "f": "575.8166189111748" + }, + { + "f": "577.7363896848137" + }, + { + "f": "579.6561604584527" + }, + { + "f": "581.5759312320916" + }, + { + "f": "583.4957020057307" + }, + { + "f": "585.4154727793696" + }, + { + "f": "587.3352435530086" + }, + { + "f": "589.2550143266476" + }, + { + "f": "591.1747851002865" + }, + { + "f": "593.0945558739255" + }, + { + "f": "595.0143266475645" + }, + { + "f": "596.9340974212034" + }, + { + "f": "598.8538681948423" + }, + { + "f": "600.7736389684814" + }, + { + "f": "602.6934097421204" + }, + { + "f": "604.6131805157593" + }, + { + "f": "606.5329512893983" + }, + { + "f": "608.4527220630373" + }, + { + "f": "610.3724928366762" + }, + { + "f": "612.2922636103152" + }, + { + "f": "614.2120343839541" + }, + { + "f": "616.1318051575931" + }, + { + "f": "618.051575931232" + }, + { + "f": "619.971346704871" + }, + { + "f": "621.8911174785101" + }, + { + "f": "623.810888252149" + }, + { + "f": "625.730659025788" + }, + { + "f": "627.6504297994269" + }, + { + "f": "629.5702005730659" + }, + { + "f": "631.4899713467048" + }, + { + "f": "633.4097421203438" + }, + { + "f": "635.3295128939828" + }, + { + "f": "637.2492836676217" + }, + { + "f": "639.1690544412608" + }, + { + "f": "641.0888252148998" + }, + { + "f": "643.0085959885387" + }, + { + "f": "644.9283667621776" + }, + { + "f": "646.8481375358166" + }, + { + "f": "648.7679083094556" + }, + { + "f": "650.6876790830945" + }, + { + "f": "652.6074498567335" + }, + { + "f": "654.5272206303725" + }, + { + "f": "656.4469914040114" + }, + { + "f": "658.3667621776503" + }, + { + "f": "660.2865329512895" + }, + { + "f": "662.2063037249284" + }, + { + "f": "664.1260744985673" + }, + { + "f": "666.0458452722063" + }, + { + "f": "667.9656160458453" + }, + { + "f": "669.8853868194842" + }, + { + "f": "671.8051575931232" + }, + { + "f": "673.7249283667622" + }, + { + "f": "675.6446991404011" + }, + { + "f": "677.56446991404" + }, + { + "f": "679.4842406876791" + }, + { + "f": "681.4040114613181" + }, + { + "f": "683.323782234957" + }, + { + "f": "685.243553008596" + }, + { + "f": "687.163323782235" + }, + { + "f": "689.0830945558739" + }, + { + "f": "691.0028653295128" + }, + { + "f": "692.9226361031518" + }, + { + "f": "694.8424068767908" + }, + { + "f": "696.7621776504297" + }, + { + "f": "698.6819484240688" + }, + { + "f": "700.6017191977078" + }, + { + "f": "702.5214899713467" + }, + { + "f": "704.4412607449856" + }, + { + "f": "706.3610315186247" + }, + { + "f": "708.2808022922636" + }, + { + "f": "710.2005730659025" + }, + { + "f": "712.1203438395415" + }, + { + "f": "714.0401146131805" + }, + { + "f": "715.9598853868195" + }, + { + "f": "717.8796561604585" + }, + { + "f": "719.7994269340975" + }, + { + "f": "721.7191977077364" + }, + { + "f": "723.6389684813753" + }, + { + "f": "725.5587392550143" + }, + { + "f": "727.4785100286533" + }, + { + "f": "729.3982808022922" + }, + { + "f": "731.3180515759312" + }, + { + "f": "733.2378223495703" + }, + { + "f": "735.1575931232092" + }, + { + "f": "737.077363896848" + }, + { + "f": "738.9971346704871" + }, + { + "f": "740.9169054441261" + }, + { + "f": "742.836676217765" + }, + { + "f": "744.756446991404" + }, + { + "f": "746.676217765043" + }, + { + "f": "748.5959885386819" + }, + { + "f": "750.5157593123208" + }, + { + "f": "752.43553008596" + }, + { + "f": "754.3553008595989" + }, + { + "f": "756.2750716332378" + }, + { + "f": "758.1948424068768" + }, + { + "f": "760.1146131805158" + }, + { + "f": "762.0343839541547" + }, + { + "f": "763.9541547277937" + }, + { + "f": "765.8739255014327" + }, + { + "f": "767.7936962750716" + }, + { + "f": "769.7134670487105" + }, + { + "f": "771.6332378223495" + }, + { + "f": "773.5530085959886" + }, + { + "f": "775.4727793696275" + }, + { + "f": "777.3925501432665" + }, + { + "f": "779.3123209169055" + }, + { + "f": "781.2320916905444" + }, + { + "f": "783.1518624641833" + }, + { + "f": "785.0716332378223" + }, + { + "f": "786.9914040114613" + }, + { + "f": "788.9111747851002" + }, + { + "f": "790.8309455587392" + }, + { + "f": "792.7507163323783" + }, + { + "f": "794.6704871060172" + }, + { + "f": "796.5902578796561" + }, + { + "f": "798.5100286532952" + }, + { + "f": "800.4297994269341" + }, + { + "f": "802.349570200573" + }, + { + "f": "804.269340974212" + }, + { + "f": "806.189111747851" + }, + { + "f": "808.1088825214899" + }, + { + "f": "810.028653295129" + }, + { + "f": "811.948424068768" + }, + { + "f": "813.8681948424069" + }, + { + "f": "815.7879656160458" + }, + { + "f": "817.7077363896848" + }, + { + "f": "819.6275071633238" + }, + { + "f": "821.5472779369627" + }, + { + "f": "823.4670487106017" + }, + { + "f": "825.3868194842407" + }, + { + "f": "827.3065902578796" + }, + { + "f": "829.2263610315185" + }, + { + "f": "831.1461318051576" + }, + { + "f": "833.0659025787966" + }, + { + "f": "834.9856733524355" + }, + { + "f": "836.9054441260745" + }, + { + "f": "838.8252148997135" + }, + { + "f": "840.7449856733524" + }, + { + "f": "842.6647564469913" + }, + { + "f": "844.5845272206304" + }, + { + "f": "846.5042979942693" + }, + { + "f": "848.4240687679082" + }, + { + "f": "850.3438395415473" + }, + { + "f": "852.2636103151863" + }, + { + "f": "854.1833810888252" + }, + { + "f": "856.1031518624642" + }, + { + "f": "858.0229226361032" + }, + { + "f": "859.9426934097421" + }, + { + "f": "861.862464183381" + }, + { + "f": "863.78223495702" + }, + { + "f": "865.702005730659" + }, + { + "f": "867.6217765042979" + }, + { + "f": "869.541547277937" + }, + { + "f": "871.461318051576" + }, + { + "f": "873.3810888252149" + }, + { + "f": "875.3008595988538" + }, + { + "f": "877.2206303724929" + }, + { + "f": "879.1404011461318" + }, + { + "f": "881.0601719197707" + }, + { + "f": "882.9799426934097" + }, + { + "f": "884.8997134670487" + }, + { + "f": "886.8194842406876" + }, + { + "f": "888.7392550143267" + }, + { + "f": "890.6590257879657" + }, + { + "f": "892.5787965616046" + }, + { + "f": "894.4985673352436" + }, + { + "f": "896.4183381088825" + }, + { + "f": "898.3381088825215" + }, + { + "f": "900.2578796561604" + }, + { + "f": "902.1776504297994" + }, + { + "f": "904.0974212034383" + }, + { + "f": "906.0171919770773" + }, + { + "f": "907.9369627507164" + }, + { + "f": "909.8567335243553" + }, + { + "f": "911.7765042979943" + }, + { + "f": "913.6962750716332" + }, + { + "f": "915.6160458452722" + }, + { + "f": "917.5358166189112" + }, + { + "f": "919.4555873925501" + }, + { + "f": "921.3753581661891" + }, + { + "f": "923.295128939828" + }, + { + "f": "925.214899713467" + }, + { + "f": "927.134670487106" + }, + { + "f": "929.054441260745" + }, + { + "f": "930.974212034384" + }, + { + "f": "932.8939828080229" + }, + { + "f": "934.8137535816619" + }, + { + "f": "936.7335243553008" + }, + { + "f": "938.6532951289398" + }, + { + "f": "940.5730659025788" + }, + { + "f": "942.4928366762177" + }, + { + "f": "944.4126074498568" + }, + { + "f": "946.3323782234957" + }, + { + "f": "948.2521489971347" + }, + { + "f": "950.1719197707736" + }, + { + "f": "952.0916905444126" + }, + { + "f": "954.0114613180516" + }, + { + "f": "955.9312320916905" + }, + { + "f": "957.8510028653295" + }, + { + "f": "959.7707736389684" + }, + { + "f": "961.6905444126074" + }, + { + "f": "963.6103151862465" + }, + { + "f": "965.5300859598854" + }, + { + "f": "967.4498567335244" + }, + { + "f": "969.3696275071633" + }, + { + "f": "971.2893982808023" + }, + { + "f": "973.2091690544412" + }, + { + "f": "975.1289398280802" + }, + { + "f": "977.0487106017192" + }, + { + "f": "978.9684813753581" + }, + { + "f": "980.8882521489971" + }, + { + "f": "982.808022922636" + }, + { + "f": "984.7277936962751" + }, + { + "f": "986.6475644699141" + }, + { + "f": "988.567335243553" + }, + { + "f": "990.487106017192" + }, + { + "f": "992.4068767908309" + }, + { + "f": "994.3266475644699" + }, + { + "f": "996.2464183381088" + }, + { + "f": "998.1661891117478" + }, + { + "f": "1000.0859598853868" + }, + { + "f": "1002.0057306590257" + }, + { + "f": "1003.9255014326648" + }, + { + "f": "1005.8452722063037" + }, + { + "f": "1007.7650429799427" + }, + { + "f": "1009.6848137535817" + }, + { + "f": "1011.6045845272206" + }, + { + "f": "1013.5243553008596" + }, + { + "f": "1015.4441260744985" + }, + { + "f": "1017.3638968481375" + }, + { + "f": "1019.2836676217764" + }, + { + "f": "1021.2034383954154" + }, + { + "f": "1023.1232091690545" + }, + { + "f": "1025.0429799426934" + }, + { + "f": "1026.9627507163323" + }, + { + "f": "1028.8825214899712" + }, + { + "f": "1030.8022922636103" + }, + { + "f": "1032.7220630372494" + }, + { + "f": "1034.6418338108883" + }, + { + "f": "1036.5616045845272" + }, + { + "f": "1038.4813753581661" + }, + { + "f": "1040.401146131805" + }, + { + "f": "1042.320916905444" + }, + { + "f": "1044.240687679083" + }, + { + "f": "1046.1604584527222" + }, + { + "f": "1048.080229226361" + }, + { + "f": "1050.0" + } + ], + "Voltage_V": { + "f": "0.0" + }, + "Current_A": { + "f": "0.0" + }, + "Power_W": { + "f": "0.0" + }, + "Freq_Hz": { + "f": "0.0" + }, + "PF": { + "f": "0.0" + }, + "V_harmonics": [ + { + "f": "100.0" + }, + { + "f": "0.3465724289417267" + }, + { + "f": "0.5529336333274841" + }, + { + "f": "0.19353407621383667" + }, + { + "f": "0.10086703300476074" + }, + { + "f": "0.13191671669483185" + }, + { + "f": "0.14554180204868317" + }, + { + "f": "0.07087597250938416" + }, + { + "f": "0.3609533905982971" + }, + { + "f": "0.045203421264886856" + }, + { + "f": "0.25579699873924255" + }, + { + "f": "0.009946582838892937" + }, + { + "f": "0.14706355333328247" + }, + { + "f": "0.018207738175988197" + }, + { + "f": "0.08813513070344925" + }, + { + "f": "0.01187213882803917" + }, + { + "f": "0.04392422363162041" + }, + { + "f": "0.005373697262257338" + }, + { + "f": "0.04405415058135986" + }, + { + "f": "0.003928053192794323" + }, + { + "f": "0.04437800124287605" + }, + { + "f": "0.0038038177881389856" + }, + { + "f": "0.04185342416167259" + }, + { + "f": "0.007046824786812067" + }, + { + "f": "0.027712397277355194" + }, + { + "f": "0.008640163578093052" + }, + { + "f": "0.018026959151029587" + }, + { + "f": "0.0038402860518544912" + }, + { + "f": "0.01681213267147541" + }, + { + "f": "0.0030889587942510843" + }, + { + "f": "0.00847578514367342" + }, + { + "f": "0.00417458126321435" + }, + { + "f": "0.014089878648519516" + }, + { + "f": "0.003933050204068422" + }, + { + "f": "0.005049738567322493" + }, + { + "f": "0.007592047099024057" + }, + { + "f": "0.017236387357115746" + }, + { + "f": "0.0016567695420235395" + }, + { + "f": "0.013457155786454678" + }, + { + "f": "0.012220894917845726" + }, + { + "f": "0.007484647445380688" + }, + { + "f": "0.009138254448771477" + }, + { + "f": "0.00786356721073389" + }, + { + "f": "0.005167808383703232" + }, + { + "f": "0.002824472263455391" + }, + { + "f": "0.006273732986301184" + }, + { + "f": "0.01056049857288599" + }, + { + "f": "0.0055211675353348255" + }, + { + "f": "0.006599482614547014" + }, + { + "f": "0.0031964825466275215" + } + ], + "UThd": { + "f": "0.8691818714141846" + }, + "I_harmonics": [ + { + "f": "100.0" + }, + { + "f": "1.3069089651107788" + }, + { + "f": "79.68257141113281" + }, + { + "f": "1.6781855821609497" + }, + { + "f": "62.009864807128906" + }, + { + "f": "1.837485671043396" + }, + { + "f": "43.025142669677734" + }, + { + "f": "1.4560658931732178" + }, + { + "f": "27.143356323242188" + }, + { + "f": "0.8637713193893433" + }, + { + "f": "16.32884979248047" + }, + { + "f": "0.8914227485656738" + }, + { + "f": "10.583571434020996" + }, + { + "f": "0.8186497688293457" + }, + { + "f": "7.82957649230957" + }, + { + "f": "0.6092273592948914" + }, + { + "f": "7.1998066902160645" + }, + { + "f": "0.5319848656654358" + }, + { + "f": "6.839048862457275" + }, + { + "f": "0.7900630235671997" + }, + { + "f": "5.947142124176025" + }, + { + "f": "0.8641201257705688" + }, + { + "f": "5.413096904754639" + }, + { + "f": "0.7893344163894653" + }, + { + "f": "5.473766803741455" + }, + { + "f": "0.6971709132194519" + }, + { + "f": "5.452547073364258" + }, + { + "f": "0.6923035979270935" + }, + { + "f": "4.822229862213135" + }, + { + "f": "0.7761058807373047" + }, + { + "f": "4.390883922576904" + }, + { + "f": "0.7791592478752136" + }, + { + "f": "4.390263080596924" + }, + { + "f": "0.7458407282829285" + }, + { + "f": "4.360169410705566" + }, + { + "f": "0.7060664296150208" + }, + { + "f": "3.9435551166534424" + }, + { + "f": "0.6864830851554871" + }, + { + "f": "3.613424301147461" + }, + { + "f": "0.6927609443664551" + }, + { + "f": "3.4965076446533203" + }, + { + "f": "0.7968708872795105" + }, + { + "f": "3.1708688735961914" + }, + { + "f": "0.7281857132911682" + }, + { + "f": "2.8720643520355225" + }, + { + "f": "0.6769702434539795" + }, + { + "f": "2.6774227619171143" + }, + { + "f": "0.6485654711723328" + }, + { + "f": "2.6343231201171875" + }, + { + "f": "0.6854982376098633" + } + ], + "AThd": { + "f": "116.70909881591797" + }, + "V_waveform": [ + 489, + 917, + 1336, + 1752, + 2169, + 2545, + 2961, + 3372, + 3771, + 4152, + 4520, + 4912, + 5274, + 5637, + 5966, + 6274, + 6551, + 6842, + 7070, + 7283, + 7457, + 7681, + 7898, + 8133, + 8356, + 8516, + 8646, + 8739, + 8822, + 8828, + 8859, + 8861, + 8839, + 8814, + 8800, + 8748, + 8674, + 8573, + 8458, + 8326, + 8158, + 7945, + 7733, + 7496, + 7257, + 6972, + 6681, + 6351, + 6031, + 5707, + 5356, + 5024, + 4648, + 4261, + 3864, + 3473, + 3057, + 2646, + 2228, + 1797, + 1374, + 923, + 492, + 54, + -399, + -834, + -1255, + -1708, + -2161, + -2586, + -3010, + -3423, + -3834, + -4193, + -4587, + -4945, + -5326, + -5673, + -6004, + -6305, + -6602, + -6889, + -7135, + -7313, + -7509, + -7726, + -7967, + -8187, + -8411, + -8564, + -8691, + -8774, + -8869, + -8888, + -8895, + -8881, + -8848, + -8834, + -8806, + -8736, + -8679, + -8583, + -8456, + -8335, + -8177, + -7973, + -7745, + -7506, + -7262, + -6977, + -6662, + -6347, + -6024, + -5689, + -5340, + -4981, + -4584, + -4216, + -3818, + -3404, + -2979, + -2563, + -2130, + -1697, + -1249, + -813, + -377, + 35 + ], + "I_waveform": [ + 521, + 477, + 477, + 538, + 655, + 497, + 446, + 390, + 456, + 710, + 549, + 437, + 324, + 287, + 581, + 525, + 335, + 209, + 6483, + 7056, + 7465, + 8018, + 8509, + 8269, + 7609, + 6650, + 5360, + 4339, + 3379, + 2417, + 1634, + 961, + 720, + 552, + 377, + 83, + 78, + -131, + -336, + -363, + -209, + -65, + -241, + -441, + -532, + -388, + -155, + -280, + -462, + -597, + -547, + -277, + -371, + -530, + -587, + -634, + -422, + -427, + -542, + -541, + -615, + -508, + -526, + -597, + -556, + -508, + -566, + -648, + -592, + -511, + -440, + -398, + -666, + -613, + -451, + -352, + -299, + -527, + -619, + -438, + -234, + -193, + -6866, + -7198, + -7627, + -8283, + -8757, + -8291, + -7485, + -6416, + -5223, + -4275, + -3306, + -2325, + -1436, + -742, + -547, + -477, + -282, + -143, + -7, + 249, + 376, + 222, + 9, + 101, + 351, + 492, + 450, + 179, + 211, + 441, + 494, + 605, + 333, + 279, + 495, + 535, + 675, + 528, + 359, + 543, + 514, + 620, + 584, + 489, + 582, + 547 + ] + } + }, + { + "name": "r04", + "source": "usb_capture_20260204_123319_hub1#16", + "harmonics": false, + "keys": [ + "device", + "Phi_lm", + "eta_lm_W", + "CCT_K", + "Duv", + "x", + "y", + "u", + "v", + "u_prime", + "v_prime", + "SDCM", + "Ra", + "R1", + "R2", + "R3", + "R4", + "R5", + "R6", + "R7", + "R8", + "R9", + "R10", + "R11", + "R12", + "R13", + "R14", + "R15", + "Phi_e_mW", + "Phi_euv_mW", + "Phi_eb_mW", + "Phi_ey_mW", + "Phi_er_mW", + "Phi_efr_mW", + "Phi_eir_mW", + "Phi_e_total", + "CIE_X", + "CIE_Y", + "CIE_Z", + "TLCI", + "PeakSignal", + "DarkSignal", + "Compensate", + "test_date", + "test_time", + "spectrum", + "spectrum_nm", + "Voltage_V", + "Current_A", + "Power_W", + "Freq_Hz", + "PF" + ], + "values": { + "device": "HPCS6500", + "Phi_lm": { + "f": "479.8302917480469" + }, + "eta_lm_W": { + "f": "57.09168243408203" + }, + "CCT_K": { + "f": "5655.5185546875" + }, + "Duv": { + "f": "0.005520321428775787" + }, + "x": { + "f": "0.32882028818130493" + }, + "y": { + "f": "0.3488074243068695" + }, + "u": { + "f": "0.20148152112960815" + }, + "v": { + "f": "0.3205926716327667" + }, + "u_prime": { + "f": "0.20148152112960815" + }, + "v_prime": { + "f": "0.4808890223503113" + }, + "SDCM": { + "f": "4.696867942810059" + }, + "Ra": { + "f": "83.00994873046875" + }, + "R1": { + "f": "82.22040557861328" + }, + "R2": { + "f": "94.05892181396484" + }, + "R3": { + "f": "93.2469253540039" + }, + "R4": { + "f": "76.50690460205078" + }, + "R5": { + "f": "81.42030334472656" + }, + "R6": { + "f": "89.34086608886719" + }, + "R7": { + "f": "83.16636657714844" + }, + "R8": { + "f": "64.1189193725586" + }, + "R9": { + "f": "4.818240642547607" + }, + "R10": { + "f": "84.18575286865234" + }, + "R11": { + "f": "76.09269714355469" + }, + "R12": { + "f": "60.0699348449707" + }, + "R13": { + "f": "86.59054565429688" + }, + "R14": { + "f": "96.74826049804688" + }, + "R15": { + "f": "76.01618194580078" + }, + "Phi_e_mW": { + "f": "1491.9422607421875" + }, + "Phi_euv_mW": { + "f": "0.0" + }, + "Phi_eb_mW": { + "f": "469.8638610839844" + }, + "Phi_ey_mW": { + "f": "679.650634765625" + }, + "Phi_er_mW": { + "f": "330.7580261230469" + }, + "Phi_efr_mW": { + "f": "11.141565322875977" + }, + "Phi_eir_mW": { + "f": "0.0" + }, + "Phi_e_total": { + "f": "1491.4139404296875" + }, + "CIE_X": { + "f": "662.2772216796875" + }, + "CIE_Y": { + "f": "702.5333251953125" + }, + "CIE_Z": { + "f": "649.290283203125" + }, + "TLCI": { + "f": "67.87500762939453" + }, + "PeakSignal": { + "f": "53051.0" + }, + "DarkSignal": { + "f": "2228.0" + }, + "Compensate": { + "f": "2834.0" + }, + "test_date": "2026-02-04", + "test_time": "15:58:53", + "spectrum": [ + { + "f": "3.0678289476782084e-05" + }, + { + "f": "0.002339840866625309" + }, + { + "f": "0.011114909313619137" + }, + { + "f": "0.02840648964047432" + }, + { + "f": "0.053317371755838394" + }, + { + "f": "0.08384023606777191" + }, + { + "f": "0.12212063372135162" + }, + { + "f": "0.16465608775615692" + }, + { + "f": "0.20760349929332733" + }, + { + "f": "0.256746381521225" + }, + { + "f": "0.3137316405773163" + }, + { + "f": "0.3802480697631836" + }, + { + "f": "0.45870399475097656" + }, + { + "f": "0.549515426158905" + }, + { + "f": "0.6531684398651123" + }, + { + "f": "0.7711887955665588" + }, + { + "f": "0.9053115248680115" + }, + { + "f": "1.0565211772918701" + }, + { + "f": "1.2261710166931152" + }, + { + "f": "1.4141602516174316" + }, + { + "f": "1.6204472780227661" + }, + { + "f": "1.848348617553711" + }, + { + "f": "2.0993618965148926" + }, + { + "f": "2.3772435188293457" + }, + { + "f": "2.6809489727020264" + }, + { + "f": "3.010329246520996" + }, + { + "f": "3.3697359561920166" + }, + { + "f": "3.759692668914795" + }, + { + "f": "4.181712627410889" + }, + { + "f": "4.640293121337891" + }, + { + "f": "5.195188045501709" + }, + { + "f": "5.803853511810303" + }, + { + "f": "6.411978721618652" + }, + { + "f": "7.082002639770508" + }, + { + "f": "7.810205459594727" + }, + { + "f": "8.593241691589355" + }, + { + "f": "9.418167114257812" + }, + { + "f": "10.263191223144531" + }, + { + "f": "11.101988792419434" + }, + { + "f": "11.901713371276855" + }, + { + "f": "12.618995666503906" + }, + { + "f": "13.210227966308594" + }, + { + "f": "13.634732246398926" + }, + { + "f": "13.849845886230469" + }, + { + "f": "13.846508026123047" + }, + { + "f": "13.640907287597656" + }, + { + "f": "13.260337829589844" + }, + { + "f": "12.748950004577637" + }, + { + "f": "12.145889282226562" + }, + { + "f": "11.494356155395508" + }, + { + "f": "10.842066764831543" + }, + { + "f": "10.22095012664795" + }, + { + "f": "9.655474662780762" + }, + { + "f": "9.152709007263184" + }, + { + "f": "8.706658363342285" + }, + { + "f": "8.313093185424805" + }, + { + "f": "7.961644172668457" + }, + { + "f": "7.642660617828369" + }, + { + "f": "7.3460283279418945" + }, + { + "f": "7.059600353240967" + }, + { + "f": "6.7763671875" + }, + { + "f": "6.497071266174316" + }, + { + "f": "6.225697040557861" + }, + { + "f": "5.968774795532227" + }, + { + "f": "5.728484153747559" + }, + { + "f": "5.505182266235352" + }, + { + "f": "5.292294025421143" + }, + { + "f": "5.103065013885498" + }, + { + "f": "4.940649509429932" + }, + { + "f": "4.806008338928223" + }, + { + "f": "4.698480606079102" + }, + { + "f": "4.618252277374268" + }, + { + "f": "4.560579299926758" + }, + { + "f": "4.52360200881958" + }, + { + "f": "4.495222568511963" + }, + { + "f": "4.483834266662598" + }, + { + "f": "4.491692066192627" + }, + { + "f": "4.50845193862915" + }, + { + "f": "4.531856060028076" + }, + { + "f": "4.561892509460449" + }, + { + "f": "4.598548889160156" + }, + { + "f": "4.641941070556641" + }, + { + "f": "4.691147327423096" + }, + { + "f": "4.747013092041016" + }, + { + "f": "4.809674263000488" + }, + { + "f": "4.877907752990723" + }, + { + "f": "4.9512834548950195" + }, + { + "f": "5.027973175048828" + }, + { + "f": "5.107447147369385" + }, + { + "f": "5.189198017120361" + }, + { + "f": "5.2744269371032715" + }, + { + "f": "5.362094402313232" + }, + { + "f": "5.449896812438965" + }, + { + "f": "5.535067081451416" + }, + { + "f": "5.615380764007568" + }, + { + "f": "5.692240238189697" + }, + { + "f": "5.764662742614746" + }, + { + "f": "5.835266590118408" + }, + { + "f": "5.903357028961182" + }, + { + "f": "5.966335773468018" + }, + { + "f": "6.026004791259766" + }, + { + "f": "6.080920696258545" + }, + { + "f": "6.132166385650635" + }, + { + "f": "6.179603576660156" + }, + { + "f": "6.222815990447998" + }, + { + "f": "6.260476112365723" + }, + { + "f": "6.292980194091797" + }, + { + "f": "6.32311487197876" + }, + { + "f": "6.351294994354248" + }, + { + "f": "6.379146575927734" + }, + { + "f": "6.406513690948486" + }, + { + "f": "6.437316417694092" + }, + { + "f": "6.467153549194336" + }, + { + "f": "6.491356372833252" + }, + { + "f": "6.512511730194092" + }, + { + "f": "6.530294418334961" + }, + { + "f": "6.546002388000488" + }, + { + "f": "6.563145637512207" + }, + { + "f": "6.582754611968994" + }, + { + "f": "6.605875492095947" + }, + { + "f": "6.63069486618042" + }, + { + "f": "6.656155586242676" + }, + { + "f": "6.683093547821045" + }, + { + "f": "6.7115888595581055" + }, + { + "f": "6.742276668548584" + }, + { + "f": "6.77232027053833" + }, + { + "f": "6.80189847946167" + }, + { + "f": "6.832056999206543" + }, + { + "f": "6.862081050872803" + }, + { + "f": "6.89274263381958" + }, + { + "f": "6.922916412353516" + }, + { + "f": "6.951348304748535" + }, + { + "f": "6.979560852050781" + }, + { + "f": "7.00612211227417" + }, + { + "f": "7.0304975509643555" + }, + { + "f": "7.0528740882873535" + }, + { + "f": "7.073936462402344" + }, + { + "f": "7.094518661499023" + }, + { + "f": "7.1149749755859375" + }, + { + "f": "7.1356000900268555" + }, + { + "f": "7.15624475479126" + }, + { + "f": "7.174272537231445" + }, + { + "f": "7.18989896774292" + }, + { + "f": "7.20338773727417" + }, + { + "f": "7.21608304977417" + }, + { + "f": "7.229821681976318" + }, + { + "f": "7.243678569793701" + }, + { + "f": "7.257119178771973" + }, + { + "f": "7.270388126373291" + }, + { + "f": "7.2842183113098145" + }, + { + "f": "7.29814338684082" + }, + { + "f": "7.313192367553711" + }, + { + "f": "7.328620433807373" + }, + { + "f": "7.344998836517334" + }, + { + "f": "7.361711025238037" + }, + { + "f": "7.377782344818115" + }, + { + "f": "7.395495891571045" + }, + { + "f": "7.415689468383789" + }, + { + "f": "7.441822052001953" + }, + { + "f": "7.468611717224121" + }, + { + "f": "7.489629745483398" + }, + { + "f": "7.506174564361572" + }, + { + "f": "7.518640995025635" + }, + { + "f": "7.526235580444336" + }, + { + "f": "7.529323101043701" + }, + { + "f": "7.52587366104126" + }, + { + "f": "7.517413139343262" + }, + { + "f": "7.507584571838379" + }, + { + "f": "7.496767997741699" + }, + { + "f": "7.487506866455078" + }, + { + "f": "7.478043079376221" + }, + { + "f": "7.466614723205566" + }, + { + "f": "7.4530134201049805" + }, + { + "f": "7.436206817626953" + }, + { + "f": "7.4139814376831055" + }, + { + "f": "7.386828422546387" + }, + { + "f": "7.356060981750488" + }, + { + "f": "7.322332382202148" + }, + { + "f": "7.287826061248779" + }, + { + "f": "7.25238561630249" + }, + { + "f": "7.21437931060791" + }, + { + "f": "7.174239158630371" + }, + { + "f": "7.133118629455566" + }, + { + "f": "7.101151466369629" + }, + { + "f": "7.066768646240234" + }, + { + "f": "7.017975807189941" + }, + { + "f": "6.964282512664795" + }, + { + "f": "6.906376838684082" + }, + { + "f": "6.846121311187744" + }, + { + "f": "6.784697532653809" + }, + { + "f": "6.721904277801514" + }, + { + "f": "6.656763553619385" + }, + { + "f": "6.589295387268066" + }, + { + "f": "6.5178680419921875" + }, + { + "f": "6.442954063415527" + }, + { + "f": "6.365952014923096" + }, + { + "f": "6.287257194519043" + }, + { + "f": "6.206923484802246" + }, + { + "f": "6.125450611114502" + }, + { + "f": "6.042835235595703" + }, + { + "f": "5.960536003112793" + }, + { + "f": "5.878669261932373" + }, + { + "f": "5.7967529296875" + }, + { + "f": "5.7284417152404785" + }, + { + "f": "5.658614635467529" + }, + { + "f": "5.573302745819092" + }, + { + "f": "5.486228942871094" + }, + { + "f": "5.398300647735596" + }, + { + "f": "5.309929847717285" + }, + { + "f": "5.2216410636901855" + }, + { + "f": "5.133873462677002" + }, + { + "f": "5.046513557434082" + }, + { + "f": "4.959892749786377" + }, + { + "f": "4.873384475708008" + }, + { + "f": "4.787603378295898" + }, + { + "f": "4.7023491859436035" + }, + { + "f": "4.6178131103515625" + }, + { + "f": "4.534168243408203" + }, + { + "f": "4.449378967285156" + }, + { + "f": "4.363165855407715" + }, + { + "f": "4.276418685913086" + }, + { + "f": "4.203158378601074" + }, + { + "f": "4.129893779754639" + }, + { + "f": "4.044194221496582" + }, + { + "f": "3.9588661193847656" + }, + { + "f": "3.8735923767089844" + }, + { + "f": "3.7880163192749023" + }, + { + "f": "3.702024459838867" + }, + { + "f": "3.6162514686584473" + }, + { + "f": "3.5307562351226807" + }, + { + "f": "3.4459433555603027" + }, + { + "f": "3.3618924617767334" + }, + { + "f": "3.277946710586548" + }, + { + "f": "3.193763494491577" + }, + { + "f": "3.110830068588257" + }, + { + "f": "3.029024362564087" + }, + { + "f": "2.959667444229126" + }, + { + "f": "2.8917782306671143" + }, + { + "f": "2.8127880096435547" + }, + { + "f": "2.7336249351501465" + }, + { + "f": "2.6554927825927734" + }, + { + "f": "2.578542470932007" + }, + { + "f": "2.503300428390503" + }, + { + "f": "2.4302589893341064" + }, + { + "f": "2.358574628829956" + }, + { + "f": "2.288769483566284" + }, + { + "f": "2.22052001953125" + }, + { + "f": "2.153696298599243" + }, + { + "f": "2.090035915374756" + }, + { + "f": "2.028475761413574" + }, + { + "f": "1.9765336513519287" + }, + { + "f": "1.9259992837905884" + }, + { + "f": "1.8678935766220093" + }, + { + "f": "1.8104090690612793" + }, + { + "f": "1.7550898790359497" + }, + { + "f": "1.7010985612869263" + }, + { + "f": "1.6483781337738037" + }, + { + "f": "1.5976593494415283" + }, + { + "f": "1.5471855401992798" + }, + { + "f": "1.497249722480774" + }, + { + "f": "1.448472499847412" + }, + { + "f": "1.4008755683898926" + }, + { + "f": "1.3559679985046387" + }, + { + "f": "1.31911039352417" + }, + { + "f": "1.2831015586853027" + }, + { + "f": "1.2417877912521362" + }, + { + "f": "1.200395941734314" + }, + { + "f": "1.158786416053772" + }, + { + "f": "1.1175662279129028" + }, + { + "f": "1.0768152475357056" + }, + { + "f": "1.037052869796753" + }, + { + "f": "0.9981685876846313" + }, + { + "f": "0.9604857563972473" + }, + { + "f": "0.9246655106544495" + }, + { + "f": "0.8903198838233948" + }, + { + "f": "0.8564729690551758" + }, + { + "f": "0.8279483914375305" + }, + { + "f": "0.799892783164978" + }, + { + "f": "0.7681103944778442" + }, + { + "f": "0.7378535866737366" + }, + { + "f": "0.7084620594978333" + }, + { + "f": "0.6798517107963562" + }, + { + "f": "0.6522144675254822" + }, + { + "f": "0.6254565715789795" + }, + { + "f": "0.5992606282234192" + }, + { + "f": "0.57415372133255" + }, + { + "f": "0.5497958660125732" + }, + { + "f": "0.529195249080658" + }, + { + "f": "0.5094658732414246" + }, + { + "f": "0.4873117208480835" + }, + { + "f": "0.46617648005485535" + }, + { + "f": "0.4466250240802765" + }, + { + "f": "0.4282500743865967" + }, + { + "f": "0.410895437002182" + }, + { + "f": "0.3943990170955658" + }, + { + "f": "0.3787137567996979" + }, + { + "f": "0.36363744735717773" + }, + { + "f": "0.34861963987350464" + }, + { + "f": "0.3342008590698242" + }, + { + "f": "0.3219331204891205" + }, + { + "f": "0.3091756999492645" + }, + { + "f": "0.29388025403022766" + }, + { + "f": "0.2778830826282501" + }, + { + "f": "0.26174622774124146" + }, + { + "f": "0.2464468628168106" + }, + { + "f": "0.2319667935371399" + }, + { + "f": "0.2183227688074112" + }, + { + "f": "0.20615752041339874" + }, + { + "f": "0.19511842727661133" + }, + { + "f": "0.1862679421901703" + }, + { + "f": "0.17768479883670807" + }, + { + "f": "0.16777905821800232" + }, + { + "f": "0.15951082110404968" + }, + { + "f": "0.15262918174266815" + }, + { + "f": "0.14693313837051392" + }, + { + "f": "0.14110279083251953" + }, + { + "f": "0.13413256406784058" + }, + { + "f": "0.1269659698009491" + }, + { + "f": "0.11992102861404419" + }, + { + "f": "0.11408266425132751" + }, + { + "f": "0.10862265527248383" + }, + { + "f": "0.10218213498592377" + }, + { + "f": "0.0957704409956932" + }, + { + "f": "0.08967197686433792" + }, + { + "f": "0.0841095820069313" + }, + { + "f": "0.079193614423275" + }, + { + "f": "0.07438082247972488" + }, + { + "f": "0.06960376352071762" + }, + { + "f": "0.06486985087394714" + }, + { + "f": "0.06071783974766731" + }, + { + "f": "0.05654806271195412" + }, + { + "f": "0.05189167335629463" + }, + { + "f": "0.04816518723964691" + }, + { + "f": "0.04507864639163017" + }, + { + "f": "0.04268461465835571" + }, + { + "f": "0.03972570598125458" + }, + { + "f": "0.035512588918209076" + }, + { + "f": "0.03049141727387905" + }, + { + "f": "0.02572164312005043" + }, + { + "f": "0.022303694859147072" + }, + { + "f": "0.019688347354531288" + }, + { + "f": "0.0169980525970459" + }, + { + "f": "0.014270870946347713" + }, + { + "f": "0.01152084395289421" + }, + { + "f": "0.007973861880600452" + }, + { + "f": "0.0045989095233380795" + }, + { + "f": "0.002035218058153987" + }, + { + "f": "0.0003077762958128005" + }, + { + "f": "0.0" + }, + { + "f": "0.0" + } + ], + "spectrum_nm": [ + { + "f": "380.0" + }, + { + "f": "381.91977077363896" + }, + { + "f": "383.8395415472779" + }, + { + "f": "385.75931232091693" + }, + { + "f": "387.6790830945559" + }, + { + "f": "389.59885386819485" + }, + { + "f": "391.5186246418338" + }, + { + "f": "393.43839541547277" + }, + { + "f": "395.3581661891117" + }, + { + "f": "397.2779369627507" + }, + { + "f": "399.1977077363897" + }, + { + "f": "401.11747851002866" + }, + { + "f": "403.0372492836676" + }, + { + "f": "404.9570200573066" + }, + { + "f": "406.87679083094554" + }, + { + "f": "408.79656160458455" + }, + { + "f": "410.7163323782235" + }, + { + "f": "412.63610315186247" + }, + { + "f": "414.55587392550143" + }, + { + "f": "416.4756446991404" + }, + { + "f": "418.39541547277935" + }, + { + "f": "420.3151862464183" + }, + { + "f": "422.2349570200573" + }, + { + "f": "424.1547277936963" + }, + { + "f": "426.07449856733524" + }, + { + "f": "427.9942693409742" + }, + { + "f": "429.91404011461316" + }, + { + "f": "431.8338108882522" + }, + { + "f": "433.75358166189113" + }, + { + "f": "435.6733524355301" + }, + { + "f": "437.59312320916905" + }, + { + "f": "439.512893982808" + }, + { + "f": "441.43266475644697" + }, + { + "f": "443.3524355300859" + }, + { + "f": "445.27220630372494" + }, + { + "f": "447.1919770773639" + }, + { + "f": "449.11174785100286" + }, + { + "f": "451.0315186246418" + }, + { + "f": "452.9512893982808" + }, + { + "f": "454.8710601719198" + }, + { + "f": "456.79083094555875" + }, + { + "f": "458.7106017191977" + }, + { + "f": "460.63037249283667" + }, + { + "f": "462.55014326647563" + }, + { + "f": "464.46991404011465" + }, + { + "f": "466.38968481375355" + }, + { + "f": "468.30945558739256" + }, + { + "f": "470.2292263610315" + }, + { + "f": "472.1489971346705" + }, + { + "f": "474.06876790830944" + }, + { + "f": "475.9885386819484" + }, + { + "f": "477.9083094555874" + }, + { + "f": "479.8280802292264" + }, + { + "f": "481.74785100286533" + }, + { + "f": "483.6676217765043" + }, + { + "f": "485.58739255014325" + }, + { + "f": "487.50716332378227" + }, + { + "f": "489.42693409742117" + }, + { + "f": "491.3467048710602" + }, + { + "f": "493.26647564469914" + }, + { + "f": "495.1862464183381" + }, + { + "f": "497.10601719197706" + }, + { + "f": "499.025787965616" + }, + { + "f": "500.94555873925503" + }, + { + "f": "502.865329512894" + }, + { + "f": "504.78510028653295" + }, + { + "f": "506.7048710601719" + }, + { + "f": "508.62464183381087" + }, + { + "f": "510.5444126074499" + }, + { + "f": "512.4641833810888" + }, + { + "f": "514.3839541547278" + }, + { + "f": "516.3037249283668" + }, + { + "f": "518.2234957020057" + }, + { + "f": "520.1432664756447" + }, + { + "f": "522.0630372492836" + }, + { + "f": "523.9828080229227" + }, + { + "f": "525.9025787965616" + }, + { + "f": "527.8223495702006" + }, + { + "f": "529.7421203438396" + }, + { + "f": "531.6618911174785" + }, + { + "f": "533.5816618911175" + }, + { + "f": "535.5014326647564" + }, + { + "f": "537.4212034383954" + }, + { + "f": "539.3409742120343" + }, + { + "f": "541.2607449856733" + }, + { + "f": "543.1805157593124" + }, + { + "f": "545.1002865329513" + }, + { + "f": "547.0200573065903" + }, + { + "f": "548.9398280802293" + }, + { + "f": "550.8595988538682" + }, + { + "f": "552.7793696275071" + }, + { + "f": "554.6991404011461" + }, + { + "f": "556.6189111747851" + }, + { + "f": "558.538681948424" + }, + { + "f": "560.458452722063" + }, + { + "f": "562.3782234957021" + }, + { + "f": "564.297994269341" + }, + { + "f": "566.21776504298" + }, + { + "f": "568.1375358166189" + }, + { + "f": "570.0573065902579" + }, + { + "f": "571.9770773638968" + }, + { + "f": "573.8968481375358" + }, + { + "f": "575.8166189111748" + }, + { + "f": "577.7363896848137" + }, + { + "f": "579.6561604584527" + }, + { + "f": "581.5759312320916" + }, + { + "f": "583.4957020057307" + }, + { + "f": "585.4154727793696" + }, + { + "f": "587.3352435530086" + }, + { + "f": "589.2550143266476" + }, + { + "f": "591.1747851002865" + }, + { + "f": "593.0945558739255" + }, + { + "f": "595.0143266475645" + }, + { + "f": "596.9340974212034" + }, + { + "f": "598.8538681948423" + }, + { + "f": "600.7736389684814" + }, + { + "f": "602.6934097421204" + }, + { + "f": "604.6131805157593" + }, + { + "f": "606.5329512893983" + }, + { + "f": "608.4527220630373" + }, + { + "f": "610.3724928366762" + }, + { + "f": "612.2922636103152" + }, + { + "f": "614.2120343839541" + }, + { + "f": "616.1318051575931" + }, + { + "f": "618.051575931232" + }, + { + "f": "619.971346704871" + }, + { + "f": "621.8911174785101" + }, + { + "f": "623.810888252149" + }, + { + "f": "625.730659025788" + }, + { + "f": "627.6504297994269" + }, + { + "f": "629.5702005730659" + }, + { + "f": "631.4899713467048" + }, + { + "f": "633.4097421203438" + }, + { + "f": "635.3295128939828" + }, + { + "f": "637.2492836676217" + }, + { + "f": "639.1690544412608" + }, + { + "f": "641.0888252148998" + }, + { + "f": "643.0085959885387" + }, + { + "f": "644.9283667621776" + }, + { + "f": "646.8481375358166" + }, + { + "f": "648.7679083094556" + }, + { + "f": "650.6876790830945" + }, + { + "f": "652.6074498567335" + }, + { + "f": "654.5272206303725" + }, + { + "f": "656.4469914040114" + }, + { + "f": "658.3667621776503" + }, + { + "f": "660.2865329512895" + }, + { + "f": "662.2063037249284" + }, + { + "f": "664.1260744985673" + }, + { + "f": "666.0458452722063" + }, + { + "f": "667.9656160458453" + }, + { + "f": "669.8853868194842" + }, + { + "f": "671.8051575931232" + }, + { + "f": "673.7249283667622" + }, + { + "f": "675.6446991404011" + }, + { + "f": "677.56446991404" + }, + { + "f": "679.4842406876791" + }, + { + "f": "681.4040114613181" + }, + { + "f": "683.323782234957" + }, + { + "f": "685.243553008596" + }, + { + "f": "687.163323782235" + }, + { + "f": "689.0830945558739" + }, + { + "f": "691.0028653295128" + }, + { + "f": "692.9226361031518" + }, + { + "f": "694.8424068767908" + }, + { + "f": "696.7621776504297" + }, + { + "f": "698.6819484240688" + }, + { + "f": "700.6017191977078" + }, + { + "f": "702.5214899713467" + }, + { + "f": "704.4412607449856" + }, + { + "f": "706.3610315186247" + }, + { + "f": "708.2808022922636" + }, + { + "f": "710.2005730659025" + }, + { + "f": "712.1203438395415" + }, + { + "f": "714.0401146131805" + }, + { + "f": "715.9598853868195" + }, + { + "f": "717.8796561604585" + }, + { + "f": "719.7994269340975" + }, + { + "f": "721.7191977077364" + }, + { + "f": "723.6389684813753" + }, + { + "f": "725.5587392550143" + }, + { + "f": "727.4785100286533" + }, + { + "f": "729.3982808022922" + }, + { + "f": "731.3180515759312" + }, + { + "f": "733.2378223495703" + }, + { + "f": "735.1575931232092" + }, + { + "f": "737.077363896848" + }, + { + "f": "738.9971346704871" + }, + { + "f": "740.9169054441261" + }, + { + "f": "742.836676217765" + }, + { + "f": "744.756446991404" + }, + { + "f": "746.676217765043" + }, + { + "f": "748.5959885386819" + }, + { + "f": "750.5157593123208" + }, + { + "f": "752.43553008596" + }, + { + "f": "754.3553008595989" + }, + { + "f": "756.2750716332378" + }, + { + "f": "758.1948424068768" + }, + { + "f": "760.1146131805158" + }, + { + "f": "762.0343839541547" + }, + { + "f": "763.9541547277937" + }, + { + "f": "765.8739255014327" + }, + { + "f": "767.7936962750716" + }, + { + "f": "769.7134670487105" + }, + { + "f": "771.6332378223495" + }, + { + "f": "773.5530085959886" + }, + { + "f": "775.4727793696275" + }, + { + "f": "777.3925501432665" + }, + { + "f": "779.3123209169055" + }, + { + "f": "781.2320916905444" + }, + { + "f": "783.1518624641833" + }, + { + "f": "785.0716332378223" + }, + { + "f": "786.9914040114613" + }, + { + "f": "788.9111747851002" + }, + { + "f": "790.8309455587392" + }, + { + "f": "792.7507163323783" + }, + { + "f": "794.6704871060172" + }, + { + "f": "796.5902578796561" + }, + { + "f": "798.5100286532952" + }, + { + "f": "800.4297994269341" + }, + { + "f": "802.349570200573" + }, + { + "f": "804.269340974212" + }, + { + "f": "806.189111747851" + }, + { + "f": "808.1088825214899" + }, + { + "f": "810.028653295129" + }, + { + "f": "811.948424068768" + }, + { + "f": "813.8681948424069" + }, + { + "f": "815.7879656160458" + }, + { + "f": "817.7077363896848" + }, + { + "f": "819.6275071633238" + }, + { + "f": "821.5472779369627" + }, + { + "f": "823.4670487106017" + }, + { + "f": "825.3868194842407" + }, + { + "f": "827.3065902578796" + }, + { + "f": "829.2263610315185" + }, + { + "f": "831.1461318051576" + }, + { + "f": "833.0659025787966" + }, + { + "f": "834.9856733524355" + }, + { + "f": "836.9054441260745" + }, + { + "f": "838.8252148997135" + }, + { + "f": "840.7449856733524" + }, + { + "f": "842.6647564469913" + }, + { + "f": "844.5845272206304" + }, + { + "f": "846.5042979942693" + }, + { + "f": "848.4240687679082" + }, + { + "f": "850.3438395415473" + }, + { + "f": "852.2636103151863" + }, + { + "f": "854.1833810888252" + }, + { + "f": "856.1031518624642" + }, + { + "f": "858.0229226361032" + }, + { + "f": "859.9426934097421" + }, + { + "f": "861.862464183381" + }, + { + "f": "863.78223495702" + }, + { + "f": "865.702005730659" + }, + { + "f": "867.6217765042979" + }, + { + "f": "869.541547277937" + }, + { + "f": "871.461318051576" + }, + { + "f": "873.3810888252149" + }, + { + "f": "875.3008595988538" + }, + { + "f": "877.2206303724929" + }, + { + "f": "879.1404011461318" + }, + { + "f": "881.0601719197707" + }, + { + "f": "882.9799426934097" + }, + { + "f": "884.8997134670487" + }, + { + "f": "886.8194842406876" + }, + { + "f": "888.7392550143267" + }, + { + "f": "890.6590257879657" + }, + { + "f": "892.5787965616046" + }, + { + "f": "894.4985673352436" + }, + { + "f": "896.4183381088825" + }, + { + "f": "898.3381088825215" + }, + { + "f": "900.2578796561604" + }, + { + "f": "902.1776504297994" + }, + { + "f": "904.0974212034383" + }, + { + "f": "906.0171919770773" + }, + { + "f": "907.9369627507164" + }, + { + "f": "909.8567335243553" + }, + { + "f": "911.7765042979943" + }, + { + "f": "913.6962750716332" + }, + { + "f": "915.6160458452722" + }, + { + "f": "917.5358166189112" + }, + { + "f": "919.4555873925501" + }, + { + "f": "921.3753581661891" + }, + { + "f": "923.295128939828" + }, + { + "f": "925.214899713467" + }, + { + "f": "927.134670487106" + }, + { + "f": "929.054441260745" + }, + { + "f": "930.974212034384" + }, + { + "f": "932.8939828080229" + }, + { + "f": "934.8137535816619" + }, + { + "f": "936.7335243553008" + }, + { + "f": "938.6532951289398" + }, + { + "f": "940.5730659025788" + }, + { + "f": "942.4928366762177" + }, + { + "f": "944.4126074498568" + }, + { + "f": "946.3323782234957" + }, + { + "f": "948.2521489971347" + }, + { + "f": "950.1719197707736" + }, + { + "f": "952.0916905444126" + }, + { + "f": "954.0114613180516" + }, + { + "f": "955.9312320916905" + }, + { + "f": "957.8510028653295" + }, + { + "f": "959.7707736389684" + }, + { + "f": "961.6905444126074" + }, + { + "f": "963.6103151862465" + }, + { + "f": "965.5300859598854" + }, + { + "f": "967.4498567335244" + }, + { + "f": "969.3696275071633" + }, + { + "f": "971.2893982808023" + }, + { + "f": "973.2091690544412" + }, + { + "f": "975.1289398280802" + }, + { + "f": "977.0487106017192" + }, + { + "f": "978.9684813753581" + }, + { + "f": "980.8882521489971" + }, + { + "f": "982.808022922636" + }, + { + "f": "984.7277936962751" + }, + { + "f": "986.6475644699141" + }, + { + "f": "988.567335243553" + }, + { + "f": "990.487106017192" + }, + { + "f": "992.4068767908309" + }, + { + "f": "994.3266475644699" + }, + { + "f": "996.2464183381088" + }, + { + "f": "998.1661891117478" + }, + { + "f": "1000.0859598853868" + }, + { + "f": "1002.0057306590257" + }, + { + "f": "1003.9255014326648" + }, + { + "f": "1005.8452722063037" + }, + { + "f": "1007.7650429799427" + }, + { + "f": "1009.6848137535817" + }, + { + "f": "1011.6045845272206" + }, + { + "f": "1013.5243553008596" + }, + { + "f": "1015.4441260744985" + }, + { + "f": "1017.3638968481375" + }, + { + "f": "1019.2836676217764" + }, + { + "f": "1021.2034383954154" + }, + { + "f": "1023.1232091690545" + }, + { + "f": "1025.0429799426934" + }, + { + "f": "1026.9627507163323" + }, + { + "f": "1028.8825214899712" + }, + { + "f": "1030.8022922636103" + }, + { + "f": "1032.7220630372494" + }, + { + "f": "1034.6418338108883" + }, + { + "f": "1036.5616045845272" + }, + { + "f": "1038.4813753581661" + }, + { + "f": "1040.401146131805" + }, + { + "f": "1042.320916905444" + }, + { + "f": "1044.240687679083" + }, + { + "f": "1046.1604584527222" + }, + { + "f": "1048.080229226361" + }, + { + "f": "1050.0" + } + ], + "Voltage_V": { + "f": "230.30111694335938" + }, + "Current_A": { + "f": "0.06532319635152817" + }, + "Power_W": { + "f": "8.404557228088379" + }, + "Freq_Hz": { + "f": "50.02182388305664" + }, + "PF": { + "f": "0.558664858341217" + } + } + }, + { + "name": "r05", + "source": "usb_capture_20260204_123903_hub1#11", + "harmonics": false, + "keys": [ + "device", + "Phi_lm", + "eta_lm_W", + "CCT_K", + "Duv", + "x", + "y", + "u", + "v", + "u_prime", + "v_prime", + "SDCM", + "Ra", + "R1", + "R2", + "R3", + "R4", + "R5", + "R6", + "R7", + "R8", + "R9", + "R10", + "R11", + "R12", + "R13", + "R14", + "R15", + "Phi_e_mW", + "Phi_euv_mW", + "Phi_eb_mW", + "Phi_ey_mW", + "Phi_er_mW", + "Phi_efr_mW", + "Phi_eir_mW", + "Phi_e_total", + "CIE_X", + "CIE_Y", + "CIE_Z", + "TLCI", + "PeakSignal", + "DarkSignal", + "Compensate", + "test_date", + "test_time", + "spectrum", + "spectrum_nm", + "Voltage_V", + "Current_A", + "Power_W", + "Freq_Hz", + "PF" + ], + "values": { + "device": "HPCS6500", + "Phi_lm": { + "f": "479.61688232421875" + }, + "eta_lm_W": { + "f": "57.09785461425781" + }, + "CCT_K": { + "f": "5655.04931640625" + }, + "Duv": { + "f": "0.005514893215149641" + }, + "x": { + "f": "0.32883065938949585" + }, + "y": { + "f": "0.34880587458610535" + }, + "u": { + "f": "0.20148910582065582" + }, + "v": { + "f": "0.3205931782722473" + }, + "u_prime": { + "f": "0.20148910582065582" + }, + "v_prime": { + "f": "0.48088976740837097" + }, + "SDCM": { + "f": "4.689785480499268" + }, + "Ra": { + "f": "83.1019287109375" + }, + "R1": { + "f": "82.3944320678711" + }, + "R2": { + "f": "94.21000671386719" + }, + "R3": { + "f": "93.1120834350586" + }, + "R4": { + "f": "76.46770477294922" + }, + "R5": { + "f": "81.47521209716797" + }, + "R6": { + "f": "89.57075500488281" + }, + "R7": { + "f": "83.24170684814453" + }, + "R8": { + "f": "64.343505859375" + }, + "R9": { + "f": "5.2721099853515625" + }, + "R10": { + "f": "84.44823455810547" + }, + "R11": { + "f": "76.06077575683594" + }, + "R12": { + "f": "60.25636291503906" + }, + "R13": { + "f": "86.82209777832031" + }, + "R14": { + "f": "96.66696166992188" + }, + "R15": { + "f": "76.29528045654297" + }, + "Phi_e_mW": { + "f": "1491.543701171875" + }, + "Phi_euv_mW": { + "f": "0.0" + }, + "Phi_eb_mW": { + "f": "469.8504333496094" + }, + "Phi_ey_mW": { + "f": "679.9556274414062" + }, + "Phi_er_mW": { + "f": "331.67364501953125" + }, + "Phi_efr_mW": { + "f": "11.56343936920166" + }, + "Phi_eir_mW": { + "f": "0.0" + }, + "Phi_e_total": { + "f": "1493.0426025390625" + }, + "CIE_X": { + "f": "662.0065307617188" + }, + "CIE_Y": { + "f": "702.2208862304688" + }, + "CIE_Z": { + "f": "648.9866943359375" + }, + "TLCI": { + "f": "67.98677825927734" + }, + "PeakSignal": { + "f": "53066.0" + }, + "DarkSignal": { + "f": "2236.0" + }, + "Compensate": { + "f": "2834.0" + }, + "test_date": "2026-02-04", + "test_time": "16:04:22", + "spectrum": [ + { + "f": "0.0004157860530540347" + }, + { + "f": "0.004987652879208326" + }, + { + "f": "0.016479255631566048" + }, + { + "f": "0.03498183935880661" + }, + { + "f": "0.059826672077178955" + }, + { + "f": "0.08959031850099564" + }, + { + "f": "0.12816575169563293" + }, + { + "f": "0.1715727299451828" + }, + { + "f": "0.21497905254364014" + }, + { + "f": "0.2635093331336975" + }, + { + "f": "0.3198435306549072" + }, + { + "f": "0.38640132546424866" + }, + { + "f": "0.4645054042339325" + }, + { + "f": "0.5533803105354309" + }, + { + "f": "0.6544179320335388" + }, + { + "f": "0.7697383761405945" + }, + { + "f": "0.9013108015060425" + }, + { + "f": "1.0504144430160522" + }, + { + "f": "1.217911958694458" + }, + { + "f": "1.4041765928268433" + }, + { + "f": "1.609877586364746" + }, + { + "f": "1.8377327919006348" + }, + { + "f": "2.088894844055176" + }, + { + "f": "2.364362955093384" + }, + { + "f": "2.6653668880462646" + }, + { + "f": "2.9920806884765625" + }, + { + "f": "3.3490147590637207" + }, + { + "f": "3.7379472255706787" + }, + { + "f": "4.158629417419434" + }, + { + "f": "4.617917060852051" + }, + { + "f": "5.17496395111084" + }, + { + "f": "5.784088611602783" + }, + { + "f": "6.390666961669922" + }, + { + "f": "7.05443000793457" + }, + { + "f": "7.77499532699585" + }, + { + "f": "8.552019119262695" + }, + { + "f": "9.372265815734863" + }, + { + "f": "10.215507507324219" + }, + { + "f": "11.055761337280273" + }, + { + "f": "11.859306335449219" + }, + { + "f": "12.583510398864746" + }, + { + "f": "13.182290077209473" + }, + { + "f": "13.615365028381348" + }, + { + "f": "13.84082317352295" + }, + { + "f": "13.848910331726074" + }, + { + "f": "13.65327262878418" + }, + { + "f": "13.279745101928711" + }, + { + "f": "12.770666122436523" + }, + { + "f": "12.16819953918457" + }, + { + "f": "11.519532203674316" + }, + { + "f": "10.871264457702637" + }, + { + "f": "10.253180503845215" + }, + { + "f": "9.687244415283203" + }, + { + "f": "9.181208610534668" + }, + { + "f": "8.732922554016113" + }, + { + "f": "8.338847160339355" + }, + { + "f": "7.987870693206787" + }, + { + "f": "7.668362140655518" + }, + { + "f": "7.368908882141113" + }, + { + "f": "7.0798234939575195" + }, + { + "f": "6.7960524559021" + }, + { + "f": "6.5173468589782715" + }, + { + "f": "6.247235298156738" + }, + { + "f": "5.988727569580078" + }, + { + "f": "5.7447123527526855" + }, + { + "f": "5.517772197723389" + }, + { + "f": "5.302234649658203" + }, + { + "f": "5.113121509552002" + }, + { + "f": "4.951633930206299" + }, + { + "f": "4.817450523376465" + }, + { + "f": "4.7099690437316895" + }, + { + "f": "4.628472328186035" + }, + { + "f": "4.568262577056885" + }, + { + "f": "4.528221130371094" + }, + { + "f": "4.496727466583252" + }, + { + "f": "4.483546733856201" + }, + { + "f": "4.490718364715576" + }, + { + "f": "4.5061845779418945" + }, + { + "f": "4.528772830963135" + }, + { + "f": "4.558420181274414" + }, + { + "f": "4.595463275909424" + }, + { + "f": "4.640551567077637" + }, + { + "f": "4.691331386566162" + }, + { + "f": "4.7477707862854" + }, + { + "f": "4.809442520141602" + }, + { + "f": "4.87584114074707" + }, + { + "f": "4.948122978210449" + }, + { + "f": "5.0241899490356445" + }, + { + "f": "5.104642868041992" + }, + { + "f": "5.188735485076904" + }, + { + "f": "5.275362968444824" + }, + { + "f": "5.364267349243164" + }, + { + "f": "5.4523024559021" + }, + { + "f": "5.536489963531494" + }, + { + "f": "5.616669654846191" + }, + { + "f": "5.693221092224121" + }, + { + "f": "5.764525413513184" + }, + { + "f": "5.834247589111328" + }, + { + "f": "5.901203155517578" + }, + { + "f": "5.965015411376953" + }, + { + "f": "6.025880813598633" + }, + { + "f": "6.081242084503174" + }, + { + "f": "6.132264137268066" + }, + { + "f": "6.179717540740967" + }, + { + "f": "6.223515510559082" + }, + { + "f": "6.263883113861084" + }, + { + "f": "6.299418926239014" + }, + { + "f": "6.330620765686035" + }, + { + "f": "6.3588690757751465" + }, + { + "f": "6.384148120880127" + }, + { + "f": "6.407815933227539" + }, + { + "f": "6.435364723205566" + }, + { + "f": "6.462563514709473" + }, + { + "f": "6.486796855926514" + }, + { + "f": "6.511353492736816" + }, + { + "f": "6.533760070800781" + }, + { + "f": "6.553478717803955" + }, + { + "f": "6.572179317474365" + }, + { + "f": "6.591019630432129" + }, + { + "f": "6.612974166870117" + }, + { + "f": "6.637327194213867" + }, + { + "f": "6.662991523742676" + }, + { + "f": "6.690215587615967" + }, + { + "f": "6.718362808227539" + }, + { + "f": "6.747089385986328" + }, + { + "f": "6.775697708129883" + }, + { + "f": "6.804011821746826" + }, + { + "f": "6.833553314208984" + }, + { + "f": "6.8643927574157715" + }, + { + "f": "6.895402431488037" + }, + { + "f": "6.925990104675293" + }, + { + "f": "6.954676628112793" + }, + { + "f": "6.982191562652588" + }, + { + "f": "7.0080413818359375" + }, + { + "f": "7.032857894897461" + }, + { + "f": "7.056759357452393" + }, + { + "f": "7.0801777839660645" + }, + { + "f": "7.103926181793213" + }, + { + "f": "7.126586437225342" + }, + { + "f": "7.147558689117432" + }, + { + "f": "7.166439533233643" + }, + { + "f": "7.1824846267700195" + }, + { + "f": "7.195322036743164" + }, + { + "f": "7.207064151763916" + }, + { + "f": "7.218794345855713" + }, + { + "f": "7.231225967407227" + }, + { + "f": "7.245168685913086" + }, + { + "f": "7.258856296539307" + }, + { + "f": "7.272427082061768" + }, + { + "f": "7.285966873168945" + }, + { + "f": "7.299202919006348" + }, + { + "f": "7.312840938568115" + }, + { + "f": "7.32651948928833" + }, + { + "f": "7.341482639312744" + }, + { + "f": "7.3583784103393555" + }, + { + "f": "7.375974178314209" + }, + { + "f": "7.395349025726318" + }, + { + "f": "7.4170989990234375" + }, + { + "f": "7.443362236022949" + }, + { + "f": "7.469849109649658" + }, + { + "f": "7.491787433624268" + }, + { + "f": "7.509410381317139" + }, + { + "f": "7.522050857543945" + }, + { + "f": "7.529561996459961" + }, + { + "f": "7.530663967132568" + }, + { + "f": "7.526712894439697" + }, + { + "f": "7.518967628479004" + }, + { + "f": "7.509803295135498" + }, + { + "f": "7.499517440795898" + }, + { + "f": "7.489635467529297" + }, + { + "f": "7.480289936065674" + }, + { + "f": "7.470797061920166" + }, + { + "f": "7.458563327789307" + }, + { + "f": "7.441341876983643" + }, + { + "f": "7.4181437492370605" + }, + { + "f": "7.391322135925293" + }, + { + "f": "7.362698554992676" + }, + { + "f": "7.331874370574951" + }, + { + "f": "7.298513412475586" + }, + { + "f": "7.261674880981445" + }, + { + "f": "7.222433567047119" + }, + { + "f": "7.180850982666016" + }, + { + "f": "7.138707160949707" + }, + { + "f": "7.106398105621338" + }, + { + "f": "7.072221755981445" + }, + { + "f": "7.024292469024658" + }, + { + "f": "6.97105598449707" + }, + { + "f": "6.912731170654297" + }, + { + "f": "6.851312637329102" + }, + { + "f": "6.789456367492676" + }, + { + "f": "6.726987361907959" + }, + { + "f": "6.663364887237549" + }, + { + "f": "6.597919940948486" + }, + { + "f": "6.528092384338379" + }, + { + "f": "6.4548444747924805" + }, + { + "f": "6.378358840942383" + }, + { + "f": "6.299036979675293" + }, + { + "f": "6.21875" + }, + { + "f": "6.136559963226318" + }, + { + "f": "6.0538153648376465" + }, + { + "f": "5.971128463745117" + }, + { + "f": "5.887802600860596" + }, + { + "f": "5.804631233215332" + }, + { + "f": "5.734677314758301" + }, + { + "f": "5.663485527038574" + }, + { + "f": "5.5765461921691895" + }, + { + "f": "5.489260673522949" + }, + { + "f": "5.402467250823975" + }, + { + "f": "5.315903186798096" + }, + { + "f": "5.230358600616455" + }, + { + "f": "5.144629955291748" + }, + { + "f": "5.057394504547119" + }, + { + "f": "4.969849586486816" + }, + { + "f": "4.882277965545654" + }, + { + "f": "4.795890808105469" + }, + { + "f": "4.711532115936279" + }, + { + "f": "4.628123760223389" + }, + { + "f": "4.544620037078857" + }, + { + "f": "4.459782600402832" + }, + { + "f": "4.374070644378662" + }, + { + "f": "4.287807464599609" + }, + { + "f": "4.214876651763916" + }, + { + "f": "4.142204761505127" + }, + { + "f": "4.056548595428467" + }, + { + "f": "3.970942258834839" + }, + { + "f": "3.885680675506592" + }, + { + "f": "3.7999777793884277" + }, + { + "f": "3.7142887115478516" + }, + { + "f": "3.628805160522461" + }, + { + "f": "3.5429956912994385" + }, + { + "f": "3.4575064182281494" + }, + { + "f": "3.372368335723877" + }, + { + "f": "3.2883033752441406" + }, + { + "f": "3.2050514221191406" + }, + { + "f": "3.1222727298736572" + }, + { + "f": "3.039167642593384" + }, + { + "f": "2.9679908752441406" + }, + { + "f": "2.8982017040252686" + }, + { + "f": "2.818415641784668" + }, + { + "f": "2.7406201362609863" + }, + { + "f": "2.664609909057617" + }, + { + "f": "2.5886008739471436" + }, + { + "f": "2.5136096477508545" + }, + { + "f": "2.440042018890381" + }, + { + "f": "2.367302656173706" + }, + { + "f": "2.2973215579986572" + }, + { + "f": "2.229680299758911" + }, + { + "f": "2.1641132831573486" + }, + { + "f": "2.100806474685669" + }, + { + "f": "2.0383307933807373" + }, + { + "f": "1.9856219291687012" + }, + { + "f": "1.9344183206558228" + }, + { + "f": "1.8766424655914307" + }, + { + "f": "1.8207842111587524" + }, + { + "f": "1.7665472030639648" + }, + { + "f": "1.7132866382598877" + }, + { + "f": "1.660192608833313" + }, + { + "f": "1.6069341897964478" + }, + { + "f": "1.5540082454681396" + }, + { + "f": "1.5019268989562988" + }, + { + "f": "1.4528515338897705" + }, + { + "f": "1.4071563482284546" + }, + { + "f": "1.3643732070922852" + }, + { + "f": "1.3290960788726807" + }, + { + "f": "1.2943893671035767" + }, + { + "f": "1.2537716627120972" + }, + { + "f": "1.212225079536438" + }, + { + "f": "1.1695908308029175" + }, + { + "f": "1.1263211965560913" + }, + { + "f": "1.0839251279830933" + }, + { + "f": "1.0435600280761719" + }, + { + "f": "1.0060203075408936" + }, + { + "f": "0.9703449010848999" + }, + { + "f": "0.9356949329376221" + }, + { + "f": "0.9020255208015442" + }, + { + "f": "0.8679722547531128" + }, + { + "f": "0.8386279940605164" + }, + { + "f": "0.8098198771476746" + }, + { + "f": "0.7767947316169739" + }, + { + "f": "0.7452656626701355" + }, + { + "f": "0.715687096118927" + }, + { + "f": "0.6873993277549744" + }, + { + "f": "0.6592560410499573" + }, + { + "f": "0.6318541169166565" + }, + { + "f": "0.604995846748352" + }, + { + "f": "0.5790361762046814" + }, + { + "f": "0.5547855496406555" + }, + { + "f": "0.5346823930740356" + }, + { + "f": "0.5151894688606262" + }, + { + "f": "0.493781715631485" + }, + { + "f": "0.4730781316757202" + }, + { + "f": "0.4528731405735016" + }, + { + "f": "0.4338838756084442" + }, + { + "f": "0.4160083532333374" + }, + { + "f": "0.3993763327598572" + }, + { + "f": "0.383827805519104" + }, + { + "f": "0.36895841360092163" + }, + { + "f": "0.3540513515472412" + }, + { + "f": "0.3394295573234558" + }, + { + "f": "0.3268275856971741" + }, + { + "f": "0.3139062225818634" + }, + { + "f": "0.29871100187301636" + }, + { + "f": "0.28284144401550293" + }, + { + "f": "0.26707711815834045" + }, + { + "f": "0.2518649697303772" + }, + { + "f": "0.23784415423870087" + }, + { + "f": "0.22483320534229279" + }, + { + "f": "0.21288183331489563" + }, + { + "f": "0.20162364840507507" + }, + { + "f": "0.1929866075515747" + }, + { + "f": "0.185403510928154" + }, + { + "f": "0.1771833300590515" + }, + { + "f": "0.1696980893611908" + }, + { + "f": "0.16258835792541504" + }, + { + "f": "0.1553506851196289" + }, + { + "f": "0.14765584468841553" + }, + { + "f": "0.14021946489810944" + }, + { + "f": "0.1324339658021927" + }, + { + "f": "0.12540766596794128" + }, + { + "f": "0.12034812569618225" + }, + { + "f": "0.11520856618881226" + }, + { + "f": "0.10952769219875336" + }, + { + "f": "0.10376204550266266" + }, + { + "f": "0.09758488088846207" + }, + { + "f": "0.09131356328725815" + }, + { + "f": "0.08525160700082779" + }, + { + "f": "0.07984694093465805" + }, + { + "f": "0.07510937750339508" + }, + { + "f": "0.07063662260770798" + }, + { + "f": "0.06690887361764908" + }, + { + "f": "0.06325231492519379" + }, + { + "f": "0.05938653275370598" + }, + { + "f": "0.05615515634417534" + }, + { + "f": "0.05308203399181366" + }, + { + "f": "0.04978761449456215" + }, + { + "f": "0.0462985560297966" + }, + { + "f": "0.0427696630358696" + }, + { + "f": "0.038933198899030685" + }, + { + "f": "0.034805797040462494" + }, + { + "f": "0.031548094004392624" + }, + { + "f": "0.028485380113124847" + }, + { + "f": "0.025540918111801147" + }, + { + "f": "0.022814752534031868" + }, + { + "f": "0.019672192633152008" + }, + { + "f": "0.01640632189810276" + }, + { + "f": "0.012874252162873745" + }, + { + "f": "0.009191181510686874" + }, + { + "f": "0.00555529585108161" + }, + { + "f": "0.0029094635974615812" + }, + { + "f": "0.0011141066206619143" + } + ], + "spectrum_nm": [ + { + "f": "380.0" + }, + { + "f": "381.91977077363896" + }, + { + "f": "383.8395415472779" + }, + { + "f": "385.75931232091693" + }, + { + "f": "387.6790830945559" + }, + { + "f": "389.59885386819485" + }, + { + "f": "391.5186246418338" + }, + { + "f": "393.43839541547277" + }, + { + "f": "395.3581661891117" + }, + { + "f": "397.2779369627507" + }, + { + "f": "399.1977077363897" + }, + { + "f": "401.11747851002866" + }, + { + "f": "403.0372492836676" + }, + { + "f": "404.9570200573066" + }, + { + "f": "406.87679083094554" + }, + { + "f": "408.79656160458455" + }, + { + "f": "410.7163323782235" + }, + { + "f": "412.63610315186247" + }, + { + "f": "414.55587392550143" + }, + { + "f": "416.4756446991404" + }, + { + "f": "418.39541547277935" + }, + { + "f": "420.3151862464183" + }, + { + "f": "422.2349570200573" + }, + { + "f": "424.1547277936963" + }, + { + "f": "426.07449856733524" + }, + { + "f": "427.9942693409742" + }, + { + "f": "429.91404011461316" + }, + { + "f": "431.8338108882522" + }, + { + "f": "433.75358166189113" + }, + { + "f": "435.6733524355301" + }, + { + "f": "437.59312320916905" + }, + { + "f": "439.512893982808" + }, + { + "f": "441.43266475644697" + }, + { + "f": "443.3524355300859" + }, + { + "f": "445.27220630372494" + }, + { + "f": "447.1919770773639" + }, + { + "f": "449.11174785100286" + }, + { + "f": "451.0315186246418" + }, + { + "f": "452.9512893982808" + }, + { + "f": "454.8710601719198" + }, + { + "f": "456.79083094555875" + }, + { + "f": "458.7106017191977" + }, + { + "f": "460.63037249283667" + }, + { + "f": "462.55014326647563" + }, + { + "f": "464.46991404011465" + }, + { + "f": "466.38968481375355" + }, + { + "f": "468.30945558739256" + }, + { + "f": "470.2292263610315" + }, + { + "f": "472.1489971346705" + }, + { + "f": "474.06876790830944" + }, + { + "f": "475.9885386819484" + }, + { + "f": "477.9083094555874" + }, + { + "f": "479.8280802292264" + }, + { + "f": "481.74785100286533" + }, + { + "f": "483.6676217765043" + }, + { + "f": "485.58739255014325" + }, + { + "f": "487.50716332378227" + }, + { + "f": "489.42693409742117" + }, + { + "f": "491.3467048710602" + }, + { + "f": "493.26647564469914" + }, + { + "f": "495.1862464183381" + }, + { + "f": "497.10601719197706" + }, + { + "f": "499.025787965616" + }, + { + "f": "500.94555873925503" + }, + { + "f": "502.865329512894" + }, + { + "f": "504.78510028653295" + }, + { + "f": "506.7048710601719" + }, + { + "f": "508.62464183381087" + }, + { + "f": "510.5444126074499" + }, + { + "f": "512.4641833810888" + }, + { + "f": "514.3839541547278" + }, + { + "f": "516.3037249283668" + }, + { + "f": "518.2234957020057" + }, + { + "f": "520.1432664756447" + }, + { + "f": "522.0630372492836" + }, + { + "f": "523.9828080229227" + }, + { + "f": "525.9025787965616" + }, + { + "f": "527.8223495702006" + }, + { + "f": "529.7421203438396" + }, + { + "f": "531.6618911174785" + }, + { + "f": "533.5816618911175" + }, + { + "f": "535.5014326647564" + }, + { + "f": "537.4212034383954" + }, + { + "f": "539.3409742120343" + }, + { + "f": "541.2607449856733" + }, + { + "f": "543.1805157593124" + }, + { + "f": "545.1002865329513" + }, + { + "f": "547.0200573065903" + }, + { + "f": "548.9398280802293" + }, + { + "f": "550.8595988538682" + }, + { + "f": "552.7793696275071" + }, + { + "f": "554.6991404011461" + }, + { + "f": "556.6189111747851" + }, + { + "f": "558.538681948424" + }, + { + "f": "560.458452722063" + }, + { + "f": "562.3782234957021" + }, + { + "f": "564.297994269341" + }, + { + "f": "566.21776504298" + }, + { + "f": "568.1375358166189" + }, + { + "f": "570.0573065902579" + }, + { + "f": "571.9770773638968" + }, + { + "f": "573.8968481375358" + }, + { + "f": "575.8166189111748" + }, + { + "f": "577.7363896848137" + }, + { + "f": "579.6561604584527" + }, + { + "f": "581.5759312320916" + }, + { + "f": "583.4957020057307" + }, + { + "f": "585.4154727793696" + }, + { + "f": "587.3352435530086" + }, + { + "f": "589.2550143266476" + }, + { + "f": "591.1747851002865" + }, + { + "f": "593.0945558739255" + }, + { + "f": "595.0143266475645" + }, + { + "f": "596.9340974212034" + }, + { + "f": "598.8538681948423" + }, + { + "f": "600.7736389684814" + }, + { + "f": "602.6934097421204" + }, + { + "f": "604.6131805157593" + }, + { + "f": "606.5329512893983" + }, + { + "f": "608.4527220630373" + }, + { + "f": "610.3724928366762" + }, + { + "f": "612.2922636103152" + }, + { + "f": "614.2120343839541" + }, + { + "f": "616.1318051575931" + }, + { + "f": "618.051575931232" + }, + { + "f": "619.971346704871" + }, + { + "f": "621.8911174785101" + }, + { + "f": "623.810888252149" + }, + { + "f": "625.730659025788" + }, + { + "f": "627.6504297994269" + }, + { + "f": "629.5702005730659" + }, + { + "f": "631.4899713467048" + }, + { + "f": "633.4097421203438" + }, + { + "f": "635.3295128939828" + }, + { + "f": "637.2492836676217" + }, + { + "f": "639.1690544412608" + }, + { + "f": "641.0888252148998" + }, + { + "f": "643.0085959885387" + }, + { + "f": "644.9283667621776" + }, + { + "f": "646.8481375358166" + }, + { + "f": "648.7679083094556" + }, + { + "f": "650.6876790830945" + }, + { + "f": "652.6074498567335" + }, + { + "f": "654.5272206303725" + }, + { + "f": "656.4469914040114" + }, + { + "f": "658.3667621776503" + }, + { + "f": "660.2865329512895" + }, + { + "f": "662.2063037249284" + }, + { + "f": "664.1260744985673" + }, + { + "f": "666.0458452722063" + }, + { + "f": "667.9656160458453" + }, + { + "f": "669.8853868194842" + }, + { + "f": "671.8051575931232" + }, + { + "f": "673.7249283667622" + }, + { + "f": "675.6446991404011" + }, + { + "f": "677.56446991404" + }, + { + "f": "679.4842406876791" + }, + { + "f": "681.4040114613181" + }, + { + "f": "683.323782234957" + }, + { + "f": "685.243553008596" + }, + { + "f": "687.163323782235" + }, + { + "f": "689.0830945558739" + }, + { + "f": "691.0028653295128" + }, + { + "f": "692.9226361031518" + }, + { + "f": "694.8424068767908" + }, + { + "f": "696.7621776504297" + }, + { + "f": "698.6819484240688" + }, + { + "f": "700.6017191977078" + }, + { + "f": "702.5214899713467" + }, + { + "f": "704.4412607449856" + }, + { + "f": "706.3610315186247" + }, + { + "f": "708.2808022922636" + }, + { + "f": "710.2005730659025" + }, + { + "f": "712.1203438395415" + }, + { + "f": "714.0401146131805" + }, + { + "f": "715.9598853868195" + }, + { + "f": "717.8796561604585" + }, + { + "f": "719.7994269340975" + }, + { + "f": "721.7191977077364" + }, + { + "f": "723.6389684813753" + }, + { + "f": "725.5587392550143" + }, + { + "f": "727.4785100286533" + }, + { + "f": "729.3982808022922" + }, + { + "f": "731.3180515759312" + }, + { + "f": "733.2378223495703" + }, + { + "f": "735.1575931232092" + }, + { + "f": "737.077363896848" + }, + { + "f": "738.9971346704871" + }, + { + "f": "740.9169054441261" + }, + { + "f": "742.836676217765" + }, + { + "f": "744.756446991404" + }, + { + "f": "746.676217765043" + }, + { + "f": "748.5959885386819" + }, + { + "f": "750.5157593123208" + }, + { + "f": "752.43553008596" + }, + { + "f": "754.3553008595989" + }, + { + "f": "756.2750716332378" + }, + { + "f": "758.1948424068768" + }, + { + "f": "760.1146131805158" + }, + { + "f": "762.0343839541547" + }, + { + "f": "763.9541547277937" + }, + { + "f": "765.8739255014327" + }, + { + "f": "767.7936962750716" + }, + { + "f": "769.7134670487105" + }, + { + "f": "771.6332378223495" + }, + { + "f": "773.5530085959886" + }, + { + "f": "775.4727793696275" + }, + { + "f": "777.3925501432665" + }, + { + "f": "779.3123209169055" + }, + { + "f": "781.2320916905444" + }, + { + "f": "783.1518624641833" + }, + { + "f": "785.0716332378223" + }, + { + "f": "786.9914040114613" + }, + { + "f": "788.9111747851002" + }, + { + "f": "790.8309455587392" + }, + { + "f": "792.7507163323783" + }, + { + "f": "794.6704871060172" + }, + { + "f": "796.5902578796561" + }, + { + "f": "798.5100286532952" + }, + { + "f": "800.4297994269341" + }, + { + "f": "802.349570200573" + }, + { + "f": "804.269340974212" + }, + { + "f": "806.189111747851" + }, + { + "f": "808.1088825214899" + }, + { + "f": "810.028653295129" + }, + { + "f": "811.948424068768" + }, + { + "f": "813.8681948424069" + }, + { + "f": "815.7879656160458" + }, + { + "f": "817.7077363896848" + }, + { + "f": "819.6275071633238" + }, + { + "f": "821.5472779369627" + }, + { + "f": "823.4670487106017" + }, + { + "f": "825.3868194842407" + }, + { + "f": "827.3065902578796" + }, + { + "f": "829.2263610315185" + }, + { + "f": "831.1461318051576" + }, + { + "f": "833.0659025787966" + }, + { + "f": "834.9856733524355" + }, + { + "f": "836.9054441260745" + }, + { + "f": "838.8252148997135" + }, + { + "f": "840.7449856733524" + }, + { + "f": "842.6647564469913" + }, + { + "f": "844.5845272206304" + }, + { + "f": "846.5042979942693" + }, + { + "f": "848.4240687679082" + }, + { + "f": "850.3438395415473" + }, + { + "f": "852.2636103151863" + }, + { + "f": "854.1833810888252" + }, + { + "f": "856.1031518624642" + }, + { + "f": "858.0229226361032" + }, + { + "f": "859.9426934097421" + }, + { + "f": "861.862464183381" + }, + { + "f": "863.78223495702" + }, + { + "f": "865.702005730659" + }, + { + "f": "867.6217765042979" + }, + { + "f": "869.541547277937" + }, + { + "f": "871.461318051576" + }, + { + "f": "873.3810888252149" + }, + { + "f": "875.3008595988538" + }, + { + "f": "877.2206303724929" + }, + { + "f": "879.1404011461318" + }, + { + "f": "881.0601719197707" + }, + { + "f": "882.9799426934097" + }, + { + "f": "884.8997134670487" + }, + { + "f": "886.8194842406876" + }, + { + "f": "888.7392550143267" + }, + { + "f": "890.6590257879657" + }, + { + "f": "892.5787965616046" + }, + { + "f": "894.4985673352436" + }, + { + "f": "896.4183381088825" + }, + { + "f": "898.3381088825215" + }, + { + "f": "900.2578796561604" + }, + { + "f": "902.1776504297994" + }, + { + "f": "904.0974212034383" + }, + { + "f": "906.0171919770773" + }, + { + "f": "907.9369627507164" + }, + { + "f": "909.8567335243553" + }, + { + "f": "911.7765042979943" + }, + { + "f": "913.6962750716332" + }, + { + "f": "915.6160458452722" + }, + { + "f": "917.5358166189112" + }, + { + "f": "919.4555873925501" + }, + { + "f": "921.3753581661891" + }, + { + "f": "923.295128939828" + }, + { + "f": "925.214899713467" + }, + { + "f": "927.134670487106" + }, + { + "f": "929.054441260745" + }, + { + "f": "930.974212034384" + }, + { + "f": "932.8939828080229" + }, + { + "f": "934.8137535816619" + }, + { + "f": "936.7335243553008" + }, + { + "f": "938.6532951289398" + }, + { + "f": "940.5730659025788" + }, + { + "f": "942.4928366762177" + }, + { + "f": "944.4126074498568" + }, + { + "f": "946.3323782234957" + }, + { + "f": "948.2521489971347" + }, + { + "f": "950.1719197707736" + }, + { + "f": "952.0916905444126" + }, + { + "f": "954.0114613180516" + }, + { + "f": "955.9312320916905" + }, + { + "f": "957.8510028653295" + }, + { + "f": "959.7707736389684" + }, + { + "f": "961.6905444126074" + }, + { + "f": "963.6103151862465" + }, + { + "f": "965.5300859598854" + }, + { + "f": "967.4498567335244" + }, + { + "f": "969.3696275071633" + }, + { + "f": "971.2893982808023" + }, + { + "f": "973.2091690544412" + }, + { + "f": "975.1289398280802" + }, + { + "f": "977.0487106017192" + }, + { + "f": "978.9684813753581" + }, + { + "f": "980.8882521489971" + }, + { + "f": "982.808022922636" + }, + { + "f": "984.7277936962751" + }, + { + "f": "986.6475644699141" + }, + { + "f": "988.567335243553" + }, + { + "f": "990.487106017192" + }, + { + "f": "992.4068767908309" + }, + { + "f": "994.3266475644699" + }, + { + "f": "996.2464183381088" + }, + { + "f": "998.1661891117478" + }, + { + "f": "1000.0859598853868" + }, + { + "f": "1002.0057306590257" + }, + { + "f": "1003.9255014326648" + }, + { + "f": "1005.8452722063037" + }, + { + "f": "1007.7650429799427" + }, + { + "f": "1009.6848137535817" + }, + { + "f": "1011.6045845272206" + }, + { + "f": "1013.5243553008596" + }, + { + "f": "1015.4441260744985" + }, + { + "f": "1017.3638968481375" + }, + { + "f": "1019.2836676217764" + }, + { + "f": "1021.2034383954154" + }, + { + "f": "1023.1232091690545" + }, + { + "f": "1025.0429799426934" + }, + { + "f": "1026.9627507163323" + }, + { + "f": "1028.8825214899712" + }, + { + "f": "1030.8022922636103" + }, + { + "f": "1032.7220630372494" + }, + { + "f": "1034.6418338108883" + }, + { + "f": "1036.5616045845272" + }, + { + "f": "1038.4813753581661" + }, + { + "f": "1040.401146131805" + }, + { + "f": "1042.320916905444" + }, + { + "f": "1044.240687679083" + }, + { + "f": "1046.1604584527222" + }, + { + "f": "1048.080229226361" + }, + { + "f": "1050.0" + } + ], + "Voltage_V": { + "f": "230.29080200195312" + }, + "Current_A": { + "f": "0.06529296934604645" + }, + "Power_W": { + "f": "8.399910926818848" + }, + "Freq_Hz": { + "f": "50.02178955078125" + }, + "PF": { + "f": "0.5586221218109131" + } + } + }, + { + "name": "r06", + "source": "usb_capture_20260204_123903_hub1#27", + "harmonics": false, + "keys": [ + "device", + "Phi_lm", + "eta_lm_W", + "CCT_K", + "Duv", + "x", + "y", + "u", + "v", + "u_prime", + "v_prime", + "SDCM", + "Ra", + "R1", + "R2", + "R3", + "R4", + "R5", + "R6", + "R7", + "R8", + "R9", + "R10", + "R11", + "R12", + "R13", + "R14", + "R15", + "Phi_e_mW", + "Phi_euv_mW", + "Phi_eb_mW", + "Phi_ey_mW", + "Phi_er_mW", + "Phi_efr_mW", + "Phi_eir_mW", + "Phi_e_total", + "CIE_X", + "CIE_Y", + "CIE_Z", + "TLCI", + "PeakSignal", + "DarkSignal", + "Compensate", + "test_date", + "test_time", + "spectrum", + "spectrum_nm", + "Voltage_V", + "Current_A", + "Power_W", + "Freq_Hz", + "PF" + ], + "values": { + "device": "HPCS6500", + "Phi_lm": { + "f": "479.6141357421875" + }, + "eta_lm_W": { + "f": "57.04836654663086" + }, + "CCT_K": { + "f": "5654.22216796875" + }, + "Duv": { + "f": "0.005528819747269154" + }, + "x": { + "f": "0.32884812355041504" + }, + "y": { + "f": "0.34884971380233765" + }, + "u": { + "f": "0.20148463547229767" + }, + "v": { + "f": "0.32060936093330383" + }, + "u_prime": { + "f": "0.20148463547229767" + }, + "v_prime": { + "f": "0.48091405630111694" + }, + "SDCM": { + "f": "4.7090373039245605" + }, + "Ra": { + "f": "82.99382781982422" + }, + "R1": { + "f": "82.20687103271484" + }, + "R2": { + "f": "94.0466079711914" + }, + "R3": { + "f": "93.27873229980469" + }, + "R4": { + "f": "76.49690246582031" + }, + "R5": { + "f": "81.38878631591797" + }, + "R6": { + "f": "89.25926208496094" + }, + "R7": { + "f": "83.16966247558594" + }, + "R8": { + "f": "64.1037368774414" + }, + "R9": { + "f": "4.81308126449585" + }, + "R10": { + "f": "84.15076446533203" + }, + "R11": { + "f": "76.0714340209961" + }, + "R12": { + "f": "60.03883743286133" + }, + "R13": { + "f": "86.56330108642578" + }, + "R14": { + "f": "96.76630401611328" + }, + "R15": { + "f": "75.97416687011719" + }, + "Phi_e_mW": { + "f": "1491.4090576171875" + }, + "Phi_euv_mW": { + "f": "0.0" + }, + "Phi_eb_mW": { + "f": "470.1175231933594" + }, + "Phi_ey_mW": { + "f": "679.6602783203125" + }, + "Phi_er_mW": { + "f": "331.024658203125" + }, + "Phi_efr_mW": { + "f": "11.806631088256836" + }, + "Phi_eir_mW": { + "f": "0.0" + }, + "Phi_e_total": { + "f": "1492.6082763671875" + }, + "CIE_X": { + "f": "661.95458984375" + }, + "CIE_Y": { + "f": "702.2168579101562" + }, + "CIE_Z": { + "f": "648.7780151367188" + }, + "TLCI": { + "f": "67.90325927734375" + }, + "PeakSignal": { + "f": "53066.0" + }, + "DarkSignal": { + "f": "2246.0" + }, + "Compensate": { + "f": "2834.0" + }, + "test_date": "2026-02-04", + "test_time": "16:04:31", + "spectrum": [ + { + "f": "0.0006503526237793267" + }, + { + "f": "0.008482815697789192" + }, + { + "f": "0.024792972952127457" + }, + { + "f": "0.047534748911857605" + }, + { + "f": "0.07586749643087387" + }, + { + "f": "0.10392797738313675" + }, + { + "f": "0.13945724070072174" + }, + { + "f": "0.18022163212299347" + }, + { + "f": "0.22363145649433136" + }, + { + "f": "0.27339205145835876" + }, + { + "f": "0.3309672474861145" + }, + { + "f": "0.3982585668563843" + }, + { + "f": "0.4750555455684662" + }, + { + "f": "0.5624488592147827" + }, + { + "f": "0.6613767147064209" + }, + { + "f": "0.7735352516174316" + }, + { + "f": "0.9039040207862854" + }, + { + "f": "1.0544997453689575" + }, + { + "f": "1.2244805097579956" + }, + { + "f": "1.4145967960357666" + }, + { + "f": "1.622158408164978" + }, + { + "f": "1.850080132484436" + }, + { + "f": "2.1013357639312744" + }, + { + "f": "2.3774070739746094" + }, + { + "f": "2.6787264347076416" + }, + { + "f": "3.0047903060913086" + }, + { + "f": "3.362079381942749" + }, + { + "f": "3.7528955936431885" + }, + { + "f": "4.175509452819824" + }, + { + "f": "4.63675594329834" + }, + { + "f": "5.192533493041992" + }, + { + "f": "5.801392078399658" + }, + { + "f": "6.410592555999756" + }, + { + "f": "7.077500820159912" + }, + { + "f": "7.803271770477295" + }, + { + "f": "8.584665298461914" + }, + { + "f": "9.40776252746582" + }, + { + "f": "10.253658294677734" + }, + { + "f": "11.092331886291504" + }, + { + "f": "11.88984203338623" + }, + { + "f": "12.60664176940918" + }, + { + "f": "13.198974609375" + }, + { + "f": "13.626181602478027" + }, + { + "f": "13.846794128417969" + }, + { + "f": "13.848896026611328" + }, + { + "f": "13.64615249633789" + }, + { + "f": "13.265717506408691" + }, + { + "f": "12.751570701599121" + }, + { + "f": "12.146742820739746" + }, + { + "f": "11.496768951416016" + }, + { + "f": "10.848175048828125" + }, + { + "f": "10.23066520690918" + }, + { + "f": "9.665027618408203" + }, + { + "f": "9.158955574035645" + }, + { + "f": "8.710533142089844" + }, + { + "f": "8.316705703735352" + }, + { + "f": "7.967496395111084" + }, + { + "f": "7.651604175567627" + }, + { + "f": "7.35584020614624" + }, + { + "f": "7.068836688995361" + }, + { + "f": "6.7853617668151855" + }, + { + "f": "6.5056304931640625" + }, + { + "f": "6.233717441558838" + }, + { + "f": "5.974093914031982" + }, + { + "f": "5.729609966278076" + }, + { + "f": "5.503068447113037" + }, + { + "f": "5.287951469421387" + }, + { + "f": "5.099043369293213" + }, + { + "f": "4.9377760887146" + }, + { + "f": "4.8047637939453125" + }, + { + "f": "4.700284004211426" + }, + { + "f": "4.6222968101501465" + }, + { + "f": "4.566483974456787" + }, + { + "f": "4.530738830566406" + }, + { + "f": "4.502363681793213" + }, + { + "f": "4.4902424812316895" + }, + { + "f": "4.497159957885742" + }, + { + "f": "4.512726306915283" + }, + { + "f": "4.536824703216553" + }, + { + "f": "4.567239284515381" + }, + { + "f": "4.603107452392578" + }, + { + "f": "4.644918441772461" + }, + { + "f": "4.691896438598633" + }, + { + "f": "4.746211528778076" + }, + { + "f": "4.8080735206604" + }, + { + "f": "4.875321865081787" + }, + { + "f": "4.949402809143066" + }, + { + "f": "5.027612686157227" + }, + { + "f": "5.108658790588379" + }, + { + "f": "5.191219329833984" + }, + { + "f": "5.274882793426514" + }, + { + "f": "5.360316276550293" + }, + { + "f": "5.4453840255737305" + }, + { + "f": "5.52906608581543" + }, + { + "f": "5.609546661376953" + }, + { + "f": "5.686617851257324" + }, + { + "f": "5.759422302246094" + }, + { + "f": "5.829532146453857" + }, + { + "f": "5.896758556365967" + }, + { + "f": "5.96159029006958" + }, + { + "f": "6.0231499671936035" + }, + { + "f": "6.079071521759033" + }, + { + "f": "6.130245685577393" + }, + { + "f": "6.176555156707764" + }, + { + "f": "6.219401836395264" + }, + { + "f": "6.259267330169678" + }, + { + "f": "6.294674873352051" + }, + { + "f": "6.326778411865234" + }, + { + "f": "6.356472015380859" + }, + { + "f": "6.3835039138793945" + }, + { + "f": "6.408784866333008" + }, + { + "f": "6.437201023101807" + }, + { + "f": "6.4648237228393555" + }, + { + "f": "6.488520622253418" + }, + { + "f": "6.5104851722717285" + }, + { + "f": "6.529759407043457" + }, + { + "f": "6.547317981719971" + }, + { + "f": "6.564306259155273" + }, + { + "f": "6.58315896987915" + }, + { + "f": "6.606032371520996" + }, + { + "f": "6.631357192993164" + }, + { + "f": "6.657984733581543" + }, + { + "f": "6.686302661895752" + }, + { + "f": "6.715590476989746" + }, + { + "f": "6.746315002441406" + }, + { + "f": "6.77702522277832" + }, + { + "f": "6.8055033683776855" + }, + { + "f": "6.833646774291992" + }, + { + "f": "6.86231803894043" + }, + { + "f": "6.892275333404541" + }, + { + "f": "6.924108505249023" + }, + { + "f": "6.954262733459473" + }, + { + "f": "6.983485698699951" + }, + { + "f": "7.01080846786499" + }, + { + "f": "7.035874366760254" + }, + { + "f": "7.059598922729492" + }, + { + "f": "7.0820441246032715" + }, + { + "f": "7.103066444396973" + }, + { + "f": "7.123105049133301" + }, + { + "f": "7.141350746154785" + }, + { + "f": "7.158106803894043" + }, + { + "f": "7.173392295837402" + }, + { + "f": "7.187589168548584" + }, + { + "f": "7.201813220977783" + }, + { + "f": "7.216897964477539" + }, + { + "f": "7.232107162475586" + }, + { + "f": "7.246994972229004" + }, + { + "f": "7.2599992752075195" + }, + { + "f": "7.272309303283691" + }, + { + "f": "7.28537654876709" + }, + { + "f": "7.299322128295898" + }, + { + "f": "7.315099716186523" + }, + { + "f": "7.329245567321777" + }, + { + "f": "7.3424272537231445" + }, + { + "f": "7.354881286621094" + }, + { + "f": "7.369200706481934" + }, + { + "f": "7.389070510864258" + }, + { + "f": "7.412261009216309" + }, + { + "f": "7.440849781036377" + }, + { + "f": "7.469000816345215" + }, + { + "f": "7.4893975257873535" + }, + { + "f": "7.505971431732178" + }, + { + "f": "7.5179548263549805" + }, + { + "f": "7.5239996910095215" + }, + { + "f": "7.525997161865234" + }, + { + "f": "7.522688865661621" + }, + { + "f": "7.514658451080322" + }, + { + "f": "7.505424976348877" + }, + { + "f": "7.495433330535889" + }, + { + "f": "7.487151145935059" + }, + { + "f": "7.480403900146484" + }, + { + "f": "7.47233772277832" + }, + { + "f": "7.459700107574463" + }, + { + "f": "7.4408721923828125" + }, + { + "f": "7.41594934463501" + }, + { + "f": "7.387016773223877" + }, + { + "f": "7.356054782867432" + }, + { + "f": "7.323540687561035" + }, + { + "f": "7.289201259613037" + }, + { + "f": "7.253030300140381" + }, + { + "f": "7.214502334594727" + }, + { + "f": "7.1725850105285645" + }, + { + "f": "7.130308151245117" + }, + { + "f": "7.09765625" + }, + { + "f": "7.062769889831543" + }, + { + "f": "7.014068603515625" + }, + { + "f": "6.960810661315918" + }, + { + "f": "6.903356075286865" + }, + { + "f": "6.84305477142334" + }, + { + "f": "6.7816290855407715" + }, + { + "f": "6.718221187591553" + }, + { + "f": "6.653468608856201" + }, + { + "f": "6.58763313293457" + }, + { + "f": "6.518386363983154" + }, + { + "f": "6.445696830749512" + }, + { + "f": "6.369779109954834" + }, + { + "f": "6.290306091308594" + }, + { + "f": "6.209042549133301" + }, + { + "f": "6.126494884490967" + }, + { + "f": "6.044864654541016" + }, + { + "f": "5.964684009552002" + }, + { + "f": "5.884161949157715" + }, + { + "f": "5.802145481109619" + }, + { + "f": "5.732012748718262" + }, + { + "f": "5.660151481628418" + }, + { + "f": "5.572999000549316" + }, + { + "f": "5.485235691070557" + }, + { + "f": "5.397014617919922" + }, + { + "f": "5.308226108551025" + }, + { + "f": "5.2201762199401855" + }, + { + "f": "5.1333842277526855" + }, + { + "f": "5.047023773193359" + }, + { + "f": "4.961424827575684" + }, + { + "f": "4.875617504119873" + }, + { + "f": "4.789210319519043" + }, + { + "f": "4.7031168937683105" + }, + { + "f": "4.617907524108887" + }, + { + "f": "4.533158779144287" + }, + { + "f": "4.448482036590576" + }, + { + "f": "4.363515377044678" + }, + { + "f": "4.277575492858887" + }, + { + "f": "4.2050604820251465" + }, + { + "f": "4.132445812225342" + }, + { + "f": "4.046480178833008" + }, + { + "f": "3.9606564044952393" + }, + { + "f": "3.8750946521759033" + }, + { + "f": "3.7893340587615967" + }, + { + "f": "3.703720808029175" + }, + { + "f": "3.6184895038604736" + }, + { + "f": "3.5325160026550293" + }, + { + "f": "3.4467687606811523" + }, + { + "f": "3.361128330230713" + }, + { + "f": "3.275953531265259" + }, + { + "f": "3.1917619705200195" + }, + { + "f": "3.1087658405303955" + }, + { + "f": "3.026986837387085" + }, + { + "f": "2.9573304653167725" + }, + { + "f": "2.8895273208618164" + }, + { + "f": "2.8116416931152344" + }, + { + "f": "2.73476243019104" + }, + { + "f": "2.6590662002563477" + }, + { + "f": "2.5832927227020264" + }, + { + "f": "2.508694648742676" + }, + { + "f": "2.4350645542144775" + }, + { + "f": "2.362797737121582" + }, + { + "f": "2.292527198791504" + }, + { + "f": "2.223700523376465" + }, + { + "f": "2.157083511352539" + }, + { + "f": "2.0924065113067627" + }, + { + "f": "2.0293309688568115" + }, + { + "f": "1.976852297782898" + }, + { + "f": "1.9261642694473267" + }, + { + "f": "1.8693150281906128" + }, + { + "f": "1.8144140243530273" + }, + { + "f": "1.7607951164245605" + }, + { + "f": "1.7078663110733032" + }, + { + "f": "1.6557515859603882" + }, + { + "f": "1.6040923595428467" + }, + { + "f": "1.5526766777038574" + }, + { + "f": "1.502638816833496" + }, + { + "f": "1.454108476638794" + }, + { + "f": "1.4073330163955688" + }, + { + "f": "1.3626787662506104" + }, + { + "f": "1.3247053623199463" + }, + { + "f": "1.287304162979126" + }, + { + "f": "1.2448862791061401" + }, + { + "f": "1.203529715538025" + }, + { + "f": "1.1628777980804443" + }, + { + "f": "1.1222426891326904" + }, + { + "f": "1.0821832418441772" + }, + { + "f": "1.0430457592010498" + }, + { + "f": "1.0054402351379395" + }, + { + "f": "0.9692142009735107" + }, + { + "f": "0.9340368509292603" + }, + { + "f": "0.8992900252342224" + }, + { + "f": "0.865378201007843" + }, + { + "f": "0.8368862867355347" + }, + { + "f": "0.8089833855628967" + }, + { + "f": "0.7774855494499207" + }, + { + "f": "0.7468207478523254" + }, + { + "f": "0.7166849374771118" + }, + { + "f": "0.6868924498558044" + }, + { + "f": "0.6578714847564697" + }, + { + "f": "0.6297215223312378" + }, + { + "f": "0.603460431098938" + }, + { + "f": "0.5787346959114075" + }, + { + "f": "0.5548161864280701" + }, + { + "f": "0.5348324179649353" + }, + { + "f": "0.5156658291816711" + }, + { + "f": "0.4944332540035248" + }, + { + "f": "0.4743669033050537" + }, + { + "f": "0.4554612338542938" + }, + { + "f": "0.4372316300868988" + }, + { + "f": "0.41962528228759766" + }, + { + "f": "0.4027274549007416" + }, + { + "f": "0.3863929510116577" + }, + { + "f": "0.3707849681377411" + }, + { + "f": "0.3562818765640259" + }, + { + "f": "0.34263506531715393" + }, + { + "f": "0.33070099353790283" + }, + { + "f": "0.3179670572280884" + }, + { + "f": "0.30241158604621887" + }, + { + "f": "0.28631994128227234" + }, + { + "f": "0.27017736434936523" + }, + { + "f": "0.2547999620437622" + }, + { + "f": "0.23997336626052856" + }, + { + "f": "0.22607159614562988" + }, + { + "f": "0.21452397108078003" + }, + { + "f": "0.20461435616016388" + }, + { + "f": "0.19693133234977722" + }, + { + "f": "0.1895270198583603" + }, + { + "f": "0.18026955425739288" + }, + { + "f": "0.1710914969444275" + }, + { + "f": "0.16310976445674896" + }, + { + "f": "0.15559671819210052" + }, + { + "f": "0.14873719215393066" + }, + { + "f": "0.14236803352832794" + }, + { + "f": "0.13558246195316315" + }, + { + "f": "0.1292068511247635" + }, + { + "f": "0.12422400712966919" + }, + { + "f": "0.11966746300458908" + }, + { + "f": "0.11451578885316849" + }, + { + "f": "0.10909537971019745" + }, + { + "f": "0.1029016524553299" + }, + { + "f": "0.09602750837802887" + }, + { + "f": "0.08991030603647232" + }, + { + "f": "0.08513861894607544" + }, + { + "f": "0.08084233850240707" + }, + { + "f": "0.07692687958478928" + }, + { + "f": "0.0733007863163948" + }, + { + "f": "0.06925687193870544" + }, + { + "f": "0.06529193371534348" + }, + { + "f": "0.06151082366704941" + }, + { + "f": "0.058108437806367874" + }, + { + "f": "0.054256852716207504" + }, + { + "f": "0.05034996569156647" + }, + { + "f": "0.04703449830412865" + }, + { + "f": "0.04359633848071098" + }, + { + "f": "0.04047548025846481" + }, + { + "f": "0.03786582872271538" + }, + { + "f": "0.034549832344055176" + }, + { + "f": "0.03080862946808338" + }, + { + "f": "0.027524782344698906" + }, + { + "f": "0.024562528356909752" + }, + { + "f": "0.022088944911956787" + }, + { + "f": "0.018900398164987564" + }, + { + "f": "0.015169035643339157" + }, + { + "f": "0.011149317026138306" + }, + { + "f": "0.0076764049008488655" + }, + { + "f": "0.004962604958564043" + } + ], + "spectrum_nm": [ + { + "f": "380.0" + }, + { + "f": "381.91977077363896" + }, + { + "f": "383.8395415472779" + }, + { + "f": "385.75931232091693" + }, + { + "f": "387.6790830945559" + }, + { + "f": "389.59885386819485" + }, + { + "f": "391.5186246418338" + }, + { + "f": "393.43839541547277" + }, + { + "f": "395.3581661891117" + }, + { + "f": "397.2779369627507" + }, + { + "f": "399.1977077363897" + }, + { + "f": "401.11747851002866" + }, + { + "f": "403.0372492836676" + }, + { + "f": "404.9570200573066" + }, + { + "f": "406.87679083094554" + }, + { + "f": "408.79656160458455" + }, + { + "f": "410.7163323782235" + }, + { + "f": "412.63610315186247" + }, + { + "f": "414.55587392550143" + }, + { + "f": "416.4756446991404" + }, + { + "f": "418.39541547277935" + }, + { + "f": "420.3151862464183" + }, + { + "f": "422.2349570200573" + }, + { + "f": "424.1547277936963" + }, + { + "f": "426.07449856733524" + }, + { + "f": "427.9942693409742" + }, + { + "f": "429.91404011461316" + }, + { + "f": "431.8338108882522" + }, + { + "f": "433.75358166189113" + }, + { + "f": "435.6733524355301" + }, + { + "f": "437.59312320916905" + }, + { + "f": "439.512893982808" + }, + { + "f": "441.43266475644697" + }, + { + "f": "443.3524355300859" + }, + { + "f": "445.27220630372494" + }, + { + "f": "447.1919770773639" + }, + { + "f": "449.11174785100286" + }, + { + "f": "451.0315186246418" + }, + { + "f": "452.9512893982808" + }, + { + "f": "454.8710601719198" + }, + { + "f": "456.79083094555875" + }, + { + "f": "458.7106017191977" + }, + { + "f": "460.63037249283667" + }, + { + "f": "462.55014326647563" + }, + { + "f": "464.46991404011465" + }, + { + "f": "466.38968481375355" + }, + { + "f": "468.30945558739256" + }, + { + "f": "470.2292263610315" + }, + { + "f": "472.1489971346705" + }, + { + "f": "474.06876790830944" + }, + { + "f": "475.9885386819484" + }, + { + "f": "477.9083094555874" + }, + { + "f": "479.8280802292264" + }, + { + "f": "481.74785100286533" + }, + { + "f": "483.6676217765043" + }, + { + "f": "485.58739255014325" + }, + { + "f": "487.50716332378227" + }, + { + "f": "489.42693409742117" + }, + { + "f": "491.3467048710602" + }, + { + "f": "493.26647564469914" + }, + { + "f": "495.1862464183381" + }, + { + "f": "497.10601719197706" + }, + { + "f": "499.025787965616" + }, + { + "f": "500.94555873925503" + }, + { + "f": "502.865329512894" + }, + { + "f": "504.78510028653295" + }, + { + "f": "506.7048710601719" + }, + { + "f": "508.62464183381087" + }, + { + "f": "510.5444126074499" + }, + { + "f": "512.4641833810888" + }, + { + "f": "514.3839541547278" + }, + { + "f": "516.3037249283668" + }, + { + "f": "518.2234957020057" + }, + { + "f": "520.1432664756447" + }, + { + "f": "522.0630372492836" + }, + { + "f": "523.9828080229227" + }, + { + "f": "525.9025787965616" + }, + { + "f": "527.8223495702006" + }, + { + "f": "529.7421203438396" + }, + { + "f": "531.6618911174785" + }, + { + "f": "533.5816618911175" + }, + { + "f": "535.5014326647564" + }, + { + "f": "537.4212034383954" + }, + { + "f": "539.3409742120343" + }, + { + "f": "541.2607449856733" + }, + { + "f": "543.1805157593124" + }, + { + "f": "545.1002865329513" + }, + { + "f": "547.0200573065903" + }, + { + "f": "548.9398280802293" + }, + { + "f": "550.8595988538682" + }, + { + "f": "552.7793696275071" + }, + { + "f": "554.6991404011461" + }, + { + "f": "556.6189111747851" + }, + { + "f": "558.538681948424" + }, + { + "f": "560.458452722063" + }, + { + "f": "562.3782234957021" + }, + { + "f": "564.297994269341" + }, + { + "f": "566.21776504298" + }, + { + "f": "568.1375358166189" + }, + { + "f": "570.0573065902579" + }, + { + "f": "571.9770773638968" + }, + { + "f": "573.8968481375358" + }, + { + "f": "575.8166189111748" + }, + { + "f": "577.7363896848137" + }, + { + "f": "579.6561604584527" + }, + { + "f": "581.5759312320916" + }, + { + "f": "583.4957020057307" + }, + { + "f": "585.4154727793696" + }, + { + "f": "587.3352435530086" + }, + { + "f": "589.2550143266476" + }, + { + "f": "591.1747851002865" + }, + { + "f": "593.0945558739255" + }, + { + "f": "595.0143266475645" + }, + { + "f": "596.9340974212034" + }, + { + "f": "598.8538681948423" + }, + { + "f": "600.7736389684814" + }, + { + "f": "602.6934097421204" + }, + { + "f": "604.6131805157593" + }, + { + "f": "606.5329512893983" + }, + { + "f": "608.4527220630373" + }, + { + "f": "610.3724928366762" + }, + { + "f": "612.2922636103152" + }, + { + "f": "614.2120343839541" + }, + { + "f": "616.1318051575931" + }, + { + "f": "618.051575931232" + }, + { + "f": "619.971346704871" + }, + { + "f": "621.8911174785101" + }, + { + "f": "623.810888252149" + }, + { + "f": "625.730659025788" + }, + { + "f": "627.6504297994269" + }, + { + "f": "629.5702005730659" + }, + { + "f": "631.4899713467048" + }, + { + "f": "633.4097421203438" + }, + { + "f": "635.3295128939828" + }, + { + "f": "637.2492836676217" + }, + { + "f": "639.1690544412608" + }, + { + "f": "641.0888252148998" + }, + { + "f": "643.0085959885387" + }, + { + "f": "644.9283667621776" + }, + { + "f": "646.8481375358166" + }, + { + "f": "648.7679083094556" + }, + { + "f": "650.6876790830945" + }, + { + "f": "652.6074498567335" + }, + { + "f": "654.5272206303725" + }, + { + "f": "656.4469914040114" + }, + { + "f": "658.3667621776503" + }, + { + "f": "660.2865329512895" + }, + { + "f": "662.2063037249284" + }, + { + "f": "664.1260744985673" + }, + { + "f": "666.0458452722063" + }, + { + "f": "667.9656160458453" + }, + { + "f": "669.8853868194842" + }, + { + "f": "671.8051575931232" + }, + { + "f": "673.7249283667622" + }, + { + "f": "675.6446991404011" + }, + { + "f": "677.56446991404" + }, + { + "f": "679.4842406876791" + }, + { + "f": "681.4040114613181" + }, + { + "f": "683.323782234957" + }, + { + "f": "685.243553008596" + }, + { + "f": "687.163323782235" + }, + { + "f": "689.0830945558739" + }, + { + "f": "691.0028653295128" + }, + { + "f": "692.9226361031518" + }, + { + "f": "694.8424068767908" + }, + { + "f": "696.7621776504297" + }, + { + "f": "698.6819484240688" + }, + { + "f": "700.6017191977078" + }, + { + "f": "702.5214899713467" + }, + { + "f": "704.4412607449856" + }, + { + "f": "706.3610315186247" + }, + { + "f": "708.2808022922636" + }, + { + "f": "710.2005730659025" + }, + { + "f": "712.1203438395415" + }, + { + "f": "714.0401146131805" + }, + { + "f": "715.9598853868195" + }, + { + "f": "717.8796561604585" + }, + { + "f": "719.7994269340975" + }, + { + "f": "721.7191977077364" + }, + { + "f": "723.6389684813753" + }, + { + "f": "725.5587392550143" + }, + { + "f": "727.4785100286533" + }, + { + "f": "729.3982808022922" + }, + { + "f": "731.3180515759312" + }, + { + "f": "733.2378223495703" + }, + { + "f": "735.1575931232092" + }, + { + "f": "737.077363896848" + }, + { + "f": "738.9971346704871" + }, + { + "f": "740.9169054441261" + }, + { + "f": "742.836676217765" + }, + { + "f": "744.756446991404" + }, + { + "f": "746.676217765043" + }, + { + "f": "748.5959885386819" + }, + { + "f": "750.5157593123208" + }, + { + "f": "752.43553008596" + }, + { + "f": "754.3553008595989" + }, + { + "f": "756.2750716332378" + }, + { + "f": "758.1948424068768" + }, + { + "f": "760.1146131805158" + }, + { + "f": "762.0343839541547" + }, + { + "f": "763.9541547277937" + }, + { + "f": "765.8739255014327" + }, + { + "f": "767.7936962750716" + }, + { + "f": "769.7134670487105" + }, + { + "f": "771.6332378223495" + }, + { + "f": "773.5530085959886" + }, + { + "f": "775.4727793696275" + }, + { + "f": "777.3925501432665" + }, + { + "f": "779.3123209169055" + }, + { + "f": "781.2320916905444" + }, + { + "f": "783.1518624641833" + }, + { + "f": "785.0716332378223" + }, + { + "f": "786.9914040114613" + }, + { + "f": "788.9111747851002" + }, + { + "f": "790.8309455587392" + }, + { + "f": "792.7507163323783" + }, + { + "f": "794.6704871060172" + }, + { + "f": "796.5902578796561" + }, + { + "f": "798.5100286532952" + }, + { + "f": "800.4297994269341" + }, + { + "f": "802.349570200573" + }, + { + "f": "804.269340974212" + }, + { + "f": "806.189111747851" + }, + { + "f": "808.1088825214899" + }, + { + "f": "810.028653295129" + }, + { + "f": "811.948424068768" + }, + { + "f": "813.8681948424069" + }, + { + "f": "815.7879656160458" + }, + { + "f": "817.7077363896848" + }, + { + "f": "819.6275071633238" + }, + { + "f": "821.5472779369627" + }, + { + "f": "823.4670487106017" + }, + { + "f": "825.3868194842407" + }, + { + "f": "827.3065902578796" + }, + { + "f": "829.2263610315185" + }, + { + "f": "831.1461318051576" + }, + { + "f": "833.0659025787966" + }, + { + "f": "834.9856733524355" + }, + { + "f": "836.9054441260745" + }, + { + "f": "838.8252148997135" + }, + { + "f": "840.7449856733524" + }, + { + "f": "842.6647564469913" + }, + { + "f": "844.5845272206304" + }, + { + "f": "846.5042979942693" + }, + { + "f": "848.4240687679082" + }, + { + "f": "850.3438395415473" + }, + { + "f": "852.2636103151863" + }, + { + "f": "854.1833810888252" + }, + { + "f": "856.1031518624642" + }, + { + "f": "858.0229226361032" + }, + { + "f": "859.9426934097421" + }, + { + "f": "861.862464183381" + }, + { + "f": "863.78223495702" + }, + { + "f": "865.702005730659" + }, + { + "f": "867.6217765042979" + }, + { + "f": "869.541547277937" + }, + { + "f": "871.461318051576" + }, + { + "f": "873.3810888252149" + }, + { + "f": "875.3008595988538" + }, + { + "f": "877.2206303724929" + }, + { + "f": "879.1404011461318" + }, + { + "f": "881.0601719197707" + }, + { + "f": "882.9799426934097" + }, + { + "f": "884.8997134670487" + }, + { + "f": "886.8194842406876" + }, + { + "f": "888.7392550143267" + }, + { + "f": "890.6590257879657" + }, + { + "f": "892.5787965616046" + }, + { + "f": "894.4985673352436" + }, + { + "f": "896.4183381088825" + }, + { + "f": "898.3381088825215" + }, + { + "f": "900.2578796561604" + }, + { + "f": "902.1776504297994" + }, + { + "f": "904.0974212034383" + }, + { + "f": "906.0171919770773" + }, + { + "f": "907.9369627507164" + }, + { + "f": "909.8567335243553" + }, + { + "f": "911.7765042979943" + }, + { + "f": "913.6962750716332" + }, + { + "f": "915.6160458452722" + }, + { + "f": "917.5358166189112" + }, + { + "f": "919.4555873925501" + }, + { + "f": "921.3753581661891" + }, + { + "f": "923.295128939828" + }, + { + "f": "925.214899713467" + }, + { + "f": "927.134670487106" + }, + { + "f": "929.054441260745" + }, + { + "f": "930.974212034384" + }, + { + "f": "932.8939828080229" + }, + { + "f": "934.8137535816619" + }, + { + "f": "936.7335243553008" + }, + { + "f": "938.6532951289398" + }, + { + "f": "940.5730659025788" + }, + { + "f": "942.4928366762177" + }, + { + "f": "944.4126074498568" + }, + { + "f": "946.3323782234957" + }, + { + "f": "948.2521489971347" + }, + { + "f": "950.1719197707736" + }, + { + "f": "952.0916905444126" + }, + { + "f": "954.0114613180516" + }, + { + "f": "955.9312320916905" + }, + { + "f": "957.8510028653295" + }, + { + "f": "959.7707736389684" + }, + { + "f": "961.6905444126074" + }, + { + "f": "963.6103151862465" + }, + { + "f": "965.5300859598854" + }, + { + "f": "967.4498567335244" + }, + { + "f": "969.3696275071633" + }, + { + "f": "971.2893982808023" + }, + { + "f": "973.2091690544412" + }, + { + "f": "975.1289398280802" + }, + { + "f": "977.0487106017192" + }, + { + "f": "978.9684813753581" + }, + { + "f": "980.8882521489971" + }, + { + "f": "982.808022922636" + }, + { + "f": "984.7277936962751" + }, + { + "f": "986.6475644699141" + }, + { + "f": "988.567335243553" + }, + { + "f": "990.487106017192" + }, + { + "f": "992.4068767908309" + }, + { + "f": "994.3266475644699" + }, + { + "f": "996.2464183381088" + }, + { + "f": "998.1661891117478" + }, + { + "f": "1000.0859598853868" + }, + { + "f": "1002.0057306590257" + }, + { + "f": "1003.9255014326648" + }, + { + "f": "1005.8452722063037" + }, + { + "f": "1007.7650429799427" + }, + { + "f": "1009.6848137535817" + }, + { + "f": "1011.6045845272206" + }, + { + "f": "1013.5243553008596" + }, + { + "f": "1015.4441260744985" + }, + { + "f": "1017.3638968481375" + }, + { + "f": "1019.2836676217764" + }, + { + "f": "1021.2034383954154" + }, + { + "f": "1023.1232091690545" + }, + { + "f": "1025.0429799426934" + }, + { + "f": "1026.9627507163323" + }, + { + "f": "1028.8825214899712" + }, + { + "f": "1030.8022922636103" + }, + { + "f": "1032.7220630372494" + }, + { + "f": "1034.6418338108883" + }, + { + "f": "1036.5616045845272" + }, + { + "f": "1038.4813753581661" + }, + { + "f": "1040.401146131805" + }, + { + "f": "1042.320916905444" + }, + { + "f": "1044.240687679083" + }, + { + "f": "1046.1604584527222" + }, + { + "f": "1048.080229226361" + }, + { + "f": "1050.0" + } + ], + "Voltage_V": { + "f": "230.29782104492188" + }, + "Current_A": { + "f": "0.06530531495809555" + }, + "Power_W": { + "f": "8.407149314880371" + }, + "Freq_Hz": { + "f": "50.02182388305664" + }, + "PF": { + "f": "0.5589380860328674" + } + } + }, + { + "name": "r07", + "source": "usb_capture_20260205_143219_hub1#1", + "harmonics": false, + "keys": [ + "device", + "Phi_lm", + "eta_lm_W", + "CCT_K", + "Duv", + "x", + "y", + "u", + "v", + "u_prime", + "v_prime", + "SDCM", + "Ra", + "R1", + "R2", + "R3", + "R4", + "R5", + "R6", + "R7", + "R8", + "R9", + "R10", + "R11", + "R12", + "R13", + "R14", + "R15", + "Phi_e_mW", + "Phi_euv_mW", + "Phi_eb_mW", + "Phi_ey_mW", + "Phi_er_mW", + "Phi_efr_mW", + "Phi_eir_mW", + "Phi_e_total", + "CIE_X", + "CIE_Y", + "CIE_Z", + "TLCI", + "PeakSignal", + "DarkSignal", + "Compensate", + "test_date", + "test_time", + "spectrum", + "spectrum_nm", + "Voltage_V", + "Current_A", + "Power_W", + "Freq_Hz", + "PF" + ], + "values": { + "device": "HPCS6500", + "Phi_lm": { + "f": "182.61920166015625" + }, + "eta_lm_W": { + "f": "0.0" + }, + "CCT_K": { + "f": "4936.84375" + }, + "Duv": { + "f": "0.002135422546416521" + }, + "x": { + "f": "0.3473931849002838" + }, + "y": { + "f": "0.35774698853492737" + }, + "u": { + "f": "0.21059946715831757" + }, + "v": { + "f": "0.32531434297561646" + }, + "u_prime": { + "f": "0.21059946715831757" + }, + "v_prime": { + "f": "0.4879715144634247" + }, + "SDCM": { + "f": "1.5234547853469849" + }, + "Ra": { + "f": "83.53800201416016" + }, + "R1": { + "f": "81.74681854248047" + }, + "R2": { + "f": "89.89591979980469" + }, + "R3": { + "f": "94.66126251220703" + }, + "R4": { + "f": "81.88838958740234" + }, + "R5": { + "f": "81.9393081665039" + }, + "R6": { + "f": "84.4315185546875" + }, + "R7": { + "f": "86.51227569580078" + }, + "R8": { + "f": "67.2285385131836" + }, + "R9": { + "f": "12.525043487548828" + }, + "R10": { + "f": "75.23241424560547" + }, + "R11": { + "f": "80.69010925292969" + }, + "R12": { + "f": "53.97742462158203" + }, + "R13": { + "f": "84.02236938476562" + }, + "R14": { + "f": "97.37865447998047" + }, + "R15": { + "f": "76.29852294921875" + }, + "Phi_e_mW": { + "f": "558.6363525390625" + }, + "Phi_euv_mW": { + "f": "0.0" + }, + "Phi_eb_mW": { + "f": "152.54922485351562" + }, + "Phi_ey_mW": { + "f": "257.9691162109375" + }, + "Phi_er_mW": { + "f": "144.27931213378906" + }, + "Phi_efr_mW": { + "f": "5.738129138946533" + }, + "Phi_eir_mW": { + "f": "0.0" + }, + "Phi_e_total": { + "f": "560.5353393554688" + }, + "CIE_X": { + "f": "259.6396484375" + }, + "CIE_Y": { + "f": "267.3780212402344" + }, + "CIE_Z": { + "f": "220.3765106201172" + }, + "TLCI": { + "f": "71.05938720703125" + }, + "PeakSignal": { + "f": "55124.0" + }, + "DarkSignal": { + "f": "2518.0" + }, + "Compensate": { + "f": "2834.0" + }, + "test_date": "2026-02-05", + "test_time": "17:57:56", + "spectrum": [ + { + "f": "0.012751605361700058" + }, + { + "f": "0.019872872158885002" + }, + { + "f": "0.028045589104294777" + }, + { + "f": "0.037235405296087265" + }, + { + "f": "0.04586365818977356" + }, + { + "f": "0.055570267140865326" + }, + { + "f": "0.06942032277584076" + }, + { + "f": "0.0877174660563469" + }, + { + "f": "0.10758954286575317" + }, + { + "f": "0.1307421624660492" + }, + { + "f": "0.15669184923171997" + }, + { + "f": "0.18851786851882935" + }, + { + "f": "0.22540125250816345" + }, + { + "f": "0.26648616790771484" + }, + { + "f": "0.3119043707847595" + }, + { + "f": "0.3618270456790924" + }, + { + "f": "0.4187490940093994" + }, + { + "f": "0.4837545156478882" + }, + { + "f": "0.557748556137085" + }, + { + "f": "0.6423267126083374" + }, + { + "f": "0.7369624376296997" + }, + { + "f": "0.8422220945358276" + }, + { + "f": "0.9593720436096191" + }, + { + "f": "1.0874791145324707" + }, + { + "f": "1.2269394397735596" + }, + { + "f": "1.3825690746307373" + }, + { + "f": "1.55661940574646" + }, + { + "f": "1.7559200525283813" + }, + { + "f": "1.9842716455459595" + }, + { + "f": "2.243068218231201" + }, + { + "f": "2.567126512527466" + }, + { + "f": "2.9272642135620117" + }, + { + "f": "3.281104803085327" + }, + { + "f": "3.6516284942626953" + }, + { + "f": "4.023560523986816" + }, + { + "f": "4.375395774841309" + }, + { + "f": "4.684656143188477" + }, + { + "f": "4.924221515655518" + }, + { + "f": "5.0737528800964355" + }, + { + "f": "5.118631839752197" + }, + { + "f": "5.0546088218688965" + }, + { + "f": "4.889369487762451" + }, + { + "f": "4.6387529373168945" + }, + { + "f": "4.328588008880615" + }, + { + "f": "3.9876480102539062" + }, + { + "f": "3.648306369781494" + }, + { + "f": "3.3328661918640137" + }, + { + "f": "3.0564544200897217" + }, + { + "f": "2.8235371112823486" + }, + { + "f": "2.6315131187438965" + }, + { + "f": "2.4748332500457764" + }, + { + "f": "2.347407579421997" + }, + { + "f": "2.239999532699585" + }, + { + "f": "2.1433849334716797" + }, + { + "f": "2.0506105422973633" + }, + { + "f": "1.9566218852996826" + }, + { + "f": "1.8594979047775269" + }, + { + "f": "1.7597956657409668" + }, + { + "f": "1.658769130706787" + }, + { + "f": "1.5595077276229858" + }, + { + "f": "1.4661515951156616" + }, + { + "f": "1.383679747581482" + }, + { + "f": "1.3149183988571167" + }, + { + "f": "1.260713815689087" + }, + { + "f": "1.2213445901870728" + }, + { + "f": "1.1959238052368164" + }, + { + "f": "1.1812207698822021" + }, + { + "f": "1.1777949333190918" + }, + { + "f": "1.1825836896896362" + }, + { + "f": "1.1936877965927124" + }, + { + "f": "1.2093138694763184" + }, + { + "f": "1.2279245853424072" + }, + { + "f": "1.2490814924240112" + }, + { + "f": "1.2723942995071411" + }, + { + "f": "1.2992111444473267" + }, + { + "f": "1.328942060470581" + }, + { + "f": "1.3587044477462769" + }, + { + "f": "1.3903580904006958" + }, + { + "f": "1.424752116203308" + }, + { + "f": "1.4621657133102417" + }, + { + "f": "1.5024986267089844" + }, + { + "f": "1.5459604263305664" + }, + { + "f": "1.5903823375701904" + }, + { + "f": "1.6359068155288696" + }, + { + "f": "1.6819840669631958" + }, + { + "f": "1.727636694908142" + }, + { + "f": "1.7732758522033691" + }, + { + "f": "1.817969560623169" + }, + { + "f": "1.861763834953308" + }, + { + "f": "1.9039026498794556" + }, + { + "f": "1.94393789768219" + }, + { + "f": "1.9812417030334473" + }, + { + "f": "2.016695261001587" + }, + { + "f": "2.05073618888855" + }, + { + "f": "2.0835671424865723" + }, + { + "f": "2.1144931316375732" + }, + { + "f": "2.1427807807922363" + }, + { + "f": "2.168936252593994" + }, + { + "f": "2.193687915802002" + }, + { + "f": "2.2167651653289795" + }, + { + "f": "2.23732328414917" + }, + { + "f": "2.256235122680664" + }, + { + "f": "2.2736613750457764" + }, + { + "f": "2.291166067123413" + }, + { + "f": "2.3080577850341797" + }, + { + "f": "2.3242313861846924" + }, + { + "f": "2.3386383056640625" + }, + { + "f": "2.3511247634887695" + }, + { + "f": "2.363165855407715" + }, + { + "f": "2.3741674423217773" + }, + { + "f": "2.3851656913757324" + }, + { + "f": "2.397684097290039" + }, + { + "f": "2.410454511642456" + }, + { + "f": "2.42181134223938" + }, + { + "f": "2.4330127239227295" + }, + { + "f": "2.443488359451294" + }, + { + "f": "2.453493356704712" + }, + { + "f": "2.4646096229553223" + }, + { + "f": "2.4764809608459473" + }, + { + "f": "2.488693952560425" + }, + { + "f": "2.501039981842041" + }, + { + "f": "2.512991428375244" + }, + { + "f": "2.5261659622192383" + }, + { + "f": "2.539850950241089" + }, + { + "f": "2.5535006523132324" + }, + { + "f": "2.5665295124053955" + }, + { + "f": "2.5781102180480957" + }, + { + "f": "2.589808940887451" + }, + { + "f": "2.6019270420074463" + }, + { + "f": "2.613881826400757" + }, + { + "f": "2.6255955696105957" + }, + { + "f": "2.6366753578186035" + }, + { + "f": "2.6477980613708496" + }, + { + "f": "2.6599619388580322" + }, + { + "f": "2.673037528991699" + }, + { + "f": "2.6859164237976074" + }, + { + "f": "2.696850061416626" + }, + { + "f": "2.7064077854156494" + }, + { + "f": "2.714651107788086" + }, + { + "f": "2.722805976867676" + }, + { + "f": "2.7311975955963135" + }, + { + "f": "2.7388017177581787" + }, + { + "f": "2.745450973510742" + }, + { + "f": "2.7511441707611084" + }, + { + "f": "2.7560412883758545" + }, + { + "f": "2.7605092525482178" + }, + { + "f": "2.7655410766601562" + }, + { + "f": "2.771364688873291" + }, + { + "f": "2.7775423526763916" + }, + { + "f": "2.783020257949829" + }, + { + "f": "2.787494421005249" + }, + { + "f": "2.791400909423828" + }, + { + "f": "2.7957513332366943" + }, + { + "f": "2.800971269607544" + }, + { + "f": "2.806450605392456" + }, + { + "f": "2.811685562133789" + }, + { + "f": "2.8167710304260254" + }, + { + "f": "2.8223354816436768" + }, + { + "f": "2.830386161804199" + }, + { + "f": "2.838911533355713" + }, + { + "f": "2.845226526260376" + }, + { + "f": "2.8503899574279785" + }, + { + "f": "2.8542258739471436" + }, + { + "f": "2.856980562210083" + }, + { + "f": "2.859574556350708" + }, + { + "f": "2.8615429401397705" + }, + { + "f": "2.863377332687378" + }, + { + "f": "2.8654980659484863" + }, + { + "f": "2.867385149002075" + }, + { + "f": "2.869213342666626" + }, + { + "f": "2.87048077583313" + }, + { + "f": "2.870293140411377" + }, + { + "f": "2.8692541122436523" + }, + { + "f": "2.8676178455352783" + }, + { + "f": "2.86576247215271" + }, + { + "f": "2.864103317260742" + }, + { + "f": "2.862551689147949" + }, + { + "f": "2.859722375869751" + }, + { + "f": "2.8558521270751953" + }, + { + "f": "2.850346088409424" + }, + { + "f": "2.843209743499756" + }, + { + "f": "2.83524227142334" + }, + { + "f": "2.826209545135498" + }, + { + "f": "2.8198134899139404" + }, + { + "f": "2.8133413791656494" + }, + { + "f": "2.803227424621582" + }, + { + "f": "2.792621374130249" + }, + { + "f": "2.7809126377105713" + }, + { + "f": "2.767630100250244" + }, + { + "f": "2.75346040725708" + }, + { + "f": "2.738298177719116" + }, + { + "f": "2.7225794792175293" + }, + { + "f": "2.7055318355560303" + }, + { + "f": "2.6869356632232666" + }, + { + "f": "2.6669864654541016" + }, + { + "f": "2.6450936794281006" + }, + { + "f": "2.621818780899048" + }, + { + "f": "2.5979394912719727" + }, + { + "f": "2.573420763015747" + }, + { + "f": "2.5489394664764404" + }, + { + "f": "2.524122953414917" + }, + { + "f": "2.4983420372009277" + }, + { + "f": "2.4720699787139893" + }, + { + "f": "2.4500653743743896" + }, + { + "f": "2.4268603324890137" + }, + { + "f": "2.395915985107422" + }, + { + "f": "2.363003730773926" + }, + { + "f": "2.329984664916992" + }, + { + "f": "2.297795295715332" + }, + { + "f": "2.267218828201294" + }, + { + "f": "2.2366769313812256" + }, + { + "f": "2.2050118446350098" + }, + { + "f": "2.171989679336548" + }, + { + "f": "2.137929677963257" + }, + { + "f": "2.103059768676758" + }, + { + "f": "2.0678858757019043" + }, + { + "f": "2.033090114593506" + }, + { + "f": "1.999245285987854" + }, + { + "f": "1.9657877683639526" + }, + { + "f": "1.931483268737793" + }, + { + "f": "1.8960784673690796" + }, + { + "f": "1.8651005029678345" + }, + { + "f": "1.833382487297058" + }, + { + "f": "1.7962939739227295" + }, + { + "f": "1.7597486972808838" + }, + { + "f": "1.7245805263519287" + }, + { + "f": "1.6901434659957886" + }, + { + "f": "1.6554286479949951" + }, + { + "f": "1.619916319847107" + }, + { + "f": "1.582892656326294" + }, + { + "f": "1.545198678970337" + }, + { + "f": "1.5080547332763672" + }, + { + "f": "1.4725933074951172" + }, + { + "f": "1.4383249282836914" + }, + { + "f": "1.4047859907150269" + }, + { + "f": "1.3705945014953613" + }, + { + "f": "1.3407946825027466" + }, + { + "f": "1.3109182119369507" + }, + { + "f": "1.275872826576233" + }, + { + "f": "1.240785002708435" + }, + { + "f": "1.2060282230377197" + }, + { + "f": "1.1718404293060303" + }, + { + "f": "1.138986349105835" + }, + { + "f": "1.1073496341705322" + }, + { + "f": "1.0769301652908325" + }, + { + "f": "1.0473116636276245" + }, + { + "f": "1.0178817510604858" + }, + { + "f": "0.9895303249359131" + }, + { + "f": "0.9619953036308289" + }, + { + "f": "0.9345967173576355" + }, + { + "f": "0.9110895991325378" + }, + { + "f": "0.8876740336418152" + }, + { + "f": "0.8601495027542114" + }, + { + "f": "0.8338325619697571" + }, + { + "f": "0.809400200843811" + }, + { + "f": "0.7855517268180847" + }, + { + "f": "0.7624680399894714" + }, + { + "f": "0.7393308281898499" + }, + { + "f": "0.7166115045547485" + }, + { + "f": "0.6946216821670532" + }, + { + "f": "0.6734119653701782" + }, + { + "f": "0.6530465483665466" + }, + { + "f": "0.6327908039093018" + }, + { + "f": "0.6156732439994812" + }, + { + "f": "0.5986793041229248" + }, + { + "f": "0.579149603843689" + }, + { + "f": "0.5599610209465027" + }, + { + "f": "0.5405372977256775" + }, + { + "f": "0.5205346941947937" + }, + { + "f": "0.5004535913467407" + }, + { + "f": "0.48106420040130615" + }, + { + "f": "0.4634655714035034" + }, + { + "f": "0.44763562083244324" + }, + { + "f": "0.43250906467437744" + }, + { + "f": "0.41720300912857056" + }, + { + "f": "0.40188223123550415" + }, + { + "f": "0.38871774077415466" + }, + { + "f": "0.3765038549900055" + }, + { + "f": "0.363219678401947" + }, + { + "f": "0.35016971826553345" + }, + { + "f": "0.336774080991745" + }, + { + "f": "0.3226785659790039" + }, + { + "f": "0.30884724855422974" + }, + { + "f": "0.29547831416130066" + }, + { + "f": "0.28302744030952454" + }, + { + "f": "0.27148663997650146" + }, + { + "f": "0.26082730293273926" + }, + { + "f": "0.2521239221096039" + }, + { + "f": "0.24343670904636383" + }, + { + "f": "0.23306481540203094" + }, + { + "f": "0.22262677550315857" + }, + { + "f": "0.21228225529193878" + }, + { + "f": "0.2029491364955902" + }, + { + "f": "0.1942906528711319" + }, + { + "f": "0.18600165843963623" + }, + { + "f": "0.17864948511123657" + }, + { + "f": "0.17137986421585083" + }, + { + "f": "0.16502498090267181" + }, + { + "f": "0.15882934629917145" + }, + { + "f": "0.153046116232872" + }, + { + "f": "0.1472157984972" + }, + { + "f": "0.13979841768741608" + }, + { + "f": "0.13240937888622284" + }, + { + "f": "0.1256866157054901" + }, + { + "f": "0.11934972554445267" + }, + { + "f": "0.11386556178331375" + }, + { + "f": "0.10920307785272598" + }, + { + "f": "0.10463880002498627" + }, + { + "f": "0.10014059394598007" + }, + { + "f": "0.09568504989147186" + }, + { + "f": "0.09095148742198944" + }, + { + "f": "0.08620673418045044" + }, + { + "f": "0.08238605409860611" + }, + { + "f": "0.0786927118897438" + }, + { + "f": "0.0746360793709755" + }, + { + "f": "0.07059939205646515" + }, + { + "f": "0.06689753383398056" + }, + { + "f": "0.06428854912519455" + }, + { + "f": "0.06239856034517288" + }, + { + "f": "0.06059492006897926" + }, + { + "f": "0.058452002704143524" + }, + { + "f": "0.05544740706682205" + }, + { + "f": "0.05254547297954559" + }, + { + "f": "0.04995877295732498" + }, + { + "f": "0.047497790306806564" + }, + { + "f": "0.0451221764087677" + }, + { + "f": "0.04278355836868286" + }, + { + "f": "0.04073198884725571" + }, + { + "f": "0.039509277790784836" + }, + { + "f": "0.03880281001329422" + }, + { + "f": "0.037949129939079285" + }, + { + "f": "0.03679538518190384" + }, + { + "f": "0.03486483544111252" + }, + { + "f": "0.033066526055336" + }, + { + "f": "0.03137720003724098" + }, + { + "f": "0.029833132401108742" + }, + { + "f": "0.028652796521782875" + }, + { + "f": "0.026884732767939568" + }, + { + "f": "0.024801045656204224" + }, + { + "f": "0.02275918424129486" + }, + { + "f": "0.02066059224307537" + }, + { + "f": "0.018572166562080383" + }, + { + "f": "0.01726132072508335" + }, + { + "f": "0.016803288832306862" + }, + { + "f": "0.016198325902223587" + }, + { + "f": "0.015074310824275017" + }, + { + "f": "0.013724006712436676" + }, + { + "f": "0.012220988050103188" + }, + { + "f": "0.011293729767203331" + }, + { + "f": "0.010707540437579155" + } + ], + "spectrum_nm": [ + { + "f": "380.0" + }, + { + "f": "381.91977077363896" + }, + { + "f": "383.8395415472779" + }, + { + "f": "385.75931232091693" + }, + { + "f": "387.6790830945559" + }, + { + "f": "389.59885386819485" + }, + { + "f": "391.5186246418338" + }, + { + "f": "393.43839541547277" + }, + { + "f": "395.3581661891117" + }, + { + "f": "397.2779369627507" + }, + { + "f": "399.1977077363897" + }, + { + "f": "401.11747851002866" + }, + { + "f": "403.0372492836676" + }, + { + "f": "404.9570200573066" + }, + { + "f": "406.87679083094554" + }, + { + "f": "408.79656160458455" + }, + { + "f": "410.7163323782235" + }, + { + "f": "412.63610315186247" + }, + { + "f": "414.55587392550143" + }, + { + "f": "416.4756446991404" + }, + { + "f": "418.39541547277935" + }, + { + "f": "420.3151862464183" + }, + { + "f": "422.2349570200573" + }, + { + "f": "424.1547277936963" + }, + { + "f": "426.07449856733524" + }, + { + "f": "427.9942693409742" + }, + { + "f": "429.91404011461316" + }, + { + "f": "431.8338108882522" + }, + { + "f": "433.75358166189113" + }, + { + "f": "435.6733524355301" + }, + { + "f": "437.59312320916905" + }, + { + "f": "439.512893982808" + }, + { + "f": "441.43266475644697" + }, + { + "f": "443.3524355300859" + }, + { + "f": "445.27220630372494" + }, + { + "f": "447.1919770773639" + }, + { + "f": "449.11174785100286" + }, + { + "f": "451.0315186246418" + }, + { + "f": "452.9512893982808" + }, + { + "f": "454.8710601719198" + }, + { + "f": "456.79083094555875" + }, + { + "f": "458.7106017191977" + }, + { + "f": "460.63037249283667" + }, + { + "f": "462.55014326647563" + }, + { + "f": "464.46991404011465" + }, + { + "f": "466.38968481375355" + }, + { + "f": "468.30945558739256" + }, + { + "f": "470.2292263610315" + }, + { + "f": "472.1489971346705" + }, + { + "f": "474.06876790830944" + }, + { + "f": "475.9885386819484" + }, + { + "f": "477.9083094555874" + }, + { + "f": "479.8280802292264" + }, + { + "f": "481.74785100286533" + }, + { + "f": "483.6676217765043" + }, + { + "f": "485.58739255014325" + }, + { + "f": "487.50716332378227" + }, + { + "f": "489.42693409742117" + }, + { + "f": "491.3467048710602" + }, + { + "f": "493.26647564469914" + }, + { + "f": "495.1862464183381" + }, + { + "f": "497.10601719197706" + }, + { + "f": "499.025787965616" + }, + { + "f": "500.94555873925503" + }, + { + "f": "502.865329512894" + }, + { + "f": "504.78510028653295" + }, + { + "f": "506.7048710601719" + }, + { + "f": "508.62464183381087" + }, + { + "f": "510.5444126074499" + }, + { + "f": "512.4641833810888" + }, + { + "f": "514.3839541547278" + }, + { + "f": "516.3037249283668" + }, + { + "f": "518.2234957020057" + }, + { + "f": "520.1432664756447" + }, + { + "f": "522.0630372492836" + }, + { + "f": "523.9828080229227" + }, + { + "f": "525.9025787965616" + }, + { + "f": "527.8223495702006" + }, + { + "f": "529.7421203438396" + }, + { + "f": "531.6618911174785" + }, + { + "f": "533.5816618911175" + }, + { + "f": "535.5014326647564" + }, + { + "f": "537.4212034383954" + }, + { + "f": "539.3409742120343" + }, + { + "f": "541.2607449856733" + }, + { + "f": "543.1805157593124" + }, + { + "f": "545.1002865329513" + }, + { + "f": "547.0200573065903" + }, + { + "f": "548.9398280802293" + }, + { + "f": "550.8595988538682" + }, + { + "f": "552.7793696275071" + }, + { + "f": "554.6991404011461" + }, + { + "f": "556.6189111747851" + }, + { + "f": "558.538681948424" + }, + { + "f": "560.458452722063" + }, + { + "f": "562.3782234957021" + }, + { + "f": "564.297994269341" + }, + { + "f": "566.21776504298" + }, + { + "f": "568.1375358166189" + }, + { + "f": "570.0573065902579" + }, + { + "f": "571.9770773638968" + }, + { + "f": "573.8968481375358" + }, + { + "f": "575.8166189111748" + }, + { + "f": "577.7363896848137" + }, + { + "f": "579.6561604584527" + }, + { + "f": "581.5759312320916" + }, + { + "f": "583.4957020057307" + }, + { + "f": "585.4154727793696" + }, + { + "f": "587.3352435530086" + }, + { + "f": "589.2550143266476" + }, + { + "f": "591.1747851002865" + }, + { + "f": "593.0945558739255" + }, + { + "f": "595.0143266475645" + }, + { + "f": "596.9340974212034" + }, + { + "f": "598.8538681948423" + }, + { + "f": "600.7736389684814" + }, + { + "f": "602.6934097421204" + }, + { + "f": "604.6131805157593" + }, + { + "f": "606.5329512893983" + }, + { + "f": "608.4527220630373" + }, + { + "f": "610.3724928366762" + }, + { + "f": "612.2922636103152" + }, + { + "f": "614.2120343839541" + }, + { + "f": "616.1318051575931" + }, + { + "f": "618.051575931232" + }, + { + "f": "619.971346704871" + }, + { + "f": "621.8911174785101" + }, + { + "f": "623.810888252149" + }, + { + "f": "625.730659025788" + }, + { + "f": "627.6504297994269" + }, + { + "f": "629.5702005730659" + }, + { + "f": "631.4899713467048" + }, + { + "f": "633.4097421203438" + }, + { + "f": "635.3295128939828" + }, + { + "f": "637.2492836676217" + }, + { + "f": "639.1690544412608" + }, + { + "f": "641.0888252148998" + }, + { + "f": "643.0085959885387" + }, + { + "f": "644.9283667621776" + }, + { + "f": "646.8481375358166" + }, + { + "f": "648.7679083094556" + }, + { + "f": "650.6876790830945" + }, + { + "f": "652.6074498567335" + }, + { + "f": "654.5272206303725" + }, + { + "f": "656.4469914040114" + }, + { + "f": "658.3667621776503" + }, + { + "f": "660.2865329512895" + }, + { + "f": "662.2063037249284" + }, + { + "f": "664.1260744985673" + }, + { + "f": "666.0458452722063" + }, + { + "f": "667.9656160458453" + }, + { + "f": "669.8853868194842" + }, + { + "f": "671.8051575931232" + }, + { + "f": "673.7249283667622" + }, + { + "f": "675.6446991404011" + }, + { + "f": "677.56446991404" + }, + { + "f": "679.4842406876791" + }, + { + "f": "681.4040114613181" + }, + { + "f": "683.323782234957" + }, + { + "f": "685.243553008596" + }, + { + "f": "687.163323782235" + }, + { + "f": "689.0830945558739" + }, + { + "f": "691.0028653295128" + }, + { + "f": "692.9226361031518" + }, + { + "f": "694.8424068767908" + }, + { + "f": "696.7621776504297" + }, + { + "f": "698.6819484240688" + }, + { + "f": "700.6017191977078" + }, + { + "f": "702.5214899713467" + }, + { + "f": "704.4412607449856" + }, + { + "f": "706.3610315186247" + }, + { + "f": "708.2808022922636" + }, + { + "f": "710.2005730659025" + }, + { + "f": "712.1203438395415" + }, + { + "f": "714.0401146131805" + }, + { + "f": "715.9598853868195" + }, + { + "f": "717.8796561604585" + }, + { + "f": "719.7994269340975" + }, + { + "f": "721.7191977077364" + }, + { + "f": "723.6389684813753" + }, + { + "f": "725.5587392550143" + }, + { + "f": "727.4785100286533" + }, + { + "f": "729.3982808022922" + }, + { + "f": "731.3180515759312" + }, + { + "f": "733.2378223495703" + }, + { + "f": "735.1575931232092" + }, + { + "f": "737.077363896848" + }, + { + "f": "738.9971346704871" + }, + { + "f": "740.9169054441261" + }, + { + "f": "742.836676217765" + }, + { + "f": "744.756446991404" + }, + { + "f": "746.676217765043" + }, + { + "f": "748.5959885386819" + }, + { + "f": "750.5157593123208" + }, + { + "f": "752.43553008596" + }, + { + "f": "754.3553008595989" + }, + { + "f": "756.2750716332378" + }, + { + "f": "758.1948424068768" + }, + { + "f": "760.1146131805158" + }, + { + "f": "762.0343839541547" + }, + { + "f": "763.9541547277937" + }, + { + "f": "765.8739255014327" + }, + { + "f": "767.7936962750716" + }, + { + "f": "769.7134670487105" + }, + { + "f": "771.6332378223495" + }, + { + "f": "773.5530085959886" + }, + { + "f": "775.4727793696275" + }, + { + "f": "777.3925501432665" + }, + { + "f": "779.3123209169055" + }, + { + "f": "781.2320916905444" + }, + { + "f": "783.1518624641833" + }, + { + "f": "785.0716332378223" + }, + { + "f": "786.9914040114613" + }, + { + "f": "788.9111747851002" + }, + { + "f": "790.8309455587392" + }, + { + "f": "792.7507163323783" + }, + { + "f": "794.6704871060172" + }, + { + "f": "796.5902578796561" + }, + { + "f": "798.5100286532952" + }, + { + "f": "800.4297994269341" + }, + { + "f": "802.349570200573" + }, + { + "f": "804.269340974212" + }, + { + "f": "806.189111747851" + }, + { + "f": "808.1088825214899" + }, + { + "f": "810.028653295129" + }, + { + "f": "811.948424068768" + }, + { + "f": "813.8681948424069" + }, + { + "f": "815.7879656160458" + }, + { + "f": "817.7077363896848" + }, + { + "f": "819.6275071633238" + }, + { + "f": "821.5472779369627" + }, + { + "f": "823.4670487106017" + }, + { + "f": "825.3868194842407" + }, + { + "f": "827.3065902578796" + }, + { + "f": "829.2263610315185" + }, + { + "f": "831.1461318051576" + }, + { + "f": "833.0659025787966" + }, + { + "f": "834.9856733524355" + }, + { + "f": "836.9054441260745" + }, + { + "f": "838.8252148997135" + }, + { + "f": "840.7449856733524" + }, + { + "f": "842.6647564469913" + }, + { + "f": "844.5845272206304" + }, + { + "f": "846.5042979942693" + }, + { + "f": "848.4240687679082" + }, + { + "f": "850.3438395415473" + }, + { + "f": "852.2636103151863" + }, + { + "f": "854.1833810888252" + }, + { + "f": "856.1031518624642" + }, + { + "f": "858.0229226361032" + }, + { + "f": "859.9426934097421" + }, + { + "f": "861.862464183381" + }, + { + "f": "863.78223495702" + }, + { + "f": "865.702005730659" + }, + { + "f": "867.6217765042979" + }, + { + "f": "869.541547277937" + }, + { + "f": "871.461318051576" + }, + { + "f": "873.3810888252149" + }, + { + "f": "875.3008595988538" + }, + { + "f": "877.2206303724929" + }, + { + "f": "879.1404011461318" + }, + { + "f": "881.0601719197707" + }, + { + "f": "882.9799426934097" + }, + { + "f": "884.8997134670487" + }, + { + "f": "886.8194842406876" + }, + { + "f": "888.7392550143267" + }, + { + "f": "890.6590257879657" + }, + { + "f": "892.5787965616046" + }, + { + "f": "894.4985673352436" + }, + { + "f": "896.4183381088825" + }, + { + "f": "898.3381088825215" + }, + { + "f": "900.2578796561604" + }, + { + "f": "902.1776504297994" + }, + { + "f": "904.0974212034383" + }, + { + "f": "906.0171919770773" + }, + { + "f": "907.9369627507164" + }, + { + "f": "909.8567335243553" + }, + { + "f": "911.7765042979943" + }, + { + "f": "913.6962750716332" + }, + { + "f": "915.6160458452722" + }, + { + "f": "917.5358166189112" + }, + { + "f": "919.4555873925501" + }, + { + "f": "921.3753581661891" + }, + { + "f": "923.295128939828" + }, + { + "f": "925.214899713467" + }, + { + "f": "927.134670487106" + }, + { + "f": "929.054441260745" + }, + { + "f": "930.974212034384" + }, + { + "f": "932.8939828080229" + }, + { + "f": "934.8137535816619" + }, + { + "f": "936.7335243553008" + }, + { + "f": "938.6532951289398" + }, + { + "f": "940.5730659025788" + }, + { + "f": "942.4928366762177" + }, + { + "f": "944.4126074498568" + }, + { + "f": "946.3323782234957" + }, + { + "f": "948.2521489971347" + }, + { + "f": "950.1719197707736" + }, + { + "f": "952.0916905444126" + }, + { + "f": "954.0114613180516" + }, + { + "f": "955.9312320916905" + }, + { + "f": "957.8510028653295" + }, + { + "f": "959.7707736389684" + }, + { + "f": "961.6905444126074" + }, + { + "f": "963.6103151862465" + }, + { + "f": "965.5300859598854" + }, + { + "f": "967.4498567335244" + }, + { + "f": "969.3696275071633" + }, + { + "f": "971.2893982808023" + }, + { + "f": "973.2091690544412" + }, + { + "f": "975.1289398280802" + }, + { + "f": "977.0487106017192" + }, + { + "f": "978.9684813753581" + }, + { + "f": "980.8882521489971" + }, + { + "f": "982.808022922636" + }, + { + "f": "984.7277936962751" + }, + { + "f": "986.6475644699141" + }, + { + "f": "988.567335243553" + }, + { + "f": "990.487106017192" + }, + { + "f": "992.4068767908309" + }, + { + "f": "994.3266475644699" + }, + { + "f": "996.2464183381088" + }, + { + "f": "998.1661891117478" + }, + { + "f": "1000.0859598853868" + }, + { + "f": "1002.0057306590257" + }, + { + "f": "1003.9255014326648" + }, + { + "f": "1005.8452722063037" + }, + { + "f": "1007.7650429799427" + }, + { + "f": "1009.6848137535817" + }, + { + "f": "1011.6045845272206" + }, + { + "f": "1013.5243553008596" + }, + { + "f": "1015.4441260744985" + }, + { + "f": "1017.3638968481375" + }, + { + "f": "1019.2836676217764" + }, + { + "f": "1021.2034383954154" + }, + { + "f": "1023.1232091690545" + }, + { + "f": "1025.0429799426934" + }, + { + "f": "1026.9627507163323" + }, + { + "f": "1028.8825214899712" + }, + { + "f": "1030.8022922636103" + }, + { + "f": "1032.7220630372494" + }, + { + "f": "1034.6418338108883" + }, + { + "f": "1036.5616045845272" + }, + { + "f": "1038.4813753581661" + }, + { + "f": "1040.401146131805" + }, + { + "f": "1042.320916905444" + }, + { + "f": "1044.240687679083" + }, + { + "f": "1046.1604584527222" + }, + { + "f": "1048.080229226361" + }, + { + "f": "1050.0" + } + ], + "Voltage_V": { + "f": "0.0" + }, + "Current_A": { + "f": "0.0" + }, + "Power_W": { + "f": "0.0" + }, + "Freq_Hz": { + "f": "0.0" + }, + "PF": { + "f": "0.0" + } + } + } +] \ No newline at end of file diff --git a/tests/sim.rs b/tests/sim.rs new file mode 100644 index 0000000..18e8f4e --- /dev/null +++ b/tests/sim.rs @@ -0,0 +1,143 @@ +//! The driver against the simulated instrument: command bytes, measurement +//! sequences, supply handling, timeouts and cancellation. + +use hpcs6500::protocol::{self, cmd}; +use hpcs6500::sim::Simulator; +use hpcs6500::{Error, Hpcs6500, Mode}; +use std::sync::Arc; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::time::{Duration, Instant}; + +fn dev() -> Hpcs6500 { + Hpcs6500::with_transport(Simulator::sample(), "sim") +} + +fn cmds(d: &Hpcs6500) -> Vec { + d.transport().log.iter().map(|f| f[1]).collect() +} + +#[test] +fn identify_and_supply_commands() { + let mut d = dev(); + assert_eq!(d.identify().unwrap(), "HPCS6500"); + d.set_mode(Mode::Dc).unwrap(); + d.set_dc_voltage(12.0).unwrap(); + d.set_dc_current(1.5).unwrap(); + d.set_ac_voltage(230.0).unwrap(); + d.set_ac_frequency(60.0).unwrap(); + d.set_integration_time(500.0).unwrap(); + let s = d.read_psu_settings().unwrap(); + assert_eq!( + ( + s.mode, + s.dc_voltage, + s.dc_current, + s.ac_voltage, + s.ac_frequency + ), + (Mode::Dc, 12.0, 1.5, 230.0, 60.0) + ); + let log = &d.transport().log; + assert_eq!(log[1], vec![0x8C, 0x7A, 0x01]); + assert_eq!(log[2], protocol::frame_f32(cmd::SET_DC, 1, 12.0)); + assert_eq!(log[3], protocol::frame_f32(cmd::SET_DC, 0, 1.5)); + assert_eq!(log[6], vec![0x8C, 0x01, 0x20, 0xA1, 0x07, 0x00]); // 500 000 us + d.psu_on().unwrap(); + assert!(d.transport().output_on); + d.psu_off().unwrap(); + assert!(!d.transport().output_on); +} + +#[test] +fn single_reading_follows_the_vendor_sequence() { + let mut d = dev(); + d.send_test_config(false).unwrap(); + let r = d.take_single_reading().unwrap(); + assert_eq!(r.device, "HPCS6500"); + assert!((r.flux_lm() - 483.7375).abs() < 1e-3); + assert!(r.electrical.is_some()); + // 2B 2B, trigger (0E 02), polls, 13, 77, reset + let c = cmds(&d); + assert_eq!(&c[..3], &[cmd::TEST_CONFIG, cmd::TEST_CONFIG, cmd::START]); + assert_eq!(d.transport().log[2], vec![0x8C, 0x0E, 0x02]); + assert!(c[3..c.len() - 3].iter().all(|&x| x == cmd::POLL_STATE)); + assert_eq!( + &c[c.len() - 3..], + &[cmd::READ_MEASUREMENT, cmd::READ_ELECTRICAL, cmd::RESET] + ); + assert!(!d.transport().output_on, "the supply is not touched"); +} + +#[test] +fn continuous_reading_switches_the_supply_around_it() { + let mut d = dev(); + let r = d.take_reading(true).unwrap(); + assert_eq!(r.spectrum.len(), 350); + let c = cmds(&d); + assert_eq!(c[0], cmd::PSU_OUTPUT); + assert_eq!(d.transport().log[0], vec![0x8C, 0x72, 0x00]); + assert_eq!(d.transport().log[1], vec![0x8C, 0x0E, 0x01]); + assert_eq!( + &c[c.len() - 4..], + &[ + cmd::READ_MEASUREMENT, + cmd::READ_ELECTRICAL, + cmd::START, + cmd::PSU_OUTPUT + ] + ); + assert_eq!(d.transport().log.last().unwrap(), &vec![0x8C, 0x72, 0x01]); + assert!(!d.transport().output_on); +} + +#[test] +fn silent_instrument_times_out_and_the_supply_still_goes_off() { + let mut d = dev(); + d.transport_mut().mute = vec![cmd::POLL_STATE]; + let mut sim = Simulator::sample(); + sim.mute = vec![cmd::IDENTIFY]; + let mut quiet = Hpcs6500::with_transport(sim, "sim"); + let t = Instant::now(); + assert!(matches!( + quiet.identify(), + Err(Error::BadResponse { cmd: 0, .. }) + )); + assert!(t.elapsed() >= Duration::from_secs(2) && t.elapsed() < Duration::from_secs(4)); + + // a reading whose data never arrives: cancel it instead of waiting 30 s + let stop = Arc::new(AtomicBool::new(false)); + d.set_cancel_flag(stop.clone()); + let s2 = stop.clone(); + std::thread::spawn(move || { + std::thread::sleep(Duration::from_millis(300)); + s2.store(true, Ordering::SeqCst); + }); + let t = Instant::now(); + let r = d.take_reading(true); + assert!(matches!(r, Err(Error::Cancelled)), "{r:?}"); + assert!(t.elapsed() < Duration::from_secs(8)); + assert!( + !d.transport().output_on, + "supply off after the failed reading" + ); + assert_eq!(d.transport().log.last().unwrap(), &vec![0x8C, 0x72, 0x01]); +} + +#[test] +fn missing_ack_is_an_error() { + let mut sim = Simulator::sample(); + sim.mute = vec![cmd::PSU_OUTPUT]; + let mut d = Hpcs6500::with_transport(sim, "sim"); + assert!(matches!(d.psu_on(), Err(Error::NoAck { cmd: 0x72, .. }))); +} + +#[test] +fn passive_read_and_replay_cycle_through_readings() { + let mut sim = Simulator::sample(); + sim.polls_to_ready = 0; + let mut d = Hpcs6500::with_transport(sim, "sim"); + let a = d.read_current().unwrap(); + let b = d.take_single_reading().unwrap(); + assert_eq!(a, b); + assert_eq!(d.transport().served, 1); +} diff --git a/tm30.py b/tm30.py deleted file mode 100644 index f15b0bf..0000000 --- a/tm30.py +++ /dev/null @@ -1,125 +0,0 @@ -""" -ANSI/IES TM-30-18 computation from an HPCS 6500 spectrum. - -Wraps colour-science to derive the fidelity index Rf, gamut index Rg, and the -per-hue-bin data needed to draw a TM-30 color vector graphic (CVG): the test -and reference chromaticity averages in CAM02-UCS a'b' (raw and normalized so -the reference gamut is the unit circle), plus per-bin chroma shift, hue shift, -and local fidelity. - -The instrument spectrum is relative; TM-30 is scale-invariant, so no absolute -calibration is required. Only the 380-780 nm range is used. -""" - -import warnings - -import numpy as np - -try: - # colour warns at import time about optional scipy/matplotlib features; - # the TM-30 path used here needs neither. - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - import colour - from colour.quality import colour_fidelity_index_ANSIIESTM3018 -except ImportError as e: # pragma: no cover - raise ImportError( - "TM-30 computation requires colour-science; run `uv sync`" - ) from e - -VISIBLE_MIN_NM = 380 -VISIBLE_MAX_NM = 780 -N_BINS = 16 - - -def compute_tm30(wavelengths_nm, values): - """Compute TM-30-18 quantities from a measured spectrum. - - Args: - wavelengths_nm: sequence of wavelengths in nm (any step; 380-1050 - from the HPCS 6500 is fine, the IR tail is discarded). - values: spectral power at each wavelength (relative units). - - Returns dict: - Rf, Rg: floats - CCT_K, Duv: floats (as derived by the TM-30 reference selection) - bins: list of 16 dicts, hue bin 1..16, each with - ref_a, ref_b, test_a, test_b raw CAM02-UCS bin averages - ref_a_norm ... test_b_norm normalized (reference = unit circle) - Rcs_pct chroma shift, percent - Rhs hue shift (rad, CAM02-UCS) - Rf_h local fidelity for the bin - """ - wl = np.asarray(wavelengths_nm, dtype=float) - vals = np.asarray(values, dtype=float) - mask = (wl >= VISIBLE_MIN_NM) & (wl <= VISIBLE_MAX_NM) - if mask.sum() < 10: - raise ValueError("spectrum does not cover the visible range") - - # Resample onto a uniform 1 nm grid: the instrument's ~1.92 nm grid is - # non-uniform in colour's eyes and triggers interpolator paths that need - # scipy; a uniform grid keeps the pipeline on plain numpy. - grid = np.arange(VISIBLE_MIN_NM, VISIBLE_MAX_NM + 1, 1, dtype=float) - resampled = np.interp(grid, wl[mask], vals[mask]) - - sd = colour.SpectralDistribution(dict(zip(grid, resampled))) - # colour emits informational "aligning shape" runtime warnings while it - # adapts observers/illuminants to our 1 nm grid; not actionable. - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - spec = colour_fidelity_index_ANSIIESTM3018(sd, additional_data=True) - - averages_test = np.asarray(spec.averages_test) - averages_reference = np.asarray(spec.averages_reference) - average_norms = np.asarray(spec.average_norms) - R_cs = np.asarray(spec.R_cs) - R_hs = np.asarray(spec.R_hs) - - # Local fidelity per hue bin: mean of the per-CES R_f over the samples - # assigned to the bin (spec.bins holds the bin index of each CES). - sample_bins = np.asarray(spec.bins) - R_s = np.asarray(spec.R_s) - Rf_h = np.full(N_BINS, np.nan) - for j in range(N_BINS): - members = R_s[sample_bins == j] - if members.size: - Rf_h[j] = members.mean() - - bins = [] - for j in range(N_BINS): - norm = average_norms[j] if average_norms[j] else 1.0 - bins.append( - { - "bin": j + 1, - "ref_a": float(averages_reference[j, 0]), - "ref_b": float(averages_reference[j, 1]), - "test_a": float(averages_test[j, 0]), - "test_b": float(averages_test[j, 1]), - "ref_a_norm": float(averages_reference[j, 0] / norm), - "ref_b_norm": float(averages_reference[j, 1] / norm), - "test_a_norm": float(averages_test[j, 0] / norm), - "test_b_norm": float(averages_test[j, 1] / norm), - "Rcs_pct": float(R_cs[j]), - "Rhs": float(R_hs[j]), - "Rf_h": float(Rf_h[j]), - } - ) - - return { - "Rf": float(spec.R_f), - "Rg": float(spec.R_g), - "CCT_K": float(spec.CCT), - "Duv": float(spec.D_uv), - "bins": bins, - } - - -if __name__ == "__main__": - # Sanity check against a known illuminant. - sd = colour.SDS_ILLUMINANTS["FL2"] - wl = sd.wavelengths - result = compute_tm30(wl, sd.values) - print(f"FL2: Rf={result['Rf']:.1f} Rg={result['Rg']:.1f} " - f"CCT={result['CCT_K']:.0f} K Duv={result['Duv']:.4f}") - for b in result["bins"][:4]: - print(b) diff --git a/usb_capture.py b/usb_capture.py deleted file mode 100644 index 0737ad4..0000000 --- a/usb_capture.py +++ /dev/null @@ -1,341 +0,0 @@ -""" -HPCS6500 USB Traffic Capture & Parser - -1. Starts USBPcap to capture USB traffic from the HPCS6500 device -2. You use the vendor software normally while this runs -3. Press Ctrl+C to stop -4. Parses the .pcap file and extracts serial data (USB bulk transfers) -""" - -import subprocess -import struct -import sys -import os -import time -from datetime import datetime - -USBPCAP_CMD = r"C:\Program Files\USBPcap\USBPcapCMD.exe" -CAPTURE_DIR = "captures" -DEVICE_ADDRESS = 4 # From registry: Address = 4 - - -def find_usbpcap_devices(): - """Return all USBPcap devices (USBPcap1 through USBPcap10).""" - devices = [] - for i in range(1, 11): - device = rf"\\.\USBPcap{i}" - # Check if the device path exists by trying a quick capture to NUL - try: - result = subprocess.run( - [USBPCAP_CMD, "-d", device, "-o", "-", "-A"], - capture_output=True, timeout=2, - ) - devices.append(device) - print(f" {device} - available") - except subprocess.TimeoutExpired: - devices.append(device) - print(f" {device} - available (active)") - except Exception: - pass - return devices - - -def start_capture(device, output_file): - """Start USBPcap capture in background.""" - cmd = [ - USBPCAP_CMD, - "-d", device, - "-o", output_file, - "-A", # Capture from all devices on this hub (safe, we filter later) - "--devices", str(DEVICE_ADDRESS), # Only our device - "-s", "65535", # Max snapshot length - "-b", "1048576", # 1MB buffer - ] - print(f"Starting capture: {' '.join(cmd)}") - proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - return proc - - -def parse_pcap(filepath): - """Parse a pcap file with USBPcap headers and extract serial data.""" - with open(filepath, "rb") as f: - data = f.read() - - if len(data) < 24: - print("Capture file too small or empty.") - return - - # Parse pcap global header - magic = struct.unpack_from(" Device (OUT) - rx_data = bytearray() # Device -> Host (IN) - - pkt_num = 0 - while offset + 16 <= len(data): - # pcap packet header: ts_sec(4), ts_usec(4), incl_len(4), orig_len(4) - ts_sec, ts_usec, incl_len, orig_len = struct.unpack_from(f"{endian}IIII", data, offset) - offset += 16 - - if offset + incl_len > len(data): - break - - pkt_data = data[offset:offset + incl_len] - offset += incl_len - pkt_num += 1 - - # Parse USBPcap packet header (minimum 27 bytes) - if len(pkt_data) < 27: - continue - - # USBPcap header: - # headerLen (2 bytes LE) - # irpId (8 bytes) - # status (4 bytes) - # function (2 bytes) - URB function - # info (1 byte) - direction: bit 0: 0=OUT(host->dev), 1=IN(dev->host) - # bus (2 bytes) - # device (2 bytes) - # endpoint (1 byte) - bit 7 = direction, bits 0-3 = endpoint number - # transfer (1 byte) - 0=isoch, 1=interrupt, 2=control, 3=bulk - # dataLength (4 bytes) - - hdr_len = struct.unpack_from(" 0: # Bulk transfers - packets.append({ - "num": pkt_num, - "ts": ts, - "direction": direction, - "ep": endpoint, - "ep_dir": ep_dir, - "transfer": transfer_name, - "data": payload, - "status": status, - "device": device, - }) - - if direction == "IN" or ep_dir == "IN": - rx_data.extend(payload) - else: - tx_data.extend(payload) - - print(f"\nParsed {pkt_num} total packets, {len(packets)} bulk transfers with data") - print(f"TX (host -> device): {len(tx_data)} bytes") - print(f"RX (device -> host): {len(rx_data)} bytes") - - if not packets: - print("\nNo bulk transfer data found.") - return - - # Print timeline - print(f"\n{'='*80}") - print("TRAFFIC TIMELINE") - print(f"{'='*80}") - - first_ts = packets[0]["ts"] if packets else 0 - for pkt in packets[:100]: # First 100 packets - rel_ts = pkt["ts"] - first_ts - d = pkt["direction"] - payload = pkt["data"] - - if d == "IN" or pkt["ep_dir"] == "IN": - color = "\033[92m" # green for device -> host - label = "DEV->PC" - else: - color = "\033[93m" # yellow for host -> device - label = "PC->DEV" - reset = "\033[0m" - - hex_str = payload.hex(" ") - if len(hex_str) > 90: - hex_str = hex_str[:90] + f" ... (+{len(payload) - 30}B)" - - ascii_str = "".join(chr(b) if 32 <= b < 127 else "." for b in payload[:40]) - - print(f"{color}[{rel_ts:8.4f}] {label} EP{pkt['ep']:02X} ({len(payload):4d}B): {hex_str}{reset}") - # Show ASCII if useful - printable = sum(1 for b in payload if 32 <= b < 127) - if printable > len(payload) * 0.4: - print(f" ASCII: {ascii_str!r}") - - if len(packets) > 100: - print(f" ... ({len(packets) - 100} more packets)") - - # Save extracted serial data - if tx_data: - tx_file = filepath.replace(".pcap", "_TX.bin") - with open(tx_file, "wb") as f: - f.write(tx_data) - print(f"\nTX data saved to: {tx_file}") - - if rx_data: - rx_file = filepath.replace(".pcap", "_RX.bin") - with open(rx_file, "wb") as f: - f.write(rx_data) - print(f"\nRX data saved to: {rx_file}") - - # Quick analysis of the data - print(f"\n{'='*80}") - print("QUICK ANALYSIS") - print(f"{'='*80}") - - for label, stream in [("TX (PC -> Device)", tx_data), ("RX (Device -> PC)", rx_data)]: - if not stream: - continue - print(f"\n--- {label}: {len(stream)} bytes ---") - printable = sum(1 for b in stream if 32 <= b < 127 or b in (0x0A, 0x0D)) - print(f" Printable ratio: {printable/len(stream):.0%}") - - # Show first 200 bytes - sample = bytes(stream[:200]) - print(f" HEX: {sample.hex(' ')}") - print(f" ASCII: {''.join(chr(b) if 32 <= b < 127 else '.' for b in sample)}") - - # Try to find repeating patterns - if len(stream) > 10: - # Look for common delimiters - for delim_name, delim in [("\\r\\n", b"\r\n"), ("\\n", b"\n"), ("0xFF", b"\xff"), ("0xAA", b"\xaa")]: - count = bytes(stream).count(delim) - if count > 2: - print(f" Delimiter {delim_name}: appears {count} times") - - -def main(): - os.makedirs(CAPTURE_DIR, exist_ok=True) - - if len(sys.argv) > 1 and sys.argv[1] == "--parse": - # Parse mode: just parse an existing pcap file - if len(sys.argv) < 3: - print("Usage: usb_capture.py --parse ") - sys.exit(1) - parse_pcap(sys.argv[2]) - return - - print("HPCS6500 USB Traffic Capture") - print("=" * 60) - print(f"Device address: {DEVICE_ADDRESS}") - print() - - # Find all USBPcap devices - print("Looking for USBPcap filter devices...") - devices = find_usbpcap_devices() - if not devices: - print("ERROR: No USBPcap devices found.") - print(" - You may need to REBOOT after installing USBPcap") - print(" - You must run this script as ADMINISTRATOR") - sys.exit(1) - - print(f"\nFound {len(devices)} USBPcap hub(s)") - print() - - # Try ALL hubs — capture from each one simultaneously - timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") - procs = [] - - for i, device in enumerate(devices): - pcap_file = os.path.join(CAPTURE_DIR, f"usb_capture_{timestamp}_hub{i+1}.pcap") - print(f"Starting capture on {device} -> {pcap_file}") - proc = start_capture(device, pcap_file) - procs.append((proc, device, pcap_file)) - - print() - print("Capturing on ALL hubs simultaneously.") - print(">>> Now use the vendor software — take a measurement") - print(">>> Press Ctrl+C when done") - print("-" * 60) - - try: - while True: - # Check if any process died - all_dead = True - for proc, device, _ in procs: - if proc.poll() is None: - all_dead = False - if all_dead: - print("\nAll capture processes have exited.") - for proc, device, _ in procs: - stderr = proc.stderr.read().decode(errors="replace").strip() - print(f" {device}: exit code {proc.returncode}" + - (f" - {stderr}" if stderr else "")) - break - time.sleep(0.5) - except KeyboardInterrupt: - print("\n\nStopping captures...") - for proc, _, _ in procs: - proc.terminate() - for proc, _, _ in procs: - try: - proc.wait(timeout=5) - except subprocess.TimeoutExpired: - proc.kill() - - # Check which captures got data - print() - best_file = None - best_size = 0 - for proc, device, pcap_file in procs: - if os.path.exists(pcap_file): - size = os.path.getsize(pcap_file) - print(f"{device} -> {pcap_file}: {size} bytes") - if size > best_size: - best_size = size - best_file = pcap_file - else: - print(f"{device} -> no file created") - - if best_file and best_size > 24: - print(f"\nBest capture: {best_file} ({best_size} bytes)") - print("\nParsing capture...\n") - parse_pcap(best_file) - else: - print("\nNo USB data captured from any hub.") - print("Make sure you're running as ADMINISTRATOR.") - - -if __name__ == "__main__": - main()