From 68d4cc4017c1a0f0ae35db20f3e17376085718da Mon Sep 17 00:00:00 2001 From: monkey-w1n5t0n Date: Tue, 21 Jul 2026 20:17:58 +0200 Subject: [PATCH] =?UTF-8?q?build(firmware):=20migrate=20to=20PlatformIO=20?= =?UTF-8?q?and=20vendor=20memllib=20(plan=20=C2=A75)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit One cut, no dual path. Closes ALIGNMENT defect 3 ("Arduino-CLI build machinery is actively hostile") and vision bullet 4. platformio.ini carries 16 [env:], one per variant, each passing -DMEMLNAUT_MODE_TYPE; selftest passes -DNISPS_SELFTEST=1 instead. The env list IS the registry now — the .ino comment-registry and the NISPS_ST_* token-paste table are deleted rather than migrated. L12 noted that table was already silently missing the currently-shipped SLPWorkshop variant, which is the whole argument against having a second list. Also deleted: the Python/sed machinery that rewrote the COMMITTED .ino on every build, the sketch symlink forest, the global TFT_eSPI User_Setup.h mutation (now -D flags — TFT_eSPI's own documented PlatformIO recipe), the UF2 boot-mount detection stack (upload_protocol=picotool talks to the bootloader directly), and build-firmware-arch.sh entirely. Scripts 683 -> 435 lines. memllib is vendored at lib/memllib/ from upstream e291192; no submodules remain. VENDORED.md records provenance and the re-sync procedure. S9: a firmware-build CI job compiles three representative envs against a cached toolchain and reports per-variant flash/RAM. Firmware is in an automated gate for the FIRST time. The old ci.yml comment justified excluding it as "low verification value" — an assessment that did not survive contact, since the SelfTest variant sat broken for an unknown period calling a DisplayDriver method that did not exist at the pinned memllib commit, and nothing noticed because nothing built it. Verified: all 16 envs build from an empty cache, each within ~520 bytes of the arduino-cli binary it replaces, flash and RAM. Measured as .text+.rodata / .data+.bss+vector+uninitialized — NOT PlatformIO's console line, which double-counts .data on this board. This does not prove the hardware boots; no flash+smoke test was possible and that stays an operator chokepoint. slpworkshop 248232/145028 pafsynth 256880/149716 selftest 216228/17960 (all 16 in the CI log format; none exceeds 2% of a 16 MB flash) Two traps recorded so nobody rediscovers them: vendoring memllib's subdirs without a src/ wrapper makes PlatformIO's library builder silently compile NOTHING while still linking; and project build_flags land BEFORE the framework's own -std=gnu++17 -Os, so build_unflags is required. CORRECTION carried in this commit: the firmware sizes in c19d846's message and the first version of the memllib recon doc were wrong — SLPWorkshop 145348, PAFSynth 145300, SelfTest 141840. They came from building variants in sequence through a SHARED incremental arduino-cli build directory, which reused stale objects and under-reported by ~75 KB. Clean-cache rebuilds of the identical commit give 216736/18492 for SelfTest. The real cost of the memllib upstream bump is +216 bytes flash, not +316. Never measure firmware size through a reused build dir. HISTORY NOTE: this commit and the docs commit before it were rebuilt (force-push, 2026-07-21) so that each contains only what its message describes. The first versions had the firmware deletions stranded in the docs commit by a shared-index race between concurrent agents; content is byte-identical to the originals. Gates: run-all-tests.sh ALL GREEN (nisps/ untouched by this change beyond include paths); 16/16 pio envs build. --- .github/workflows/ci.yml | 71 +- .gitignore | 6 + .gitmodules | 10 - ALIGNMENT.md | 41 +- MAP.md | 19 +- docs/specs/plans/simplification-plan.md | 39 +- docs/specs/recon/memllib-usage-inventory.md | 34 +- firmware/MEMLNaut-NISPS/glue/audio_driver.hpp | 6 +- firmware/MEMLNaut-NISPS/glue/midi_io.hpp | 4 +- firmware/MEMLNaut-NISPS/glue/mode_select.hpp | 71 +- firmware/MEMLNaut-NISPS/glue/peripherals.hpp | 6 +- firmware/MEMLNaut-NISPS/glue/selftest.hpp | 21 +- .../MEMLNaut-NISPS/glue/settings_view.hpp | 6 +- firmware/MEMLNaut-NISPS/lib/memllib/LICENSE | 373 ++ .../MEMLNaut-NISPS/lib/memllib/VENDORED.md | 86 + .../lib/memllib/library.properties | 9 + .../lib/memllib/src/PicoDefs.hpp | 85 + .../lib/memllib/src/audio/AnalysisParams.cpp | 33 + .../lib/memllib/src/audio/AnalysisParams.hpp | 12 + .../lib/memllib/src/audio/AudioAppBase.hpp | 67 + .../lib/memllib/src/audio/AudioControl.h | 48 + .../lib/memllib/src/audio/AudioDriver.cpp | 298 ++ .../lib/memllib/src/audio/AudioDriver.hpp | 132 + .../lib/memllib/src/audio/FocusManager.hpp | 71 + .../memllib/src/audio/control_sgtl5000.cpp | 1104 +++++ .../lib/memllib/src/audio/control_sgtl5000.h | 145 + .../lib/memllib/src/audio/i2s_pio/i2s.cpp | 236 + .../lib/memllib/src/audio/i2s_pio/i2s.h | 82 + .../src/audio/i2s_pio/i2s_bidi_slave.pio.h | 73 + .../src/audio/i2s_pio/i2s_in_slave.pio.h | 65 + .../src/audio/i2s_pio/i2s_out_master.pio.h | 59 + .../memllib/src/audio/i2s_pio/i2s_pio_lib.h | 96 + .../memllib/src/audio/i2s_pio/i2s_sck.pio.h | 37 + .../lib/memllib/src/hardware/FlashFS.hpp | 23 + .../src/hardware/memlnaut/MEMLNaut.cpp | 359 ++ .../src/hardware/memlnaut/MEMLNaut.hpp | 173 + .../src/hardware/memlnaut/MEMLNautTest.cpp | 60 + .../src/hardware/memlnaut/MEMLNautTest.hpp | 8 + .../src/hardware/memlnaut/PSRAMManager.hpp | 66 + .../memllib/src/hardware/memlnaut/Pins.hpp | 157 + .../memlnaut/Setup9999_MEMLNaut.h.renameme | 187 + .../memllib/src/hardware/memlnaut/common.hpp | 6 + .../memllib/src/hardware/memlnaut/display.cpp | 4 + .../memllib/src/hardware/memlnaut/display.hpp | 94 + .../memlnaut/display/BarGraphView.hpp | 164 + .../memlnaut/display/BlockSelectView.hpp | 119 + .../hardware/memlnaut/display/ButtonView.hpp | 86 + .../memlnaut/display/CCSelectView.hpp | 407 ++ .../memlnaut/display/DisplayDriver.cpp | 219 + .../memlnaut/display/DisplayDriver.hpp | 124 + .../hardware/memlnaut/display/GraphView.hpp | 161 + .../hardware/memlnaut/display/MessageView.hpp | 63 + .../memlnaut/display/NameInputView.hpp | 118 + .../hardware/memlnaut/display/RLStatsView.hpp | 77 + .../src/hardware/memlnaut/display/RLView.hpp | 106 + .../memlnaut/display/RotarySelectView.hpp | 152 + .../memlnaut/display/SingleSelectView.hpp | 78 + .../hardware/memlnaut/display/SystemView.hpp | 66 + .../hardware/memlnaut/display/TextView.cpp | 79 + .../hardware/memlnaut/display/TextView.hpp | 34 + .../hardware/memlnaut/display/UIElements.cpp | 69 + .../hardware/memlnaut/display/UIElements.hpp | 214 + .../hardware/memlnaut/display/VUMeterView.hpp | 87 + .../src/hardware/memlnaut/display/View.cpp | 14 + .../src/hardware/memlnaut/display/View.hpp | 147 + .../memlnaut/display/VoiceSpaceSelectView.hpp | 92 + .../hardware/memlnaut/display/XYPadView.hpp | 82 + .../src/hardware/memlnaut/pinconfig.md | 61 + .../memllib/src/interface/InterfaceBase.cpp | 54 + .../memllib/src/interface/InterfaceBase.hpp | 61 + .../lib/memllib/src/interface/MIDIInOut.cpp | 847 ++++ .../lib/memllib/src/interface/MIDIInOut.hpp | 356 ++ .../lib/memllib/src/interface/SDCard.cpp | 92 + .../lib/memllib/src/interface/SDCard.hpp | 122 + .../memllib/src/interface/SerialUSBInput.cpp | 156 + .../memllib/src/interface/SerialUSBInput.hpp | 80 + .../memllib/src/interface/SerialUSBOutput.cpp | 47 + .../memllib/src/interface/SerialUSBOutput.hpp | 46 + .../src/interface/SynthParamOutput.hpp | 18 + .../lib/memllib/src/interface/UARTInput.cpp | 198 + .../lib/memllib/src/interface/UARTInput.hpp | 88 + .../lib/memllib/src/interface/UARTOutput.cpp | 47 + .../lib/memllib/src/interface/UARTOutput.hpp | 49 + .../lib/memllib/src/interface/USeqI2C.cpp | 105 + .../lib/memllib/src/interface/USeqI2C.hpp | 105 + .../lib/memllib/src/synth/ADSRLite.hpp | 6 + .../src/synth/DynamicSliceSelector.hpp | 466 ++ .../lib/memllib/src/synth/FMSynth.cpp | 182 + .../lib/memllib/src/synth/FMSynth.hpp | 143 + .../lib/memllib/src/synth/GrainDelayI16.hpp | 346 ++ .../lib/memllib/src/synth/ModFXI16.hpp | 179 + .../lib/memllib/src/synth/OnePoleSmoother.hpp | 47 + .../lib/memllib/src/synth/PlayLoop.hpp | 124 + .../lib/memllib/src/synth/ReverbI16.hpp | 324 ++ .../lib/memllib/src/synth/SaxAnalysis.cpp | 149 + .../lib/memllib/src/synth/SaxAnalysis.hpp | 59 + .../lib/memllib/src/synth/maxiPAF.hpp | 309 ++ .../lib/memllib/src/synth/maximilian.cpp | 1113 +++++ .../lib/memllib/src/synth/maximilian.h | 3888 +++++++++++++++++ .../lib/memllib/src/synth/sineTable.cpp | 5 + .../lib/memllib/src/synth/sineTable.h | 15 + .../lib/memllib/src/synth/voiceSpace.hpp | 18 + .../lib/memllib/src/utils/CircularBuffer.hpp | 50 + .../lib/memllib/src/utils/Debounce.hpp | 66 + .../lib/memllib/src/utils/Format.hpp | 171 + .../lib/memllib/src/utils/Maths.cpp | 427 ++ .../lib/memllib/src/utils/Maths.hpp | 180 + .../lib/memllib/src/utils/MedianFilter.h | 72 + .../lib/memllib/src/utils/PrintVector.hpp | 66 + .../lib/memllib/src/utils/SLIP.hpp | 179 + .../lib/memllib/src/utils/perf.hpp | 144 + .../lib/memllib/src/utils/sharedMem.cpp | 11 + .../lib/memllib/src/utils/sharedMem.hpp | 72 + firmware/MEMLNaut-NISPS/platformio.ini | 160 + .../{MEMLNaut-NISPS.ino => src/main.cpp} | 65 +- .../MEMLNaut-NISPS/src/memllib/PicoDefs.hpp | 1 - firmware/MEMLNaut-NISPS/src/memllib/audio | 1 - firmware/MEMLNaut-NISPS/src/memllib/hardware | 1 - firmware/MEMLNaut-NISPS/src/memllib/interface | 1 - firmware/MEMLNaut-NISPS/src/memllib/synth | 1 - firmware/MEMLNaut-NISPS/src/memllib/utils | 1 - firmware/MEMLNaut-NISPS/src/nisps/core | 1 - firmware/MEMLNaut-NISPS/src/nisps/dsp | 1 - firmware/MEMLNaut-NISPS/src/nisps/engines | 1 - firmware/MEMLNaut-NISPS/src/nisps/midi | 1 - firmware/MEMLNaut-NISPS/src/nisps/ml | 1 - firmware/MEMLNaut-NISPS/src/nisps/modes | 1 - firmware/README.md | 64 +- scripts/build-and-flash-firmware.sh | 29 +- scripts/build-firmware-arch.sh | 91 - scripts/build-firmware.sh | 88 +- scripts/firmware-common.sh | 283 +- scripts/flash-firmware.sh | 93 +- scripts/setup-firmware-toolchain.sh | 125 +- src/memllib | 1 - 135 files changed, 18955 insertions(+), 739 deletions(-) delete mode 100644 .gitmodules create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/LICENSE create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/VENDORED.md create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/library.properties create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/PicoDefs.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AnalysisParams.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AnalysisParams.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AudioAppBase.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AudioControl.h create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AudioDriver.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AudioDriver.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/audio/FocusManager.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/audio/control_sgtl5000.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/audio/control_sgtl5000.h create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s.h create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s_bidi_slave.pio.h create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s_in_slave.pio.h create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s_out_master.pio.h create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s_pio_lib.h create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s_sck.pio.h create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/FlashFS.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/MEMLNaut.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/MEMLNaut.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/MEMLNautTest.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/MEMLNautTest.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/PSRAMManager.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/Pins.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/Setup9999_MEMLNaut.h.renameme create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/common.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/BarGraphView.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/BlockSelectView.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/ButtonView.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/CCSelectView.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/DisplayDriver.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/DisplayDriver.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/GraphView.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/MessageView.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/NameInputView.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/RLStatsView.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/RLView.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/RotarySelectView.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/SingleSelectView.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/SystemView.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/TextView.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/TextView.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/UIElements.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/UIElements.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/VUMeterView.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/View.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/View.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/VoiceSpaceSelectView.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/XYPadView.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/pinconfig.md create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/interface/InterfaceBase.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/interface/InterfaceBase.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/interface/MIDIInOut.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/interface/MIDIInOut.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SDCard.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SDCard.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SerialUSBInput.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SerialUSBInput.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SerialUSBOutput.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SerialUSBOutput.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SynthParamOutput.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/interface/UARTInput.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/interface/UARTInput.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/interface/UARTOutput.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/interface/UARTOutput.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/interface/USeqI2C.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/interface/USeqI2C.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/synth/ADSRLite.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/synth/DynamicSliceSelector.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/synth/FMSynth.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/synth/FMSynth.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/synth/GrainDelayI16.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/synth/ModFXI16.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/synth/OnePoleSmoother.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/synth/PlayLoop.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/synth/ReverbI16.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/synth/SaxAnalysis.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/synth/SaxAnalysis.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/synth/maxiPAF.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/synth/maximilian.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/synth/maximilian.h create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/synth/sineTable.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/synth/sineTable.h create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/synth/voiceSpace.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/utils/CircularBuffer.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/utils/Debounce.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/utils/Format.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/utils/Maths.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/utils/Maths.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/utils/MedianFilter.h create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/utils/PrintVector.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/utils/SLIP.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/utils/perf.hpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/utils/sharedMem.cpp create mode 100644 firmware/MEMLNaut-NISPS/lib/memllib/src/utils/sharedMem.hpp create mode 100644 firmware/MEMLNaut-NISPS/platformio.ini rename firmware/MEMLNaut-NISPS/{MEMLNaut-NISPS.ino => src/main.cpp} (77%) delete mode 120000 firmware/MEMLNaut-NISPS/src/memllib/PicoDefs.hpp delete mode 120000 firmware/MEMLNaut-NISPS/src/memllib/audio delete mode 120000 firmware/MEMLNaut-NISPS/src/memllib/hardware delete mode 120000 firmware/MEMLNaut-NISPS/src/memllib/interface delete mode 120000 firmware/MEMLNaut-NISPS/src/memllib/synth delete mode 120000 firmware/MEMLNaut-NISPS/src/memllib/utils delete mode 120000 firmware/MEMLNaut-NISPS/src/nisps/core delete mode 120000 firmware/MEMLNaut-NISPS/src/nisps/dsp delete mode 120000 firmware/MEMLNaut-NISPS/src/nisps/engines delete mode 120000 firmware/MEMLNaut-NISPS/src/nisps/midi delete mode 120000 firmware/MEMLNaut-NISPS/src/nisps/ml delete mode 120000 firmware/MEMLNaut-NISPS/src/nisps/modes delete mode 100755 scripts/build-firmware-arch.sh delete mode 160000 src/memllib diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 534e3f3..c41d566 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,17 +2,23 @@ name: CI # Stream 11 verification pipeline. # -# Two parallel jobs: +# Three parallel jobs: # * cpp-tests — builds nisps host C++ tests, builds nisps.wasm, runs # the parity check, runs the lint script. # * manifold-tests — typechecks the React manifold app, runs bun unit # tests, builds the production bundle, runs Playwright # e2e tests. # -# Firmware compilation is NOT included in this workflow. Arduino-cli + -# rp2040 board package add ~2 minutes per run, and the verification value -# is low compared to the time cost; firmware build is documented as a -# manual `scripts/build-firmware.sh` step in README.md / CLAUDE.md. +# * firmware-build — compiles three representative PlatformIO envs for the +# RP2350 target. +# +# Firmware entered CI for the first time with the Phase 4 PlatformIO migration +# (plan §5, S9). It was previously excluded because arduino-cli + the rp2040 +# board package cost ~2 minutes per run for "low verification value" — an +# assessment that did not survive contact: the SelfTest variant sat broken for +# an unknown period, calling a DisplayDriver method that did not exist at the +# pinned memllib commit, and nothing noticed because nothing built it. PIO's +# toolchain caches cleanly, so the cost is now a cache restore. on: push: @@ -28,8 +34,6 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - with: - submodules: recursive - name: Install build deps run: | @@ -155,3 +159,56 @@ jobs: name: playwright-report path: manifold/playwright-report/ retention-days: 7 + + firmware-build: + name: Firmware (RP2350, PlatformIO) + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + + # The platform wrapper and the arduino-pico framework are fetched from + # git and total ~1-2 GB. Key on platformio.ini because that file pins + # both versions — change a pin, get a fresh toolchain. + - name: Cache PlatformIO toolchain + uses: actions/cache@v4 + with: + path: | + ~/.platformio + ~/.cache/pip + key: pio-${{ runner.os }}-${{ hashFiles('firmware/MEMLNaut-NISPS/platformio.ini') }} + restore-keys: pio-${{ runner.os }}- + + - name: Install PlatformIO + run: pip install --upgrade platformio + + # Three representative envs rather than all sixteen: they differ only in + # which mode type is instantiated, so a compile break is almost always + # common to all. slpworkshop is the shipped default, pafsynth is the + # heaviest RAM user, and selftest takes the separate NISPS_SELFTEST fork + # through main.cpp — the one that broke unnoticed before. + - name: Build representative firmware variants + working-directory: firmware/MEMLNaut-NISPS + run: pio run -e slpworkshop -e pafsynth -e selftest + + # Sizes are reported, not asserted. A threshold would either be slack + # enough to be meaningless or tight enough to fail on unrelated work; + # this puts the numbers in the log so a jump is visible in review. + # Flash = .text + .rodata, RAM = .data + .bss + vector table + + # uninitialized — matching arduino-cli's convention, NOT PlatformIO's + # own console line, which double-counts .data on this board. + - name: Report flash/RAM per variant + working-directory: firmware/MEMLNaut-NISPS + run: | + SIZE=$(find ~/.platformio/packages -name 'arm-none-eabi-size' | head -1) + for e in slpworkshop pafsynth selftest; do + "$SIZE" -A ".pio/build/$e/firmware.elf" | awk -v e="$e" ' + /^\.text/{t=$2} /^\.rodata/{r=$2} /^\.data/{d=$2} + /^\.bss/{b=$2} /^\.ram_vector_table/{v=$2} + /^\.uninitialized_data/{u=$2} + END{printf "%-14s flash=%-8d ram=%-8d\n", e, t+r, d+b+v+u}' + done diff --git a/.gitignore b/.gitignore index 7e410c1..00b8d81 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,12 @@ .ai build +# PlatformIO build artifacts (firmware/MEMLNaut-NISPS) — bootstrapped platform, +# toolchain, and libraries live outside the repo in ~/.platformio; only +# .pio/build (per-env objects/elf/uf2) and .pio/libdeps (fetched lib_deps) +# land here, both disposable. +.pio + # OSC bridge compiled binaries (built via compile.sh or CI) manifold/osc-bridge/dist/ manifold/osc-bridge/node_modules/ diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 9b9c110..0000000 --- a/.gitmodules +++ /dev/null @@ -1,10 +0,0 @@ -[submodule "src/memllib"] - path = src/memllib - # Upstream (the lab's shared library), not the monkey-w1n5t0n fork. - # Phase 0 pointed this at the fork because the pin b37fc53 existed on no - # remote. Those three fork commits touch only `examples/`, which the - # firmware never compiles (it is not in the sketch symlink forest) and whose - # content is already ported into nisps/ml/{jolt,ou_noise,feedback,geo_push}. - # With the pin moved to an upstream commit, upstream is the correct source. - # The fork's feat/nisps-core-swap branch is still pushed; nothing is lost. - url = https://github.com/MusicallyEmbodiedML/memllib.git diff --git a/ALIGNMENT.md b/ALIGNMENT.md index 3aa8685..b72ad28 100644 --- a/ALIGNMENT.md +++ b/ALIGNMENT.md @@ -28,15 +28,7 @@ The clean-slate rewrite (2026-04-29) consolidated everything into one C++20 code **Rough cost.** Product-model decision first (plan §7.6), then incremental: picker is days; the curated-preset model seeds from `backends/presets.ts` + schemas; disclosure via per-drawer depth levels. Deleting the decorative stratum is part of the Phase-1 sweep. -### 3. Arduino-CLI build machinery is actively hostile — vision 4 unstarted (2026-07-21) - -**What.** The build script sed-mutates the committed `.ino` to select variants (polluting history), the mode list is triple-bookkept (a `NISPS_ST_*` token-paste table is already silently missing the currently-active SLPWorkshop variant), a symlink forest works around Arduino's include rules, and the toolchain globally mutates the installed TFT_eSPI library. Firmware compilation is in no automated gate anywhere. - -**Why it blocks the mission.** Fragile-by-design builds are the opposite of "confident agentic changes"; the vision names PlatformIO explicitly. `firmware/useq-celium/` already proves the PIO pattern in-repo. - -**Rough cost.** 2–3 days, one cut (plan §5): env-per-variant `platformio.ini`, delete ~400 lines of hackery, then a firmware CI job. Gated on the memllib ownership decision (plan §7.5). - -### 4. Manifold-as-hardware-editor is a facade (2026-07-21) +### 3. Manifold-as-hardware-editor is a facade (2026-07-21) **What.** Vision bullet 5 exists as a 237-line Web Serial shell: sound connect lifecycle, zero protocol (`saveModel`/`restoreModel`/`getSettings` are literal stubs), and firmware has no serial command surface or on-device persistence to talk to. @@ -44,7 +36,7 @@ The clean-slate rewrite (2026-04-29) consolidated everything into one C++20 code **Rough cost.** Week+, spec-first (plan §6.5d). The right discipline already exists in-repo: useq-celium's C-header wire truth + TS mirror + parity test; settings payloads should derive from schema codegen. -### 5. Dead mass and registry sprawl across every layer (2026-07-21) +### 4. Dead mass and registry sprawl across every layer (2026-07-21) **What.** *Phase 1 landed 2026-07-21 and removed the bulk of this:* the dead focus/altitude UI system, the decorative control stratum, 12 dead WASM API entries across the 5-file registration chain, the vendored daisysp tree, retired-playground artifacts and root planning relics, 5 unused primitives, the duplicate backend editor and catalogue, `voice_space.hpp`, `fixed_buffer.hpp`, the dead perf-macro regime, and the OSC bridge twin. What remains is the *registry* half: mode identity spread across ~6 hand-maintained registries with demonstrated drift, MLP dims typed twice, per-mode schema blocks hand-written in C++, and assorted stale specs presenting a deleted world as present tense. @@ -52,13 +44,13 @@ The clean-slate rewrite (2026-04-29) consolidated everything into one C++20 code **Rough cost.** Plan phase 3 (~2–3 days, codegen takes ownership) plus the docs disposition pass (§8). The behaviour bugs found en route (dataset-cap divergence, VCV 2-D input truncation, VCV audio-thread race and JSON) were fixed in phase 2 on 2026-07-21. -### 6. No performance measurement despite a performance-defined mission (2026-07-21) +### 5. No performance measurement despite a performance-defined mission (2026-07-21) -**What.** The "super performance-sensitive" constraint is enforced only by static discipline (no-heap lint — itself with proven false negatives — and section attrs, 3/5 of which are dead macros). No benchmark, no CPU-load assertion, no flash/RAM size report on either target; the 16 KB dead buffer was found by reading, not by any gate. +**What.** The "super performance-sensitive" constraint is enforced only by static discipline (the no-heap lint — false negatives closed in Phase 2 — and section attrs). *Half-closed 2026-07-21:* the Phase 4 firmware CI job now reports per-variant flash/RAM on every push, so size regressions are at least visible. **Still missing: any measure of time.** No benchmark, no CPU-load assertion, no blocks-per-second number on either target — nothing would catch an engine getting 3x slower. -**Rough cost.** ~A day for a host-side blocks-per-second benchmark + a per-variant size report in `build-firmware.sh` (plan §6.5f). +**Rough cost.** ~Half a day now: a host-side blocks-per-second benchmark for `engine_process_block`, native + WASM (plan §6.5f). -### 7. Training-health telemetry: decided, not yet built (2026-07-21) +### 6. Training-health telemetry: decided, not yet built (2026-07-21) **What.** Four fragments of one feature. Fragment 3 (decorative gradient-health UI) was deleted in Phase 1. The other three stand: a 16 KB loss-history buffer in every firmware MLP that nothing @@ -68,7 +60,7 @@ reads (`nisps/ml/mlp.hpp`); a WASM worker faking a **1-element** loss history **Decisions are now complete** (operator, §7.3 + L25): telemetry becomes **real, browser-only, behind a feature flag**; the fakes go; and the **firmware buffer stays** — it is the on-device -record the hardware editor (defect 4) will want, and it costs flash we demonstrably have (16% RAM +record the hardware editor (defect 3) will want, and it costs flash we demonstrably have (16% RAM on the largest variant). So the remaining work is one coherent job, not a judgement call: plumb `loss_history` through the C API (`Drawers.tsx:263` already marks the gap), replace the worker's fake with it, and put the display plus `get_layer_stats` behind the advanced-mode flag. @@ -78,7 +70,7 @@ it *looks* answered while being fabricated — worse than absent. **Rough cost.** ~A day, spec-light: plan §6.5e, no longer gated on anything. -### 8. RMSProp still deferred from `nisps/ml/` (2026-04-29; reaffirmed 2026-07-21) +### 7. RMSProp still deferred from `nisps/ml/` (2026-04-29; reaffirmed 2026-07-21) **What.** `training.hpp` ships SGD only; the legacy firmware used RMSProp for `TrainBatch`. Optimizer choice is a research axis. Not blocking current fits; will matter for harder loss landscapes. Port target: upstream MusicallyEmbodiedML `memlp` (the in-repo `src/memlp` copy is deleted; use the GitHub remote or archive branch). @@ -105,10 +97,10 @@ Operator decision: **vendor**, self-contained in this repo. The inventory subset — it is all of memllib bar `examples/` (~1.8 MB, 24/24 compiled TUs link). The fork is dissolved: its three commits touch only `examples/`, which the firmware never compiles and whose content already lives in `nisps/ml/{jolt,ou_noise,feedback,geo_push}.hpp`, so the submodule now -points at upstream and is pinned to current `main` (verified: all three variants build, +316 bytes -flash, and it brings the `l r input swap` hardware fix plus the `NavigateToView` the SelfTest -variant was already written against). **Remaining: the vendoring copy itself**, which lands with the -PlatformIO cut (plan §5). Delete this entry when it does. +points at upstream and is pinned to current `main`. Verified by building: it brings the +`l r input swap` hardware fix plus the `NavigateToView` the SelfTest variant was already written +against, and costs **+216 bytes of a 16 MB flash**. **Remaining: the vendoring copy itself**, which +lands with the PlatformIO cut (plan §5). Delete this entry when it does. ### Q5: Legacy feedback modes — delete or keep for A/B? (2026-07-21) @@ -124,6 +116,13 @@ PlatformIO cut (plan §5). Delete this entry when it does. ## Recently resolved (delete after a few weeks) -- 2026-07-21: Full-repo simplification audit landed (recon + plan + this rewrite). Superseded entries removed: "browser-only engines incomplete" (→ defect 2/plan 5b), "loss curve not plumbed" (→ defect 8), "NISPS_AUDIO_FUNC misshapen" (→ plan Phase 1, S21/L13), stale "VCV not currently maintained" note (vcv/ is active and consumes `nisps/` directly post-P6). +- 2026-07-21: **Arduino-CLI build machinery (old defect 3) is gone.** Phase 4 replaced it with a + PlatformIO project: one `[env:]` per variant is now the only variant registry, the `.ino`-mutating + Python/sed machinery and the `NISPS_ST_*` token-paste table and the sketch symlink forest and the + global TFT_eSPI mutation are all deleted, memllib is vendored (no submodule), and firmware finally + entered CI — three representative envs per run, which is what would have caught the SelfTest + variant sitting broken. All 16 envs build; sizes match arduino-cli within ~520 bytes. + +- 2026-07-21: Full-repo simplification audit landed (recon + plan + this rewrite). Superseded entries removed: "browser-only engines incomplete" (→ defect 2/plan 5b), "loss curve not plumbed" (→ defect 7), "NISPS_AUDIO_FUNC misshapen" (→ plan Phase 1, S21/L13), stale "VCV not currently maintained" note (vcv/ is active and consumes `nisps/` directly post-P6). - 2026-07-18: Browser curve maths unified onto the canonical `nisps/core/math.hpp` catalog at P4; four silently-divergent TS curves re-baselined. - 2026-07-14: WASM MLP fixed-architecture defect resolved by P2 (`MLPCore`; browser runtime-shaped, firmware zero-heap fixed). diff --git a/MAP.md b/MAP.md index a850405..b5581eb 100644 --- a/MAP.md +++ b/MAP.md @@ -15,17 +15,18 @@ MEMLNaut-NISPS — Neural Interactive Shaping of Parameter Spaces. One C++20 cod - `nisps/midi/generated/midi_devices.hpp` — codegen output: no-heap `constexpr` external-MIDI-synth templates (`nisps::midi::generated`; `MidiParam`/`MidiDevice` + `kMidiDevices` registry). Source = `schemas/midi_devices/`; do not edit by hand. - `nisps/CMakeLists.txt` + `nisps/build/` — host-target builds + ctest. -### `firmware/` — Arduino sketch + hardware glue -- `firmware/MEMLNaut-NISPS/MEMLNaut-NISPS.ino` — entry point. Selects active mode at compile time via `#define MEMLNAUT_MODE_TYPE`. Forks on `NISPS_SELFTEST`: normal modes run the engine/ML path; the `SelfTest` variant delegates all four entry points to `glue/selftest.hpp`. +### `firmware/` — PlatformIO project + hardware glue +- `firmware/MEMLNaut-NISPS/platformio.ini` — **the variant registry**: one `[env:]` per firmware variant (16 of them), each passing `-DMEMLNAUT_MODE_TYPE=`; `selftest` passes `-DNISPS_SELFTEST=1` instead. There is no second list to keep in sync. Shared `[env]` base pins the platform wrapper + arduino-pico framework, sets `-std=gnu++20 -O3` (via `build_unflags`, because the framework appends its own `-std=gnu++17 -Os` AFTER project flags), reaches `nisps/` with `-I${PROJECT_DIR}/../..`, and carries the TFT_eSPI panel config as `-D` flags. Build: `pio run -e `, or `scripts/build-firmware.sh [--all]`. +- `firmware/MEMLNaut-NISPS/src/main.cpp` — entry point (was `MEMLNaut-NISPS.ino`). Forks on `NISPS_SELFTEST`: normal modes run the engine/ML path; the `SelfTest` variant delegates all four entry points to `glue/selftest.hpp`. - `firmware/MEMLNaut-NISPS/glue/` — hardware bindings: - `audio_driver.hpp` — bridges memllib `AudioDriver` callback → `Mode::process(stereosample_t)`. - `peripherals.hpp` — joystick / pots / buttons → `Mode::set_input` and ML primitives. Wires the shared `FeedbackController` ExploreAndPlace lifecycle (MomA1 = enter/exit explore, MomA2 = freeze/place, TogB2 = commit; MomB1/MomB2 = reroll/nudge while exploring **or** grab/drop *reposition* while idle) plus the adaptive-learning gestures: **TogB1** = Jolt (held weight morph), **RVX1** = exploration amount (OU output walk). Reposition relocates an existing positive example's output to a new input position (`feedback.hpp` `begin_reposition`/`commit_reposition`) — no scratchpad, no weight restore. - `midi_io.hpp` — MIDI in → mode `note_on`/`update_bpm`/`set_playing`; drains `ControlEvent` ring → MIDI UART. - - `mode_select.hpp` — type aliases mapping firmware mode identifiers to `nisps::modes::*Mode` C++ types. Build script rewrites the active line. Includes the six `MEMLNautModeExtSynth*` external-synth variants (one per device template in `nisps/midi`, e.g. `MEMLNautModeExtSynthSub37`). Also defines the `MEMLNautModeSelfTest` pseudo-variant (tag type) + the `NISPS_ST_*`/`NISPS_ST_CAT` token-paste macros the `.ino` uses to compute `NISPS_SELFTEST`. Note: `src/nisps/` exposes each referenced top-level nisps subdir as a symlink — `midi` was added alongside `core/dsp/engines/ml/modes`. + - `mode_select.hpp` — type aliases mapping firmware mode identifiers to `nisps::modes::*Mode` C++ types, selected by the `-D` from platformio.ini. Includes the six `MEMLNautModeExtSynth*` external-synth variants (one per device template in `nisps/midi`, e.g. `MEMLNautModeExtSynthSub37`). The `NISPS_ST_*`/`NISPS_ST_CAT` token-paste table and the `SelfTestRig` tag type are GONE — selftest is now just an env with its own `-D`. - `selftest.hpp` — standalone guided hardware self-test rig (`SelfTest` variant; no engine/ML). Step-driven state machine on a `SelfTestView`: TFT prompts the operator through every control, auto-advances on detection, encoder-press skips. Ends with optional L/R/BOTH sine-sweep headphone check (core 1 block callback) + MIDI loopback-cable test. Lives firmware-side (touches TFT + raw pins) so it stays out of platform-agnostic `nisps/`. - `output_router.hpp` — top-level `drain_outputs()` entry point. (Inputs are wired directly by `peripherals.hpp`'s `bind_peripherals()`.) - `settings_view.hpp` — `wire_settings(mode)`: adds on-device settings views to the MEMLNaut display carousel (TFT + rotary encoder). Joystick Dual/Single toggle for the 4-input ("two 2-D joystick") modes — "Single" pins ML input channels 2,3 to neutral via `ModeBase::set_input_pinned` (no net rebuild). Registered in the `.ino` after `addSystemInfoView()`. -- `firmware/MEMLNaut-NISPS/src/{memllib,nisps}` — symlinks (Arduino-CLI requires sketch-tree includes; preprocessor refuses `..` in headers). +- `firmware/MEMLNaut-NISPS/lib/memllib/` — **vendored** memllib (was the `src/memllib` submodule): hardware abstraction (audio driver, TFT display, MIDI, peripherals), ~1.9 MB / 100 files, `examples/` dropped. `VENDORED.md` records the upstream commit and the re-sync procedure; `LICENSE` is MPL-2.0, copied verbatim. **Sources must sit under `lib/memllib/src/`** — PlatformIO's library builder falls back to a flat root-only scan without it and silently compiles nothing while still linking (see VENDORED.md). - `firmware/README.md` — structure + build instructions. - `firmware/useq-celium/` — standalone RP2040 firmware (PlatformIO, Arduino-Pico core) that turns a uSEQ module + CV expander into a USB→CV/gate converter driven by the manifold `cvgate` backend. `shared/protocol.h` is the v2 wire-protocol single source of truth (mirrored by `manifold/src/backends/useq-protocol.ts`); `main/` (USB serial → CV1–3 + GATE1–3, I2C → expander) and `expander/` (I2C slave → CV4–11). Wire spec: `docs/specs/useq-cv-protocol.md`. Restored from the April-2026 "uSEQ-Celium" mode. @@ -127,7 +128,7 @@ includes; no `nisps-core`. - `ci.yml` — GitHub Actions: cmake build + ctest + WASM build + parity check + lint + Playwright (cpp-tests + manifold-tests jobs). Firmware compile is documented as manual. ### `src/` — submodule + vendored trees -- `src/memllib/` — hardware abstraction (audio driver, peripherals, MIDI), the only true submodule. **Not auto-initialized** — fresh clones need `git submodule update --init --recursive`. Pinned to `monkey-w1n5t0n/memllib` branch `feat/nisps-core-swap` (the operator's fork; upstream is `MusicallyEmbodiedML/memllib`). Ownership decision — vendor the load-bearing subset into this repo — lands with the PlatformIO migration (plan §5, §7.5). +- **There are no submodules.** `src/memllib` was one until the Phase 4 PlatformIO migration; it is now vendored at `firmware/MEMLNaut-NISPS/lib/memllib/`. Fresh clones need no `git submodule` step. ### Top-level docs - `CLAUDE.md` — long-form architecture narrative. @@ -150,7 +151,7 @@ includes; no `nisps-core`. ## Conventions -- Firmware mode selection is compile-time only — `#define MEMLNAUT_MODE_TYPE` in the `.ino`. +- Firmware mode selection is compile-time only — one `-DMEMLNAUT_MODE_TYPE` per `[env:]` in `platformio.ini`. - `nisps/` follows Chris's RP2350 perf rules: no heap, `static const float` for non-trivial constants, strict `.f` suffix. `perf.hpp` now carries only `NISPS_HOT`/`NISPS_FORCE_INLINE`; the three dead/misshapen SRAM-section macros were deleted in the 2026-07 sweep (S21/L13). - C++ identifiers: `PascalCase` types, `snake_case` functions/variables, `kPascalCase` constexpr. JSON keys `snake_case`. TS types `PascalCase`, components `PascalCase.tsx`, modules `kebab-case.ts`. - `Curve` enum lives in `nisps/core/math.hpp` (lowercase: `linear/exp/log/square/sqrt/sigmoid/cubic`, plus the parameterised `centered_power` free function); generated mode headers re-export via `using Curve = ::nisps::Curve;`. Since P4 there is NO TS mirror — the browser samples the WASM catalog (`nisps_curve_apply(+batch)`). @@ -160,10 +161,10 @@ includes; no `nisps-core`. ## Gotchas -- `src/memllib` submodule is not auto-checked-out. -- Firmware sketch path is `firmware/MEMLNaut-NISPS/MEMLNaut-NISPS.ino` (Arduino-CLI requires sketch dir name == sketch file name); `firmware/MEMLNaut-NISPS/src/{memllib,nisps}` are symlinks because Arduino's preprocessor refuses `..` in includes from sketch headers. +- Firmware needs PlatformIO: `nix-shell -p platformio-core`. Use `platformio-core`, NOT `platformio` — the latter is nixpkgs' bubblewrap-wrapped FHS build and fails without a working user namespace. First build pulls ~1-2 GB into `~/.platformio`. - `firmware/MEMLNaut-NISPS/glue/mode_select.hpp` `#undef`s Arduino macros (`sq`, `min`, `max`, `abs`, `round`) before pulling nisps headers — engines use those identifiers as method names. -- `nisps_firmware::g_active_mode_bridge` is `extern` in `glue/audio_driver.hpp` and defined in the `.ino`; combining `inline` with `__not_in_flash` produces a comdat conflict at link time. +- `nisps_firmware::g_active_mode_bridge` is `extern` in `glue/audio_driver.hpp` and defined in `src/main.cpp`; combining `inline` with `__not_in_flash` produces a comdat conflict at link time. +- `pio run`'s own "Flash: NN%" console line double-counts `.data` on this board (PlatformIO's generic size checker counts every PROGBITS+ALLOC section). Compare `arm-none-eabi-size -A` — flash = `.text+.rodata` — before believing a size regression. - `nisps_modes_tests` builds against generated schemas under `nisps/modes/generated/`; if you add a new mode, regenerate via `bun run codegen/generate.ts` before building. ## Smells / strategic concerns diff --git a/docs/specs/plans/simplification-plan.md b/docs/specs/plans/simplification-plan.md index ae24e2e..acb8f2b 100644 --- a/docs/specs/plans/simplification-plan.md +++ b/docs/specs/plans/simplification-plan.md @@ -95,23 +95,32 @@ DESCRIPTIVE — it documents that engine voice spaces already square the value i - **S26** Schema surface honesty: per-field wire-or-delete pass (default_learning_rate/max_iterations both-platforms-or-neither; input_channels; per-param curves) per the verifier's corrected list. - **L38** one TS `applyCurve` (mapping.ts's spec-anchored formula survives); **ST4** one GROUP_COLOR source; **L8** extract shared `ratio_seq`/SeqClock/EventQueue for the sequencer engines; **L17** BaseBackend mirroring BaseSource for status/throttle plumbing; **ST12** shared codegen `lib.ts`; **L39** delete the clobbering seed script (git keeps it); **ST13** move `synth-midi-cc.json` under `schemas/midi_devices/`. -## §5 Phase 4 — PlatformIO migration (vision 4) (~2–3 days) — A6, S2, L12, S9 +## §5 Phase 4 — PlatformIO migration (vision 4) — A6, S2, L12, S9 -One cut, no dual path. `firmware/useq-celium/` already proves the PIO + arduino-pico pattern in-repo. +**BURNED DOWN 2026-07-21.** One cut, no dual path, as specified. -- `platformio.ini` with one `[env]` per firmware variant passing `-DMEMLNAUT_MODE_TYPE=`; selftest becomes a plain `-DNISPS_SELFTEST=1` env. Deletes: the sed/python machinery in `firmware-common.sh` that **mutates the committed .ino**, the `.ino` comment-registry, the entire `NISPS_ST_*` token-paste table (already silently missing the currently-active SLPWorkshop variant — L12), the sketch-tree symlink forest, and the global TFT_eSPI library mutation (handled via PIO lib config/build flags instead). -- **memllib consumption decision** (§7.5): **SETTLED — the submodule bump landed; the vendoring copy - is what remains.** See `../recon/memllib-usage-inventory.md`. Result: all 24 compiled TUs link, so - the vendoring surface is ~1.8 MB / 84 files — all of memllib bar `examples/`; there is no small - subset to lift. The operator chose "rebase then vendor", but on inspection **there was no rebase to - do**: all three fork commits touch only `examples/`, which is not in the sketch symlink forest and - is never compiled, and whose content is already ported into `nisps/ml/`. So the fork is dissolved - and the submodule is repointed at upstream, pinned to current `main` — verified by building all - three variants (+316 bytes flash, one `constexpr`→`const` fix in the `.ino` because upstream made - `kSampleRate` runtime-settable). That bump brings the `l r input swap` hardware fix and the - `NavigateToView` the SelfTest variant had already been written against. **Vendor from this - snapshot**, recording the upstream commit so a re-sync stays a documented diff. -- Then **S9**: a CI job compiling 2–3 representative envs with cached toolchain — firmware enters an automated gate for the first time. +- `firmware/MEMLNaut-NISPS/platformio.ini`: 16 `[env:]`, one per variant, each passing + `-DMEMLNAUT_MODE_TYPE`; `selftest` passes `-DNISPS_SELFTEST=1`. **The env list IS the registry** — + the `.ino` comment-registry and the `NISPS_ST_*` token-paste table (L12, already silently missing + the shipped variant) are gone, not migrated. +- Deleted: the Python/sed `.ino`-mutation machinery, the sketch symlink forest, the global TFT_eSPI + `User_Setup.h` mutation (now `-D` flags, TFT_eSPI's own documented recipe), the UF2 boot-mount + detection stack (`upload_protocol = picotool` talks to the bootloader directly), and + `build-firmware-arch.sh` entirely. Scripts 683 → 435 lines. +- memllib **vendored** at `lib/memllib/` from upstream `e291192`; the submodule is gone. Provenance + and re-sync procedure in `VENDORED.md`. +- **S9 done**: a `firmware-build` CI job compiles three representative envs with a cached toolchain + and reports per-variant flash/RAM. Firmware is in an automated gate for the first time. + +Verified: **all 16 envs build from an empty cache**, and every one lands within ~520 bytes of the +arduino-cli binary it replaces (flash and RAM), measured as `.text+.rodata` / `.data+.bss+…` rather +than PlatformIO's console line, which double-counts `.data` on this board. What this does NOT prove +is that the hardware boots — no flash+smoke test was possible. That remains an operator chokepoint. + +Two traps worth remembering, both recorded in `VENDORED.md` / `platformio.ini`: vendoring memllib's +subdirs without a `src/` wrapper makes PlatformIO's library builder silently compile **nothing** +while still linking; and project `build_flags` land *before* the framework's own `-std=gnu++17 -Os`, +so `build_unflags` is required — appending our own flags is not enough. ## §6 Phase 5 — Vision-facing architecture (each item spec-first, own session) diff --git a/docs/specs/recon/memllib-usage-inventory.md b/docs/specs/recon/memllib-usage-inventory.md index 3fdc2b3..880ec64 100644 --- a/docs/specs/recon/memllib-usage-inventory.md +++ b/docs/specs/recon/memllib-usage-inventory.md @@ -83,22 +83,36 @@ lowest level. Every mode on the pinned commit sees its stereo input backwards. ## Verified: current upstream builds, and costs almost nothing -Submodule moved to `e291192` (upstream `main`), all three variants built with `arduino-cli`: +Submodule moved to `e291192` (upstream `main`). -| variant | flash | Δ vs pin | RAM | Δ | -|---|---|---|---|---| -| SLPWorkshop | 145348 | +320 | 87388 | +4 | -| PAFSynth | 145300 | +312 | 107060 | +4 | -| SelfTest | 141840 | +320 | 12028 | +4 | +**CORRECTION (2026-07-21, same day).** The first version of this table, and the numbers in commit +`c19d846`'s message, were WRONG — SLPWorkshop 145348, PAFSynth 145300, SelfTest 141840, with a +"+316 uniform delta". They were produced by building three variants in a row through a **shared +incremental `arduino-cli` build directory** (`/tmp/memlnaut-firmware-build`), which reused stale +objects and under-reported by roughly 75 KB. The error surfaced when the PlatformIO migration could +not reproduce them; a clean-cache rebuild of the identical commit in a throwaway worktree confirmed +it. **Never measure firmware size through a reused build directory.** + +Measured properly (clean build dir per measurement, SelfTest variant): + +| memllib pin | flash | RAM | +|---|---|---| +| `b37fc53` (old pin, pre-bump) | 216520 | 18480 | +| `e291192` (upstream main) | 216736 | 18492 | +| **delta** | **+216** | **+12** | + +The conclusion is unchanged and if anything stronger: the 31-commit upstream bump costs ~216 bytes +of a 16 MB flash. The bulky new upstream code (`GrainDelayI16`, `ReverbI16`, `ModFXI16`, +`CCSelectView`, `NameInputView`, `RLView`, `VUMeterView`, `PSRAMManager`) is header-only and +unreferenced, so the linker drops all of it; the delta is the AudioDriver/DisplayDriver changes. + +Absolute sizes for every variant, post-bump, are in the Phase 4 migration commit — all 16 build, +and none exceeds 2% of flash. Exactly **one** compile error had to be fixed: `MEMLNaut-NISPS.ino:169` used `kSampleRate` in a `constexpr`, and upstream `1997699 "mode sample rate"` made it a runtime `extern size_t` so a mode can choose its own rate. `constexpr` → `const`; it is a once-per-second diagnostic print. -The +316-byte uniform delta is the AudioDriver/DisplayDriver changes. The bulky new upstream code -(`GrainDelayI16`, `ReverbI16`, `ModFXI16`, `CCSelectView`, `NameInputView`, `RLView`, `VUMeterView`, -`PSRAMManager`) is header-only and unreferenced, so the linker drops all of it. - ## Where this leaves the vendoring Vendor **from current upstream**, not from the old pin. Take the five linked subdirs + diff --git a/firmware/MEMLNaut-NISPS/glue/audio_driver.hpp b/firmware/MEMLNaut-NISPS/glue/audio_driver.hpp index 48d7843..ac7a112 100644 --- a/firmware/MEMLNaut-NISPS/glue/audio_driver.hpp +++ b/firmware/MEMLNaut-NISPS/glue/audio_driver.hpp @@ -17,9 +17,9 @@ #include -#include "../src/nisps/core/perf.hpp" -#include "../src/nisps/core/types.hpp" -#include "../src/memllib/audio/AudioDriver.hpp" +#include "nisps/core/perf.hpp" +#include "nisps/core/types.hpp" +#include "audio/AudioDriver.hpp" namespace nisps_firmware { diff --git a/firmware/MEMLNaut-NISPS/glue/midi_io.hpp b/firmware/MEMLNaut-NISPS/glue/midi_io.hpp index d6f753e..8d495d1 100644 --- a/firmware/MEMLNaut-NISPS/glue/midi_io.hpp +++ b/firmware/MEMLNaut-NISPS/glue/midi_io.hpp @@ -26,8 +26,8 @@ #include #include #include -#include "../src/nisps/modes/base.hpp" -#include "../src/memllib/interface/MIDIInOut.hpp" +#include "nisps/modes/base.hpp" +#include "interface/MIDIInOut.hpp" namespace nisps_firmware { diff --git a/firmware/MEMLNaut-NISPS/glue/mode_select.hpp b/firmware/MEMLNaut-NISPS/glue/mode_select.hpp index 75001c7..b3e4002 100644 --- a/firmware/MEMLNaut-NISPS/glue/mode_select.hpp +++ b/firmware/MEMLNaut-NISPS/glue/mode_select.hpp @@ -1,18 +1,12 @@ // firmware/glue/mode_select.hpp — Compile-time mode selection. // -// The active firmware mode is chosen at compile time via `MEMLNAUT_MODE_TYPE` -// (the .ino's master macro). The macro expands to one of the canonical mode -// type aliases below; build scripts rewrite the active line. +// The active firmware mode is chosen at compile time via `MEMLNAUT_MODE_TYPE`, +// defined per-variant as a PlatformIO build flag (one `[env:...]` per variant +// in platformio.ini, e.g. `-DMEMLNAUT_MODE_TYPE=MEMLNautModePAFSynth`) — there +// is no in-source registry and no build-time file rewriting. // // Each alias maps a short human-readable name (`MEMLNautModePAFSynth`) to a -// concrete `nisps::modes::*Mode` C++ type. The legacy -// `modes/MEMLNautMode*.hpp` wrappers are gone; the same identifier now refers -// to the new platform-agnostic mode type. -// -// This indirection (via using-aliases) lets the build script's mode-rewrite -// logic stay near-identical: it still sees lines of the form -// #define MEMLNAUT_MODE_TYPE MEMLNautModePAFSynth -// and rewrites between alternatives. +// concrete `nisps::modes::*Mode` C++ type. #pragma once @@ -38,16 +32,16 @@ # undef round #endif -#include "../src/nisps/modes/breakor.hpp" -#include "../src/nisps/modes/channel_strip.hpp" -#include "../src/nisps/modes/elysiamorf.hpp" -#include "../src/nisps/modes/external_synth_midi.hpp" -#include "../src/nisps/modes/memlcelium.hpp" -#include "../src/nisps/modes/paf_synth.hpp" -#include "../src/nisps/modes/slp_workshop.hpp" -#include "../src/nisps/modes/sound_analysis_midi.hpp" -#include "../src/nisps/modes/verb_fx.hpp" -#include "../src/nisps/modes/xiasri.hpp" +#include "nisps/modes/breakor.hpp" +#include "nisps/modes/channel_strip.hpp" +#include "nisps/modes/elysiamorf.hpp" +#include "nisps/modes/external_synth_midi.hpp" +#include "nisps/modes/memlcelium.hpp" +#include "nisps/modes/paf_synth.hpp" +#include "nisps/modes/slp_workshop.hpp" +#include "nisps/modes/sound_analysis_midi.hpp" +#include "nisps/modes/verb_fx.hpp" +#include "nisps/modes/xiasri.hpp" // ---- Public name → nisps type aliases ---- // Build script greps for `MEMLNautMode*` lines, so we keep the prefix. @@ -75,32 +69,9 @@ using MEMLNautModeExtSynthAnalogKeys = ::nisps::modes::ExternalSynthMIDIMode<::n using MEMLNautModeExtSynthHydrasynth = ::nisps::modes::ExternalSynthMIDIMode<::nisps::midi::generated::kAsmHydrasynth, 8u>; using MEMLNautModeExtSynthJD800 = ::nisps::modes::ExternalSynthMIDIMode<::nisps::midi::generated::kRolandJd800, 8u>; -// ---- SelfTest pseudo-variant ---- -// A standalone guided hardware self-test (see glue/selftest.hpp). It is NOT a -// nisps Mode — it drives the display + raw peripherals directly. We expose a -// tiny tag type so the `MEMLNautModeSelfTest` alias type-checks and the build -// script's `MEMLNautMode*` grep discovers the variant; the .ino forks on -// `NISPS_SELFTEST` and never instantiates this tag. -namespace nisps_firmware { namespace selftest { struct SelfTestRig {}; } } -using MEMLNautModeSelfTest = ::nisps_firmware::selftest::SelfTestRig; - -// Compile-time guard: NISPS_SELFTEST expands to 1 iff MEMLNAUT_MODE_TYPE is -// MEMLNautModeSelfTest, else 0. Computed in the .ino *after* the mode #define. -// Two-level CAT so MEMLNAUT_MODE_TYPE expands before the paste. -#define NISPS_ST_MEMLNautModePAFSynth 0 -#define NISPS_ST_MEMLNautModeChannelStrip 0 -#define NISPS_ST_MEMLNautModeXIASRI 0 -#define NISPS_ST_MEMLNautModeSoundAnalysisMIDI 0 -#define NISPS_ST_MEMLNautModeBreakOr 0 -#define NISPS_ST_MEMLNautModeVerbFX 0 -#define NISPS_ST_MEMLNautModeElysiamorfs 0 -#define NISPS_ST_MEMLNautModeMEMLCelium 0 -#define NISPS_ST_MEMLNautModeExtSynthSub37 0 -#define NISPS_ST_MEMLNautModeExtSynthSubPhatty 0 -#define NISPS_ST_MEMLNautModeExtSynthPro12 0 -#define NISPS_ST_MEMLNautModeExtSynthAnalogKeys 0 -#define NISPS_ST_MEMLNautModeExtSynthHydrasynth 0 -#define NISPS_ST_MEMLNautModeExtSynthJD800 0 -#define NISPS_ST_MEMLNautModeSelfTest 1 -#define NISPS_ST_CAT_(x) NISPS_ST_##x -#define NISPS_ST_CAT(x) NISPS_ST_CAT_(x) +// ---- SelfTest ---- +// The guided hardware self-test (see glue/selftest.hpp) is NOT a nisps Mode — +// it drives the display + raw peripherals directly and is selected by its own +// `selftest` PlatformIO env, which defines `NISPS_SELFTEST=1` and leaves +// `MEMLNAUT_MODE_TYPE` undefined (src/main.cpp's `#if !NISPS_SELFTEST` fork +// never instantiates `ActiveMode` in that env, so no alias is needed here). diff --git a/firmware/MEMLNaut-NISPS/glue/peripherals.hpp b/firmware/MEMLNaut-NISPS/glue/peripherals.hpp index 739814f..13e68df 100644 --- a/firmware/MEMLNaut-NISPS/glue/peripherals.hpp +++ b/firmware/MEMLNaut-NISPS/glue/peripherals.hpp @@ -46,9 +46,9 @@ #include #include -#include "../src/nisps/core/perf.hpp" -#include "../src/nisps/ml/feedback.hpp" -#include "../src/memllib/hardware/memlnaut/MEMLNaut.hpp" +#include "nisps/core/perf.hpp" +#include "nisps/ml/feedback.hpp" +#include "hardware/memlnaut/MEMLNaut.hpp" namespace nisps_firmware { diff --git a/firmware/MEMLNaut-NISPS/glue/selftest.hpp b/firmware/MEMLNaut-NISPS/glue/selftest.hpp index 91ceba4..b2b5bad 100644 --- a/firmware/MEMLNaut-NISPS/glue/selftest.hpp +++ b/firmware/MEMLNaut-NISPS/glue/selftest.hpp @@ -15,8 +15,9 @@ // // This logic is INHERENTLY hardware-coupled (it draws to the TFT and reads raw // pins), so it lives firmware-side here in glue/, NOT under platform-agnostic -// nisps/. It is selected at build time via the `SelfTest` variant (see -// mode_select.hpp + the NISPS_SELFTEST fork in MEMLNaut-NISPS.ino). +// nisps/. It is selected at build time via the `selftest` PlatformIO env (see +// platformio.ini, which defines NISPS_SELFTEST=1; the fork lives in +// src/main.cpp). // // Threading: core 0 owns the step state machine (driven from MEMLNaut's // loopCallback, ~5 ms) and the display. core 1 owns the audio sweep block @@ -48,14 +49,14 @@ #include #include -#include "../src/memllib/PicoDefs.hpp" -#include "../src/memllib/utils/perf.hpp" -#include "../src/memllib/audio/AudioDriver.hpp" -#include "../src/memllib/interface/MIDIInOut.hpp" -#include "../src/memllib/hardware/memlnaut/MEMLNaut.hpp" -#include "../src/memllib/hardware/memlnaut/Pins.hpp" -#include "../src/memllib/hardware/memlnaut/display/View.hpp" -#include "../src/nisps/dsp/osc.hpp" +#include "PicoDefs.hpp" +#include "utils/perf.hpp" +#include "audio/AudioDriver.hpp" +#include "interface/MIDIInOut.hpp" +#include "hardware/memlnaut/MEMLNaut.hpp" +#include "hardware/memlnaut/Pins.hpp" +#include "hardware/memlnaut/display/View.hpp" +#include "nisps/dsp/osc.hpp" // Inter-core boot-handshake flags. Defined in the .ino (shared by both the // normal-mode and self-test build paths); declared here so this header is diff --git a/firmware/MEMLNaut-NISPS/glue/settings_view.hpp b/firmware/MEMLNaut-NISPS/glue/settings_view.hpp index 9c5ab29..4f69387 100644 --- a/firmware/MEMLNaut-NISPS/glue/settings_view.hpp +++ b/firmware/MEMLNaut-NISPS/glue/settings_view.hpp @@ -3,7 +3,7 @@ // Adds entries to the MEMLNaut display carousel (the same DisplayDriver the // SystemView and SelfTest use). Navigation: rotate to move between views; // press to focus a view; rotate-while-focused to change its value; press -// again to unfocus. See src/memllib/.../display/DisplayDriver.hpp. +// again to unfocus. See lib/memllib/hardware/memlnaut/display/DisplayDriver.hpp. // // Currently provides: // * Joystick: Dual / Single — for the 4-input ("two 2-D joystick") modes, @@ -24,8 +24,8 @@ #include #include -#include "../src/memllib/hardware/memlnaut/MEMLNaut.hpp" -#include "../src/memllib/hardware/memlnaut/display/SingleSelectView.hpp" +#include "hardware/memlnaut/MEMLNaut.hpp" +#include "hardware/memlnaut/display/SingleSelectView.hpp" namespace nisps_firmware { diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/LICENSE b/firmware/MEMLNaut-NISPS/lib/memllib/LICENSE new file mode 100644 index 0000000..a612ad9 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/VENDORED.md b/firmware/MEMLNaut-NISPS/lib/memllib/VENDORED.md new file mode 100644 index 0000000..3232a70 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/VENDORED.md @@ -0,0 +1,86 @@ +# memllib — vendored, not a submodule + +This directory is a **vendored copy** of the load-bearing subset of +[`MusicallyEmbodiedML/memllib`](https://github.com/MusicallyEmbodiedML/memllib), the +hardware-abstraction library for the MEMLNaut board (audio driver, TFT display, MIDI +I/O, peripherals). It replaced the `src/memllib` git submodule during the Phase 4 +PlatformIO migration (2026-07-21). + +## Provenance + +- **Upstream repo**: `https://github.com/MusicallyEmbodiedML/memllib.git` +- **Vendored at commit**: `e291192d8e4f2fca7b79670c4df9c2ec8bdf03cd` (upstream `main`, + "l r input swap") +- **License**: MPL-2.0 (`LICENSE` in this directory, copied verbatim from upstream) + +## What was copied, what was dropped + +Copied verbatim, directory structure unchanged, under `src/`: `audio/`, `hardware/`, +`interface/`, `synth/`, `utils/`, `PicoDefs.hpp`. `LICENSE` sits at this directory's +root (metadata, not source). These are exactly the subdirectories the firmware sketch +used to reach via its symlink forest (`firmware/MEMLNaut-NISPS/src/memllib` before this +migration) — only the wrapping `src/` folder and the `library.properties` manifest are +new, both required for PlatformIO to discover and recursively compile this tree (see +below). + +Dropped: `examples/` (17 files — never compiled; the firmware never referenced it, and +its content that mattered was already ported into `nisps/ml/{jolt,ou_noise,feedback, +geo_push}.hpp` per the pre-Phase-4 submodule-bump decision), `.git` (submodule gitlink), +`.gitignore` (build-artifact patterns, meaningless once vendored — this repo's own +`.gitignore` covers it), `README.md` (described the old Arduino-IDE TFT_eSPI +`User_Setup_Select.h` copy-paste workflow, which PlatformIO replaces with +`-D USER_SETUP_LOADED=1` + explicit build flags in `platformio.ini` — see there). + +98 files, ~1.9 MB total — all of memllib bar `examples/`; there is no smaller subset to +lift (every one of the 24 `.cpp` translation units here is reached by at least one +compiled firmware variant). + +## Internal include convention (do not break) + +Files inside this tree include each other with paths relative to `src/` as the root +(e.g. `src/hardware/memlnaut/MEMLNaut.cpp` does `#include "../PicoDefs.hpp"`, +`src/hardware/memlnaut/display/View.cpp` does `#include "../../PicoDefs.hpp"`). + +This directory is consumed as a PlatformIO Arduino-format library (`lib/memllib/`, with +`library.properties` + a `src/` subfolder — the standard 1.5 Arduino library layout). +PlatformIO's Library Dependency Finder therefore adds `lib/memllib/src` (not +`lib/memllib` itself) to the include search path and recursively compiles every source +file under `src/`. + +**Do not vendor these five subdirectories directly under `lib/memllib/`** (i.e. without +the `src/` wrapper) — that was tried first and silently compiles nothing: PlatformIO's +`ArduinoLibBuilder`, when it finds no `src/` subfolder, falls back to a *non-recursive* +"files directly in the library root" scan (the historical Arduino 1.0 library format, +which only special-cases a `utility/` subfolder). Nested folders like `audio/` or +`hardware/` are silently invisible to the build under that fallback — it links, or +rather fails to link, with `undefined reference to MEMLNaut::...` for every symbol in +this library. The `src/` subfolder switches PlatformIO onto the recursive path. + +Firmware code outside this tree (`../../src/main.cpp`, `../../glue/*.hpp`) includes +headers here relative to `src/` as the root, e.g. `#include "audio/AudioDriver.hpp"`, +`#include "hardware/memlnaut/MEMLNaut.hpp"` — no `memllib/` or `src/` prefix, because +`lib/memllib/src/` *is* the include root PlatformIO adds. + +## Re-syncing with upstream + +There is no submodule to bump anymore, so a re-sync is a manual, documented diff: + +1. Clone upstream at the desired commit: `git clone + https://github.com/MusicallyEmbodiedML/memllib.git /tmp/memllib-upstream` +2. Diff the five subdirs + `PicoDefs.hpp` against this directory's `src/`, e.g.: + ``` + diff -ru /tmp/memllib-upstream/audio firmware/MEMLNaut-NISPS/lib/memllib/src/audio + # ...repeat for hardware/ interface/ synth/ utils/ PicoDefs.hpp + ``` +3. Copy over the changed files (`cp -a`), re-run `diff -ru` both ways to confirm nothing + outside the tracked subset leaked in and nothing was silently dropped. +4. Update the "Vendored at commit" line above to the new upstream SHA + its subject + line. +5. Rebuild every `platformio.ini` env (`pio run`) and diff flash/RAM sizes against the + previous vendored commit's numbers — a size jump with no corresponding upstream + feature is a signal something unexpected changed. +6. Commit the vendored-file changes and this doc update together. + +If upstream ever restructures these directories (renames, new cross-subdir relative +includes), the internal-include convention above may need re-verification — grep for +`#include "\.\./` inside this tree and confirm every relative path still resolves. diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/library.properties b/firmware/MEMLNaut-NISPS/lib/memllib/library.properties new file mode 100644 index 0000000..63fec5e --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/library.properties @@ -0,0 +1,9 @@ +name=memllib +version=0.0.0 +author=MusicallyEmbodiedML +maintainer=MusicallyEmbodiedML +sentence=Hardware abstraction for the MEMLNaut board (audio driver, TFT display, MIDI I/O, peripherals). +paragraph=Vendored subset of MusicallyEmbodiedML/memllib at commit e291192d8e4f2fca7b79670c4df9c2ec8bdf03cd. See VENDORED.md in this directory for provenance and the re-sync procedure. +category=Device Control +url=https://github.com/MusicallyEmbodiedML/memllib +architectures=rp2040 diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/PicoDefs.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/PicoDefs.hpp new file mode 100644 index 0000000..b820bfb --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/PicoDefs.hpp @@ -0,0 +1,85 @@ +#ifndef __MEML_PICO_HPP__ +#define __MEML_PICO_HPP__ + +#include "pico.h" +#include + +#define AUDIO_FUNC(x) __not_in_flash_func(x) ///< Macro to make audio function load from mem +#define AUDIO_MEM __not_in_flash("audio") ///< Macro to make variable load from mem +//#define AUDIO_MEM_2 __not_in_flash("audio2") +#define APP_SRAM __not_in_flash("app") +#define ML_BUFFER_MEM __attribute__((section(".scratch_x"))) +#define AUDIO_BUFFER_MEM __attribute__((section(".scratch_y"))) + +#define PERIODIC_DEBUG(COUNT, FUNC) \ + static size_t ct=0; \ + if (ct++ % COUNT == 0) { \ + FUNC \ + } + +// Add these macros near other globals +#define MEMORY_BARRIER() __sync_synchronize() +#define WRITE_VOLATILE(var, val) do { MEMORY_BARRIER(); (var) = (val); MEMORY_BARRIER(); } while (0) +#define READ_VOLATILE(var) ({ MEMORY_BARRIER(); typeof(var) __temp = (var); MEMORY_BARRIER(); __temp; }) + +template +inline void write_volatile_struct(volatile T& dest, const T& src) { + MEMORY_BARRIER(); + memcpy((void*)&dest, &src, sizeof(T)); + MEMORY_BARRIER(); +} + +#define WRITE_VOLATILE_STRUCT(var, val) write_volatile_struct((var), (val)) + +// Add this template function after write_volatile_struct: +template +inline T read_volatile_struct(const volatile T& src) { + MEMORY_BARRIER(); + T temp; + memcpy(&temp, (const void*)&src, sizeof(T)); + MEMORY_BARRIER(); + return temp; +} + +#define READ_VOLATILE_STRUCT(var) read_volatile_struct(var) + +//#define ALLOW_DEBUG + +#ifdef ALLOW_DEBUG +#define DEBUG_PRINTF(...) Serial.printf(__VA_ARGS__); Serial.flush() +#define DEBUG_PRINT(...) Serial.print(__VA_ARGS__); Serial.flush() +#define DEBUG_PRINTLN(...) Serial.println(__VA_ARGS__); Serial.flush() +#else +#define DEBUG_PRINT(...) +#define DEBUG_PRINTLN(...) +#define DEBUG_PRINTF(...) +#endif + +#define PERIODIC_RUN(code, freq_ms) \ +{ \ + static size_t lastUpdate = 0; \ + size_t now = millis(); \ + if (now - lastUpdate > (freq_ms)) { \ + lastUpdate = now; \ + code; \ + } \ +} + +#define PERIODIC_RUN_US(code, freq_us) \ +{ \ + static size_t lastUpdate = 0; \ + size_t now = micros(); \ + if (now - lastUpdate > (freq_us)) { \ + lastUpdate = now; \ + code; \ + } \ +} + +template +std::shared_ptr make_non_owning(T& obj) { + return std::shared_ptr(&obj, [](T*){}); +} + + + +#endif // __MEML_PICO_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AnalysisParams.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AnalysisParams.cpp new file mode 100644 index 0000000..5fbad07 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AnalysisParams.cpp @@ -0,0 +1,33 @@ +#include "AnalysisParams.hpp" +#include "pico/mutex.h" +#include "CoreMutex.h" +#include "Arduino.h" +#include "../PicoDefs.hpp" + +static mutex_t mutex_0to1_; +static std::vector params_mem_; + + +void AnalysisParamsSetup(size_t n_params) { + params_mem_.resize(n_params, -1.f); + mutex_init(&mutex_0to1_); +}; + +void AUDIO_FUNC(AnalysisParamsWrite)(std::vector ¶ms) { + { // Acquire + CoreMutex acquire_1to0(&mutex_0to1_); + for (unsigned int n=0; n < params_mem_.size(); n++) { + if (n >= params.size()) { + DEBUG_PRINTLN("PANIK! Too many params for AnalysisParams"); + } + params_mem_[n] = params[n]; + } + } // Release +} + +void AnalysisParamsRead(std::vector ¶ms) { + { // Acquire + CoreMutex acquire_1to0(&mutex_0to1_); + params = params_mem_; + } // Release +} diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AnalysisParams.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AnalysisParams.hpp new file mode 100644 index 0000000..4648aa4 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AnalysisParams.hpp @@ -0,0 +1,12 @@ +#ifndef __ANALYSIS_PARAMS_HPP__ +#define __ANALYSIS_PARAMS_HPP__ + +#include +#include + + +void AnalysisParamsSetup(size_t n_params); +void AnalysisParamsWrite(std::vector ¶ms); +void AnalysisParamsRead(std::vector ¶ms); + +#endif // __ANALYSIS_PARAMS_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AudioAppBase.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AudioAppBase.hpp new file mode 100644 index 0000000..29341be --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AudioAppBase.hpp @@ -0,0 +1,67 @@ +#ifndef __AUDIO_APP_BASE_HPP__ +#define __AUDIO_APP_BASE_HPP__ + +#include "AudioDriver.hpp" +#include "../interface/InterfaceBase.hpp" +#include +#include + +template +class AudioAppBase { +protected: + float sample_rate_; + std::shared_ptr interface_; + static std::function callback_; + std::array paramsFromQueue; + +public: + virtual AudioDriver::codec_config_t GetDriverConfig() const { + return { + .mic_input = false, + .line_level = 3, + .mic_gain_dB = 0, + .output_volume = 0.55f + }; + } + + AudioAppBase() = default; + virtual ~AudioAppBase() = default; + + + virtual stereosample_t Process(const stereosample_t x) { + return x; + } + + static stereosample_t audioCallback(const stereosample_t x) { + return callback_(x); + } + + virtual void Setup(float sample_rate, std::shared_ptr interface) { + sample_rate_ = sample_rate; + interface_ = interface; + callback_ = [this](stereosample_t x) { return Process(x); }; + AudioDriver::SetCallback(audioCallback); + } + + virtual void ProcessParams(const std::array& params) { + // Default implementation does nothing + } + + virtual void loop() { + if (!interface_) { + DEBUG_PRINTLN("AudioAppBase::loop - Error: Interface is null"); + return; // Early return if interface is null + } + + // std::vector x; + if (interface_->ReceiveParamsFromQueue(paramsFromQueue.data())) { + ProcessParams(paramsFromQueue); + } + } + +}; + +template +std::function AudioAppBase::callback_ = nullptr; + +#endif // __AUDIO_APP_BASE_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AudioControl.h b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AudioControl.h new file mode 100644 index 0000000..50e55ca --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AudioControl.h @@ -0,0 +1,48 @@ +/* Audio Library for Teensy 3.X + * Copyright (c) 2014, Paul Stoffregen, paul@pjrc.com + * + * Development of this audio library was funded by PJRC.COM, LLC by sales of + * Teensy and Audio Adaptor boards. Please support PJRC's efforts to develop + * open source software by purchasing Teensy or other PJRC products. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice, development funding notice, and this permission + * notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef AudioControl_h_ +#define AudioControl_h_ + +#include + +// A base class for all Codecs, DACs and ADCs, so at least the +// most basic functionality is consistent. + +#define AUDIO_INPUT_LINEIN 0 +#define AUDIO_INPUT_MIC 1 + +class AudioControl +{ +public: + virtual bool enable(void) = 0; + virtual bool disable(void) = 0; + virtual bool volume(float volume) = 0; // volume 0.0 to 1.0 + virtual bool inputLevel(float volume) = 0; // volume 0.0 to 1.0 + virtual bool inputSelect(int n) = 0; +}; + +#endif diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AudioDriver.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AudioDriver.cpp new file mode 100644 index 0000000..c01dbea --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AudioDriver.cpp @@ -0,0 +1,298 @@ +#include "AudioDriver.hpp" +#include +#include "Wire.h" + +#include "control_sgtl5000.h" +#include "../synth/maximilian.h" +#include "hardware/dma.h" +#include "hardware/clocks.h" +#include "../PicoDefs.hpp" + +#include "../utils/perf.hpp" + + + +#define TEST_TONES 0 +#define PASSTHROUGH 0 + + +extern "C" { + size_t kSampleRate = 48000; + float kSampleRateRcpr = 1.0f / 48000.0f; +} + +PERF_DECLARE(AUDIOLOOP); + +AUDIO_MEM uint32_t AUDIOLOOP_MEAN=0; + +int sampleRate = (int)kSampleRate; +constexpr int bitsPerSample = 32; + +constexpr float amplitude = 1 << (bitsPerSample - 2); // amplitude of square wave = 1/2 of maximum +constexpr float neg_amplitude = -amplitude; // amplitude of square wave = 1/2 of maximum +constexpr float one_over_amplitude = 1.f / amplitude; + +static int32_t AUDIO_MEM sample = amplitude; // current sample value + +static AUDIO_MEM AudioControlSGTL5000 codecCtl; + +audiocallback_fptr_t AUDIO_MEM audio_callback_ = nullptr; +audiocallback_block_fptr_t AUDIO_MEM audio_callback_block_ = nullptr; + +//define AUDIO_BUFFER_MEM externally +static AUDIO_BUFFER_MEM float input_buffer[kNChannels][kBufferSize]; +static AUDIO_BUFFER_MEM float output_buffer[kNChannels][kBufferSize]; + +static __attribute__((aligned(8))) AUDIO_MEM pio_i2s i2s; + +volatile bool AUDIO_MEM dsp_overload; + +float master_volume_ = 0; + +#if TEST_TONES +maxiOsc osc, osc2; + +float f1=20, f2=2000; +#endif // TEST_TONES + +inline float __attribute__((always_inline)) _scale_down(float x) { + // Convert from int32 range to [-1.0, 1.0] + return x * (1.0f / (float)(1LL << 31)); // Divide by 2^31 for proper scaling +} + +inline float __attribute__((always_inline)) _scale_and_saturate(float x) { + // Convert from [-1.0, 1.0] back to int32 range with saturation + const float scaled = x * (float)(1LL << 31); + if (scaled > INT32_MAX) return INT32_MAX; + if (scaled < INT32_MIN) return INT32_MIN; + return scaled; +} + +#if TEST_TONES +static inline __attribute__((always_inline)) void AUDIO_FUNC(process_test_tones)( + int32_t* output, size_t i) { + output[i*2] = osc.sinewave(f1) * sample; + output[(i*2) + 1] = osc2.sinewave(f2) * sample; + f1 *= 1.00001; + f2 *= 1.00001; + if (f1 > 15000) { + f1 = 20.0; + } + if (f2 > 15000) { + f2 = 20.0; + } +} +#endif + +#if PASSTHROUGH +static inline __attribute__((always_inline)) void AUDIO_FUNC(process_passthrough)( + const int32_t* input, int32_t* output, size_t i) { + output[i*2] = input[i*2]; + output[(i*2) + 1] = input[(i*2) + 1]; +} +#endif + +static inline __attribute__((always_inline)) void AUDIO_FUNC(process_normal)( + const int32_t* input, int32_t* output, size_t i, + const size_t indexL, const size_t indexR) { + stereosample_t y { + _scale_down(static_cast(input[indexL])), + _scale_down(static_cast(input[indexR])) + }; + + y = audio_callback_(y); // y should now be in [-1.0, 1.0] range + + output[indexL] = static_cast(_scale_and_saturate(y.L * master_volume_)); + output[indexR] = static_cast(_scale_and_saturate(y.R * master_volume_)); +} + +static void AUDIO_FUNC(process_audio)(const int32_t* input, int32_t* output, size_t num_frames) { + PERF_BEGIN(AUDIOLOOP); + + if (audio_callback_block_ != nullptr) { + + // Convert from interleaved int32_t to deinterleaved float. + // Channels are swapped here to correct a hardware layout issue: the physical + // L/R input sockets map to the opposite codec ADC channels. Swapping at this + // lowest level means every mode sees x.L/x.R matching the labelled sockets. + for (size_t i = 0; i < num_frames; i++) { + const size_t indexL = i << 1; + const size_t indexR = indexL + 1; + input_buffer[0][i] = _scale_down(static_cast(input[indexR])); + input_buffer[1][i] = _scale_down(static_cast(input[indexL])); + } + // Serial.println(input_buffer[0][0]); + // Serial.println(input[0]); + // Call block callback + audio_callback_block_(input_buffer, output_buffer, kNChannels, num_frames); + + // Convert from deinterleaved float to interleaved int32_t + for (size_t i = 0; i < num_frames; i++) { + const size_t indexL = i << 1; + const size_t indexR = indexL + 1; + // TODO find way to perform only one for loop + output[indexL] = static_cast(_scale_and_saturate(output_buffer[0][i] * master_volume_)); + output[indexR] = static_cast(_scale_and_saturate(output_buffer[1][i] * master_volume_)); + } + + } else { + for (size_t i = 0; i < num_frames; i++) { + const size_t indexL = i << 1; + const size_t indexR = indexL + 1; + + #if TEST_TONES + process_test_tones(output, i); + #else + #if PASSTHROUGH + process_passthrough(input, output, i); + #else + process_normal(input, output, i, indexL, indexR); + #endif + #endif + } + } + + PERF_END(AUDIOLOOP); + AUDIOLOOP_MEAN = PERF_GET_MEAN(AUDIOLOOP); +} + +static void __isr dma_i2s_in_handler(void) { + /* We're double buffering using chained TCBs. By checking which buffer the + * DMA is currently reading from, we can identify which buffer it has just + * finished reading (the completion of which has triggered this interrupt). + */ + if (*(int32_t**)dma_hw->ch[i2s.dma_ch_in_ctrl].read_addr == i2s.input_buffer) { + // It is inputting to the second buffer so we can overwrite the first + process_audio(i2s.input_buffer, i2s.output_buffer, AUDIO_BUFFER_FRAMES); + } else { + // It is currently inputting the first buffer, so we write to the second + process_audio(&i2s.input_buffer[STEREO_BUFFER_SIZE], &i2s.output_buffer[STEREO_BUFFER_SIZE], AUDIO_BUFFER_FRAMES); + } + dma_hw->ints0 = 1u << i2s.dma_ch_in_data; // clear the IRQ +} + + +void __isr AudioDriver::i2sOutputCallback() { + + + // for(size_t i=0; i < kBufferSize; i++) { + + // stereosample_t y { 0 }; + // y = audio_callback_(y); + + // stereosample_t y_scaled { + // _scale_and_saturate(y.L), + // _scale_and_saturate(y.R), + // }; + // i2s.write32(static_cast(y_scaled.L), static_cast(y_scaled.R)); + // } + + // Timing end + // auto elapsed = micros() - ts; + // static constexpr float quantumLength = 1.f/ + // ((static_cast(kBufferSize)/static_cast(kSampleRate)) + // * 1000000.f); + // float dspload = elapsed * quantumLength; + // // Report DSP overload if needed + // static volatile bool dsp_overload = false; + // if (dspload > 0.95 and !dsp_overload) { + // dsp_overload = true; + // } else if (dspload < 0.9) { + // dsp_overload = false; + // } +} + +bool AudioDriver::Setup(const codec_config_t &config) { + + if (nullptr == audio_callback_) { + audio_callback_ = &silence_; + } + DEBUG_PRINTF("AUDIO- Setup - Audio callback address: 0x%x\n", audio_callback_); + + dsp_overload = false; + master_volume_ = 0; + + // Zero out float buffers + for (size_t ch = 0; ch < kNChannels; ch++) { + for (size_t i = 0; i < kBufferSize; i++) { + input_buffer[ch][i] = 0; + output_buffer[ch][i] = 0; + } + } + + maxiSettings::setup(kSampleRate, 2, kBufferSize); + + if (!Wire.setSDA(i2c_sgt5000Data) || + !Wire.setSCL(i2c_sgt5000Clk)) { + DEBUG_PRINTLN("AUDIO- Failed to setup I2C with codec!"); + } + + // set_sys_clock_khz(132000*2, true); + // set_sys_clock_khz(129600, true); + DEBUG_PRINTF("System Clock: %lu\n", clock_get_hz(clk_sys)); + + size_t sys_clk_hz = clock_get_hz(clk_sys); + if (sys_clk_hz != AudioDriver::GetSysClockSpeed() * 1000) { + DEBUG_PRINTLN("Error: audio driver: system clock must be set externally (see ::GetDesiredClockSpeed)"); + DEBUG_PRINTLN("After 'setup()) {', add: 'set_sys_clock_khz(AudioDriver::GetSysClockSpeed(), true);'"); + } + + i2s_config picoI2SConfig { + kSampleRate, // 48000, + 256, + bitsPerSample, // 32, + i2s_pMCLK, // 10, + i2s_pDIN, // 6, + i2s_pDOUT, // 7, + i2s_pBCLK, // 8, + true + }; + i2s_program_start_synched(pio0, &picoI2SConfig, dma_i2s_in_handler, &i2s); + + setDACVolume(3.0f); + + // init i2c + codecCtl.enable(); + DEBUG_PRINTLN("AUDIO - Codec enabled"); + DEBUG_PRINTF("config.output_volume = %f\n", config.output_volume); + codecCtl.volume(config.output_volume > 0.99 ? 0.99 : config.output_volume); + DEBUG_PRINTF("config.mic_input = %d\n", config.mic_input); + codecCtl.inputSelect(config.mic_input ? AUDIO_INPUT_MIC : AUDIO_INPUT_LINEIN); + DEBUG_PRINTF("config.line_level = %d\n", config.line_level); + codecCtl.lineInLevel(config.line_level); + DEBUG_PRINTF("config.mic_gain_dB = %d\n", config.mic_gain_dB); + if (config.mic_input) { + codecCtl.micGain(config.mic_gain_dB); + } + codecCtl.lineOutLevel(20); + + return true; +} + +bool AudioDriver::Setup() { + codec_config_t config; + config.mic_input = false; + config.line_level = 3; + config.mic_gain_dB = 0; + config.output_volume = 0.8; + + return Setup(config); +} + + +stereosample_t AudioDriver::silence_(stereosample_t x) { + x.L = 0; + x.R = 0; + + return x; +} + +//breaking change +void AudioDriver::setDACVolume(float n) { + codecCtl.dacVolume(n); +} + +void AudioDriver::SetSampleRate(size_t rate) { + kSampleRate = rate; + kSampleRateRcpr = 1.0f / (float)rate; +} diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AudioDriver.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AudioDriver.hpp new file mode 100644 index 0000000..3f4e248 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/AudioDriver.hpp @@ -0,0 +1,132 @@ +#ifndef __AUDIO_DRIVER_HPP__ +#define __AUDIO_DRIVER_HPP__ + +#include +#include +#include "../PicoDefs.hpp" +#include "i2s_pio/i2s.h" + +extern "C" { + +const size_t kBufferSize = AUDIO_BUFFER_FRAMES; +extern size_t kSampleRate; +extern float kSampleRateRcpr; +const size_t kNChannels = 2; + +struct stereosample_t { + float L; + float R; + + __force_inline stereosample_t operator+(const stereosample_t& other) const { + return {L + other.L, R + other.R}; + } + __force_inline stereosample_t& operator+=(const stereosample_t& other) { + L += other.L; + R += other.R; + return *this; + } + __force_inline stereosample_t operator*(float scalar) const { + return {L * scalar, R * scalar}; + } + __force_inline stereosample_t& operator*=(float scalar) { + L *= scalar; + R *= scalar; + return *this; + } + __force_inline stereosample_t operator-() const { + return {-L, -R}; + } + __force_inline stereosample_t operator-(const stereosample_t& other) const { + return {L - other.L, R - other.R}; + } + __force_inline stereosample_t& operator-=(const stereosample_t& other) { + L -= other.L; + R -= other.R; + return *this; + } + __force_inline float operator[](size_t index) const { + return index == 0 ? L : R; + } +}; + +using audiocallback_fptr_t = stereosample_t (*)(stereosample_t); +using audiocallback_block_fptr_t = void (*)(float[][kBufferSize], float[][kBufferSize], size_t, size_t); + +} + + +extern audiocallback_fptr_t audio_callback_; +extern audiocallback_block_fptr_t audio_callback_block_; + +extern uint32_t AUDIOLOOP_MEAN; + + +enum PinConfig_i2c { + i2c_sgt5000Data = 0, + i2c_sgt5000Clk = 1, + i2s_pDIN = 6, + i2s_pDOUT = 7, + i2s_pBCLK = 8, + i2s_pWS = 9, + i2s_pMCLK = 10, +}; + +extern volatile bool AUDIO_MEM dsp_overload; +extern float master_volume_; + + +class AudioDriver { + public: + typedef struct { + bool mic_input; + size_t line_level; + size_t mic_gain_dB; + float output_volume; + } codec_config_t; + static bool Setup(); + static bool Setup(const codec_config_t& config); + static inline void SetCallback(audiocallback_fptr_t callback) { + audio_callback_ = callback; + DEBUG_PRINT("AUDIO_DRIVER - Callback address: "); + DEBUG_PRINTF("%p\n", audio_callback_); + } + static inline void SetBlockCallback(audiocallback_block_fptr_t callback) { + audio_callback_block_ = callback; + DEBUG_PRINT("AUDIO_DRIVER - Block Callback address: "); + DEBUG_PRINTF("%p\n", audio_callback_block_); + } + static inline void SetMasterVolume(float volume) { + if (volume > 1.0f) { + volume = 1.0f; + } else if (volume < 0) { + volume = 0; + } + master_volume_ = volume; + } + + static void SetSampleRate(size_t rate); + static inline size_t GetSampleRate() { return kSampleRate; } + static size_t GetSysClockSpeed() { + if (kSampleRate == 48000) { + return 132000 * 2; + } else if (kSampleRate == 44100) { + return 135475 * 2; + } else if (kSampleRate == 32000) { + return 132000 * 2; + } else if (kSampleRate == 24000) { + return 132000 * 2; + } else { + panic("Unsupported sample rate for SGTL5000"); + } + } + + AudioDriver() = delete; + + static void i2sOutputCallback(void); + static stereosample_t silence_(stereosample_t); + +private: + static void setDACVolume(float n); +}; + +#endif // __AUDIO_DRIVER_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/FocusManager.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/FocusManager.hpp new file mode 100644 index 0000000..550c23d --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/FocusManager.hpp @@ -0,0 +1,71 @@ +#pragma once + +#include +#include +#include +#include +#include + +// FocusManager — selective parameter latching for the Focus system. +// +// Interaction model: +// selectedMask == 0 → all params live (default, no-op) +// selectedMask != 0 → a param is live if any of its groups is in selectedMask, +// otherwise it uses its latch buffer value. +// +// Latch snapshot: setFocus() only captures params transitioning live→latched, +// so the freeze point is the exact moment a group leaves the selection. +// +// Multi-group membership: assign (kGroupA | kGroupB) to a param — it stays +// live if either group is selected. + +template +class FocusManager { +public: + std::array groupNames = {}; + std::array paramGroupMask = {}; + + FocusManager() { + latchBuffer.fill(0.f); + } + + void setGroupName(size_t groupIdx, const String& name) { + if (groupIdx < NGROUPS) groupNames[groupIdx] = name; + } + + void setParamGroups(const std::array& masks) { + paramGroupMask = masks; + } + + // Change focus selection. Snapshots only params transitioning live→latched. + void setFocus(uint32_t newMask, const std::vector& live) { + for (size_t i = 0; i < NPARAMS && i < live.size(); i++) { + const bool wasLive = (selectedMask == 0) || ((paramGroupMask[i] & selectedMask) != 0); + const bool willBeLive = (newMask == 0) || ((paramGroupMask[i] & newMask) != 0); + if (wasLive && !willBeLive) { + latchBuffer[i] = live[i]; + } + } + selectedMask = newMask; + } + + // Apply focus filter in place. No-op when selectedMask == 0. + void applyInPlace(std::vector& params) const { + if (selectedMask == 0) return; + for (size_t i = 0; i < NPARAMS && i < params.size(); i++) { + if ((paramGroupMask[i] & selectedMask) == 0) { + params[i] = latchBuffer[i]; + } + } + } + + uint32_t getSelectedMask() const { return selectedMask; } + + bool isGroupSelected(size_t groupIdx) const { + return (selectedMask & (1u << groupIdx)) != 0; + } + +private: + std::array latchBuffer = {}; + uint32_t selectedMask = 0; +}; diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/control_sgtl5000.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/control_sgtl5000.cpp new file mode 100644 index 0000000..aadd94b --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/control_sgtl5000.cpp @@ -0,0 +1,1104 @@ +/* Audio Library for Teensy 3.X + * Copyright (c) 2014, Paul Stoffregen, paul@pjrc.com + * + * Development of this audio library was funded by PJRC.COM, LLC by sales of + * Teensy and Audio Adaptor boards. Please support PJRC's efforts to develop + * open source software by purchasing Teensy or other PJRC products. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice, development funding notice, and this permission + * notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include +#include "control_sgtl5000.h" +#include "Wire.h" +#include "AudioDriver.hpp" + +#define CHIP_ID 0x0000 +// 15:8 PARTID 0xA0 - 8 bit identifier for SGTL5000 +// 7:0 REVID 0x00 - revision number for SGTL5000. + +#define CHIP_DIG_POWER 0x0002 +// 6 ADC_POWERUP 1=Enable, 0=disable the ADC block, both digital & analog, +// 5 DAC_POWERUP 1=Enable, 0=disable the DAC block, both analog and digital +// 4 DAP_POWERUP 1=Enable, 0=disable the DAP block +// 1 I2S_OUT_POWERUP 1=Enable, 0=disable the I2S data output +// 0 I2S_IN_POWERUP 1=Enable, 0=disable the I2S data input + +#define CHIP_CLK_CTRL 0x0004 +// 5:4 RATE_MODE Sets the sample rate mode. MCLK_FREQ is still specified +// relative to the rate in SYS_FS +// 0x0 = SYS_FS specifies the rate +// 0x1 = Rate is 1/2 of the SYS_FS rate +// 0x2 = Rate is 1/4 of the SYS_FS rate +// 0x3 = Rate is 1/6 of the SYS_FS rate +// 3:2 SYS_FS Sets the internal system sample rate (default=2) +// 0x0 = 32 kHz +// 0x1 = 44.1 kHz +// 0x2 = 48 kHz +// 0x3 = 96 kHz +// 1:0 MCLK_FREQ Identifies incoming SYS_MCLK frequency and if the PLL should be used +// 0x0 = 256*Fs +// 0x1 = 384*Fs +// 0x2 = 512*Fs +// 0x3 = Use PLL +// The 0x3 (Use PLL) setting must be used if the SYS_MCLK is not +// a standard multiple of Fs (256, 384, or 512). This setting can +// also be used if SYS_MCLK is a standard multiple of Fs. +// Before this field is set to 0x3 (Use PLL), the PLL must be +// powered up by setting CHIP_ANA_POWER->PLL_POWERUP and +// CHIP_ANA_POWER->VCOAMP_POWERUP. Also, the PLL dividers must +// be calculated based on the external MCLK rate and +// CHIP_PLL_CTRL register must be set (see CHIP_PLL_CTRL register +// description details on how to calculate the divisors). + +#define CHIP_I2S_CTRL 0x0006 +// 8 SCLKFREQ Sets frequency of I2S_SCLK when in master mode (MS=1). When in slave +// mode (MS=0), this field must be set appropriately to match SCLK input +// rate. +// 0x0 = 64Fs +// 0x1 = 32Fs - Not supported for RJ mode (I2S_MODE = 1) +// 7 MS Configures master or slave of I2S_LRCLK and I2S_SCLK. +// 0x0 = Slave: I2S_LRCLK an I2S_SCLK are inputs +// 0x1 = Master: I2S_LRCLK and I2S_SCLK are outputs +// NOTE: If the PLL is used (CHIP_CLK_CTRL->MCLK_FREQ==0x3), +// the SGTL5000 must be a master of the I2S port (MS==1) +// 6 SCLK_INV Sets the edge that data (input and output) is clocked in on for I2S_SCLK +// 0x0 = data is valid on rising edge of I2S_SCLK +// 0x1 = data is valid on falling edge of I2S_SCLK +// 5:4 DLEN I2S data length (default=1) +// 0x0 = 32 bits (only valid when SCLKFREQ=0), +// not valid for Right Justified Mode +// 0x1 = 24 bits (only valid when SCLKFREQ=0) +// 0x2 = 20 bits +// 0x3 = 16 bits +// 3:2 I2S_MODE Sets the mode for the I2S port +// 0x0 = I2S mode or Left Justified (Use LRALIGN to select) +// 0x1 = Right Justified Mode +// 0x2 = PCM Format A/B +// 0x3 = RESERVED +// 1 LRALIGN I2S_LRCLK Alignment to data word. Not used for Right Justified mode +// 0x0 = Data word starts 1 I2S_SCLK delay after I2S_LRCLK +// transition (I2S format, PCM format A) +// 0x1 = Data word starts after I2S_LRCLK transition (left +// justified format, PCM format B) +// 0 LRPOL I2S_LRCLK Polarity when data is presented. +// 0x0 = I2S_LRCLK = 0 - Left, 1 - Right +// 1x0 = I2S_LRCLK = 0 - Right, 1 - Left +// The left subframe should be presented first regardless of +// the setting of LRPOL. + +#define CHIP_SSS_CTRL 0x000A +// 14 DAP_MIX_LRSWAP DAP Mixer Input Swap +// 0x0 = Normal Operation +// 0x1 = Left and Right channels for the DAP MIXER Input are swapped. +// 13 DAP_LRSWAP DAP Mixer Input Swap +// 0x0 = Normal Operation +// 0x1 = Left and Right channels for the DAP Input are swapped +// 12 DAC_LRSWAP DAC Input Swap +// 0x0 = Normal Operation +// 0x1 = Left and Right channels for the DAC are swapped +// 10 I2S_LRSWAP I2S_DOUT Swap +// 0x0 = Normal Operation +// 0x1 = Left and Right channels for the I2S_DOUT are swapped +// 9:8 DAP_MIX_SELECT Select data source for DAP mixer +// 0x0 = ADC +// 0x1 = I2S_IN +// 0x2 = Reserved +// 0x3 = Reserved +// 7:6 DAP_SELECT Select data source for DAP +// 0x0 = ADC +// 0x1 = I2S_IN +// 0x2 = Reserved +// 0x3 = Reserved +// 5:4 DAC_SELECT Select data source for DAC (default=1) +// 0x0 = ADC +// 0x1 = I2S_IN +// 0x2 = Reserved +// 0x3 = DAP +// 1:0 I2S_SELECT Select data source for I2S_DOUT +// 0x0 = ADC +// 0x1 = I2S_IN +// 0x2 = Reserved +// 0x3 = DAP + +#define CHIP_ADCDAC_CTRL 0x000E +// 13 VOL_BUSY_DAC_RIGHT Volume Busy DAC Right +// 0x0 = Ready +// 0x1 = Busy - This indicates the channel has not reached its +// programmed volume/mute level +// 12 VOL_BUSY_DAC_LEFT Volume Busy DAC Left +// 0x0 = Ready +// 0x1 = Busy - This indicates the channel has not reached its +// programmed volume/mute level +// 9 VOL_RAMP_EN Volume Ramp Enable (default=1) +// 0x0 = Disables volume ramp. New volume settings take immediate +// effect without a ramp +// 0x1 = Enables volume ramp +// This field affects DAC_VOL. The volume ramp effects both +// volume settings and mute When set to 1 a soft mute is enabled. +// 8 VOL_EXPO_RAMP Exponential Volume Ramp Enable +// 0x0 = Linear ramp over top 4 volume octaves +// 0x1 = Exponential ramp over full volume range +// This bit only takes effect if VOL_RAMP_EN is 1. +// 3 DAC_MUTE_RIGHT DAC Right Mute (default=1) +// 0x0 = Unmute +// 0x1 = Muted +// If VOL_RAMP_EN = 1, this is a soft mute. +// 2 DAC_MUTE_LEFT DAC Left Mute (default=1) +// 0x0 = Unmute +// 0x1 = Muted +// If VOL_RAMP_EN = 1, this is a soft mute. +// 1 ADC_HPF_FREEZE ADC High Pass Filter Freeze +// 0x0 = Normal operation +// 0x1 = Freeze the ADC high-pass filter offset register. The +// offset continues to be subtracted from the ADC data stream. +// 0 ADC_HPF_BYPASS ADC High Pass Filter Bypass +// 0x0 = Normal operation +// 0x1 = Bypassed and offset not updated + +#define CHIP_DAC_VOL 0x0010 +// 15:8 DAC_VOL_RIGHT DAC Right Channel Volume. Set the Right channel DAC volume +// with 0.5017 dB steps from 0 to -90 dB +// 0x3B and less = Reserved +// 0x3C = 0 dB +// 0x3D = -0.5 dB +// 0xF0 = -90 dB +// 0xFC and greater = Muted +// If VOL_RAMP_EN = 1, there is an automatic ramp to the +// new volume setting. +// 7:0 DAC_VOL_LEFT DAC Left Channel Volume. Set the Left channel DAC volume +// with 0.5017 dB steps from 0 to -90 dB +// 0x3B and less = Reserved +// 0x3C = 0 dB +// 0x3D = -0.5 dB +// 0xF0 = -90 dB +// 0xFC and greater = Muted +// If VOL_RAMP_EN = 1, there is an automatic ramp to the +// new volume setting. + +#define CHIP_PAD_STRENGTH 0x0014 +// 9:8 I2S_LRCLK I2S LRCLK Pad Drive Strength (default=1) +// Sets drive strength for output pads per the table below. +// VDDIO 1.8 V 2.5 V 3.3 V +// 0x0 = Disable +// 0x1 = 1.66 mA 2.87 mA 4.02 mA +// 0x2 = 3.33 mA 5.74 mA 8.03 mA +// 0x3 = 4.99 mA 8.61 mA 12.05 mA +// 7:6 I2S_SCLK I2S SCLK Pad Drive Strength (default=1) +// 5:4 I2S_DOUT I2S DOUT Pad Drive Strength (default=1) +// 3:2 CTRL_DATA I2C DATA Pad Drive Strength (default=3) +// 1:0 CTRL_CLK I2C CLK Pad Drive Strength (default=3) +// (all use same table as I2S_LRCLK) + +#define CHIP_ANA_ADC_CTRL 0x0020 +// 8 ADC_VOL_M6DB ADC Volume Range Reduction +// This bit shifts both right and left analog ADC volume +// range down by 6.0 dB. +// 0x0 = No change in ADC range +// 0x1 = ADC range reduced by 6.0 dB +// 7:4 ADC_VOL_RIGHT ADC Right Channel Volume +// Right channel analog ADC volume control in 1.5 dB steps. +// 0x0 = 0 dB +// 0x1 = +1.5 dB +// ... +// 0xF = +22.5 dB +// This range is -6.0 dB to +16.5 dB if ADC_VOL_M6DB is set to 1. +// 3:0 ADC_VOL_LEFT ADC Left Channel Volume +// (same scale as ADC_VOL_RIGHT) + +#define CHIP_ANA_HP_CTRL 0x0022 +// 14:8 HP_VOL_RIGHT Headphone Right Channel Volume (default 0x18) +// Right channel headphone volume control with 0.5 dB steps. +// 0x00 = +12 dB +// 0x01 = +11.5 dB +// 0x18 = 0 dB +// ... +// 0x7F = -51.5 dB +// 6:0 HP_VOL_LEFT Headphone Left Channel Volume (default 0x18) +// (same scale as HP_VOL_RIGHT) + +#define CHIP_ANA_CTRL 0x0024 +// 8 MUTE_LO LINEOUT Mute, 0 = Unmute, 1 = Mute (default 1) +// 6 SELECT_HP Select the headphone input, 0 = DAC, 1 = LINEIN +// 5 EN_ZCD_HP Enable the headphone zero cross detector (ZCD) +// 0x0 = HP ZCD disabled +// 0x1 = HP ZCD enabled +// 4 MUTE_HP Mute the headphone outputs, 0 = Unmute, 1 = Mute (default) +// 2 SELECT_ADC Select the ADC input, 0 = Microphone, 1 = LINEIN +// 1 EN_ZCD_ADC Enable the ADC analog zero cross detector (ZCD) +// 0x0 = ADC ZCD disabled +// 0x1 = ADC ZCD enabled +// 0 MUTE_ADC Mute the ADC analog volume, 0 = Unmute, 1 = Mute (default) + +#define CHIP_LINREG_CTRL 0x0026 +// 6 VDDC_MAN_ASSN Determines chargepump source when VDDC_ASSN_OVRD is set. +// 0x0 = VDDA +// 0x1 = VDDIO +// 5 VDDC_ASSN_OVRD Charge pump Source Assignment Override +// 0x0 = Charge pump source is automatically assigned based +// on higher of VDDA and VDDIO +// 0x1 = the source of charge pump is manually assigned by +// VDDC_MAN_ASSN If VDDIO and VDDA are both the same +// and greater than 3.1 V, VDDC_ASSN_OVRD and +// VDDC_MAN_ASSN should be used to manually assign +// VDDIO as the source for charge pump. +// 3:0 D_PROGRAMMING Sets the VDDD linear regulator output voltage in 50 mV steps. +// Must clear the LINREG_SIMPLE_POWERUP and STARTUP_POWERUP bits +// in the 0x0030 (CHIP_ANA_POWER) register after power-up, for +// this setting to produce the proper VDDD voltage. +// 0x0 = 1.60 +// 0xF = 0.85 + +#define CHIP_REF_CTRL 0x0028 // bandgap reference bias voltage and currents +// 8:4 VAG_VAL Analog Ground Voltage Control +// These bits control the analog ground voltage in 25 mV steps. +// This should usually be set to VDDA/2 or lower for best +// performance (maximum output swing at minimum THD). This VAG +// reference is also used for the DAC and ADC voltage reference. +// So changing this voltage scales the output swing of the DAC +// and the output signal of the ADC. +// 0x00 = 0.800 V +// 0x1F = 1.575 V +// 3:1 BIAS_CTRL Bias control +// These bits adjust the bias currents for all of the analog +// blocks. By lowering the bias current a lower quiescent power +// is achieved. It should be noted that this mode can affect +// performance by 3-4 dB. +// 0x0 = Nominal +// 0x1-0x3=+12.5% +// 0x4=-12.5% +// 0x5=-25% +// 0x6=-37.5% +// 0x7=-50% +// 0 SMALL_POP VAG Ramp Control +// Setting this bit slows down the VAG ramp from ~200 to ~400 ms +// to reduce the startup pop, but increases the turn on/off time. +// 0x0 = Normal VAG ramp +// 0x1 = Slow down VAG ramp + +#define CHIP_MIC_CTRL 0x002A // microphone gain & internal microphone bias +// 9:8 BIAS_RESISTOR MIC Bias Output Impedance Adjustment +// Controls an adjustable output impedance for the microphone bias. +// If this is set to zero the micbias block is powered off and +// the output is highZ. +// 0x0 = Powered off +// 0x1 = 2.0 kohm +// 0x2 = 4.0 kohm +// 0x3 = 8.0 kohm +// 6:4 BIAS_VOLT MIC Bias Voltage Adjustment +// Controls an adjustable bias voltage for the microphone bias +// amp in 250 mV steps. This bias voltage setting should be no +// more than VDDA-200 mV for adequate power supply rejection. +// 0x0 = 1.25 V +// ... +// 0x7 = 3.00 V +// 1:0 GAIN MIC Amplifier Gain +// Sets the microphone amplifier gain. At 0 dB setting the THD +// can be slightly higher than other paths- typically around +// ~65 dB. At other gain settings the THD are better. +// 0x0 = 0 dB +// 0x1 = +20 dB +// 0x2 = +30 dB +// 0x3 = +40 dB + +#define CHIP_LINE_OUT_CTRL 0x002C +// 11:8 OUT_CURRENT Controls the output bias current for the LINEOUT amplifiers. The +// nominal recommended setting for a 10 kohm load with 1.0 nF load cap +// is 0x3. There are only 5 valid settings. +// 0x0=0.18 mA +// 0x1=0.27 mA +// 0x3=0.36 mA +// 0x7=0.45 mA +// 0xF=0.54 mA +// 5:0 LO_VAGCNTRL LINEOUT Amplifier Analog Ground Voltage +// Controls the analog ground voltage for the LINEOUT amplifiers +// in 25 mV steps. This should usually be set to VDDIO/2. +// 0x00 = 0.800 V +// ... +// 0x1F = 1.575 V +// ... +// 0x23 = 1.675 V +// 0x24-0x3F are invalid + +#define CHIP_LINE_OUT_VOL 0x002E +// 12:8 LO_VOL_RIGHT LINEOUT Right Channel Volume (default=4) +// Controls the right channel LINEOUT volume in 0.5 dB steps. +// Higher codes have more attenuation. +// 4:0 LO_VOL_LEFT LINEOUT Left Channel Output Level (default=4) +// Used to normalize the output level of the left line output +// to full scale based on the values used to set +// LINE_OUT_CTRL->LO_VAGCNTRL and CHIP_REF_CTRL->VAG_VAL. +// In general this field should be set to: +// 40*log((VAG_VAL)/(LO_VAGCNTRL)) + 15 +// Suggested values based on typical VDDIO and VDDA voltages. +// VDDA VAG_VAL VDDIO LO_VAGCNTRL LO_VOL_* +// 1.8 V 0.9 3.3 V 1.55 0x06 +// 1.8 V 0.9 1.8 V 0.9 0x0F +// 3.3 V 1.55 1.8 V 0.9 0x19 +// 3.3 V 1.55 3.3 V 1.55 0x0F +// After setting to the nominal voltage, this field can be used +// to adjust the output level in +/-0.5 dB increments by using +// values higher or lower than the nominal setting. + +#define CHIP_ANA_POWER 0x0030 // power down controls for the analog blocks. + // The only other power-down controls are BIAS_RESISTOR in the MIC_CTRL register + // and the EN_ZCD control bits in ANA_CTRL. +// 14 DAC_MONO While DAC_POWERUP is set, this allows the DAC to be put into left only +// mono operation for power savings. 0=mono, 1=stereo (default) +// 13 LINREG_SIMPLE_POWERUP Power up the simple (low power) digital supply regulator. +// After reset, this bit can be cleared IF VDDD is driven +// externally OR the primary digital linreg is enabled with +// LINREG_D_POWERUP +// 12 STARTUP_POWERUP Power up the circuitry needed during the power up ramp and reset. +// After reset this bit can be cleared if VDDD is coming from +// an external source. +// 11 VDDC_CHRGPMP_POWERUP Power up the VDDC charge pump block. If neither VDDA or VDDIO +// is 3.0 V or larger this bit should be cleared before analog +// blocks are powered up. +// 10 PLL_POWERUP PLL Power Up, 0 = Power down, 1 = Power up +// When cleared, the PLL is turned off. This must be set before +// CHIP_CLK_CTRL->MCLK_FREQ is programmed to 0x3. The +// CHIP_PLL_CTRL register must be configured correctly before +// setting this bit. +// 9 LINREG_D_POWERUP Power up the primary VDDD linear regulator, 0 = Power down, 1 = Power up +// 8 VCOAMP_POWERUP Power up the PLL VCO amplifier, 0 = Power down, 1 = Power up +// 7 VAG_POWERUP Power up the VAG reference buffer. +// Setting this bit starts the power up ramp for the headphone +// and LINEOUT. The headphone (and/or LINEOUT) powerup should +// be set BEFORE clearing this bit. When this bit is cleared +// the power-down ramp is started. The headphone (and/or LINEOUT) +// powerup should stay set until the VAG is fully ramped down +// (200 to 400 ms after clearing this bit). +// 0x0 = Power down, 0x1 = Power up +// 6 ADC_MONO While ADC_POWERUP is set, this allows the ADC to be put into left only +// mono operation for power savings. This mode is useful when +// only using the microphone input. +// 0x0 = Mono (left only), 0x1 = Stereo +// 5 REFTOP_POWERUP Power up the reference bias currents +// 0x0 = Power down, 0x1 = Power up +// This bit can be cleared when the part is a sleep state +// to minimize analog power. +// 4 HEADPHONE_POWERUP Power up the headphone amplifiers +// 0x0 = Power down, 0x1 = Power up +// 3 DAC_POWERUP Power up the DACs +// 0x0 = Power down, 0x1 = Power up +// 2 CAPLESS_HEADPHONE_POWERUP Power up the capless headphone mode +// 0x0 = Power down, 0x1 = Power up +// 1 ADC_POWERUP Power up the ADCs +// 0x0 = Power down, 0x1 = Power up +// 0 LINEOUT_POWERUP Power up the LINEOUT amplifiers +// 0x0 = Power down, 0x1 = Power up + +#define CHIP_PLL_CTRL 0x0032 +// 15:11 INT_DIVISOR +// 10:0 FRAC_DIVISOR + +#define CHIP_CLK_TOP_CTRL 0x0034 +// 11 ENABLE_INT_OSC Setting this bit enables an internal oscillator to be used for the +// zero cross detectors, the short detect recovery, and the +// charge pump. This allows the I2S clock to be shut off while +// still operating an analog signal path. This bit can be kept +// on when the I2S clock is enabled, but the I2S clock is more +// accurate so it is preferred to clear this bit when I2S is present. +// 3 INPUT_FREQ_DIV2 SYS_MCLK divider before PLL input +// 0x0 = pass through +// 0x1 = SYS_MCLK is divided by 2 before entering PLL +// This must be set when the input clock is above 17 Mhz. This +// has no effect when the PLL is powered down. + +#define CHIP_ANA_STATUS 0x0036 +// 9 LRSHORT_STS This bit is high whenever a short is detected on the left or right +// channel headphone drivers. +// 8 CSHORT_STS This bit is high whenever a short is detected on the capless headphone +// common/center channel driver. +// 4 PLL_IS_LOCKED This bit goes high after the PLL is locked. + +#define CHIP_ANA_TEST1 0x0038 // intended only for debug. +#define CHIP_ANA_TEST2 0x003A // intended only for debug. + +#define CHIP_SHORT_CTRL 0x003C +// 14:12 LVLADJR Right channel headphone short detector in 25 mA steps. +// 0x3=25 mA +// 0x2=50 mA +// 0x1=75 mA +// 0x0=100 mA +// 0x4=125 mA +// 0x5=150 mA +// 0x6=175 mA +// 0x7=200 mA +// This trip point can vary by ~30% over process so leave plenty +// of guard band to avoid false trips. This short detect trip +// point is also effected by the bias current adjustments made +// by CHIP_REF_CTRL->BIAS_CTRL and by CHIP_ANA_TEST1->HP_IALL_ADJ. +// 10:8 LVLADJL Left channel headphone short detector in 25 mA steps. +// (same scale as LVLADJR) +// 6:4 LVLADJC Capless headphone center channel short detector in 50 mA steps. +// 0x3=50 mA +// 0x2=100 mA +// 0x1=150 mA +// 0x0=200 mA +// 0x4=250 mA +// 0x5=300 mA +// 0x6=350 mA +// 0x7=400 mA +// 3:2 MODE_LR Behavior of left/right short detection +// 0x0 = Disable short detector, reset short detect latch, +// software view non-latched short signal +// 0x1 = Enable short detector and reset the latch at timeout +// (every ~50 ms) +// 0x2 = This mode is not used/invalid +// 0x3 = Enable short detector with only manual reset (have +// to return to 0x0 to reset the latch) +// 1:0 MODE_CM Behavior of capless headphone central short detection +// (same settings as MODE_LR) + +#define DAP_CONTROL 0x0100 +#define DAP_PEQ 0x0102 +#define DAP_BASS_ENHANCE 0x0104 +#define DAP_BASS_ENHANCE_CTRL 0x0106 +#define DAP_AUDIO_EQ 0x0108 +#define DAP_SGTL_SURROUND 0x010A +#define DAP_FILTER_COEF_ACCESS 0x010C +#define DAP_COEF_WR_B0_MSB 0x010E +#define DAP_COEF_WR_B0_LSB 0x0110 +#define DAP_AUDIO_EQ_BASS_BAND0 0x0116 // 115 Hz +#define DAP_AUDIO_EQ_BAND1 0x0118 // 330 Hz +#define DAP_AUDIO_EQ_BAND2 0x011A // 990 Hz +#define DAP_AUDIO_EQ_BAND3 0x011C // 3000 Hz +#define DAP_AUDIO_EQ_TREBLE_BAND4 0x011E // 9900 Hz +#define DAP_MAIN_CHAN 0x0120 +#define DAP_MIX_CHAN 0x0122 +#define DAP_AVC_CTRL 0x0124 +#define DAP_AVC_THRESHOLD 0x0126 +#define DAP_AVC_ATTACK 0x0128 +#define DAP_AVC_DECAY 0x012A +#define DAP_COEF_WR_B1_MSB 0x012C +#define DAP_COEF_WR_B1_LSB 0x012E +#define DAP_COEF_WR_B2_MSB 0x0130 +#define DAP_COEF_WR_B2_LSB 0x0132 +#define DAP_COEF_WR_A1_MSB 0x0134 +#define DAP_COEF_WR_A1_LSB 0x0136 +#define DAP_COEF_WR_A2_MSB 0x0138 +#define DAP_COEF_WR_A2_LSB 0x013A + +#define SGTL5000_I2C_ADDR_CS_LOW 0x0A // CTRL_ADR0_CS pin low (normal configuration) +#define SGTL5000_I2C_ADDR_CS_HIGH 0x2A // CTRL_ADR0_CS pin high + + +void AudioControlSGTL5000::setAddress(uint8_t level) +{ + if (level == LOW) { + i2c_addr = SGTL5000_I2C_ADDR_CS_LOW; + } else { + i2c_addr = SGTL5000_I2C_ADDR_CS_HIGH; + } +} + +bool AudioControlSGTL5000::enable(void) { +#if defined(KINETISL) + return enable(16000000); // SGTL as Master with 16MHz MCLK from Teensy LC +#else + return enable(0); +#endif +} + +bool AudioControlSGTL5000::enable(const unsigned extMCLK, const uint32_t pllFreq) +{ + + //Wire.setSDA(4); + //Wire.setSCL(5); + Wire.begin(); + delay(5); + + //Check if we are in Master Mode and if the Teensy had a reset: + int n = read(CHIP_I2S_CTRL); +// DEBUG_PRINTF("chip i2s ctl: %d\n", n); + if ( (extMCLK > 0) && (n == (0x0030 | (1<<7))) ) { + //Yes. Do not initialize. + muted = false; + semi_automated = true; + return true; + } + + DEBUG_PRINT("chip ID = "); + delay(5); + n = read(CHIP_ID); + DEBUG_PRINTLN(n); + + muted = true; + + int r = write(CHIP_ANA_POWER, 0x4060); // VDDD is externally driven with 1.8V + if (!r) return false; + write(CHIP_LINREG_CTRL, 0x006C); // VDDA & VDDIO both over 3.1V + write(CHIP_REF_CTRL, 0x01F2); // VAG=1.575, normal ramp, +12.5% bias current + write(CHIP_LINE_OUT_CTRL, 0x0F22); // LO_VAGCNTRL=1.65V, OUT_CURRENT=0.54mA + write(CHIP_SHORT_CTRL, 0x4446); // allow up to 125mA + write(CHIP_ANA_CTRL, 0x0137); // enable zero cross detectors + + if (extMCLK > 0) { + //SGTL is I2S Master + //Datasheet Pg. 14: Using the PLL - Asynchronous SYS_MCLK input + if (extMCLK > 17000000) { + write(CHIP_CLK_TOP_CTRL, 1); + } else { + write(CHIP_CLK_TOP_CTRL, 0); + } + + uint32_t int_divisor = (pllFreq / extMCLK) & 0x1f; + uint32_t frac_divisor = (uint32_t)((((float)pllFreq / extMCLK) - int_divisor) * 2048.0f) & 0x7ff; + + write(CHIP_PLL_CTRL, (int_divisor << 11) | frac_divisor); + write(CHIP_ANA_POWER, 0x40FF | (1<<10) | (1<<8) ); // power up: lineout, hp, adc, dac, PLL_POWERUP, VCOAMP_POWERUP + } else { + //SGTL is I2S Slave + write(CHIP_ANA_POWER, 0x40FF); // power up: lineout, hp, adc, dac + } + + write(CHIP_DIG_POWER, 0x0073); // power up all digital stuff + delay(400); + write(CHIP_LINE_OUT_VOL, 0x1D1D); // default approx 1.3 volts peak-to-peak + + if (extMCLK > 0) { + //SGTL is I2S Master + write(CHIP_CLK_CTRL, 0x0004 | 0x03); // 44.1 kHz, 256*Fs, use PLL + write(CHIP_I2S_CTRL, 0x0030 | (1<<7)); // SCLK=64*Fs, 16bit, I2S format + } else { + //SGTL is I2S Slave + // write(CHIP_CLK_CTRL, 0x0004); // 44.1 kHz, 256*Fs + // write(CHIP_CLK_CTRL, 0b01001); // 48 kHz, 384*Fs + // write(CHIP_CLK_CTRL, 0b01010); // 48 kHz, 512*Fs + if (kSampleRate == 48000) { + write(CHIP_CLK_CTRL, 0b001000); // 48 kHz, 256*Fs (SYS_FS=2, MCLK_FREQ=0) + } else if (kSampleRate == 44100) { + write(CHIP_CLK_CTRL, 0b000100); // 44.1 kHz, 256*Fs (SYS_FS=1, MCLK_FREQ=0) + } else if (kSampleRate == 32000) { + write(CHIP_CLK_CTRL, 0b000000); // 32 kHz, 256*Fs (SYS_FS=0, MCLK_FREQ=0) + } else if (kSampleRate == 24000) { + write(CHIP_CLK_CTRL, 0b011000); // 24 kHz, 256*Fs (RATE_MODE=1, SYS_FS=2) + } else if (kSampleRate == 96000) { //untested + write(CHIP_CLK_CTRL, 0b001100); // 96 kHz, 256*Fs (SYS_FS=3, MCLK_FREQ=0) + } else { + panic("Unsupported sample rate for SGTL5000"); + } + + + // write(CHIP_I2S_CTRL, 0x0030); // SCLK=64*Fs, 16bit, I2S format + + write(CHIP_I2S_CTRL, 0x0000); // SCLK=64*Fs, 32bit, I2S format + // write(CHIP_I2S_CTRL, 0b0010); // SCLK=64*Fs, 32bit, I2S format, lralign + + } + + // default signal routing is ok? + write(CHIP_SSS_CTRL, 0x0010); // ADC->I2S, I2S->DAC + write(CHIP_ADCDAC_CTRL, 0x0000); // disable dac mute + write(CHIP_DAC_VOL, 0x3C3C); // digital gain, 0dB + write(CHIP_ANA_HP_CTRL, 0x7F7F); // set volume (lowest level) + write(CHIP_ANA_CTRL, 0x0036); // enable zero cross detectors + + semi_automated = true; + return true; +} + + +unsigned int AudioControlSGTL5000::read(unsigned int reg) +{ + unsigned int val; + Wire.beginTransmission(i2c_addr); + Wire.write(reg >> 8); + Wire.write(reg); + int res = Wire.endTransmission(false); + if (res != 0) { + + return -res; + } + if (Wire.requestFrom((int)i2c_addr, 2) < 2) return -2; + val = Wire.read() << 8; + val |= Wire.read(); + return val; +} + +bool AudioControlSGTL5000::write(unsigned int reg, unsigned int val) +{ + if (reg == CHIP_ANA_CTRL) ana_ctrl = val; + Wire.beginTransmission(i2c_addr); + Wire.write(reg >> 8); + Wire.write(reg); + Wire.write(val >> 8); + Wire.write(val); + if (Wire.endTransmission() == 0) return true; + return false; +} + +unsigned int AudioControlSGTL5000::modify(unsigned int reg, unsigned int val, unsigned int iMask) +{ + unsigned int val1 = (read(reg)&(~iMask))|val; + if(!write(reg,val1)) return 0; + return val1; +} + +bool AudioControlSGTL5000::volumeInteger(unsigned int n) +{ + if (n == 0) { + muted = true; + write(CHIP_ANA_HP_CTRL, 0x7F7F); + return muteHeadphone(); + } else if (n > 0x80) { + n = 0; + } else { + n = 0x80 - n; + } + if (muted) { + muted = false; + unmuteHeadphone(); + } + n = n | (n << 8); + return write(CHIP_ANA_HP_CTRL, n); // set volume +} + +bool AudioControlSGTL5000::volume(float left, float right) +{ + unsigned short m=((0x7F-calcVol(right,0x7F))<<8)|(0x7F-calcVol(left,0x7F)); + return write(CHIP_ANA_HP_CTRL, m); +} + +bool AudioControlSGTL5000::micGain(unsigned int dB) +{ + unsigned int preamp_gain, input_gain; + + if (dB >= 40) { + preamp_gain = 3; + dB -= 40; + } else if (dB >= 30) { + preamp_gain = 2; + dB -= 30; + } else if (dB >= 20) { + preamp_gain = 1; + dB -= 20; + } else { + preamp_gain = 0; + } + input_gain = (dB * 2) / 3; + if (input_gain > 15) input_gain = 15; + + return write(CHIP_MIC_CTRL, 0x0170 | preamp_gain) + && write(CHIP_ANA_ADC_CTRL, (input_gain << 4) | input_gain); +} + +// CHIP_ANA_ADC_CTRL +// Actual measured full-scale peak-to-peak sine wave input for max signal +// 0: 3.12 Volts p-p +// 1: 2.63 Volts p-p +// 2: 2.22 Volts p-p +// 3: 1.87 Volts p-p +// 4: 1.58 Volts p-p +// 5: 1.33 Volts p-p +// 6: 1.11 Volts p-p +// 7: 0.94 Volts p-p +// 8: 0.79 Volts p-p +// 9: 0.67 Volts p-p +// 10: 0.56 Volts p-p +// 11: 0.48 Volts p-p +// 12: 0.40 Volts p-p +// 13: 0.34 Volts p-p +// 14: 0.29 Volts p-p +// 15: 0.24 Volts p-p +bool AudioControlSGTL5000::lineInLevel(uint8_t left, uint8_t right) +{ + if (left > 15) left = 15; + if (right > 15) right = 15; + return write(CHIP_ANA_ADC_CTRL, (left << 4) | right); +} + +// CHIP_LINE_OUT_VOL +// Actual measured full-scale peak-to-peak sine wave output voltage: +// 0-12: output has clipping +// 13: 3.16 Volts p-p +// 14: 2.98 Volts p-p +// 15: 2.83 Volts p-p +// 16: 2.67 Volts p-p +// 17: 2.53 Volts p-p +// 18: 2.39 Volts p-p +// 19: 2.26 Volts p-p +// 20: 2.14 Volts p-p +// 21: 2.02 Volts p-p +// 22: 1.91 Volts p-p +// 23: 1.80 Volts p-p +// 24: 1.71 Volts p-p +// 25: 1.62 Volts p-p +// 26: 1.53 Volts p-p +// 27: 1.44 Volts p-p +// 28: 1.37 Volts p-p +// 29: 1.29 Volts p-p +// 30: 1.22 Volts p-p +// 31: 1.16 Volts p-p +unsigned short AudioControlSGTL5000::lineOutLevel(uint8_t n) +{ + if (n > 31) n = 31; + else if (n < 13) n = 13; + return modify(CHIP_LINE_OUT_VOL,(n<<8)|n,(31<<8)|31); +} + +unsigned short AudioControlSGTL5000::lineOutLevel(uint8_t left, uint8_t right) +{ + if (left > 31) left = 31; + else if (left < 13) left = 13; + if (right > 31) right = 31; + else if (right < 13) right = 13; + return modify(CHIP_LINE_OUT_VOL,(right<<8)|left,(31<<8)|31); +} + +unsigned short AudioControlSGTL5000::dacVolume(float n) // set both directly +{ + //DEBUG_PRINTF("ADCDAC_CTRL %d\n", read(CHIP_ADCDAC_CTRL)); + if ((read(CHIP_ADCDAC_CTRL)&(3<<2)) != ((n>0 ? 0:3)<<2)) { + modify(CHIP_ADCDAC_CTRL,(n>0 ? 0:3)<<2,3<<2); + } + unsigned char m=calcVol(n,0xC0); + return modify(CHIP_DAC_VOL,((0xFC-m)<<8)|(0xFC-m),65535); +} +unsigned short AudioControlSGTL5000::dacVolume(float left, float right) +{ + unsigned short adcdac=((right>0 ? 0:2)|(left>0 ? 0:1))<<2; + if ((read(CHIP_ADCDAC_CTRL)&(3<<2)) != adcdac) { + modify(CHIP_ADCDAC_CTRL,adcdac,1<<2); + } + unsigned short m=(0xFC-calcVol(right,0xC0))<<8|(0xFC-calcVol(left,0xC0)); + return modify(CHIP_DAC_VOL,m,65535); +} + +bool AudioControlSGTL5000::dacVolumeRamp() +{ + return modify(CHIP_ADCDAC_CTRL, 0x300, 0x300); +} + +bool AudioControlSGTL5000::dacVolumeRampLinear() +{ + return modify(CHIP_ADCDAC_CTRL, 0x200, 0x300); +} + +bool AudioControlSGTL5000::dacVolumeRampDisable() +{ + return modify(CHIP_ADCDAC_CTRL, 0, 0x300); +} + + + + +unsigned short AudioControlSGTL5000::adcHighPassFilterEnable(void) +{ + return modify(CHIP_ADCDAC_CTRL, 0, 3); +} + +unsigned short AudioControlSGTL5000::adcHighPassFilterFreeze(void) +{ + return modify(CHIP_ADCDAC_CTRL, 2, 3); +} + +unsigned short AudioControlSGTL5000::adcHighPassFilterDisable(void) +{ + return modify(CHIP_ADCDAC_CTRL, 1, 3); +} + + +// DAP_CONTROL + +unsigned short AudioControlSGTL5000::audioPreProcessorEnable(void) +{ + // audio processor used to pre-process analog input before Teensy + return write(DAP_CONTROL, 1) && write(CHIP_SSS_CTRL, 0x0013); +} + +unsigned short AudioControlSGTL5000::audioPostProcessorEnable(void) +{ + // audio processor used to post-process Teensy output before headphones/lineout + return write(DAP_CONTROL, 1) && write(CHIP_SSS_CTRL, 0x0070); +} + +unsigned short AudioControlSGTL5000::audioProcessorDisable(void) +{ + return write(CHIP_SSS_CTRL, 0x0010) && write(DAP_CONTROL, 0); +} + + +// DAP_PEQ +unsigned short AudioControlSGTL5000::eqFilterCount(uint8_t n) // valid to n&7, 0 thru 7 filters enabled. +{ + return modify(DAP_PEQ,(n&7),7); +} + +// DAP_AUDIO_EQ +unsigned short AudioControlSGTL5000::eqSelect(uint8_t n) // 0=NONE, 1=PEQ (7 IIR Biquad filters), 2=TONE (tone), 3=GEQ (5 band EQ) +{ + return modify(DAP_AUDIO_EQ,n&3,3); +} + +unsigned short AudioControlSGTL5000::eqBand(uint8_t bandNum, float n) +{ + if(semi_automated) automate(1,3); + return dap_audio_eq_band(bandNum, n); +} +void AudioControlSGTL5000::eqBands(float bass, float mid_bass, float midrange, float mid_treble, float treble) +{ + if(semi_automated) automate(1,3); + dap_audio_eq_band(0,bass); + dap_audio_eq_band(1,mid_bass); + dap_audio_eq_band(2,midrange); + dap_audio_eq_band(3,mid_treble); + dap_audio_eq_band(4,treble); +} +void AudioControlSGTL5000::eqBands(float bass, float treble) // dap_audio_eq(2); +{ + if(semi_automated) automate(1,2); + dap_audio_eq_band(0,bass); + dap_audio_eq_band(4,treble); +} + +// SGTL5000 PEQ Coefficient loader +void AudioControlSGTL5000::eqFilter(uint8_t filterNum, int *filterParameters) +{ + // TODO: add the part that selects 7 PEQ filters. + if(semi_automated) automate(1,1,filterNum+1); + modify(DAP_FILTER_COEF_ACCESS,(uint16_t)filterNum,15); + write(DAP_COEF_WR_B0_MSB,(*filterParameters>>4)&65535); + write(DAP_COEF_WR_B0_LSB,(*filterParameters++)&15); + write(DAP_COEF_WR_B1_MSB,(*filterParameters>>4)&65535); + write(DAP_COEF_WR_B1_LSB,(*filterParameters++)&15); + write(DAP_COEF_WR_B2_MSB,(*filterParameters>>4)&65535); + write(DAP_COEF_WR_B2_LSB,(*filterParameters++)&15); + write(DAP_COEF_WR_A1_MSB,(*filterParameters>>4)&65535); + write(DAP_COEF_WR_A1_LSB,(*filterParameters++)&15); + write(DAP_COEF_WR_A2_MSB,(*filterParameters>>4)&65535); + write(DAP_COEF_WR_A2_LSB,(*filterParameters++)&15); + write(DAP_FILTER_COEF_ACCESS,(uint16_t)0x100|filterNum); +} + +/* Valid values for dap_avc parameters + + maxGain; Maximum gain that can be applied + 0 - 0 dB + 1 - 6.0 dB + 2 - 12 dB + + lbiResponse; Integrator Response + 0 - 0 mS + 1 - 25 mS + 2 - 50 mS + 3 - 100 mS + + hardLimit + 0 - Hard limit disabled. AVC Compressor/Expander enabled. + 1 - Hard limit enabled. The signal is limited to the programmed threshold (signal saturates at the threshold) + + threshold + floating point in range 0 to -96 dB + + attack + floating point figure is dB/s rate at which gain is increased + + decay + floating point figure is dB/s rate at which gain is reduced +*/ +unsigned short AudioControlSGTL5000::autoVolumeControl(uint8_t maxGain, uint8_t lbiResponse, uint8_t hardLimit, float threshold, float attack, float decay) +{ + //if(semi_automated&&(!read(DAP_CONTROL)&1)) audioProcessorEnable(); + if(maxGain>2) maxGain=2; + lbiResponse&=3; + hardLimit&=1; + uint8_t thresh=(pow(10,threshold/20)*0.636)*pow(2,15); + uint8_t att=(1-pow(10,-(attack/(20*44100))))*pow(2,19); + uint8_t dec=(1-pow(10,-(decay/(20*44100))))*pow(2,23); + write(DAP_AVC_THRESHOLD,thresh); + write(DAP_AVC_ATTACK,att); + write(DAP_AVC_DECAY,dec); + return modify(DAP_AVC_CTRL,maxGain<<12|lbiResponse<<8|hardLimit<<5,3<<12|3<<8|1<<5); +} +unsigned short AudioControlSGTL5000::autoVolumeEnable(void) +{ + return modify(DAP_AVC_CTRL, 1, 1); +} +unsigned short AudioControlSGTL5000::autoVolumeDisable(void) +{ + return modify(DAP_AVC_CTRL, 0, 1); +} + +unsigned short AudioControlSGTL5000::enhanceBass(float lr_lev, float bass_lev) +{ + return modify(DAP_BASS_ENHANCE_CTRL,((0x3F-calcVol(lr_lev,0x3F))<<8) | (0x7F-calcVol(bass_lev,0x7F)), (0x3F<<8) | 0x7F); +} +unsigned short AudioControlSGTL5000::enhanceBass(float lr_lev, float bass_lev, uint8_t hpf_bypass, uint8_t cutoff) +{ + modify(DAP_BASS_ENHANCE,(hpf_bypass&1)<<8|(cutoff&7)<<4,1<<8|7<<4); + return enhanceBass(lr_lev,bass_lev); +} +unsigned short AudioControlSGTL5000::enhanceBassEnable(void) +{ + return modify(DAP_BASS_ENHANCE, 1, 1); +} +unsigned short AudioControlSGTL5000::enhanceBassDisable(void) +{ + return modify(DAP_BASS_ENHANCE, 0, 1); +} +unsigned short AudioControlSGTL5000::surroundSound(uint8_t width) +{ + return modify(DAP_SGTL_SURROUND,(width&7)<<4,7<<4); +} +unsigned short AudioControlSGTL5000::surroundSound(uint8_t width, uint8_t select) +{ + return modify(DAP_SGTL_SURROUND,((width&7)<<4)|(select&3), (7<<4)|3); +} +unsigned short AudioControlSGTL5000::surroundSoundEnable(void) +{ + return modify(DAP_SGTL_SURROUND, 3, 3); +} +unsigned short AudioControlSGTL5000::surroundSoundDisable(void) +{ + return modify(DAP_SGTL_SURROUND, 0, 3); +} + +unsigned char AudioControlSGTL5000::calcVol(float n, unsigned char range) +{ + // n=(n*(((float)range)/100))+0.499; + n=(n*(float)range)+0.499; + if ((unsigned char)n>range) n=range; + return (unsigned char)n; +} + +// DAP_AUDIO_EQ_BASS_BAND0 & DAP_AUDIO_EQ_BAND1 & DAP_AUDIO_EQ_BAND2 etc etc +unsigned short AudioControlSGTL5000::dap_audio_eq_band(uint8_t bandNum, float n) // by signed percentage -100/+100; dap_audio_eq(3); +{ + n=(n*48)+0.499; + if(n<-47) n=-47; + if(n>48) n=48; + n+=47; + return modify(DAP_AUDIO_EQ_BASS_BAND0+(bandNum*2),(unsigned int)n,127); +} + +void AudioControlSGTL5000::automate(uint8_t dap, uint8_t eq) +{ + //if((dap!=0)&&(!(read(DAP_CONTROL)&1))) audioProcessorEnable(); + if((read(DAP_AUDIO_EQ)&3) != eq) eqSelect(eq); +} + +void AudioControlSGTL5000::automate(uint8_t dap, uint8_t eq, uint8_t filterCount) +{ + automate(dap,eq); + if (filterCount > (read(DAP_PEQ)&7)) eqFilterCount(filterCount); +} + + +// if(SGTL5000_PEQ) quantization_unit=524288; if(AudioFilterBiquad) quantization_unit=2147483648; +void calcBiquad(uint8_t filtertype, float fC, float dB_Gain, float Q, uint32_t quantization_unit, uint32_t fS, int *coef) +{ + +// I used resources like http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt +// to make this routine, I tested most of the filter types and they worked. Such filters have limits and +// before calling this routine with varying values the end user should check that those values are limited +// to valid results. + + float A; + if(filtertype // github.com/PaulStoffregen/cores/blob/master/teensy4/AudioStream.h +#include "AudioControl.h" + +// SGTL5000-specific defines for headphones +#define AUDIO_HEADPHONE_DAC 0 +#define AUDIO_HEADPHONE_LINEIN 1 + +#define AUDIO_SAMPLE_RATE_EXACT 48000 + +class AudioControlSGTL5000 : public AudioControl +{ +public: + AudioControlSGTL5000(void) : i2c_addr(0x0A) { } + void setAddress(uint8_t level); + bool enable(void);//For Teensy LC the SGTL acts as master, for all other Teensys as slave. + bool enable(const unsigned extMCLK, const uint32_t pllFreq = (4096.0l * AUDIO_SAMPLE_RATE_EXACT) ); //With extMCLK > 0, the SGTL acts as Master + bool disable(void) { return false; } + bool volume(float n) { return volumeInteger(n * 129 + 0.499f); } + bool inputLevel(float n) {return false;} + bool muteHeadphone(void) { return write(0x0024, ana_ctrl | (1<<4)); } + bool unmuteHeadphone(void) { return write(0x0024, ana_ctrl & ~(1<<4)); } + bool muteLineout(void) { return write(0x0024, ana_ctrl | (1<<8)); } + bool unmuteLineout(void) { return write(0x0024, ana_ctrl & ~(1<<8)); } + bool inputSelect(int n) { + if (n == AUDIO_INPUT_LINEIN) { + return write(0x0020, 0x055) // +7.5dB gain (1.3Vp-p full scale) + && write(0x0024, ana_ctrl | (1<<2)); // enable linein + } else if (n == AUDIO_INPUT_MIC) { + return write(0x002A, 0x0173) // mic preamp gain = +40dB + && write(0x0020, 0x088) // input gain +12dB (is this enough?) + && write(0x0024, ana_ctrl & ~(1<<2)); // enable mic + } else { + return false; + } + } + bool headphoneSelect(int n) { + if (n == AUDIO_HEADPHONE_DAC) { + return write(0x0024, ana_ctrl | (1<<6)); // route DAC to headphones out + } else if (n == AUDIO_HEADPHONE_LINEIN) { + return write(0x0024, ana_ctrl & ~(1<<6)); // route linein to headphones out + } else { + return false; + } + } + bool volume(float left, float right); + bool micGain(unsigned int dB); + bool lineInLevel(uint8_t n) { return lineInLevel(n, n); } + bool lineInLevel(uint8_t left, uint8_t right); + unsigned short lineOutLevel(uint8_t n); + unsigned short lineOutLevel(uint8_t left, uint8_t right); + unsigned short dacVolume(float n); + unsigned short dacVolume(float left, float right); + bool dacVolumeRamp(); + bool dacVolumeRampLinear(); + bool dacVolumeRampDisable(); + unsigned short adcHighPassFilterEnable(void); + unsigned short adcHighPassFilterFreeze(void); + unsigned short adcHighPassFilterDisable(void); + unsigned short audioPreProcessorEnable(void); + unsigned short audioPostProcessorEnable(void); + unsigned short audioProcessorDisable(void); + unsigned short eqFilterCount(uint8_t n); + unsigned short eqSelect(uint8_t n); + unsigned short eqBand(uint8_t bandNum, float n); + void eqBands(float bass, float mid_bass, float midrange, float mid_treble, float treble); + void eqBands(float bass, float treble); + void eqFilter(uint8_t filterNum, int *filterParameters); + unsigned short autoVolumeControl(uint8_t maxGain, uint8_t lbiResponse, uint8_t hardLimit, float threshold, float attack, float decay); + unsigned short autoVolumeEnable(void); + unsigned short autoVolumeDisable(void); + unsigned short enhanceBass(float lr_lev, float bass_lev); + unsigned short enhanceBass(float lr_lev, float bass_lev, uint8_t hpf_bypass, uint8_t cutoff); + unsigned short enhanceBassEnable(void); + unsigned short enhanceBassDisable(void); + unsigned short surroundSound(uint8_t width); + unsigned short surroundSound(uint8_t width, uint8_t select); + unsigned short surroundSoundEnable(void); + unsigned short surroundSoundDisable(void); + void killAutomation(void) { semi_automated=false; } + void setMasterMode(uint32_t freqMCLK_in); + +protected: + bool muted; + bool volumeInteger(unsigned int n); // range: 0x00 to 0x80 + uint16_t ana_ctrl; + uint8_t i2c_addr; + unsigned char calcVol(float n, unsigned char range); + unsigned int read(unsigned int reg); + bool write(unsigned int reg, unsigned int val); + unsigned int modify(unsigned int reg, unsigned int val, unsigned int iMask); + unsigned short dap_audio_eq_band(uint8_t bandNum, float n); +private: + bool semi_automated; + void automate(uint8_t dap, uint8_t eq); + void automate(uint8_t dap, uint8_t eq, uint8_t filterCount); +}; + +//For Filter Type: 0 = LPF, 1 = HPF, 2 = BPF, 3 = NOTCH, 4 = PeakingEQ, 5 = LowShelf, 6 = HighShelf + #define FILTER_LOPASS 0 + #define FILTER_HIPASS 1 + #define FILTER_BANDPASS 2 + #define FILTER_NOTCH 3 + #define FILTER_PARAEQ 4 + #define FILTER_LOSHELF 5 + #define FILTER_HISHELF 6 + +//For frequency adjustment + #define FLAT_FREQUENCY 0 + #define PARAMETRIC_EQUALIZER 1 + #define TONE_CONTROLS 2 + #define GRAPHIC_EQUALIZER 3 + + +void calcBiquad(uint8_t filtertype, float fC, float dB_Gain, float Q, uint32_t quantization_unit, uint32_t fS, int *coef); + +#endif diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s.cpp new file mode 100644 index 0000000..a68ee00 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s.cpp @@ -0,0 +1,236 @@ +/* i2s.c + * + * Author: Daniel Collins + * Date: 2022-02-25 + * + * Copyright (c) 2022 Daniel Collins + * + * This file is part of rp2040_i2s_example. + * + * rp2040_i2s_example is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3 as published by the + * Free Software Foundation. + * + * rp2040_i2s_example is distributed in the hope that it will + * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * rp2040_i2s_example. If not, see . + */ + +#include "i2s.h" +#include +#include "hardware/clocks.h" +#include "hardware/dma.h" +#include "hardware/irq.h" +#include "i2s_pio_lib.h" +#include + +// const i2s_config i2s_config_default = {48000, 256, 32, 10, 6, 7, 8, true}; + +static float pio_div(float freq, uint16_t* div, uint8_t* frac) { + float clk = (float)clock_get_hz(clk_sys); + float ratio = clk / freq; + float d; + float f = modff(ratio, &d); + *div = (uint16_t)d; + *frac = (uint8_t)(f * 256.0f); + + // Use post-converted values to get actual freq after any rounding + float result = clk / ((float)*div + ((float)*frac / 256.0f)); + + return result; +} + +static void calc_clocks(const i2s_config* config, pio_i2s_clocks* clocks) { + // Try to get a precise ratio between SCK and BCK regardless of how + // perfect the system_clock divides. First, see what sck we can actually get: + float sck_desired = (float)config->fs * (float)config->sck_mult * (float)i2s_sck_program_pio_mult; + float sck_attained = pio_div(sck_desired, &clocks->sck_d, &clocks->sck_f); + clocks->fs_attained = sck_attained / (float)config->sck_mult / (float)i2s_sck_program_pio_mult; + + // Now that we have the closest fs our dividers will give us, we can + // re-calculate SCK and BCK as correct ratios of this adjusted fs: + float sck_hz = clocks->fs_attained * (float)config->sck_mult; + clocks->sck_pio_hz = pio_div(sck_hz * (float)i2s_sck_program_pio_mult, &clocks->sck_d, &clocks->sck_f); + float bck_hz = clocks->fs_attained * (float)config->bit_depth * 2.0f; + clocks->bck_pio_hz = pio_div(bck_hz * (float)i2s_out_master_program_pio_mult, &clocks->bck_d, &clocks->bck_f); +} + +static bool validate_sck_bck_sync(pio_i2s_clocks* clocks) { + float ratio = clocks->sck_pio_hz / clocks->bck_pio_hz; + float actual_sck = clocks->sck_pio_hz / (float)i2s_sck_program_pio_mult; + float actual_bck = clocks->bck_pio_hz / (float)i2s_out_master_program_pio_mult; + DEBUG_PRINTF("Clock speed for SCK: %f (PIO %f Hz with divider %d.%d)\n", actual_sck, clocks->sck_pio_hz, clocks->sck_d, clocks->sck_f); + DEBUG_PRINTF("Clock speed for BCK: %f (PIO %f Hz with divider %d.%d)\n", actual_bck, clocks->bck_pio_hz, clocks->bck_d, clocks->bck_f); + DEBUG_PRINTF("Clock Ratio: %f\n", ratio); + float whole_ratio; + float fractional_ratio = modff(ratio, &whole_ratio); + return (fractional_ratio == 0.0f); +} + +static void dma_double_buffer_init(pio_i2s* i2s, void (*dma_handler)(void)) { + // Set up DMA for PIO I2s - two channels, in and out + i2s->dma_ch_in_ctrl = dma_claim_unused_channel(true); + i2s->dma_ch_out_ctrl = dma_claim_unused_channel(true); + i2s->dma_ch_out_data = dma_claim_unused_channel(true); + i2s->dma_ch_in_data = dma_claim_unused_channel(true); + + // Control blocks support double-buffering with interrupts on buffer change + i2s->in_ctrl_blocks[0] = i2s->input_buffer; + i2s->in_ctrl_blocks[1] = &i2s->input_buffer[STEREO_BUFFER_SIZE]; + i2s->out_ctrl_blocks[0] = i2s->output_buffer; + i2s->out_ctrl_blocks[1] = &i2s->output_buffer[STEREO_BUFFER_SIZE]; + + // DMA I2S OUT control channel - wrap read address every 8 bytes (2 words) + // Transfer 1 word at a time, to the out channel read address and trigger. + dma_channel_config c = dma_channel_get_default_config(i2s->dma_ch_out_ctrl); + channel_config_set_read_increment(&c, true); + channel_config_set_write_increment(&c, false); + channel_config_set_ring(&c, false, 3); + channel_config_set_transfer_data_size(&c, DMA_SIZE_32); + dma_channel_configure(i2s->dma_ch_out_ctrl, &c, &dma_hw->ch[i2s->dma_ch_out_data].al3_read_addr_trig, i2s->out_ctrl_blocks, 1, false); + + c = dma_channel_get_default_config(i2s->dma_ch_out_data); + channel_config_set_read_increment(&c, true); + channel_config_set_write_increment(&c, false); + channel_config_set_chain_to(&c, i2s->dma_ch_out_ctrl); + channel_config_set_dreq(&c, pio_get_dreq(i2s->pio, i2s->sm_dout, true)); + + dma_channel_configure(i2s->dma_ch_out_data, + &c, + &i2s->pio->txf[i2s->sm_dout], // Destination pointer + NULL, // Source pointer, will be set by ctrl channel + STEREO_BUFFER_SIZE, // Number of transfers + false // Start immediately + ); + + c = dma_channel_get_default_config(i2s->dma_ch_in_ctrl); + channel_config_set_read_increment(&c, true); + channel_config_set_write_increment(&c, false); + channel_config_set_ring(&c, false, 3); + channel_config_set_transfer_data_size(&c, DMA_SIZE_32); + dma_channel_configure(i2s->dma_ch_in_ctrl, &c, &dma_hw->ch[i2s->dma_ch_in_data].al2_write_addr_trig, i2s->in_ctrl_blocks, 1, false); + + c = dma_channel_get_default_config(i2s->dma_ch_in_data); + channel_config_set_read_increment(&c, false); + channel_config_set_write_increment(&c, true); + channel_config_set_chain_to(&c, i2s->dma_ch_in_ctrl); + channel_config_set_dreq(&c, pio_get_dreq(i2s->pio, i2s->sm_din, false)); + + dma_channel_configure(i2s->dma_ch_in_data, + &c, + NULL, // Will be set by ctrl chan + &i2s->pio->rxf[i2s->sm_din], // Source pointer + STEREO_BUFFER_SIZE, // Number of transfers + false // Don't start yet + ); + + // Input channel triggers the DMA interrupt handler, hopefully these stay + // in perfect sync with the output. + dma_channel_set_irq0_enabled(i2s->dma_ch_in_data, true); + irq_set_exclusive_handler(DMA_IRQ_0, dma_handler); + irq_set_enabled(DMA_IRQ_0, true); + + // Enable all the dma channels + dma_channel_start(i2s->dma_ch_out_ctrl); // This will trigger-start the out chan + dma_channel_start(i2s->dma_ch_in_ctrl); // This will trigger-start the in chan +} + +/* Initializes an I2S block (of 3 state machines) on the designated PIO. + * NOTE! This does NOT START the PIO units. You must call i2s_program_start + * with the resulting i2s object! + */ +static void i2s_slave_program_init(PIO pio, const i2s_config* config, pio_i2s* i2s) { + DEBUG_PRINTLN("Slave init"); + uint offset = 0; + i2s->pio = pio; + i2s->sm_mask = 0; + + pio_i2s_clocks clocks; + calc_clocks(config, &clocks); + + if (config->sck_enable) { + // SCK block + i2s->sm_sck = pio_claim_unused_sm(pio, true); + i2s->sm_mask |= (1u << i2s->sm_sck); + offset = pio_add_program(pio, &i2s_sck_program); + i2s_sck_program_init(pio, i2s->sm_sck, offset, config->sck_pin); + pio_sm_set_clkdiv_int_frac(pio, i2s->sm_sck, clocks.sck_d, clocks.sck_f); + } + + // Bi-Di I2S block, clocked with SCK + i2s->sm_din = pio_claim_unused_sm(pio, true); + i2s->sm_dout = i2s->sm_din; + i2s->sm_mask |= (1u << i2s->sm_din); + offset = pio_add_program(pio, &i2s_bidi_slave_program); + i2s_bidi_slave_program_init(pio, i2s->sm_din, offset, config->dout_pin, config->din_pin); + pio_sm_set_clkdiv_int_frac(pio, i2s->sm_din, clocks.sck_d, clocks.sck_f); +} + +/* Initializes an I2S block (of 3 state machines) on the designated PIO. + * NOTE! This does NOT START the PIO units. You must call i2s_program_start + * with the resulting i2s object! + */ +static void i2s_sync_program_init(PIO pio, const i2s_config* config, pio_i2s* i2s) { + uint offset = 0; + i2s->pio = pio; + i2s->sm_mask = 0; + + pio_i2s_clocks clocks; + calc_clocks(config, &clocks); + + if (config->sck_enable) { + // Check that SCK and BCK are in perfect whole ratio + if (!validate_sck_bck_sync(&clocks)) { + /* There are lots of possible causes for this, a few are: + * - You are running a system clock frequency that doesn't divide well at all into SCK or BCK + * - You are running a 24-bit I2S with a 256x SCK multiplier (RP2040 cannot support this) + * - You have mucked with the PIO ratios or done something silly. + */ + DEBUG_PRINTLN("SCK and BCK are not in sync."); + } + + // SCK block + i2s->sm_sck = pio_claim_unused_sm(pio, true); + i2s->sm_mask |= (1u << i2s->sm_sck); + offset = pio_add_program(pio, &i2s_sck_program); + i2s_sck_program_init(pio, i2s->sm_sck, offset, config->sck_pin); + pio_sm_set_clkdiv_int_frac(pio, i2s->sm_sck, clocks.sck_d, clocks.sck_f); + } + + // In block, clocked with SCK + i2s->sm_din = pio_claim_unused_sm(pio, true); + i2s->sm_mask |= (1u << i2s->sm_din); + offset = pio_add_program(pio, &i2s_in_slave_program); + i2s_in_slave_program_init(pio, i2s->sm_din, offset, config->din_pin); + pio_sm_set_clkdiv_int_frac(pio, i2s->sm_din, clocks.sck_d, clocks.sck_f); + + // Out block, clocked with BCK + i2s->sm_dout = pio_claim_unused_sm(pio, true); + i2s->sm_mask |= (1u << i2s->sm_dout); + offset = pio_add_program(pio, &i2s_out_master_program); + i2s_out_master_program_init(pio, i2s->sm_dout, offset, config->bit_depth, config->dout_pin, config->clock_pin_base); + pio_sm_set_clkdiv_int_frac(pio, i2s->sm_dout, clocks.bck_d, clocks.bck_f); +} + +void i2s_program_start_slaved(PIO pio, const i2s_config* config, void (*dma_handler)(void), pio_i2s* i2s) { + if (((uint32_t)i2s & 0x7) != 0) { + DEBUG_PRINTLN("pio_i2s argument must be 8-byte aligned!"); + } + i2s_slave_program_init(pio, config, i2s); + dma_double_buffer_init(i2s, dma_handler); + pio_enable_sm_mask_in_sync(i2s->pio, i2s->sm_mask); +} + +void i2s_program_start_synched(PIO pio, const i2s_config* config, void (*dma_handler)(void), pio_i2s* i2s) { +// DEBUG_PRINTLN("Start synched"); + if (((uint32_t)i2s & 0x7) != 0) { + DEBUG_PRINTLN("pio_i2s argument must be 8-byte aligned!"); + } + i2s_sync_program_init(pio, config, i2s); + dma_double_buffer_init(i2s, dma_handler); + pio_enable_sm_mask_in_sync(i2s->pio, i2s->sm_mask); +} diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s.h b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s.h new file mode 100644 index 0000000..cd96b11 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s.h @@ -0,0 +1,82 @@ +/* i2s.h + * + * Author: Daniel Collins + * Date: 2022-02-25 + * + * Copyright (c) 2022 Daniel Collins + * + * This file is part of rp2040_i2s_example. + * + * rp2040_i2s_example is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3 as published by the + * Free Software Foundation. + * + * rp2040_i2s_example is distributed in the hope that it will + * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * rp2040_i2s_example. If not, see . + */ + +#include +#include "hardware/pio.h" +#include "../../PicoDefs.hpp" + + +#ifndef I2S_TEST_I2S_H +#define I2S_TEST_I2S_H + +#define AUDIO_BUFFER_FRAMES 48 +#define STEREO_BUFFER_SIZE AUDIO_BUFFER_FRAMES * 2 // roughly 1ms, 48 L + R words + +typedef struct i2s_config { + uint32_t fs; + uint32_t sck_mult; + uint8_t bit_depth; + uint8_t sck_pin; + uint8_t dout_pin; + uint8_t din_pin; + uint8_t clock_pin_base; + bool sck_enable; +} i2s_config; + +typedef struct pio_i2s_clocks { + // Clock computation results + float fs_attained; + float sck_pio_hz; + float bck_pio_hz; + + // PIO divider ratios to obtain the computed clocks above + uint16_t sck_d; + uint8_t sck_f; + uint16_t bck_d; + uint8_t bck_f; +} pio_i2s_clocks; + +// NOTE: Use __attribute__ ((aligned(8))) on this struct or the DMA wrap won't work! +typedef struct pio_i2s { + PIO pio; + uint8_t sm_mask; + uint8_t sm_sck; + uint8_t sm_dout; + uint8_t sm_din; + uint dma_ch_in_ctrl; + uint dma_ch_in_data; + uint dma_ch_out_ctrl; + uint dma_ch_out_data; + int32_t* in_ctrl_blocks[2]; // Control blocks MUST have 8-byte alignment. + int32_t* out_ctrl_blocks[2]; + int32_t input_buffer[STEREO_BUFFER_SIZE * 2]; + int32_t output_buffer[STEREO_BUFFER_SIZE * 2]; + i2s_config config; +} pio_i2s; + +// extern const i2s_config i2s_config_default; +const i2s_config i2s_config_default = {48000, 256, 32, 10, 6, 7, 8, true}; + +void i2s_program_start_slaved(PIO pio, const i2s_config* config, void (*dma_handler)(void), pio_i2s* i2s); +void i2s_program_start_synched(PIO pio, const i2s_config* config, void (*dma_handler)(void), pio_i2s* i2s); + +#endif // I2S_TEST_I2S_H diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s_bidi_slave.pio.h b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s_bidi_slave.pio.h new file mode 100644 index 0000000..027d759 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s_bidi_slave.pio.h @@ -0,0 +1,73 @@ +// -------------------------------------------------- // +// This file is autogenerated by pioasm; do not edit! // +// -------------------------------------------------- // + +#pragma once +/* +; I2S audio bidirectional (input/output) block, both in slave mode. +; Requires external BCK and LRCK, usually from the codec directly. +; This block provides both the output and input components together, +; so should not be used in combination with either of the other output or +; input units on the same I2S bus. +; +; Input pin order: DIN, BCK, LRCK +; Set JMP pin to LRCK. +; +; Clock synchronously with the system clock, or *at least* 4x the usual +; bit clock for a given fs (e.g. for 48kHz 24-bit, clock at at least +; (48000 * 24 * 2 (stereo)) * 4 = 9.216 MHz. Ideally 8x or more. +*/ + +#if !PICO_NO_HARDWARE +#include "hardware/pio.h" +#endif + +// -------------- // +// i2s_bidi_slave // +// -------------- // + +#define i2s_bidi_slave_wrap_target 0 +#define i2s_bidi_slave_wrap 23 + +static const uint16_t i2s_bidi_slave_program_instructions[] = { + // .wrap_target + 0x20a1, // 0: wait 1 pin, 1 + 0x4001, // 1: in pins, 1 + 0x8080, // 2: pull noblock + 0x8000, // 3: push noblock + 0x2021, // 4: wait 0 pin, 1 + 0x2022, // 5: wait 0 pin, 2 + 0x6001, // 6: out pins, 1 + 0x20a1, // 7: wait 1 pin, 1 + 0x4001, // 8: in pins, 1 + 0x2021, // 9: wait 0 pin, 1 + 0x6001, // 10: out pins, 1 + 0x00cd, // 11: jmp pin, 13 + 0x0007, // 12: jmp 7 + 0x20a1, // 13: wait 1 pin, 1 + 0x4001, // 14: in pins, 1 + 0x8080, // 15: pull noblock + 0x8000, // 16: push noblock + 0x2021, // 17: wait 0 pin, 1 + 0x6001, // 18: out pins, 1 + 0x20a1, // 19: wait 1 pin, 1 + 0x4001, // 20: in pins, 1 + 0x2021, // 21: wait 0 pin, 1 + 0x6001, // 22: out pins, 1 + 0x00d3, // 23: jmp pin, 19 + // .wrap +}; + +#if !PICO_NO_HARDWARE +static const struct pio_program i2s_bidi_slave_program = { + .instructions = i2s_bidi_slave_program_instructions, + .length = 24, + .origin = -1, +}; + +static inline pio_sm_config i2s_bidi_slave_program_get_default_config(uint offset) { + pio_sm_config c = pio_get_default_sm_config(); + sm_config_set_wrap(&c, offset + i2s_bidi_slave_wrap_target, offset + i2s_bidi_slave_wrap); + return c; +} +#endif diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s_in_slave.pio.h b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s_in_slave.pio.h new file mode 100644 index 0000000..34439e2 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s_in_slave.pio.h @@ -0,0 +1,65 @@ +// -------------------------------------------------- // +// This file is autogenerated by pioasm; do not edit! // +// -------------------------------------------------- // + +#pragma once + +/* +; I2S Audio Input - Slave or Synchronous with Output Master +; Inputs must be sequential in order: DIN, BCK, LRCK +; Must run at same speed of SCK block, or at least 4x BCK. +; +; NOTE: Set JMP pin to LRCK pin. +; NOTE: The very first word read is potentially corrupt, since there is a +; chance to start in the middle of an L frame and only read part of it. +; Nevertheless, the frame order should be synchronized (first word is L, +; second is R, etc. +*/ + +#if !PICO_NO_HARDWARE +#include "hardware/pio.h" +#endif + +// ------------ // +// i2s_in_slave // +// ------------ // + +#define i2s_in_slave_wrap_target 0 +#define i2s_in_slave_wrap 17 + +static const uint16_t i2s_in_slave_program_instructions[] = { + // .wrap_target + 0x20a1, // 0: wait 1 pin, 1 + 0x4001, // 1: in pins, 1 + 0x8000, // 2: push noblock + 0x2021, // 3: wait 0 pin, 1 + 0x2022, // 4: wait 0 pin, 2 + 0x20a1, // 5: wait 1 pin, 1 + 0x4001, // 6: in pins, 1 + 0x2021, // 7: wait 0 pin, 1 + 0x00ca, // 8: jmp pin, 10 + 0x0005, // 9: jmp 5 + 0x20a1, // 10: wait 1 pin, 1 + 0x4001, // 11: in pins, 1 + 0x8000, // 12: push noblock + 0x2021, // 13: wait 0 pin, 1 + 0x20a1, // 14: wait 1 pin, 1 + 0x4001, // 15: in pins, 1 + 0x2021, // 16: wait 0 pin, 1 + 0x00ce, // 17: jmp pin, 14 + // .wrap +}; + +#if !PICO_NO_HARDWARE +static const struct pio_program i2s_in_slave_program = { + .instructions = i2s_in_slave_program_instructions, + .length = 18, + .origin = -1, +}; + +static inline pio_sm_config i2s_in_slave_program_get_default_config(uint offset) { + pio_sm_config c = pio_get_default_sm_config(); + sm_config_set_wrap(&c, offset + i2s_in_slave_wrap_target, offset + i2s_in_slave_wrap); + return c; +} +#endif diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s_out_master.pio.h b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s_out_master.pio.h new file mode 100644 index 0000000..efc0ce7 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s_out_master.pio.h @@ -0,0 +1,59 @@ +// -------------------------------------------------- // +// This file is autogenerated by pioasm; do not edit! // +// -------------------------------------------------- // + +#pragma once + +// ; I2S audio output block. Synchronous with clock and input. +// ; Must run at BCK * 2. +// ; +// ; This block also outputs the word clock (also called frame or LR clock) and +// ; the bit clock. +// ; +// ; Set register x to (bit depth - 2) (e.g. for 24 bit audio, set to 22). +// ; Note that if this is needed to be synchronous with the SCK module, +// ; it is not possible to run 24-bit frames with an SCK of 256x fs. You must either +// ; run SCK at 384x fs (if your codec permits this) or use 32-bit frames, which +// ; work fine with 24-bit codecs. + + +#if !PICO_NO_HARDWARE +#include "hardware/pio.h" +#endif + +// -------------- // +// i2s_out_master // +// -------------- // + +#define i2s_out_master_wrap_target 0 +#define i2s_out_master_wrap 7 + +#define i2s_out_master_offset_entry_point 0u + +static const uint16_t i2s_out_master_program_instructions[] = { + // .wrap_target + 0xe03e, // 0: set x, 30 side 0 + 0x8880, // 1: pull noblock side 1 + 0x6001, // 2: out pins, 1 side 0 + 0x0842, // 3: jmp x--, 2 side 1 + 0xf03e, // 4: set x, 30 side 2 + 0x9880, // 5: pull noblock side 3 + 0x7001, // 6: out pins, 1 side 2 + 0x1846, // 7: jmp x--, 6 side 3 + // .wrap +}; + +#if !PICO_NO_HARDWARE +static const struct pio_program i2s_out_master_program = { + .instructions = i2s_out_master_program_instructions, + .length = 8, + .origin = -1, +}; + +static inline pio_sm_config i2s_out_master_program_get_default_config(uint offset) { + pio_sm_config c = pio_get_default_sm_config(); + sm_config_set_wrap(&c, offset + i2s_out_master_wrap_target, offset + i2s_out_master_wrap); + sm_config_set_sideset(&c, 2, false, false); + return c; +} +#endif diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s_pio_lib.h b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s_pio_lib.h new file mode 100644 index 0000000..645c61c --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s_pio_lib.h @@ -0,0 +1,96 @@ +#pragma once +#include "i2s_sck.pio.h" +#include "i2s_out_master.pio.h" +#include "i2s_bidi_slave.pio.h" +#include "i2s_in_slave.pio.h" + +// These constants are the I2S clock to pio clock ratio +const int i2s_sck_program_pio_mult = 2; +const int i2s_out_master_program_pio_mult = 2; + +/* + * System ClocK (SCK) is only required by some I2S peripherals. + * This outputs it at 1 SCK per 2 PIO clocks, so scale the dividers correctly + * first. + * NOTE: Most peripherals require that this is *perfectly* aligned in ratio, + * if not phase, to the bit and word clocks of any master peripherals. + * It is up to you to ensure that the divider config is set up for a + * precise (not approximate) ratio between the BCK, LRCK, and SCK outputs. + */ +static void i2s_sck_program_init(PIO pio, uint8_t sm, uint8_t offset, uint8_t sck_pin) { + pio_gpio_init(pio, sck_pin); + pio_sm_config sm_config = i2s_sck_program_get_default_config(offset); + sm_config_set_set_pins(&sm_config, sck_pin, 1); + + uint pin_mask = (1u << sck_pin); + pio_sm_set_pins_with_mask(pio, sm, 0, pin_mask); // zero output + pio_sm_set_pindirs_with_mask(pio, sm, pin_mask, pin_mask); + + pio_sm_init(pio, sm, offset, &sm_config); +} + +static inline void i2s_out_master_program_init(PIO pio, uint8_t sm, uint8_t offset, uint8_t bit_depth, uint8_t dout_pin, uint8_t clock_pin_base) { + pio_gpio_init(pio, dout_pin); + pio_gpio_init(pio, clock_pin_base); + pio_gpio_init(pio, clock_pin_base + 1); + + pio_sm_config sm_config = i2s_out_master_program_get_default_config(offset); + sm_config_set_out_pins(&sm_config, dout_pin, 1); + sm_config_set_sideset_pins(&sm_config, clock_pin_base); + sm_config_set_out_shift(&sm_config, false, false, bit_depth); + sm_config_set_fifo_join(&sm_config, PIO_FIFO_JOIN_TX); + pio_sm_init(pio, sm, offset, &sm_config); + + uint32_t pin_mask = (1u << dout_pin) | (3u << clock_pin_base); + pio_sm_set_pins_with_mask(pio, sm, 0, pin_mask); // zero output + pio_sm_set_pindirs_with_mask(pio, sm, pin_mask, pin_mask); +} + +static inline void i2s_bidi_slave_program_init(PIO pio, uint8_t sm, uint8_t offset, uint8_t dout_pin, uint8_t in_pin_base) { + pio_gpio_init(pio, dout_pin); + pio_gpio_init(pio, in_pin_base); + pio_gpio_init(pio, in_pin_base + 1); + pio_gpio_init(pio, in_pin_base + 2); + + pio_sm_config sm_config = i2s_bidi_slave_program_get_default_config(offset); + sm_config_set_out_pins(&sm_config, dout_pin, 1); + sm_config_set_in_pins(&sm_config, in_pin_base); + sm_config_set_jmp_pin(&sm_config, in_pin_base + 2); + sm_config_set_out_shift(&sm_config, false, false, 0); + sm_config_set_in_shift(&sm_config, false, false, 0); + pio_sm_init(pio, sm, offset, &sm_config); + + // Setup output pins + uint32_t pin_mask = (1u << dout_pin); + pio_sm_set_pins_with_mask(pio, sm, 0, pin_mask); // zero output + pio_sm_set_pindirs_with_mask(pio, sm, pin_mask, pin_mask); + + // Setup input pins + pin_mask = (7u << in_pin_base); // Three input pins + pio_sm_set_pindirs_with_mask(pio, sm, 0, pin_mask); +} + +/* + * Designed to be used with output master module, requiring overlapping pins: + * din_pin_base + 0 = input pin + * din_pin_base + 1 = out_master clock_pin_base + * din_pin_base + 2 = out_master clock_pin_base + 1 + * + * Intended to be run at SCK rate (4x BCK), so clock same as SCK module if using + * it, or 4x the BCK frequency (BCK is 64x fs, so 256x fs). + */ +static inline void i2s_in_slave_program_init(PIO pio, uint8_t sm, uint8_t offset, uint8_t din_pin_base) { + pio_gpio_init(pio, din_pin_base); + gpio_set_pulls(din_pin_base, false, false); + gpio_set_dir(din_pin_base, GPIO_IN); + + pio_sm_config sm_config = i2s_in_slave_program_get_default_config(offset); + sm_config_set_in_pins(&sm_config, din_pin_base); + sm_config_set_in_shift(&sm_config, false, false, 0); + sm_config_set_fifo_join(&sm_config, PIO_FIFO_JOIN_RX); + sm_config_set_jmp_pin(&sm_config, din_pin_base + 2); + pio_sm_init(pio, sm, offset, &sm_config); + + uint32_t pin_mask = (7u << din_pin_base); // Three input pins + pio_sm_set_pindirs_with_mask(pio, sm, 0, pin_mask); +} diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s_sck.pio.h b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s_sck.pio.h new file mode 100644 index 0000000..725c2ed --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/audio/i2s_pio/i2s_sck.pio.h @@ -0,0 +1,37 @@ +// -------------------------------------------------- // +// This file is autogenerated by pioasm; do not edit! // +// -------------------------------------------------- // + +#pragma once + +#if !PICO_NO_HARDWARE +#include "hardware/pio.h" +#endif + +// ------- // +// i2s_sck // +// ------- // + +#define i2s_sck_wrap_target 0 +#define i2s_sck_wrap 1 + +static const uint16_t i2s_sck_program_instructions[] = { + // .wrap_target + 0xe001, // 0: set pins, 1 + 0xe000, // 1: set pins, 0 + // .wrap +}; + +#if !PICO_NO_HARDWARE +static const struct pio_program i2s_sck_program = { + .instructions = i2s_sck_program_instructions, + .length = 2, + .origin = -1, +}; + +static inline pio_sm_config i2s_sck_program_get_default_config(uint offset) { + pio_sm_config c = pio_get_default_sm_config(); + sm_config_set_wrap(&c, offset + i2s_sck_wrap_target, offset + i2s_sck_wrap); + return c; +} +#endif diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/FlashFS.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/FlashFS.hpp new file mode 100644 index 0000000..7f711f6 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/FlashFS.hpp @@ -0,0 +1,23 @@ +#ifndef FLASH_FS_HPP +#define FLASH_FS_HPP + +#include +#include +#include + +namespace FlashFS { + + void begin() + { + LittleFS.begin(); + VFS.root(LittleFS); + DEBUG_PRINTLN("LittleFS initialized."); + } + + bool exists(const char* filename) + { + return LittleFS.exists(filename); + } +} // namespace FlashFS + +#endif // FLASH_FS_HPP diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/MEMLNaut.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/MEMLNaut.cpp new file mode 100644 index 0000000..32bee8d --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/MEMLNaut.cpp @@ -0,0 +1,359 @@ +#include "MEMLNaut.hpp" +#include "../../audio/AudioDriver.hpp" +#include "Arduino.h" +#include "pico/util/queue.h" + +MEMLNaut* MEMLNaut::instance = nullptr; +queue_t queue_buttons_; + +#define FAST_MEM __not_in_flash("memlnaut") + +// struct repeating_timer FAST_MEM timerDisplay; +// inline bool __not_in_flash_func(displayUpdate)(__unused struct repeating_timer *t) { +// MEMLNaut::Instance()->disp->Draw(); +// return true; +// } + +// struct repeating_timer FAST_MEM timerTouch; +// inline bool __not_in_flash_func(touchUpdate)(__unused struct repeating_timer *t) { +// // scr->update(); +// MEMLNaut::Instance()->disp->PollTouch(); +// return true; +// } + + +// Static interrupt handlers implementation +#define HANDLE_BUTTON_MACRO(handler_name, pin_name, callback_name, debouncer_index) \ +void __not_in_flash_func(MEMLNaut::handle##handler_name)() { \ + if (instance) { \ + bool current_value = digitalRead(Pins::pin_name) == LOW; \ + /*Serial.println(String("Button ") + #pin_name + " interrupt, value: " + String(current_value));*/ \ + if (instance->debouncers[debouncer_index].debounce(current_value)) { \ + /*Serial.println("Valid input!");*/ \ + if (instance->debouncers[debouncer_index].getState()) { \ + /*Serial.println(String("Pin ") + #pin_name + " getState() = 1");*/ \ + if (instance->callback_name##Callback) { \ + const size_t pin = Pins::pin_name; \ + queue_add_blocking(&queue_buttons_, &pin); \ + /*Serial.println(String("Pin ") + #pin_name + " callback!");*/ \ + /*instance->callback_name##Callback();*/ \ + } \ + } else { \ + /*Serial.println(String("Pin ") + #pin_name + " getState() = 0");*/ \ + } \ + } \ + /*Serial.println("---");*/ \ + } \ +} + +HANDLE_BUTTON_MACRO(MomA1, MOM_A1, momA1, 0) +HANDLE_BUTTON_MACRO(MomA2, MOM_A2, momA2, 1) +HANDLE_BUTTON_MACRO(MomB1, MOM_B1, momB1, 2) +HANDLE_BUTTON_MACRO(MomB2, MOM_B2, momB2, 3) +HANDLE_BUTTON_MACRO(ReSW, RE_SW, reSW, 4) + + +void __not_in_flash_func(MEMLNaut::handleTogA1)() { + if (instance) { + bool should_update = instance->toggleDebouncers[0].debounce(digitalRead(Pins::TOG_A1) == LOW); + if (should_update && instance->togA1Callback) { + bool val = instance->toggleDebouncers[0].getState(); + instance->togA1Callback(val); + } + } +} +void __not_in_flash_func(MEMLNaut::handleTogA2)() { + if (instance) { + bool should_update = instance->toggleDebouncers[1].debounce(digitalRead(Pins::TOG_A2) == LOW); + if (should_update && instance->togA2Callback) { + bool val = instance->toggleDebouncers[1].getState(); + instance->togA2Callback(val); + } + } +} +void __not_in_flash_func(MEMLNaut::handleTogB1)() { + if (instance) { + bool should_update = instance->toggleDebouncers[2].debounce(digitalRead(Pins::TOG_B1) == LOW); + if (should_update && instance->togB1Callback) { + bool val = instance->toggleDebouncers[2].getState(); + instance->togB1Callback(val); + } + } +} +void __not_in_flash_func(MEMLNaut::handleTogB2)() { + if (instance) { + bool should_update = instance->toggleDebouncers[3].debounce(digitalRead(Pins::TOG_B2) == LOW); + if (should_update && instance->togB2Callback) { + bool val = instance->toggleDebouncers[3].getState(); + instance->togB2Callback(val); + } + } +} +void __not_in_flash_func(MEMLNaut::handleJoySW)() { + if (instance) { + bool should_update = instance->toggleDebouncers[4].debounce(digitalRead(Pins::JOY_SW) == LOW); + if (should_update && instance->joySWCallback) { + bool val = instance->toggleDebouncers[4].getState(); + instance->joySWCallback(val); + } + } +} + +int8_t __not_in_flash_func(read_rotary)(uint8_t &prevNextCode, uint16_t &store, int a_pin, int b_pin) { + static int8_t FAST_MEM rot_enc_table[] = { 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 }; + + prevNextCode <<= 2; + if (digitalRead(b_pin)) prevNextCode |= 0x02; + if (digitalRead(a_pin)) prevNextCode |= 0x01; + prevNextCode &= 0x0f; + // Serial.println(prevNextCode); + + // If valid then store as 16 bit data. + if (rot_enc_table[prevNextCode]) { + store <<= 4; + store |= prevNextCode; + if ((store & 0xff) == 0x2b) return -1; + if ((store & 0xff) == 0x17) return 1; + } + return 0; +} + +static uint8_t FAST_MEM enc1Code = 0; +static uint16_t FAST_MEM enc1Store = 0; + +void __isr MEMLNaut::encoder1_callback() { + int change = read_rotary(enc1Code, enc1Store, Pins::RE_A, Pins::RE_B); + DEBUG_PRINTLN("Encoder1 change: " + String(change)); + if (instance && instance->rotEncCallback && change != 0) { + instance->rotEncCallback(change); + } + +} + + + +MEMLNaut::MEMLNaut(bool old_display) { + instance = this; + loopCallback = nullptr; + // Initialize median filters + for(auto& filter : adcFilters) { + filter.init(FILTER_SIZE); + } + + // Initialise all pins + Pins::initializePins(); + + // Attach momentary switch interrupts (FALLING edge) + attachInterrupt(digitalPinToInterrupt(Pins::MOM_A1), handleMomA1, CHANGE); + attachInterrupt(digitalPinToInterrupt(Pins::MOM_A2), handleMomA2, CHANGE); + attachInterrupt(digitalPinToInterrupt(Pins::MOM_B1), handleMomB1, CHANGE); + attachInterrupt(digitalPinToInterrupt(Pins::MOM_B2), handleMomB2, CHANGE); + attachInterrupt(digitalPinToInterrupt(Pins::RE_SW), handleReSW, CHANGE); + // attachInterrupt(digitalPinToInterrupt(Pins::RE_A), handleReA, FALLING); + // attachInterrupt(digitalPinToInterrupt(Pins::RE_B), handleReB, FALLING); + + // Attach toggle switch interrupts (CHANGE) + attachInterrupt(digitalPinToInterrupt(Pins::TOG_A1), handleTogA1, CHANGE); + attachInterrupt(digitalPinToInterrupt(Pins::TOG_A2), handleTogA2, CHANGE); + attachInterrupt(digitalPinToInterrupt(Pins::TOG_B1), handleTogB1, CHANGE); + attachInterrupt(digitalPinToInterrupt(Pins::TOG_B2), handleTogB2, CHANGE); + attachInterrupt(digitalPinToInterrupt(Pins::JOY_SW), handleJoySW, CHANGE); + + // Force RVGain to be master volume + setRVGain1Volume(DEFAULT_THRESHOLD); + + //rotary encoder setup + attachInterrupt(digitalPinToInterrupt(Pins::RE_A), encoder1_callback, + CHANGE); + attachInterrupt(digitalPinToInterrupt(Pins::RE_B), encoder1_callback, + CHANGE); + + SPI1.setRX(Pins::SD_MISO); + SPI1.setTX(Pins::SD_MOSI); + SPI1.setSCK(Pins::SD_SCK); + + + if (!old_display) { + disp = std::make_unique(); + disp->Setup(); + } else { + disp = nullptr; + } + + setRotaryEncoderCallback([this](int delta) { + Serial.printf("Rotary encoder moved: %d\n", delta); + if (disp) + disp->RotaryIncEvent(delta); + }); + + setReSWCallback([this]() { + if (disp) + disp->RotarySwitchEvent(); + }); + queue_init(&queue_buttons_, sizeof(size_t), 1); +} + + +// Momentary switch callback setters +void MEMLNaut::setMomA1Callback(ButtonCallback cb) { momA1Callback = cb; } +void MEMLNaut::setMomA2Callback(ButtonCallback cb) { momA2Callback = cb; } +void MEMLNaut::setMomB1Callback(ButtonCallback cb) { momB1Callback = cb; } +void MEMLNaut::setMomB2Callback(ButtonCallback cb) { momB2Callback = cb; } +void MEMLNaut::setReSWCallback(ButtonCallback cb) { reSWCallback = cb; } + +// Toggle switch callback setters +void MEMLNaut::setTogA1Callback(ToggleCallback cb) { togA1Callback = cb; } +void MEMLNaut::setTogA2Callback(ToggleCallback cb) { togA2Callback = cb; } +void MEMLNaut::setTogB1Callback(ToggleCallback cb) { togB1Callback = cb; } +void MEMLNaut::setTogB2Callback(ToggleCallback cb) { togB2Callback = cb; } +void MEMLNaut::setJoySWCallback(ToggleCallback cb) { joySWCallback = cb; } + +// ADC callback setters +void MEMLNaut::setJoyXCallback(AnalogCallback cb, uint16_t threshold) { + adcStates[0] = {analogRead(Pins::JOY_X) / ADC_SCALE, threshold, cb}; +} +void MEMLNaut::setJoyYCallback(AnalogCallback cb, uint16_t threshold) { + adcStates[1] = {analogRead(Pins::JOY_Y) / ADC_SCALE, threshold, cb}; +} +void MEMLNaut::setJoyZCallback(AnalogCallback cb, uint16_t threshold) { + adcStates[2] = {analogRead(Pins::JOY_Z) / ADC_SCALE, threshold, cb}; +} +void MEMLNaut::setADC3Callback(AnalogCallback cb, uint16_t threshold) { + adcStates[7] = {analogRead(Pins::ADC3) / ADC_SCALE, threshold, cb}; +} +void MEMLNaut::setRVGain1Callback(AnalogCallback cb, uint16_t threshold) { + //adcStates[3] = {analogRead(Pins::RV_GAIN1) / ADC_SCALE, threshold, cb}; + // DEBUG_PRINTLN("RVGain1 overridden - only controls audio volume"); + //this overrides the volume control + adcStates[3] = {analogRead(Pins::RV_GAIN1) / ADC_SCALE, threshold, cb}; +} + +void MEMLNaut::setRVGain1Volume(uint16_t threshold) { + adcStates[3] = { + analogRead(Pins::RV_GAIN1) / ADC_SCALE, + threshold, + [] (float value) { + AudioDriver::SetMasterVolume(value); + } + }; +} +void MEMLNaut::setRVZ1Callback(AnalogCallback cb, uint16_t threshold) { + adcStates[4] = {analogRead(Pins::RV_Z1) / ADC_SCALE, threshold, cb}; +} +void MEMLNaut::setRVY1Callback(AnalogCallback cb, uint16_t threshold) { + adcStates[5] = {analogRead(Pins::RV_Y1) / ADC_SCALE, threshold, cb}; +} +void MEMLNaut::setRVX1Callback(AnalogCallback cb, uint16_t threshold) { + adcStates[6] = {analogRead(Pins::RV_X1) / ADC_SCALE, threshold, cb}; +} + +void MEMLNaut::setRotaryEncoderCallback(RotaryEncoderCallback cb) { + rotEncCallback = cb; +} + + +void MEMLNaut::setLoopCallback(LoopCallback cb) { + loopCallback = cb; +} + + +size_t displayTS=0; + +void MEMLNaut::loop() { + + static bool first_run = true; + if (first_run) { + first_run = false; + SyncOnBoot(); + } + + // Process buttons + size_t button_index; + while (queue_try_remove(&queue_buttons_, &button_index)) { + switch (button_index) { + case Pins::MOM_A1: + if (momA1Callback) momA1Callback(); + //Serial.println("+++ MOM_A1 asynchronous call!"); + break; + case Pins::MOM_A2: + if (momA2Callback) momA2Callback(); + //Serial.println("+++ MOM_A2 asynchronous call!"); + break; + case Pins::MOM_B1: + if (momB1Callback) momB1Callback(); + //Serial.println("+++ MOM_B1 asynchronous call!"); + break; + case Pins::MOM_B2: + if (momB2Callback) momB2Callback(); + //Serial.println("+++ MOM_B2 asynchronous call!"); + break; + case Pins::RE_SW: + if (reSWCallback) reSWCallback(); + //Serial.println("+++ RE_SW asynchronous call!"); + break; + default: + DEBUG_PRINTLN("MEMLNaut- Unknown button asynchronous call!"); + break; + } + } + + const uint8_t adcPins[NUM_ADCS] = { + Pins::JOY_X, Pins::JOY_Y, Pins::JOY_Z, + Pins::RV_GAIN1, Pins::RV_Z1, Pins::RV_Y1, Pins::RV_X1, + Pins::ADC3 + }; + + for (size_t i = 0; i < NUM_ADCS; i++) { + uint16_t rawValue = analogRead(adcPins[i]); + uint16_t filteredValue = adcFilters[i].process(rawValue); + float currentValue = filteredValue / ADC_SCALE; + auto& state = adcStates[i]; + + if (state.callback && abs(static_cast(filteredValue - (state.lastValue * ADC_SCALE))) > state.threshold) { + state.callback(currentValue); + state.lastValue = currentValue; + } + } + + if (loopCallback) { + loopCallback(); + } + + + if (disp) { + PERIODIC_RUN(MEMLNaut::Instance()->disp->PollTouch();, 30); + PERIODIC_RUN(MEMLNaut::Instance()->disp->Draw();, 39); + } +} + +void MEMLNaut::SyncOnBoot() { + // Synchronize ADCs + const uint8_t adcPins[NUM_ADCS] = { + Pins::JOY_X, Pins::JOY_Y, Pins::JOY_Z, + Pins::RV_GAIN1, Pins::RV_Z1, Pins::RV_Y1, Pins::RV_X1 + }; + for (size_t i = 0; i < NUM_ADCS; i++) { + uint16_t rawValue = analogRead(adcPins[i]); + adcFilters[i].reset(rawValue); // Reset filter to current value + float currentValue = rawValue / ADC_SCALE; + adcStates[i].lastValue = currentValue; + if (adcStates[i].callback) { + adcStates[i].callback(currentValue); + } + } + + // Synchronize toggle switches + const uint8_t togglePins[NUM_TOGGLES] = { + Pins::TOG_A1, Pins::TOG_A2, Pins::TOG_B1, Pins::TOG_B2, Pins::JOY_SW + }; + ToggleCallback toggleCallbacks[NUM_TOGGLES] = { + togA1Callback, togA2Callback, togB1Callback, togB2Callback, joySWCallback + }; + for (size_t i = 0; i < NUM_TOGGLES; i++) { + bool state = (digitalRead(togglePins[i]) == LOW); + toggleDebouncers[i].setState(state); + if (toggleCallbacks[i]) { + toggleCallbacks[i](state); + } + } +} diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/MEMLNaut.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/MEMLNaut.hpp new file mode 100644 index 0000000..5cb54d0 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/MEMLNaut.hpp @@ -0,0 +1,173 @@ +#ifndef __MEMLNAUT_HPP__ +#define __MEMLNAUT_HPP__ + +#include "Pins.hpp" +#include "../../utils/Debounce.hpp" +#include "../../utils/MedianFilter.h" +#include +#include +#include "display/DisplayDriver.hpp" +#include "display/SystemView.hpp" +#include "SD.h" + + + +class MEMLNaut { +public: + using ButtonCallback = std::function; + using ToggleCallback = std::function; + using AnalogCallback = std::function; + using LoopCallback = std::function; + using RotaryEncoderCallback = std::function; + +private: + static MEMLNaut* __not_in_flash("memlnaut") instance; + static constexpr size_t NUM_ADCS = 8; + static constexpr uint16_t DEFAULT_THRESHOLD = 40; + static constexpr size_t FILTER_SIZE = 5; + static constexpr float ADC_SCALE = 4128.7f; + + static constexpr size_t NUM_BUTTONS = 7; + static constexpr size_t NUM_TOGGLES = 5; + + struct ADCState { + float lastValue = 0.0f; + uint16_t threshold = DEFAULT_THRESHOLD; + AnalogCallback callback = nullptr; + }; + + std::array adcStates; + std::array, NUM_ADCS> adcFilters; + + std::array debouncers; + std::array toggleDebouncers; + + // Callback storage + ButtonCallback momA1Callback; + ButtonCallback momA2Callback; + ButtonCallback momB1Callback; + ButtonCallback momB2Callback; + ButtonCallback reSWCallback; + RotaryEncoderCallback rotEncCallback; + + ToggleCallback togA1Callback; + ToggleCallback togA2Callback; + ToggleCallback togB1Callback; + ToggleCallback togB2Callback; + ToggleCallback joySWCallback; + + LoopCallback loopCallback; + + // Static interrupt handlers + static void handleMomA1(); + static void handleMomA2(); + static void handleMomB1(); + static void handleMomB2(); + static void handleReSW(); + // static void handleReA(); + // static void handleReB(); + + static void handleTogA1(); + static void handleTogA2(); + static void handleTogB1(); + static void handleTogB2(); + static void handleJoySW(); + //encoder + static void encoder1_callback(); + + + + +public: + static inline __attribute__((always_inline)) MEMLNaut* Instance() { + return instance; + } + + static void Initialize(bool old_display = false) { + if (!instance) { + instance = new MEMLNaut(old_display); + } + } + + // Delete copy constructor and assignment operator + MEMLNaut(const MEMLNaut&) = delete; + MEMLNaut& operator=(const MEMLNaut&) = delete; + + MEMLNaut(bool old_display = false); + + void addSystemInfoView() { + if (disp) { + sysView = std::make_shared("System Info"); + disp->AddView(sysView); + } + } + + bool getMOMA1State() const {return digitalRead(Pins::MOM_A1) == LOW;} + bool getMOMA2State() const {return digitalRead(Pins::MOM_A2) == LOW;} + bool getMOMB1State() const {return digitalRead(Pins::MOM_B1) == LOW;} + bool getMOMB2State() const {return digitalRead(Pins::MOM_B2) == LOW;} + bool getMOMJOYSWState() const {return digitalRead(Pins::JOY_SW) == LOW;} + + + // Set callbacks for momentary switches + void setMomA1Callback(ButtonCallback cb); + void setMomA2Callback(ButtonCallback cb); + void setMomB1Callback(ButtonCallback cb); + void setMomB2Callback(ButtonCallback cb); + void setReSWCallback(ButtonCallback cb); + + // Set callbacks for toggle switches + void setTogA1Callback(ToggleCallback cb); + void setTogA2Callback(ToggleCallback cb); + void setTogB1Callback(ToggleCallback cb); + void setTogB2Callback(ToggleCallback cb); + void setJoySWCallback(ToggleCallback cb); + + // ADC callback setters + void setJoyXCallback(AnalogCallback cb, uint16_t threshold = DEFAULT_THRESHOLD); + void setJoyYCallback(AnalogCallback cb, uint16_t threshold = DEFAULT_THRESHOLD); + void setJoyZCallback(AnalogCallback cb, uint16_t threshold = DEFAULT_THRESHOLD); + void setADC3Callback(AnalogCallback cb, uint16_t threshold = DEFAULT_THRESHOLD); + void setRVGain1Callback(AnalogCallback cb, uint16_t threshold = DEFAULT_THRESHOLD); + void setRVGain1Volume(uint16_t threshold = DEFAULT_THRESHOLD); + void setRVZ1Callback(AnalogCallback cb, uint16_t threshold = DEFAULT_THRESHOLD); + void setRVY1Callback(AnalogCallback cb, uint16_t threshold = DEFAULT_THRESHOLD); + void setRVX1Callback(AnalogCallback cb, uint16_t threshold = DEFAULT_THRESHOLD); + + // Main loop callback setter + void setLoopCallback(LoopCallback cb); + + void setRotaryEncoderCallback(RotaryEncoderCallback cb); + + + + /** + * @brief Read all pots and switches at once. Synchronise with the + * state of the hardware panel. Run once after all callbacks are + * correctly created and all interfaces and references are set up. + * + */ + void SyncOnBoot(); + + void loop(); + + //display + std::unique_ptr disp; + std::shared_ptr sysView; + + // SD + bool startSD() { + if (!SD.begin(Pins::SD_CS, SPI1)) { + return false; + } + return true; + } + bool stopSD() { + SD.end(); + Serial.println("SD card stopped"); + return true; + } + +}; + +#endif // __MEMLNAUT_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/MEMLNautTest.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/MEMLNautTest.cpp new file mode 100644 index 0000000..9fa5457 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/MEMLNautTest.cpp @@ -0,0 +1,60 @@ +#include "MEMLNaut.hpp" +#include + +// Button callback functions +void onMomA1() { DEBUG_PRINTLN("MOM_A1 pressed"); } +void onMomA2() { DEBUG_PRINTLN("MOM_A2 pressed"); } +void onMomB1() { DEBUG_PRINTLN("MOM_B1 pressed"); } +void onMomB2() { DEBUG_PRINTLN("MOM_B2 pressed"); } +void onReSW() { DEBUG_PRINTLN("RE_SW pressed"); } +void onReA() { DEBUG_PRINTLN("RE_A triggered"); } +void onReB() { DEBUG_PRINTLN("RE_B triggered"); } + +// Toggle callback functions +void onTogA1(bool state) { DEBUG_PRINTF("TOG_A1: %s\n", state ? "ON" : "OFF"); } +void onTogA2(bool state) { DEBUG_PRINTF("TOG_A2: %s\n", state ? "ON" : "OFF"); } +void onTogB1(bool state) { DEBUG_PRINTF("TOG_B1: %s\n", state ? "ON" : "OFF"); } +void onTogB2(bool state) { DEBUG_PRINTF("TOG_B2: %s\n", state ? "ON" : "OFF"); } +void onJoySW(bool state) { DEBUG_PRINTF("JOY_SW: %s\n", state ? "ON" : "OFF"); } + +// ADC callback functions +void onJoyX(float value) { DEBUG_PRINTF("JOY_X: %.3f\n", value); } +void onJoyY(float value) { DEBUG_PRINTF("JOY_Y: %.3f\n", value); } +void onJoyZ(float value) { DEBUG_PRINTF("JOY_Z: %.3f\n", value); } +void onRVGain1(float value) { DEBUG_PRINTF("RV_GAIN1: %.3f\n", value); } +void onRVZ1(float value) { DEBUG_PRINTF("RV_Z1: %.3f\n", value); } +void onRVY1(float value) { DEBUG_PRINTF("RV_Y1: %.3f\n", value); } +void onRVX1(float value) { DEBUG_PRINTF("RV_X1: %.3f\n", value); } + +namespace MEMLNautTest { + void Setup() { + Serial.begin(115200); + while (!Serial) delay(10); + DEBUG_PRINTLN("MEMLNaut Test Starting..."); + + // Set up momentary switch callbacks + MEMLNaut::Instance()->setMomA1Callback(onMomA1); + MEMLNaut::Instance()->setMomA2Callback(onMomA2); + MEMLNaut::Instance()->setMomB1Callback(onMomB1); + MEMLNaut::Instance()->setMomB2Callback(onMomB2); + MEMLNaut::Instance()->setReSWCallback(onReSW); + + // Set up toggle switch callbacks + MEMLNaut::Instance()->setTogA1Callback(onTogA1); + MEMLNaut::Instance()->setTogA2Callback(onTogA2); + MEMLNaut::Instance()->setTogB1Callback(onTogB1); + MEMLNaut::Instance()->setTogB2Callback(onTogB2); + MEMLNaut::Instance()->setJoySWCallback(onJoySW); + + // Set up ADC callbacks with default threshold + MEMLNaut::Instance()->setJoyXCallback(onJoyX); + MEMLNaut::Instance()->setJoyYCallback(onJoyY); + MEMLNaut::Instance()->setJoyZCallback(onJoyZ); + MEMLNaut::Instance()->setRVGain1Callback(onRVGain1); + MEMLNaut::Instance()->setRVZ1Callback(onRVZ1); + MEMLNaut::Instance()->setRVY1Callback(onRVY1); + MEMLNaut::Instance()->setRVX1Callback(onRVX1); + + DEBUG_PRINTLN("MEMLNaut Test Setup Complete!"); + } +} diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/MEMLNautTest.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/MEMLNautTest.hpp new file mode 100644 index 0000000..b5c2beb --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/MEMLNautTest.hpp @@ -0,0 +1,8 @@ +#ifndef __MEMLNAUT_TEST_HPP__ +#define __MEMLNAUT_TEST_HPP__ + +namespace MEMLNautTest { + void Setup(); +} + +#endif // __MEMLNAUT_TEST_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/PSRAMManager.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/PSRAMManager.hpp new file mode 100644 index 0000000..1005719 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/PSRAMManager.hpp @@ -0,0 +1,66 @@ +#ifndef PSRAM_MANAGER_HPP +#define PSRAM_MANAGER_HPP + +#include +#include +#include + +// PSRAM memory map on RP2350B +// 0x11000000 — cached via XIP L2 (best for hot read-mostly buffers) +// 0x15000000 — uncached/noalloc (direct QMI, no coherence concerns on write) +#define PSRAM_BASE (reinterpret_cast(0x11000000u)) +#define PSRAM_BASE_NOCACHE (reinterpret_cast(0x15000000u)) + +// Place PSRAM-backed objects with: uint8_t PSRAM_ATTR myBuf[N]; +#define PSRAM_ATTR __attribute__((section(".psram"))) + +class PSRAMManager { +public: + // Detect PSRAM and apply fastest stable QMI timing. + // Call after set_sys_clock_khz(), before any PSRAM access. + // Returns true if PSRAM was found and configured. + static bool init() { + _size = rp2040.getPSRAMSize(); + if (!_size) return false; + _applyOptimalTiming(); + return true; + } + + static bool available() { return _size > 0; } + static uint32_t size() { return _size; } + static uint8_t* base() { return PSRAM_BASE; } + static uint8_t* baseUncached() { return PSRAM_BASE_NOCACHE; } + static uint32_t psramClockMHz() { return _psramMHz; } + +private: + inline static uint32_t _size = 0; + inline static uint32_t _psramMHz = 0; + + // RXDELAY is counted in sys_clk cycles, not PSRAM cycles. At 264 MHz, + // rxd=3 is only 11.4 ns — insufficient for board trace delays — so even + // div=2 (66 MHz PSRAM) fails. Empirically verified configurations: + // 200 MHz sys_clk: div=1 rxd=3 → 100 MHz PSRAM, 33 MB/s + // 264 MHz sys_clk: div=3 rxd=2 → 44 MHz PSRAM, 17 MB/s + // Staying at 200 MHz gives substantially better PSRAM throughput. + static void _applyOptimalTiming() { + const uint32_t sys_mhz = clock_get_hz(clk_sys) / 1000000u; + uint32_t div, rxd; + if (sys_mhz <= 200u) { + div = 1u; rxd = 3u; // 100 MHz PSRAM at 200 MHz, sweep-verified + } else if (sys_mhz <= 264u) { + div = 3u; rxd = 2u; // 44 MHz PSRAM at 264 MHz, sweep-verified + } else { + div = 4u; rxd = 3u; // conservative fallback for unknown clocks + } + + hw_set_bits(&xip_ctrl_hw->ctrl, XIP_CTRL_WRITABLE_M1_BITS); + uint32_t t = qmi_hw->m[1].timing; + t &= ~(QMI_M1_TIMING_CLKDIV_BITS | QMI_M1_TIMING_RXDELAY_BITS); + t |= (div << QMI_M1_TIMING_CLKDIV_LSB) | (rxd << QMI_M1_TIMING_RXDELAY_LSB); + qmi_hw->m[1].timing = t; + + _psramMHz = sys_mhz / 2u / div; + } +}; + +#endif // PSRAM_MANAGER_HPP diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/Pins.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/Pins.hpp new file mode 100644 index 0000000..d333c54 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/Pins.hpp @@ -0,0 +1,157 @@ +/** + * @file Pins.hpp + * @brief Pin definitions and initialization for the FM Synth RL project + * + * @copyright Copyright (c) 2024. This Source Code Form is subject to the terms + * of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed + * with this file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#ifndef __PINS_HPP__ +#define __PINS_HPP__ +#include +#include "../../PicoDefs.hpp" + +/** + * @brief Class containing all pin definitions and initialization functions + */ +class Pins { +public: + /** + * @name Momentary Switches + * Digital inputs with internal pull-up resistors + * @{ + */ + static constexpr uint8_t MOM_A1 = 24; ///< Momentary switch A1 + static constexpr uint8_t MOM_A2 = 25; ///< Momentary switch A2 + static constexpr uint8_t MOM_B1 = 28; ///< Momentary switch B1 + static constexpr uint8_t MOM_B2 = 29; ///< Momentary switch B2 + static constexpr uint8_t RE_SW = 23; ///< Rotary encoder switch + static constexpr uint8_t RE_B = 17; ///< Rotary encoder B signal + static constexpr uint8_t RE_A = 11; ///< Rotary encoder A signal + static constexpr uint8_t JOY_SW = 32; ///< Joystick switch + /** @} */ + + /** + * @name Toggle Switches + * Digital inputs with internal pull-up resistors + * @{ + */ + static constexpr uint8_t TOG_A1 = 26; ///< Toggle switch A1 + static constexpr uint8_t TOG_A2 = 27; ///< Toggle switch A2 + static constexpr uint8_t TOG_B1 = 30; ///< Toggle switch B1 + static constexpr uint8_t TOG_B2 = 31; ///< Toggle switch B2 + /** @} */ + + /** + * @name ADC Inputs + * 12-bit resolution analog inputs + * @{ + */ + static constexpr uint8_t JOY_X = 40; ///< Joystick X-axis (ADC0) + static constexpr uint8_t JOY_Y = 41; ///< Joystick Y-axis (ADC1) + static constexpr uint8_t JOY_Z = 42; ///< Joystick Z-axis (ADC2) + static constexpr uint8_t ADC3 = 43; ///< Joystick Z-axis (ADC3) + static constexpr uint8_t RV_GAIN1 = 47; ///< Gain potentiometer (ADC7) + static constexpr uint8_t RV_Z1 = 46; ///< Z1 potentiometer (ADC6) + static constexpr uint8_t RV_Y1 = 45; ///< Y1 potentiometer (ADC5) + static constexpr uint8_t RV_X1 = 44; ///< X1 potentiometer (ADC4) + /** @} */ + + /** + * @name LED Pins + * Digital output pins for LEDs + * @{ + */ + static constexpr uint8_t LED = 33; ///< Status LED + static constexpr uint8_t LED_TIMING = 43; ///< Timing LED + /** @} */ + + /** + * @name UART Pins + * Digital pins used for UART communication + * @{ + */ + static constexpr uint8_t DAISY_TX = 36; ///< One-way TX to Daisy (PIO software serial) + static constexpr uint8_t SENSOR_TX = 34; ///< Sensor UART TX (Serial1) + static constexpr uint8_t SENSOR_RX = 35; ///< Sensor UART RX (Serial1) + static constexpr uint8_t MIDI_TX = 4; ///< MIDI UART TX (Serial2) + static constexpr uint8_t MIDI_RX = 5; ///< MIDI UART RX (Serial2) + /** @} */ + + /** + * @name SPI Pins + * Digital pins used for SPI communication with SD card + * @{ + */ + static constexpr uint8_t SD_CS = 13; ///< SD card chip select + static constexpr uint8_t SD_SCK = 14; ///< SD card clock + static constexpr uint8_t SD_MISO = 12; ///< SD card MISO + static constexpr uint8_t SD_MOSI = 15; ///< SD card MOSI + /** @} */ + + /** + * @name I2C Pins + * Digital pins used for I2C communication + * @{ + */ + static constexpr uint8_t USEQ_SDA = 38; ///< USeq I2C SDA (CV output) + static constexpr uint8_t USEQ_SCL = 39; ///< USeq I2C SCL (CV output) + /** @} */ + + + + + /** + * @brief Initialize all pins with their respective modes + */ + static void initializePins() { + // Initialize momentary switches + pinMode(MOM_A1, INPUT_PULLUP); + pinMode(MOM_A2, INPUT_PULLUP); + pinMode(MOM_B1, INPUT_PULLUP); + pinMode(MOM_B2, INPUT_PULLUP); + pinMode(RE_SW, INPUT_PULLUP); + pinMode(RE_B, INPUT_PULLUP); + pinMode(RE_A, INPUT_PULLUP); + pinMode(JOY_SW, INPUT_PULLUP); + + // Initialize toggle switches + pinMode(TOG_A1, INPUT_PULLUP); + pinMode(TOG_A2, INPUT_PULLUP); + pinMode(TOG_B1, INPUT_PULLUP); + pinMode(TOG_B2, INPUT_PULLUP); + + // Initialize ADC pins + pinMode(JOY_X, INPUT); + pinMode(JOY_Y, INPUT); + pinMode(JOY_Z, INPUT); + pinMode(RV_GAIN1, INPUT); + pinMode(RV_Z1, INPUT); + pinMode(RV_Y1, INPUT); + pinMode(RV_X1, INPUT); + + // Initialize LED pins + pinMode(LED, OUTPUT); + pinMode(LED_TIMING, OUTPUT); + + // Initialize UART pins (just as digital IO) + pinMode(DAISY_TX, OUTPUT); + pinMode(SENSOR_TX, OUTPUT); + pinMode(SENSOR_RX, INPUT); + pinMode(MIDI_TX, OUTPUT); + pinMode(MIDI_RX, INPUT); + + // Initialize I2C pins (just as digital IO) + pinMode(USEQ_SDA, OUTPUT); + pinMode(USEQ_SCL, OUTPUT); + + // Set ADC resolution to 12 bits + analogReadResolution(12); + + + DEBUG_PRINTLN("Pins initialized."); + } +}; + +#endif // __PINS_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/Setup9999_MEMLNaut.h.renameme b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/Setup9999_MEMLNaut.h.renameme new file mode 100644 index 0000000..11339fb --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/Setup9999_MEMLNaut.h.renameme @@ -0,0 +1,187 @@ +// USER DEFINED SETTINGS +// Set driver type, fonts to be loaded, pins used and SPI control method etc. +// +// See the User_Setup_Select.h file if you wish to be able to define multiple +// setups and then easily select which setup file is used by the compiler. +// +// If this file is edited correctly then all the library example sketches should +// run without the need to make any more changes for a particular hardware setup! +// Note that some sketches are designed for a particular TFT pixel width/height + +#define USER_SETUP_ID 60 +// ################################################################################## +// +// Section 1. Call up the right driver file and any options for it +// +// ################################################################################## + +// Tell the library to use 8-bit parallel mode (otherwise SPI is assumed) +//#define TFT_PARALLEL_8_BIT + +// Display type - only define if RPi display +//#define RPI_DISPLAY_TYPE // 20MHz maximum SPI + +// Only define one driver, the other ones must be commented out +#define ILI9341_DRIVER +//#define ST7735_DRIVER // Define additional parameters below for this display +//#define ILI9163_DRIVER // Define additional parameters below for this display +//#define S6D02A1_DRIVER +//#define RPI_ILI9486_DRIVER // 20MHz maximum SPI +//#define HX8357D_DRIVER +//#define ILI9481_DRIVER +//#define ILI9486_DRIVER +//#define ILI9488_DRIVER // WARNING: Do not connect ILI9488 display SDO to MISO if other devices share the SPI bus (TFT SDO does NOT tristate when CS is high) +//#define ST7789_DRIVER // Full configuration option, define additional parameters below for this display +//#define ST7789_2_DRIVER // Minimal configuration option, define additional parameters below for this display +//#define R61581_DRIVER +//#define RM68140_DRIVER +//#define ST7796_DRIVER +//#define SSD1963_480_DRIVER +//#define SSD1963_800_DRIVER +//#define SSD1963_800ALT_DRIVER +//#define ILI9225_DRIVER + +// Some displays support SPI reads via the MISO pin, other displays have a single +// bi-directional SDA pin and the library will try to read this via the MOSI line. +// To use the SDA line for reading data from the TFT uncomment the following line: + +// #define TFT_SDA_READ // This option is for ESP32 ONLY, tested with ST7789 display only + +// For ST7735, ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display +// Try ONE option at a time to find the correct colour order for your display + +// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +// For ST7789, ST7735 and ILI9163 ONLY, define the pixel width and height in portrait orientation +// #define TFT_WIDTH 80 +// #define TFT_WIDTH 128 +// #define TFT_WIDTH 240 // ST7789 240 x 240 and 240 x 320 +// #define TFT_HEIGHT 160 +// #define TFT_HEIGHT 128 +// #define TFT_HEIGHT 240 // ST7789 240 x 240 +// #define TFT_HEIGHT 320 // ST7789 240 x 320 + +// For ST7735 ONLY, define the type of display, originally this was based on the +// colour of the tab on the screen protector film but this is not always true, so try +// out the different options below if the screen does not display graphics correctly, +// e.g. colours wrong, mirror images, or tray pixels at the edges. +// Comment out ALL BUT ONE of these options for a ST7735 display driver, save this +// this User_Setup file, then rebuild and upload the sketch to the board again: + +// #define ST7735_INITB +// #define ST7735_GREENTAB +// #define ST7735_GREENTAB2 +// #define ST7735_GREENTAB3 +// #define ST7735_GREENTAB128 // For 128 x 128 display +// #define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset) +// #define ST7735_REDTAB +// #define ST7735_BLACKTAB +// #define ST7735_REDTAB160x80 // For 160 x 80 display with 24 pixel offset + +// If colours are inverted (white shows as black) then uncomment one of the next +// 2 lines try both options, one of the options should correct the inversion. + +// #define TFT_INVERSION_ON +// #define TFT_INVERSION_OFF + + +// ################################################################################## +// +// Section 2. Define the pins that are used to interface with the display here +// +// ################################################################################## + +// If a backlight control signal is available then define the TFT_BL pin in Section 2 +// below. The backlight will be turned ON when tft.begin() is called, but the library +// needs to know if the LEDs are ON with the pin HIGH or LOW. If the LEDs are to be +// driven with a PWM signal or turned OFF/ON then this must be handled by the user +// sketch. e.g. with digitalWrite(TFT_BL, LOW); + +// #define TFT_BL 32 // LED back-light control pin +// #define TFT_BACKLIGHT_ON HIGH // Level to turn ON back-light (HIGH or LOW) + +// We must use hardware SPI, a minimum of 3 GPIO pins is needed. +// Typical setup for the RP2040 is : +// +// Display SDO/MISO to RP2040 pin D0 (or leave disconnected if not reading TFT) +// Display LED to RP2040 pin 3V3 or 5V +// Display SCK to RP2040 pin D2 +// Display SDI/MOSI to RP2040 pin D3 +// Display DC (RS/AO)to RP2040 pin D18 (can use another pin if desired) +// Display RESET to RP2040 pin D19 (can use another pin if desired) +// Display CS to RP2040 pin D20 (can use another pin if desired, or GND, see below) +// Display GND to RP2040 pin GND (0V) +// Display VCC to RP2040 5V or 3.3V (5v if display has a 5V to 3.3V regulator fitted) +// +// The DC (Data Command) pin may be labelled AO or RS (Register Select) +// +// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more +// SPI devices (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS +// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin +// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected. + +// For the Pico use these #define lines +#define TFT_MISO 16 +#define TFT_MOSI 3 +#define TFT_SCLK 2 +#define TFT_CS 20 // Chip select control pin +#define TFT_DC 18 // Data Command control pin +#define TFT_RST 22 // Reset pin (could connect to Arduino RESET pin) +//#define TFT_BL // LED back-light + +#define TOUCH_CS 21 // Chip select pin (T_CS) of touch screen + +// ################################################################################## +// +// Section 3. Define the fonts that are to be used here +// +// ################################################################################## + +// Comment out the #defines below with // to stop that font being loaded +// The ESP8366 and ESP32 have plenty of memory so commenting out fonts is not +// normally necessary. If all fonts are loaded the extra FLASH space required is +// about 17Kbytes. To save FLASH space only enable the fonts you need! + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded +// this will save ~20kbytes of FLASH +#define SMOOTH_FONT + + +// ################################################################################## +// +// Section 4. Other options +// +// ################################################################################## + +// For the RP2040 processor define the SPI port channel used, default is 0 +// #define TFT_SPI_PORT 1 // Set to 0 if SPI0 pins are used, or 1 if spi1 pins used + +// Define the SPI clock frequency, this affects the graphics rendering speed. Too +// fast and the TFT driver will not keep up and display corruption appears. +// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails +// With a ST7735 display more than 27MHz may not work (spurious pixels and lines) +// With an ILI9163 display 27 MHz works OK. + +// #define SPI_FREQUENCY 1000000 +// #define SPI_FREQUENCY 5000000 +// #define SPI_FREQUENCY 10000000 +// #define SPI_FREQUENCY 20000000 +// #define SPI_FREQUENCY 32000000 + #define SPI_FREQUENCY 70000000 + +// Optional reduced SPI frequency for reading TFT +#define SPI_READ_FREQUENCY 20000000 + +// The XPT2046 requires a lower SPI clock rate of 2.5MHz so we define that here: +#define SPI_TOUCH_FREQUENCY 2500000 + diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/common.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/common.hpp new file mode 100644 index 0000000..c9da890 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/common.hpp @@ -0,0 +1,6 @@ +#ifndef MEMLLIB_HARDWARE_MEMLNAUT_COMMON_HPP +#define MEMLLIB_HARDWARE_MEMLNAUT_COMMON_HPP + +#define MEMLLIB_VERSION "1.1.0" + +#endif // MEMLLIB_HARDWARE_MEMLNAUT_COMMON_HPP \ No newline at end of file diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display.cpp new file mode 100644 index 0000000..c7c211c --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display.cpp @@ -0,0 +1,4 @@ +#include "display.hpp" + + +TFT_eSPI tft = TFT_eSPI(); // Invoke custom library diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display.hpp new file mode 100644 index 0000000..118aa9f --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display.hpp @@ -0,0 +1,94 @@ +#ifndef __DISPLAY_H +#define __DISPLAY_H + +#include + +#include +#include + +#define DISPLAY_MEM __not_in_flash("display") + +extern TFT_eSPI tft; // Invoke custom library + + +class display { +public: + display() : textSprite(&tft), + status_text{ "NoValue", "NoValue", "NoValue", + "NoValue", "NoValue", "NoValue" } { + } + + void setup() { + tft.begin(); + tft.setRotation(1); + tft.fillScreen(TFT_BLACK); + textSprite.setFreeFont(&FreeMono9pt7b); + // tft.setTextFont(4); + // tft.setTextColor(0xFC9F); + textSprite.createSprite(320, 40); + + } + + void post(String str) { + redraw = true; + lines.push_back(str); + if(lines.size() > 10) { + lines.pop_front(); + } + } + + void statusPost(String str, size_t pos) { + if (pos >= kNStatuses) { + return; // Invalid position + } + status_text[pos] = str; + status_redraw = true; + } + + void update() { + if (redraw) { + redraw = false; + status_redraw = true; + tft.fillScreen(TFT_BLACK); + constexpr int32_t lineheight = 20; + // tft.fillRect(10, 10, 250, 30, TFT_BLUE); + // tft.fillRect(100, 100, 200, 100, TFT_RED); + for(size_t i=0; i < lines.size(); i++) { + textSprite.fillRect(0,0,320,20,TFT_BLACK); + textSprite.drawString(lines[i].c_str(), 0, 0); + textSprite.pushSprite(4,i*lineheight); + } + } + + if (status_redraw) { + status_redraw = false; + tft.fillRect(0, 200, 320, 40, TFT_BLACK); + textSprite.fillRect(0,0,320,40,TFT_BLACK); + static constexpr unsigned int status_colours[kNStatuses] = { + TFT_WHITE, TFT_RED, TFT_GREEN, + TFT_MAGENTA, TFT_YELLOW, TFT_CYAN + }; + static constexpr unsigned int status_x[kNStatuses] = { + 0, 104, 208, 0, 104, 208 + }; + static constexpr unsigned int status_y[kNStatuses] = { + 0, 0, 0, 20, 20, 20 + }; + for (unsigned int n = 0; n < kNStatuses; ++n) { + textSprite.setTextColor(status_colours[n], TFT_BLACK); + textSprite.drawString(status_text[n].c_str(), status_x[n], status_y[n]); + } + textSprite.pushSprite(4,200); + textSprite.setTextColor(TFT_WHITE, TFT_BLACK); + } + } +private: + std::deque lines; + bool redraw=false; + bool status_redraw = false; + static constexpr size_t kNStatuses = 6; + String status_text[kNStatuses]; + TFT_eSprite textSprite; +}; + +#endif diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/BarGraphView.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/BarGraphView.hpp new file mode 100644 index 0000000..0dea059 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/BarGraphView.hpp @@ -0,0 +1,164 @@ +#ifndef __BARGRAPH_VIEW_HPP__ +#define __BARGRAPH_VIEW_HPP__ + +#include "View.hpp" +#include "UIElements.hpp" + + +class BarGraphView : public ViewBase { +public: + BarGraphView(String name, size_t nOutputs, int barwidth = 2, int colour = TFT_GREEN, float rangeLow=0.f, float rangeHigh=1.f) + : ViewBase(name), colour(colour), barwidth(barwidth), oldValues(nOutputs, 0.0f), newValues(nOutputs, 0.0f), + rangeLow(rangeLow), rangeHigh(rangeHigh), runningMax(nOutputs,0), runningMin(nOutputs,0) + { + + } + + void OnSetup() override { + offsetX = 5; + offsetY = 5; + barSectionWidth = (area.w - (2 * offsetX)) / static_cast(newValues.size()); + barSectionHeight = area.h - (2 * offsetY); + rangeTotal = rangeHigh - rangeLow; + rangeTotalInv = 1.f / rangeTotal; + } + + void OnDisplay() override { + }; + + void setSpectrumColors(uint16_t low, uint16_t high) { + spectrumLow_ = low; + spectrumHigh_ = high; + useSpectrum_ = true; + } + + void setNumDisplayBars(size_t n) { + if (n == 0 || n == newValues.size()) return; + newValues.assign(n, 0.f); + oldValues.assign(n, 0.f); + runningMax.assign(n, 0.f); + runningMin.assign(n, 0.f); + if (area.w > 0) { + barSectionWidth = (area.w - (2 * offsetX)) / static_cast(n); + if (scr) scr->fillRect(area.x, area.y, area.w, area.h, TFT_BLACK); + } + redraw(); + } + + void UpdateValues(const std::vector& values, bool resetMinMax=false) { + size_t n = std::min(values.size(), newValues.size()); + for(size_t i=0; i < n; i++) { + newValues[i] = values[i]; + } + if (resetMinMax) { + runningMax = values; + runningMin = values; + } + redraw(); + } + + + void OnDraw() override { + for(size_t i=0; i < newValues.size(); i++) { + float newVal = newValues[i]; + // if (newVal < rangeLow) { + // newVal = rangeLow; + // } else if (newVal > rangeHigh) { + // newVal = rangeHigh; + // } + float normalizedNewValue = (newVal - rangeLow) * rangeTotalInv; + int newBarHeight = static_cast(normalizedNewValue * barSectionHeight); + + float oldVal = oldValues[i]; + // if (newVal < rangeLow) { + // newVal = rangeLow; + // } else if (newVal > rangeHigh) { + // newVal = rangeHigh; + // } + float normalizedOldValue = (oldVal - rangeLow) * rangeTotalInv; + int oldBarHeight = static_cast(normalizedOldValue * barSectionHeight); + + int x = area.x + offsetX + static_cast(i * barSectionWidth); + + int newy = area.y + area.h - offsetY - newBarHeight; + int oldy = area.y + area.h - offsetY - oldBarHeight; + + // if (newy < oldy) { + // scr->fillRect(x,oldy,barwidth,oldy-newy,TFT_BLACK); + // }else{ + // scr->fillRect(x,newy,barwidth,newy-oldy,colour); + // } + // scr->drawLine(x,oldy, x+barwidth, oldy, TFT_BLACK); + // scr->drawLine(x,newy, x+barwidth, newy, colour); + uint16_t barColour = useSpectrum_ + ? lerpRGB565(spectrumLow_, spectrumHigh_, normalizedNewValue) + : static_cast(colour); + scr->fillRect(x, oldy, barwidth, 4, TFT_BLACK); + scr->fillRect(x, newy, barwidth, 4, barColour); + + // Update running max/min + //TODO: what happens after reset? + + // if (newValues[i] > runningMax[i]) { + + // float normalizedOldMaxValue = (runningMax[i] - rangeLow) * rangeTotalInv; + // int oldMaxBarHeight = static_cast(normalizedOldMaxValue * barSectionHeight); + // int oldmaxy = area.y + area.h - offsetY - oldMaxBarHeight; + // scr->drawLine(x,oldmaxy, x+barwidth, oldmaxy, TFT_BLACK); + + // runningMax[i] = newValues[i]; + + // normalizedOldMaxValue = (runningMax[i] - rangeLow) * rangeTotalInv; + // oldMaxBarHeight = static_cast(normalizedOldMaxValue * barSectionHeight); + // oldmaxy = area.y + area.h - offsetY - oldMaxBarHeight; + // scr->drawLine(x,oldmaxy, x+barwidth, oldmaxy, TFT_PINK); + // } + // if (newValues[i] < runningMin[i]) { + + // float normalizedOldMinValue = (runningMin[i] - rangeLow) * rangeTotalInv; + // int oldMinBarHeight = static_cast(normalizedOldMinValue * barSectionHeight); + // int oldminy = area.y + area.h - offsetY - oldMinBarHeight; + // scr->drawLine(x,oldminy, x+barwidth, oldminy, TFT_BLACK); + + // runningMin[i] = newValues[i]; + + // normalizedOldMinValue = (runningMin[i] - rangeLow) * rangeTotalInv; + // oldMinBarHeight = static_cast(normalizedOldMinValue * barSectionHeight); + // oldminy = area.y + area.h - offsetY - oldMinBarHeight; + // scr->drawLine(x,oldminy, x+barwidth, oldminy, TFT_PINK); + // } + } + oldValues = newValues; // Update old values after drawing + drawnValues = true; + } + + + +private: + static uint16_t lerpRGB565(uint16_t c1, uint16_t c2, float t) { + int r = ((c1 >> 11) & 0x1F) + static_cast((static_cast((c2 >> 11) & 0x1F) - static_cast((c1 >> 11) & 0x1F)) * t); + int g = ((c1 >> 5) & 0x3F) + static_cast((static_cast((c2 >> 5) & 0x3F) - static_cast((c1 >> 5) & 0x3F)) * t); + int b = ( c1 & 0x1F) + static_cast((static_cast( c2 & 0x1F) - static_cast( c1 & 0x1F)) * t); + return (static_cast(r) << 11) | (static_cast(g) << 5) | static_cast(b); + } + + std::vector newValues, oldValues; + int colour = TFT_GREEN; + int barwidth = 2; + bool useSpectrum_{false}; + uint16_t spectrumLow_{TFT_GREEN}; + uint16_t spectrumHigh_{TFT_BLUE}; + float rangeLow = 0.0f; + float rangeHigh = 1.0f; + float rangeTotal=1.f; + float rangeTotalInv=1.f; + + int offsetX, offsetY; + float barSectionWidth, barSectionHeight; + bool drawnValues = false; + + std::vector runningMax, runningMin; + +}; + +#endif diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/BlockSelectView.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/BlockSelectView.hpp new file mode 100644 index 0000000..bc36e75 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/BlockSelectView.hpp @@ -0,0 +1,119 @@ +#ifndef __BLOCK_SELECT_VIEW_HPP__ +#define __BLOCK_SELECT_VIEW_HPP__ + +#include "View.hpp" +#include "UIElements.hpp" +#include "ButtonView.hpp" + + +class BlockSelectView : public ViewBase { +public: + using OnSelectCallback = std::function; + + BlockSelectView(String name, int _buttonColour_ = TFT_BLUE, size_t nButtons_=8, size_t buttonWidth_=60, size_t buttonHeight_=60, int fontColour_=TFT_WHITE, std::vector buttonNames_ = {}, int buttonAltColour_=TFT_BLUE, uint8_t buttonFontNum_=4, int altFontColour_=TFT_MAROON, int32_t altBorderWidth_=3) + : ViewBase(name), buttonColour(_buttonColour_), buttonAltColour(buttonAltColour_), + nButtons(nButtons_), buttonWidth(buttonWidth_), buttonHeight(buttonHeight_), fontColour(fontColour_), altFontColour(altFontColour_), altBorderWidth(altBorderWidth_), buttonFontNum(buttonFontNum_) + { + rows = (nButtons > 4) ? 2 : 1; + cols = (nButtons + 1) / rows; + if (!buttonNames_.empty() && buttonNames_.size() == nButtons_) { + buttonNames = buttonNames_; + } else { + for(size_t i = 1; i <= nButtons; i++) { + buttonNames.push_back(String(i)); + } + } + altColour.resize(nButtons, false); + } + + void SetOnSelectCallback(OnSelectCallback _cb_) { + cb = _cb_; + } + + void setAltColour(size_t index, bool on) { + altColour[index] = on; + } + + void toggleAlt(size_t index) { + altColour[index] = !altColour[index]; + buttons[index]->setFillColour(altColour[index] ? buttonAltColour : buttonColour); + buttons[index]->setFontColour(altColour[index] ? altFontColour : fontColour); + buttons[index]->setBorderWidth(altColour[index] ? altBorderWidth : 1); + } + + void setAltState(size_t index, bool on) { + if (index >= buttons.size()) return; + altColour[index] = on; + buttons[index]->setFillColour(on ? buttonAltColour : buttonColour); + buttons[index]->setFontColour(on ? altFontColour : fontColour); + buttons[index]->setBorderWidth(on ? altBorderWidth : 1); + } + + + void OnSetup() override { + int idx=1; + for(int i=0; i < cols; i++) { + for(int j=0; j < rows; j++) { + if (idx <= nButtons) { + auto button = std::make_shared(buttonNames[idx-1], idx, altColour[idx-1] ? buttonAltColour : buttonColour, fontColour, buttonFontNum); + rect bounds = { static_cast(area.x + 10 + (i * (buttonWidth+10))), static_cast(area.y + 10 + (j*(buttonHeight+10))), static_cast(buttonWidth), static_cast(buttonHeight) }; + AddSubView(button, bounds); + button->SetReleaseCallback([this](size_t id) { + if (cb) { + cb(id); + } + }); + buttons.push_back(button); + idx++; + } + } + } + } + + void OnDraw() override { + TFT_eSprite textSprite(scr); + textSprite.createSprite(320, 20); + textSprite.setTextFont(2); + scr->fillRect(area.x, area.y, area.w, area.h, TFT_BLACK); + constexpr int32_t lineheight = 20; + textSprite.setTextColor(TFT_WHITE, TFT_BLACK); + textSprite.fillRect(0,0,320,20,TFT_BLACK); + textSprite.drawString(msg, 3, 0); + textSprite.pushSprite(area.x,area.y + area.h - 25); + } + + void updateButtonName(size_t idx, const String& newName) { + if (idx < buttons.size()) { + buttons[idx]->name_ = newName; + buttons[idx]->redraw(); + } + } + + void SetMessage(const String &__msg) { + msg = __msg; + redraw(); + } + + + +private: + std::vector> buttons; + int buttonColour; + int buttonAltColour; + OnSelectCallback cb = nullptr; + String msg; + + size_t nButtons; + size_t rows; + size_t cols; + size_t buttonWidth = 50; + size_t buttonHeight = 50; + int fontColour = TFT_WHITE; + int altFontColour = TFT_MAROON; + int32_t altBorderWidth = 3; + std::vector buttonNames; + std::vector altColour; + uint8_t buttonFontNum = 4; +}; + +#endif diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/ButtonView.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/ButtonView.hpp new file mode 100644 index 0000000..88315d0 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/ButtonView.hpp @@ -0,0 +1,86 @@ +#ifndef __BUTTON_VIEW_HPP__ +#define __BUTTON_VIEW_HPP__ + +#include "View.hpp" +#include "UIElements.hpp" + + +class ButtonView : public ViewBase { +public: + + using ButtonCallback = std::function; + + ButtonView(String name, size_t _id_, int _fillcolour_ = TFT_BLUE, int _fontcolour_ = TFT_WHITE, uint8_t fontNum_ = 4) + : ViewBase(name), fillColour(_fillcolour_), fontColour(_fontcolour_), + id(_id_), fontNum(fontNum_) + { + } + + void SetReleaseCallback(ButtonCallback __callback) { + callback = __callback; + } + + void OnSetup() override { + } + + void setFillColour(int newCol) { + fillColour = newCol; + redraw(); + } + + void setFontColour(int newCol) { + fontColour = newCol; + redraw(); + } + + void setBorderWidth(int w) { + borderWidth = w; + redraw(); + } + + void OnDraw() override { + TFT_eSprite sprite(scr); + sprite.createSprite(area.w, area.h); + + sprite.fillSprite(fillColour); + int32_t bw = pressed ? 1 : borderWidth; + int32_t col = pressed ? TFT_RED : TFT_WHITE; + for (int32_t i = 0; i < bw; i++) { + sprite.drawRect(i, i, area.w - 2*i, area.h - 2*i, col); + } + sprite.setTextColor(fontColour); + sprite.setTextFont(fontNum); + sprite.drawString(this->name_, 10, 10); + sprite.pushSprite(area.x, area.y); + // scr->drawString("1", area.x + 10, area.y + 10); + } + + + void OnTouchDown(size_t x, size_t y) override { + pressed = true; + redraw(); + // Check if the touch is within the button area + } + + void OnTouchUp(size_t x, size_t y) override { + if (callback) { + callback(id); + } + pressed = false; + redraw(); + } + + +private: + int fillColour; + int fontColour; + size_t id; + + ButtonCallback callback = nullptr; + + bool pressed = false; + uint8_t fontNum = 4; + int32_t borderWidth = 1; +}; + +#endif diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/CCSelectView.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/CCSelectView.hpp new file mode 100644 index 0000000..a091c62 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/CCSelectView.hpp @@ -0,0 +1,407 @@ +#ifndef __CC_SELECT_VIEW_HPP__ +#define __CC_SELECT_VIEW_HPP__ + +#include "View.hpp" +#include "UIElements.hpp" +#include +#include +#include +#include + +struct CCOption { + uint8_t num; + String name; +}; + +// Scrollable named-CC selector. +// Shows a list of CCOption entries; allows selecting up to maxActive_. +// Selection order is preserved — index in selectedCCs_ == NN output index. +// Navigate with rotary encoder (scroll) or touch (tap row). Press encoder to toggle. +class CCSelectView : public ViewBase { +public: + using OnChangeCallback = std::function&)>; + using OnHomeChangeCallback = std::function; + using OnSaveCallback = std::function; + + CCSelectView(size_t maxActive, String name = "MIDI CC Out") + : ViewBase(name), maxActive_(maxActive) { lastLiveDrawn_.assign(maxActive_, -999); } + + void setOptions(std::vector opts) { + options_ = std::move(opts); + } + + void setOnChangeCallback(OnChangeCallback cb) { cb_ = cb; } + void setOnHomeChangeCallback(OnHomeChangeCallback cb) { homeCb_ = cb; } + // Fires when the user leaves the page or exits focus, and only if something changed. + // Use this to persist to flash — avoids slow per-edit flash writes. + void setOnSaveCallback(OnSaveCallback cb) { saveCb_ = cb; } + + // Clear the unsaved-changes flag (e.g. after programmatically applying a mapping, so + // it isn't treated as a user edit needing save-on-exit). + void resetDirty() { dirty_ = false; } + + // Opt-in: show + allow editing the per-CC home value column. Off by default so + // modes that don't use home values render unchanged. + void setShowHome(bool v) { showHome_ = v; } + + // Opt-in live-output column: point at an external array of the values actually being + // sent (one per NN output slot, [0..1]). Enables the "out" column. + void setLiveValues(const float* values) { liveValues_ = values; } + + // Repaint only the changed live-output cells. Drive this each loop from the mode; + // it self-throttles and only redraws cells whose value changed (no flicker). + void refreshLiveColumn() { + if (!scr || liveValues_ == nullptr) return; + if (!IsVisible()) { liveWasVisible_ = false; return; } + unsigned long now = millis(); + if (liveWasVisible_ && (now - lastLiveRefreshMs_) < kLiveRefreshMs) return; + lastLiveRefreshMs_ = now; + if (!liveWasVisible_) { // force full repaint when re-shown + std::fill(lastLiveDrawn_.begin(), lastLiveDrawn_.end(), -999); + liveWasVisible_ = true; + } + for (int i = 0; i < kVisibleRows; i++) { + size_t optIdx = scrollOffset_ + (size_t)i; + if (optIdx >= options_.size()) break; + int slot = slotOf(options_[optIdx].num); + if (slot <= 0) continue; + int val = (int)(clamp01(liveValues_[slot - 1]) * 127.f + 0.5f); + if (slot - 1 < (int)lastLiveDrawn_.size() && val == lastLiveDrawn_[slot - 1]) continue; + drawLiveCell(optIdx); + } + } + + size_t getMaxActive() const { return maxActive_; } + const std::vector& getSelectedCCs() const { return selectedCCs_; } + + void setSelectedCCs(const std::vector& ccs) { + selectedCCs_.clear(); + for (uint8_t cc : ccs) { + if (selectedCCs_.size() >= maxActive_) break; + selectedCCs_.push_back(cc); + } + std::sort(selectedCCs_.begin(), selectedCCs_.end()); + std::fill(lastLiveDrawn_.begin(), lastLiveDrawn_.end(), -999); + } + + // Per-CC "home" values, in [0..1], keyed by CC number so they survive sorting. + // getHomeValues() returns them aligned to getSelectedCCs() (== NN output order). + std::vector getHomeValues() const { + std::vector out; + out.reserve(selectedCCs_.size()); + for (uint8_t cc : selectedCCs_) { + auto it = homeByCC_.find(cc); + out.push_back(it != homeByCC_.end() ? it->second : 0.f); + } + return out; + } + + void setHomeValues(const std::vector& homes) { + for (size_t i = 0; i < selectedCCs_.size() && i < homes.size(); i++) + homeByCC_[selectedCCs_[i]] = clamp01(homes[i]); + } + + // Set the home of the CC currently under the cursor (if it's selected), using + // soft pickup: when the cursor moves to a new CC the knob must first cross that + // CC's stored home value before it takes control (avoids value jumps). + // Returns true if a home value was actually changed. + bool setHomeForCursor(float v) { + if (cursorRow_ >= options_.size()) return false; // Done row + uint8_t cc = options_[cursorRow_].num; + if (slotOf(cc) == 0) return false; // not a selected CC + + auto it = homeByCC_.find(cc); + float target = (it != homeByCC_.end()) ? it->second : 0.f; + + if ((int)cursorRow_ != homePickupRow_) { // arm pickup for this CC + homePickupRow_ = (int)cursorRow_; + homePickupCaught_ = false; + lastHomeKnob_ = v; + } + if (!homePickupCaught_) { + constexpr float eps = 0.5f / 127.f; + bool crossed = ((v - target) <= 0.f) != ((lastHomeKnob_ - target) <= 0.f); + float dist = (v > target) ? (v - target) : (target - v); + if (crossed || dist <= eps) homePickupCaught_ = true; + } + lastHomeKnob_ = v; + if (!homePickupCaught_) return false; // still seeking — don't move it + + homeByCC_[cc] = clamp01(v); + dirty_ = true; + drawHomeCell(cursorRow_); // partial redraw — just the value, no full-screen flicker + if (homeCb_) homeCb_(); + return true; + } + + void OnSetup() override { + // If no named options were provided, generate a generic numbered list (CC 1–127) + if (options_.empty()) { + for (uint8_t i = 1; i <= 127; i++) + options_.push_back({i, "CC " + String(i)}); + } + } + + void OnDraw() override { + scr->fillRect(area.x, area.y, area.w, area.h, TFT_BLACK); + + // Header + scr->setTextColor(TFT_WHITE, TFT_BLACK); + scr->setTextFont(2); + String hdr = String(selectedCCs_.size()) + "/" + String(maxActive_) + " assigned"; + scr->drawString(hdr, area.x + 4, area.y + 4); + + // Right-side column labels: set (home) | out (live) | cc + scr->setTextFont(1); + scr->setTextColor(TFT_SILVER, TFT_BLACK); + if (showHome_) scr->drawString("home", area.x + area.w - 116, area.y + 8); + if (liveValues_) scr->drawString("out", area.x + area.w - 78, area.y + 8); + scr->drawString("cc", area.x + area.w - 40, area.y + 8); + scr->setTextFont(2); + + // Rows (options + one trailing Done entry) + size_t totalItems = options_.size() + 1; + for (int i = 0; i < kVisibleRows; i++) { + size_t optIdx = scrollOffset_ + (size_t)i; + if (optIdx >= totalItems) break; + + int ry = area.y + kHeaderH + i * kRowH; + bool isCursor = (optIdx == cursorRow_); + bool isDone = (optIdx == options_.size()); + + if (isDone) { + uint16_t bg = isCursor ? (uint16_t)TFT_DARKGREEN : (uint16_t)TFT_BLACK; + scr->fillRect(area.x, ry, area.w, kRowH - 1, bg); + scr->setTextFont(2); + scr->setTextColor(TFT_WHITE, bg); + scr->drawString("[ Done ]", area.x + 36, ry + 4); + continue; + } + + int slot = slotOf(options_[optIdx].num); + bool isSel = slot > 0; + + uint16_t bg = (isSel && isCursor) ? (uint16_t)0x0660 // bright green: selected + cursor + : isSel ? (uint16_t)0x0340 // dark green: selected + : isCursor ? (uint16_t)TFT_NAVY // navy: cursor only + : (uint16_t)TFT_BLACK; + + scr->fillRect(area.x, ry, area.w, kRowH - 1, bg); + scr->setTextFont(2); + + if (isSel) { + scr->setTextColor(TFT_YELLOW, bg); + scr->drawString("[" + String(slot) + "]", area.x + 2, ry + 4); + } else if (isCursor) { + scr->setTextColor(TFT_YELLOW, bg); + scr->drawString(" > ", area.x + 2, ry + 4); + } + + scr->setTextColor(isSel ? TFT_WHITE : (isCursor ? TFT_YELLOW : TFT_SILVER), bg); + scr->drawString(options_[optIdx].name, area.x + 36, ry + 4); + + // Home value column (0..127), shown for every CC when enabled. + // Drawn via drawHomeCell so the partial-update path renders identically. + if (showHome_) drawHomeCell(optIdx); + + // Live output value column (0..127), shown for selected CCs when enabled. + if (liveValues_) drawLiveCell(optIdx); + + scr->setTextColor(0x7BEF, bg); + scr->drawString("CC" + String(options_[optIdx].num), area.x + area.w - 40, ry + 4); + } + + // Scroll indicator + if (totalItems > (size_t)kVisibleRows) { + int barH = area.h - kHeaderH; + int indicatorH = std::max(8, (int)(barH * kVisibleRows / (int)totalItems)); + int indicatorY = area.y + kHeaderH + + (int)(scrollOffset_ * (barH - indicatorH) / (totalItems - kVisibleRows)); + scr->fillRect(area.x + area.w - 4, area.y + kHeaderH, 4, barH, TFT_DARKGREY); + scr->fillRect(area.x + area.w - 4, indicatorY, 4, indicatorH, TFT_WHITE); + } + } + + bool acceptsFocus() override { return true; } + + bool setFocus() override { + redraw(); + return ViewBase::setFocus(); + } + + void removeFocus() override { + ViewBase::removeFocus(); + flushSave(); // exiting edit mode (e.g. "Done") — persist now + redraw(); + } + + void OnHide() override { + flushSave(); // navigated away from the page — persist now + } + + void HandleRotaryEncChange(int inc) override { + size_t totalItems = options_.size() + 1; + if (inc > 0 && cursorRow_ + 1 < totalItems) { + cursorRow_++; + if (cursorRow_ >= scrollOffset_ + (size_t)kVisibleRows) + scrollOffset_ = cursorRow_ - kVisibleRows + 1; + } else if (inc < 0 && cursorRow_ > 0) { + cursorRow_--; + if (cursorRow_ < scrollOffset_) + scrollOffset_ = cursorRow_; + } + resetHomePickup(); // moving the cursor re-arms soft pickup + redraw(); + } + + void HandleRotaryEncSwitch() override { + if (cursorRow_ == options_.size()) { + removeFocus(); + redraw(); + } else { + toggleAt(cursorRow_); + } + } + + void OnTouchUp(size_t tx, size_t ty) override { + size_t totalItems = options_.size() + 1; + for (int i = 0; i < kVisibleRows; i++) { + int ry = area.y + kHeaderH + i * kRowH; + if ((int)ty >= ry && (int)ty < ry + kRowH) { + size_t optIdx = scrollOffset_ + (size_t)i; + if (optIdx >= totalItems) return; + cursorRow_ = optIdx; + if (optIdx == options_.size()) { + removeFocus(); + redraw(); + } else { + toggleAt(optIdx); + } + return; + } + } + } + +private: + static constexpr int kRowH = 28; + static constexpr int kHeaderH = 22; + static constexpr int kVisibleRows = 6; + + size_t maxActive_; + std::vector options_; + std::vector selectedCCs_; // order = NN output index + std::map homeByCC_; // per-CC home value [0..1] + bool showHome_ = false; // render/edit the home column + // Soft-pickup state for gain-knob home editing + int homePickupRow_ = -1; // armed cursor row, -1 = not armed + bool homePickupCaught_ = false; // knob has crossed the stored value + float lastHomeKnob_ = -1.f; // previous knob value (crossing detection) + // Live-output column + const float* liveValues_ = nullptr; // external [0..1] values per NN slot + std::vector lastLiveDrawn_; // last drawn 0..127 per slot (change tracking) + bool liveWasVisible_ = false; + unsigned long lastLiveRefreshMs_ = 0; + static constexpr unsigned long kLiveRefreshMs = 50; // ~20 Hz live readout + size_t scrollOffset_ = 0; + size_t cursorRow_ = 0; + OnChangeCallback cb_; + OnHomeChangeCallback homeCb_; + OnSaveCallback saveCb_; + bool dirty_ = false; // unsaved selection/home changes + + static float clamp01(float v) { return v < 0.f ? 0.f : (v > 1.f ? 1.f : v); } + + // Draw only the home-value cell for one option row, without clearing the screen. + // Used by OnDraw and as the partial-update path for live gain-knob edits (both run + // in MEMLNaut::loop(), so direct drawing here doesn't race the periodic Draw()). + void drawHomeCell(size_t optIdx) { + if (!scr || !showHome_) return; + if (optIdx >= options_.size()) return; + if (optIdx < scrollOffset_ || optIdx >= scrollOffset_ + (size_t)kVisibleRows) return; + uint8_t cc = options_[optIdx].num; + int slot = slotOf(cc); + bool isSel = slot > 0; + bool isCursor = (optIdx == cursorRow_); + // Match the row background used in OnDraw so the cell blends seamlessly. + uint16_t bg = (isSel && isCursor) ? (uint16_t)0x0660 // selected + cursor + : isSel ? (uint16_t)0x0340 // selected + : isCursor ? (uint16_t)TFT_NAVY // cursor only + : (uint16_t)TFT_BLACK; + int ry = area.y + kHeaderH + (int)(optIdx - scrollOffset_) * kRowH; + int hx = area.x + area.w - 116; + auto it = homeByCC_.find(cc); + float home = (it != homeByCC_.end()) ? it->second : 0.f; + int homeInt = (int)(home * 127.f + 0.5f); + // High-contrast on every background: white when set, red while the gain knob + // is still seeking pickup, dim grey for unselected CCs. + bool seeking = isSel && isCursor && !homePickupCaught_; + uint16_t col = seeking ? (uint16_t)TFT_RED + : isSel ? (uint16_t)TFT_WHITE + : (uint16_t)TFT_DARKGREY; + scr->fillRect(hx, ry, 36, kRowH - 1, bg); + scr->setTextFont(2); + scr->setTextColor(col, bg); + scr->drawString(String(homeInt), hx, ry + 4); + } + + // Draw only the live-output cell for one option row (selected CCs only). + // Shares the run-context rules of drawHomeCell (callable outside OnDraw). + void drawLiveCell(size_t optIdx) { + if (!scr || liveValues_ == nullptr) return; + if (optIdx >= options_.size()) return; + if (optIdx < scrollOffset_ || optIdx >= scrollOffset_ + (size_t)kVisibleRows) return; + uint8_t cc = options_[optIdx].num; + int slot = slotOf(cc); + if (slot <= 0) return; // only selected CCs have a live output value + bool isCursor = (optIdx == cursorRow_); + uint16_t bg = isCursor ? (uint16_t)0x0660 : (uint16_t)0x0340; // selected row bg + int ry = area.y + kHeaderH + (int)(optIdx - scrollOffset_) * kRowH; + int lx = area.x + area.w - 78; + int val = (int)(clamp01(liveValues_[slot - 1]) * 127.f + 0.5f); + scr->fillRect(lx, ry, 36, kRowH - 1, bg); + scr->setTextFont(2); + scr->setTextColor(TFT_CYAN, bg); + scr->drawString(String(val), lx, ry + 4); + if (slot - 1 < (int)lastLiveDrawn_.size()) lastLiveDrawn_[slot - 1] = val; + } + + // Returns 1-based slot number, 0 if not selected + int slotOf(uint8_t cc) const { + for (size_t i = 0; i < selectedCCs_.size(); i++) + if (selectedCCs_[i] == cc) return (int)i + 1; + return 0; + } + + void toggleAt(size_t optIdx) { + uint8_t ccNum = options_[optIdx].num; + auto it = std::find(selectedCCs_.begin(), selectedCCs_.end(), ccNum); + if (it != selectedCCs_.end()) { + selectedCCs_.erase(it); + homeByCC_.erase(ccNum); + } else { + if (selectedCCs_.size() < maxActive_) { + selectedCCs_.push_back(ccNum); + std::sort(selectedCCs_.begin(), selectedCCs_.end()); + homeByCC_[ccNum] = 0.f; // default home + } + } + resetHomePickup(); // selection changed — re-arm soft pickup + std::fill(lastLiveDrawn_.begin(), lastLiveDrawn_.end(), -999); + dirty_ = true; + redraw(); + if (cb_) cb_(selectedCCs_); + } + + void resetHomePickup() { + homePickupRow_ = -1; + homePickupCaught_ = false; + } + + // Persist (via saveCb_) only if something changed since the last save. + void flushSave() { + if (dirty_ && saveCb_) saveCb_(); + dirty_ = false; + } +}; + +#endif // __CC_SELECT_VIEW_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/DisplayDriver.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/DisplayDriver.cpp new file mode 100644 index 0000000..74c5ccc --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/DisplayDriver.cpp @@ -0,0 +1,219 @@ +#include "DisplayDriver.hpp" + +void DisplayDriver::Setup() { + // Clear screen + Serial.println("display setup"); + Serial.println("init tft..."); + tft_.init(); + tft_.setRotation(1); + tft_.fillScreen(TFT_BLACK); + tft_initialized_ = true; + Serial.println("display init"); + + // Set up touch + tft_.setTouch(calData_); + isTouchPressed_ = false; + Serial.println("touch init"); + + // Set up grid dimensions + screenWidth_ = tft_.width(); + screenHeight_ = tft_.height(); + grid_.widthElements = kGridWidthElements; + grid_.heightElements = kGridHeightElements; + grid_.widthStep = screenWidth_ / grid_.widthElements; + grid_.heightStep = screenHeight_ / grid_.heightElements; + + // Top bar is drawn directly in Draw() (no sprite buffers) to save RAM. + + tft_.fillScreen(TFT_BLACK); + + mainArea = {0, topBarHeight + 5, screenWidth_, screenHeight_ - topBarHeight - 5}; + + // Set up views + currentViewIndex_ = 0; + for (auto &view : views_) { + view->SetGrid(grid_); + view->Setup(&tft_, mainArea); + } + + // Set up internal view + + // Trigger initial redraw + redraw_internal_ = true; +} + +void DisplayDriver::Draw() { + // Serial.println("display draw"); + lastDrawTime_ = millis(); + + // Check if any of the views need redrawing + bool needRedraw = false; + if (redraw_internal_) { + + // Clear screen + tft_.fillScreen(TFT_BLACK); + // tft_.setTextColor(TFT_WHITE); + tft_.fillRect(0, 0, tft_.width(), 30, TFT_WHITE); + + // Clear the redraw flag now that screen is cleared + // This allows rapid view changes while ensuring old content is removed + redraw_internal_ = false; + + // tft_.setFreeFont(&FreeSansBoldOblique24pt7b); + // tft_.setTextFont(4); + + // Top bar drawn directly onto the (already white-filled) bar — no sprites. + tft_.setTextFont(4); + tft_.setTextColor(TFT_BLUE, TFT_WHITE); + tft_.setTextDatum(TL_DATUM); + if (dialogView_) { + // Dialog active: no nav arrows, show dialog title + tft_.drawString(dialogView_->GetName().c_str(), 43, 3); + dialogView_->redraw(); + } else { + // Back arrow if not on first view + if (currentViewIndex_ > 0) { + tft_.drawString("<", 3, 3); + } + // Forward arrow if not on last view + if (currentViewIndex_ < views_.size() - 1) { + tft_.drawString(">", tft_.width() - 27, 3); + } + // Title of current view, between the arrows + if (currentViewIndex_ < views_.size()) { + tft_.drawString(views_[currentViewIndex_]->GetName().c_str(), 43, 3); + } else { + tft_.drawString("No View", 43, 3); + } + views_[currentViewIndex_]->redraw(); + } + } + if (dialogView_) { + dialogView_->Draw(); + } else if (currentViewIndex_ < views_.size()) { + views_[currentViewIndex_]->Draw(); + } + + +} + +void DisplayDriver::NavigateToView(const std::shared_ptr& target) { + auto it = std::find(views_.begin(), views_.end(), target); + if (it == views_.end()) return; + size_t targetIndex = static_cast(it - views_.begin()); + if (targetIndex == currentViewIndex_) return; + views_[currentViewIndex_]->setVisible(false); + views_[currentViewIndex_]->removeFocus(); + views_[currentViewIndex_]->OnHide(); + currentViewIndex_ = targetIndex; + views_[currentViewIndex_]->setVisible(true); + views_[currentViewIndex_]->OnDisplay(); + redraw_internal_ = true; +} + +void DisplayDriver::ShowDialog(const std::shared_ptr& dialog) { + dialogView_ = dialog; + dialog->OnDisplay(); + redraw_internal_ = true; +} + +void DisplayDriver::DismissDialog() { + if (dialogView_) { + dialogView_->OnHide(); + dialogView_ = nullptr; + redraw_internal_ = true; + } +} + +void DisplayDriver::ChangeView(int delta) { + if (dialogView_) return; + if (!redraw_internal_) { //wait until the current redraw is finished + auto lastViewIndex = currentViewIndex_; + bool viewChange = false; + if (delta < 0 && currentViewIndex_ > 0) { + currentViewIndex_--; + viewChange = true; + } else if (delta > 0 && currentViewIndex_ < views_.size() - 1) { + currentViewIndex_++; + viewChange = true; + } + if (viewChange) { + // If view changed, redraw the new view + redraw_internal_ = true; + views_[lastViewIndex]->setVisible(false); + views_[lastViewIndex]->removeFocus(); + views_[lastViewIndex]->OnHide(); // Call OnHide for the old view + views_[currentViewIndex_]->setVisible(true); + views_[currentViewIndex_]->OnDisplay(); // Call OnDisplay for the new view + } + } +} + +void DisplayDriver::PollTouch() { + // lastTouchTime_ = millis(); + + uint16_t x, y; + bool pressed = tft_.getTouch(&x, &y, 20); + if(pressed) { + lastTouchX = x; + lastTouchY = y; + } + + if (currentViewIndex_ < views_.size()) { + bool viewChange = false; + if (pressed && !isTouchPressed_) { + auto lastViewIndex = currentViewIndex_; + // If within first row, handle navigation + if (y <= topBarHeight) { + // if (x < leftButton.width() && currentViewIndex_ > 0) { + // // Navigate to previous view + // currentViewIndex_--; + // redraw_internal_ = true; + // viewChange = true; + // } + // else if (x > tft_.width() - rightButton.width() && currentViewIndex_ < views_.size() - 1) { + // // Navigate to next view + // currentViewIndex_++; + // redraw_internal_ = true; + // viewChange = true; + // } + if (!dialogView_) { + constexpr int kNavButtonWidth = 30; // nav-arrow touch zone (was sprite width) + if (x < kNavButtonWidth) { + ChangeView(-1); + } + else if (x > tft_.width() - kNavButtonWidth) { + ChangeView(1); + } + } + } else { + auto& activeView = dialogView_ ? dialogView_ : views_[currentViewIndex_]; + activeView->HandleTouch(lastTouchX, lastTouchY); + } + // if (viewChange) { + // // If view changed, redraw the new view + // views_[lastViewIndex]->setVisible(false); + // views_[lastViewIndex]->OnHide(); // Call OnHide for the old view + // views_[currentViewIndex_]->setVisible(true); + // views_[currentViewIndex_]->OnDisplay(); // Call OnDisplay for the new view + // } + isTouchPressed_ = true; + } else if (isTouchPressed_) { + //drag event + } + if (!pressed && isTouchPressed_) { + // If touch was released, handle release + // views_[currentViewIndex_]->HandleRelease(); + // If released, check if any button was released + auto& activeView = dialogView_ ? dialogView_ : views_[currentViewIndex_]; + activeView->HandleTouchRelease(lastTouchX, lastTouchY); + Serial.println("Touch released"); + Serial.print("x: "); + Serial.print(x); + Serial.print(", y: "); + Serial.println(y); + isTouchPressed_ = false; + } + } + +} diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/DisplayDriver.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/DisplayDriver.hpp new file mode 100644 index 0000000..d19c32f --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/DisplayDriver.hpp @@ -0,0 +1,124 @@ +#ifndef __DISPLAY_DRIVER_HPP__ +#define __DISPLAY_DRIVER_HPP__ + +#include "View.hpp" +#include +#include +#include +#include +#include + + +#include +#include + + +class DisplayDriver { +public: + DisplayDriver() {} + + void Setup(); + void Draw(); + inline void AddView(const std::shared_ptr &view) + { + views_.push_back(view); + view->SetGrid(grid_); + if (tft_initialized_) { + view->Setup(&tft_, mainArea); + } + redraw_internal_ = true; + } + inline void RegisterDialog(const std::shared_ptr& view) { + view->SetGrid(grid_); + if (tft_initialized_) { + view->Setup(&tft_, mainArea); + } + } + inline void InsertViewAfter(const std::shared_ptr &existingView, const std::shared_ptr &newView) + { + auto it = std::find(views_.begin(), views_.end(), existingView); + if (it != views_.end()) { + views_.insert(it + 1, newView); + newView->SetGrid(grid_); + if (tft_initialized_) { + newView->Setup(&tft_, mainArea); + } + redraw_internal_ = true; + } + } + void PollTouch(); + unsigned long GetLastTouchTime() const { return lastTouchTime_; } + unsigned long GetLastDrawTime() const { return lastDrawTime_; } + + void ChangeView(int delta); + void NavigateToView(const std::shared_ptr& target); + void ShowDialog(const std::shared_ptr& dialog); + void DismissDialog(); + + void RotaryIncEvent(int delta) { + if (dialogView_) { + dialogView_->HandleRotaryEncChange(delta); + return; + } + if (currentViewIndex_ < views_.size()) { + auto& currentView = views_[currentViewIndex_]; + if (currentView->isFocused()) { + currentView->HandleRotaryEncChange(delta); + }else{ + ChangeView(delta); + } + } + } + void RotarySwitchEvent() { + if (dialogView_) { + dialogView_->HandleRotaryEncSwitch(); + return; + } + if (currentViewIndex_ < views_.size()) { + auto& currentView = views_[currentViewIndex_]; + if (currentView->isFocused()) { + currentView->HandleRotaryEncSwitch(); + } else { + if (currentView->setFocus()) { + } + } + } + } + +private: + // Internal TFT hardware instance + TFT_eSPI tft_; + + + // Views + std::vector> views_; + size_t currentViewIndex_; + std::shared_ptr dialogView_{nullptr}; + + // Calibration + uint16_t calData_[5] = { 421, 3470, 270, 3492, 7 }; + + // Grid + static constexpr size_t kGridWidthElements = 16; + static constexpr size_t kGridHeightElements = 12; + int screenWidth_; + int screenHeight_; + GridDef grid_; + + bool redraw_internal_{false}; + unsigned long lastTouchTime_{0}; + unsigned long lastDrawTime_{0}; + bool tft_initialized_{false}; + bool isTouchPressed_{false}; + + //top bar (drawn directly to the TFT — no sprite buffers, saves ~14 KB RAM) + rect mainArea; + + int lastTouchX, lastTouchY; + + const int topBarHeight = 30; + +}; + + +#endif // __DISPLAY_DRIVER_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/GraphView.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/GraphView.hpp new file mode 100644 index 0000000..676de83 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/GraphView.hpp @@ -0,0 +1,161 @@ +#ifndef __GRAPH_VIEW_HPP__ +#define __GRAPH_VIEW_HPP__ + +#include "View.hpp" +#include "UIElements.hpp" + + +template +class GraphView : public ViewBase { + +public: + TFT_eSprite *sprite = nullptr; + TFT_eSprite *sprTitle = nullptr; + TFT_eSprite *sprMax = nullptr; + + GraphView(String name, int _fillcolour_ = TFT_BLUE) + : ViewBase(name), fillColour(_fillcolour_) + { + } + + + void OnSetup() override { + graphHeight = area.h - 20; + xstep = static_cast(area.w) / static_cast(NPOINTS - 1); + + sprite = new TFT_eSprite(scr); + sprite->createSprite(area.w, graphHeight); + + sprTitle = new TFT_eSprite(scr); + sprTitle->createSprite(100,20); + + sprMax = new TFT_eSprite(scr); + sprMax->createSprite(100,15); + + sprTitle->fillSprite(TFT_BLACK); + sprTitle->setTextColor(TFT_SILVER, TFT_BLACK); + sprTitle->setTextFont(2); + sprTitle->drawString(this->name_, 0, 0); + + + + + } + + void OnDraw() override { + // scr->fillRect(area.x, area.y, area.w, area.h, TFT_BLUE); + // if (pressed) { + // scr->drawRect(area.x, area.y, area.w, area.h, TFT_RED); + // } else { + // scr->drawRect(area.x, area.y, area.w, area.h, TFT_WHITE); + // } + // scr->setTextColor(TFT_WHITE); + // scr->setTextFont(4); + // scr->drawString(this->name_, area.x + 10, area.y + 10); + // scr->drawString("1", area.x + 10, area.y + 10); + // for(size_t i = 0; i < NPOINTS-1; i++) { + // scr->drawLine(oldGraphPoints[i].x, oldGraphPoints[i].y, oldGraphPoints[i+1].x, oldGraphPoints[i+1].y, TFT_BLACK); + // } + sprite->fillSprite(TFT_BLACK); + for(size_t i = 0; i < NPOINTS-1; i++) { + sprite->drawLine(graphPoints[i].x, graphPoints[i].y, graphPoints[i+1].x, graphPoints[i+1].y, fillColour); + } + + sprite->pushSprite(area.x, area.y+20); + if (redrawMax) { + sprMax->fillSprite(TFT_BLACK); + sprMax->setTextColor(TFT_SILVER, TFT_BLACK); + sprMax->setTextFont(1); + sprMax->drawString((String("max: ") + String(ymax)).c_str(), 0, 0); + sprMax->pushSprite(area.x+area.w-110, area.y); + redrawMax = false; + } + if (redrawTitle) { + sprTitle->pushSprite(area.x, area.y); + redrawTitle = false; + } + sprTitle->pushSprite(area.x, area.y); + + } + + + + void OnTouchDown(size_t x, size_t y) override { + } + + void OnTouchUp(size_t x, size_t y) override { + } + + void addDataPoint(float value) { + if (IsVisible()) { + + dataPoints[dataPointIndex] = value; + ymax = -std::numeric_limits::infinity(); + ymin = std::numeric_limits::infinity(); + for(size_t i = 0; i < NPOINTS; i++) { + if (dataPoints[i] > ymax) { + ymax = dataPoints[i]; + } + // if (dataPoints[i] < xmin) { + // xmin = dataPoints[i]; + // } + } + redrawMax = oldyMax != ymax; + oldyMax = ymax; + + ymin = 0.f; + yrange = ymax - ymin; + if (yrange < 0.00001f) { + yrange = 0.00001f; + } + yrangeInv = 1.f / yrange; + for(size_t i = 0; i < NPOINTS; i++) { + oldGraphPoints[i] = {graphPoints[i].x, graphPoints[i].y}; + size_t index = (dataPointIndex + i + 1) % NPOINTS; + int graphX = static_cast(static_cast(i) * xstep); + int graphY = graphHeight - static_cast((dataPoints[index]-ymin) * yrangeInv * graphHeight); + graphPoints[i] = { graphX, graphY }; + } + dataPointIndex = (dataPointIndex + 1) % NPOINTS; + // for(size_t i=0; i < 10; i++) { + // Serial.printf("(%d,%d),", oldGraphPoints[i].x, oldGraphPoints[i].y); + // } + // Serial.println(" "); + // for(size_t i=0; i < 10; i++) { + // Serial.printf("(%d,%d),", graphPoints[i].x, graphPoints[i].y); + // } + // Serial.println("\n --------- "); + redraw(); + } + } + + void OnDisplay() override { + ViewBase::OnDisplay(); + for(size_t i = 0; i < NPOINTS; i++) { + graphPoints[i] = { static_cast(i*xstep), 0 }; + } + redrawMax = true; + redrawTitle = true; + redraw(); + }; + + +private: + struct Point { + int x=0; + int y=0; + }; + + int fillColour; + std::array dataPoints{0.0f}; + std::array graphPoints{}, oldGraphPoints{}; + size_t dataPointIndex = 0; + float xstep=1; + float ymax, ymin,yrange, yrangeInv; + float graphHeight = 1; + float oldyMax = 0.f; + bool redrawMax=true; + bool redrawTitle=true; +}; + +#endif diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/MessageView.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/MessageView.hpp new file mode 100644 index 0000000..133951d --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/MessageView.hpp @@ -0,0 +1,63 @@ +#ifndef __MESSAGE_VIEW_HPP__ +#define __MESSAGE_VIEW_HPP__ + +#include "View.hpp" +#include "UIElements.hpp" +#include + + +class MessageView : public ViewBase { +public: + MessageView(String name) + : ViewBase(name) + {} + + void OnSetup() override { + } + + void OnDraw() override { + TFT_eSprite textSprite(scr); + textSprite.createSprite(320, 20); + textSprite.setTextFont(2); + scr->fillRect(area.x, area.y, area.w, area.h, TFT_BLACK); + constexpr int32_t lineheight = 20; + textSprite.setTextColor(TFT_WHITE, TFT_BLACK); + for(size_t i=0; i < lines.size(); i++) { + textSprite.fillRect(0,0,320,20,TFT_BLACK); + textSprite.drawString(lines[i].c_str(), 0, 0); + textSprite.pushSprite(area.x + 10,area.y + (i*lineheight)); + + } + + } + + void post(String str) { + lines.push_back(str); + if(lines.size() > maxLines) { + lines.pop_front(); + } + redraw(); + } + + void setMaxLines(size_t max) { + maxLines = max; + if (lines.size() > maxLines) { + lines.resize(maxLines); + } + redraw(); + } + + void setLineWidth(int width) { + lineWidth = width; + redraw(); + } + + + +private: + std::deque lines; + size_t maxLines = 9; // Maximum number of lines to display + int lineWidth = 320; // Width of each line in pixels +}; + +#endif diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/NameInputView.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/NameInputView.hpp new file mode 100644 index 0000000..9d562ba --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/NameInputView.hpp @@ -0,0 +1,118 @@ +#ifndef __NAME_INPUT_VIEW_HPP__ +#define __NAME_INPUT_VIEW_HPP__ + +#include "View.hpp" +#include "ButtonView.hpp" +#include + +class NameInputView : public ViewBase { +public: + using ConfirmCallback = std::function; + using CancelCallback = std::function; + + NameInputView(String name) : ViewBase(name) {} + + void setCallbacks(ConfirmCallback confirm, CancelCallback cancel) { + onConfirm = confirm; + onCancel = cancel; + } + + void reset(const String& initial = "") { + currentName = initial.substring(0, 5); + redraw(); + } + + void OnSetup() override { + static const char kChars[20] = { + 'A','B','C','D','E', + 'F','G','H','I','J', + '0','1','2','3','4', + '5','6','7','8','9' + }; + + constexpr int kBtnW = 60; + constexpr int kBtnH = 30; + constexpr int kColGap = 4; + constexpr int kRowGap = 3; + constexpr int kRowTop = 37; // below filename display + + for (int r = 0; r < 4; r++) { + for (int c = 0; c < 5; c++) { + int idx = r * 5 + c; + String label = String(kChars[idx]); + auto btn = std::make_shared(label, static_cast(idx + 1), TFT_DARKGREY, TFT_WHITE, 2); + rect bounds = { + area.x + 2 + c * (kBtnW + kColGap), + area.y + kRowTop + r * (kBtnH + kRowGap), + kBtnW, + kBtnH + }; + AddSubView(btn, bounds); + btn->SetReleaseCallback([this, label](size_t) { + if (currentName.length() < 5) { + currentName += label; + redraw(); + } + }); + } + } + + // Bottom control row + constexpr int kCtrlY = 170; + constexpr int kCtrlH = 26; + + auto delBtn = std::make_shared("DEL", 21, TFT_ORANGE, TFT_WHITE, 2); + AddSubView(delBtn, {area.x + 2, area.y + kCtrlY, 90, kCtrlH}); + delBtn->SetReleaseCallback([this](size_t) { + if (currentName.length() > 0) { + currentName.remove(currentName.length() - 1); + redraw(); + } + }); + + auto cancelBtn = std::make_shared("CANCEL", 22, TFT_RED, TFT_WHITE, 2); + AddSubView(cancelBtn, {area.x + 115, area.y + kCtrlY, 90, kCtrlH}); + cancelBtn->SetReleaseCallback([this](size_t) { + if (onCancel) onCancel(); + }); + + auto okBtn = std::make_shared("OK", 23, TFT_DARKGREEN, TFT_WHITE, 2); + AddSubView(okBtn, {area.x + 228, area.y + kCtrlY, 90, kCtrlH}); + okBtn->SetReleaseCallback([this](size_t) { + if (onConfirm) onConfirm(currentName); + }); + } + + void OnDraw() override { + scr->fillRect(area.x, area.y, area.w, area.h, TFT_BLACK); + + // Filename display: 5 boxes near the top + constexpr int kBoxW = 40; + constexpr int kBoxH = 30; + constexpr int kBoxGap = 4; + const int totalBoxW = 5 * kBoxW + 4 * kBoxGap; + const int startX = area.x + (area.w - totalBoxW) / 2; + const int startY = area.y + 3; + + for (int i = 0; i < 5; i++) { + int bx = startX + i * (kBoxW + kBoxGap); + scr->drawRect(bx, startY, kBoxW, kBoxH, TFT_WHITE); + if (i < (int)currentName.length()) { + scr->setTextColor(TFT_YELLOW, TFT_BLACK); + scr->setTextFont(4); + scr->drawChar(currentName[i], bx + 10, startY + 5); + } else { + scr->setTextColor(TFT_DARKGREY, TFT_BLACK); + scr->setTextFont(2); + scr->drawChar('_', bx + 14, startY + 9); + } + } + } + +private: + String currentName; + ConfirmCallback onConfirm; + CancelCallback onCancel; +}; + +#endif // __NAME_INPUT_VIEW_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/RLStatsView.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/RLStatsView.hpp new file mode 100644 index 0000000..bf0dab7 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/RLStatsView.hpp @@ -0,0 +1,77 @@ +#ifndef __RLSTATSVIEW_VIEW_HPP__ +#define __RLSTATSVIEW_VIEW_HPP__ + +#include "View.hpp" +#include "UIElements.hpp" +#include "GraphView.hpp" + + +class RLStatsView : public ViewBase { +public: + + static constexpr size_t NPOINTS = 50; + RLStatsView(String name) + : ViewBase(name) + { + + } + + void OnSetup() override { + // rect bounds = { area.x + 10 + (i * 60), area.y + 10 + (j*60), 50, 50 }; + graphActorGNorm = std::make_shared>("Loss", TFT_BLUE); + // graphCriticLoss = std::make_shared>("Critic Loss", TFT_RED); + AddSubView(graphActorGNorm, { area.x + 10, area.y + 10, 300, 90 }); + // AddSubView(graphCriticLoss, { area.x + 10, area.y + 10+100, 300, 90 }); + + } + + void OnDisplay() override { + + }; + + void OnDraw() override { + // TFT_eSprite textSprite(scr); + // textSprite.createSprite(120, 20); + // textSprite.setTextFont(2); + // auto drawText = [&textSprite, this](size_t x, size_t y, const String& item, const int colour) { + // scr->fillRect(area.x + x,area.y+y,120,20,TFT_BLACK); + // textSprite.fillSprite(TFT_BLACK); + // textSprite.setTextColor(colour, TFT_BLACK); + // textSprite.drawString(item.c_str(), 0, 0); + // textSprite.pushSprite(area.x + x,area.y + y); + // }; + // constexpr int32_t lineheight = 20; + // drawText(10, 1 * lineheight, "Actor gnorm:", itemColour); + // drawText(150, 1 * lineheight, String(actorGradNorm).c_str(), valueColour); + + // drawText(10, 2 * lineheight, "Critic Loss:", itemColour); + + // drawText(150, 2 * lineheight, String(criticLoss).c_str(), valueColour); + } + + void setLoss(float v) { + // actorGradNorm = v; + graphActorGNorm->addDataPoint(v); + redraw(); + } + + void setCriticLoss(float loss) { + // criticLoss = loss; + graphCriticLoss->addDataPoint(loss); + redraw(); + } + +private: + const int itemColour = TFT_WHITE; + const int valueColour = TFT_YELLOW; + float actorGradNorm = 0.f; + float criticLoss = 0.f; + // #define GRAPHSIZE 100 + // std::array histGnorm, histCriticLoss; + // size_t indexGnorm=0, indexCriticLoss=0; + std::shared_ptr> graphActorGNorm, graphCriticLoss; + + +}; + +#endif diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/RLView.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/RLView.hpp new file mode 100644 index 0000000..498422c --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/RLView.hpp @@ -0,0 +1,106 @@ +#ifndef __RL_VIEW_HPP__ +#define __RL_VIEW_HPP__ + +#include "View.hpp" +#include "BarGraphView.hpp" + +class RLView : public ViewBase { +public: + static constexpr int kStatusBarHeight = 20; + + RLView(String name, size_t nOutputs, int barwidth = 2, int colour = TFT_GREEN, + float rangeLow = 0.f, float rangeHigh = 1.f) + : ViewBase(name) + , barGraph(std::make_shared(name, nOutputs, barwidth, colour, rangeLow, rangeHigh)) + {} + + void OnSetup() override { + rect barArea = getBarGraphArea(); + AddSubView(barGraph, barArea); + barGraph->setSpectrumColors(TFT_GREEN, TFT_BLUE); + } + + // View re-shown (driver cleared the screen): repaint every field. + void OnDisplay() override { + lossDirty_ = countsDirty_ = actionDirty_ = true; + needRedraw_ = true; + for (auto& subview : subviews) subview->OnDisplay(); + } + + void OnDraw() override { + // No field marked => this OnDraw was triggered by an external full repaint + // (driver fillScreen + redraw()), so redraw all three fields. Otherwise only + // the field whose value changed is repainted, avoiding whole-line flicker. + if (!lossDirty_ && !countsDirty_ && !actionDirty_) + lossDirty_ = countsDirty_ = actionDirty_ = true; + + const int barY = area.y + area.h - kStatusBarHeight; + scr->setTextFont(1); + scr->setTextColor(TFT_WHITE, TFT_BLACK); + if (lossDirty_) { + scr->fillRect(area.x, barY, 100, kStatusBarHeight, TFT_BLACK); + scr->drawString(("L:" + String(loss_, 4)).c_str(), area.x + 2, barY + 4); + lossDirty_ = false; + } + if (countsDirty_) { + scr->fillRect(area.x + 100, barY, 100, kStatusBarHeight, TFT_BLACK); + scr->drawString(("y:" + String(posCount_) + " n:" + String(negCount_)).c_str(), area.x + 100, barY + 4); + countsDirty_ = false; + } + if (actionDirty_) { + scr->fillRect(area.x + 200, barY, area.w - 200, kStatusBarHeight, TFT_BLACK); + scr->drawString(lastAction_.c_str(), area.x + 200, barY + 4); + actionDirty_ = false; + } + } + + void UpdateValues(const std::vector& values, bool resetMinMax = false) { + barGraph->UpdateValues(values, resetMinMax); + } + + // Safe to call from ISR — only updates state and sets dirty/redraw flags, no direct SPI. + // Each setter marks only its own field so OnDraw repaints just that part of the bar. + void setLoss(float v) { + if (v != loss_) { loss_ = v; lossDirty_ = true; needRedraw_ = true; } + } + void setMemoryCounts(size_t pos, size_t neg) { + if (pos != posCount_ || neg != negCount_) { + posCount_ = pos; + negCount_ = neg; + countsDirty_ = true; + needRedraw_ = true; + } + } + void setLastAction(const String& a) { + if (a != lastAction_) { lastAction_ = a; actionDirty_ = true; needRedraw_ = true; } + } + void setNoiseActive(bool active) { + if (active != noiseActive_) { + noiseActive_ = active; + if (active) { + barGraph->setSpectrumColors(TFT_RED, TFT_YELLOW); + } else { + barGraph->setSpectrumColors(TFT_GREEN, TFT_BLUE); + } + barGraph->redraw(); + } + } + +protected: + virtual rect getBarGraphArea() const { + return {area.x, area.y, area.w, area.h - kStatusBarHeight}; + } + +private: + std::shared_ptr barGraph; + float loss_{0.f}; + size_t posCount_{0}; + size_t negCount_{0}; + String lastAction_{""}; + bool noiseActive_{false}; + bool lossDirty_{true}; + bool countsDirty_{true}; + bool actionDirty_{true}; +}; + +#endif // __RL_VIEW_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/RotarySelectView.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/RotarySelectView.hpp new file mode 100644 index 0000000..b290b5e --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/RotarySelectView.hpp @@ -0,0 +1,152 @@ +#ifndef __ROTARY_SELECT_VIEW_HPP__ +#define __ROTARY_SELECT_VIEW_HPP__ + +#include "View.hpp" +#include "UIElements.hpp" + + +class RotarySelectView : public ViewBase { + +public: + TFT_eSprite *sprite = nullptr; + TFT_eSprite *sprTitle = nullptr; + TFT_eSprite *sprMax = nullptr; + + using NewSelectionCallback = std::function; + + + RotarySelectView(String name, int _fillcolour_ = TFT_BLUE) + : ViewBase(name), fillColour(_fillcolour_) + { + } + + void setNewSelectionCallback(NewSelectionCallback cb) { + newSelCB = cb; + } + + + void OnSetup() override { + if (options.empty()) { + options.push_back("VoiceSpace 1"); + options.push_back("VoiceSpace 2"); + options.push_back("VoiceSpace 3"); + options.push_back("VoiceSpace 4"); + options.push_back("VoiceSpace 5"); + options.push_back("VoiceSpace 6"); + options.push_back("VoiceSpace 7"); + options.push_back("VoiceSpace 8"); + } + } + + void OnDraw() override { + scr->drawLine(area.x, area.y, area.x, area.y + area.h, isFocused() ? TFT_GREEN : TFT_BLUE); + + TFT_eSprite textSprite(scr); + constexpr int32_t lineheight = 25; + textSprite.createSprite(area.w-50, lineheight); + constexpr size_t sizes[] = {1,2,2,2,1}; + constexpr size_t heights[] = {15,25,25,25,15}; + constexpr size_t indents[] = {5,10,15,10,5}; + constexpr size_t colours[] = {TFT_SILVER, TFT_SILVER, TFT_WHITE, TFT_SILVER, TFT_SILVER}; + // Serial.printf("RotarySelectView::OnDraw called, hasFocus=%d\n", isFocused()); + int heightAccum = 0; + for(int i=0; i < 5; i++) { + int itemIndex = selectedIndex - 2 + i; + textSprite.fillSprite(TFT_BLACK); + if (itemIndex < 0 || itemIndex >= options.size()) { + // + }else{ + if (isFocused() && (itemIndex == selectedIndex)) { + textSprite.setTextColor(TFT_YELLOW, TFT_BLACK); + + } else { + textSprite.setTextColor(colours[i], TFT_BLACK); + } + textSprite.setTextFont(sizes[i]); + textSprite.drawString(options[itemIndex].c_str(), indents[i], 0); + } + textSprite.pushSprite(area.x + 10,area.y + 20 + heightAccum); + heightAccum += heights[i]; + } + + } + + + + void OnTouchDown(size_t x, size_t y) override { + } + + void OnTouchUp(size_t x, size_t y) override { + constexpr size_t heights[] = {15, 25, 25, 25, 15}; + int heightAccum = (int)area.y + 20; + for (int i = 0; i < 5; i++) { + if ((int)y >= heightAccum && (int)y < heightAccum + (int)heights[i]) { + int delta = i - 2; + int dir = delta > 0 ? 1 : -1; + for (int s = 0; s < abs(delta); s++) HandleRotaryEncChange(dir); + break; + } + heightAccum += (int)heights[i]; + } + } + + + void OnDisplay() override { + ViewBase::OnDisplay(); + }; + + void setOptions(std::span newOptions) { + options.assign(newOptions.begin(), newOptions.end()); + } + + void setSelection(size_t idx) { + if (idx < options.size()) selectedIndex = idx; + } + + bool acceptsFocus() override { + return true; + } + + bool setFocus() override { + // Serial.println("RotarySelectView::setFocus called"); + redraw(); + return ViewBase::setFocus(); + } + + void removeFocus() override{ + ViewBase::removeFocus(); + redraw(); + } + + void HandleRotaryEncSwitch() override { + removeFocus(); + redraw(); + } + + void HandleRotaryEncChange(int inc) override { + // Serial.printf("RotarySelectView::HandleRotaryEncChange called with inc=%d\n", inc); + if (inc > 0) { + if (selectedIndex < options.size() - 1) { + selectedIndex++; + if (newSelCB) newSelCB(selectedIndex); + redraw(); + } + } else if (inc < 0) { + if (selectedIndex > 0) { + selectedIndex--; + if (newSelCB) newSelCB(selectedIndex); + redraw(); + } + } + } + + +private: + int fillColour; + std::vector options; + size_t selectedIndex = 0; + NewSelectionCallback newSelCB; + +}; + +#endif diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/SingleSelectView.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/SingleSelectView.hpp new file mode 100644 index 0000000..e55a4ea --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/SingleSelectView.hpp @@ -0,0 +1,78 @@ +#ifndef __SINGLESELECT_VIEW_HPP__ +#define __SINGLESELECT_VIEW_HPP__ + +#include "View.hpp" +#include "UIElements.hpp" +#include "../common.hpp" +#include "RotarySelectView.hpp" + + +class SingleSelectView : public ViewBase { +public: + + using NewSelectionCallback = std::function; + + + SingleSelectView(String name) + : ViewBase(name) + {} + + void OnSetup() override { + selector = std::make_shared("Selector", TFT_WHITE); + AddSubView(selector, { area.x + 20, area.y + 20, 280, 140 }); + + } + + void setNewVoiceCallback(NewSelectionCallback cb) { + selector->setNewSelectionCallback( + [cb](size_t idx) { + cb(idx); + } + ); + } + + + void OnDisplay() override { + }; + + + void OnDraw() override { + } + + bool acceptsFocus() override { + return true; + } + + bool setFocus() override { + selector->setFocus(); + redraw(); + return ViewBase::setFocus(); + } + + void removeFocus() override{ + hasFocus = false; + } + + void HandleRotaryEncChange(int inc) override { + selector->HandleRotaryEncChange(inc); + } + + virtual void HandleRotaryEncSwitch() override{ + if (isFocused()) { + selector->removeFocus(); + removeFocus(); + } + } + + void setOptions(std::span newOptions) { + selector->setOptions(newOptions); + } + + + +private: + std::shared_ptr selector; + +}; + +#endif diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/SystemView.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/SystemView.hpp new file mode 100644 index 0000000..a408d34 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/SystemView.hpp @@ -0,0 +1,66 @@ +#ifndef __SYSTEM_VIEW_HPP__ +#define __SYSTEM_VIEW_HPP__ + +#include "View.hpp" +#include "UIElements.hpp" +#include +#include "../common.hpp" + + +class SystemView : public ViewBase { +public: + SystemView(String name) + : ViewBase(name) + {} + + void OnSetup() override { + } + + void OnDisplay() override { + freeHeap = rp2040.getFreeHeap(); + totalHeap = rp2040.getTotalHeap(); + usedHeap = totalHeap - freeHeap; + sys_clk = clock_get_hz(clk_sys); + }; + + + void OnDraw() override { + TFT_eSprite textSprite(scr); + textSprite.createSprite(320, 20); + textSprite.setTextFont(2); + scr->fillRect(area.x, area.y, area.w, area.h, TFT_BLACK); + constexpr int32_t lineheight = 20; + textSprite.setTextColor(TFT_WHITE, TFT_BLACK); + std::deque lines; + lines.push_back(String("MEMLNaut ") + String(MEMLLIB_VERSION)); + lines.push_back(""); + lines.push_back("Info: https://musicallyembodiedml.github.io"); + lines.push_back(""); + lines.push_back("Build: " + String(__DATE__) + " " + String(__TIME__)); + lines.push_back("System Clock: " + String(sys_clk/1000000.f) + " MHz"); + lines.push_back("Heap: " + String(freeHeap/1024) + "k free, " + + String(totalHeap/1024) + "k total, " + + String(usedHeap/1024) + "k used"); + lines.push_back(""); + lines.push_back("Made by Chris Kiefer and Andrea Martelloni"); + lines.push_back("Emute Lab, University of Sussex, UK"); + + for(size_t i=0; i < lines.size(); i++) { + textSprite.fillRect(0,0,320,20,TFT_BLACK); + textSprite.drawString(lines[i].c_str(), 0, 0); + textSprite.pushSprite(area.x + 10,area.y + (i*lineheight)); + } + + } + + + +private: + uint32_t freeHeap = 0; + uint32_t totalHeap = 0; + uint32_t usedHeap = 0; + uint32_t sys_clk=0; + +}; + +#endif diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/TextView.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/TextView.cpp new file mode 100644 index 0000000..543dc40 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/TextView.cpp @@ -0,0 +1,79 @@ +#include "TextView.hpp" + +TextView::TextView(String name, const char* content, uint16_t color) + : ViewBase(name) + , button("Press Me", 0x041f, false) + , toggle("Toggle Me", 0x041f, true) + , val("Value", 0, 100, 1) + , fl("Float", 0.1f, 5.0f, 0.01f) + , content_(content) + , color_(color) +{} + +void TextView::OnSetup() { + // button.SetGrid(grid_, 0, 3); + // button.Setup(tft_); + // button.SetCallback([this](bool state) { OnButtonPressed_(state); }); + + // toggle.SetGrid(grid_, 3, 3); + // toggle.Setup(tft_); + // toggle.SetCallback([this](bool state) { OnTogglePressed_(state); }); + + // val.SetGrid(grid_, 2, 1); + // val.Setup(tft_); + // val.SetCallback([this](size_t value) { + // Serial.print("Value changed: "); + // Serial.println(value); + // }); + + // fl.SetGrid(grid_, 1, 1); + // fl.Setup(tft_); + // fl.SetCallback([this](float value) { + // Serial.print("Float changed: "); + // Serial.println(value); + // }); +} + +void TextView::OnDraw() { + scr->setTextColor(color_); + // Draw the content at the third row, first column of the grid + size_t gridX = 0; + size_t gridY = 4; // Third row + scr->drawString(content_, gridX * grid_.widthStep, gridY * grid_.heightStep, 2); + needRedraw_ = false; + // // Draw the button + // button.Draw(); + // // Draw the toggle button + // toggle.Draw(); + // // Draw the value element + // val.Draw(); + // // Draw the float element + // fl.Draw(); +} + +void TextView::OnTouchDown(size_t x, size_t y) { + // Serial.print("TextView HandleTouch at: "); + // Serial.print(x); + // Serial.print(", "); + // Serial.println(y); + // Pass touch coordinates to the button for interaction + button.Interact(x, y); + toggle.Interact(x, y); + val.Interact(x, y); + fl.Interact(x, y); +} + +void TextView::OnTouchUp(size_t x, size_t y) { + // Serial.println("TextView HandleRelease"); + // Handle release events for the button + //button_.Interact(0, 0); // Pass dummy coordinates since release doesn't need them + button.Release(); + toggle.Release(); + val.Release(); + fl.Release(); +} + +void TextView::OnButtonPressed_(bool state) { + Serial.print("Button pressed: "); + Serial.println(state ? "TRUE" : "FALSE"); +} diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/TextView.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/TextView.hpp new file mode 100644 index 0000000..ad8ed00 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/TextView.hpp @@ -0,0 +1,34 @@ +#ifndef __TEXT_VIEW_HPP__ +#define __TEXT_VIEW_HPP__ + +#include "View.hpp" +#include "UIElements.hpp" + + +class TextView : public ViewBase { +public: + TextView(String name, // Changed parameter type + const char* content, // Changed parameter type + uint16_t color); + + void OnSetup() override; // Changed from Setup to OnSetup + void OnDraw() override; // No longer takes TFT pointer + void OnTouchDown(size_t x, size_t y) override; + void OnTouchUp(size_t x, size_t y) override; + + Button button{"Press Me", 0x041F, false}; // Navy blue to deep blue, non-toggle + Button toggle{"Toggle Me", 0x041F, true}; // Navy blue to deep blue, toggle + Value val{"Value", 0, 100, 1}; // Value element with range 0-100 and step 1 + Value fl{"Float", 0.1, 5.0, 0.01}; + +private: + void OnButtonPressed_(bool state); + void OnTogglePressed_(bool state) { + Serial.print("Toggle pressed: "); + Serial.println(state ? "TRUE" : "FALSE"); + } + const char* content_; // 1st initialized + uint16_t color_; // 2nd initialized +}; + +#endif // __TEXT_VIEW_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/UIElements.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/UIElements.cpp new file mode 100644 index 0000000..45bf007 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/UIElements.cpp @@ -0,0 +1,69 @@ +#include "UIElements.hpp" + +Button::Button(const char* label, uint16_t color, bool is_toggle) + : UIElementBase(label) + , color_(color) + , is_toggle_(is_toggle) + , pressedCallback_() + , pressed_(false) + , toggleState_(false) + , button_(nullptr) + , current_x_(0) + , current_y_(0) + , current_w_(0) + , current_h_(0) +{ + strncpy(labelBuffer_, label, sizeof(labelBuffer_) - 1); + labelBuffer_[sizeof(labelBuffer_) - 1] = '\0'; +} + +void Button::Draw() { + if (button_) { + button_->drawSmoothButton(toggleState_, kBorder, TFT_BLACK); + } +} + +void Button::OnSetup() { + current_x_ = grid_.widthStep * pos_x_; + current_y_ = grid_.heightStep * pos_y_; + current_w_ = grid_.widthStep; + current_h_ = grid_.heightStep; + + button_ = std::make_unique(scr); + button_->initButtonUL(current_x_, current_y_, current_w_, current_h_, + TFT_WHITE, color_, TFT_BLACK, labelBuffer_, kTextSize); + button_->drawSmoothButton(pressed_, kBorder, TFT_BLACK); +} + +void Button::SetCallback(std::function callback) { + pressedCallback_ = callback; +} + +void Button::Interact(size_t x, size_t y) { + if (button_) { + if (button_->contains(x, y)) { + if (!pressed_) { + pressed_ = true; + if (is_toggle_) { + toggleState_ = !toggleState_; + } else { + toggleState_ = true; + } + button_->drawSmoothButton(toggleState_, kBorder, TFT_BLACK); + if (pressedCallback_) { + pressedCallback_(toggleState_); + } + } + } + } +} + +void Button::Release() { + if (button_) { + pressed_ = false; + if (!is_toggle_) { + toggleState_ = false; + } + button_->drawSmoothButton(toggleState_, kBorder, TFT_BLACK); + } +} diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/UIElements.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/UIElements.hpp new file mode 100644 index 0000000..bf3b153 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/UIElements.hpp @@ -0,0 +1,214 @@ +#ifndef __UI_ELEMENTS_HPP__ +#define __UI_ELEMENTS_HPP__ + +#include +#include +#include +#include +#include "../../../utils/Format.hpp" + + +struct GridDef { + size_t widthElements; + size_t heightElements; + size_t widthStep; + size_t heightStep; +}; + +struct rect { + int x, y, w, h; +}; + +class UIElementBase { +public: + UIElementBase() = delete; // Prevent instantiation of base class + virtual ~UIElementBase() = default; // Virtual destructor + void Setup(TFT_eSPI* tft) { // Changed to non-virtual like ViewBase + scr = tft; + OnSetup(); // Call virtual setup hook + } + virtual void OnSetup() = 0; // New virtual setup hook + virtual void Draw() = 0; // No longer needs TFT parameter + virtual void Interact(size_t x, size_t y) = 0; // Handle interaction events + virtual void Release() = 0; // Handle release events + void SetGrid(const GridDef &grid, size_t pos_x, size_t pos_y) { + grid_ = grid; + pos_x_ = pos_x; + pos_y_ = pos_y; + } +protected: + explicit UIElementBase(const char* label) : label_(label), scr(nullptr) {} // Changed to const char* + GridDef grid_; // Grid definition for layout + size_t pos_x_{0}; // Position in grid X + size_t pos_y_{0}; // Position in grid Y + const char* label_; // Changed to const char* + TFT_eSPI* scr; // Added tft pointer +}; + + +class Button : public UIElementBase { +public: + static constexpr size_t kBorder = 3; + static constexpr size_t kTextSize = 1; + + Button(const char* label, uint16_t color, bool is_toggle = false); + ~Button() = default; + + void Draw() override; + void OnSetup() override; + void SetCallback(std::function callback); + void Interact(size_t x, size_t y) override; + void Release() override; + +protected: + uint16_t color_; + bool is_toggle_; + std::function pressedCallback_; + bool pressed_; + bool toggleState_{false}; // Track toggle state + std::unique_ptr button_; + char labelBuffer_[32]; // Fixed buffer for button label + uint16_t current_x_{0}; + uint16_t current_y_{0}; + uint16_t current_w_{0}; + uint16_t current_h_{0}; +}; + + +/** + * @brief Class showing a value (name and value) on the display. + * It can be incremented or decremented by a step value, e.g. by an + * encoder or a button. + * + * @tparam T + */ +template +class Value : public UIElementBase { +public: + + static constexpr size_t kTextSize = 1; + static constexpr size_t kValueSize = 2; + static constexpr size_t kSpacingTop = 16; + static constexpr size_t kSpacingBottom = 5; + + Value(const char* label, T min, T max, T step) + : UIElementBase(label) + , value_(min) + , min_(min) + , max_(max) + , step_(step) + { + snprintf(labelBuffer_, sizeof(labelBuffer_), "%s", label); + } + ~Value() = default; + + void Draw() override + { + if (scr == nullptr) { + return; // Ensure tft is initialized + } + + // Calculate background color + uint16_t bgColor = selected_ ? scr->color565(64, 80, 96) : TFT_BLACK; + + // Fill background + scr->fillRect(current_x_, current_y_, current_w_, current_h_, bgColor); + + // Draw the label with consistent background + scr->setTextSize(kTextSize); + scr->setTextColor(TFT_WHITE, bgColor); + scr->setTextDatum(TC_DATUM); // Center text + scr->drawString(labelBuffer_, current_x_ + (current_w_ >> 1), current_y_ + kSpacingTop); + scr->setTextSize(kValueSize); + // Draw the value in the line below + char valueBuffer[6]; + formatNumber(valueBuffer, value_); // Format the value + size_t y = current_y_ + kSpacingTop + kTextSize * 8 + kSpacingBottom; + scr->drawString(valueBuffer, current_x_ + (current_w_ >> 1), y); + scr->setTextSize(1); // Reset text size + scr->setTextDatum(TL_DATUM); // Reset text datum + } + void OnSetup() override + { + value_ = min_; // Initialize value to min + current_x_ = pos_x_ * grid_.widthStep; + current_y_ = pos_y_ * grid_.heightStep; + current_w_ = grid_.widthStep; + current_h_ = grid_.heightStep; + selected_ = false; // Default not selected + }; + void SetValue(T value) + { + if (value < min_) { + value = min_; + } else if (value > max_) { + value = max_; + } + if (value == value_) { + return; // No change + } + value_ = value; + // Trigger callback + if (valueChangedCallback_) { + valueChangedCallback_(value_); + } + Draw(); + } + T GetValue() const { return value_; } + void Increment(bool up = true) + { + if (!selected_) { + return; // Only increment if selected + } + if (up) { + SetValue(value_ + step_); + } else { + // Check that decrementing does not go below min + // (robust to unsigned types) + if (value_ <= min_) { + return; // Do not decrement below min + } + SetValue(value_ - step_); + } + } + void SetCallback(std::function callback) + { + valueChangedCallback_ = std::move(callback); + } + void Interact(size_t x, size_t y) override + { + bool wasSelected = selected_; // Store previous selection state + // Select the value element if within bounds + if (x >= current_x_ && x < current_x_ + current_w_ && + y >= current_y_ && y < current_y_ + current_h_) { + selected_ = true; // Mark as selected + } else { + selected_ = false; // Deselect if outside bounds + } + if (selected_ != wasSelected) { + // Redraw if selection state changed + Draw(); + } + } + void Release() override + { + // Nothing for now + } + +protected: + + T value_; + T min_; + T max_; + T step_; + bool selected_ = false; // Moved initialization to declaration + std::function valueChangedCallback_; // Default constructor is fine + char labelBuffer_[32]; + uint16_t current_x_{0}; + uint16_t current_y_{0}; + uint16_t current_w_{0}; + uint16_t current_h_{0}; +}; + + +#endif // __UI_ELEMENTS_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/VUMeterView.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/VUMeterView.hpp new file mode 100644 index 0000000..692fe93 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/VUMeterView.hpp @@ -0,0 +1,87 @@ +#ifndef __VUMETER_VIEW_HPP__ +#define __VUMETER_VIEW_HPP__ + +#include "View.hpp" +#include "UIElements.hpp" +#include +#include +#include + +// Vertical VU meters fed from an external published level buffer (filled on the audio core). +// The view arms/disarms that measurement via onActive() as it comes on/off screen, and +// self-refreshes (~25 fps) only while it is the current view — so it costs nothing when hidden. +class VUMeterView : public ViewBase { +public: + using OnActiveCallback = std::function; + + VUMeterView(String name, std::vector labels, + const volatile float* levels, OnActiveCallback onActive) + : ViewBase(name), labels_(std::move(labels)), levels_(levels), + onActive_(std::move(onActive)) {} + + void OnSetup() override { + nBars_ = labels_.size(); + slotW_ = nBars_ ? area.w / (int)nBars_ : area.w; + barW_ = 10; + meterTop_ = area.y + topPad_; + meterH_ = area.h - topPad_ - labelH_; + } + + void OnDisplay() override { + ViewBase::OnDisplay(); + if (onActive_) onActive_(true); + drawLabels_ = true; + redraw(); + } + + void OnHide() override { + if (onActive_) onActive_(false); + } + + void OnDraw() override { + const int bottom = meterTop_ + meterH_; + const float gThr = 0.6f, yThr = 0.85f; // green / yellow / red zone boundaries + + for (size_t i = 0; i < nBars_; ++i) { + const int slotX = area.x + (int)i * slotW_; + const int x = slotX + (slotW_ - barW_) / 2; + + float lvl = levels_ ? levels_[i] : 0.f; + if (lvl < 0.f) lvl = 0.f; else if (lvl > 1.f) lvl = 1.f; + + // Erase the full column, then paint the lit zones from the bottom up. + scr->fillRect(x, meterTop_, barW_, meterH_, TFT_BLACK); + + const int gPx = (int)(fminf(lvl, gThr) * meterH_); + const int yPx = (int)(fmaxf(0.f, fminf(lvl, yThr) - gThr) * meterH_); + const int rPx = (int)(fmaxf(0.f, lvl - yThr) * meterH_); + + if (gPx > 0) scr->fillRect(x, bottom - gPx, barW_, gPx, TFT_GREEN); + if (yPx > 0) scr->fillRect(x, bottom - gPx - yPx, barW_, yPx, TFT_YELLOW); + if (rPx > 0) scr->fillRect(x, bottom - gPx - yPx - rPx, barW_, rPx, TFT_RED); + + if (drawLabels_) { + scr->setTextFont(2); + scr->setTextDatum(TC_DATUM); + scr->setTextColor(TFT_SILVER, TFT_BLACK); + scr->drawString(labels_[i].c_str(), slotX + slotW_ / 2, bottom + 3); + } + } + drawLabels_ = false; + redraw(); // keep refreshing while we are the active view + } + +private: + std::vector labels_; + const volatile float* levels_; + OnActiveCallback onActive_; + + size_t nBars_ = 0; + int slotW_ = 0, barW_ = 0; + int meterTop_ = 0, meterH_ = 0; + const int topPad_ = 6; + const int labelH_ = 20; + bool drawLabels_ = true; +}; + +#endif diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/View.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/View.cpp new file mode 100644 index 0000000..db2087e --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/View.cpp @@ -0,0 +1,14 @@ +#include "View.hpp" + +void ViewBase::Setup(TFT_eSPI* tft, rect bounds) { + scr = tft; + needRedraw_ = true; + area = bounds; + OnSetup(); +} + +bool ViewBase::NeedRedraw() { + bool ret = needRedraw_; + needRedraw_ = false; + return ret; +} diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/View.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/View.hpp new file mode 100644 index 0000000..4e0fb59 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/View.hpp @@ -0,0 +1,147 @@ +#ifndef __VIEW_HPP__ +#define __VIEW_HPP__ + +#include +#include "UIElements.hpp" + + +class ViewBase { + +public: + ViewBase() = delete; // Prevent instantiation of base class + virtual ~ViewBase() = default; // Virtual destructor + void Setup(TFT_eSPI* tft, rect bounds); // No longer virtual + virtual void OnSetup() = 0; // New virtual setup hook + virtual void OnDraw() = 0; + virtual void OnTouchDown(size_t x, size_t y) { + + }; + virtual void OnTouchUp(size_t x, size_t y) { + + }; + //called when a view is displayed + virtual void OnDisplay() { + for(auto& subview: subviews) { + subview->OnDisplay(); + } + }; + //called when a view is hidden + virtual void OnHide() { + + }; + bool NeedRedraw(); + inline String GetName() const { return name_; } // Changed return type + inline void SetGrid(const GridDef &grid) { grid_ = grid; } + void setBounds(rect newBounds) { + area = newBounds; + } + + inline void redraw() { + needRedraw_ = true; + for(auto& subview: subviews) { + subview->redraw(); + } + } + + void Draw() { + if (NeedRedraw()) { + OnDraw(); + } + for(auto& subview: subviews) { + subview->Draw(); + } + } + + void HandleTouch(size_t x, size_t y) { + for(auto& subview: subviews) { + if (subview->area.x <= x && x < subview->area.x + subview->area.w && + subview->area.y <= y && y < subview->area.y + subview->area.h) { + Serial.println("Subview touched"); + subview->HandleTouch(x,y); + } + } + OnTouchDown(x,y); + } + + void HandleTouchRelease(size_t x, size_t y) { + Serial.print("HandleTouchRelease at: "); + Serial.print(x); + Serial.print(", "); + Serial.println(y); + for(auto& subview: subviews) { + if (subview->area.x <= x && x < subview->area.x + subview->area.w && + subview->area.y <= y && y < subview->area.y + subview->area.h) { + Serial.println("Subview touch released"); + subview->HandleTouchRelease(x,y); + } + } + OnTouchUp(x,y); + } + + void AddSubView(const std::shared_ptr &view, rect bounds) + { + subviews.push_back(view); + if (scr) { + view->Setup(scr, bounds); + } + redraw(); + } + String name_; // 1st initialized + + bool IsVisible() { + return viewIsVisible; + } + + void setVisible(const bool v) { + viewIsVisible = v; + // Serial.printf("setVisible called on view %s (addr: %p) to %d\n", + // name_.c_str(), (void*)this, v); + for(auto& subview: subviews) { + subview->setVisible(v); + } + } + + //focus on view with rotary encoder switch + virtual bool acceptsFocus() { + return false; + } + + virtual bool setFocus() { + hasFocus = acceptsFocus(); + return hasFocus; + } + + virtual void removeFocus() { + hasFocus = false; + } + + bool isFocused() { + return hasFocus; + } + + virtual void HandleRotaryEncChange(int inc) { + // Override in subclass if needed + } + + virtual void HandleRotaryEncSwitch(){ + // Override in subclass if needed + } + +protected: + explicit ViewBase(String &name) // Changed parameter type + : name_(name) + , grid_({0, 0, 0, 0}) // Default grid definition + , needRedraw_(true) + , scr(nullptr), + area{0,0,1,1} {} // Initialize TFT pointer + GridDef grid_; // 2nd initialized + bool needRedraw_; // 3rd initialized + TFT_eSPI* scr; // 4th initialized + rect area; + std::vector> subviews; + bool viewIsVisible = false; + bool hasFocus = false; +}; + + +#endif // __VIEW_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/VoiceSpaceSelectView.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/VoiceSpaceSelectView.hpp new file mode 100644 index 0000000..cd1259b --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/VoiceSpaceSelectView.hpp @@ -0,0 +1,92 @@ +#ifndef __VOICESPACESELECT_VIEW_HPP__ +#define __VOICESPACESELECT_VIEW_HPP__ + +#include "View.hpp" +#include "UIElements.hpp" +#include "../common.hpp" +#include "RotarySelectView.hpp" + + +class VoiceSpaceSelectView : public ViewBase { +public: + + using NewVoiceCallback = std::function; + + + VoiceSpaceSelectView(String name) + : ViewBase(name) + {} + + void OnSetup() override { + voiceSpaceSelector = std::make_shared("VoiceSpace", TFT_WHITE); + AddSubView(voiceSpaceSelector, { area.x + 20, area.y + 20, 280, 140 }); + + } + + void setNewVoiceCallback(NewVoiceCallback cb) { + voiceSpaceSelector->setNewSelectionCallback( + [cb](size_t idx) { + cb(idx); + } + ); + } + + + void OnDisplay() override { + }; + + + void OnDraw() override { + TFT_eSprite textSprite(scr); + textSprite.createSprite(area.w, 20); + textSprite.fillSprite(TFT_BLACK); + textSprite.setTextColor(TFT_WHITE, TFT_BLACK); + textSprite.setTextFont(2); + textSprite.drawString(isFocused() ? "Press to confirm" : "Press to select", 10, 0); + textSprite.pushSprite(area.x, area.y + 165); + } + + bool acceptsFocus() override { + return true; + } + + bool setFocus() override { + // Serial.println("VoiceSpaceSelectView::setFocus called"); + voiceSpaceSelector->setFocus(); + redraw(); + return ViewBase::setFocus(); + } + + void removeFocus() override{ + hasFocus = false; + redraw(); + } + + void HandleRotaryEncChange(int inc) override { + voiceSpaceSelector->HandleRotaryEncChange(inc); + } + + virtual void HandleRotaryEncSwitch() override{ + if (isFocused()) { + voiceSpaceSelector->removeFocus(); + removeFocus(); + } + } + + void setOptions(std::span newOptions) { + voiceSpaceSelector->setOptions(newOptions); + } + + void setSelection(size_t idx) { + voiceSpaceSelector->setSelection(idx); + redraw(); + } + + + +private: + std::shared_ptr voiceSpaceSelector; + +}; + +#endif diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/XYPadView.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/XYPadView.hpp new file mode 100644 index 0000000..301cad7 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/XYPadView.hpp @@ -0,0 +1,82 @@ +#ifndef __XYPADVIEW_VIEW_HPP__ +#define __XYPADVIEW_VIEW_HPP__ + +#include "View.hpp" +#include "UIElements.hpp" + + +class XYPadView : public ViewBase { +public: + using OnTouchCallback = std::function; + using OnTouchReleaseCallback = std::function; + + XYPadView(String name, int colour = TFT_GREEN) + : ViewBase(name), colour(colour) + { + + } + void SetOnTouchCallback(OnTouchCallback _cb_) { + cb = _cb_; + } + void SetOnTouchReleaseCallback(OnTouchCallback _cb_) { + cbRelease = _cb_; + } + + + void OnSetup() override { + } + + void OnDisplay() override { + }; + + + void OnDraw() override { + if (touchReleaseFlag) { + touchReleaseFlag = false; + if (y > area.y) { + scr->fillRect(x, y, 10,10, TFT_BLACK); + } + }else if (touchDownFlag) { + if (y > area.y) { + scr->fillRect(x, y, 10,10, colour); + } + touchDownFlag = false; + } + Serial.printf("XYPadView OnDraw at: %d, %d\n", x, y); + } + + void OnTouchDown(size_t x, size_t y) override { + // Update position based on touch coordinates + this->x = x; + this->y = y; + touching = true; + touchDownFlag = true; + if(cb) { + cb(x / (float)area.w, 1-(y / (float)(area.h - area.y))); + } + redraw(); + }; + + void OnTouchUp(size_t x, size_t y) override { + touching = false; + touchReleaseFlag = true; + if(cbRelease) { + cbRelease(x / (float)area.w, 1-(y / (float)(area.h - area.y))); + } + redraw(); + }; + + + +private: + size_t x,y; + bool touching; + int colour = TFT_GREEN; + bool touchReleaseFlag = false; + bool touchDownFlag = false; + OnTouchCallback cb = nullptr; + OnTouchReleaseCallback cbRelease = nullptr; + +}; + +#endif diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/pinconfig.md b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/pinconfig.md new file mode 100644 index 0000000..501c836 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/pinconfig.md @@ -0,0 +1,61 @@ +# Pin configuration + +## Momentary switches or buttons: + +| Pin Number | Pin Name | Type | +|------------|----------|------| +| 24 | MOM_A1 | INPUT_PULLUP | +| 25 | MOM_A2 | INPUT_PULLUP | +| 28 | MOM_B1 | INPUT_PULLUP | +| 29 | MOM_B2 | INPUT_PULLUP | +| 23 | RE_SW | INPUT_PULLUP | +| 17 | RE_B | INPUT_PULLUP | +| 11 | RE_A | INPUT_PULLUP | + +## Toggle switches: +| Pin Number | Pin Name | Type | +|------------|----------|------| +| 26 | TOG_A1 | INPUT_PULLUP | +| 27 | TOG_A2 | INPUT_PULLUP | +| 30 | TOG_B1 | INPUT_PULLUP | +| 31 | TOG_B2 | INPUT_PULLUP | +| 32 | JOY_SW | INPUT_PULLUP | + +## ADCs: + +| Pin Number | Pin Name | ADC Channel | Type | Resolution | +|------------|----------|-------------|------|------------| +| 40 | JOY_X | 0 | INPUT | 12-bit | +| 41 | JOY_Y | 1 | INPUT | 12-bit | +| 42 | JOY_Z | 2 | INPUT | 12-bit | +| 47 | RV_Gain1 | 7 | INPUT | 12-bit | +| 46 | RV_Z1 | 6 | INPUT | 12-bit | +| 45 | RV_Y1 | 5 | INPUT | 12-bit | +| 44 | RV_X1 | 4 | INPUT | 12-bit | + +## LED: + +| Pin Number | Pin Name | Type | Description | +|------------|----------|------|-------------| +| 33 | LED | OUTPUT | Status LED | +| 43 | LED_Timing | OUTPUT | Timing LED | + +## UART: + +| UART Name | TX Pin | RX Pin | Description | +|-----------|--------|--------|-------------| +| DaisyPIO | 36 | N/A | One-way communication to Daisy | +| SensorUART | 34 | 35 | Bidirectional sensor communication | +| MIDI | 4 | 5 | MIDI in/out | + +## SPI: + +| SPI Name | CS Pin | SCK Pin | MISO Pin | MOSI Pin | Description | +|----------|--------|---------|----------|----------|-------------| +| SDCard | 13 | 14 | 12 | 15 | SPI interface to onboard SD card | + +## I2C: + +| I2C Name | SDA Pin | SCL Pin | Description | +|----------|---------|---------|-------------| +| USeqI2C | 38 | 39 | USeq output for CV | diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/InterfaceBase.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/InterfaceBase.cpp new file mode 100644 index 0000000..1221c1d --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/InterfaceBase.cpp @@ -0,0 +1,54 @@ +#include "InterfaceBase.hpp" +#include + + +InterfaceBase::InterfaceBase() : + init_done_(false), + n_inputs_(0), + n_outputs_(0), + midi_(nullptr) +{ +} + +InterfaceBase::~InterfaceBase() +{ +} + +void InterfaceBase::setup(size_t n_inputs, size_t n_outputs) +{ + queue_init(&queue_audioparam_, sizeof(float)*n_outputs, 1); + n_inputs_ = n_inputs; + n_outputs_ = n_outputs; + init_done_ = true; +} + +void InterfaceBase::SendParamsToQueue(const std::vector& data) { + if (!init_done_) { + DEBUG_PRINTLN("InterfaceBase::SendParamsToQueue - Error: Interface not initialized"); + return; + } + if (data.size() != n_outputs_) { + DEBUG_PRINTLN("InterfaceBase::SendParamsToQueue - Error: data size mismatch"); + DEBUG_PRINTF("Expected: %zu, Received: %zu\n", n_outputs_, data.size()); + return; + } + queue_try_add(&queue_audioparam_, data.data()); + if (paramOutputHook) { + paramOutputHook(data); + } else if (midi_) { + midi_->SendParamsAsMIDICC(data); + } else { + DEBUG_PRINTLN("Warning: MIDI interface not set"); + } +} + +bool InterfaceBase::ReceiveParamsFromQueue(float *data) { + if (!init_done_) { + DEBUG_PRINTLN("InterfaceBase::ReceiveParamsFromQueue - Error: Interface not initialized"); + return false; + } + // if (data.size() != n_outputs_) { + // data.resize(n_outputs_); + // } + return queue_try_remove(&queue_audioparam_, data); +} diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/InterfaceBase.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/InterfaceBase.hpp new file mode 100644 index 0000000..fc2c489 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/InterfaceBase.hpp @@ -0,0 +1,61 @@ +#ifndef __INTERFACE_BASE_HPP__ +#define __INTERFACE_BASE_HPP__ + +#include "pico/util/queue.h" +#include +#include +#include "MIDIInOut.hpp" +#include +#include + + +class InterfaceBase +{ +protected: + InterfaceBase(); + + // Member variables + bool init_done_; + size_t n_inputs_; + size_t n_outputs_; + queue_t queue_audioparam_; + std::shared_ptr midi_; + +public: + ~InterfaceBase(); + + // Disable copy constructor and assignment operator + InterfaceBase(const InterfaceBase&) = delete; + InterfaceBase& operator=(const InterfaceBase&) = delete; + + // Disable move constructor and assignment operator + InterfaceBase(InterfaceBase&&) = delete; + InterfaceBase& operator=(InterfaceBase&&) = delete; + + // Virtual functions with default implementations + virtual void setup(size_t n_inputs, size_t n_outputs); + + inline void SetMIDIInterface(std::shared_ptr midi) { + midi_ = midi; + } + + // Optional transform applied to params before queuing and before storing as training action. + // Set this to apply FocusManager::applyInPlace or similar. + std::function&)> paramTransformHook; + + // Optional output hook — when set, replaces the default SendParamsAsMIDICC() call. + // Use this to send SysEx or other non-CC output. If null, CC output is used as normal. + std::function)> paramOutputHook; + + // Queue management + void SendParamsToQueue(const std::vector& data); + + //todo: this should be std::array and this class should be templated + bool ReceiveParamsFromQueue(float *data); + + virtual void readAnalysisParameters(std::vector params) { + // Default implementation does nothing + } +}; + +#endif// __INTERFACE_BASE_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/MIDIInOut.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/MIDIInOut.cpp new file mode 100644 index 0000000..c726977 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/MIDIInOut.cpp @@ -0,0 +1,847 @@ +#include "MIDIInOut.hpp" +#include +#include "../PicoDefs.hpp" +#include +#include "hardware/dma.h" + + + +struct CustomMIDISettings : public midi::DefaultSettings { + static const bool UseRunningStatus = false; + static const bool Use1ByteParsing = false; // Add this line + static const long BaudRate = 31250; +}; + +MIDI_CREATE_CUSTOM_INSTANCE(HardwareSerial, Serial2, MIDI, CustomMIDISettings); + + +#ifdef MIDI_USB_CLIENT +#include +Adafruit_USBD_MIDI usb_midi; +MIDI_CREATE_INSTANCE(Adafruit_USBD_MIDI, usb_midi, USBMIDI); +#endif + + +MIDIInOut* MIDIInOut::instance_ = nullptr; + +MIDIInOut::MIDIInOut() : n_outputs_(0), + cc_callback_(nullptr), + note_callback_(nullptr), + send_channel_(1), + note_channel_(1), + refresh_uart_(false), + use_advanced_mappings_(false), + tx_dma_channel_(-1), + dma_busy_(false), + midi_tx_pin_(0), + rx_dma_channel_(-1), + rx_read_pos_(0), + parser_state_(0), + parser_status_(0), + parser_index_(0), + running_status_(0), + msg_write_pos_(0), + msg_read_pos_(0), + max_messages_per_poll_(16), + max_bytes_per_poll_(64), + track_changes_(true), + queue_write_pos_(0) { + instance_ = this; + memset(tx_dma_buffer_, 0, sizeof(tx_dma_buffer_)); + memset(rx_dma_buffer_, 0, sizeof(rx_dma_buffer_)); + memset(parser_data_, 0, sizeof(parser_data_)); + memset(msg_queue_, 0, sizeof(msg_queue_)); + memset(midi_queue_buffer_, 0, sizeof(midi_queue_buffer_)); +#ifdef MIDI_USB_CLIENT + // TinyUSB setup - must be before Serial + TinyUSBDevice.setManufacturerDescriptor("ELI"); + TinyUSBDevice.setProductDescriptor("MEMLNaut MIDI"); +#endif +} + +MIDIInOut::~MIDIInOut() { + // Clean up DMA channels if allocated + if (tx_dma_channel_ >= 0) { + dma_channel_abort(tx_dma_channel_); + dma_channel_unclaim(tx_dma_channel_); + tx_dma_channel_ = -1; + } + if (rx_dma_channel_ >= 0) { + dma_channel_abort(rx_dma_channel_); + dma_channel_unclaim(rx_dma_channel_); + rx_dma_channel_ = -1; + } +} + +void MIDIInOut::Setup(size_t n_outputs, + bool midi_through, uint8_t midi_tx, uint8_t midi_rx, bool use_dma_rx) { + n_outputs_ = n_outputs; + cc_numbers_.resize(n_outputs); + + // Initialize Serial2 first + Serial2.end(); // Reset Serial2 state + delay(10); + Serial2.setFIFOSize(32); // Set larger FIFO + Serial2.setTX(midi_tx); + Serial2.setRX(midi_rx); + Serial2.begin(31250); // Start MIDI baud rate + while(!Serial2) { delay(1); } // Wait for Serial2 + delay(100); // Allow port to stabilize + + // Check DMA channel availability before claiming + int available_channels = 0; + for (int i = 0; i < NUM_DMA_CHANNELS; i++) { + if (!dma_channel_is_claimed(i)) { + available_channels++; + } + } + DEBUG_PRINTF("DMA channels available: %d / %d\n", available_channels, NUM_DMA_CHANNELS); + + // Setup DMA for TX (Serial2 uses uart1 on RP2040) + midi_tx_pin_ = midi_tx; + if (!setupTxDMA(uart1)) { + DEBUG_PRINTLN("Warning: DMA TX setup failed, falling back to regular writes"); + } else { + DEBUG_PRINTF("DMA TX initialized (channel %d)\n", tx_dma_channel_); + } + + // Setup DMA for RX only if explicitly requested (to avoid DMA channel conflicts) + if (use_dma_rx) { + if (!setupRxDMA(uart1)) { + DEBUG_PRINTLN("Warning: DMA RX setup failed, falling back to MIDI.read()"); + } else { + DEBUG_PRINTF("DMA RX initialized (channel %d)\n", rx_dma_channel_); + } + } else { + DEBUG_PRINTLN("MIDI RX using Arduino MIDI library (DMA RX disabled to preserve channels)"); + } + + // Initialize CC numbers to default values [0 .. (n_outputs-1)] + std::vector midiShitList = {0, 6,7, 8, 10, 32, 38, 39,41, 43}; + + std::unordered_set excludeSet(midiShitList.begin(), midiShitList.end()); + std::vector ccnums; + ccnums.reserve(127 - midiShitList.size()); // pre-allocate + + for(int i = 0; i < 127; i++) { + if(excludeSet.find(i) == excludeSet.end()) { + ccnums.push_back(i); + } + } + + cc_numbers_.resize(ccnums.size()); + for(size_t i=0; i < ccnums.size();i++) { + cc_numbers_[i] = static_cast(ccnums[i]); + } + + // Initialize change tracking with invalid values to force first send + last_sent_values_.resize(n_outputs_, 0xFF); + + if (midi_through) { + // Enable MIDI thru if requested + MIDI.turnThruOn(); + } else { + // Disable MIDI thru to prevent loop-back + MIDI.turnThruOff(); + } + + // Setup static callbacks + MIDI.setHandleControlChange(handleControlChange); + MIDI.setHandleNoteOn(handleNoteOn); + MIDI.setHandleNoteOff(handleNoteOff); + MIDI.begin(MIDI_CHANNEL_OMNI); + delay(100); // Allow MIDI to initialize + + // // Test sending messages with memory barriers + // MEMORY_BARRIER(); + // MIDI.sendNoteOn(60, 127, 1); + // Serial2.flush(); + // delay(1); + // MIDI.sendNoteOff(60, 0, 1); + // Serial2.flush(); + // delay(1); + // MIDI.sendControlChange(102, 127, 1); + // Serial2.flush(); + // delay(1); + // MIDI.sendControlChange(102, 0, 1); + // Serial2.flush(); + // MEMORY_BARRIER(); + +#ifdef MIDI_USB_CLIENT + USBMIDI.begin(MIDI_CHANNEL_OMNI); + + // Set up callbacks for incoming MIDI + USBMIDI.setHandleNoteOn(handleNoteOn); + USBMIDI.setHandleNoteOff(handleNoteOff); + MIDI.setHandleControlChange(handleControlChange); + +#endif + + DEBUG_PRINTLN("MIDI setup complete"); + // Serial2.flush(); // Ensure the message is sent completely +} + +void MIDIInOut::Poll() +{ + // Use DMA-based processing if available + if (rx_dma_channel_ >= 0) { + // Process incoming bytes from DMA buffer + processRxBuffer(); + + // Process queued messages with rate limiting + processQueuedMessages(); + } else { + // Non-DMA path: Read from Serial2 directly with rate limiting + // Process limited number of bytes per poll to prevent blocking + uint32_t bytes_processed = 0; + + while (Serial2.available() && bytes_processed < max_bytes_per_poll_) { + uint8_t byte = Serial2.read(); + processMidiByte(byte); + bytes_processed++; + } + + // Process queued messages with rate limiting + processQueuedMessages(); + } + // USBMIDI.read(); +} + + +void MIDIInOut::warnSizeMismatch(const char* function_name, size_t expected, size_t actual) const { + DEBUG_PRINTF("Warning: %s size mismatch (expected %d, got %d)\n", function_name, expected, actual); +} + +void MIDIInOut::SetParamCCNumbers(const std::vector& cc_numbers) { + if (cc_numbers.size() != n_outputs_) { + warnSizeMismatch("SetParamCCNumbers", n_outputs_, cc_numbers.size()); + } + cc_numbers_ = cc_numbers; +} + +void MIDIInOut::SendParamsAsMIDICC(std::span params) { + // Optimized: Build directly into DMA buffer, skip unchanged values, use running status + size_t buf_idx = 0; + + if (use_advanced_mappings_) { + // Use advanced mappings with individual channels and custom scaling + size_t send_count = std::min(params.size(), std::min(advanced_mappings_.size(), n_outputs_)); + uint8_t last_channel = 0; // Track channel for running status + + for (size_t i = 0; i < send_count; i++) { + uint8_t value = scaleValue(params[i], advanced_mappings_[i]); + + // Skip if value hasn't changed + if (track_changes_ && value == last_sent_values_[i]) { + continue; + } + last_sent_values_[i] = value; + + // Use running status: only send status byte when channel changes + uint8_t channel = advanced_mappings_[i].channel; + if (channel != last_channel || buf_idx == 0) { + tx_dma_buffer_[buf_idx++] = 0xB0 | ((channel - 1) & 0x0F); + last_channel = channel; + } + + tx_dma_buffer_[buf_idx++] = advanced_mappings_[i].cc_number & 0x7F; + tx_dma_buffer_[buf_idx++] = value & 0x7F; + + // Check buffer limit + if (buf_idx >= DMA_BUFFER_SIZE - 3) break; + } + } else { + // Use simple mappings (all on same channel - maximum running status benefit) + size_t send_count = std::min(params.size(), std::min(cc_numbers_.size(), n_outputs_)); + uint8_t status_byte = 0xB0 | ((send_channel_ - 1) & 0x0F); + bool status_sent = false; + + for (size_t i = 0; i < send_count; i++) { + // Fast clamping and scaling + float clamped = params[i]; + clamped = (clamped > 1.0f) ? 1.0f : ((clamped < 0.0f) ? 0.0f : clamped); + uint8_t value = static_cast(clamped * 127.0f + 0.5f); + + // Skip if value hasn't changed + if (track_changes_ && value == last_sent_values_[i]) { + continue; + } + last_sent_values_[i] = value; + + // Send status byte only once (running status) + if (!status_sent) { + tx_dma_buffer_[buf_idx++] = status_byte; + status_sent = true; + } + + tx_dma_buffer_[buf_idx++] = cc_numbers_[i] & 0x7F; + tx_dma_buffer_[buf_idx++] = value & 0x7F; + + // Check buffer limit + if (buf_idx >= DMA_BUFFER_SIZE - 3) break; + } + } + + // Only send if we have data + if (buf_idx > 0) { + if (tx_dma_channel_ >= 0) { + sendViaDMADirect(buf_idx); // No memcpy - buffer already built in place + } else { + Serial2.write(tx_dma_buffer_, buf_idx); + } + } +} + +void MIDIInOut::SetAdvancedParamMappings(const std::vector& mappings) { + if (mappings.size() != n_outputs_) { + warnSizeMismatch("SetAdvancedParamMappings", n_outputs_, mappings.size()); + } + + advanced_mappings_ = mappings; + + // Validate and fix mappings for efficiency + for (size_t i = 0; i < advanced_mappings_.size(); i++) { + // Ensure valid ranges + if (advanced_mappings_[i].channel < 1 || advanced_mappings_[i].channel > 16) { + advanced_mappings_[i].channel = 1; + } + if (advanced_mappings_[i].cc_number > 127) { + advanced_mappings_[i].cc_number = 127; + } + if (advanced_mappings_[i].min_value > 127) { + advanced_mappings_[i].min_value = 127; + } + if (advanced_mappings_[i].max_value > 127) { + advanced_mappings_[i].max_value = 127; + } + // Recompute scale factor in case values were clamped + uint8_t range = advanced_mappings_[i].max_value - advanced_mappings_[i].min_value; + advanced_mappings_[i].scale_factor = range; + } + + use_advanced_mappings_ = true; +} + +void MIDIInOut::SetParamMapping(size_t index, uint8_t cc_number, uint8_t channel, uint8_t min_value, uint8_t max_value) { + if (index >= n_outputs_) { + DEBUG_PRINTF("Warning: Parameter index %d out of range (max %d)\n", index, n_outputs_ - 1); + return; + } + + // Initialize advanced_mappings_ if not already done + if (advanced_mappings_.size() != n_outputs_) { + advanced_mappings_.resize(n_outputs_); + } + + // Validate and clamp values using bit operations for efficiency + channel = (channel < 1) ? 1 : ((channel > 16) ? 16 : channel); + cc_number = (cc_number > 127) ? 127 : cc_number; + min_value = (min_value > 127) ? 127 : min_value; + max_value = (max_value > 127) ? 127 : max_value; + + advanced_mappings_[index] = CCMapping(cc_number, channel, min_value, max_value); + use_advanced_mappings_ = true; +} + +void MIDIInOut::ClearAdvancedMappings() { + use_advanced_mappings_ = false; +} + +void MIDIInOut::SetMIDISendChannel(uint8_t channel) { + // Ensure channel is in valid range (1-16) + if (channel < 1 || channel > 16) { + DEBUG_PRINTF("Warning: Invalid MIDI channel %d (must be 1-16)\n", channel); + return; + } + send_channel_ = channel; +} + +void MIDIInOut::SetMIDINoteChannel(uint8_t channel) { + // Ensure channel is in valid range (1-16) + if (channel < 1 || channel > 16) { + DEBUG_PRINTF("Warning: Invalid MIDI note channel %d (must be 1-16)\n", channel); + return; + } + note_channel_ = channel; +} + +void MIDIInOut::SetCCCallback(midi_cc_callback_t callback) { + cc_callback_ = callback; +} + +void MIDIInOut::SetNoteCallback(midi_note_callback_t callback) { + note_callback_ = callback; +} + +// Static callback implementations +void MIDIInOut::handleControlChange(byte channel, byte number, byte value) { + if (instance_ && instance_->cc_callback_) { + instance_->cc_callback_(number, value); + } +} + +void MIDIInOut::handleNoteOn(byte channel, byte note, byte velocity) { + if (instance_ && instance_->note_callback_) { + instance_->note_callback_(true, note, velocity); + } +} + +void MIDIInOut::handleNoteOff(byte channel, byte note, byte velocity) { + if (instance_ && instance_->note_callback_) { + instance_->note_callback_(false, note, velocity); + } +} + +void MIDIInOut::RefreshUART_(void) { + if (!READ_VOLATILE(refresh_uart_)) { + Serial2.end(); // Reset Serial2 state + //delay(10); + Serial2.setFIFOSize(32); // Set larger FIFO + Serial2.setTX(Pins::MIDI_TX); + Serial2.setRX(Pins::MIDI_RX); + Serial2.begin(31250); // Start MIDI baud rate + while(!Serial2) {} // Wait for Serial2 + WRITE_VOLATILE(refresh_uart_, true); + + DEBUG_PRINTLN("MIDI UART refreshed."); + } +} + +bool MIDIInOut::sendNoteOn(uint8_t note_number, uint8_t velocity) { + if (note_number > 127 || velocity > 127) { + return false; + } + + // RefreshUART_(); // Refresh UART if needed + + // while(!Serial2) { delay(1); } // Wait for Serial2 + MIDI.sendNoteOn(note_number, velocity, note_channel_); + // MEMORY_BARRIER(); + return true; +} + +bool MIDIInOut::sendNoteOff(uint8_t note_number, uint8_t velocity) { + if (note_number > 127 || velocity > 127) { + return false; + } + + RefreshUART_(); // Refresh UART if needed + + while(!Serial2) { delay(1); } // Wait for Serial2 + MIDI.sendNoteOff(note_number, velocity, note_channel_); + MEMORY_BARRIER(); + return true; +} + +// Buffered MIDI queue implementation +bool MIDIInOut::queueNoteOn(uint8_t note, uint8_t velocity) { + if (note > 127 || velocity > 127) { + return false; + } + + // Auto-flush if not enough space + if (queue_write_pos_ + 3 > MIDI_QUEUE_BUFFER_SIZE) { + flushQueue(); + } + + midi_queue_buffer_[queue_write_pos_++] = 0x90 | ((note_channel_ - 1) & 0x0F); + midi_queue_buffer_[queue_write_pos_++] = note & 0x7F; + midi_queue_buffer_[queue_write_pos_++] = velocity & 0x7F; + + return true; +} + +bool MIDIInOut::queueNoteOff(uint8_t note, uint8_t velocity) { + if (note > 127 || velocity > 127) { + return false; + } + + // Auto-flush if not enough space + if (queue_write_pos_ + 3 > MIDI_QUEUE_BUFFER_SIZE) { + flushQueue(); + } + + midi_queue_buffer_[queue_write_pos_++] = 0x80 | ((note_channel_ - 1) & 0x0F); + midi_queue_buffer_[queue_write_pos_++] = note & 0x7F; + midi_queue_buffer_[queue_write_pos_++] = velocity & 0x7F; + + return true; +} + + +bool MIDIInOut::queueClock() { + if (queue_write_pos_ + 1 > MIDI_QUEUE_BUFFER_SIZE) { + flushQueue(); + } + midi_queue_buffer_[queue_write_pos_++] = 0xF8 ; + return true; +} +bool MIDIInOut::queueClockStart() { + if (queue_write_pos_ + 1 > MIDI_QUEUE_BUFFER_SIZE) { + flushQueue(); + } + midi_queue_buffer_[queue_write_pos_++] = 0xFA ; + return true; +} + + +bool MIDIInOut::queueClockStop() { + if (queue_write_pos_ + 1 > MIDI_QUEUE_BUFFER_SIZE) { + flushQueue(); + } + midi_queue_buffer_[queue_write_pos_++] = 0xFC ; + return true; +} + + +bool MIDIInOut::queueCC(uint8_t cc_number, uint8_t value) { + if (cc_number > 127 || value > 127) { + return false; + } + + // Auto-flush if not enough space + if (queue_write_pos_ + 3 > MIDI_QUEUE_BUFFER_SIZE) { + flushQueue(); + } + + midi_queue_buffer_[queue_write_pos_++] = 0xB0 | ((send_channel_ - 1) & 0x0F); + midi_queue_buffer_[queue_write_pos_++] = cc_number & 0x7F; + midi_queue_buffer_[queue_write_pos_++] = value & 0x7F; + + return true; +} + +size_t MIDIInOut::flushQueue() { + if (queue_write_pos_ == 0) { + return 0; // Nothing to send + } + + size_t bytes_to_send = queue_write_pos_; + + // Wait for any existing DMA to complete + waitForDMA(); + + // Copy queue to DMA buffer + memcpy(tx_dma_buffer_, midi_queue_buffer_, bytes_to_send); + + // Send via DMA or fallback to Serial2 + if (tx_dma_channel_ >= 0) { + sendViaDMADirect(bytes_to_send); + } else { + Serial2.write(tx_dma_buffer_, bytes_to_send); + } + + // Reset queue position + queue_write_pos_ = 0; + + return bytes_to_send; +} + +// DMA Implementation +bool MIDIInOut::setupTxDMA(uart_inst_t* uart) { + // Claim DMA channel (don't panic on failure) + tx_dma_channel_ = dma_claim_unused_channel(false); + if (tx_dma_channel_ < 0) { + return false; // No DMA channel available + } + + // Configure TX data channel + dma_channel_config c = dma_channel_get_default_config(tx_dma_channel_); + channel_config_set_transfer_data_size(&c, DMA_SIZE_8); + channel_config_set_read_increment(&c, true); // Increment read address + channel_config_set_write_increment(&c, false); // Always write to UART DR + channel_config_set_dreq(&c, uart_get_dreq(uart, true)); // UART TX DREQ + + dma_channel_configure( + tx_dma_channel_, + &c, + &uart_get_hw(uart)->dr, // Write to UART data register + NULL, // Read address set later + 0, // Transfer count set later + false // Don't start yet + ); + + dma_busy_ = false; + return true; +} + +void MIDIInOut::sendViaDMA(const uint8_t* data, size_t length) { + if (tx_dma_channel_ < 0 || length == 0 || length > DMA_BUFFER_SIZE) { + return; // DMA not available or invalid length + } + + // Wait for previous transfer to complete + waitForDMA(); + + // Copy data to DMA buffer + memcpy(tx_dma_buffer_, data, length); + + // Start DMA transfer + dma_busy_ = true; + dma_channel_set_read_addr(tx_dma_channel_, tx_dma_buffer_, false); + dma_channel_set_trans_count(tx_dma_channel_, length, true); // Start immediately +} + +void MIDIInOut::sendViaDMADirect(size_t length) { + if (tx_dma_channel_ < 0 || length == 0 || length > DMA_BUFFER_SIZE) { + return; // DMA not available or invalid length + } + + // Wait for previous transfer to complete + waitForDMA(); + + // Start DMA transfer directly from buffer (no memcpy needed) + dma_busy_ = true; + dma_channel_set_read_addr(tx_dma_channel_, tx_dma_buffer_, false); + dma_channel_set_trans_count(tx_dma_channel_, length, true); // Start immediately +} + +void MIDIInOut::waitForDMA() { + if (tx_dma_channel_ < 0 || !dma_busy_) { + return; + } + + // Wait for DMA to complete + while (dma_channel_is_busy(tx_dma_channel_)) { + tight_loop_contents(); + } + + dma_busy_ = false; +} + +void MIDIInOut::sendRawBytes(const uint8_t* data, size_t length) { + if (length == 0) return; + if (tx_dma_channel_ >= 0) { + sendViaDMA(data, length); + } else { + Serial2.write(data, length); + } +} + +// RX DMA Implementation +bool MIDIInOut::setupRxDMA(uart_inst_t* uart) { + // Claim DMA channel for RX (don't panic on failure) + rx_dma_channel_ = dma_claim_unused_channel(false); + if (rx_dma_channel_ < 0) { + return false; // No DMA channel available + } + + // Configure RX DMA with ring buffer + dma_channel_config c = dma_channel_get_default_config(rx_dma_channel_); + channel_config_set_transfer_data_size(&c, DMA_SIZE_8); + channel_config_set_read_increment(&c, false); // Always read from UART DR + channel_config_set_write_increment(&c, true); // Increment write address + channel_config_set_dreq(&c, uart_get_dreq(uart, false)); // UART RX DREQ + + // Enable ring buffer on write (wraps at RX_BUFFER_SIZE) + uint32_t ring_size = 0; + uint32_t size = RX_BUFFER_SIZE; + while (size >>= 1) ring_size++; + channel_config_set_ring(&c, true, ring_size); // true = wrap on write + + // Start the DMA channel + dma_channel_configure( + rx_dma_channel_, + &c, + rx_dma_buffer_, // Write to rx_buffer + &uart_get_hw(uart)->dr, // Read from UART data register + 0xFFFFFFFF, // Transfer count (infinite with ring) + true // Start immediately + ); + + return true; +} + +uint32_t MIDIInOut::getRxWritePos() { + // Calculate current write position from DMA transfer count + uint32_t remaining = dma_channel_hw_addr(rx_dma_channel_)->transfer_count; + return (0xFFFFFFFF - remaining) & (RX_BUFFER_SIZE - 1); +} + +void MIDIInOut::processRxBuffer() { + uint32_t write_pos = getRxWritePos(); + + // Process all available bytes + while (rx_read_pos_ != write_pos) { + uint8_t byte = rx_dma_buffer_[rx_read_pos_]; + rx_read_pos_ = (rx_read_pos_ + 1) & (RX_BUFFER_SIZE - 1); + + processMidiByte(byte); + } +} + +unsigned long medianOf3(unsigned long a, unsigned long b, unsigned long c) { + if (a > b) std::swap(a, b); + if (b > c) std::swap(b, c); + if (a > b) std::swap(a, b); + return b; +} + +int counter=0; +void MIDIInOut::updateTempoEstimate() { + unsigned long now = micros(); + unsigned long delta = now - midiClockTS; + if (delta < 100) + { + delta = deltaTMinus1; // Ignore unrealistic short intervals (could be due to jitter) + } + unsigned long deltaSmoothed = medianOf3(deltaTMinus1, deltaTMinus2, delta); + if (deltaSmoothed > 0.f) { + float ticksPerSecond = 1000000.f/deltaSmoothed; + static float lastBPM = 140.f; + float bpm = ticksPerSecond * 60.f / 24.f; + if (fabs(bpm - lastBPM) > 0.1f) { + lastBPM = bpm; + if (bpm_callback_) { + bpm_callback_(bpm); + } + } + } + counter++; + if (counter >= 12) { + // Serial.printf("---------Estimated BPM: %.2f, %f\n", bpm, deltaSmoothed); + counter = 0; + }; + deltaTMinus2 = deltaTMinus1; + deltaTMinus1 = delta; + midiClockTS = now; +} + +void MIDIInOut::processMidiByte(uint8_t byte) { + // Check if this is a status byte + if (byte & 0x80) { + // System Real-Time messages (single byte, can interrupt other messages) + if (byte == 0xF8) { + updateTempoEstimate(); + return; + } + if (byte == 0xFA) { + if (transport_callback_) { + transport_callback_(true); // Start + } + return; + } + if (byte == 0xFC) { + if (transport_callback_) { + transport_callback_(false); // Stop + } + return; + } + + // System Common messages or Channel Voice messages + parser_status_ = byte; + parser_index_ = 0; + + // Determine expected data bytes + uint8_t msg_type = byte & 0xF0; + + if (msg_type == 0xF0) { + // System messages - ignore SysEx for this implementation + if (byte == 0xF0) { + parser_state_ = 0xFF; // Ignore until 0xF7 + } + return; + } + + // Channel voice message + running_status_ = parser_status_; + + } else if (parser_status_ == 0 && running_status_ != 0) { + // Use running status + parser_status_ = running_status_; + parser_index_ = 0; + } + + // Ignore if in SysEx ignore mode + if (parser_state_ == 0xFF) { + if (byte == 0xF7) parser_state_ = 0; + return; + } + + // Process data bytes + if (!(byte & 0x80) && parser_status_ != 0) { + uint8_t msg_type = parser_status_ & 0xF0; + + // Determine how many data bytes we need + uint8_t expected_bytes = 2; + if (msg_type == 0xC0 || msg_type == 0xD0) { // Program Change or Channel Aftertouch + expected_bytes = 1; + } + + parser_data_[parser_index_++] = byte; + + if (parser_index_ >= expected_bytes) { + // Complete message received - queue it + uint8_t channel = (parser_status_ & 0x0F) + 1; // 1-16 + uint8_t data2 = (expected_bytes > 1) ? parser_data_[1] : 0; + + queueMessage(msg_type, channel, parser_data_[0], data2); + + // Reset for next message (but keep running status) + parser_index_ = 0; + } + } +} + +void MIDIInOut::queueMessage(uint8_t type, uint8_t channel, uint8_t data1, uint8_t data2) { + // Add message to queue + uint32_t next_pos = (msg_write_pos_ + 1) % MSG_QUEUE_SIZE; + + // Check if queue is full (drop message if full) + if (next_pos == msg_read_pos_) { + return; // Queue full, drop message + } + + msg_queue_[msg_write_pos_].type = type; + msg_queue_[msg_write_pos_].channel = channel; + msg_queue_[msg_write_pos_].data1 = data1; + msg_queue_[msg_write_pos_].data2 = data2; + + msg_write_pos_ = next_pos; +} + +void MIDIInOut::processQueuedMessages() { + uint32_t processed = 0; + + // Process messages up to the limit + while (msg_read_pos_ != msg_write_pos_) { + // Check rate limit + if (max_messages_per_poll_ > 0 && processed >= max_messages_per_poll_) { + break; // Hit rate limit, process more next time + } + + const MIDIMessage& msg = msg_queue_[msg_read_pos_]; + msg_read_pos_ = (msg_read_pos_ + 1) % MSG_QUEUE_SIZE; + processed++; + + // Call appropriate callback + switch (msg.type) { + case 0x90: // Note On + if (msg.data2 == 0) { + // Velocity 0 = Note Off + if (note_callback_) { + note_callback_(false, msg.data1, 0); + } + } else { + if (note_callback_) { + note_callback_(true, msg.data1, msg.data2); + } + } + break; + + case 0x80: // Note Off + if (note_callback_) { + note_callback_(false, msg.data1, msg.data2); + } + break; + + case 0xB0: // Control Change + if (cc_callback_) { + cc_callback_(msg.data1, msg.data2); + } + break; + + // Add more message types as needed + } + } +} diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/MIDIInOut.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/MIDIInOut.hpp new file mode 100644 index 0000000..14d8876 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/MIDIInOut.hpp @@ -0,0 +1,356 @@ +#ifndef __MIDI_IN_OUT_HPP__ +#define __MIDI_IN_OUT_HPP__ + +#include +#include +#include +#include "../hardware/memlnaut/Pins.hpp" +#include +#include +#include "hardware/dma.h" +#include "hardware/uart.h" + +//#define MIDI_USB_CLIENT + + + +class MIDIInOut +{ +public: + /** + * @brief Constructor (only instantiates memory and member variables). * + */ + MIDIInOut(); + + /** + * @brief Destructor - cleans up DMA resources + */ + ~MIDIInOut(); + + /** + * @brief Sets up the MIDI interface on the required pins. + * The CC numbers are set to the default values [0 .. (n_outputs-1)]. + * + * @param n_outputs Number of output parameters that will be expected by SendParamsAsMIDICC(). + * @param midi_through Enable MIDI thru + * @param midi_tx TX pin the MIDI device is connected to (default: Pins::MIDI_TX). + * @param midi_rx RX pin the MIDI device is connected to (default: Pins::MIDI_RX). + * @param use_dma_rx Enable DMA for RX (default: false to avoid conflicts with audio/neural net DMA) + */ + void Setup(size_t n_outputs, + bool midi_through = false, + uint8_t midi_tx = Pins::MIDI_TX, + uint8_t midi_rx = Pins::MIDI_RX, + bool use_dma_rx = false); + /** + * @brief Set the MIDI channel to send messages on. + * + * @param channel MIDI channel (1-16). + * @note The channel is set to 1-16, but the library uses 0-15 internally. + */ + void SetMIDISendChannel(uint8_t channel); + + /** + * @brief Set the MIDI channel to send note messages on. + * + * @param channel MIDI channel (1-16). + * @note The channel is set to 1-16, but the library uses 0-15 internally. + */ + void SetMIDINoteChannel(uint8_t channel); + + /** + * @brief Send a MIDI Note On message + * + * @param note_number MIDI note number (0-127) + * @param velocity Note velocity (0-127) + * @return true if message sent successfully, false otherwise + */ + bool sendNoteOn(uint8_t note_number, uint8_t velocity); + + /** + * @brief Send a MIDI Note Off message + * + * @param note_number MIDI note number (0-127) + * @param velocity Note velocity (0-127, typically 0) + * @return true if message sent successfully, false otherwise + */ + bool sendNoteOff(uint8_t note_number, uint8_t velocity = 0); + + /** + * @brief Queue a MIDI Note On message for buffered transmission + * @param note MIDI note number (0-127) + * @param velocity Note velocity (0-127) + * @return true if queued successfully, false if invalid params + */ + bool queueNoteOn(uint8_t note, uint8_t velocity); + + /** + * @brief Queue a MIDI Note Off message for buffered transmission + * @param note MIDI note number (0-127) + * @param velocity Note velocity (0-127, typically 0) + * @return true if queued successfully, false if invalid params + */ + bool queueNoteOff(uint8_t note, uint8_t velocity); + + /** + * @brief Queue a MIDI Control Change message for buffered transmission + * @param cc_number CC number (0-127) + * @param value CC value (0-127) + * @return true if queued successfully, false if invalid params + */ + bool queueCC(uint8_t cc_number, uint8_t value); + + bool queueClock(); + bool queueClockStart(); + bool queueClockStop(); + + unsigned long midiClockTS=0; + unsigned long deltaTMinus1=0, deltaTMinus2=0; + void updateTempoEstimate(); + + + /** + * @brief Flush all queued MIDI messages via DMA + * @return Number of bytes sent, 0 if queue was empty + */ + size_t flushQueue(); + + /** + * @brief Send arbitrary bytes directly (e.g. SysEx). Uses DMA when available. + */ + void sendRawBytes(const uint8_t* data, size_t length); + + /** + * @brief Poll input. Put in a regular loop. + */ + void Poll(); + /** + * @brief Set the CC numbers that the parameters are sent to. + * + * @param cc_numbers Vector of MIDI CC numbers (0-127) to send the parameters to. + * cc.numbers.size() must be equal to n_outputs. + * @note The CC numbers are sent as MIDI messages, so they must be in the range 0-127. + */ + void SetParamCCNumbers(const std::vector &cc_numbers); + /** + * @brief Send the given vector of parameters as MIDI CC messages. + * + * @param params Vector of parameters to send as MIDI CC messages. + * The size of the vector must be equal to n_outputs. + * @note The parameters will be scaled from [0 .. 1] to [0 .. 127]. + */ + void SendParamsAsMIDICC(std::span params); + + /** + * @typedef midi_cc_callback_t + * @brief Function pointer type for MIDI CC callbacks + * + * @param cc_number The MIDI CC number (0-127) + * @param cc_value The value of the MIDI CC message (0-127) + * + * This callback type is used for handling incoming MIDI Control Change messages. + * The function takes two parameters: the CC number and its corresponding value, + * both in the MIDI standard range of 0-127. + */ + using midi_cc_callback_t = std::function; + + /** + * @typedef midi_note_callback_t + * @brief Function pointer type for MIDI note callbacks + * + * @param note_on True for note-on events, false for note-off events + * @param note_number The MIDI note number (0-127) + * @param velocity Note velocity/intensity (0-127) + * + * This callback type is used for handling incoming MIDI note messages. + * The function takes three parameters: a boolean indicating note on/off status, + * the note number, and velocity. Note number and velocity follow the MIDI + * standard range of 0-127. + */ + using midi_note_callback_t = std::function; + + using midi_bpm_callback_t = std::function; + void SetBPMCallback(midi_bpm_callback_t callback) { + bpm_callback_ = callback; + }; + + using midi_transport_callback_t = std::function; + void SetTransportCallback(midi_transport_callback_t callback) { + transport_callback_ = callback; + }; + + + /** + * @brief Set the callback to be called when a MIDI CC message is received. + * + * @param callback Callback that accepts a CC number and value. + */ + void SetCCCallback(midi_cc_callback_t callback); + + /** + * @brief Set the callback to be called when a MIDI note message is received. + * + * @param callback Callback that accepts a note on/off status, note number, and velocity. + */ + void SetNoteCallback(midi_note_callback_t callback); + + /** + * @brief Structure for advanced CC parameter mapping + */ + struct CCMapping { + uint8_t cc_number; + uint8_t channel; + uint8_t min_value; + uint8_t max_value; + float scale_factor; // Precomputed for efficiency: (max - min) + + constexpr CCMapping() : cc_number(0), channel(1), min_value(0), max_value(127), scale_factor(127.0f) {} + constexpr CCMapping(uint8_t cc, uint8_t ch, uint8_t min_val, uint8_t max_val) + : cc_number(cc), channel(ch), min_value(min_val), max_value(max_val), + scale_factor(max_val - min_val) {} + }; + + /** + * @brief Set advanced parameter mappings with individual CC, channel, and range settings + * + * @param mappings Vector of CCMapping structures (must equal n_outputs_ size) + */ + void SetAdvancedParamMappings(const std::vector& mappings); + + /** + * @brief Set mapping for a single parameter + * + * @param index Parameter index + * @param cc_number CC number (0-127) + * @param channel MIDI channel (1-16) + * @param min_value Minimum output value (0-127) + * @param max_value Maximum output value (0-127) + */ + void SetParamMapping(size_t index, uint8_t cc_number, uint8_t channel, uint8_t min_value, uint8_t max_value); + + /** + * @brief Clear advanced mappings and revert to simple mode + */ + void ClearAdvancedMappings(); + + /** + * @brief Enable/disable change tracking optimization + * + * When enabled, only sends CC messages when values change. + * Disable if you need to force send all values every time. + * + * @param enable True to track changes (default), false to always send + */ + void SetChangeTracking(bool enable) { track_changes_ = enable; } + + /** + * @brief Set maximum messages to process per Poll() call + * + * Limits how many incoming MIDI messages are processed per poll, + * preventing message floods from blocking the main loop. + * + * @param max_messages Maximum messages per poll (default: 16, 0 = unlimited) + */ + void SetMaxMessagesPerPoll(uint32_t max_messages) { max_messages_per_poll_ = max_messages; } + + /** + * @brief Set maximum bytes to read from Serial per Poll() call (non-DMA mode) + * + * Limits how many bytes are read from the UART per poll to prevent blocking. + * + * @param max_bytes Maximum bytes per poll (default: 64) + */ + void SetMaxBytesPerPoll(uint32_t max_bytes) { max_bytes_per_poll_ = max_bytes; } + + size_t getParamCount() const { return n_outputs_; } + +protected: + std::vector cc_numbers_; + size_t n_outputs_; + midi_cc_callback_t cc_callback_; + midi_note_callback_t note_callback_; + midi_bpm_callback_t bpm_callback_ = nullptr; + midi_transport_callback_t transport_callback_ = nullptr; + uint8_t send_channel_; // Store the MIDI send channel (1-16) + uint8_t note_channel_; // Store the MIDI note channel (1-16) + bool refresh_uart_; + static MIDIInOut* instance_; // Add static instance pointer + + // Advanced mapping support + std::vector advanced_mappings_; + bool use_advanced_mappings_; + + // Helper for size mismatch warnings + void warnSizeMismatch(const char* function_name, size_t expected, size_t actual) const; + +private: + // Static callback handlers + static void handleControlChange(byte channel, byte number, byte value); + static void handleNoteOn(byte channel, byte note, byte velocity); + static void handleNoteOff(byte channel, byte note, byte velocity); + void RefreshUART_(void); + + // DMA output support + static constexpr size_t DMA_BUFFER_SIZE = 1024; + int tx_dma_channel_; + uint8_t tx_dma_buffer_[DMA_BUFFER_SIZE]; + volatile bool dma_busy_; + uint8_t midi_tx_pin_; + + // DMA input support + static constexpr size_t RX_BUFFER_SIZE = 512; + int rx_dma_channel_; + uint8_t rx_dma_buffer_[RX_BUFFER_SIZE] __attribute__((aligned(RX_BUFFER_SIZE))); + uint32_t rx_read_pos_; + + // MIDI parser state + uint8_t parser_state_; + uint8_t parser_status_; + uint8_t parser_data_[2]; + uint8_t parser_index_; + uint8_t running_status_; + + // Message buffering for rate limiting + struct MIDIMessage { + uint8_t type; + uint8_t channel; + uint8_t data1; + uint8_t data2; + }; + static constexpr size_t MSG_QUEUE_SIZE = 64; + MIDIMessage msg_queue_[MSG_QUEUE_SIZE]; + volatile uint32_t msg_write_pos_; + volatile uint32_t msg_read_pos_; + uint32_t max_messages_per_poll_; + uint32_t max_bytes_per_poll_; + + // Optimization: Track last sent values to skip unchanged CCs + std::vector last_sent_values_; + bool track_changes_; + + bool setupTxDMA(uart_inst_t* uart); + bool setupRxDMA(uart_inst_t* uart); + void sendViaDMA(const uint8_t* data, size_t length); + void sendViaDMADirect(size_t length); // Send buffer directly without memcpy + void waitForDMA(); + + // RX processing + uint32_t getRxWritePos(); + void processRxBuffer(); + void processMidiByte(uint8_t byte); + void queueMessage(uint8_t type, uint8_t channel, uint8_t data1, uint8_t data2); + void processQueuedMessages(); + + // Inline helper for efficient value scaling + inline uint8_t scaleValue(float param, const CCMapping& mapping) const { + float clamped = param > 1.0f ? 1.0f : (param < 0.0f ? 0.0f : param); + return static_cast(clamped * mapping.scale_factor + mapping.min_value + 0.5f); + } + + // Buffered MIDI queue support + static constexpr size_t MIDI_QUEUE_BUFFER_SIZE = 1024; + uint8_t midi_queue_buffer_[MIDI_QUEUE_BUFFER_SIZE]; + size_t queue_write_pos_; // No volatile needed - single-threaded user code only +}; + +#endif // __MIDI_IN_OUT_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SDCard.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SDCard.cpp new file mode 100644 index 0000000..88c0986 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SDCard.cpp @@ -0,0 +1,92 @@ +#include "SDCard.hpp" +#include +#include "SdFat.h" + +SDCard::SDCard(int miso, int mosi, int cs, int sck) + : miso_(miso), mosi_(mosi), cs_(cs), sck_(sck), cardPresent_(false), cardEventCb_(nullptr) { + SPI1.setRX(miso_); + SPI1.setTX(mosi_); + SPI1.setSCK(sck_); + Poll(); +} + +void SDCard::Poll() { + bool newStatus = sd_.begin(cs_); + if (newStatus != cardPresent_) { + cardPresent_ = newStatus; + if (cardEventCb_) { + cardEventCb_(cardPresent_); + } + } +} + +SDCard::CardInfo SDCard::GetCardInfo() { + CardInfo info = {CardType::UNKNOWN, 0, 0, 0, 0, 0, 0}; + if (!cardPresent_) return info; + + FsVolume* volume = sd_.vol(); + if (volume && volume->fatType() != 0) { + info.type = CardType::SD2; + info.blockSize = 512; // Standard for SD cards + info.blocksPerCluster = volume->sectorsPerCluster(); + info.clusterSize = info.blockSize * info.blocksPerCluster; + info.totalBytes = (uint64_t)volume->clusterCount() * info.clusterSize; + info.fatType = volume->fatType(); + + // Calculate used space + uint32_t freeClusters = volume->freeClusterCount(); + if (freeClusters != 0xFFFFFFFF) { + uint64_t freeBytes = (uint64_t)freeClusters * info.clusterSize; + info.usedBytes = info.totalBytes - freeBytes; + } else { + info.usedBytes = info.totalBytes / 2; // Fallback estimate + } + } + return info; +} + +bool SDCard::MKDir(const char* path, bool exist_ok) { + if (!cardPresent_) return false; + if (sd_.exists(path)) { + return exist_ok; + } + return sd_.mkdir(path); +} + +bool SDCard::Write(const char* filename, const std::vector& data) { + if (!cardPresent_) return false; + + FatFile file; + if (!file.open(filename, O_RDWR | O_CREAT | O_TRUNC)) return false; + + size_t written = file.write(data.data(), data.size()); + file.close(); + return written == data.size(); +} + +bool SDCard::Read(const char* filename, std::vector& data, size_t size) { + if (!cardPresent_) return false; + + FatFile file; + if (!file.open(filename, O_READ)) return false; + + size_t fileSize = file.fileSize(); + size_t bytesToRead = (size == 0 || size > fileSize) ? fileSize : size; + + data.resize(bytesToRead); + size_t bytesRead = file.read(data.data(), bytesToRead); + file.close(); + + return bytesRead == bytesToRead; +} + +bool SDCard::Touch(const char* filename) { + if (!cardPresent_) return false; + if (sd_.exists(filename)) return false; + + FatFile file; + if (!file.open(filename, O_RDWR | O_CREAT)) return false; + + file.close(); + return true; +} diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SDCard.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SDCard.hpp new file mode 100644 index 0000000..0951ea9 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SDCard.hpp @@ -0,0 +1,122 @@ +#ifndef __SD_CARD_HPP__ +#define __SD_CARD_HPP__ + + +#include +#include +#include +#include +#include "../hardware/memlnaut/Pins.hpp" +#include "SdFat.h" + + +class SDCard { +public: + using CardEventCallback = std::function; // Callback type for card events (inserted/removed) + + enum class CardType { + UNKNOWN = -1, + SD1 = 0, + SD2 = 1, + SDHC_SDXC = 3 + }; + + struct CardInfo { + CardType type; + uint32_t clusterSize; + uint32_t blocksPerCluster; + uint32_t blockSize; + uint64_t totalBytes; + uint64_t usedBytes; + uint8_t fatType; + }; + + /** + * @brief Constructor initialises the hardware SPI interface + * @param miso MISO pin number + * @param mosi MOSI pin number + * @param cs CS pin number + * @param sck SCK pin number + */ + SDCard(int miso = Pins::SD_MISO, + int mosi = Pins::SD_MOSI, + int cs = Pins::SD_CS, + int sck = Pins::SD_SCK); + + /** + * @brief Set callback for card insertion/removal events + * @param cb Callback function receiving bool (true=inserted, false=removed) + */ + void SetCardEventCallback(CardEventCallback cb) { cardEventCb_ = cb; } + + /** + * @brief Get current card information + * @return CardInfo struct with card details + */ + CardInfo GetCardInfo(); // Remove const + + /** + * @brief Check if card is currently available + * @return true if card is inserted and initialized + */ + bool IsCardPresent() const { return cardPresent_; } + + /** + * @brief Creates directory structure if it doesn't exist + * @param path Directory path to create + * @param exist_ok + * @return true if successful (returns true if file already exists + * and exist_ok is true, + * false if file already exists and exist_ok is false) + */ + bool MKDir(const char* path, bool exist_ok = false); + + /** + * @brief Writes bytes to file path. If file exists, + * data will be overwritten. + * + * @param filename File path to write to + * @param data Data to write + * @return true Write successful + * @return false Write unsuccessful + */ + bool Write(const char* filename, const std::vector &data); + /** + * @brief Reads bytes from file path. If file does not exist, + * data will be empty and false is returned. + * + * @param filename File path to read from + * @param data Data to read + * @param size Size of data to read + * @return true Read successful + * @return false Read unsuccessful + */ + bool Read(const char* filename, std::vector &data, size_t size = 0); + /** + * @brief Creates empty file if file does not exist. Also recursively + * creates directories in the path if they do not exist. + * + * @param filename File path to create + * @return true File created successfully + * @return false File already exists or creation failed + */ + bool Touch(const char* filename); + + /** + * @brief Check card status and trigger callbacks if changed + * Should be called periodically from main Arduino loop + */ + void Poll(); + +private: + const int miso_; + const int mosi_; + const int cs_; + const int sck_; + bool cardPresent_; + CardEventCallback cardEventCb_; + mutable SdFs sd_; // Make sd_ mutable to allow vol() calls in const methods + FatFile root_; +}; + +#endif // __SD_CARD_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SerialUSBInput.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SerialUSBInput.cpp new file mode 100644 index 0000000..a6437da --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SerialUSBInput.cpp @@ -0,0 +1,156 @@ +#include "SerialUSBInput.hpp" +#include "../utils/SLIP.hpp" + +#include "SerialUSBOutput.hpp" + +SerialUSBOutput usbSerialOut; + +SerialUSBInput::SerialUSBInput(size_t n_inputs, std::shared_ptr dispptr, size_t baud_rate) : + slipBuffer{ 0 }, + value_states_(n_inputs, 0), + spiState(SPISTATES::WAITFOREND), + spiIdx(0), + callback_(nullptr), + refresh_uart_(false), + n_inputs_(n_inputs), + baud_rate_(baud_rate) +{ + disp = dispptr; + + //assume Serial has already begun() +} + +float bytes2float_union(const uint8_t* bytes) { + union { + uint32_t i; + float f; + } converter; + + converter.i = bytes[0] | + (bytes[1] << 8) | + (bytes[2] << 16) | + (bytes[3] << 24); + + return converter.f; +} + +void SerialUSBInput::Poll() +{ + if (!refresh_uart_) { + // What baud rate is the UART running at? + // Print debug info about PIO Serial state + DEBUG_PRINT("PIO Serial Status - Initialized: "); + DEBUG_PRINT(Serial ? "Yes" : "No"); + DEBUG_PRINT(", Target Baud Rate: "); + DEBUG_PRINTLN(baud_rate_); + // Start at current baud rate + Serial1.begin(baud_rate_); + DEBUG_PRINTLN("PIO_UART refreshed."); + DEBUG_PRINT("Serial available: "); + DEBUG_PRINTLN(Serial.available()); + refresh_uart_ = true; + } + + while (true) { + int raw = Serial.read(); + if (raw < 0) break; // no more data + uint8_t spiByte = static_cast(raw); + + switch(spiState) { + case SPISTATES::WAITFOREND: + if (spiByte == SLIP::END) { + slipBuffer[0] = SLIP::END; + spiState = SPISTATES::READBYTES; + } + break; + + // case SPISTATES::ENDORBYTES: + // if (spiByte == SLIP::END) { + // spiIdx = 1; + // } else { + // slipBuffer[1] = spiByte; + // spiIdx = 2; + // } + // spiState = SPISTATES::READBYTES; + // break; + + case SPISTATES::READBYTES: + if (spiIdx < static_cast(kSlipBufferSize_)) { + slipBuffer[spiIdx++] = spiByte; + + if (spiByte == SLIP::END) { + // Safe decode into fixed buffer + //disp->post("Received packet"); + size_t maxOut = n_inputs_ * sizeof(float); + uint8_t outBuf[maxOut] = {0}; + size_t got = SLIP::decode(slipBuffer, spiIdx, outBuf, maxOut); + if (got == maxOut) { + //disp->post("Decoded packet successfully"); + //float f = bytes2float_union(outBuf); + //disp->post("Value: " + String(f, 8)); + + for (size_t n = 0; n < n_inputs_; n++) { + // Convert each 4-byte float in the buffer + float f = bytes2float_union(&outBuf[n * sizeof(float)]); + value_states_[n] = f; // Store the value + //if (n == 0) disp->post("USBIn0: "+ String(f, 8)); + } + callback_(value_states_); + + // std::vector values(1); + // values[0] = f * 2.0f; + // usbSerialOut.SendFloatArray(values); + //disp->post("Sent value back: " + String(f, 8)); + // spiMessage msg; + // memcpy(&msg, outBuf, maxOut); + // Parse_(msg); + }else{ + disp->post("Invalid packet: " + String(got)); + } + // Reset for next packet + spiState = SPISTATES::WAITFOREND; + spiIdx = 0; + } + } else { + DEBUG_PRINTLN("UARTInput: SLIP buffer overrun, dropping packet"); + spiState = SPISTATES::WAITFOREND; + spiIdx = 0; + } + break; + } + } +} + +// void UARTInput::Parse_(spiMessage msg) +// { +// static const float kEventThresh = 0.01; + +// // Find if this message's index is in our tracked indexes +// auto it = std::find(sensor_indexes_.begin(), sensor_indexes_.end(), msg.msg); +// if (it != sensor_indexes_.end()) { +// size_t index = std::distance(sensor_indexes_.begin(), it); + +// // Protect against infs and nans +// if (std::isnan(msg.value) || std::isinf(msg.value)) { +// msg.value = value_states_[index]; +// } + +// float filtered_value = filters_[index].process(msg.value); +// float prev_value = value_states_[index]; + +// // Trigger callback whenever any value has changed +// if (std::abs(filtered_value - prev_value) > kEventThresh) { +// if (callback_) callback_(msg.msg, filtered_value); +// } + +// // Print the value (Arduino scope) if it's the observed channel +// if (kObservedChan == msg.msg) { +// DEBUG_PRINT("Low:0.00,High:1.00,Value:"); +// DEBUG_PRINT(msg.value, 8); +// DEBUG_PRINT(",FilteredValue:"); +// DEBUG_PRINTLN(filtered_value, 8); +// } + +// value_states_[index] = filtered_value; +// } +// } diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SerialUSBInput.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SerialUSBInput.hpp new file mode 100644 index 0000000..1456466 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SerialUSBInput.hpp @@ -0,0 +1,80 @@ +#ifndef __UART_INPUT_HPP__ +#define __UART_INPUT_HPP__ + +#include +#include "../utils/MedianFilter.h" +#include "../hardware/memlnaut/Pins.hpp" +#include +#include +#include "../hardware/memlnaut/display.hpp" // Added include + + +#include + +class SerialUSBInput // Forward declaration for SerialUSBInput +{ + +public: + // Maximum allowed channels (avoid unbounded resizes) + static constexpr size_t kMaxChannels = 8; + + // Change to trigger debugging of single channel + static constexpr size_t kObservedChan = 9999; + + using usb_uart_in_callback_t = std::function)>; + /** + * @brief Construct a new UARTInput object for communication + * with the MEML Sensor Board. + * + * @param sensor_indexes Vector of indexes to read (maximum 8, numbers 0-7). + * @param sensor_rx RX pin the Sensor Board is connected to (default: Pins::SENSOR_RX). + * @param sensor_tx TX pin the Sensor Board is connected to (default: Pins::SENSOR_TX). + */ + SerialUSBInput(size_t n_inputs, std::shared_ptr disp, size_t baud_rate = 115200); + /** + * @brief Poll input. Put in a regular loop. + */ + void Poll(); + /** + * @brief Set the callback to be called when sensor data changes. + * + * @param callback Callback that accepts a vector of sensor readings. + */ + inline void SetCallback(usb_uart_in_callback_t callback) + { + callback_ = callback; + } + +protected: + static const size_t kSlipBufferSize_ = 512; + std::vector sensor_indexes_; + uint8_t slipBuffer[kSlipBufferSize_]; + + // std::vector> filters_; + std::vector value_states_; + usb_uart_in_callback_t callback_ = nullptr; + bool refresh_uart_; + size_t baud_rate_; + + struct spiMessage + { + uint8_t msg; + float value; + }; + enum SPISTATES + { + WAITFOREND, + ENDORBYTES, + READBYTES + }; + SPISTATES spiState; + int spiIdx; + + void Parse_(spiMessage msg); + +private: + std::shared_ptr disp; + size_t n_inputs_; +}; + +#endif // __UART_INPUT_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SerialUSBOutput.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SerialUSBOutput.cpp new file mode 100644 index 0000000..8faca2d --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SerialUSBOutput.cpp @@ -0,0 +1,47 @@ +#include "SerialUSBOutput.hpp" + +SerialUSBOutput::SerialUSBOutput() +{ + //assume Serial has already begun() + +} + +void SerialUSBOutput::SendFloatArray(const std::vector ¶ms) +{ + Serial.write(SLIP_END); + // Encode each float (4 bytes) via SLIP + for(const auto& f : params) + { + union { + float f; + uint8_t b[4]; + } data; + data.f = f; + + for(int i = 0; i < 4; i++) + { + slipSendByte(data.b[i]); + } + } + + // Finally, write the SLIP_END marker + Serial.write(SLIP_END); +} + +void SerialUSBOutput::slipSendByte(uint8_t b) +{ + if(b == SLIP_END) + { + Serial.write(SLIP_ESC); + Serial.write(SLIP_ESC_END); + } + else if(b == SLIP_ESC) + { + Serial.write(SLIP_ESC); + Serial.write(SLIP_ESC_ESC); + } + else + { + Serial.write(b); + } +} diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SerialUSBOutput.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SerialUSBOutput.hpp new file mode 100644 index 0000000..d8bf65d --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SerialUSBOutput.hpp @@ -0,0 +1,46 @@ +#ifndef __SERIALUSBUART_OUTPUT_HPP__ +#define __SERIALUSBUART_OUTPUT_HPP__ + +#include +#include +#include "../hardware/memlnaut/Pins.hpp" +#include + + +/** + * @brief Sends float data to an external device using + * SLIP encoding over a PIO-based + * "software" UART on a single GPIO pin (txPin). + */ +class SerialUSBOutput +{ +public: + /** + * @param txPin The GPIO pin on the Raspberry Pi Pico to use for TX. + * Must be a valid pin for PIO-based UART. + * For example, "16" for GP16. + */ + SerialUSBOutput(); + + /** + * @brief SLIP-encodes the float vector and sends it as one packet. + * @param params Vector of floats to send. + */ + void SendFloatArray(const std::vector ¶ms); + +private: + /** + * @brief Helper to apply SLIP-escaping on a single byte. + */ + void slipSendByte(uint8_t b); + + // SLIP special characters + static constexpr uint8_t SLIP_END = 0xC0; ///< End of SLIP packet + static constexpr uint8_t SLIP_ESC = 0xDB; ///< Escape character + static constexpr uint8_t SLIP_ESC_END = 0xDC; ///< Escaped END + static constexpr uint8_t SLIP_ESC_ESC = 0xDD; ///< Escaped ESC +}; + + +#endif // __UART_OUTPUT_HPP__ + diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SynthParamOutput.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SynthParamOutput.hpp new file mode 100644 index 0000000..722f6cb --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/SynthParamOutput.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include "MIDIInOut.hpp" +#include +#include + +// Abstract base for synth-specific parameter output drivers. +// Subclass this to implement SysEx (or other) output for a specific synthesizer. +// Wire an instance into InterfaceBase::paramOutputHook in the mode's setupMIDI(). +class SynthParamOutput { +public: + virtual void sendParams(std::span params) = 0; + virtual ~SynthParamOutput() = default; + +protected: + SynthParamOutput(std::shared_ptr midi) : midi_(midi) {} + std::shared_ptr midi_; +}; diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/UARTInput.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/UARTInput.cpp new file mode 100644 index 0000000..4575b72 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/UARTInput.cpp @@ -0,0 +1,198 @@ +#include "UARTInput.hpp" +#include "../utils/SLIP.hpp" +#include "../utils/Maths.hpp" + + +UARTInput::UARTInput(const std::vector& sensor_indexes, + size_t sensor_rx, + size_t sensor_tx, + size_t baud_rate) : + sensor_indexes_(sensor_indexes), + sensor_rx_(sensor_rx), + sensor_tx_(sensor_tx), + slipBuffer{ 0 }, + filters_(), + value_states_{ 0 }, + spiState(SPISTATES::WAITFOREND), + spiIdx(0), + callback_(nullptr), + refresh_uart_(false), + baud_rate_(baud_rate) +{ + // Reserve once to avoid heap fragmentation at runtime + filters_.reserve(kMaxChannels); + value_states_.reserve(kMaxChannels); + filters_.resize(kMaxChannels); + value_states_.resize(kMaxChannels, 0.5f); + + Serial1.setTX(sensor_tx); + Serial1.setRX(sensor_rx); + Serial1.begin(baud_rate); +} + +void UARTInput::ListenToSensorIndexes(const std::vector& indexes) +{ + sensor_indexes_ = indexes; + + // Reserve to avoid repeated reallocs + filters_.reserve(indexes.size()); + value_states_.reserve(indexes.size()); + + filters_.clear(); + filters_.resize(indexes.size()); + value_states_.clear(); + value_states_.resize(indexes.size(), 0.5f); +} + +void UARTInput::Poll() +{ + if (!refresh_uart_) { + // What baud rate is the UART running at? + // Print debug info about PIO Serial state + DEBUG_PRINT("PIO Serial Status - Initialized: "); + DEBUG_PRINT(Serial1 ? "Yes" : "No"); + DEBUG_PRINT(", Target Baud Rate: "); + DEBUG_PRINTLN(baud_rate_); + // Re-apply pin config before begin() — calling begin() without setTX/setRX + // would reset Serial1 to default pins, discarding the constructor's setup. + Serial1.setTX(sensor_tx_); + Serial1.setRX(sensor_rx_); + Serial1.begin(baud_rate_); + DEBUG_PRINTLN("PIO_UART refreshed."); + DEBUG_PRINT("Serial available: "); + DEBUG_PRINTLN(Serial1.available()); + refresh_uart_ = true; + } + + while (true) { + int raw = Serial1.read(); + if (raw < 0) break; // no more data + uint8_t spiByte = static_cast(raw); + //DEBUG_PRINTF("%02X ", spiByte); + + switch(spiState) { + case SPISTATES::WAITFOREND: + if (spiByte == SLIP::END) { + slipBuffer[0] = SLIP::END; + spiState = SPISTATES::ENDORBYTES; + } + break; + + case SPISTATES::ENDORBYTES: + if (spiByte == SLIP::END) { + spiIdx = 1; + } else { + slipBuffer[1] = spiByte; + spiIdx = 2; + } + spiState = SPISTATES::READBYTES; + break; + + case SPISTATES::READBYTES: + if (spiIdx < static_cast(kSlipBufferSize_)) { + slipBuffer[spiIdx++] = spiByte; + + if (spiByte == SLIP::END) { + //DEBUG_PRINTLN(); // Newline after hex bytes + // Safe decode into fixed buffer + //uint8_t outBuf[sizeof(spiMessage)] = {0}; + //size_t maxOut = sizeof(spiMessage); + //size_t got = SLIP::decode(slipBuffer, spiIdx, outBuf, maxOut); + float outBuf[kMaxChannels] = {0}; + size_t maxOut = sizeof(outBuf); + size_t got = SLIP::decode(slipBuffer, spiIdx, + reinterpret_cast(outBuf), maxOut); + // DEBUG_PRINTF("Got %zu bytes\n", got); + { + //spiMessage msg; + //memcpy(&msg, outBuf, maxOut); + //Parse_(msg); + ParseBuf_(outBuf, got >> 2); + } + // Reset for next packet + spiState = SPISTATES::WAITFOREND; + spiIdx = 0; + } + } else { + DEBUG_PRINTLN("UARTInput: SLIP buffer overrun, dropping packet"); + spiState = SPISTATES::WAITFOREND; + spiIdx = 0; + } + break; + } + } +} + +// void UARTInput::Parse_(spiMessage msg) +// { +// static const float kEventThresh = 0.001; + +// DEBUG_PRINTLN(String("-- Chan ") + msg.msg + String(" Value ") + msg.value); + +// // Find if this message's index is in our tracked indexes +// auto index = where(sensor_indexes_, msg.msg); +// if (index >= 0) { +// // Protect against infs and nans +// if (std::isnan(msg.value) || std::isinf(msg.value)) { +// msg.value = value_states_[index]; +// } + +// float filtered_value = filters_[index].process(msg.value); +// float prev_value = value_states_[index]; + +// // Trigger callback whenever any value has changed +// if (std::abs(filtered_value - prev_value) > kEventThresh) { +// if (callback_) callback_(msg.msg, filtered_value); +// } + +// // Print the value (Arduino scope) if it's the observed channel +// if (kObservedChan == msg.msg) { +// DEBUG_PRINT("Low:0.00,High:1.00,Value:"); +// DEBUG_PRINT(msg.value, 8); +// DEBUG_PRINT(",FilteredValue:"); +// DEBUG_PRINTLN(filtered_value, 8); +// } + +// value_states_[index] = filtered_value; +// } +// } + +void UARTInput::ParseBuf_(float* buf, size_t len) +{ + static const float kEventThresh = 0.01f; + bool changed = false; + + for (size_t i = 0; i < len; i++) { + //size_t chan = sensor_indexes_[i]; + //if (chan < kMaxChannels) { + if (i < kMaxChannels) { + float raw_value = buf[i]; + + // Protect against infs and nans + if (std::isnan(raw_value) || std::isinf(raw_value)) { + raw_value = value_states_[i]; + } + if (callback_) { + callback_(i, raw_value); + } + + // float filtered_value = filters_[i].process(raw_value); + // float prev_value = value_states_[i]; + + // Trigger callback whenever any value has changed + // if (std::abs(filtered_value - prev_value) > kEventThresh) { + // changed = true; + // Serial.println("UART input: " + String(i) + " value: " + String(filtered_value)); + // } + + // // Print the value (Arduino scope) if it's the observed channel + // if (kObservedChan == i) { + // DEBUG_PRINT("Low:0.00,High:1.00,Value:"); + // DEBUG_PRINT(raw_value, 8); + // DEBUG_PRINT(",FilteredValue:"); + // DEBUG_PRINTLN(filtered_value, 8); + // } + value_states_[i] = raw_value; + } + } +} \ No newline at end of file diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/UARTInput.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/UARTInput.hpp new file mode 100644 index 0000000..d83a850 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/UARTInput.hpp @@ -0,0 +1,88 @@ +#ifndef __UART_INPUT_HPP__ +#define __UART_INPUT_HPP__ + +#include +#include "../utils/MedianFilter.h" +#include "../hardware/memlnaut/Pins.hpp" +#include +#include + +#include + +class UARTInput +{ + +public: + // Maximum allowed channels (avoid unbounded resizes) + static constexpr size_t kMaxChannels = 8; + + // Change to trigger debugging of single channel + static constexpr size_t kObservedChan = 9999; + + using uart_in_callback_t = std::function; + /** + * @brief Construct a new UARTInput object for communication + * with the MEML Sensor Board. + * + * @param sensor_indexes Vector of indexes to read (maximum 8, numbers 0-7). + * @param sensor_rx RX pin the Sensor Board is connected to (default: Pins::SENSOR_RX). + * @param sensor_tx TX pin the Sensor Board is connected to (default: Pins::SENSOR_TX). + */ + UARTInput(const std::vector &sensor_indexes, + size_t sensor_rx = Pins::SENSOR_RX, + size_t sensor_tx = Pins::SENSOR_TX, + size_t baud_rate = 115200); + /** + * @brief Poll input. Put in a regular loop. + */ + void Poll(); + /** + * @brief Set the callback to be called when sensor data changes. + * + * @param callback Callback that accepts a vector of sensor readings. + */ + inline void SetCallback(uart_in_callback_t callback) + { + callback_ = callback; + } + /** + * @brief Change the sensor indexes to listen to. + * + * @param indexes Vector of indexes to read (maximum 8, numbers 0-7). + */ + void ListenToSensorIndexes(const std::vector &indexes); + +protected: + static const size_t kSlipBufferSize_ = 128; + std::vector sensor_indexes_; + size_t sensor_rx_; + size_t sensor_tx_; + uint8_t slipBuffer[kSlipBufferSize_]; + std::vector> filters_; + std::vector value_states_; + uart_in_callback_t callback_ = nullptr; + bool refresh_uart_; + size_t baud_rate_; + + struct spiMessage + { + uint8_t msg; + float value; + }; + enum SPISTATES + { + WAITFOREND, + ENDORBYTES, + READBYTES + }; + SPISTATES spiState; + int spiIdx; + + // void Parse_(spiMessage msg); + void ParseBuf_(float* buf, size_t len = kMaxChannels); + +private: + //SerialPIO pioSerial_; +}; + +#endif // __UART_INPUT_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/UARTOutput.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/UARTOutput.cpp new file mode 100644 index 0000000..0b4636c --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/UARTOutput.cpp @@ -0,0 +1,47 @@ +#include "UARTOutput.hpp" + +UARTOutput::UARTOutput(int txPin) + : pioSerial_(txPin, NOPIN) // TX only, no RX pin +{ + // Start the PIO-based serial port at 115200 baud + pioSerial_.begin(115200); +} + +void UARTOutput::SendParams(const std::vector ¶ms) +{ + // Encode each float (4 bytes) via SLIP + for(const auto& f : params) + { + union { + float f; + uint8_t b[4]; + } data; + data.f = f; + + for(int i = 0; i < 4; i++) + { + slipSendByte(data.b[i]); + } + } + + // Finally, write the SLIP_END marker + pioSerial_.write(SLIP_END); +} + +void UARTOutput::slipSendByte(uint8_t b) +{ + if(b == SLIP_END) + { + pioSerial_.write(SLIP_ESC); + pioSerial_.write(SLIP_ESC_END); + } + else if(b == SLIP_ESC) + { + pioSerial_.write(SLIP_ESC); + pioSerial_.write(SLIP_ESC_ESC); + } + else + { + pioSerial_.write(b); + } +} diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/UARTOutput.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/UARTOutput.hpp new file mode 100644 index 0000000..54f424e --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/UARTOutput.hpp @@ -0,0 +1,49 @@ +#ifndef __UART_OUTPUT_HPP__ +#define __UART_OUTPUT_HPP__ + +#include +#include +#include "../hardware/memlnaut/Pins.hpp" +#include + + +/** + * @brief Sends float data to an external device using + * SLIP encoding over a PIO-based + * "software" UART on a single GPIO pin (txPin). + */ +class UARTOutput +{ +public: + /** + * @param txPin The GPIO pin on the Raspberry Pi Pico to use for TX. + * Must be a valid pin for PIO-based UART. + * For example, "16" for GP16. + */ + UARTOutput(int txPin = Pins::DAISY_TX); + + /** + * @brief SLIP-encodes the float vector and sends it as one packet. + * @param params Vector of floats to send to the external board. + */ + void SendParams(const std::vector ¶ms); + +private: + /** + * @brief Helper to apply SLIP-escaping on a single byte. + */ + void slipSendByte(uint8_t b); + + // PIO-based Serial + SerialPIO pioSerial_; + + // SLIP special characters + static constexpr uint8_t SLIP_END = 0xC0; ///< End of SLIP packet + static constexpr uint8_t SLIP_ESC = 0xDB; ///< Escape character + static constexpr uint8_t SLIP_ESC_END = 0xDC; ///< Escaped END + static constexpr uint8_t SLIP_ESC_ESC = 0xDD; ///< Escaped ESC +}; + + +#endif // __UART_OUTPUT_HPP__ + diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/USeqI2C.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/USeqI2C.cpp new file mode 100644 index 0000000..5cb92fc --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/USeqI2C.cpp @@ -0,0 +1,105 @@ +/** + * @file USeqI2C.cpp + * @brief USeq I2C interface implementation + * + * @copyright Copyright (c) 2024. This Source Code Form is subject to the terms + * of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed + * with this file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "USeqI2C.hpp" + +USeqI2C::USeqI2C(uint8_t slave_address) + : slave_address_(slave_address), initialized_(false) { + // Initialize send buffer to zeros + memset(send_buffer_, 0, sizeof(send_buffer_)); +} + +USeqI2C::~USeqI2C() { + if (initialized_) { + Wire1.end(); + } +} + +bool USeqI2C::begin(uint8_t sda_pin, uint8_t scl_pin, uint32_t frequency) { + if (initialized_) { + Wire1.end(); + } + + // Initialize Wire1 with specified pins (matching reference pattern exactly) + Wire1.setSDA(sda_pin); + Wire1.setSCL(scl_pin); + Wire1.begin(); + Wire1.setTimeout(2); // 2 ms timeout to avoid blocking core 0 on unresponsive device + delay(10); // Match reference implementation delay + + // Only set clock if frequency is different from default + // if (frequency != 100000) { + Wire1.setClock(frequency); + // } + + initialized_ = true; + + DEBUG_PRINT("USeqI2C initialized - SDA: "); + DEBUG_PRINT(sda_pin); + DEBUG_PRINT(", SCL: "); + DEBUG_PRINT(scl_pin); + DEBUG_PRINT(", Frequency: "); + DEBUG_PRINT(frequency); + DEBUG_PRINT(" Hz, Slave Address: "); + DEBUG_PRINTLN(slave_address_); + + return true; +} + +bool USeqI2C::sendValues(const std::vector& values) { + if (!initialized_) { + return false; + } + + if (values.empty()) { + return false; + } + + size_t count = values.size(); + if (count > kMaxValues) { + count = kMaxValues; + } + + // Copy values to internal buffer + for (size_t i = 0; i < count; i++) { + send_buffer_[i] = values[i]; + } + + return transmit_(send_buffer_, count * sizeof(float)); +} + +bool USeqI2C::sendValues(const float* values, size_t count) { + if (!initialized_) { + return false; + } + + if (values == nullptr || count == 0) { + return false; + } + + if (count > kMaxValues) { + count = kMaxValues; + } + + // Copy values to internal buffer + memcpy(send_buffer_, values, count * sizeof(float)); + + return transmit_(send_buffer_, count * sizeof(float)); +} + +bool USeqI2C::transmit_(const void* data, size_t size) { + // Serial.printf("Transmitting %d bytes to I2C slave 0x%02X\n", size, slave_address_); + + Wire1.beginTransmission(slave_address_); + size_t written = Wire1.write(static_cast(data), size); + int result = Wire1.endTransmission(true); + + + return (result == 0 && written == size); +} diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/USeqI2C.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/USeqI2C.hpp new file mode 100644 index 0000000..aa84f8d --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/interface/USeqI2C.hpp @@ -0,0 +1,105 @@ +/** + * @file USeqI2C.hpp + * @brief USeq I2C interface for sending CV data + * + * @copyright Copyright (c) 2024. This Source Code Form is subject to the terms + * of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed + * with this file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#ifndef __USEQ_I2C_HPP__ +#define __USEQ_I2C_HPP__ + +#include +#include +#include +#include "../hardware/memlnaut/Pins.hpp" + +/** + * @brief USeq I2C interface class for sending CV data + * + * This class manages I2C communication using Wire1 interface to send + * float arrays for CV output. Designed to work with euclidean rhythm + * generators and other musical applications. + */ +class USeqI2C { +public: + /** + * @brief Default I2C slave address for USeq device + */ + static constexpr uint8_t kDefaultSlaveAddress = 1; + + /** + * @brief Maximum number of values that can be sent in one transmission + */ + static constexpr size_t kMaxValues = 8; + + /** + * @brief Constructor + * @param slave_address I2C slave address (default: 1) + */ + explicit USeqI2C(uint8_t slave_address = kDefaultSlaveAddress); + + /** + * @brief Destructor + */ + ~USeqI2C(); + + /** + * @brief Initialize the I2C interface + * @param sda_pin SDA pin number (default: USEQ_SDA from Pins.hpp) + * @param scl_pin SCL pin number (default: USEQ_SCL from Pins.hpp) + * @param frequency I2C frequency in Hz (default: 100000) + * @return true if initialization successful, false otherwise + */ + bool begin(uint8_t sda_pin = Pins::USEQ_SDA, uint8_t scl_pin = Pins::USEQ_SCL, uint32_t frequency = 1000000); + + /** + * @brief Send a vector of float values via I2C + * @param values Vector of float values to send + * @return true if transmission successful, false otherwise + */ + bool sendValues(const std::vector& values); + + /** + * @brief Send an array of float values via I2C + * @param values Pointer to float array + * @param count Number of values to send + * @return true if transmission successful, false otherwise + */ + bool sendValues(const float* values, size_t count); + + /** + * @brief Check if I2C interface is initialized + * @return true if initialized, false otherwise + */ + bool isInitialized() const { return initialized_; } + + /** + * @brief Get the current slave address + * @return Current I2C slave address + */ + uint8_t getSlaveAddress() const { return slave_address_; } + + /** + * @brief Set a new slave address + * @param slave_address New I2C slave address + */ + void setSlaveAddress(uint8_t slave_address) { slave_address_ = slave_address; } + +private: + uint8_t slave_address_; ///< I2C slave address + bool initialized_; ///< Initialization status + float send_buffer_[kMaxValues]; ///< Internal buffer for sending data + float read_buffer_[kMaxValues]; ///< Internal buffer for sending data + + /** + * @brief Internal function to perform I2C transmission + * @param data Pointer to data to send + * @param size Size of data in bytes + * @return true if transmission successful, false otherwise + */ + bool transmit_(const void* data, size_t size); +}; + +#endif // __USEQ_I2C_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/ADSRLite.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/ADSRLite.hpp new file mode 100644 index 0000000..c210006 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/ADSRLite.hpp @@ -0,0 +1,6 @@ +#ifndef MEMLLIB_SYNTH_ADSRLITE_HPP +#define MEMLLIB_SYNTH_ADSRLITE_HPP + + + +#endif // MEMLLIB_SYNTH_ADSRLITE_HPP \ No newline at end of file diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/DynamicSliceSelector.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/DynamicSliceSelector.hpp new file mode 100644 index 0000000..44faeea --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/DynamicSliceSelector.hpp @@ -0,0 +1,466 @@ +#pragma once + +#include +#include +#include +#include +#include +#include "pico/critical_section.h" +#include "pico/time.h" + +class DynamicSliceSelector { +public: + static constexpr int kN_Params = 4; + static constexpr int kMaxSlices = 64; // Maximum number of slices + static constexpr int kGridResolution = 16; // 16th note grid + static constexpr int kPhraseLength = 16; // 16-beat phrase structure + + struct SlicePoint { + uint32_t start_sample; + uint32_t length_samples; + bool active; + float probability; + }; + + struct DrumLoop { + const float* samples; + uint32_t length_samples; + uint32_t sample_rate; + }; + +private: + // Parameters (0-1 range) + float slice_probability_; // Overall probability of slicing + float clustering_factor_; // How much slices cluster together + float phrase_awareness_; // How much to respect phrase structure + float grid_tightness_; // How strictly to follow the grid + + // Thread-safe double buffer for slice points + std::array slice_points_a_; + std::array slice_points_b_; + const std::array* active_slices_; + std::array* update_slices_; + + // Playback state (accessed in ISR) + uint32_t playback_position_; // Current position in drum loop + uint32_t current_slice_idx_; // Current slice being played + uint32_t slice_start_position_; // Where current slice started + uint32_t slice_end_position_; // Where current slice ends + bool slice_transition_pending_; // Flag for slice boundary crossing + + // Thread synchronization + critical_section_t cs_; + volatile bool update_pending_; // Flag that new slices are ready + volatile int active_num_slices_; // Thread-safe copy of slice count + + // Crossfade state for smooth transitions + static constexpr int kCrossfadeSamples = 64; // Short crossfade for glitch-free transitions + float crossfade_buffer_[kCrossfadeSamples]; + int crossfade_position_; + bool crossfading_; + + // Loop management + uint32_t loop_start_time_; // For tempo-sync if needed + bool loop_active_; + + DrumLoop drum_loop_; + + // Phrase awareness weights (higher = more likely to slice) + static constexpr std::array phrase_weights_ = { + 1.0f, 0.6f, 0.8f, 0.6f, // Beat 1: strong, off-beats weaker + 0.9f, 0.5f, 0.7f, 0.5f, // Beat 2: backbeat emphasis + 0.8f, 0.6f, 0.9f, 0.6f, // Beat 3: syncopation + 1.0f, 0.7f, 0.8f, 0.9f // Beat 4: build to next phrase + }; + + // Simple PRNG for deterministic behavior + uint32_t rng_state_; + + float FastRandom() { + rng_state_ = rng_state_ * 1664525u + 1013904223u; + return (rng_state_ & 0x00FFFFFF) / float(0x01000000); + } + + // Fast approximation of exponential function for clustering + float FastExp(float x) { + if (x < -5.0f) return 0.0f; + if (x > 5.0f) return 1.0f; + + // Taylor series approximation for small x + float x2 = x * x; + return 1.0f + x + 0.5f * x2 + 0.166667f * x2 * x; + } + + float CalculateClusteringWeight(int grid_pos, int last_slice_pos) { + if (last_slice_pos == -1) return 1.0f; + + float distance = abs(grid_pos - last_slice_pos); + float cluster_strength = clustering_factor_ * 4.0f - 2.0f; // Map to [-2, 2] + + // Exponential decay/growth based on distance + float weight = FastExp(-cluster_strength * distance * 0.25f); + + // Clamp to reasonable range + return std::max(0.1f, std::min(2.0f, weight)); + } + + float CalculatePhraseWeight(int grid_pos) { + int phrase_pos = grid_pos % kPhraseLength; + float base_weight = phrase_weights_[phrase_pos]; + + // Blend with uniform distribution based on phrase_awareness + return base_weight * phrase_awareness_ + (1.0f - phrase_awareness_); + } + + void UpdatePlaybackState() { + // Check if we need to handle slice updates (called from ISR) + if (update_pending_) { + // Find current slice based on new slice configuration + bool found_current_slice = false; + + for (int i = 0; i < active_num_slices_; ++i) { + if ((*active_slices_)[i].active) { + uint32_t slice_start = (*active_slices_)[i].start_sample; + uint32_t slice_end = slice_start + (*active_slices_)[i].length_samples; + + // Check if current playback position falls within this slice + if (playback_position_ >= slice_start && playback_position_ < slice_end) { + // Only update if we're actually changing slices + if (current_slice_idx_ != i) { + current_slice_idx_ = i; + slice_start_position_ = slice_start; + slice_end_position_ = slice_end; + + // Start crossfade if we're mid-playback + if (playback_position_ > slice_start + kCrossfadeSamples) { + crossfading_ = true; + crossfade_position_ = 0; + } + } + found_current_slice = true; + break; + } + } + } + + // If no slice found, default to first slice + if (!found_current_slice && active_num_slices_ > 0) { + current_slice_idx_ = 0; + slice_start_position_ = (*active_slices_)[0].start_sample; + slice_end_position_ = slice_start_position_ + (*active_slices_)[0].length_samples; + playback_position_ = slice_start_position_; + } + + update_pending_ = false; + } + } + + float GetCrossfadedSample(uint32_t pos_a, uint32_t pos_b, float mix) { + float sample_a = (pos_a < drum_loop_.length_samples) ? drum_loop_.samples[pos_a] : 0.0f; + float sample_b = (pos_b < drum_loop_.length_samples) ? drum_loop_.samples[pos_b] : 0.0f; + + return sample_a * (1.0f - mix) + sample_b * mix; + } + + void GenerateSlicePoints() { + // Work on the update buffer + auto& slice_points = *update_slices_; + int num_slices = 0; + + if (drum_loop_.samples == nullptr || drum_loop_.length_samples == 0) { + return; + } + + // Calculate samples per grid position + float samples_per_grid = drum_loop_.length_samples / float(kGridResolution); + + int last_slice_pos = -1; + + // Evaluate each grid position + for (int grid_pos = 0; grid_pos < kGridResolution && num_slices < kMaxSlices - 1; ++grid_pos) { + // Calculate base probability factors + float clustering_weight = CalculateClusteringWeight(grid_pos, last_slice_pos); + float phrase_weight = CalculatePhraseWeight(grid_pos); + + // Combined probability + float final_probability = slice_probability_ * clustering_weight * phrase_weight; + + // Clamp probability + final_probability = std::max(0.0f, std::min(1.0f, final_probability)); + + // Probabilistic decision + if (FastRandom() < final_probability) { + // Calculate slice start position with optional grid looseness + float base_sample = grid_pos * samples_per_grid; + float jitter = (FastRandom() - 0.5f) * samples_per_grid * 0.1f * (1.0f - grid_tightness_); + + uint32_t start_sample = uint32_t(std::max(0.0f, base_sample + jitter)); + + // Ensure we don't exceed bounds + if (start_sample < drum_loop_.length_samples) { + slice_points[num_slices].start_sample = start_sample; + slice_points[num_slices].active = true; + slice_points[num_slices].probability = final_probability; + + last_slice_pos = grid_pos; + num_slices++; + } + } + } + + // Always ensure we have at least one slice at the beginning + if (num_slices == 0) { + slice_points[0].start_sample = 0; + slice_points[0].active = true; + slice_points[0].probability = 1.0f; + num_slices = 1; + } + + // Calculate slice lengths + for (int i = 0; i < num_slices; ++i) { + uint32_t next_start = (i + 1 < num_slices) ? + slice_points[i + 1].start_sample : + drum_loop_.length_samples; + + slice_points[i].length_samples = next_start - slice_points[i].start_sample; + } + + // Mark remaining slices as inactive + for (int i = num_slices; i < kMaxSlices; ++i) { + slice_points[i].active = false; + } + + // Atomically update the active buffer + critical_section_enter_blocking(&cs_); + std::swap(active_slices_, update_slices_); + active_num_slices_ = num_slices; + update_pending_ = true; + critical_section_exit(&cs_); + } + +public: + DynamicSliceSelector() : + slice_probability_(0.5f), + clustering_factor_(0.5f), + phrase_awareness_(0.7f), + grid_tightness_(0.8f), + active_slices_(&slice_points_a_), + update_slices_(&slice_points_b_), + playback_position_(0), + current_slice_idx_(0), + slice_start_position_(0), + slice_end_position_(0), + slice_transition_pending_(false), + active_num_slices_(0), + update_pending_(false), + crossfade_position_(0), + crossfading_(false), + loop_start_time_(0), + loop_active_(false), + drum_loop_{nullptr, 0, 44100}, + rng_state_(12345) { + + // Initialize critical section + critical_section_init(&cs_); + + // Initialize slice points + for (auto& slice : slice_points_a_) { + slice.start_sample = 0; + slice.length_samples = 0; + slice.active = false; + slice.probability = 0.0f; + } + + for (auto& slice : slice_points_b_) { + slice.start_sample = 0; + slice.length_samples = 0; + slice.active = false; + slice.probability = 0.0f; + } + + // Initialize crossfade buffer + for (int i = 0; i < kCrossfadeSamples; ++i) { + crossfade_buffer_[i] = 0.0f; + } + } + + ~DynamicSliceSelector() { + critical_section_deinit(&cs_); + } + + void SetDrumLoop(const float* samples, uint32_t length_samples, uint32_t sample_rate = 44100) { + // This should be called from main thread only + critical_section_enter_blocking(&cs_); + + drum_loop_.samples = samples; + drum_loop_.length_samples = length_samples; + drum_loop_.sample_rate = sample_rate; + + // Reset playback state + playback_position_ = 0; + current_slice_idx_ = 0; + slice_start_position_ = 0; + slice_end_position_ = length_samples; + crossfading_ = false; + loop_active_ = true; + + critical_section_exit(&cs_); + + // Regenerate slices with current parameters + GenerateSlicePoints(); + } + + void ProcessParams(const std::vector& params) { + if (params.size() != kN_Params) return; + + slice_probability_ = params[0]; + clustering_factor_ = params[1]; + phrase_awareness_ = params[2]; + grid_tightness_ = params[3]; + + // Regenerate slice points with new parameters + GenerateSlicePoints(); + } + + // Real-time audio processing function - called from DMA interrupt + float Process() { + if (!loop_active_ || drum_loop_.samples == nullptr || drum_loop_.length_samples == 0) { + return 0.0f; + } + + // Update playback state if parameters changed + UpdatePlaybackState(); + + float output_sample = 0.0f; + + // Handle crossfading between slices + if (crossfading_) { + // Get current sample and previous slice sample for crossfade + float current_sample = (playback_position_ < drum_loop_.length_samples) ? + drum_loop_.samples[playback_position_] : 0.0f; + + float fade_ratio = float(crossfade_position_) / float(kCrossfadeSamples); + + // Simple linear crossfade + output_sample = crossfade_buffer_[crossfade_position_] * (1.0f - fade_ratio) + + current_sample * fade_ratio; + + crossfade_position_++; + if (crossfade_position_ >= kCrossfadeSamples) { + crossfading_ = false; + crossfade_position_ = 0; + } + } else { + // Normal playback + output_sample = (playback_position_ < drum_loop_.length_samples) ? + drum_loop_.samples[playback_position_] : 0.0f; + } + + // Advance playback position + playback_position_++; + + // Check if we've reached the end of current slice + if (playback_position_ >= slice_end_position_) { + // Find next slice + bool found_next_slice = false; + + // First, try to find a slice that starts at or after current position + for (int i = 0; i < active_num_slices_; ++i) { + if ((*active_slices_)[i].active && + (*active_slices_)[i].start_sample >= playback_position_) { + + // Prepare crossfade buffer with current slice end + for (int j = 0; j < kCrossfadeSamples && j < slice_end_position_ - slice_start_position_; ++j) { + uint32_t pos = slice_end_position_ - kCrossfadeSamples + j; + crossfade_buffer_[j] = (pos < drum_loop_.length_samples) ? + drum_loop_.samples[pos] : 0.0f; + } + + // Jump to new slice + current_slice_idx_ = i; + slice_start_position_ = (*active_slices_)[i].start_sample; + slice_end_position_ = slice_start_position_ + (*active_slices_)[i].length_samples; + playback_position_ = slice_start_position_; + + crossfading_ = true; + crossfade_position_ = 0; + found_next_slice = true; + break; + } + } + + // If no slice found ahead, loop back to beginning + if (!found_next_slice) { + // Prepare crossfade buffer + for (int j = 0; j < kCrossfadeSamples; ++j) { + uint32_t pos = slice_end_position_ - kCrossfadeSamples + j; + crossfade_buffer_[j] = (pos < drum_loop_.length_samples) ? + drum_loop_.samples[pos] : 0.0f; + } + + // Go to first slice + current_slice_idx_ = 0; + if (active_num_slices_ > 0 && (*active_slices_)[0].active) { + slice_start_position_ = (*active_slices_)[0].start_sample; + slice_end_position_ = slice_start_position_ + (*active_slices_)[0].length_samples; + } else { + slice_start_position_ = 0; + slice_end_position_ = drum_loop_.length_samples; + } + + playback_position_ = slice_start_position_; + crossfading_ = true; + crossfade_position_ = 0; + } + } + + return output_sample; + } + + // Get current slice configuration (thread-safe) + const SlicePoint* GetSlicePoints() const { + return active_slices_->data(); + } + + int GetNumActiveSlices() const { + return active_num_slices_; + } + + // Get current playback info (for debugging/visualization) + uint32_t GetPlaybackPosition() const { + return playback_position_; + } + + int GetCurrentSliceIndex() const { + return current_slice_idx_; + } + + // Get slice at specific position (for external playback systems) + const SlicePoint* GetSliceAtPosition(uint32_t sample_position) const { + for (int i = 0; i < active_num_slices_; ++i) { + if ((*active_slices_)[i].active && + sample_position >= (*active_slices_)[i].start_sample && + sample_position < (*active_slices_)[i].start_sample + (*active_slices_)[i].length_samples) { + return &(*active_slices_)[i]; + } + } + return nullptr; + } + + // Debug info (thread-safe) + void PrintSliceInfo() const { + critical_section_enter_blocking(const_cast(&cs_)); + + // Only implement if you have debug output capability + // for (int i = 0; i < active_num_slices_; ++i) { + // printf("Slice %d: start=%u, length=%u, prob=%.2f\n", + // i, (*active_slices_)[i].start_sample, + // (*active_slices_)[i].length_samples, + // (*active_slices_)[i].probability); + // } + // printf("Playback: pos=%u, slice=%d, crossfade=%d\n", + // playback_position_, current_slice_idx_, crossfading_); + + critical_section_exit(const_cast(&cs_)); + } +}; diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/FMSynth.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/FMSynth.cpp new file mode 100644 index 0000000..2866d72 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/FMSynth.cpp @@ -0,0 +1,182 @@ +#include "FMSynth.hpp" +#include +#include +#include +#include + +void FMSynth::GenParams(std::vector ¶m_vector) +{ +#if 0 + std::random_device rd; // Will be used to obtain a seed for the random number engine + std::mt19937 gen(rd()); // Standard mersenne_twister_engine seeded with rd() + std::uniform_real_distribution dis(0.f, 1.0f); +#else + float rand_scale = 1.f / static_cast(RAND_MAX); +#endif + //printf("Calling FMSynth::GenParams\n"); + + for(size_t i=0; i < kN_synthparams; i++) { + param_vector[i] = std::rand() * rand_scale; + //printf("."); + } + //printf("\n"); +} + +void FMSynth::UpdateParams() { + op1.UpdateParams(); + op2.UpdateParams(); + op3.UpdateParams(); + op4.UpdateParams(); + +} + +FMSynth::FMSynth(float sample_rate) : + smoother_(100.f, sample_rate), + envelope_smoother_(10.f, sample_rate), + note_freq_(0), + note_amplitude_(0), + play_note_(false), + midi_enabled_(false) +{ + // std::srand(0); + maxiSettings::setup(sample_rate, 1, 16); + UpdateParams(); + std::vector randParams(kN_synthparams); + GenParams(randParams); + + mapParameters(randParams); + +} + +void FMSynth::mapParameters(const std::vector ¶ms) { + const float *params_ptr = params.data(); + float *dest_ptr = synthparams.data(); + + *dest_ptr++ = 20 + ((*(params_ptr) * *(params_ptr)) * 5000); + ++params_ptr; + *dest_ptr++ = 20 + ((*(params_ptr) * *(params_ptr)) * 3000); + ++params_ptr; + *dest_ptr++ = (*(params_ptr++) * 200); + + *dest_ptr++ = 20 + ((*(params_ptr) * *(params_ptr)) * 5000); + ++params_ptr; + *dest_ptr++ = 20 + ((*(params_ptr) * *(params_ptr)) * 5000); + ++params_ptr; + *dest_ptr++ = (*(params_ptr++) * 200); + + *dest_ptr++ = (*(params_ptr++) * 200); + + *dest_ptr++ = 20 + ((*(params_ptr) * *(params_ptr)) * 5000); + ++params_ptr; + *dest_ptr++ = 20 + ((*(params_ptr) * *(params_ptr)) * 1000); + ++params_ptr; + *dest_ptr++ = (params[9] * 200); + + *dest_ptr++ = 20 + ((*(params_ptr) * *(params_ptr)) * 5000); + ++params_ptr; + *dest_ptr++ = 20 + ((*(params_ptr) * *(params_ptr)) * 800); + ++params_ptr; + *dest_ptr++ = (*(params_ptr++) * 100); + + *dest_ptr++ = (*(params_ptr++) * 200); + + +} + +inline float midiNoteToFrequency(int midiNote) { + // Constants + constexpr float A440 = 440.0f; // Frequency of A4 + constexpr float SEMITONE_RATIO = 1.059463094359f; // 2^(1/12), the ratio between adjacent semitones + + // Middle C (C4) is MIDI note 60, A4 is MIDI note 69 + int semitoneOffset = midiNote - 69; + + // Calculate the frequency + return A440 * std::pow(SEMITONE_RATIO, semitoneOffset); +} +size_t sampleIdx=0; +maxiOsc tmposc; +float FMSynth::process() +{ + // Smooth all parameters before using them + smoother_.Process(synthparams.data(), synthparams_smoothed.data()); + + float carrier_1, carrier_2, envelope; + + // Handle MIDI +#if 1 + if (midi_enabled_) { +#else + if (false) { +#endif + carrier_1 = note_freq_; + carrier_2 = carrier_1; + if (play_note_ == false) { + // No notes to play + envelope = 0; + } else { + // One note to play! + envelope = note_amplitude_; + } + // Smooth envelope + float envelope_smoothed; + envelope_smoother_.Process(&envelope, &envelope_smoothed); + envelope = envelope_smoothed; + } else { + carrier_1 = synthparams_smoothed[0] * 0.2f; + carrier_2 = synthparams_smoothed[7] * 0.6; + envelope = 1.0f; + } + +#if 1 + float w = op1.play(carrier_1 + + (op2.play(synthparams_smoothed[3],synthparams_smoothed[4],synthparams_smoothed[5]) * synthparams_smoothed[6]), + synthparams_smoothed[1], synthparams_smoothed[2]); + + float w2 = op3.play(carrier_2 + + (op4.play(synthparams_smoothed[10],synthparams_smoothed[11],synthparams_smoothed[12]) * synthparams_smoothed[13]), + synthparams_smoothed[8], synthparams_smoothed[9]); + + float y = (w + w2) * envelope; + + // float y = op1.play(500,1, 1); + // if (sampleIdx++ %1000 == 0) { + // DEBUG_PRINTLN(y); + // } + + return std::tanh(y); +#else + return op1.play(carrier_1, 0, 0) * envelope; +#endif +} + +int32_t FMSynth::processInt() +{ + static const float scaling = std::pow(2.f, 31.f) - 1000.f; + + return static_cast(process() * scaling); +} + +// void FMSynth::EnableMIDI(bool en) +// { +// midi_enabled_ = en; +// } + +// void FMSynth::AddMIDINote(ts_midi_note note) +// { +// if (midi_enabled_) { +// if (note.velocity > 0) { +// // note_buffer_.push_back(note); +// note_freq_ = midiNoteToFrequency(note.note_number); +// note_amplitude_ = note.velocity; +// play_note_ = true; +// } else { +// // #if 0 +// // note_buffer_.RemoveNote(note); +// // #else +// // note_buffer_.clear(); +// // #endif +// play_note_ = false; +// } +// } +// } diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/FMSynth.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/FMSynth.hpp new file mode 100644 index 0000000..bd410ed --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/FMSynth.hpp @@ -0,0 +1,143 @@ +#ifndef _FM_HPP +#define _FM_HPP +#include + +#include + +#include "maximilian.h" + +#include +#include +#include + +#include "OnePoleSmoother.hpp" + +const size_t kN_synthparams = 14; +using synthparams_array = std::array; +static constexpr size_t kN_notes = 4; + +template +class RingBuffer { +public: + RingBuffer() : head_(0), tail_(0), size_(0) {} + + // Push an element to the back of the queue + bool push_back(const T& value) { + if (size_ < Capacity) { + buffer_[tail_] = value; + tail_ = (tail_ + 1) % Capacity; + ++size_; + return true; + } else { + // Overwrite the oldest element if at full capacity + buffer_[tail_] = value; + tail_ = (tail_ + 1) % Capacity; + head_ = (head_ + 1) % Capacity; + return false; + } + } + + // Remove an element at a specific position + bool remove_at(std::size_t index) { + if (index >= size_) return false; + + std::size_t actual_index = (head_ + index) % Capacity; + for (std::size_t i = actual_index; i != tail_; i = (i + 1) % Capacity) { + std::size_t next_index = (i + 1) % Capacity; + buffer_[i] = buffer_[next_index]; + } + tail_ = (tail_ + Capacity - 1) % Capacity; + --size_; + return true; + } + + // Remove all elements with the same `note` + void RemoveNote(const T& target) { + std::size_t current = 0; + while (current < size_) { + std::size_t actual_index = (head_ + current) % Capacity; + if (buffer_[actual_index].note_number == target.note_number) { + remove_at(current); + // Do not increment `current` as the elements after the removed one shift left + } else { + ++current; + } + } + } + + // Clear the queue + void clear() { + head_ = 0; + tail_ = 0; + size_ = 0; + } + + // Get a pointer to the last element + T* back() { + if (size_ == 0) return nullptr; + std::size_t last_index = (tail_ + Capacity - 1) % Capacity; + return &buffer_[last_index]; + } + + // Check if the buffer is empty + bool empty() const { + return size_ == 0; + } + + // Get the current size of the buffer + std::size_t size() const { + return size_; + } + +private: + std::array buffer_; + std::size_t head_; // Points to the start of valid data + std::size_t tail_; // Points to the next insertion point + std::size_t size_; // Number of valid elements +}; + + +class FMOperator { +public: + void UpdateParams(void) { + carrier.UpdateParams(); + modulator.UpdateParams(); + } + float play(MAXITYPE carrierFreq, MAXITYPE modFreq, MAXITYPE index) { + float mod = modulator.sinebuf(modFreq); + float car = carrier.sinebuf(carrierFreq + (mod * index)) ; + return car; + } +private: + maxiOsc carrier, modulator; +}; + + +class FMSynth { + public: + static void GenParams(std::vector ¶m_vector); + FMSynth(float sample_rate); + float process(); + int32_t processInt(); + void mapParameters(const std::vector ¶ms); + // void EnableMIDI(bool en); + // void AddMIDINote(ts_midi_note note); + void UpdateParams(); + + private: + FMOperator op1, op2, op3, op4; + synthparams_array synthparams; + synthparams_array synthparams_smoothed; + // FMOperator fmops[10]; + OnePoleSmoother smoother_; + + // MIDI + // RingBuffer note_buffer_; + OnePoleSmoother<1> envelope_smoother_; + float note_freq_; + float note_amplitude_; + bool play_note_; + bool midi_enabled_; +}; + +#endif // _FM_HPP \ No newline at end of file diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/GrainDelayI16.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/GrainDelayI16.hpp new file mode 100644 index 0000000..c6667b7 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/GrainDelayI16.hpp @@ -0,0 +1,346 @@ +#pragma once + +#include +#include +#include "maximilian.h" +#include "../audio/AudioDriver.hpp" + +template +class GrainDelayI16 { + static_assert((BUFSIZE & (BUFSIZE - 1)) == 0, "BUFSIZE must be a power of 2"); + static constexpr size_t kEnvSize = 512; + static constexpr float kBufSizeF = static_cast(BUFSIZE); + static constexpr float kNGrainGain = 2.0f / static_cast(NGRAINS); + +public: + void setup(float sample_rate) { + sample_rate_ = sample_rate; + for (size_t i = 0; i < kEnvSize; ++i) { + float phase = static_cast(i) / static_cast(kEnvSize); + env_[i] = 0.5f * (1.f - cosf(2.f * M_PI * phase)); + } + for (size_t g = 0; g < NGRAINS; ++g) { + phase_[g] = static_cast(g) / static_cast(NGRAINS); + read_pos_[g] = 0.f; + } + updateGrainPitches(); + } + + float __force_inline process(float input, float externalFb = 0.f) { + if (!frozen_) buf_.write(input + out_ * feedback_ + externalFb + tap_out_ * tap_feedback_); + + float sum = 0.f; + const float write_idx = static_cast(buf_.getWriteIndex()); + + if (hasTap_) { + float tap_pos = write_idx - start_time_; + if (tap_pos < 0.f) tap_pos += kBufSizeF; + tap_out_ = buf_.readAbsolute(tap_pos); + } + + for (size_t g = 0; g < NGRAINS; ++g) { + phase_[g] += phase_inc_; + if (phase_[g] >= 1.0f) { + phase_[g] -= 1.0f; + read_pos_[g] = write_idx - start_time_; + if (read_pos_[g] < 0.f) read_pos_[g] += kBufSizeF; + } + const size_t env_idx = static_cast(phase_[g] * kEnvSize) & (kEnvSize - 1); + sum += buf_.readAbsolute(read_pos_[g]) * env_[env_idx]; + read_pos_[g] += grain_pitch_[g]; + if (read_pos_[g] >= kBufSizeF) read_pos_[g] -= kBufSizeF; + if (read_pos_[g] < 0.f) read_pos_[g] += kBufSizeF; + } + out_ = sum * kNGrainGain; // grains only — keeps tap out of the grain feedback path + return out_ + tap_out_ * tap_level_; + } + + stereosample_t __force_inline processStereo(float input) { + if (!frozen_) buf_.write(input + out_ * feedback_ + tap_out_ * tap_feedback_); + + float sumL = 0.f, sumR = 0.f; + const float write_idx = static_cast(buf_.getWriteIndex()); + + if (hasTap_) { + float tap_pos = write_idx - start_time_; + if (tap_pos < 0.f) tap_pos += kBufSizeF; + tap_out_ = buf_.readAbsolute(tap_pos); + } + + for (size_t g = 0; g < NGRAINS; ++g) { + phase_[g] += phase_inc_; + if (phase_[g] >= 1.0f) { + phase_[g] -= 1.0f; + read_pos_[g] = write_idx - start_time_; + if (read_pos_[g] < 0.f) read_pos_[g] += kBufSizeF; + } + const size_t env_idx = static_cast(phase_[g] * kEnvSize) & (kEnvSize - 1); + const float grainOut = buf_.readAbsolute(read_pos_[g]) * env_[env_idx]; + if (g & 1) sumR += grainOut; + else sumL += grainOut; + read_pos_[g] += grain_pitch_[g]; + if (read_pos_[g] >= kBufSizeF) read_pos_[g] -= kBufSizeF; + if (read_pos_[g] < 0.f) read_pos_[g] += kBufSizeF; + } + out_ = (sumL + sumR) * kNGrainGain; + const float tapContrib = tap_out_ * tap_level_; + return { sumL * kNGrainGain + tapContrib, + sumR * kNGrainGain + tapContrib }; + } + + void setGrainLengthSamples(float samples) { phase_inc_ = 1.0f / samples; } + void setGrainLengthMs(float ms) { setGrainLengthSamples(ms * 0.001f * sample_rate_); } + void setStartTimeSamples(float s) { start_time_ = s; } + void setStartTimeMs(float ms) { setStartTimeSamples(ms * 0.001f * sample_rate_); } + void setFeedback(float fb) { feedback_ = fb; } + void setPitch(float ratio) { pitch_ = ratio; updateGrainPitches(); } + void setPitchSpread(float spread){ pitch_spread_ = spread; updateGrainPitches(); } + void setTapLevel(float level) { tap_level_ = level; hasTap_ = (tap_level_ > 0.f || tap_feedback_ > 0.f); } + void setTapFeedback(float fb) { tap_feedback_ = fb; hasTap_ = (tap_level_ > 0.f || tap_feedback_ > 0.f); } + void setFreeze(bool freeze) { frozen_ = freeze; } + + void fillWithSaw(float freqHz) { + const size_t period = periodSamples(freqHz); + static int16_t cycle[kMaxPeriod]; + const float inv_period = static_cast(period); + const float inc = 1.f / inv_period; + float phase = 0.f; + for (size_t i = 0; i < period; ++i) { + float saw = phase * 2.f - 1.f; + saw -= polyBlep(phase, inc, inv_period); + cycle[i] = static_cast(saw * 32767.f); + phase += inc; + if (phase >= 1.f) phase -= 1.f; + } + buf_.fillRepeating(cycle, period); + resetGrains(); + } + + void fillWithSquare(float freqHz, float duty = 0.5f) { + const size_t period = periodSamples(freqHz); + static int16_t cycle[kMaxPeriod]; + const float inv_period = static_cast(period); + const float inc = 1.f / inv_period; + float phase = 0.f; + for (size_t i = 0; i < period; ++i) { + float sq = (phase < duty) ? 1.f : -1.f; + sq += polyBlep(phase, inc, inv_period); + float t2 = phase - duty; + if (t2 < 0.f) t2 += 1.f; + sq -= polyBlep(t2, inc, inv_period); + cycle[i] = static_cast(sq * 32767.f); + phase += inc; + if (phase >= 1.f) phase -= 1.f; + } + buf_.fillRepeating(cycle, period); + resetGrains(); + } + + void fillWithTriangle(float freqHz) { + const size_t period = periodSamples(freqHz); + static int16_t cycle[kMaxPeriod]; + const float inv_period = static_cast(period); + const float inc = 1.f / inv_period; + float phase = 0.f; + for (size_t i = 0; i < period; ++i) { + float tri = 2.f * fabsf(2.f * phase - 1.f) - 1.f; + tri += polyBlamp(phase, inc, inv_period); + tri -= polyBlamp(phase - 0.5f < 0.f ? phase + 0.5f : phase - 0.5f, inc, inv_period); + cycle[i] = static_cast(tri * 32767.f); + phase += inc; + if (phase >= 1.f) phase -= 1.f; + } + buf_.fillRepeating(cycle, period); + resetGrains(); + } + + void fillWithFallingSaw(float freqHz) { + const size_t period = periodSamples(freqHz); + static int16_t cycle[kMaxPeriod]; + const float inv_period = static_cast(period); + const float inc = 1.f / inv_period; + float phase = 0.f; + for (size_t i = 0; i < period; ++i) { + float saw = 1.f - phase * 2.f; + saw += polyBlep(phase, inc, inv_period); + cycle[i] = static_cast(saw * 32767.f); + phase += inc; + if (phase >= 1.f) phase -= 1.f; + } + buf_.fillRepeating(cycle, period); + resetGrains(); + } + + void fillWithSine(float freqHz) { + const size_t period = periodSamples(freqHz); + static int16_t cycle[kMaxPeriod]; + const float phase_inc = 2.f * static_cast(M_PI) / static_cast(period); + float phase = 0.f; + for (size_t i = 0; i < period; ++i) { + cycle[i] = static_cast(sinf(phase) * 32767.f); + phase += phase_inc; + } + buf_.fillRepeating(cycle, period); + resetGrains(); + } + + // Half-rectified sine: positive half of sine, zero for negative half. + // PolyBLAMP at both zero crossings (both are positive slope jumps). + void fillWithHalfRectSine(float freqHz) { + const size_t period = periodSamples(freqHz); + static int16_t cycle[kMaxPeriod]; + const float inv_period = static_cast(period); + const float inc = 1.f / inv_period; + float phase = 0.f; + for (size_t i = 0; i < period; ++i) { + const float s = sinf(phase * 2.f * static_cast(M_PI)); + float val = s > 0.f ? s : 0.f; + val += polyBlamp(phase, inc, inv_period); + const float t2 = phase >= 0.5f ? phase - 0.5f : phase + 0.5f; + val += polyBlamp(t2, inc, inv_period); + cycle[i] = static_cast(val * 32767.f); + phase += inc; + if (phase >= 1.f) phase -= 1.f; + } + buf_.fillRepeating(cycle, period); + resetGrains(); + } + + // Trapezoidal: square with sloped edges. rise=0 → square, rise=0.5 → triangle. + // PolyBLAMP at all 4 corners. + void fillWithTrapezoid(float freqHz, float rise = 0.2f) { + rise = fmaxf(0.01f, fminf(0.49f, rise)); + const size_t period = periodSamples(freqHz); + static int16_t cycle[kMaxPeriod]; + const float inv_period = static_cast(period); + const float inc = 1.f / inv_period; + float phase = 0.f; + for (size_t i = 0; i < period; ++i) { + float trap; + if (phase < rise) trap = phase / rise * 2.f - 1.f; + else if (phase < 0.5f) trap = 1.f; + else if (phase < 0.5f + rise) trap = 1.f - (phase - 0.5f) / rise * 2.f; + else trap = -1.f; + + // corners: 0(+), rise(-), 0.5(-), 0.5+rise(+) + trap += polyBlamp(phase, inc, inv_period); + float t1 = phase - rise; if (t1 < 0.f) t1 += 1.f; + trap -= polyBlamp(t1, inc, inv_period); + float t2 = phase - 0.5f; if (t2 < 0.f) t2 += 1.f; + trap -= polyBlamp(t2, inc, inv_period); + float t3 = phase - (0.5f + rise); if (t3 < 0.f) t3 += 1.f; + trap += polyBlamp(t3, inc, inv_period); + + cycle[i] = static_cast(trap * 32767.f); + phase += inc; + if (phase >= 1.f) phase -= 1.f; + } + buf_.fillRepeating(cycle, period); + resetGrains(); + } + + // Asymmetric triangle: peak position 0..1 (0.5 = symmetric triangle, + // 0 → falling saw, 1 → rising saw). PolyBLAMP at both corners. + void fillWithAsymTriangle(float freqHz, float peak = 0.5f) { + peak = fmaxf(0.01f, fminf(0.99f, peak)); + const size_t period = periodSamples(freqHz); + static int16_t cycle[kMaxPeriod]; + const float inv_period = static_cast(period); + const float inc = 1.f / inv_period; + float phase = 0.f; + for (size_t i = 0; i < period; ++i) { + float tri = (phase < peak) + ? (phase / peak * 2.f - 1.f) + : (1.f - (phase - peak) / (1.f - peak) * 2.f); + tri += polyBlamp(phase, inc, inv_period); + float t1 = phase - peak; if (t1 < 0.f) t1 += 1.f; + tri -= polyBlamp(t1, inc, inv_period); + cycle[i] = static_cast(tri * 32767.f); + phase += inc; + if (phase >= 1.f) phase -= 1.f; + } + buf_.fillRepeating(cycle, period); + resetGrains(); + } + + // Staircase: quantised rising saw. PolyBLEP corrects the wrap discontinuity; + // individual step transitions are small (2/(steps-1)) so their aliasing is mild. + void fillWithStaircase(float freqHz, size_t steps = 8) { + steps = std::max(size_t(2), std::min(steps, size_t(32))); + const size_t period = periodSamples(freqHz); + static int16_t cycle[kMaxPeriod]; + const float inv_period = static_cast(period); + const float inc = 1.f / inv_period; + const float fsteps = static_cast(steps); + float phase = 0.f; + for (size_t i = 0; i < period; ++i) { + float saw = phase * 2.f - 1.f; + saw -= polyBlep(phase, inc, inv_period); + const float stair = roundf((saw + 1.f) * 0.5f * (fsteps - 1.f)) + * 2.f / (fsteps - 1.f) - 1.f; + cycle[i] = static_cast(stair * 32767.f); + phase += inc; + if (phase >= 1.f) phase -= 1.f; + } + buf_.fillRepeating(cycle, period); + resetGrains(); + } + +private: + DynamicDelayI16 buf_; + float env_[kEnvSize] = {}; + float phase_[NGRAINS] = {}; + float read_pos_[NGRAINS] = {}; + float phase_inc_ = 1.0f / 4800.f; // default 100ms at 48kHz + float start_time_ = 8000.f; // default ~167ms + float feedback_ = 0.3f; + float pitch_ = 1.0f; + float pitch_spread_ = 0.f; + float grain_pitch_[NGRAINS] = {}; + float tap_level_ = 0.f; + float tap_feedback_= 0.f; + float tap_out_ = 0.f; + float out_ = 0.f; + bool frozen_ = false; + bool hasTap_ = false; + float sample_rate_= 48000.f; + + static constexpr size_t kMaxPeriod = 4096; + + size_t periodSamples(float freqHz) const { + return std::min(static_cast(sample_rate_ / freqHz + 0.5f), kMaxPeriod); + } + + void resetGrains() { + const float wi = static_cast(buf_.getWriteIndex()); + for (size_t g = 0; g < NGRAINS; ++g) { + read_pos_[g] = wi - start_time_; + if (read_pos_[g] < 0.f) read_pos_[g] += kBufSizeF; + phase_[g] = static_cast(g) / static_cast(NGRAINS); + } + out_ = 0.f; + tap_out_ = 0.f; + } + + static float polyBlep(float t, float dt, float inv_dt) { + if (t < dt) { t *= inv_dt; return t + t - t*t - 1.f; } + else if (t > 1.f - dt) { t = (t - 1.f) * inv_dt; return t*t + t + t + 1.f; } + return 0.f; + } + + // PolyBLAMP: corrects slope discontinuities (triangle wave corners) + static float polyBlamp(float t, float dt, float inv_dt) { + if (t < dt) { t *= inv_dt; return dt * ( t*t*t/3.f - t*t + 1.f); } + else if (t > 1.f - dt) { t = (t - 1.f) * inv_dt; return dt * (t*t*t/3.f + t*t + 1.f); } + return 0.f; + } + + void updateGrainPitches() { + for (size_t g = 0; g < NGRAINS; ++g) { + float t = NGRAINS > 1 + ? static_cast(g) / static_cast(NGRAINS - 1) + : 0.5f; + grain_pitch_[g] = pitch_ + pitch_spread_ * (t - 0.5f); + } + } +}; diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/ModFXI16.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/ModFXI16.hpp new file mode 100644 index 0000000..a099954 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/ModFXI16.hpp @@ -0,0 +1,179 @@ +#pragma once + +#include "maximilian.h" + +// ───────────────────────────────────────────────────────────────────────────── +// FlangerI16 +// Short modulated delay (0–BUFSIZE samples). +// process(input, delayBaseSamples, depth, ratHz, feedback, mix) +// mix 0 = dry, mix 1 = classic 50/50 flange +// ───────────────────────────────────────────────────────────────────────────── +template +class FlangerI16 { + static_assert((BUFSIZE & (BUFSIZE - 1)) == 0, "BUFSIZE must be a power of 2"); +public: + float __force_inline process(float input, float delayBase, + float depth, float rate, + float feedback, float mix) + { + const float lfoVal = lfo_.sinewave(rate); + const float delayTime = fmaxf(1.f, delayBase * (1.f + depth * lfoVal)); + const float out = buf_.read(delayTime); + buf_.write(input + out * feedback); + // mix=0 → dry; mix=1 → 50% dry + 50% delayed + return input * (1.f - mix * 0.5f) + out * (mix * 0.5f); + } + +private: + DynamicDelayI16 buf_; + maxiOsc lfo_; +}; + + +// ───────────────────────────────────────────────────────────────────────────── +// ChorusI16 +// Two-voice chorus. Second LFO starts 180° offset and runs at a slightly +// different rate for a richer, detuned character. +// process(input, delayBaseSamples, depth, rateHz, feedback, mix) +// mix 0 = dry, mix 1 = 1/3 dry + 1/3 voice1 + 1/3 voice2 +// ───────────────────────────────────────────────────────────────────────────── +template +class ChorusI16 { + static_assert((BUFSIZE & (BUFSIZE - 1)) == 0, "BUFSIZE must be a power of 2"); +public: + ChorusI16() { lfo2_.phase = 0.5f; } + + float __force_inline process(float input, float delayBase, + float depth, float rate, + float feedback, float mix) + { + const float lfo1 = lfo1_.sinewave(rate); + const float lfo2 = lfo2_.sinewave(rate * 1.02f); + + const float out1 = buf1_.read(fmaxf(1.f, delayBase * (1.f + depth * lfo1))); + const float out2 = buf2_.read(fmaxf(1.f, delayBase * (1.f + depth * lfo2 * 0.97f))); + + buf1_.write(input + out1 * feedback); + buf2_.write(input + out2 * feedback * 0.98f); + + const float wet = (input + out1 + out2) * 0.3333f; + return input * (1.f - mix) + wet * mix; + } + +private: + DynamicDelayI16 buf1_, buf2_; + maxiOsc lfo1_, lfo2_; +}; + + +// ───────────────────────────────────────────────────────────────────────────── +// RingMod +// Multiply input by a sine carrier. mix=0 dry, mix=1 full ring mod. +// process(input, freqHz, mix) +// ───────────────────────────────────────────────────────────────────────────── +class RingMod { +public: + // Advance oscillator once and return carrier value — use for stereo. + float __force_inline carrier(float freqHz) { return osc_.sinewave(freqHz); } + + float __force_inline process(float input, float freqHz, float mix) + { + const float c = carrier(freqHz); + return input * (1.f - mix) + (input * c) * mix; + } +private: + maxiOsc osc_; +}; + + +// ───────────────────────────────────────────────────────────────────────────── +// StutterGate +// Rhythmic gate synced to a pre-computed period in samples. +// process(input, periodSamples, dutyCycle, mix) +// dutyCycle: 0-1 fraction of period that is open +// mix: 0 = dry (gate bypassed), 1 = full stutter +// ───────────────────────────────────────────────────────────────────────────── +class StutterGate { +public: + // Advance phase once and return gate multiplier (0 or 1) — use for stereo. + float __force_inline gateValue(float periodSamples, float dutyCycle) + { + phase_ += 1.f; + if (phase_ >= periodSamples) phase_ -= periodSamples; + return (phase_ / periodSamples < dutyCycle) ? 1.f : 0.f; + } + + float __force_inline process(float input, float periodSamples, float dutyCycle, float mix) + { + const float gate = gateValue(periodSamples, dutyCycle); + return input * (1.f - mix) + input * gate * mix; + } +private: + float phase_{0.f}; +}; + + +// ───────────────────────────────────────────────────────────────────────────── +// BitCrusher +// Combines bit-depth reduction and sample-rate reduction. +// process(input, bits, rateDiv, mix) +// bits : effective bit depth (e.g. 4.0 = 4-bit) +// rateDiv: sample-hold period in samples (1 = off, 32 = extreme) +// mix : 0 = dry, 1 = full crush +// ───────────────────────────────────────────────────────────────────────────── +class BitCrusher { +public: + float __force_inline process(float input, float bits, float rateDiv, float mix) + { + if (++phase_ >= static_cast(rateDiv)) { + phase_ = 0; + heldL_ = input; + } + const float levels = powf(2.f, bits) - 1.f; + return input * (1.f - mix) + roundf(heldL_ * levels) / levels * mix; + } + + // Stereo version: advances phase once, holds L and R independently. + void __force_inline processStereo(float& L, float& R, float bits, float rateDiv, float mix) + { + if (++phase_ >= static_cast(rateDiv)) { + phase_ = 0; + heldL_ = L; + heldR_ = R; + } + const float levels = powf(2.f, bits) - 1.f; + L = L * (1.f - mix) + roundf(heldL_ * levels) / levels * mix; + R = R * (1.f - mix) + roundf(heldR_ * levels) / levels * mix; + } +private: + float heldL_{0.f}, heldR_{0.f}; + int phase_{0}; +}; + + +// ───────────────────────────────────────────────────────────────────────────── +// AllpassI16 +// Schroeder allpass: y[n] = -g*x[n] + x[n-D] + g*y[n-D] +// Unity gain across all frequencies; adds diffuse phase dispersion. +// process(input, delaySamples, g) +// g: 0–1, typical 0.5–0.7 +// ───────────────────────────────────────────────────────────────────────────── +template +class AllpassI16 { + static_assert((BUFSIZE & (BUFSIZE - 1)) == 0, "BUFSIZE must be a power of 2"); + static constexpr float kBufF = static_cast(BUFSIZE); +public: + float __force_inline process(float input, float delaySamples, float g) + { + const float dt = fminf(delaySamples, kBufF - 1.f); + float readPos = static_cast(buf_.getWriteIndex()) - dt; + if (readPos < 0.f) readPos += kBufF; + const float delayed = buf_.readAbsolute(readPos); + const float v = input + g * delayed; + buf_.write(v); + return -g * v + delayed; + } + +private: + DynamicDelayI16 buf_; +}; diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/OnePoleSmoother.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/OnePoleSmoother.hpp new file mode 100644 index 0000000..33ddc07 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/OnePoleSmoother.hpp @@ -0,0 +1,47 @@ +#ifndef ONEPOLESMOOTHER_H +#define ONEPOLESMOOTHER_H + +#include + +template +class OnePoleSmoother { + public: + OnePoleSmoother() : sample_rate_(48000), y_{0} {} + + OnePoleSmoother(float time_ms, float sample_rate) : + sample_rate_(sample_rate), + y_ { 0 } { + SetTimeMs(time_ms); + } + + void Setup(float time_ms, float sample_rate) { + sample_rate_ = sample_rate; + SetTimeMs(time_ms); + } + + void SetTimeMs(float time_ms) { + //b1_ = std::exp( + // std::log(0.01) / + // time_ms * sample_rate_ * 0.001 + //); + b1_ = powf(0.1f, 1.f/ (time_ms * 0.001f * sample_rate_)); + } + inline __attribute__((always_inline)) void Process(const float * x_ptr, float *y_ptr) { + float *y2_ptr = y_; + for (unsigned int c = 0; c < n_channels; c++) { + const float x = *x_ptr; + *y2_ptr = *y_ptr = x + b1_ * (*y2_ptr - x); + ++x_ptr; + ++y_ptr; + ++y2_ptr; + } + } + + protected: + float sample_rate_; + float b1_; + float y_[n_channels]; +}; + + +#endif \ No newline at end of file diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/PlayLoop.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/PlayLoop.hpp new file mode 100644 index 0000000..0ffde57 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/PlayLoop.hpp @@ -0,0 +1,124 @@ +#ifndef __PLAYLOOP_HPP__ +#define __PLAYLOOP_HPP__ + +#include "stdint.h" + +#include "../PicoDefs.hpp" + + +// Flash memory address where audio data is loaded +#define AUDIO_FLASH_ADDRESS 0x10200000U +#define AUDIO_MAGIC 0x4F434950U // 'PICO' +#define AUDIO_VERSION 1U + + +class PlayLoop { + +public: + + PlayLoop(const char *filename) : + sample_info_{0}, + phase_(0.f) + { + if (!get_sample_info(filename, &sample_info_)) { + DEBUG_PRINTLN("Error: Sample not found in audio data."); + }else{ + DEBUG_PRINTLN("Sample found: " + String(sample_info_.name) + ", count: " + String(sample_info_.sample_count) + ", duration: " + String(sample_info_.duration)); + } + } + + float __force_inline Process() { + if (!sample_info_.found || !sample_info_.samples || sample_info_.sample_count == 0) { + return 0.f; // Return silence if sample not found + } + + // Read sample at current phase + float y = sample_info_.samples[phase_]; + // Update phase + phase_++; + if (phase_ >= sample_info_.sample_count) { + phase_ = 0; + } + + return y; + } + +protected: + + // Sample information structure + typedef struct { + const char* name; // File name + const float* samples; // Pointer to audio samples + uint32_t sample_count; // Number of samples + float duration; // Duration in seconds + bool found; // Whether the file was found + } sample_info_t; + + // Binary format structures + typedef struct { + uint32_t magic; // 'PICO' magic number + uint32_t version; // Format version + uint32_t file_count; // Number of audio files + uint32_t sample_rate; // Sample rate in Hz + } audio_header_t; + + typedef struct { + char name[16]; // Null-terminated filename + uint32_t offset; // Offset to audio data + uint32_t sample_count; // Number of samples + float duration; // Duration in seconds + uint32_t reserved; // Reserved for future use + } audio_file_entry_t; + + sample_info_t sample_info_; + unsigned int phase_; + + /** + * Get sample information by filename (without .wav extension) + * + * @param filename Name of the file without .wav extension (e.g., "intro", "beep") + * @param info Pointer to sample_info_t structure to fill + * @return true if file found, false otherwise + */ + static bool get_sample_info(const char* filename, sample_info_t* info) { + DEBUG_PRINTLN("get_sample_info called with filename: " + String(filename)); + if (!filename || !info) { + return false; + } + + // Initialize info structure + memset(info, 0, sizeof(sample_info_t)); + + // Read pointers from memory based on flash address + const uint8_t* binary_data = (const uint8_t*)AUDIO_FLASH_ADDRESS; + const audio_header_t* header = (const audio_header_t*)binary_data; + const audio_file_entry_t* file_table = (const audio_file_entry_t*)(binary_data + 16); + + // Verify binary is valid + if (header->magic != AUDIO_MAGIC) { + return false; + } + + // Search for the file by name + for (uint32_t i = 0; i < header->file_count; i++) { + if (strcmp(file_table[i].name, filename) == 0) { + // Found the file! + info->name = file_table[i].name; + info->samples = (const float*)(binary_data + file_table[i].offset); + info->sample_count = file_table[i].sample_count; + info->duration = file_table[i].duration; + info->found = true; + return true; + } + } + + // File not found + info->found = false; + return false; + } + +}; + + + +#endif // __PLAYLOOP_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/ReverbI16.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/ReverbI16.hpp new file mode 100644 index 0000000..d98fc06 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/ReverbI16.hpp @@ -0,0 +1,324 @@ +#pragma once + +#include "maximilian.h" +#include +#include + +// Freeverb-style reverb using int16 delay lines. +// 4 parallel LP-filtered feedback combs → 2 serial Schroeder allpasses → stereo out. +// COMB_SIZE must be a power of 2 (DynamicDelayI16 bitmask requirement). +// At default COMB_SIZE=4096: ~40 KB RAM, ~75 ops/sample ≈ 1.5% CPU at 200MHz/48kHz. +template +class ReverbI16 { + static_assert((COMB_SIZE & (COMB_SIZE - 1)) == 0, "COMB_SIZE must be a power of 2"); + static constexpr size_t AP_SIZE = COMB_SIZE / 4; // 1024 + static constexpr size_t PRE_SIZE = COMB_SIZE / 2; // 2048 (~42ms at 48kHz) + static constexpr size_t DECOR_SIZE = 64; + + // Comb bases as fraction of sample rate; scale range [0.5, 1.1] keeps max < COMB_SIZE. + // (Read only at control rate in setSize, so flash residence is fine here.) + static constexpr float kCombBases[4] = {0.0500f, 0.0561f, 0.0625f, 0.0688f}; + // Allpass fixed times live as SRAM statics in processCore() (hot path) — see note there. + + DynamicDelayI16 combs_[4]; + DynamicDelayI16 aps_[2]; + DynamicDelayI16 preDelay_; + DynamicDelayI16 decorR_; + + float dampState_[4] = {}; + float hpfLpState_ = 0.f; + + float lfo1_ = 0.f; + float lfo2_ = 0.5f; + + // Written by ProcessParams (Core 1 bg), read by process() ISR (Core 1 hi). + // Same-core aligned float reads/writes are safe on Cortex-M33. + float combTimes_[4] = {}; + float feedbackGain_ = 0.60f; + float dampCoeff_ = 0.50f; + float apGain_ = 0.50f; + float modDepth_ = 0.f; + float modInc_ = 0.f; + float preDelaySamples_ = 0.f; + float hpfCoeff_ = 0.f; + float width_ = 0.7f; + float satDrive_ = 0.f; + float sampleRate_ = 48000.f; + + // Cheap cubic soft-clip (no divide): ~unity for |x|<1, smoothly reaches ±1 at ±1.5, + // hard-limits beyond. Applied to the recirculating writes so overload saturates gently + // instead of the int16 delay line's harsh ±1 hard-clamp. + static float __force_inline softLimit(float x) { + // Constants in SRAM (non-const static) to avoid flash literal-pool reads in the hot path. + static float kLim = 1.5f; + static float kCub = 0.148148f; // 4/27 + if (x > kLim) return 1.f; + if (x < -kLim) return -1.f; + return x - x * x * x * kCub; + } + +public: + void setup(float sr) { + sampleRate_ = sr; + // Fast smoothing on combs so LFO modulation tracks correctly + for (auto& c : combs_) c.setSmoothCoeff(0.99f); + setSize(0.5f); + } + + // 0-1 → scale 0.5-1.1; combTimes_ derived from base × scale × sr + void setSize(float v) { + const float scale = 0.5f + v * 0.6f; + const float maxT = static_cast(COMB_SIZE - 2); + for (int i = 0; i < 4; ++i) + combTimes_[i] = fminf(kCombBases[i] * sampleRate_ * scale, maxT); + } + + void setDecay(float v) { feedbackGain_ = 0.30f + v * 0.67f; } + void setDamping(float v) { dampCoeff_ = v * 0.92f; } + void setDiffusion(float v) { apGain_ = 0.30f + v * 0.45f; } + void setModDepth(float v) { modDepth_ = v * 20.f; } + void setModRate(float v) { modInc_ = (0.1f + v * 4.9f) / sampleRate_; } + void setPreDelay(float v) { preDelaySamples_ = v * static_cast(PRE_SIZE - 1); } + void setLowCut(float v) { hpfCoeff_ = v * 0.05f; } + void setStereoWidth(float v) { width_ = v; } + void setSaturation(float v) { satDrive_ = v * 4.f; } + + // Shared mono reverb core: HPF → predelay → 4 LP-combs → saturation → 2 allpasses. + // Returns the wet mono signal; process()/processMono() build their output from it. + float __force_inline processCore(float in) { + // Hot-path constants kept in SRAM (non-const static) so the per-sample loop reads them + // from RAM rather than the flash literal pool (XIP reads are far slower). NOT const. + static float kAPTimes[2] = {605.f, 480.f}; // Schroeder allpass delay times + static float kLfo2Rate = 1.3f; + static float kTriA = 4.f; + static float kTriB = 3.f; + static float kCombScale = 0.25f; // average of 4 combs + static float kSatA = 27.f; + static float kSatB = 9.f; + + // Input HPF (1-pole: y_lp += coeff*(x - y_lp); y_hp = x - y_lp). + // coeff IS the cutoff: 0 => y_lp frozen => y_hp = x (no cut, full signal). + hpfLpState_ += hpfCoeff_ * (in - hpfLpState_); + float sig = in - hpfLpState_; + + // Pre-delay + if (preDelaySamples_ >= 1.f) { + const float pd = preDelay_.read(preDelaySamples_); + preDelay_.write(softLimit(sig)); + sig = pd; + } + + // Dual triangle LFOs (antiphase: lfo2 offset by 0.5 period, runs at 1.3× rate) + lfo1_ += modInc_; + if (lfo1_ >= 1.f) lfo1_ -= 1.f; + lfo2_ += modInc_ * kLfo2Rate; + if (lfo2_ >= 1.f) lfo2_ -= 1.f; + const float tri1 = lfo1_ < 0.5f ? kTriA * lfo1_ - 1.f : kTriB - kTriA * lfo1_; + const float tri2 = lfo2_ < 0.5f ? kTriA * lfo2_ - 1.f : kTriB - kTriA * lfo2_; + + // 4 parallel LP-comb filters + float combSum = 0.f; + for (int i = 0; i < 4; ++i) { + const float lfo = (i < 2) ? tri1 : tri2; + const float y = combs_[i].read(combTimes_[i] + lfo * modDepth_); + dampState_[i] = dampState_[i] * dampCoeff_ + y * (1.f - dampCoeff_); + combs_[i].write(softLimit(sig + dampState_[i] * feedbackGain_)); + combSum += dampState_[i]; + } + combSum *= kCombScale; + + // Optional tail saturation (normalised fasttanh) + if (satDrive_ > 0.f) { + const float xd = combSum * satDrive_; + const float x2 = xd * xd; + combSum = (xd * (kSatA + x2) / (kSatA + kSatB * x2)) / satDrive_; + } + + // 2 serial Schroeder allpasses + for (int i = 0; i < 2; ++i) { + const float delayed = aps_[i].read(kAPTimes[i]); + const float v = combSum - delayed * apGain_; + aps_[i].write(softLimit(v)); + combSum = v * apGain_ + delayed; + } + return combSum; + } + + // Wet-only MONO output — cheapest path (skips the stereo decorrelation tail). Use when + // the caller only needs a mono reverb (copies to L/R itself). + float __force_inline processMono(float in) { return processCore(in); } + + // Wet-only stereo pair; caller applies wet/dry crossfade. + std::pair __force_inline process(float in) { + const float combSum = processCore(in); + // Stereo decorrelation on R (fixed 23-sample delay) + width (mid-side) + const float L = combSum; + const float R = decorR_.read(23.f); + decorR_.write(combSum); + const float mid = (L + R) * 0.5f; + const float side = (L - R) * 0.5f; + return { mid + side * width_, mid - side * width_ }; + } +}; + + +// Larger, denser, true-stereo variant. Same public API as ReverbI16 (drop-in), but: +// input diffusion (2 allpasses) → 8 LP-combs split into L/R banks → per-channel +// allpass chains → width. ~2x the RAM/CPU of ReverbI16 (~78 KB, ~3% CPU at COMB_SIZE +// 4096). Pick per mode by choosing the class: DJFX uses this; SaxFX uses ReverbI16. +template +class ReverbI16Large { + static_assert((COMB_SIZE & (COMB_SIZE - 1)) == 0, "COMB_SIZE must be a power of 2"); + // AP/PRE/DIFF are fixed (independent of COMB_SIZE) so the allpass/predelay/diffuser + // times always fit even when COMB_SIZE is small (e.g. 2048). Only the combs — which + // set the room size and dominate RAM — scale with COMB_SIZE. + static constexpr size_t AP_SIZE = 1024; // holds <=556 + static constexpr size_t PRE_SIZE = 2048; // ~42ms predelay + static constexpr size_t DIFF_SIZE = 512; // input diffusers (holds <=142) + + // 8 comb bases (Freeverb tunings ×2 for a bigger room), as fraction of sample rate. + // Longest = 0.0733·48k·1.1 ≈ 3870 < COMB_SIZE, so they fit at max size. + static constexpr float kCombBases[8] = { + 0.0506f, 0.0539f, 0.0579f, 0.0615f, 0.0645f, 0.0676f, 0.0706f, 0.0733f + }; + // Per-sample-read allpass/diffuser times + gain live as SRAM statics in process() + // (avoid flash literal-pool reads in the hot loop). kCombBases stays — read only in setSize. + + DynamicDelayI16 combs_[8]; + DynamicDelayI16 apsL_[2]; + DynamicDelayI16 apsR_[2]; + DynamicDelayI16 inDiff_[2]; + DynamicDelayI16 preDelay_; + + float dampState_[8] = {}; + float hpfLpState_ = 0.f; + float lfo1_ = 0.f, lfo2_ = 0.5f; + + float combTimes_[8] = {}; + float feedbackGain_ = 0.60f; + float dampCoeff_ = 0.50f; + float apGain_ = 0.50f; + float modDepth_ = 0.f; + float modInc_ = 0.f; + float preDelaySamples_ = 0.f; + float hpfCoeff_ = 0.f; + float width_ = 0.7f; + float satDrive_ = 0.f; + float sampleRate_ = 48000.f; + + float __force_inline saturate(float x) const { + static float kA = 27.f, kB = 9.f; // SRAM, not flash literals + const float xd = x * satDrive_; + const float x2 = xd * xd; + return (xd * (kA + x2) / (kA + kB * x2)) / satDrive_; + } + + // Cheap cubic soft-clip (no divide): ~unity for |x|<1, smoothly reaches ±1 at ±1.5, + // hard-limits beyond. Applied to the reverb's recirculating writes so overload becomes + // gentle saturation instead of the int16 delay line's harsh ±1 hard-clamp. + static float __force_inline softLimit(float x) { + // Constants in SRAM (non-const static) to avoid flash literal-pool reads in the hot path. + static float kLim = 1.5f; + static float kCub = 0.148148f; // 4/27 + if (x > kLim) return 1.f; + if (x < -kLim) return -1.f; + return x - x * x * x * kCub; + } + +public: + void setup(float sr) { + sampleRate_ = sr; + for (auto& c : combs_) c.setSmoothCoeff(0.99f); + setSize(0.5f); + } + + void setSize(float v) { + // Comb base tunings are sized for COMB_SIZE=4096; scale them by COMB_SIZE/4096 so + // they fit (and stay mutually distinct) at any buffer size — a smaller COMB_SIZE + // simply gives a smaller room. + const float scale = (0.5f + v * 0.6f) * (static_cast(COMB_SIZE) / 4096.f); + const float maxT = static_cast(COMB_SIZE - 2); + for (int i = 0; i < 8; ++i) + combTimes_[i] = fminf(kCombBases[i] * sampleRate_ * scale, maxT); + } + + void setDecay(float v) { feedbackGain_ = 0.30f + v * 0.685f; } // up to ~0.985 + void setDamping(float v) { dampCoeff_ = v * 0.92f; } + void setDiffusion(float v) { apGain_ = 0.30f + v * 0.45f; } + void setModDepth(float v) { modDepth_ = v * 20.f; } + void setModRate(float v) { modInc_ = (0.1f + v * 4.9f) / sampleRate_; } + void setPreDelay(float v) { preDelaySamples_ = v * static_cast(PRE_SIZE - 1); } + void setLowCut(float v) { hpfCoeff_ = v * 0.05f; } + void setStereoWidth(float v) { width_ = v; } + void setSaturation(float v) { satDrive_ = v * 4.f; } + + std::pair __force_inline process(float in) { + // Hot-path constants in SRAM (non-const static) — avoid flash literal-pool reads. + static float kInDiffTimes[2] = {142.f, 107.f}; + static float kAPTimesL[2] = {556.f, 441.f}; + static float kAPTimesR[2] = {341.f, 225.f}; + static float kInDiffGain = 0.7f; + static float kLfo2Rate = 1.3f; + static float kTriA = 4.f; + static float kTriB = 3.f; + static float kCombScale = 0.25f; // 4 combs per channel + + // Input HPF (see ReverbI16 for the 1-pole derivation) + hpfLpState_ += hpfCoeff_ * (in - hpfLpState_); + float sig = in - hpfLpState_; + + // Pre-delay + if (preDelaySamples_ >= 1.f) { + const float pd = preDelay_.read(preDelaySamples_); + preDelay_.write(softLimit(sig)); + sig = pd; + } + + // Input diffusion — 2 allpasses smear transients into a dense wash + for (int k = 0; k < 2; ++k) { + const float d = inDiff_[k].read(kInDiffTimes[k]); + const float v = sig - d * kInDiffGain; + inDiff_[k].write(softLimit(v)); + sig = v * kInDiffGain + d; + } + + // Dual triangle LFOs (antiphase, lfo2 at 1.3× rate) + lfo1_ += modInc_; if (lfo1_ >= 1.f) lfo1_ -= 1.f; + lfo2_ += modInc_ * kLfo2Rate; if (lfo2_ >= 1.f) lfo2_ -= 1.f; + const float tri1 = lfo1_ < 0.5f ? kTriA * lfo1_ - 1.f : kTriB - kTriA * lfo1_; + const float tri2 = lfo2_ < 0.5f ? kTriA * lfo2_ - 1.f : kTriB - kTriA * lfo2_; + + // 8 LP-combs, split into L (even) / R (odd) banks for true stereo + float combL = 0.f, combR = 0.f; + for (int i = 0; i < 8; ++i) { + const float lfo = (i < 4) ? tri1 : tri2; + const float y = combs_[i].read(combTimes_[i] + lfo * modDepth_); + dampState_[i] = dampState_[i] * dampCoeff_ + y * (1.f - dampCoeff_); + combs_[i].write(softLimit(sig + dampState_[i] * feedbackGain_)); + if (i & 1) combR += dampState_[i]; else combL += dampState_[i]; + } + combL *= kCombScale; + combR *= kCombScale; + + if (satDrive_ > 0.f) { combL = saturate(combL); combR = saturate(combR); } + + // Per-channel allpass chains (stereo diffusion) + for (int k = 0; k < 2; ++k) { + const float d = apsL_[k].read(kAPTimesL[k]); + const float v = combL - d * apGain_; + apsL_[k].write(softLimit(v)); + combL = v * apGain_ + d; + } + for (int k = 0; k < 2; ++k) { + const float d = apsR_[k].read(kAPTimesR[k]); + const float v = combR - d * apGain_; + apsR_[k].write(softLimit(v)); + combR = v * apGain_ + d; + } + + // Width (mid-side) + const float mid = (combL + combR) * 0.5f; + const float side = (combL - combR) * 0.5f; + return { mid + side * width_, mid - side * width_ }; + } +}; diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/SaxAnalysis.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/SaxAnalysis.cpp new file mode 100644 index 0000000..7ecc1c4 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/SaxAnalysis.cpp @@ -0,0 +1,149 @@ +#include "SaxAnalysis.hpp" + +#include + +#include "../hardware/memlnaut/Pins.hpp" +#include "../utils/Maths.hpp" +#include "../PicoDefs.hpp" + + +SaxAnalysis::SaxAnalysis(const float sample_rate) : + sample_rate_(sample_rate), + one_over_sample_rate_(1.0f / sample_rate), + zc_median_filter_(kZC_MedianFilterSize) { + + // Initialize filters and detectors + common_hpf_.set(maxiBiquad::filterTypes::HIGHPASS, 100.f, 0.707f, 0); + // Zero crossing + zc_lpf_.set(maxiBiquad::filterTypes::LOWPASS, 800.0f, 0.707f, 0); + elapsed_samples_ = 0; + // Envelope follower + ef_follower_.setAttack(10.0f); + ef_follower_.setRelease(100.0f); + ef_deriv_y_ = 0; + // Brightness + br_lpf1_.set(maxiBiquad::filterTypes::LOWPASS, 1000.0f, 0.707f, 0); + br_hpf2_.set(maxiBiquad::filterTypes::HIGHPASS, 1000.0f, 0.707f, 0); + br_lpf2_.set(maxiBiquad::filterTypes::LOWPASS, 4000.0f, 0.707f, 0); + for (size_t i = 0; i < kBR_NBands; ++i) { + br_follower_[i].setAttack(10.f); + br_follower_[i].setRelease(100.f); + } +} + + +inline float logEnvelopeFast(float linearEnv) { + // -60 dBFS corresponds to a linear amplitude ratio of 10^(-60/20) = 10^(-3) = 0.001 + static constexpr float MIN_ENV = 1e-3f; // 10^(-60dB/20dB) = 0.001 linear + + // Mathematical derivation: + // We want to map linear amplitude [0.001, 1.0] to normalized range [0, 1] + // where 0.001 corresponds to -60 dBFS and 1.0 corresponds to 0 dBFS + // + // Using logarithmic mapping: output = (log2(input) - log2(min)) / (log2(max) - log2(min)) + // log2(0.001) = log2(10^-3) = -3 * log2(10) ≈ -9.966 + // log2(1.0) = 0 + // Range = 0 - (-9.966) = 9.966 + + static constexpr float LOG2_MIN_ENV = -3.0f * 3.321928095f; // -3 * log2(10) ≈ -9.966 + static constexpr float LOG2_MAX_ENV = 0.0f; // log2(1.0) = 0 + static constexpr float LOG_RANGE = LOG2_MAX_ENV - LOG2_MIN_ENV; // 9.966 + static constexpr float INV_LOG_RANGE = 1.0f / LOG_RANGE; // 1 / 9.966 ≈ 0.1003 + + // Clamp input to minimum envelope value + linearEnv = (linearEnv > MIN_ENV) ? linearEnv : MIN_ENV; + + // Precise logarithmic conversion + float log2_val = std::log2f(linearEnv); + + // Map to [0,1]: (log2_val - log2_min) / (log2_max - log2_min) + float y = (log2_val - LOG2_MIN_ENV) * INV_LOG_RANGE; + + // Clamp to [0,1] range (should be unnecessary given our math, but safety first) + y = (y > 1.0f) ? 1.0f : y; + y = (y < 0.0f) ? 0.0f : y; + + return y; +} + +SaxAnalysis::parameters_t AUDIO_FUNC(SaxAnalysis::Process)(const float x) { + parameters_t params = {}; + + // Pre-filter + float pre_filtered = common_hpf_.play(x); + + // Zero crossing detection + float zc_y = zc_lpf_.play(pre_filtered); + bool positive_zero_crossing = zc_detector_.zx(zc_y); + if (positive_zero_crossing) { + size_t median_elapsed_samples = zc_median_filter_.process(elapsed_samples_); + zc_buffer_.push(median_elapsed_samples); + elapsed_samples_ = 0; + } + // Convert zero crossing value to pitch + size_t zc_value = zc_buffer_[zc_buffer_.size() - 1]; + float pitch = 1.0f / (zc_value * one_over_sample_rate_); + // Map [100..800] hz to [0..1] range + float normalized_pitch; + if (pitch <= kPitchMin) { + normalized_pitch = 0.0f; + } else if (pitch >= kPitchMax) { + normalized_pitch = 1.0f; + } else { + normalized_pitch = (pitch - kPitchMin) * kPitchScale; + } + elapsed_samples_++; + // Aperiodicity calculation + float zc_copy[kZC_ZCBufferSize]; + // Copy contents of circular buffer to float array + for (size_t i = 0; i < kZC_ZCBufferSize; ++i) { + zc_copy[i] = static_cast(zc_buffer_[i]); + } + float mad = meanAbsoluteDeviation(zc_copy, kZC_ZCBufferSize); + // Scale MAD relative to median period + float medianPeriod = static_cast(zc_value); + float relativeMad = mad / (medianPeriod + 1.0f); // +1 to avoid div/0 + + // Typical relative MAD ranges from 0 to 0.3 for musical sounds + static constexpr float ONE_OVER_RELATIVE_MAD_MAX = 1/0.3f; + float normalizedAperiodicity = std::min(1.0f, relativeMad * ONE_OVER_RELATIVE_MAD_MAX); + + // Envelope follower + float ef_y = ef_follower_.play(pre_filtered); + // Convert to log + ef_y = logEnvelopeFast(ef_y); + float ef_d_dy = ef_y - ef_deriv_y_; + ef_deriv_y_ = ef_y; + // Half-wave rectify the derivative + if (ef_d_dy < 0) { + ef_d_dy = 0; + } + // Scale to [0..1] range + ef_d_dy = std::min(ef_d_dy * 10.0f, 1.0f); + + + // Brightness calculation + float br_low = br_lpf1_.play(pre_filtered); + float br_high = br_hpf2_.play(pre_filtered); + br_high = br_lpf2_.play(br_high); + + br_low = br_follower_[0].play(br_low); + br_high = br_follower_[1].play(br_high); + // brightness = high_band_energy / (low_band_energy + high_band_energy) + float br_energy = br_low + br_high; + if (br_energy > 0.0f) { + br_high /= br_energy; + } else { + br_high = 0.0f; // Avoid division by zero + } + + // Fill parameters + params.pitch = normalized_pitch; + params.aperiodicity = normalizedAperiodicity; + params.energy = ef_y; + params.attack = ef_d_dy; + params.brightness = br_high; + params.energy_crude = std::abs(x); + + return params; +} \ No newline at end of file diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/SaxAnalysis.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/SaxAnalysis.hpp new file mode 100644 index 0000000..f9eca21 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/SaxAnalysis.hpp @@ -0,0 +1,59 @@ +#ifndef __SAX_ANALYSIS_HPP__ +#define __SAX_ANALYSIS_HPP__ + +#include "../audio/AudioDriver.hpp" +#include "../utils/MedianFilter.h" +#include "../utils/CircularBuffer.hpp" +#include "maximilian.h" + +#include + + +class SaxAnalysis { + +public: + struct parameters_t { + float pitch; + float aperiodicity; + float energy; + float attack; + float brightness; + float energy_crude; + }; + static constexpr size_t kN_Params = sizeof(parameters_t) / sizeof(float); + + SaxAnalysis(const float sample_rate); + + parameters_t Process(const float x); + +protected: + const float sample_rate_; + const float one_over_sample_rate_; + // Pre-filter + maxiBiquad common_hpf_; + // Zero crossing + static constexpr size_t kZC_MedianFilterSize = 16; + static constexpr size_t kZC_ZCBufferSize = 32; + static constexpr float kPitchMin = 100.0f; + static constexpr float kPitchMax = 800.0f; + static constexpr float kPitchRange = kPitchMax - kPitchMin; // 700.0f + static constexpr float kPitchScale = 1.0f / kPitchRange; // 1/700 + maxiBiquad zc_lpf_; + maxiZeroCrossingDetector zc_detector_; + size_t elapsed_samples_; + MedianFilter zc_median_filter_; + CircularBuffer zc_buffer_; + // Envelope follower + maxiEnvelopeFollowerF ef_follower_; + float ef_deriv_y_; + // Brightness + static constexpr size_t kBR_NBands = 2; + maxiBiquad br_lpf1_; + maxiBiquad br_hpf2_; + maxiBiquad br_lpf2_; + maxiEnvelopeFollowerF br_follower_[kBR_NBands]; + +}; + + +#endif // __SAX_ANALYSIS_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/maxiPAF.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/maxiPAF.hpp new file mode 100644 index 0000000..319e06b --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/maxiPAF.hpp @@ -0,0 +1,309 @@ +#ifndef MAXIPAF_HPP +#define MAXIPAF_HPP + +#include "maximilian.h" + +constexpr size_t LOGTABSIZE = 10; +constexpr size_t LOGTABSIZEINV = 32 - LOGTABSIZE; +constexpr size_t TABSIZE = (1 << LOGTABSIZE); +constexpr size_t TABRANGE = 3; + + + +typedef struct _tabpoint +{ + float p_y; + float p_diff; +} t_tabpoint; + + +typedef struct _linenv +{ + double l_current; + double l_biginc; + float l_1overn; + float l_target; + float l_msectodsptick; + int l_ticks; +} t_linenv; + + +constexpr size_t UNITBIT32 = 1572864.f; /* 3*2^19 -- bit 32 has value 1 */ +constexpr float TABFRACSHIFT = (UNITBIT32/TABSIZE); + + +//little endian +#define HIOFFSET 1 +#define LOWOFFSET 0 + +#include +#define int32 u_int32_t + + +#define LINENV_RUN(linenv, current, incr) \ + if (linenv.l_ticks > 0) \ + { \ + current = linenv.l_current; \ + incr = linenv.l_biginc * linenv.l_1overn; \ + linenv.l_ticks--; \ + linenv.l_current += linenv.l_biginc; \ + } \ + else \ + { \ + linenv.l_current = current = linenv.l_target; \ + incr = 0; \ + } + + +constexpr float PAFA1 = 4 * (3.14159265/2); +constexpr float PAFA3 = ((64 * (2.5 - 3.14159265))); +constexpr float PAFA5 ((1024 * ((3.14159265/2) - 1.5))); + /* value of Cauchy distribution at TABRANGE */ +constexpr float CAUCHYVAL = (1./ (1. + TABRANGE * TABRANGE)); + /* first derivative of Cauchy distribution at TABRANGE */ +constexpr float CAUCHYSLOPE = ((-2. * TABRANGE) * CAUCHYVAL * CAUCHYVAL); +constexpr float ADDSQ = (- CAUCHYSLOPE / (2 * TABRANGE)); +constexpr float HALFSINELIM = (0.997 * TABRANGE); +constexpr float TABRANGERCPR = 1.f/TABRANGE; + +static t_tabpoint __not_in_flash("paf") paf_gauss[TABSIZE]; +static t_tabpoint __not_in_flash("paf") paf_cauchy[TABSIZE]; +static bool tabsGenerated = false; + + +class maxiPAFOperator { +public: + + + void linenv_init(t_linenv &l) + { + l.l_current = l.l_biginc = 0; + l.l_1overn = l.l_target = l.l_msectodsptick = 0; + l.l_ticks = 0; + } + + + void init() + { + int i; + if (!tabsGenerated) { + const float CAUCHYFAKEAT3 = + (CAUCHYVAL + ADDSQ * TABRANGE * TABRANGE); + const float CAUCHYRESIZE = (1./ (1. - CAUCHYFAKEAT3)); + for (i = 0; i <= TABSIZE; i++) + { + float f = i * ((float)TABRANGE/(float)TABSIZE); + float gauss = expf(-f * f); + float cauchygenuine = 1.f / (1.f + f * f); + float cauchyfake = cauchygenuine + ADDSQ * f * f; + float cauchyrenorm = (cauchyfake - 1.) * CAUCHYRESIZE + 1.; + if (i != TABSIZE) + { + paf_gauss[i].p_y = gauss; + paf_cauchy[i].p_y = cauchyrenorm; + /* post("%f", cauchyrenorm); */ + } + if (i != 0) + { + paf_gauss[i-1].p_diff = gauss - paf_gauss[i-1].p_y; + paf_cauchy[i-1].p_diff = cauchyrenorm - paf_cauchy[i-1].p_y; + } + } + } + // linenv_init(x_freqenv); + // linenv_init(x_cfenv); + // linenv_init(x_bwenv); + // linenv_init(x_ampenv); + // linenv_init(x_vibenv); + // linenv_init(x_vfrenv); + // linenv_init(x_shiftenv); + // x_freqenv.l_target = x_freqenv.l_current = 1.0; + //TODO: use correct sample rate + x_isr = maxiSettings::one_over_sampleRate; //1.f/44100.f; + x_held_freq = 1.f; + x_held_intcar = 0.f; + x_held_fraccar = 0.f; + x_held_bwquotient = 0.f; + x_phase = 0.; + x_shiftphase = 0.; + x_vibphase = 0.; + x_triggerme = 0; + } + + void linenv_setsr(t_linenv &l, const float sr, const int vecsize) + { + l.l_msectodsptick = sr / (1000.f * ((float)vecsize)); + l.l_1overn = 1.f/(float)vecsize; + } + + void setsr(const float sr, const int vecsize) + { + x_isr = 1.f/sr; + // linenv_setsr(x_freqenv, sr, vecsize); + // linenv_setsr(x_cfenv, sr, vecsize); + // linenv_setsr(x_bwenv, sr, vecsize); + // linenv_setsr(x_ampenv, sr, vecsize); + // linenv_setsr(x_vibenv, sr, vecsize); + // linenv_setsr(x_vfrenv, sr, vecsize); + // linenv_setsr(x_shiftenv, sr, vecsize); + } + + inline void linenv_set(t_linenv &l, const float target, const long timdel) + { + if (timdel > 0) + { + l.l_ticks = ((float)timdel) * l.l_msectodsptick; + if (!l.l_ticks) l.l_ticks = 1; + l.l_target = target; + l.l_biginc = (l.l_target - l.l_current)/l.l_ticks; + } + else + { + l.l_ticks = 0; + l.l_current = l.l_target = target; + l.l_biginc = 0; + } + } + + + inline void phase(const float mainphase, const float shiftphase, + const float vibphase) + { + x_phase = mainphase; + x_shiftphase = shiftphase; + x_vibphase = vibphase; + x_triggerme = 1; + } + + void __force_inline play(float *out1, int n, float freqval, const float cfval, const float bwval, + const float vibval, + const float vfrval, + float shiftval, + const bool x_cauchy=false) + { + float bwquotient, bwqincr; + + // float held_freq = x_held_freq; + float held_intcar = x_held_intcar; + float held_fraccar = x_held_fraccar; + float held_bwquotient = x_held_bwquotient; + float sinvib, vibphase; + + t_tabpoint *paf_table = (x_cauchy ? paf_cauchy : paf_gauss); + + x_shiftphase -= floorf(x_shiftphase); + + /* fake line envelope for quotient of bw and frequency */ + bwquotient = bwval/freqval; + + float future_vib_phase = x_vibphase + n * x_isr * vfrval; + future_vib_phase = future_vib_phase - floorf(future_vib_phase); + x_vibphase = vibphase = future_vib_phase; + + if (vibphase > 0.5f) + sinvib = 1.0f - 16.0f * (0.75f-vibphase) * (0.75f - vibphase); + else sinvib = -1.0f + 16.0f * (0.25f-vibphase) * (0.25f - vibphase); + + freqval = freqval * (1.0f + vibval * sinvib); + + const float inv_freqval = 1.0f / freqval; + + shiftval *= x_isr; + + if (x_phase ==0.f || x_triggerme) + { + float cf_over_freq = cfval * inv_freqval; + x_held_freq = freqval * x_isr; + held_intcar = (float)((int)cf_over_freq); + held_fraccar = cf_over_freq - held_intcar; + held_bwquotient = bwquotient; + x_triggerme = 0; + } + while (n--) + { + float g,halfsine; + + float new_x_phase = x_phase + x_held_freq; + new_x_phase = new_x_phase - floorf(new_x_phase); + float fracnewphase = new_x_phase; + + const float fphase = 2.0f * ((fracnewphase)) - 1.0f; + if (new_x_phase < x_phase) [[unlikely]] + { + float cf_over_freq = cfval * inv_freqval; + x_held_freq = freqval * x_isr; + held_intcar = floorf(cf_over_freq); + held_fraccar = cf_over_freq - held_intcar; + held_bwquotient = bwquotient; + } + + x_phase = new_x_phase; + + float fcarphase1 = fracnewphase * held_intcar + x_shiftphase; + fcarphase1 -= floorf(fcarphase1); + + float fcarphase2 = fcarphase1 + fracnewphase; + fcarphase2 -= floorf(fcarphase2); + + x_shiftphase += shiftval; + + g = (fcarphase1 > 0.5f) ? (fcarphase1 - 0.75f) : (0.25f - fcarphase1); + + const float g2a = g * g; + const float g3a = g * g2a; + const float cosine1 = g * PAFA1 + g3a * PAFA3 + g2a * g3a * PAFA5; + + g = (fcarphase2 > 0.5f) ? (fcarphase2 - 0.75f) : (0.25f - fcarphase2); + const float g2b = g * g; + const float g3b = g * g2b; + const float cosine2 = g * PAFA1 + g3b * PAFA3 + g2b * g3b * PAFA5; + + const float carrier = cosine1 + held_fraccar * (cosine2-cosine1); + + halfsine = held_bwquotient * (1.0f - fphase * fphase); + + halfsine = fminf(halfsine, HALFSINELIM); + + constexpr float TABSCALE = (TABSIZE * TABRANGERCPR); + + float halfsineScaled = halfsine * TABSCALE; + + // Extract integer and fractional parts + int table_index = static_cast(halfsineScaled); + const float tabfrac = (halfsineScaled) - table_index; + + // Bounds check + table_index = min(TABSIZE-2, table_index); + table_index = max(0, table_index); + + // Linear interpolation + const t_tabpoint *p = paf_table + table_index; + const float mod = carrier * (p->p_y + tabfrac * p->p_diff); + + *out1++ = mod; + } + // x_held_freq = held_freq; + x_held_intcar = held_intcar; + x_held_fraccar = held_fraccar; + x_held_bwquotient = held_bwquotient; + } + + + +private: + + + float x_isr; + float x_held_freq; + float x_held_intcar; + float x_held_fraccar; + float x_held_bwquotient; + float x_phase; + float x_shiftphase; + float x_vibphase; + int x_triggerme; + +}; + + +#endif // MAXIPAF_HPP diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/maximilian.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/maximilian.cpp new file mode 100644 index 0000000..0ddb527 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/maximilian.cpp @@ -0,0 +1,1113 @@ + +/* + * maximilian.cpp + * platform independent synthesis library using portaudio or rtaudio + * + * Created by Mick Grierson on 29/12/2009. + * Copyright 2009 Mick Grierson & Strangeloop Limited. All rights reserved. + * Thanks to the Goldsmiths Creative Computing Team. + * Special thanks to Arturo Castro for the PortAudio implementation. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#include "maximilian.h" +// #include "math.h" +// #include +// extern "C" { +// #include +// #include +// } + +#include + +//This used to be important for dealing with multichannel playback +float chandiv= 1; + +maxiSettings::maxiSettings() {} + +size_t maxiSettings::sampleRate = 48000; // Match kSampleRate in AudioDriver.hpp +float maxiSettings::one_over_sampleRate = 1.f / 48000.f; +size_t maxiSettings::channels = 2; +size_t maxiSettings::bufferSize = 1024; + + +//this is a 514-point sinewave table that has many uses. + +// This is a transition table that helps with bandlimited oscs. + +//This is a lookup table for converting midi to frequency +float mtofarray[129]={0, 8.661957, 9.177024, 9.722718, 10.3, 10.913383, 11.562325, 12.25, 12.978271, 13.75, 14.567617, 15.433853, 16.351599, 17.323914, 18.354048, 19.445436, 20.601723, 21.826765, 23.124651, 24.5, 25.956543, 27.5, 29.135235, 30.867706, 32.703197, 34.647827, 36.708096, 38.890873, 41.203445, 43.65353, 46.249302, 49., 51.913086, 55., 58.27047, 61.735413, 65.406395, 69.295654, 73.416191, 77.781746, 82.406891, 87.30706, 92.498604, 97.998856, 103.826172, 110., 116.540939, 123.470825, 130.81279, 138.591309, 146.832382, 155.563492, 164.813782, 174.61412, 184.997208, 195.997711, 207.652344, 220., 233.081879, 246.94165, 261.62558, 277.182617,293.664764, 311.126984, 329.627563, 349.228241, 369.994415, 391.995422, 415.304688, 440., 466.163757, 493.883301, 523.25116, 554.365234, 587.329529, 622.253967, 659.255127, 698.456482, 739.988831, 783.990845, 830.609375, 880., 932.327515, 987.766602, 1046.502319, 1108.730469, 1174.659058, 1244.507935, 1318.510254, 1396.912964, 1479.977661, 1567.981689, 1661.21875, 1760., 1864.655029, 1975.533203, 2093.004639, 2217.460938, 2349.318115, 2489.015869, 2637.020508, 2793.825928, 2959.955322, 3135.963379, 3322.4375, 3520., 3729.31, 3951.066406, 4186.009277, 4434.921875, 4698.63623, 4978.031738, 5274.041016, 5587.651855, 5919.910645, 6271.926758, 6644.875, 7040., 7458.620117, 7902.132812, 8372.018555, 8869.84375, 9397.272461, 9956.063477, 10548.082031, 11175.303711, 11839.821289, 12543.853516, 13289.75}; + +void setup();//use this to do any initialisation if you want. + +void play(float *channels);//run dac! + +maxiOsc::maxiOsc(){ + //When you create an oscillator, the constructor sets the phase of the oscillator to 0. + phase = 0.0; + constant_by_one_over_sr_ = 512.f * maxiSettings::one_over_sampleRate; +} + +void maxiOsc::UpdateParams(void) +{ + constant_by_one_over_sr_ = 512.f * maxiSettings::one_over_sampleRate; +} + +float maxiOsc::noise() { + //White Noise + //always the same unless you seed it. + float r = rand()/(float)RAND_MAX; + output=r*2-1; + return(output); +} + +void maxiOsc::phaseReset(float phaseIn) { + //This allows you to set the phase of the oscillator to anything you like. + phase=phaseIn; + +} + +// float maxiOsc::sinewave(float frequency) { +// //This is a sinewave oscillator +// output=sinf (phase*(TWOPI)); +// phase += maxiSettings::one_over_sampleRate * frequency; +// if ( phase >= 1.0 ) phase -= 1.0; +// return(output); + +// } + +float maxiOsc::sinebuf4(float frequency) { + //This is a sinewave oscillator that uses 4 point interpolation on a 514 point buffer + float remainder; + float a,b,c,d,a1,a2,a3; + phase += 512./(maxiSettings::sampleRate/(frequency)); + if ( phase >= 511 ) phase -=512; + remainder = phase - floor(phase); + + if (phase==0) { + a=sineBuffer[(long) 512]; + b=sineBuffer[(long) phase]; + c=sineBuffer[(long) phase+1]; + d=sineBuffer[(long) phase+2]; + + } else { + a=sineBuffer[(long) phase-1]; + b=sineBuffer[(long) phase]; + c=sineBuffer[(long) phase+1]; + d=sineBuffer[(long) phase+2]; + + } + + a1 = 0.5f * (c - a); + a2 = a - 2.5 * b + 2.f * c - 0.5f * d; + a3 = 0.5f * (d - a) + 1.5f * (b - c); + output = float (((a3 * remainder + a2) * remainder + a1) * remainder + b); + return(output); +} + + +float maxiOsc::coswave(float frequency) { + //This is a cosine oscillator + output=cos (phase*(TWOPI)); + if ( phase >= 1.0 ) phase -= 1.0; + phase += (1./(maxiSettings::sampleRate/(frequency))); + return(output); + +} + +float maxiOsc::phasor(float frequency) { + //This produces a floating point linear ramp between 0 and 1 at the desired frequency + output=phase; + if ( phase >= 1.0 ) phase -= 1.0; + phase += (1./(maxiSettings::sampleRate/(frequency))); + return(output); +} + +// float maxiOsc::square(float frequency) { +// //This is a square wave +// if (phase<0.5) output=-1; +// if (phase>0.5) output=1; +// if ( phase >= 1.0 ) phase -= 1.0; +// phase += (1./(maxiSettings::sampleRate/(frequency))); +// return(output); +// } + +float maxiOsc::pulse(float frequency, float duty) { + //This is a pulse generator that creates a signal between -1 and 1. + if (duty<0.) duty=0; + if (duty>1.) duty=1; + if ( phase >= 1.0 ) phase -= 1.0; + phase += (1./(maxiSettings::sampleRate/(frequency))); + if (phaseduty) output=1.; + return(output); +} +float maxiOsc::impulse(float frequency) { + //this is an impulse generator + if ( phase >= 1.0 ) phase -= 1.0; + float phaseInc = (1./(maxiSettings::sampleRate/(frequency))); + float output = phase < phaseInc ? 1.0 : 0.0; + phase += phaseInc; + return output; +} + +float maxiOsc::phasorBetween(float frequency, float startphase, float endphase) { + //This is a phasor that takes a value for the start and end of the ramp. + output=phase; + if (phase= endphase ) phase = startphase; + phase += ((endphase-startphase)/(maxiSettings::sampleRate/(frequency))); + return(output); +} + + +float maxiOsc::saw(float frequency) { + //Sawtooth generator. This is like a phasor but goes between -1 and 1 + output=phase; + if ( phase >= 1.0 ) phase -= 2.0; + phase += (1./(maxiSettings::sampleRate/(frequency))) * 2.0; + return(output); + +} + +// float maxiOsc::sawn(float frequency) { +// //Bandlimited sawtooth generator. Woohoo. +// if ( phase >= 0.5 ) phase -= 1.0; +// phase += (1./(maxiSettings::sampleRate/(frequency))); +// float temp=(8820.22/frequency)*phase; +// if (temp<-0.5) { +// temp=-0.5; +// } +// if (temp>0.5) { +// temp=0.5; +// } +// temp*=1000.0f; +// temp+=500.0f; +// float remainder = temp - floor(temp); +// output = (float) ((1.0f-remainder) * transition[(long)temp] + remainder * transition[1+(long)temp]) - phase; +// return(output); + +// } + + +float maxiOsc::triangle(float frequency) { + float output; + if ( phase >= 1.0f ) phase -= 1.0; + phase += maxiSettings::one_over_sampleRate * frequency; + if (phase <= 0.5f ) { + output =(phase - 0.25f) * 4.f; + } else { + output =((1.0f-phase) - 0.25f) * 4.f; + } + return output; +} + + + +//I particularly like these. cutoff between 0 and 1 +float maxiFilter::lopass(float input, float cutoff) { + output=outputs[0] + cutoff*(input-outputs[0]); + outputs[0]=output; + return(output); +} + +//as above +float maxiFilter::hipass(float input, float cutoff) { + output=input-(outputs[0] + cutoff*(input-outputs[0])); + outputs[0]=output; + return(output); +} + + +//This works a bit. Needs attention. +float maxiFilter::bandpass(float input,float cutoff1, float resonance) { + cutoff=cutoff1; + if (cutoff>(maxiSettings::sampleRate*0.5)) cutoff=(maxiSettings::sampleRate*0.5); + if (resonance>=1.) resonance=0.999999; + z=cos(TWOPI*cutoff/maxiSettings::sampleRate); + inputs[0] = (1-resonance)*(sqrt(resonance*(resonance-4.0*pow(z,2.0)+2.0)+1)); + inputs[1] = 2*z*resonance; + inputs[2] = pow((resonance*-1),2); + + output=inputs[0]*input+inputs[1]*outputs[1]+inputs[2]*outputs[2]; + outputs[2]=outputs[1]; + outputs[1]=output; + return(output); +} + +//stereo bus +void maxiMix::stereo(float input,std::vector&two,float x) { + if (x>1) x=1; + if (x<0) x=0; + two[0]=input*sqrt(1.0-x); + two[1]=input*sqrt(x); +// return two; +} + +//quad bus +void maxiMix::quad(float input,std::vector& four,float x,float y) { + if (x>1) x=1; + if (x<0) x=0; + if (y>1) y=1; + if (y<0) y=0; + four[0]=input*sqrt((1.0-x)*y); + four[1]=input*sqrt((1.0-x)*(1.0-y)); + four[2]=input*sqrt(x*y); + four[3]=input*sqrt(x*(1.0-y)); +// return(four); +} + +//ambisonic bus +void maxiMix::ambisonic(float input,std::vector&eight,float x,float y,float z) { + if (x>1) x=1; + if (x<0) x=0; + if (y>1) y=1; + if (y<0) y=0; + if (z>1) y=1; + if (z<0) y=0; + eight[0]=input*(sqrt((1.0-x)*y)*1.0-z); + eight[1]=input*(sqrt((1.0-x)*(1.0-y))*1.0-z); + eight[2]=input*(sqrt(x*y)*1.0-z); + eight[3]=input*(sqrt(x*(1.0-y))*1.0-z); + eight[4]=input*(sqrt((1.0-x)*y)*z); + eight[5]=input*(sqrt((1.0-x)*(1.0-y))*z); + eight[6]=input*sqrt((x*y)*z); + eight[7]=input*sqrt((x*(1.0-y))*z); +} +// -------------------------------------------------------------------------------- +// MAXI_SAMPLE + + +maxiSample::maxiSample():position(0), recordPosition(0), myChannels(1), mySampleRate(maxiSettings::sampleRate) {}; + + + +// ------------------------- + +//This sets the playback position to the start of a sample +void maxiSample::trigger() { + position = 0; + recordPosition = 0; +} + + +// string maxiSample::getSummary() +// { +// std::stringstream ss; +// ss << " Format: " << myFormat << "\n Channels: " << myChannels << "\n SampleRate: " << mySampleRate << +// "\n ByteRate: " << myByteRate << "\n BlockAlign: " << myBlockAlign << "\n BitsPerSample: " << myBitsPerSample; +// return ss.str(); +// } + + +//This plays back at the correct speed. Always loops. +float maxiSample::play() { + output = F64_ARRAY_AT(amplitudes,(long)position); + position++; + if ((long) position >= F64_ARRAY_SIZE(amplitudes)) { + position = 0; + } + return output; +} + +void maxiSample::setPosition(float newPos) { + position = maxiMap::clamp(newPos, 0.0, 1.0) * F64_ARRAY_SIZE(amplitudes); +} + +float maxiSample::playWithPhasor(float pha) { + size_t amplen = F64_ARRAY_SIZE(amplitudes); + //clamping + if (pha > 1) pha=1; + if (pha < 0) pha=0; + float pos = pha * amplen * 0.99999999999999; + + if (phasorFirst) { + phasorFirst=0; + phasorPrev = pos; + } + + size_t pos1 = static_cast(round(phasorPrev)); + size_t pos2 = static_cast(round(pos)); + if (pos1==pos2) { + if (pos >= phasorPrev) { + pos2++; + }else{ + pos1--; + } + } + + //constraints / wrapping + if (pos2 >= amplen) { + pos2=0; + } + if (pos1 >= amplen) { + pos1=0; + } + if (pos1 < 0) { + pos1 = amplen-1; + } + if (pos2 < 0) { + pos2 = amplen-1; + } + + //get interpolation coeffs + float q1,q2; + if (pos2 > pos1) { + float dist = pos2-pos1; + if (dist == 0) + q1 = 0; + else + q1 = (pos-pos1) / dist; + }else { + float dist = (amplen - pos1) + pos2; + if (dist==0) + q1 = 0; + else{ + if (pos > pos1) { + q1 = (pos - pos1) / dist; + }else{ + q1 = ((amplen - pos1) + pos) / dist; + } + } + } + q2 = 1 - q1; + + output = (q1 * F64_ARRAY_AT(amplitudes,pos1) + + q2 * F64_ARRAY_AT(amplitudes,pos2)); + phasorPrev = pos; + + return output; +} + + + + + +// placeholder +float maxiSample::playAtSpeedBetweenPoints(float frequency, float start, float end) { + return playAtSpeedBetweenPointsFromPos(frequency, start, end, position); +} + +//This allows you to say how often a second you want a specific chunk of audio to play +float maxiSample::playAtSpeedBetweenPointsFromPos(float frequency, float start, float end, float pos) { + float remainder; + size_t amplen = F64_ARRAY_SIZE(amplitudes); + if (end>=amplen) end=amplen-1; + long a,b; + + if (frequency >0.) { + if (pos= end ) pos = start; + pos += ((end-start)/((maxiSettings::sampleRate)/(frequency*chandiv))); + remainder = pos - floor(pos); + long posl = floor(pos); + if (posl+1=0) { + a=posl-1; + } + else { + a=0; + } + if (posl-2>=0) { + b=posl-2; + } + else { + b=0; + } + output = ((-1-remainder) * F64_ARRAY_AT(amplitudes,a) + + remainder * F64_ARRAY_AT(amplitudes,b));//linear interpolation + } + + return(output); +} + + +//Same as above. better cubic inerpolation. Cobbled together from various (pd externals, yehar, other places). +float maxiSample::play4(float frequency, float start, float end) { + float remainder; + float a,b,c,d,a1,a2,a3; + if (frequency >0.) { + if (position= end ) position = start; + position += ((end-start)/(maxiSettings::sampleRate/(frequency*chandiv))); + remainder = position - floor(position); + if (position>0) { + a=F64_ARRAY_AT(amplitudes,(int)(floor(position))-1); + + } else { + a=F64_ARRAY_AT(amplitudes,0); + + } + + b=F64_ARRAY_AT(amplitudes,(long) position); + if (positionstart && position < end-1) { + a=F64_ARRAY_AT(amplitudes,(long) position+1); + + } else { + a=F64_ARRAY_AT(amplitudes,0); + + } + + b=F64_ARRAY_AT(amplitudes,(long) position); + if (position>start) { + c=F64_ARRAY_AT(amplitudes,(long) position-1); + + } else { + c=F64_ARRAY_AT(amplitudes,0); + + } + if (position>start+1) { + d=F64_ARRAY_AT(amplitudes,(long) position-2); + + } else { + d=F64_ARRAY_AT(amplitudes,0); + } + a1 = 0.5f * (c - a); + a2 = a - 2.5 * b + 2.f * c - 0.5f * d; + a3 = 0.5f * (d - a) + 1.5f * (b - c); + output = (((a3 * remainder + a2) * -remainder + a1) * -remainder + b); + + } + + return(output); +} + + +//start end and points are between 0 and 1 +float maxiSample::playLoop(float start, float end) { + position++; + auto sampleLength = F64_ARRAY_SIZE(amplitudes); + if (position < sampleLength * start) position = sampleLength * start; + if ((long) position >= sampleLength * end) position = sampleLength * start; + output = F64_ARRAY_AT(amplitudes,(long)position); + return output; +} + +float maxiSample::playUntil(float end) { + position++; + if (end > 1.0) end = 1.0; + if ((long) position 1.0) end = 1.0; + if ((long) position= F64_ARRAY_SIZE(amplitudes)) { + position -= F64_ARRAY_SIZE(amplitudes); + } + return output; +} + + +//As above but looping +float maxiSample::play(float speed) { + float remainder; + long a,b; + position=position+((speed*chandiv)/(maxiSettings::sampleRate/mySampleRate)); + if (speed >=0) { + + if ((long) position>=amplitudes.size()-1) position=1; + remainder = position - floor(position); + if (position+1=0) { + a=position-1; + + } + else { + a=0; + } + if (position-2>=0) { + b=position-2; + } + else { + b=0; + } + output = ((-1-remainder) * amplitudes[a] + remainder * amplitudes[b]);//linear interpolation + } + return(output); +} + + + +void maxiSample::normalise(float maxLevel) { + float maxValue = 0; + for(int i=0; i < F64_ARRAY_SIZE(amplitudes); i++) { + if (abs(F64_ARRAY_AT(amplitudes,i)) > maxValue) { + maxValue = abs(F64_ARRAY_AT(amplitudes,i)); + } + } + float scale = maxLevel / maxValue; + for(int i=0; i < F64_ARRAY_SIZE(amplitudes); i++) { + F64_ARRAY_AT(amplitudes,i) = round(scale * F64_ARRAY_AT(amplitudes,i)); + } +} + +void maxiSample::autoTrim(float alpha, float threshold, bool trimStart, bool trimEnd) { + + size_t startMarker=0; + if(trimStart) { + maxiLagExp startLag(alpha, 0); + while(startMarker < F64_ARRAY_SIZE(amplitudes)) { + startLag.addSample(abs(F64_ARRAY_AT(amplitudes,startMarker))); + if (startLag.value() > threshold) { + break; + } + startMarker++; + } + } + + int endMarker = F64_ARRAY_SIZE(amplitudes)-1; + if(trimEnd) { + maxiLagExp endLag(alpha, 0); + while(endMarker > 0) { + endLag.addSample(abs(F64_ARRAY_AT(amplitudes,endMarker))); + if (endLag.value() > threshold) { + break; + } + endMarker--; + } + } + size_t newLength = endMarker - startMarker; + if (newLength > 0) { + DECLARE_F64_ARRAY(newAmps) + F64_ARRAY_SETFROM(amplitudes, newAmps); + // vector newAmps(newLength); + for(int i=0; i < newLength; i++) { + newAmps[i] = F64_ARRAY_AT(amplitudes,i+startMarker); + } + + // amplitudes = newAmps; + F64_ARRAY_SETFROM(newAmps, amplitudes); + position=0; + recordPosition=0; + //envelope the start + size_t fadeSize = 100; + if (F64_ARRAY_SIZE(amplitudes) > fadeSize) + fadeSize = F64_ARRAY_SIZE(amplitudes); + for(int i=0; i < fadeSize; i++) { + float factor = i / (float) fadeSize; + F64_ARRAY_AT(amplitudes,i) = round(F64_ARRAY_AT(amplitudes,i) * factor); + F64_ARRAY_AT(amplitudes,F64_ARRAY_SIZE(amplitudes) - 1 - i) = round(F64_ARRAY_AT(amplitudes,F64_ARRAY_SIZE(amplitudes) - 1 - i) * factor); + } + } +} + + + + + +// /* OK this compressor and gate are now ready to use. The envelopes, like all the envelopes in this recent update, use stupid algorithms for +// incrementing - consequently a long attack is something like 0.0001 and a long release is like 0.9999. +// Annoyingly, a short attack is 0.1, and a short release is 0.99. I'll sort this out laters */ + +// float maxiDyn::gate(float input, float threshold, long holdtime, float attack, float release) { + +// if (fabs(input)>threshold && attackphase!=1){ +// holdcount=0; +// releasephase=0; +// attackphase=1; +// if(amplitude==0) amplitude=0.01; +// } + +// if (attackphase==1 && amplitude<1) { +// amplitude*=(1+attack); +// output=input*amplitude; +// } + +// if (amplitude>=1) { +// attackphase=0; +// holdphase=1; +// } + +// if (holdcount0.) { +// output=input*(amplitude*=release); + +// } + +// return output; +// } + + +// float maxiDyn::compressor(float input, float ratio, float threshold, float attack, float release) { + +// if (fabs(input)>threshold && attackphase!=1){ +// holdcount=0; +// releasephase=0; +// attackphase=1; +// if(currentRatio==0) currentRatio=ratio; +// } + +// if (attackphase==1 && currentRatio=ratio-1) { +// attackphase=0; +// releasephase=1; +// } + +// if (releasephase==1 && currentRatio>0.) { +// currentRatio*=release; +// } + +// if (input>0.) { +// output = input/(1.+currentRatio); +// } else { +// output = input/(1.+currentRatio); +// } + +// return output*(1+log(ratio)); +// } + +// float maxiDyn::compress(float input) { + +// if (fabs(input)>threshold && attackphase!=1){ +// holdcount=0; +// releasephase=0; +// attackphase=1; +// if(currentRatio==0) currentRatio=ratio; +// } + +// if (attackphase==1 && currentRatio=ratio-1) { +// attackphase=0; +// releasephase=1; +// } + +// if (releasephase==1 && currentRatio>0.) { +// currentRatio*=release; +// } + +// if (input>0.) { +// output = input/(1.+currentRatio); +// } else { +// output = input/(1.+currentRatio); +// } + +// return output*(1+log(ratio)); +// } + +// void maxiDyn::setAttack(float attackMS) { +// attack = pow( 0.01, 1.0 / ( attackMS * maxiSettings::sampleRate * 0.001 ) ); +// } + +// void maxiDyn::setRelease(float releaseMS) { +// release = pow( 0.01, 1.0 / ( releaseMS * maxiSettings::sampleRate * 0.001 ) ); +// } + +// void maxiDyn::setThreshold(float thresholdI) { +// threshold = thresholdI; +// } + +// void maxiDyn::setRatio(float ratioF) { +// ratio = ratioF; +// } + +// /* Lots of people struggle with the envelope generators so here's a new easy one. +// It takes mental numbers for attack and release tho. Basically, they're exponentials. +// I'll map them out later so that it's a bit more intuitive */ +// float maxiEnv::ar(float input, float attack, float release, long holdtime, int trigger) { + +// if (trigger==1 && attackphase!=1 && holdphase!=1){ +// holdcount=0; +// releasephase=0; +// attackphase=1; +// } + +// if (attackphase==1) { +// amplitude+=(1*attack); +// output=input*amplitude; +// } + +// if (amplitude>=1) { +// amplitude=1; +// attackphase=0; +// holdphase=1; +// } + +// if (holdcount0.) { +// output=input*(amplitude*=release); + +// } + +// return output; +// } + +// /* adsr. It's not bad, very simple to use*/ + +// float maxiEnv::adsr(float input, float attack, float decay, float sustain, float release, long holdtime, int trigger) { + +// if (trigger==1 && attackphase!=1 && holdphase!=1 && decayphase!=1){ +// holdcount=0; +// decayphase=0; +// sustainphase=0; +// releasephase=0; +// attackphase=1; +// } + +// if (attackphase==1) { +// releasephase=0; +// amplitude+=(1*attack); +// output=input*amplitude; + +// if (amplitude>=1) { +// amplitude=1; +// attackphase=0; +// decayphase=1; +// } +// } + + +// if (decayphase==1) { +// output=input*(amplitude*=decay); +// if (amplitude<=sustain) { +// decayphase=0; +// holdphase=1; +// } +// } + +// if (holdcount=holdtime && trigger==1) { +// output=input*amplitude; +// } + +// if (holdcount>=holdtime && trigger!=1) { +// holdphase=0; +// releasephase=1; +// } + +// if (releasephase==1 && amplitude>0.) { +// output=input*(amplitude*=release); + +// } + +// return output; +// } + +// float maxiEnv::adsr(float input, int trigger) { + +// if (trigger==1 && attackphase!=1 && holdphase!=1 && decayphase!=1){ +// holdcount=0; +// decayphase=0; +// sustainphase=0; +// releasephase=0; +// attackphase=1; +// } + +// if (attackphase==1) { +// releasephase=0; +// amplitude+=(1*attack); +// output=input*amplitude; + +// if (amplitude>=1) { +// amplitude=1; +// attackphase=0; +// decayphase=1; +// } +// } + + +// if (decayphase==1) { +// output=input*(amplitude*=decay); +// if (amplitude<=sustain) { +// decayphase=0; +// holdphase=1; +// } +// } + +// if (holdcount=holdtime && trigger==1) { +// output=input*amplitude; +// } + +// if (holdcount>=holdtime && trigger!=1) { +// holdphase=0; +// releasephase=1; +// } + +// if (releasephase==1 && amplitude>0.) { +// output=input*(amplitude*=release); + +// } + +// return output; +// } + + +// void maxiEnv::setRelease(float releaseMS) { +// release = pow( 0.01, 1.0 / ( releaseMS * maxiSettings::sampleRate * 0.001 ) ); +// } + + +// void maxiEnv::setDecay(float decayMS) { +// decay = pow( 0.01, 1.0 / ( decayMS * maxiSettings::sampleRate * 0.001 ) ); +// } + +// //old method - depreacated +// void maxiEnv::setAttack(float attackMS) { +// attack = 1-pow( 0.01, 1.0 / ( attackMS * maxiSettings::sampleRate * 0.001 ) ); +// } + +// //new method - in MS + +// void maxiEnv::setAttackMS(float attackMS) { +// attack = 1.0 / (attackMS /1000.0 * maxiSettings::sampleRate); +// } + +// //// + + +// void maxiEnv::setSustain(float sustainL) { +// sustain = sustainL; +// } + + + +// float convert::mtof(int midinote) { +// return mtofarray[midinote]; +// } + + +// template<> void maxiEnvelopeFollower::setAttack(float attackMS) { +// attack = pow( 0.01, 1.0 / ( attackMS * maxiSettings::sampleRate * 0.001 ) ); +// } + +// template<> void maxiEnvelopeFollower::setRelease(float releaseMS) { +// release = pow( 0.01, 1.0 / ( releaseMS * maxiSettings::sampleRate * 0.001 ) ); +// } + + +//there are a bunch of constructors here. it's a quirk of CHEERP that constructors need to be defined in the cpp unless completely header only +maxiRatioSeq::maxiRatioSeq() {} +maxiTrigger::maxiTrigger() {} +maxiMap::maxiMap() {} +maxiFilter::maxiFilter():x(0.0), y(0.0), z(0.0), c(0.0) {} +maxiZeroCrossingDetector::maxiZeroCrossingDetector() {} +maxiIndex::maxiIndex() {} +maxiZXToPulse::maxiZXToPulse() {} +maxiStep::maxiStep() {} +maxiSelect::maxiSelect() {} +maxiSelectX::maxiSelectX() {} +maxiEnvGen::maxiEnvGen() {} +maxiRingBuf::maxiRingBuf() {} +maxiPoll::maxiPoll() {} +maxiRMS::maxiRMS() {} +maxiZeroCrossingRate::maxiZeroCrossingRate() { + buf.setup(maxiSettings::sampleRate); +} \ No newline at end of file diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/maximilian.h b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/maximilian.h new file mode 100644 index 0000000..8235493 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/maximilian.h @@ -0,0 +1,3888 @@ +/* +* platform independent synthesis library using portaudio or rtaudio + * maximilian.h + * + * Created by Mick Grierson on 29/12/2009. + * Copyright 2009 Mick Grierson & Strangeloop Limited. All rights reserved. + * Thanks to the Goldsmiths Creative Computing Team. + * Special thanks to Arturo Castro for the PortAudio implementation. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef MAXIMILIAN_H +#define MAXIMILIAN_H + +#define MAXIMILIAN_RT_AUDIO + +#include +#include +#include + +#include "../PicoDefs.hpp" +#include "../utils/MedianFilter.h" +#include "../utils/CircularBuffer.hpp" + + + +//using namespace std; + +#ifndef PI +#define PI 3.1415926f +#endif +#define TWOPI 6.2831853f + +#define MAXITYPE float + +#define LOG(x) + +#define USE_STRINGS + +#ifdef USE_STRINGS +#include +#define STRINGCLASS std::string +#endif + + +#define DOUBLEARRAY_REF std::vector & +#define DOUBLEARRAY std::vector +#define NORMALISE_ARRAY_TYPE(invar, outvar) std::vector outvar = std::vector(invar.begin(), invar.end()); //emplace into new variable +#define DECLARE_F64_ARRAY(x) std::vector x; +#define F64_ARRAY_SIZE(x) x.size() +#define F64_ARRAY_SETFROM(to,from) to = from; +#define F64_ARRAY_CLEAR(x) x.clear(); +#define F64_ARRAY_AT(x,i) x[i] +// #define LOG(x) cout << x; +#define F64_ARRAY_CREATE(len) std::vector(len); +#define F64_ARRAY_FILL(x, val) std::fill(x.begin(), x.end(), val); + +const float __not_in_flash("transtable") transition[1001]={-0.500003,-0.500003,-0.500023,-0.500063,-0.500121,-0.500179,-0.500259, + -0.50036,-0.500476,-0.500591,-0.500732,-0.500893,-0.501066,-0.501239, + -0.50144,-0.501661,-0.501891,-0.502123,-0.502382,-0.502662,-0.502949, + -0.50324,-0.503555,-0.503895,-0.504238,-0.504587,-0.504958,-0.505356, + -0.505754,-0.506162,-0.506589,-0.507042,-0.507495,-0.50796,-0.508444, + -0.508951,-0.509458,-0.509979,-0.510518,-0.511079,-0.511638,-0.512213, + -0.512808,-0.51342,-0.51403,-0.514659,-0.515307,-0.51597,-0.51663,-0.517312, + -0.518012,-0.518724,-0.519433,-0.520166,-0.520916,-0.521675,-0.522432, + -0.523214,-0.524013,-0.524819,-0.525624,-0.526451,-0.527298,-0.528147, + -0.528999,-0.52987,-0.530762,-0.531654,-0.532551,-0.533464,-0.534399, + -0.535332,-0.536271,-0.537226,-0.538202,-0.539172,-0.540152,-0.541148, + -0.542161,-0.543168,-0.544187,-0.54522,-0.546269,-0.54731,-0.548365, + -0.549434,-0.550516,-0.55159,-0.552679,-0.553781,-0.554893,-0.555997, + -0.557118,-0.558252,-0.559391,-0.560524,-0.561674,-0.562836,-0.564001, + -0.565161,-0.566336,-0.567524,-0.568712,-0.569896,-0.571095,-0.572306, + -0.573514,-0.574721,-0.575939,-0.577171,-0.578396,-0.579622,-0.580858, + -0.582108,-0.583348,-0.58459,-0.585842,-0.587106,-0.588358,-0.589614, + -0.590879,-0.592154,-0.593415,-0.594682,-0.595957,-0.59724,-0.598507, + -0.599782,-0.601064,-0.602351,-0.603623,-0.604902,-0.606189,-0.607476, + -0.60875,-0.610032,-0.611319,-0.612605,-0.613877,-0.615157,-0.616443, + -0.617723,-0.618992,-0.620268,-0.621548,-0.62282,-0.624083,-0.62535, + -0.626622,-0.627882,-0.629135,-0.630391,-0.631652,-0.632898,-0.634138, + -0.63538,-0.636626,-0.637854,-0.639078,-0.640304,-0.641531,-0.642739, + -0.643943,-0.645149,-0.646355,-0.647538,-0.64872,-0.649903,-0.651084, + -0.652241,-0.653397,-0.654553,-0.655705,-0.656834,-0.657961,-0.659087, + -0.660206,-0.661304,-0.662399,-0.663492,-0.664575,-0.665639,-0.666699, + -0.667756,-0.6688,-0.669827,-0.670849,-0.671866,-0.672868,-0.673854, + -0.674835,-0.675811,-0.676767,-0.677709,-0.678646,-0.679576,-0.680484, + -0.68138,-0.682269,-0.683151,-0.684008,-0.684854,-0.685693,-0.686524, + -0.687327,-0.688119,-0.688905,-0.689682,-0.690428,-0.691164,-0.691893, + -0.692613,-0.6933,-0.693978,-0.694647,-0.695305,-0.695932,-0.696549, + -0.697156,-0.697748,-0.698313,-0.698865,-0.699407,-0.699932,-0.700431, + -0.700917,-0.701391,-0.701845,-0.702276,-0.702693,-0.703097,-0.703478, + -0.703837,-0.704183,-0.704514,-0.704819,-0.705105,-0.705378,-0.705633, + -0.70586,-0.706069,-0.706265,-0.706444,-0.706591,-0.706721,-0.706837, + -0.706938,-0.707003,-0.707051,-0.707086,-0.707106,-0.707086,-0.707051, + -0.707001,-0.706935,-0.706832,-0.706711,-0.706576,-0.706421,-0.706233, + -0.706025,-0.705802,-0.705557,-0.705282,-0.704984,-0.704671,-0.704334, + -0.703969,-0.703582,-0.703176,-0.702746,-0.702288,-0.70181,-0.701312, + -0.700785,-0.700234,-0.699664,-0.69907,-0.698447,-0.6978,-0.697135, + -0.696446,-0.695725,-0.694981,-0.694219,-0.693435,-0.692613,-0.691771, + -0.690911,-0.69003,-0.689108,-0.688166,-0.687206,-0.686227,-0.685204, + -0.684162,-0.683101,-0.682019,-0.680898,-0.679755,-0.678592,-0.677407, + -0.676187,-0.674941,-0.673676,-0.672386,-0.671066,-0.669718,-0.66835, + -0.666955,-0.665532,-0.664083,-0.662611,-0.661112,-0.659585,-0.658035, + -0.656459,-0.654854,-0.653223,-0.651572,-0.649892,-0.648181,-0.646446, + -0.644691,-0.642909,-0.641093,-0.639253,-0.637393,-0.63551,-0.633588, + -0.631644,-0.62968,-0.627695,-0.625668,-0.623621,-0.621553,-0.619464, + -0.617334,-0.615183,-0.613011,-0.610817,-0.608587,-0.606333,-0.604058, + -0.60176,-0.599429,-0.597072,-0.594695,-0.592293,-0.589862,-0.587404, + -0.584925,-0.58242,-0.579888,-0.577331,-0.574751,-0.572145,-0.569512, + -0.566858,-0.564178,-0.561471,-0.558739,-0.555988,-0.553209,-0.550402, + -0.547572,-0.544723,-0.54185,-0.538944,-0.536018,-0.533072,-0.530105, + -0.527103,-0.524081,-0.52104,-0.51798,-0.514883,-0.511767,-0.508633, + -0.505479,-0.502291,-0.499083,-0.495857,-0.492611,-0.489335,-0.486037, + -0.48272,-0.479384,-0.476021,-0.472634,-0.46923,-0.465805,-0.462356, + -0.458884,-0.455394,-0.451882,-0.448348,-0.444795,-0.44122,-0.437624, + -0.434008,-0.430374,-0.426718,-0.423041,-0.419344,-0.415631,-0.411897, + -0.40814,-0.404365,-0.400575,-0.396766,-0.392933,-0.389082,-0.385217, + -0.381336,-0.377428,-0.373505,-0.369568,-0.365616,-0.361638,-0.357645, + -0.353638,-0.349617,-0.345572,-0.341512,-0.337438,-0.33335,-0.329242, + -0.325118,-0.32098,-0.316829,-0.31266,-0.308474,-0.304276,-0.300063, + -0.295836,-0.291593,-0.287337,-0.283067,-0.278783,-0.274487,-0.270176, + -0.265852,-0.261515,-0.257168,-0.252806,-0.248431,-0.244045,-0.239649, + -0.23524,-0.230817,-0.226385,-0.221943,-0.21749,-0.213024,-0.208548, + -0.204064,-0.199571,-0.195064,-0.190549,-0.186026,-0.181495,-0.176952, + -0.1724,-0.167842,-0.163277,-0.1587,-0.154117,-0.149527,-0.14493,-0.140325, + -0.135712,-0.131094,-0.12647,-0.121839,-0.117201,-0.112559,-0.10791, + -0.103257,-0.0985979,-0.0939343,-0.0892662,-0.0845935,-0.079917,-0.0752362, + -0.0705516,-0.0658635,-0.0611729,-0.0564786,-0.0517814,-0.0470818,-0.0423802, + -0.0376765,-0.0329703,-0.0282629,-0.0235542,-0.0188445,-0.0141335,-0.00942183, + -0.00470983,2.41979e-06,0.00471481,0.00942681,0.0141384,0.0188494,0.023559, + 0.028268,0.0329754,0.0376813,0.0423851,0.0470868,0.0517863,0.0564836, + 0.0611777,0.0658683,0.0705566,0.0752412,0.0799218,0.0845982,0.0892712, + 0.0939393,0.0986028,0.103262,0.107915,0.112563,0.117206,0.121844,0.126475, + 0.131099,0.135717,0.14033,0.144935,0.149531,0.154122,0.158705,0.163281, + 0.167847,0.172405,0.176956,0.1815,0.18603,0.190553,0.195069,0.199576, + 0.204068,0.208552,0.213028,0.217495,0.221947,0.226389,0.230822,0.235245, + 0.239653,0.244049,0.248436,0.252811,0.257173,0.26152,0.265857,0.270181, + 0.274491,0.278788,0.283071,0.287341,0.291597,0.29584,0.300068,0.30428, + 0.308478,0.312664,0.316833,0.320984,0.325122,0.329246,0.333354,0.337442, + 0.341516,0.345576,0.34962,0.353642,0.357649,0.361642,0.36562,0.369572, + 0.373509,0.377432,0.38134,0.385221,0.389086,0.392936,0.39677,0.400579, + 0.404369,0.408143,0.4119,0.415634,0.419347,0.423044,0.426721,0.430377, + 0.434011,0.437627,0.441223,0.444798,0.448351,0.451885,0.455397,0.458887, + 0.462359,0.465807,0.469232,0.472637,0.476024,0.479386,0.482723,0.486039, + 0.489338,0.492613,0.49586,0.499086,0.502294,0.505481,0.508635,0.511769, + 0.514885,0.517982,0.521042,0.524083,0.527105,0.530107,0.533074,0.53602, + 0.538946,0.541851,0.544725,0.547574,0.550404,0.553211,0.555989,0.55874, + 0.561472,0.564179,0.566859,0.569514,0.572146,0.574753,0.577332,0.579889, + 0.582421,0.584926,0.587405,0.589863,0.592294,0.594696,0.597073,0.59943, + 0.60176,0.604059,0.606333,0.608588,0.610818,0.613012,0.615183,0.617335, + 0.619464,0.621553,0.623621,0.625669,0.627696,0.629681,0.631645,0.633588, + 0.63551,0.637393,0.639253,0.641093,0.642909,0.644691,0.646446,0.648181, + 0.649892,0.651572,0.653223,0.654854,0.656459,0.658035,0.659585,0.661112, + 0.662611,0.664083,0.665532,0.666955,0.66835,0.669718,0.671066,0.672386, + 0.673676,0.674941,0.676187,0.677407,0.678592,0.679755,0.680898,0.682019, + 0.683101,0.684162,0.685204,0.686227,0.687206,0.688166,0.689108,0.69003, + 0.690911,0.691771,0.692613,0.693435,0.694219,0.694981,0.695725,0.696447, + 0.697135,0.6978,0.698447,0.69907,0.699664,0.700234,0.700786,0.701312, + 0.70181,0.702288,0.702746,0.703177,0.703582,0.703969,0.704334,0.704671, + 0.704984,0.705282,0.705557,0.705802,0.706025,0.706233,0.706422,0.706576, + 0.706712,0.706832,0.706936,0.707002,0.707051,0.707086,0.707106,0.707086, + 0.707051,0.707003,0.706939,0.706838,0.706721,0.706592,0.706445,0.706265, + 0.70607,0.705861,0.705634,0.705378,0.705105,0.70482,0.704515,0.704184, + 0.703837,0.703478,0.703097,0.702694,0.702276,0.701846,0.701392,0.700917, + 0.700432,0.699932,0.699408,0.698866,0.698314,0.697749,0.697156,0.696549, + 0.695933,0.695305,0.694648,0.693979,0.693301,0.692613,0.691894,0.691165, + 0.690428,0.689683,0.688905,0.68812,0.687327,0.686525,0.685693,0.684854, + 0.684009,0.683152,0.68227,0.68138,0.680485,0.679577,0.678647,0.67771, + 0.676768,0.675811,0.674836,0.673855,0.672869,0.671867,0.670849,0.669827, + 0.668801,0.667757,0.6667,0.66564,0.664576,0.663493,0.6624,0.661305, + 0.660207,0.659088,0.657962,0.656834,0.655705,0.654553,0.653398,0.652241, + 0.651085,0.649903,0.648721,0.647539,0.646356,0.645149,0.643944,0.642739, + 0.641532,0.640304,0.639079,0.637855,0.636626,0.635381,0.634139,0.632899, + 0.631652,0.630392,0.629136,0.627883,0.626622,0.62535,0.624083,0.62282, + 0.621548,0.620268,0.618993,0.617724,0.616443,0.615158,0.613878,0.612605, + 0.61132,0.610032,0.608751,0.607477,0.606189,0.604903,0.603623,0.602351, + 0.601065,0.599782,0.598508,0.59724,0.595957,0.594682,0.593415,0.592154, + 0.59088,0.589615,0.588359,0.587106,0.585843,0.584591,0.583349,0.582108, + 0.580859,0.579623,0.578397,0.577172,0.575939,0.574721,0.573515,0.572307, + 0.571095,0.569897,0.568713,0.567525,0.566337,0.565161,0.564002,0.562837, + 0.561674,0.560525,0.559392,0.558252,0.557119,0.555998,0.554893,0.553782, + 0.552679,0.55159,0.550516,0.549434,0.548365,0.54731,0.546269,0.54522, + 0.544187,0.543168,0.542161,0.541148,0.540153,0.539173,0.538202,0.537226, + 0.536271,0.535332,0.5344,0.533464,0.532551,0.531654,0.530762,0.52987, + 0.528999,0.528147,0.527298,0.526451,0.525624,0.524819,0.524014,0.523214, + 0.522432,0.521675,0.520916,0.520166,0.519433,0.518724,0.518012,0.517312, + 0.51663,0.51597,0.515307,0.51466,0.51403,0.51342,0.512808,0.512213, + 0.511638,0.511079,0.510518,0.509979,0.509458,0.508951,0.508444,0.50796, + 0.507495,0.507042,0.506589,0.506162,0.505754,0.505356,0.504958,0.504587, + 0.504237,0.503895,0.503555,0.50324,0.502949,0.502662,0.502382,0.502123, + 0.501891,0.501661,0.50144,0.501239,0.501066,0.500893,0.500732,0.500591, + 0.500476,0.50036,0.500259,0.500179,0.500121,0.500063,0.500023,0.500003,0.500003}; + +const float __not_in_flash("sinebuf") sineBuffer[514]={0,0.012268,0.024536,0.036804,0.049042,0.06131,0.073547,0.085785,0.097992,0.1102,0.12241,0.13455,0.1467,0.15884,0.17093,0.18301,0.19507,0.20709,0.21909,0.23105,0.24295,0.25485,0.26669,0.2785,0.29025,0.30197,0.31366,0.32529,0.33685,0.34839,0.35986,0.37128,0.38266,0.39395,0.40521,0.41641,0.42752,0.4386,0.44958,0.46051,0.47137,0.48215,0.49286,0.50351,0.51407,0.52457,0.53497,0.54529,0.55554,0.5657,0.57578,0.58575,0.59567,0.60547,0.6152,0.62482,0.63437,0.6438,0.65314,0.66238,0.67151,0.68057,0.68951,0.69833,0.70706,0.7157,0.72421,0.7326,0.74091,0.74908,0.75717,0.76514,0.77298,0.7807,0.7883,0.79581,0.80316,0.81042,0.81754,0.82455,0.83142,0.8382,0.84482,0.85132,0.8577,0.86392,0.87006,0.87604,0.88187,0.8876,0.89319,0.89862,0.90396,0.90912,0.91415,0.91907,0.92383,0.92847,0.93295,0.93729,0.9415,0.94556,0.94949,0.95325,0.95691,0.96039,0.96375,0.96692,0.97,0.9729,0.97565,0.97827,0.98074,0.98306,0.98523,0.98724,0.98914,0.99084,0.99243,0.99387,0.99515,0.99628,0.99725,0.99808,0.99875,0.99927,0.99966,0.99988,0.99997,0.99988,0.99966,0.99927,0.99875,0.99808,0.99725,0.99628,0.99515,0.99387,0.99243,0.99084,0.98914,0.98724,0.98523,0.98306,0.98074,0.97827,0.97565,0.9729,0.97,0.96692,0.96375,0.96039,0.95691,0.95325,0.94949,0.94556,0.9415,0.93729,0.93295,0.92847,0.92383,0.91907,0.91415,0.90912,0.90396,0.89862,0.89319,0.8876,0.88187,0.87604,0.87006,0.86392,0.8577,0.85132,0.84482,0.8382,0.83142,0.82455,0.81754,0.81042,0.80316,0.79581,0.7883,0.7807,0.77298,0.76514,0.75717,0.74908,0.74091,0.7326,0.72421,0.7157,0.70706,0.69833,0.68951,0.68057,0.67151,0.66238,0.65314,0.6438,0.63437,0.62482,0.6152,0.60547,0.59567,0.58575,0.57578,0.5657,0.55554,0.54529,0.53497,0.52457,0.51407,0.50351,0.49286,0.48215,0.47137,0.46051,0.44958,0.4386,0.42752,0.41641,0.40521,0.39395,0.38266,0.37128,0.35986,0.34839,0.33685,0.32529,0.31366,0.30197,0.29025,0.2785,0.26669,0.25485,0.24295,0.23105,0.21909,0.20709,0.19507,0.18301,0.17093,0.15884,0.1467,0.13455,0.12241,0.1102,0.097992,0.085785,0.073547,0.06131,0.049042,0.036804,0.024536,0.012268,0,-0.012268,-0.024536,-0.036804,-0.049042,-0.06131,-0.073547,-0.085785,-0.097992,-0.1102,-0.12241,-0.13455,-0.1467,-0.15884,-0.17093,-0.18301,-0.19507,-0.20709,-0.21909,-0.23105,-0.24295,-0.25485,-0.26669,-0.2785,-0.29025,-0.30197,-0.31366,-0.32529,-0.33685,-0.34839,-0.35986,-0.37128,-0.38266,-0.39395,-0.40521,-0.41641,-0.42752,-0.4386,-0.44958,-0.46051,-0.47137,-0.48215,-0.49286,-0.50351,-0.51407,-0.52457,-0.53497,-0.54529,-0.55554,-0.5657,-0.57578,-0.58575,-0.59567,-0.60547,-0.6152,-0.62482,-0.63437,-0.6438,-0.65314,-0.66238,-0.67151,-0.68057,-0.68951,-0.69833,-0.70706,-0.7157,-0.72421,-0.7326,-0.74091,-0.74908,-0.75717,-0.76514,-0.77298,-0.7807,-0.7883,-0.79581,-0.80316,-0.81042,-0.81754,-0.82455,-0.83142,-0.8382,-0.84482,-0.85132,-0.8577,-0.86392,-0.87006,-0.87604,-0.88187,-0.8876,-0.89319,-0.89862,-0.90396,-0.90912,-0.91415,-0.91907,-0.92383,-0.92847,-0.93295,-0.93729,-0.9415,-0.94556,-0.94949,-0.95325,-0.95691,-0.96039,-0.96375,-0.96692,-0.97,-0.9729,-0.97565,-0.97827,-0.98074,-0.98306,-0.98523,-0.98724,-0.98914,-0.99084,-0.99243,-0.99387,-0.99515,-0.99628,-0.99725,-0.99808,-0.99875,-0.99927,-0.99966,-0.99988,-0.99997,-0.99988,-0.99966,-0.99927,-0.99875,-0.99808,-0.99725,-0.99628,-0.99515,-0.99387,-0.99243,-0.99084,-0.98914,-0.98724,-0.98523,-0.98306,-0.98074,-0.97827,-0.97565,-0.9729,-0.97,-0.96692,-0.96375,-0.96039,-0.95691,-0.95325,-0.94949,-0.94556,-0.9415,-0.93729,-0.93295,-0.92847,-0.92383,-0.91907,-0.91415,-0.90912,-0.90396,-0.89862,-0.89319,-0.8876,-0.88187,-0.87604,-0.87006,-0.86392,-0.8577,-0.85132,-0.84482,-0.8382,-0.83142,-0.82455,-0.81754,-0.81042,-0.80316,-0.79581,-0.7883,-0.7807,-0.77298,-0.76514,-0.75717,-0.74908,-0.74091,-0.7326,-0.72421,-0.7157,-0.70706,-0.69833,-0.68951,-0.68057,-0.67151,-0.66238,-0.65314,-0.6438,-0.63437,-0.62482,-0.6152,-0.60547,-0.59567,-0.58575,-0.57578,-0.5657,-0.55554,-0.54529,-0.53497,-0.52457,-0.51407,-0.50351,-0.49286,-0.48215,-0.47137,-0.46051,-0.44958,-0.4386,-0.42752,-0.41641,-0.40521,-0.39395,-0.38266,-0.37128,-0.35986,-0.34839,-0.33685,-0.32529,-0.31366,-0.30197,-0.29025,-0.2785,-0.26669,-0.25485,-0.24295,-0.23105,-0.21909,-0.20709,-0.19507,-0.18301,-0.17093,-0.15884,-0.1467,-0.13455,-0.12241,-0.1102,-0.097992,-0.085785,-0.073547,-0.06131,-0.049042,-0.036804,-0.024536,-0.012268,0,0.012268 +}; + +const float pitchRatios[256] = {0.0006517771980725, 0.0006905338959768, 0.0007315951515920, 0.0007750981021672, 0.0008211878011934, 0.0008700182079338, 0.0009217521874234, 0.0009765623835847, 0.0010346318595111, 0.0010961542138830, 0.0011613349197432, 0.0012303915573284, 0.0013035543961450, 0.0013810677919537, 0.0014631903031841, 0.0015501962043345, 0.0016423756023869, 0.0017400364158675, 0.0018435043748468, 0.0019531247671694, 0.0020692637190223, 0.0021923084277660, 0.0023226698394865, 0.0024607831146568, 0.0026071087922901, 0.0027621355839074, 0.0029263808391988, 0.0031003924086690, 0.0032847514376044, 0.0034800728317350, 0.0036870087496936, 0.0039062497671694, 0.0041385274380445, 0.0043846168555319, 0.0046453396789730, 0.0049215662293136, 0.0052142175845802, 0.0055242711678147, 0.0058527616783977, 0.0062007848173380, 0.0065695028752089, 0.0069601456634700, 0.0073740174993873, 0.0078124995343387, 0.0082770548760891, 0.0087692337110639, 0.0092906802892685, 0.0098431324586272, 0.0104284351691604, 0.0110485423356295, 0.0117055233567953, 0.0124015696346760, 0.0131390057504177, 0.0139202913269401, 0.0147480349987745, 0.0156249990686774, 0.0165541097521782, 0.0175384692847729, 0.0185813605785370, 0.0196862649172544, 0.0208568722009659, 0.0220970865339041, 0.0234110467135906, 0.0248031392693520, 0.0262780115008354, 0.0278405826538801, 0.0294960699975491, 0.0312499981373549, 0.0331082195043564, 0.0350769385695457, 0.0371627211570740, 0.0393725298345089, 0.0417137444019318, 0.0441941730678082, 0.0468220934271812, 0.0496062822639942, 0.0525560230016708, 0.0556811690330505, 0.0589921437203884, 0.0624999962747097, 0.0662164390087128, 0.0701538771390915, 0.0743254423141479, 0.0787450596690178, 0.0834274888038635, 0.0883883461356163, 0.0936441868543625, 0.0992125645279884, 0.1051120460033417, 0.1113623380661011, 0.1179842874407768, 0.1249999925494194, 0.1324328780174255, 0.1403077542781830, 0.1486508846282959, 0.1574901193380356, 0.1668549776077271, 0.1767766922712326, 0.1872883737087250, 0.1984251290559769, 0.2102240920066833, 0.2227246761322021, 0.2359685748815536, 0.2500000000000000, 0.2648657560348511, 0.2806155085563660, 0.2973017692565918, 0.3149802684783936, 0.3337099552154541, 0.3535533845424652, 0.3745767772197723, 0.3968502581119537, 0.4204482138156891, 0.4454493522644043, 0.4719371497631073, 0.5000000000000000, 0.5297315716743469, 0.5612310171127319, 0.5946035385131836, 0.6299605369567871, 0.6674199104309082, 0.7071067690849304, 0.7491535544395447, 0.7937005162239075, 0.8408964276313782, 0.8908987045288086, 0.9438742995262146, 1.0000000000000000, 1.0594631433486938, 1.1224620342254639, 1.1892070770263672, 1.2599210739135742, 1.3348398208618164, 1.4142135381698608, 1.4983071088790894, 1.5874010324478149, 1.6817928552627563, 1.7817974090576172, 1.8877485990524292, 2.0000000000000000, 2.1189262866973877, 2.2449240684509277, 2.3784141540527344, 2.5198421478271484, 2.6696796417236328, 2.8284270763397217, 2.9966142177581787, 3.1748020648956299, 3.3635857105255127, 3.5635950565338135, 3.7754974365234375, 4.0000000000000000, 4.2378525733947754, 4.4898481369018555, 4.7568287849426270, 5.0396842956542969, 5.3393597602844238, 5.6568546295166016, 5.9932284355163574, 6.3496046066284180, 6.7271714210510254, 7.1271901130676270, 7.5509948730468750, 8.0000000000000000, 8.4757051467895508, 8.9796962738037109, 9.5136575698852539, 10.0793685913085938, 10.6787195205688477, 11.3137092590332031, 11.9864568710327148, 12.6992092132568359, 13.4543428421020508, 14.2543802261352539, 15.1019897460937500, 16.0000000000000000, 16.9514102935791016, 17.9593944549560547, 19.0273151397705078, 20.1587371826171875, 21.3574390411376953, 22.6274185180664062, 23.9729137420654297, 25.3984184265136719, 26.9086875915527344, 28.5087604522705078, 30.2039794921875000, 32.0000000000000000, 33.9028205871582031, 35.9187889099121094, 38.0546302795410156, 40.3174743652343750, 42.7148780822753906, 45.2548370361328125, 47.9458274841308594, 50.7968368530273438, 53.8173751831054688, 57.0175209045410156, 60.4079589843750000, 64.0000076293945312, 67.8056411743164062, 71.8375778198242188, 76.1092605590820312, 80.6349563598632812, 85.4297561645507812, 90.5096740722656250, 95.8916625976562500, 101.5936737060546875, 107.6347503662109375, 114.0350418090820312, 120.8159179687500000, 128.0000152587890625, 135.6112823486328125, 143.6751556396484375, 152.2185211181640625, 161.2699127197265625, 170.8595123291015625, 181.0193481445312500, 191.7833251953125000, 203.1873474121093750, 215.2695007324218750, 228.0700836181640625, 241.6318511962890625, 256.0000305175781250, 271.2225646972656250, 287.3503112792968750, 304.4370422363281250, 322.5398254394531250, 341.7190246582031250, 362.0386962890625000, 383.5666503906250000, 406.3746948242187500, 430.5390014648437500, 456.1401977539062500, 483.2637023925781250, 512.0000610351562500, 542.4451293945312500, 574.7006225585937500, 608.8740844726562500, 645.0796508789062500, 683.4380493164062500, 724.0773925781250000, 767.1333007812500000, 812.7494506835937500, 861.0780029296875000, 912.2803955078125000, 966.5274047851562500, 1024.0001220703125000, 1084.8903808593750000, 1149.4012451171875000, 1217.7481689453125000, 1290.1593017578125000, 1366.8762207031250000, 1448.1549072265625000, 1534.2666015625000000, 1625.4989013671875000}; + +/** + * This gives Maximilian essential information it needs + */ +class maxiSettings +{ +public: + maxiSettings(); + + /*! The sample rate */ + static size_t __not_in_flash("maxisettings") sampleRate; + static float __not_in_flash("maxisettings") one_over_sampleRate; + static size_t __not_in_flash("maxisettings") channels; + static size_t __not_in_flash("maxisettings") bufferSize; + /** + * Configure Maximilian + * \param initSampleRate the sample rate + * \param initChannels the number of audio channels + * \param initBufferSize the buffer size of your audio system + */ + static void setup(size_t initSampleRate, size_t initChannels, size_t initBufferSize) + { + maxiSettings::sampleRate = initSampleRate; + maxiSettings::one_over_sampleRate = 1.f / static_cast(maxiSettings::sampleRate); + maxiSettings::channels = initChannels; + maxiSettings::bufferSize = initBufferSize; + } + static size_t getSampleRate() + { + return maxiSettings::sampleRate; + } +}; + +/** + * \class A variety of oscillators + */ + +class maxiOsc +{ +public: + + //float frequency; + float phase; + //float startphase; + //float endphase; + float output; + //float tri; + float constant_by_one_over_sr_; + + maxiOsc(); + void UpdateParams(void); + /*!Square wave oscillator + \param frequency in Hz */ + float square(float frequency) { + if (phase<0.5) output=-1; + if (phase>0.5) output=1; + if ( phase >= 1.0 ) phase -= 1.0; + phase += maxiSettings::one_over_sampleRate * frequency; + return(output); + + } + /*!Sine wave oscillator + \param frequency in Hz */ + float __force_inline sinewave(float frequency) { + //This is a sinewave oscillator + output=sinf (phase*(TWOPI)); + phase += maxiSettings::one_over_sampleRate * frequency; + if ( phase >= 1.0 ) phase -= 1.0; + return output ; + + } + /*!Cosine wave oscillator + \param frequency in Hz */ + float coswave(float frequency); + /*!Saw wave oscillator \param frequency in Hz */ + float saw(float frequency); + /*!A ramp rising from 0 to 1 \param frequency in Hz */ + float phasor(float frequency); + /*!A ramp rising from 0 to 1 \param frequency in Hz + \param startPhase the start point of the phasor (0-1) + \param endPhase the end point of the phasor (0-1) + */ + float phasorBetween(float frequency, float startphase, float endphase); //renamed to avoid overrides + /*!Triangle oscillator \param frequency in Hz */ + float triangle(float frequency); + /*!Pulse wave oscillator \param frequency in Hz \param duty Pulse width (0-1)*/ + float pulse(float frequency, float duty); + /*!Impulse generator \param frequency in Hz */ + float impulse(float frequency); + + /*!Fast sine wave oscillator, generated from a wavetable with linear interpolation \param frequency in Hz */ + inline __attribute__((always_inline)) float sinebuf(float frequency) { //specify the frequency of the oscillator in Hz / cps etc. + //This is a sinewave oscillator that uses linear interpolation on a 514 point buffer + phase += constant_by_one_over_sr_*frequency; + if ( phase >= 511.f ) phase -=512.f; + + const size_t phase_int = static_cast(phase); + const float remainder = phase - static_cast(phase_int); + + // Use local pointer to avoid repeated array dereferencing and index calculation + const float* buf = &sineBuffer[phase_int + 1]; + return (1.0f - remainder) * buf[0] + remainder * buf[1]; + } + +/*!White noise generator*/ + float noise(); + /*!Fast sine wave oscillator, generated from a wavetable with quadratic interpolation \param frequency in Hz */ + float sinebuf4(float frequency); + /*!Anti-aliases saw wave oscillator \param frequency in Hz */ + float __force_inline sawn(float frequency) { + //Bandlimited sawtooth generator. Woohoo. + if ( phase >= 0.5 ) phase -= 1.0; + // phase += (1./(maxiSettings::sampleRate/(frequency))); + phase += maxiSettings::one_over_sampleRate * frequency; + float temp=(8820.22f/frequency)*phase; + if (temp<-0.5) { + temp=-0.5; + } + if (temp>0.5) { + temp=0.5; + } + temp*=1000.0f; + temp+=500.0f; + float remainder = temp - floor(temp); + output = (float) ((1.0f-remainder) * transition[(long)temp] + remainder * transition[1+(long)temp]) - phase; + return output; + + } + /*!Set the phase of the oscillator \param phaseIn The phase, from 0 to 1*/ + void phaseReset(float phaseIn); +}; + + +/** + * \class A delay line + */ +template +class maxiDelayline +{ +public: + maxiDelayline(); + + /*! Apply a delay to a signal \param input a signal, \param size the size of the delay in samples \param feedback the amount of feedback*/ + float play(const float input, const size_t size, float feedback); + + protected: + size_t phase; + alignas(16) float memory[DELAYTIME]; +}; + +template +maxiDelayline::maxiDelayline() : + phase(0) { + memset( memory, 0, DELAYTIME * sizeof(float) ); +}; + + + +template +inline float maxiDelayline::play(const float input, const size_t size, const float feedback) { + if (size >= DELAYTIME) [[unlikely]]{ + return 0; + } + if ( phase >= size ) [[unlikely]] { + phase = 0; + } + float output=memory[phase]; + memory[phase]=(memory[phase] * feedback) + input; + phase+=1; + return output; + +} + + +/** +* A selection of filters +*/ +class maxiFilter +{ +private: + float gain; + float input; + float output; + float inputs[10]; + float outputs[10]; + float cutoff1; + float x; //speed + float y; //pos + float z; //pole + float c; //filter coefficient + constexpr static __not_in_flash("maxi") float SQRT2 = 1.41421356237f; + float svf_low = 0.f; // For Chamberlin SVF + float svf_band = 0.f; // For Chamberlin SVF + +public: + maxiFilter(); + float cutoff; + float resonance; + /** A resonant low pass filter + * \param input A signal + * \param cutoff1 The cutoff frequency (in Hz) (unstable > sr/4) + * \param resonance The amount of resonance + */ + //awesome. cuttof is freq in hz. res is between 1 and whatever. Watch out! + __force_inline float lores(float input,float cutoff1, float resonance) { + cutoff=cutoff1; + // if (cutoff<10) cutoff=10; + // if (cutoff>(maxiSettings::sampleRate)) cutoff=(maxiSettings::sampleRate); + // if (resonance<1.) resonance = 1.; + z=cosf(TWOPI*cutoff*maxiSettings::one_over_sampleRate); + c=2.f-2.f*z; + const float r=(SQRT2*sqrtf(-powf((z-1.0f),3.0f))+resonance*(z-1.f))/(resonance*(z-1.f)); + x=x+(input-y)*c; + y=y+x; + x=x*r; + output=y; + return(output); + } + /** A resonant high pass filter + * \param input A signal + * \param cutoff1 The cutoff frequency (in Hz) + * \param resonance The amount of resonance + */ + __force_inline float hires(float input,float cutoff1, float resonance) { + cutoff=cutoff1; + // if (cutoff<10) cutoff=10; + // if (cutoff>(maxiSettings::sampleRate)) cutoff=(maxiSettings::sampleRate); + // if (resonance<1.) resonance = 1.; + z=cosf(TWOPI*cutoff*maxiSettings::one_over_sampleRate); + c=2.f-2.f*z; + const float r=(SQRT2*sqrtf(-powf((z-1.0f),3.0f))+resonance*(z-1.f))/(resonance*(z-1.f)); + x=x+(input-y)*c; + y=y+x; + x=x*r; + output=input-y; + return(output); + } + + __force_inline float loresChamberlain(float input, float cutoff1, float resonance) { + // Clamp parameters + // cutoff1 = fminf(cutoff1, maxiSettings::sampleRate * 0.45f); + // cutoff1 = fmaxf(cutoff1, 10.f); + // resonance = fmaxf(0.5f, fminf(resonance, 20.f)); + + // Chamberlin SVF coefficients with pre-warping + const float omega = TWOPI * cutoff1 * maxiSettings::one_over_sampleRate; + const float f = 2.f * sinf(omega * 0.5f); // Pre-warped frequency + const float q = 1.f / resonance; + const float qAdjust = 1.f + q * f + f * f; // Stability compensation + + // State variable filter topology + svf_low += f * svf_band; + const float high = input - svf_low - q * svf_band; + svf_band += f * high / qAdjust; // Damping + + return svf_low; + } + + __force_inline float hiresChamberlain(float input, float cutoff1, float resonance) { + // Clamp parameters + cutoff1 = fminf(cutoff1, maxiSettings::sampleRate * 0.45f); + cutoff1 = fmaxf(cutoff1, 10.f); + resonance = fmaxf(0.5f, fminf(resonance, 20.f)); + + // Chamberlin SVF coefficients + const float omega = TWOPI * cutoff1 * maxiSettings::one_over_sampleRate; + const float f = 2.f * sinf(omega * 0.5f); + const float q = 1.f / resonance; + const float qAdjust = 1.f + q * f + f * f; + + // State variable filter topology + svf_low += f * svf_band; + const float high = input - svf_low - q * svf_band; // HIGH PASS output + svf_band += f * high / qAdjust; + + return high; // Return highpass instead of lowpass + } + + /** A resonant band pass filter (Chamberlin SVF) + * \param input A signal + * \param cutoff1 The centre frequency (in Hz) + * \param resonance The Q / resonance (higher = narrower bandwidth) + */ + __force_inline float bandpassChamberlain(float input, float cutoff1, float resonance) { + const float omega = TWOPI * cutoff1 * maxiSettings::one_over_sampleRate; + const float f = 2.f * sinf(omega * 0.5f); + const float q = 1.f / resonance; + const float qAdjust = 1.f + q * f + f * f; + + svf_low += f * svf_band; + const float high = input - svf_low - q * svf_band; + svf_band += f * high / qAdjust; + + return svf_band; + } + + /** A resonant band pass filter + * \param input A signal + * \param cutoff1 The cutoff frequency (in Hz) + * \param resonance The amount of resonance + */ + float bandpass(float input, float cutoff1, float resonance); + + /** A simple low pass filter + * \param input A signal + * \param cutoff1 The cutoff frequency (between 0 and 1) + */ + float lopass(float input, float cutoff); + + /** A simple low pass filter + * \param input A signal + * \param cutoff1 The cutoff frequency (between 0 and 1) + */ + float hipass(float input, float cutoff); + + // ------------------------------------------------ + // getters/setters + + /*!\Sets the cutoff frequency \param cut The cutoff frequency*/ + void setCutoff(float cut) + { + cutoff = cut; + } + + /*!\Sets the resonance \param res The resonance*/ + void setResonance(float res) + { + resonance = res; + } + + /*!\returns the cutoff value*/ + float getCutoff() + { + return cutoff; + } + + /*!\returns the resonance value*/ + float getResonance() + { + return resonance; + } + // ------------------------------------------------ +}; + + +/** + * Functions for multichannel panning + */ +class maxiMix +{ + float input; + float two[2]; + float four[4]; + float eight[8]; + +public: + // float x; + // float y; + // float z; + + // ------------------------------------------------ + // getters/setters + + // ------------------------------------------------ + + // float *stereo(float input,float two[2],float x); + // float *quad(float input,float four[4], float x,float y); + // float *ambisonic(float input,float eight[8],float x,float y, float z); + + // should return or just be void function + /** + * Stereo panning + * \param input A mono signal + * \param two A vector (size 2) into which the signal is panned in-place + * \param x The panning level (0 to 1) + */ + void stereo(float input, std::vector &two, float x); + + /** + * Quadraphonic panning + * \param input A mono signal + * \param four A vector (size 4) into which the signal is panned + * \param x Left-right panning level (0 to 1) + * \param y Forward-backward panning level (0 to 1) + */ + void quad(float input, std::vector &four, float x, float y); + /** + * Ambisonic panning + * \param input A mono signal + * \param eight A vector (size 8) into which the signal is panned + * \param x Left-right panning level (0 to 1) + * \param y Forward-backward panning level (0 to 1) + * \param z Up-down panning level (0 to 1) + */ + void ambisonic(float input, std::vector &eight, float x, float y, float z); +}; + +// /** +// * A ring buffer. This enables you to look at the last N values in a time series. +// */ +class maxiRingBuf { +public: + maxiRingBuf(); + + /*!Allocate memory for the buffer \param N The maximum length of the buffer*/ + void setup(size_t N) { + buf = F64_ARRAY_CREATE(N); + F64_ARRAY_FILL(buf,0); + } + /*!Add the latest value to the buffer \param x A value*/ + void push(float x) { + buf[idx] = x; + idx++; + if (idx==F64_ARRAY_SIZE(buf)) { + idx=0; + } + } + + /*! \returns The size of the buffer*/ + size_t size() {return F64_ARRAY_SIZE(buf);} + + /*! \returns the value at the front of the buffer*/ + float head() {return idx == 0 ? buf[F64_ARRAY_SIZE(buf)-1] : buf[idx-1];} + + /*! \returns the oldest value in the buffer, for a particular window size \param N The size of the window, N < the size of the buffer*/ + float tail(size_t N) { + float val=0; + if (idx >= N) { + val = buf[idx-N]; + }else{ + size_t tailIdx = F64_ARRAY_SIZE(buf) - (N-idx); + val = buf[tailIdx]; + } + return val; + } + + using reduceFunction = std::function; + /** + * Apply a function of the previous N values in the buffer + * \param N The number of values in the window + * \param func A function in the form float func(float previousResult, float nextValue) + * \param initval The initial value to pass into the function (usually 0) + * \returns The last result of the function, after passing in all values from the window + * Example: this function will sum the values in the window: + * auto sumfunc = [](float val, float n) {return val + n;}; + */ + float reduce(size_t N, reduceFunction func, float initval) { + float val=0; + if (idx >= N) { + for(size_t i=idx-N; i < idx; i++) { + val = func(val, buf[i]); + } + }else{ + //first chunk + for(size_t i=F64_ARRAY_SIZE(buf)-(N-idx); i < buf.size(); i++) { + val = func(val, buf[i]); + } + //second chunk + for(int i=0; i < idx; i++) { + val = func(val, buf[i]); + } + } + return val; + } + + + +private: + DOUBLEARRAY buf; + size_t idx=0; +}; + + +//lagging with an exponential moving average +//a lower alpha value gives a slower lag +template +class maxiLagExp +{ +public: + T alpha, alphaReciprocal; + T val; + + maxiLagExp() + { + init(0.5, 0.0); + }; + + maxiLagExp(T initAlpha, T initVal) + { + init(initAlpha, initVal); + } + + void init(T initAlpha, T initVal) + { + alpha = initAlpha; + alphaReciprocal = 1.0 - alpha; + val = initVal; + } + + inline void addSample(T newVal) + { + val = (alpha * newVal) + (alphaReciprocal * val); + } + + // getters/setters + void setAlpha(T alpha_) + { + alpha = alpha_; + } + + void setAlphaReciprocal(T alphaReciprocal_) + { + alphaReciprocal = alphaReciprocal_; + } + + void setVal(T val_) + { + val = val_; + } + + T getAlpha() const + { + return alpha; + } + + T getAlphaReciprocal() const + { + return alphaReciprocal; + } + + inline T value() const + { + return val; + } +}; + +/** + * Generator triggers (a single 1 in a stream of 0s) according to certain conditions + */ + +class maxiTrigger +{ +public: + maxiTrigger(); + /*! Generate a trigger when a signal transitions from <=0 to above 0 \param input A signal*/ + float onZX(float input) + { + float isZX = 0.0; + if ((previousValue <= 0.0 || firstTrigger) && input > 0) + { + isZX = 1.0; + } + previousValue = input; + firstTrigger = 0; + return isZX; + } + + /*! Generate a trigger when a signal changes beyond a certain amount \param input A signal \param tolerance The amount of chance allowed before a trigger is generated*/ + float onChanged(float input, float tolerance) + { + float changed = 0; + if (abs(input - previousValue) > tolerance) + { + changed = 1; + } + previousValue = input; + return changed; + } + +private: + float previousValue = 1; + bool firstTrigger = 1; +}; + + +/** + * A sampler + */ +class maxiSample +{ + +private: + float position, recordPosition; + float speed; + float output; + maxiLagExp loopRecordLag; + // DualModeF64Array test; + +public: + short myChannels; + int mySampleRate; + /*!\returns The length of the sample, in samples*/ + inline size_t getLength() { return F64_ARRAY_SIZE(amplitudes); }; + short myBitsPerSample; + maxiTrigger zxTrig; + + + DECLARE_F64_ARRAY(amplitudes); + + maxiSample(); + + /*! Use the = operator to copy from one sample to another \param source another maxiSample instance*/ + maxiSample &operator=(const maxiSample &source) + { + if (this == &source) + return *this; + position = 0; + recordPosition = 0; + myChannels = source.myChannels; + mySampleRate = maxiSettings::sampleRate; + F64_ARRAY_SETFROM(amplitudes,source.amplitudes); + return *this; + } + + std::string myPath; + int myChunkSize; + int mySubChunk1Size; + int readChannel; + short myFormat; + int myByteRate; + short myBlockAlign; + + +// /*! \returns a printable summary of the wav file */ + // string getSummary(); + + // ------------------------- + + /*! Check if the sample is loaded \returns true if the sample is ready to play*/ + bool isReady() {return F64_ARRAY_SIZE(amplitudes) > 1;} + + /*! Set the sample from an external array \param _sampleData An float array (JS) or vector (C++) of data*/ + void setSample(DOUBLEARRAY_REF _sampleData) + { + // NORMALISE_ARRAY_TYPE(_sampleData, sampleData) + // amplitudes = sampleData; + F64_ARRAY_SETFROM(amplitudes, _sampleData); + // amplitudes.setFrom(_sampleData); + mySampleRate = 44100; + position = F64_ARRAY_SIZE(amplitudes) - 1; + } + + /*! Set the sample from an external array, and set the sample rate + * \param _sampleData An float array (JS) or vector (C++) of data + * \param sampleRate the sample rate + */ + void setSampleAndRate(DOUBLEARRAY_REF _sampleData, int sampleRate) + { + setSample(_sampleData); + mySampleRate = sampleRate; + } + + /*! Clear the sample data*/ + void clear() { F64_ARRAY_CLEAR(amplitudes) } + // // ------------------------- + + + /*! Trigger the sample from the start*/ + void trigger(); + + /** + * Record into the sample buffer + * \param newSample a signal + * \param recordEnabled set to true to record into the loop + * \param recordMix the balance between existing sample and the new signal (1 = overdub, 0=no recording, 0.5=equal mix) + * \param start the loop start point (0-1) + * \param end the loop end point (0-1) + */ + void loopRecord(float newSample, const bool recordEnabled, const float recordMix, float start, float end) + { + loopRecordLag.addSample(recordEnabled); + if (recordPosition < start * F64_ARRAY_SIZE(amplitudes)) + recordPosition = start * F64_ARRAY_SIZE(amplitudes); + if (recordEnabled) + { + float currentSample = F64_ARRAY_AT(amplitudes,(int)recordPosition) / 32767.0; + newSample = (recordMix * currentSample) + ((1.0 - recordMix) * newSample); + newSample *= loopRecordLag.value(); + amplitudes[(unsigned long)recordPosition] = newSample * 32767; + } + ++recordPosition; + if (recordPosition >= end * F64_ARRAY_SIZE(amplitudes)) + recordPosition = start * F64_ARRAY_SIZE(amplitudes); + } + + /*! Reset the sample to play from the start*/ + void reset() {position=0;} + + /*! Play the sample, with no modification */ + float play(); + float play(float speed); + + + /*! Play the sample, providing a phasor to control the position \param pha a phasor signal (from 0 to 1)*/ + float playWithPhasor(float pha); + bool phasorFirst=1; + float phasorPrev=0; + + /*! Play the sample in a loop \param start start position (0-1) \param end end position (0-1)*/ + float playLoop(float start, float end); // start and end are between 0.0 and 1.0 + + /*! Play the sample once and stop*/ + float playOnce(); + + /*! Play the sample when a trigger is received \param trigger a signal*/ + float playOnZX(float trigger); + + /*! Play the sample when a trigger is received, at a modified speed \param trigger a signal \param speed the speed multiplier (1=no change, 2=float etc)*/ + float playOnZXAtSpeed(float trig, float speed); //API CHANGE + /*! Play the sample when a trigger is received, at a modified speed from a specific position \param trigger a signal \param speed the speed multiplier (1=no change, 2=float etc) \param offset the start position (0-1)*/ + float playOnZXAtSpeedFromOffset(float trig, float speed, float offset); //API CHANGE + /*! Play the sample when a trigger is received, at a modified speed beween two positions \param trigger a signal \param speed the speed multiplier (1=no change, 2=float etc) \param offset the start position (0-1) \param length the length of the segment (0-1)*/ + float playOnZXAtSpeedBetweenPoints(float trig, float speed, float offset, float length); //API CHANGE + + /*! Loop the sample, and set the playback position to a specific point when a trigger is received \param trigger a signal \param position the position to move to when a trigger is recevied*/ + float loopSetPosOnZX(float trigger, float position); // position between 0 and 1.0 + + /*! Play the samples once, at a modified speed \param speed a speed multiplier*/ + float playOnceAtSpeed(float speed); //API CHANGE + + /*! Set the playback position \param newPos (0-1)*/ + void setPosition(float newPos); // between 0.0 and 1.0 + + /*! Play from the start to a specific position \param end the end point (0-1)*/ + float playUntil(float end); + /*! Play from the start to a specific position, at a modified speed \param end the end point (0-1) \param speed a speed multiplier*/ + float playUntilAtSpeed(float end, float speed); + + /*! Play at a modified speed \param speed a speed multiplier*/ + float playAtSpeed(float speed); //API CHANGE + + + /*! Play at a modified speed between two points, from a position \param frequency the playback pitch (in Hz) \param start the start point (in samples) \param end the end point (in samples) \param pos the starting position (in samples)*/ + float playAtSpeedBetweenPointsFromPos(float frequency, float start, float end, float pos); //API CHANGE + + /*! Play at a modified speed between two points \param frequency the playback pitch (in Hz) \param start the start point (in samples) \param end the end point (in samples)*/ + float playAtSpeedBetweenPoints(float frequency, float start, float end); //API CHANGE + + /*! Play at a modified speed between two points, using quadratic interpolation \param frequency the playback pitch (in Hz) \param start the start point (in samples) \param end the end point (in samples)*/ + float play4(float frequency, float start, float end); + + + /*! Normalise the sample buffer \param maxLevel the maximum absolute level*/ + void normalise(float maxLevel); + + /*! Trim the sample buffer to remove silence from the ends \param alpha the sensitivity \param threshold the value above which to start trimming \param trimStart true if the start should be trimmed \param trimEnd true if the end should be trimmed */ + void autoTrim(float alpha, float threshold, bool trimStart, bool trimEnd); //alpha of lag filter (lower == slower reaction), threshold to mark start and end, < 32767 +}; + +/** + * Various mapping functions + */ +class maxiMap +{ +public: + maxiMap(); + + /** Map from one range to another, linearly + * \param val a signal + * \param inMin the lowest expected value of the signal + * \param inMax the highest expected value of the signal + * \param outMin the lowest value in the new range of the signal + * \param outMax the highest value in the new range of the signal + * \returns a signal + */ + static float inline linlin(float val, float inMin, float inMax, float outMin, float outMax) + { + val = std::max(std::min(val, inMax), inMin); + return ((val - inMin) / (inMax - inMin) * (outMax - outMin)) + outMin; + } + + /** Map from one range to another, converting from linear to expontial - useful from mapping control values to frequencies etc + * \param val a signal + * \param inMin the lowest expected value of the signal + * \param inMax the highest expected value of the signal + * \param outMin the lowest value in the new range of the signal + * \param outMax the highest value in the new range of the signal + * \returns a signal + */ + static float inline linexp(float val, float inMin, float inMax, float outMin, float outMax) + { + //clipping + val = std::max(std::min(val, inMax), inMin); + return std::pow((outMax / outMin), (val - inMin) / (inMax - inMin)) * outMin; + } + + /** Map from one range to another, converting from an exponential value to a linear one + * \param val a signal + * \param inMin the lowest expected value of the signal + * \param inMax the highest expected value of the signal + * \param outMin the lowest value in the new range of the signal + * \param outMax the highest value in the new range of the signal + * \returns a signal + */ + static float inline explin(float val, float inMin, float inMax, float outMin, float outMax) + { + //clipping + val = std::max(std::min(val, inMax), inMin); + return (std::log(val / inMin) / std::log(inMax / inMin) * (outMax - outMin)) + outMin; + } + + /** Restrict a signal to upper and lower bounds + * \param v a signal + * \param low the lowest value + * \param high the highest value + * \returns a signal + */ + static float inline clamp(float v, const float low, const float high) + { + if (v > high) + { + v = high; + } + else if (v < low) + { + v = low; + } + return v; + } +}; + +// /* The class is deprecated, use maxiDynamics instead */ +// class maxiDyn +// { + +// public: +// // float gate(float input, float threshold=0.9, long holdtime=1, float attack=1, float release=0.9995); +// // float compressor(float input, float ratio, float threshold=0.9, float attack=1, float release=0.9995); +// float gate(float input, float threshold = 0.9, long holdtime = 1, float attack = 1, float release = 0.9995); +// float compressor(float input, float ratio, float threshold = 0.9, float attack = 1, float release = 0.9995); +// float compress(float input); + +// float input; +// float ratio; +// float currentRatio; +// float threshold; +// float output; +// float attack; +// float release; +// float amplitude; + +// void setAttack(float attackMS); +// void setRelease(float releaseMS); +// void setThreshold(float thresholdI); +// void setRatio(float ratioF); +// long holdtime; +// long holdcount; +// int attackphase, holdphase, releasephase; +// }; + +// /* The class is deprecated, use maxiEnvGen instead */ + +// class maxiEnv +// { + +// public: +// float ar(float input, float attack = 1, float release = 0.9, long holdtime = 1, int trigger = 0); +// float adsr(float input, float attack = 1, float decay = 0.99, float sustain = 0.125, float release = 0.9, long holdtime = 1, int trigger = 0); +// float adsr(float input, int trigger); +// float input; +// float output; +// float attack; +// float decay; +// float sustain; +// float release; +// float amplitude; + +// void setRelease(float releaseMS); +// void setDecay(float decayMS); + +// //old method - not actually in MS +// void setAttack(float attackMS); +// //new methods: these are in MS +// void setAttackMS(float attackMS); + +// void setSustain(float sustainL); + +// int trigger; + +// long holdtime = 1; +// long holdcount; +// int attackphase, decayphase, sustainphase, holdphase, releasephase; + +// // ------------------------------------------------ +// // getters/setters +// int getTrigger() const +// { +// return trigger; +// } + +// void setTrigger(int trigger) +// { +// this->trigger = trigger; +// } + +// // ------------------------------------------------ +// }; + +class ADSRLite { + public: + + enum envStage{WAITTOTRIG, ATTACK, DECAY, SUSTAIN, RELEASE}; + + __attribute__((always_inline)) void setAttackTime(float attackTimeMs, const float kSampleRate) { + if (attackTimeMs > 0.f) { + attackIncFull = 1.f/((attackTimeMs * 0.001f) * kSampleRate); + }else{ + attackIncFull = 0.f; + } + attackInc = attackIncFull; + } + + inline void setReleaseTime(float releaseTimeMs, const float kSampleRate) { + releaseMs = releaseTimeMs; + } + + void setup(float attackTimeMs, float decayTimeMs, float newSustainLevel, float releaseTimeMs, const float kSampleRate) { + setAttackTime(attackTimeMs, kSampleRate); + if (decayTimeMs > 0.f) { + decayInc = 1.f/((decayTimeMs * 0.001f) * kSampleRate); + }else{ + decayInc = 0.f; + } + sustainLevel = newSustainLevel; + decayInc *= (1.f - sustainLevel); + // releaseMs = releaseTimeMs; + setReleaseTime(releaseTimeMs, kSampleRate); + } + + __attribute__((hot)) __attribute__((always_inline)) float play() { + + switch(stage) { + case envStage::WAITTOTRIG: + { + envelopeValue = 0.f; + break; + } + case envStage::ATTACK: + { + envelopeValue += attackInc; + if (envelopeValue >= 1.f) { + stage = envStage::DECAY; + } + break; + } + case envStage::DECAY: + { + envelopeValue -= decayInc; + if (envelopeValue<=sustainLevel) { + stage = envStage::SUSTAIN; + } + break; + } + case envStage::SUSTAIN: + { + // envelopeValue = sustainLevel; + break; + } + case envStage::RELEASE: + { + envelopeValue -= relInc; + if (envelopeValue <= 0.f) { + stage = envStage::WAITTOTRIG; + envelopeValue=0.f; + } + break; + } + } + return envelopeValue * velocity; + } + + __attribute__((always_inline)) void reset() { + stage = envStage::WAITTOTRIG; + envelopeValue=0; + + } + + __attribute__((always_inline)) void trigger(float vel) { + stage = envStage::ATTACK; + attackInc = attackIncFull * (1.f - envelopeValue); + velocity = vel; + } + + __attribute__((always_inline)) void triggerIfReady(float vel) { + if (stage == envStage::WAITTOTRIG) { + trigger(vel); + } + } + + __attribute__((always_inline)) void release() { + if (releaseMs > 0) { + relInc = 1.f/((releaseMs / 1000.f) * maxiSettings::sampleRate); + relInc *= envelopeValue; + stage = envStage::RELEASE; + } + else { + relInc = 0.f; + stage = envStage::WAITTOTRIG; + } + } + +private: + envStage stage = envStage::WAITTOTRIG; + float attackInc=0, attackIncFull=0, decayInc=0, sustainLevel=0,relInc=0, releaseMs; + float envelopeValue=0; + float velocity = 1.f; +}; + +/** +Conversion functions +*/ +class maxiConvert +{ +public: + /*!Convert from MIDI note number to frequency (Hz) \param midinote A MIDI note number*/ + static float mtof(int midinote); + + /*!Convert from milliseconds to samples \param timeMs The number of milliseconds*/ + static size_t msToSamps(float timeMs) + { + return static_cast(timeMs / 1000.0 * maxiSettings::sampleRate); + } + /*!Convert from samples to milliseconds \param samples The number of samples*/ + static float sampsToMs(size_t samples) + { + return samples / maxiSettings::sampleRate * 1000.0; + } + + /*!Convert from amplitude to decibels \param amp Amplitude*/ + static float ampToDbs(float amp) { + return std::log10(amp + 1e-7) * 20.0f; + } + /*!Convert from decibels to amplitude \param dbs Decibels*/ + static float dbsToAmp(float dbs) { + return powf(10.f, dbs * 0.05f); + } +}; + +using convert = maxiConvert; + +/** + * Sample and hold effect: samples the input signal periodically and outputs that value + */ +class maxiSampleAndHold +{ +public: + /*!Process a signal \param sigIn a signal \param holdTimeMs The length of the sampling period \returns the sampled signal*/ + inline float sah(float sigIn, float holdTimeMs) + { + float holdTimeSamples = convert::msToSamps(holdTimeMs); + + if (phase >= holdTimeSamples) + { + phase -= holdTimeSamples; + } + if (phase < 1.0) + holdValue = sigIn; + phase++; + return holdValue; + } + +private: + float phase = 0; + float holdValue = 0; + bool firstRun = 1; +}; + +/** + * Detect positive zero-crossings: the point in time when a signal transitions from 0 or less, to above zero + */ +class maxiZeroCrossingDetector +{ +public: + maxiZeroCrossingDetector(); + + /*! Returns true when a positive zero-crossing occurs, othersize false \param x A signal */ + inline bool zx(float x) + { + bool res = 0; + if (previous_x <= 0 && x > 0) + { + res = 1; + } + previous_x = x; + return res; + } + +private: + float previous_x = 0; +}; + +/** + * Calculate the zero crossing rate of a signal + * This is a fairly crude measure of frequency, which is confounded by complex waveforms and noise + */ +class maxiZeroCrossingRate { + public: + maxiZeroCrossingRate(); + void setup() { + buf.setup(maxiSettings::sampleRate+1); + } + /*!Calculate the zero cross rate \param signal a signal \returns the zero crossing rate in Hz*/ + float play(float signal) { + if (zxd.zx(signal)) { + buf.push(1); + runningCount++; + }else{ + buf.push(0); + } + runningCount -= buf.tail(maxiSettings::sampleRate); + return runningCount; + } + + private: + maxiRingBuf buf; + float runningCount=0; + maxiZeroCrossingDetector zxd; +}; + + +class maxiZeroCrossingAvg { +public: + static const size_t kBufferSize = 16; + + maxiZeroCrossingAvg() : + elapsed_samples_(0), + median_filt_(kBufferSize), + cached_value_(0), + prev_signal_(0), + dc_filter_(0.99f), + one_over_sr_(1) {} + + void setup() { + elapsed_samples_ = 0; + cached_value_ = 0; + prev_signal_ = 0; + one_over_sr_ = 1.f/static_cast(maxiSettings::getSampleRate()); + } + + float process(float signal) { + // High-pass filter to remove DC + signal = signal - prev_signal_ * dc_filter_; + prev_signal_ = signal; + + // Add hysteresis to avoid noise triggering + if (zxd.zx(signal) && elapsed_samples_ > 10) { // Minimum period check + // Add value to buffer + size_t median_samples = median_filt_.process(elapsed_samples_); + + // Sanity check on period + if (median_samples > 0) { + // Convert to period + float value = static_cast(median_samples) * one_over_sr_; + // Then hz + value = 1.f/value; + + // Range check + if (value < maxiSettings::getSampleRate()/2.f) { + cached_value_ = value; + } + } + + elapsed_samples_ = 0; + } + + elapsed_samples_++; + return cached_value_; + } + +protected: + maxiZeroCrossingDetector zxd; + size_t elapsed_samples_; + MedianFilter median_filt_; + float cached_value_; + float prev_signal_; + float dc_filter_; + float one_over_sr_; +}; + +// //needs oversampling + +class maxiNonlinearity +{ +public: + maxiNonlinearity(){}; + /** atan distortion, see http://www.musicdsp.org/showArchiveComment.php?ArchiveID=104 + * \param in A signal + * \param shape from 1 (soft clipping) to infinity (hard clipping) + */ + float atanDist(const float in, const float shape); + /** Faster but 'lower quality' version of atan distortion + * \param in A signal + * \param shape from 1 (soft clipping) to infinity (hard clipping) + */ + float fastAtanDist(const float in, const float shape); + /** Cliping with nicer harmonics \param x A signal*/ + float softclip(float x); + /** Cliping with nastier harmonics \param x A signal*/ + float hardclip(float x); + /** + * asymmetric clipping: chose the shape of curves for both positive and negative values of x + * try it here https://www.desmos.com/calculator/to6eixatsa + * \param x A signal + * \param a Exponent for the positive curve + * \param b Exponent for the negative curve + */ + float asymclip(float x, float a, float b); + /*! Fast atan distortion \param x A signal */ + float fastatan(float x); +}; + +inline float maxiNonlinearity::asymclip(float x, float a, float b) +{ + + if (x >= 1) + { + x = 1; + } + else if (x <= -1) + { + x = -1; + } + else if (x < 0) + { + x = -(std::powf(-x, a)); + } + else + { + x = std::powf(x, b); + } + return x; +} + +inline float maxiNonlinearity::hardclip(float x) +{ + x = x >= 1 ? 1 : (x <= -1 ? -1 : x); + return x; +} + +inline float maxiNonlinearity::softclip(float x) +{ + if (x >= 1.f) + { + x = 1.f; + } + else if (x <= -1.f) + { + x = -1.f; + } + else + { + x = (2.f / 3.0f) * (x - std::powf(x, 3.f) / 3.0f); + } + return x; +} + +inline float maxiNonlinearity::fastatan(float x) +{ + return (x / (1.0f + 0.28f * (x * x))); +} + +inline float maxiNonlinearity::atanDist(const float in, const float shape) +{ + float out; + out = (1.0f / atan(shape)) * atan(in * shape); + return out; +} + +inline float maxiNonlinearity::fastAtanDist(const float in, const float shape) +{ + float out; + out = (1.0f / fastatan(shape)) * fastatan(in * shape); + return out; +} + +/** + * A flanger effect + */ +template +class maxiFlanger +{ +public: + + maxiFlanger(); + //delay = delay time - ~800 sounds good + //feedback = 0 - 1 + //speed = lfo speed in Hz, 0.0001 - 10 sounds good + //depth = 0 - 1 + /** + * Apply a flanger effect to a signal + * \param input a signal + * \param delay the amount of delay (in samples) + * \param feedback the amount of feedback, 0-1 + * \param speed the speed of the flanger LFO, in Hz + * \param depth the depth of the LFO, 0-1 + * \returns the input signal, flanged + */ + + float flange(const float input, const unsigned int delay, const float feedback, const float speed, const float depth); + maxiDelayline dl; + maxiOsc lfo; +}; + + +template +maxiFlanger::maxiFlanger() { +} + +template +inline float maxiFlanger::flange(const float input, const unsigned int delay, const float feedback, const float speed, const float depth) +{ + float output; + float lfoVal = lfo.triangle(speed); + output = dl.play(input, delay + (lfoVal * depth * delay) + 1.f, feedback); + return (output + input) / 2.0f; +} + +/** + * A chorus effect + */ + +template +class maxiChorus +{ +public: + //delay = delay time - ~800 sounds good + //feedback = 0 - 1 + //speed = lfo speed in Hz, 0.0001 - 10 sounds good + //depth = 0 - 1 + /** + * Apply a chorus effect to a signal + * \param input a signal + * \param delay the amount of delay (in milliseconds, recommended 1-1000) + * \param feedback the amount of feedback, 0-1 + * \param speed the speed of the chorus, in Hz + * \param depth the depth of the chorus effect, 0-1 + * \returns the input signal with chorus applied + */ + float chorus(const float input, const unsigned int delay, const float feedback, const float speed, const float depth); +private: + maxiDelayline dl, dl2; + maxiOsc lfo; + maxiFilter lopass; +}; + + +template +inline float maxiChorus::chorus(const float input, const unsigned int delay, const float feedback, const float speed, const float depth) +{ + float output1, output2; + float lfoVal = lfo.noise(); + lfoVal = lopass.lores(lfoVal, speed, 1.0) * 2.0; + output1 = dl.dl(input, delay + (lfoVal * depth * delay) + 1, feedback); + output2 = dl2.dl(input, (delay + (lfoVal * depth * delay * 1.02) + 1) * 0.98, feedback * 0.99); + output1 *= (1.0 - fabs(output1)); + output2 *= (1.0 - fabs(output2)); + return (output1 + output2 + input) / 3.0; +} + +template +class maxiEnvelopeFollowerType +{ +public: + maxiEnvelopeFollowerType() + { + setAttack(100); + setRelease(100); + env = 0; + } + void setAttack(T attackMS) + { + attack = pow(0.01, 1.0 / (attackMS * maxiSettings::sampleRate * 0.001f)); + } + void setRelease(T releaseMS) + { + release = powf(0.01f, 1.0f / (releaseMS * maxiSettings::sampleRate * 0.001f)); + } + T __force_inline play(T input) + { + input = fabsf(input); + if (input > env) + env = attack * (env - input) + input; + else + env = release * (env - input) + input; + return env; + } + void reset() { env = 0.f; } + inline T getEnv() { return env; } + inline void setEnv(T val) { env = val; } + +private: + T attack, release, env; +}; + +typedef maxiEnvelopeFollowerType maxiEnvelopeFollower; +typedef maxiEnvelopeFollowerType maxiEnvelopeFollowerF; + +/** + * A simple high pass filter to block DC + */ +class maxiDCBlocker +{ +public: + float xm1, ym1; + maxiDCBlocker() : xm1(0), ym1(0) {} + /*! Remove DC from a signal \param input a signal \param R the sensitivity (0-1) */ + inline float play(float input, float R) + { + ym1 = input - xm1 + R * ym1; + xm1 = input; + return ym1; + } +}; + +/** + State Variable Filter + + algorithm from http://www.cytomic.com/files/dsp/SvfLinearTrapOptimised.pdf + usage: + + filter.setCutoff(param1); + filter.setResonance(param2); + + w = filter.play(w, 0.0, 1.0, 0.0, 0.0); + + */ +class maxiSVF +{ +public: + maxiSVF() : v0z(0), v1(0), v2(0) { setParams(1000, 1); } + + /*!Set the cutoff frequency \param cutoff Cuttoff frequency (20 < cutoff < 20000)*/ + inline void setCutoff(float cutoff) + { + setParams(cutoff, res); + } + + /*! Set the resonance of the filter \param q From 0 upwards, starts to ring from 2-3ish, cracks a bit around 10*/ + inline void setResonance(float q) + { + setParams(freq, q); + } + + /**run the filter, and get a mixture of lowpass, bandpass, highpass and notch outputs + *\param w The signal to be filtered + \param lpmix the amount of low pass filtering (0-1) + \param bpmix the amount of bandpass pass filtering (0-1) + \param hpmix the amount of high pass filtering (0-1) + \param notchmix the amount of notch filtering (0-1) + */ + float __force_inline play(float w, float lpmix, float bpmix, float hpmix, float notchmix) + { + float low, band, high, notch; + float v1z = v1; + float v2z = v2; + float v3 = w + v0z - 2.0f * v2z; + v1 += g1 * v3 - g2 * v1z; + v2 += g3 * v3 + g4 * v1z; + v0z = w; + low = v2; + band = v1; + high = w - k * v1 - v2; + notch = w - k * v1; + return (low * lpmix) + (band * bpmix) + (high * hpmix) + (notch * notchmix); + } + + void __force_inline setParams(const float _freq, const float _res) + { + freq = _freq; + res = _res; + g = tanf(PI * freq * maxiSettings::one_over_sampleRate); + damping = res == 0.f ? 0.f : 1.0f / res; + k = damping; + ginv = g / (1.0f + g * (g + k)); + g1 = ginv; + g2 = 2.0f * (g + k) * ginv; + g3 = g * ginv; + g4 = 2.0f * ginv; + } + + private: + + float v0z, v1, v2, g, damping, k, ginv, g1, g2, g3, g4; + float freq, res; +}; + +// /** Biquad filters +// * based on http://www.earlevel.com/main/2011/01/02/biquad-formulas/ and https://ccrma.stanford.edu/~jos/fp/Direct_Form_II.html +// */ +// class maxiBiquad +// { +// public: +// maxiBiquad() {}; +// /*! A variety of filter types*/ +// enum filterTypes +// { +// LOWPASS, +// HIGHPASS, +// BANDPASS, +// NOTCH, +// PEAK, +// LOWSHELF, +// HIGHSHELF +// }; + +// /*! Process a signal through the filter \param input A signal*/ +// inline float __attribute__((always_inline)) play(const float input) +// { +// v0_ = input - (b1 * v1_) - (b2 * v2_); +// const float y = (a0 * v0_) + (a1 * v1_) + (a2 * v2_); +// v2_ = v1_; +// v1_ = v0_; +// return y; +// } + +// /** Configure the filter +// * \param filtType The type of filter, set from maxiBiquad::filterTypes +// * \param cutoff The filter cutoff frequency in Hz +// * \param Q The resonance of the filter +// * \param peakGain The gain of the filter (only used for PEAK, HIGHSHELF and LOWSHELF) +// */ +// inline void set(filterTypes filtType, float cutoff, float Q, float peakGain) +// { +// float norm = 0; +// float V = powf(10.0, fabsf(peakGain) * 0.05f); +// float K = tanf(PI * cutoff * maxiSettings::one_over_sampleRate); +// switch (filtType) +// { +// case LOWPASS: +// norm = 1.0 / (1.0 + K / Q + K * K); +// a0 = K * K * norm; +// a1 = 2.0 * a0; +// a2 = a0; +// b1 = 2.0 * (K * K - 1.0) * norm; +// b2 = (1.0 - K / Q + K * K) * norm; +// break; + +// case HIGHPASS: +// norm = 1. / (1. + K / Q + K * K); +// a0 = 1 * norm; +// a1 = -2 * a0; +// a2 = a0; +// b1 = 2 * (K * K - 1) * norm; +// b2 = (1 - K / Q + K * K) * norm; +// break; + +// case BANDPASS: +// norm = 1. / (1. + K / Q + K * K); +// a0 = K / Q * norm; +// a1 = 0.; +// a2 = -a0; +// b1 = 2. * (K * K - 1.) * norm; +// b2 = (1. - K / Q + K * K) * norm; +// break; + +// case NOTCH: +// norm = 1. / (1. + K / Q + K * K); +// a0 = (1. + K * K) * norm; +// a1 = 2. * (K * K - 1.) * norm; +// a2 = a0; +// b1 = a1; +// b2 = (1. - K / Q + K * K) * norm; +// break; + +// case PEAK: +// if (peakGain >= 0.0) +// { // boost +// norm = 1. / (1. + 1. / Q * K + K * K); +// a0 = (1. + V / Q * K + K * K) * norm; +// a1 = 2. * (K * K - 1.) * norm; +// a2 = (1. - V / Q * K + K * K) * norm; +// b1 = a1; +// b2 = (1. - 1. / Q * K + K * K) * norm; +// } +// else +// { // cut +// norm = 1. / (1. + V / Q * K + K * K); +// a0 = (1. + 1 / Q * K + K * K) * norm; +// a1 = 2. * (K * K - 1) * norm; +// a2 = (1. - 1. / Q * K + K * K) * norm; +// b1 = a1; +// b2 = (1. - V / Q * K + K * K) * norm; +// } +// break; +// case LOWSHELF: +// if (peakGain >= 0.) +// { // boost +// norm = 1.f / (1.f + SQRT2 * K + K * K); +// a0 = (1. + sqrtf(2.f * V) * K + V * K * K) * norm; +// a1 = 2. * (V * K * K - 1.) * norm; +// a2 = (1. - sqrtf(2. * V) * K + V * K * K) * norm; +// b1 = 2. * (K * K - 1.) * norm; +// b2 = (1. - SQRT2 * K + K * K) * norm; +// } +// else +// { // cut +// norm = 1. / (1. + sqrt(2. * V) * K + V * K * K); +// a0 = (1. + SQRT2 * K + K * K) * norm; +// a1 = 2. * (K * K - 1.) * norm; +// a2 = (1. - SQRT2 * K + K * K) * norm; +// b1 = 2. * (V * K * K - 1.) * norm; +// b2 = (1. - sqrt(2. * V) * K + V * K * K) * norm; +// } +// break; +// case HIGHSHELF: +// if (peakGain >= 0.) +// { // boost +// norm = 1. / (1. + SQRT2 * K + K * K); +// a0 = (V + sqrt(2. * V) * K + K * K) * norm; +// a1 = 2. * (K * K - V) * norm; +// a2 = (V - sqrt(2. * V) * K + K * K) * norm; +// b1 = 2. * (K * K - 1) * norm; +// b2 = (1. - SQRT2 * K + K * K) * norm; +// } +// else +// { // cut +// norm = 1. / (V + sqrt(2. * V) * K + K * K); +// a0 = (1. + SQRT2 * K + K * K) * norm; +// a1 = 2. * (K * K - 1.) * norm; +// a2 = (1. - SQRT2 * K + K * K) * norm; +// b1 = 2. * (K * K - V) * norm; +// b2 = (V - sqrt(2. * V) * K + K * K) * norm; +// } +// break; +// } +// } + +// private: +// float a0 = 0, a1 = 0, a2 = 0, b1 = 0, b2 = 0; +// // filterTypes filterType; +// const float SQRT2 = sqrt(2.f); +// float v0_ = 0, v1_ = 0, v2_ = 0; +// }; + +class maxiBiquad +{ +public: + maxiBiquad() {}; + + enum filterTypes + { + LOWPASS, + HIGHPASS, + BANDPASS, + NOTCH, + PEAK, + LOWSHELF, + HIGHSHELF + }; + + // HOT PATH - optimized for Cortex-M33 FPU + __attribute__((hot)) __attribute__((always_inline)) + inline float play(const float input) + { + // Reordered for better FMA (fused multiply-add) utilization + const float v0 = input - (b1 * v1_) - (b2 * v2_); + const float y = (a0 * v0) + (a1 * v1_) + (a2 * v2_); + + // Shift state - compiler will optimize register usage + v2_ = v1_; + v1_ = v0; + + // Flush denormals to zero to prevent CPU slowdown and numerical instability + if (fabsf(v1_) < 1e-15f) v1_ = 0.0f; + if (fabsf(v2_) < 1e-15f) v2_ = 0.0f; + + return y; + } + + inline void set(filterTypes filtType, float cutoff, float Q, float peakGain) + { + // Pre-compute common terms + const float K = tanf(PI * cutoff * maxiSettings::one_over_sampleRate); + const float K2 = K * K; + const float K_Q = K / Q; + const float norm_denom = 1.0f + K_Q + K2; + + switch (filtType) + { + case LOWPASS: + { + const float norm = 1.0f / norm_denom; + a0 = K2 * norm; + a1 = 2.0f * a0; + a2 = a0; + b1 = 2.0f * (K2 - 1.0f) * norm; + b2 = (1.0f - K_Q + K2) * norm; + break; + } + + case HIGHPASS: + { + const float norm = 1.0f / norm_denom; + a0 = norm; + a1 = -2.0f * a0; + a2 = a0; + b1 = 2.0f * (K2 - 1.0f) * norm; + b2 = (1.0f - K_Q + K2) * norm; + break; + } + + case BANDPASS: + { + const float norm = 1.0f / norm_denom; + a0 = K_Q * norm; + a1 = 0.0f; + a2 = -a0; + b1 = 2.0f * (K2 - 1.0f) * norm; + b2 = (1.0f - K_Q + K2) * norm; + break; + } + + case NOTCH: + { + const float norm = 1.0f / norm_denom; + const float one_plus_K2 = 1.0f + K2; + a0 = one_plus_K2 * norm; + a1 = 2.0f * (K2 - 1.0f) * norm; + a2 = a0; + b1 = a1; + b2 = (1.0f - K_Q + K2) * norm; + break; + } + + case PEAK: + { + const float V = powf(10.0f, fabsf(peakGain) * 0.05f); + const float V_Q = V / Q; + + if (peakGain >= 0.0f) + { // boost + const float norm = 1.0f / norm_denom; + a0 = (1.0f + V_Q * K + K2) * norm; + a1 = 2.0f * (K2 - 1.0f) * norm; + a2 = (1.0f - V_Q * K + K2) * norm; + b1 = a1; + b2 = (1.0f - K_Q + K2) * norm; + } + else + { // cut + const float norm = 1.0f / (1.0f + V_Q * K + K2); + a0 = norm_denom * norm; + a1 = 2.0f * (K2 - 1.0f) * norm; + a2 = (1.0f - K_Q + K2) * norm; + b1 = a1; + b2 = (1.0f - V_Q * K + K2) * norm; + } + break; + } + + case LOWSHELF: + { + const float V = powf(10.0f, fabsf(peakGain) * 0.05f); + const float VK2 = V * K2; + + if (peakGain >= 0.0f) + { // boost + const float norm = 1.0f / (1.0f + SQRT2 * K + K2); + const float sqrt2V = sqrtf(2.0f * V); + a0 = (1.0f + sqrt2V * K + VK2) * norm; + a1 = 2.0f * (VK2 - 1.0f) * norm; + a2 = (1.0f - sqrt2V * K + VK2) * norm; + b1 = 2.0f * (K2 - 1.0f) * norm; + b2 = (1.0f - SQRT2 * K + K2) * norm; + } + else + { // cut + const float sqrt2V = sqrtf(2.0f * V); + const float norm = 1.0f / (1.0f + sqrt2V * K + VK2); + a0 = (1.0f + SQRT2 * K + K2) * norm; + a1 = 2.0f * (K2 - 1.0f) * norm; + a2 = (1.0f - SQRT2 * K + K2) * norm; + b1 = 2.0f * (VK2 - 1.0f) * norm; + b2 = (1.0f - sqrt2V * K + VK2) * norm; + } + break; + } + + case HIGHSHELF: + { + const float V = powf(10.0f, fabsf(peakGain) * 0.05f); + const float sqrt2V = sqrtf(2.0f * V); + + if (peakGain >= 0.0f) + { // boost + const float norm = 1.0f / (1.0f + SQRT2 * K + K2); + a0 = (V + sqrt2V * K + K2) * norm; + a1 = 2.0f * (K2 - V) * norm; + a2 = (V - sqrt2V * K + K2) * norm; + b1 = 2.0f * (K2 - 1.0f) * norm; + b2 = (1.0f - SQRT2 * K + K2) * norm; + } + else + { // cut + const float norm = 1.0f / (V + sqrt2V * K + K2); + a0 = (1.0f + SQRT2 * K + K2) * norm; + a1 = 2.0f * (K2 - 1.0f) * norm; + a2 = (1.0f - SQRT2 * K + K2) * norm; + b1 = 2.0f * (K2 - V) * norm; + b2 = (V - sqrt2V * K + K2) * norm; + } + break; + } + } + } + +private: + float a0 = 0.0f, a1 = 0.0f, a2 = 0.0f, b1 = 0.0f, b2 = 0.0f; + static constexpr float SQRT2 = 1.41421356237f; // Compile-time constant + float v0_ = 0.0f, v1_ = 0.0f, v2_ = 0.0f; +}; + +/** + * Cross-fade between two signals, using equal-power panning + */ +class maxiXFade +{ +public: + maxiXFade() {} + + /** + * Cross-fade between stereo signals + * \param ch1 a vector containing left and right components of channel 1 + * \param ch2 a vector containing left and right components of channel 2 + * \param xfader the cross-fader position, -1=100% ch1, 1=100% ch2, 0=an equal mix of both channels + */ + static std::vector xfade(std::vector &ch1, std::vector &ch2, float xfader) + { + xfader = maxiMap::clamp(xfader, -1, 1); + float xfNorm = maxiMap::linlin(xfader, -1, 1, 0, 1); + float gainCh1 = sqrt(1.0 - xfNorm); + float gainCh2 = sqrt(xfNorm); + std::vector output(ch1.size(), 0.0); + for (size_t i = 0; i < output.size(); i++) + { + output[i] = (ch1[i] * gainCh1) + (ch2[i] * gainCh2); + } + return output; + } + /** + * Cross-fade between mono signals + * \param ch1 the signal for channel 1 + * \param ch2 the signal for channel 2 + * \param xfader the cross-fader position, -1=100% ch1, 1=100% ch2, 0=an equal mix of both channels + */ + static float xfade(float ch1, float ch2, float xfader) + { + std::vector vch1 = {ch1}; + std::vector vch2 = {ch2}; + return maxiXFade::xfade(vch1, vch2, xfader)[0]; + } +}; + +/** + * A line generator (you can also use maxiEnvGen) + */ +class maxiLine +{ +public: + maxiLine() {} + /*! Generate a line, when a trigger is received \param trigger a signal*/ + inline float play(float trigger) + { + if (!lineComplete) + { + if (trigEnable && !triggered) + { + triggered = (trigger > 0.0 && lastTrigVal <= 0.0); + lineValue = lineStart; + } + if (triggered) + { + lineValue += inc; + if (inc <= 0) + { + lineComplete = lineValue <= lineEnd; + } + else + { + lineComplete = lineValue >= lineEnd; + } + if (lineComplete) + { + if (!oneShot) + { + reset(); + } + } + } + lastTrigVal = trigger; + } + return lineValue; + } + + /** Setup the line before it is triggered + * \param start the starting value of the line + * \param end the ending value of the line + * \param durationMs the duration of the line (in milliseconds) + * \param isOneShot true is the line should not play once, or false if it should loop + * \returns a signal + */ + + inline void prepare(float start, float end, float durationMs, bool isOneShot) + { + lineValue = lineStart; + lineStart = start; + lineEnd = end; + float lineMag = end - start; + float durInSamples = durationMs / 1000.0 * maxiSettings::sampleRate; + inc = lineMag / durInSamples; + oneShot = isOneShot; + reset(); + } + + /*! \param 0 or less to protect the generator from triggering, more than 0 to enable it to be triggered*/ + inline void triggerEnable(float on) + { + trigEnable = on > 0.0; + } + /*! \returns true if the line generator has finished*/ + inline bool isLineComplete() + { + return lineComplete; + } + +private: + float phase = 0; + float lineValue = 0; + float inc = 0; + float lastTrigVal = -1; + float trigEnable = false; + float triggered = false; + bool lineComplete = false; + float lineStart = 0; + float lineEnd = 0; + bool oneShot = 1; + void reset() + { + triggered = false; + lineComplete = false; + } +}; + +// /** +// * A kuramoto oscillator +// * +// * This is an adaptive oscillator that adjusts its own phase in relation to the phases of other kuramoto oscillators +// * +// * For further info, see +// * https://tutorials.siam.org/dsweb/cotutorial/index.php?s=3&p=0 +// * https://www.complexity-explorables.org/explorables/ride-my-kuramotocycle/ +// */ +// class maxiKuramotoOscillator +// { +// public: +// maxiKuramotoOscillator() {} + +// /** +// * Run the oscillator +// * \param freq the intended frequency of the oscillator +// * \param K the strengh of coupling between oscillators +// * \param phases a vector of the phases of other kuramoto oscillators +// * \returns the current amplitude of the oscillator +// */ +// inline float play(float freq, float K, std::vector phases) +// { + +// float phaseAdj = 0; +// for (float v : phases) +// { +// phaseAdj += sin(v - phase); +// } +// phase += dt * (freq + ((K / phases.size()) * phaseAdj)); +// if (phase >= TWOPI) +// phase -= TWOPI; +// else if (phase < 0) +// phase += TWOPI; +// return phase; +// } +// /*! Set the phase of the oscillator \param newPhase the phase, 0 - 2PI*/ +// inline void setPhase(float newPhase) { phase = newPhase; } +// /*! \returns the current phase of the oscillator*/ +// inline float getPhase() { return phase; } + +// private: +// float phase = 0.0; +// float dt = TWOPI / maxiSettings::sampleRate; +// }; + +// /** +// * This class managed a group of Kuramoto oscillators (see maxiKuramotoOscillator) +// */ +// class maxiKuramotoOscillatorSet +// { +// public: +// /** +// * \param N The number of oscillators in the group +// */ +// maxiKuramotoOscillatorSet(const size_t N) +// { +// oscs.resize(N); +// phases.resize(N); +// }; +// /*! Set the phases of all of the oscillators \param phases a vector of phases (all 0 - 2PI)*/ +// void setPhases(const std::vector &phases) +// { +// size_t iOsc = 0; +// for (float v : phases) +// { +// oscs[iOsc].setPhase(v); +// iOsc++; +// } +// } + +// /*! Set the phase of a single oscillator \param phase the phase, 0 - 2PI \param oscillatorIdx the index of the oscillator*/ +// void setPhase(const float phase, const size_t oscillatorIdx) +// { +// oscs[oscillatorIdx].setPhase(phase); +// } + +// /*! Get the phase of a single oscillator \param i the index of the oscillator \returns the oscillator's phase*/ +// float getPhase(size_t i) +// { +// return oscs[i].getPhase(); +// } + +// /*! \returns the number of oscillators in the group*/ +// size_t size() +// { +// return oscs.size(); +// } + +// /** +// * Run all of the oscillators +// * \param freq the intended frequency +// * \param K the coupling strength between oscillators +// * \returns a mix of all of the oscillator signals in the group +// */ +// float play(float freq, float K) +// { +// float mix = 0.0; +// //gather phases +// for (size_t i = 0; i < phases.size(); i++) +// { +// phases[i] = oscs[i].getPhase(); +// } +// for (auto &v : oscs) +// { +// mix += v.play(freq, K, phases); +// } +// return mix / phases.size(); +// } + +// protected: +// std::vector oscs; +// std::vector phases; +// }; + + +// /** +// * Run a group of kuramoto oscillators with asynchronous updates. Instead of setting all of the phasors at once, you can set the phases or arbitrary individuals at abritrary times. This class updates the local oscillator according to best guesses of the phase of remote oscillators. +// * This is useful if the other oscillators are not running on your computer, but are linked on a network. For example you could use this class for a shared network clock that is robust to timing jitter. +// * +// */ +// class maxiAsyncKuramotoOscillator : public maxiKuramotoOscillatorSet +// { +// public: +// /*! \param N the number of oscillators in the group (including this one)*/ + +// maxiAsyncKuramotoOscillator(const size_t N) : maxiKuramotoOscillatorSet(N){}; + +// /*! Set the phase of a single oscillator, probably in response to receiving this information over your network +// * \param phase the phase, 0 - 2PI \param oscillatorIdx the index of the oscillator +// */ +// void setPhase(const float phase, const size_t oscillatorIdx) +// { +// oscs[oscillatorIdx].setPhase(phase); +// update = 1; +// } + +// /*! Set the phases of all of the oscillators \param phases a vector of phases (all 0 - 2PI)*/ +// void setPhases(const std::vector &phases) +// { +// size_t iOsc = 0; +// for (float v : phases) +// { +// oscs[iOsc].setPhase(v); +// iOsc++; +// } +// update = 1; +// } + + +// /** +// * Run all of the oscillators +// * \param freq the intended frequency +// * \param K the coupling strength between oscillators +// * \returns a mix of all of the oscillator signals in the group +// */ +// float play(float freq, float K) +// { +// float mix = 0.0; +// //gather phases +// if (update) +// { +// for (size_t i = 0; i < phases.size(); i++) +// { +// phases[i] = oscs[i].getPhase(); +// } +// } +// for (auto &v : oscs) +// { +// mix += v.play(freq, update ? K : 0, phases); +// } +// update = 0; +// return mix / phases.size(); +// } + +// /*! Get the phase of a single oscillator \param i the index of the oscillator \returns the oscillator's phase*/ +// float getPhase(size_t i) +// { +// return maxiKuramotoOscillatorSet::getPhase(i); +// } + +// /*! \returns the number of oscillators in the group*/ +// size_t size() +// { +// return maxiKuramotoOscillatorSet::size(); +// } + +// private: +// bool update = 0; +// }; + +// class maxiBits +// { +// public: +// typedef uint32_t bitsig; + +// // static bitsig sig(bitsig v) return v; +// // maxiBits() {} +// // maxiBits(const bitsig v) : t(v) {} + +// static bitsig sig(bitsig v) { return v; } + +// static bitsig at(const bitsig v, const bitsig idx) +// { +// return 1 & (v >> idx); +// } +// static bitsig shl(const bitsig v, const bitsig shift) +// { +// return v << shift; +// } +// static bitsig shr(const bitsig v, const bitsig shift) +// { +// return v >> shift; +// } +// static bitsig r(const bitsig v, const bitsig offset, const bitsig width) +// { +// bitsig mask = maxiBits::l(width); +// bitsig shift = offset - width + 1; +// bitsig x = 0; +// x = v & shl(mask, shift); +// x = x >> shift; +// return x; +// } +// static bitsig land(const bitsig v, const bitsig x) +// { +// return v & x; +// } +// static bitsig lor(const bitsig v, const bitsig x) +// { +// return v | x; +// } +// static bitsig lxor(const bitsig v, const bitsig x) +// { +// return v ^ x; +// } +// static bitsig neg(const bitsig v) +// { +// return ~v; +// } +// static bitsig inc(const bitsig v) +// { +// return v + 1; +// } +// static bitsig dec(const bitsig v) +// { +// return v - 1; +// } +// static bitsig add(const bitsig v, const bitsig m) +// { +// return v + m; +// } +// static bitsig sub(const bitsig v, const bitsig m) +// { +// return v - m; +// } +// static bitsig mul(const bitsig v, const bitsig m) +// { +// return v * m; +// } +// static bitsig div(const bitsig v, const bitsig m) +// { +// return v / m; +// } +// static bitsig gt(const bitsig v, const bitsig m) +// { +// return v > m; +// } +// static bitsig lt(const bitsig v, const bitsig m) +// { +// return v < m; +// } +// static bitsig gte(const bitsig v, const bitsig m) +// { +// return v >= m; +// } +// static bitsig lte(const bitsig v, const bitsig m) +// { +// return v <= m; +// } +// static bitsig eq(const bitsig v, const bitsig m) +// { +// return v == m; +// } +// static bitsig ct(const bitsig v, const bitsig width) +// { +// bitsig x = 0; +// for (size_t i = 0; i < width; i++) +// { +// x += (v & (1 << i)) > 0; +// } +// return x; +// } +// static bitsig l(const bitsig width) +// { +// bitsig v = 0; +// for (size_t i = 0; i < width; i++) +// { +// v += (1 << i); +// } +// return v; +// } + +// static bitsig noise() +// { +// bitsig v = static_cast(rand()); +// return v; +// } + +// static float toSignal(const bitsig t) +// { +// return maxiMap::linlin(t, 0, (float)std::numeric_limits::max(), -1, 1); +// } + +// static float toTrigSignal(const bitsig t) +// { +// return t > 0 ? 1.0 : -1.0; +// } + +// static bitsig fromSignal(const float t) +// { +// const bitsig halfRange = (std::numeric_limits::max() / 2); +// const bitsig val = halfRange + (t * (halfRange - 1)); +// return val; +// } + +// // void sett(maxiBits::bitsig v){t=v;} +// // maxiBits::bitsig gett() const {return t;}; + +// // maxiBits::bitsig t=0; +// }; + +/** + * Count triggers + */ +class maxiCounter +{ +public: + /** Increase each time a trigger is received + * \param incTrigger a signal that triggers the counter to increment + * \param resetTrigger a signal that resets the counter to zero + * \returns the number of triggers received since the beginning or the last reset + */ + float count(float incTrigger, float resetTrigger) + { + if (inctrig.onZX(incTrigger)) + { + value++; + } + if (rstrig.onZX(resetTrigger)) + { + value = 0; + } + return value; + } + +private: + float value = 0; + maxiTrigger inctrig, rstrig; +}; + +/** + * Pull values from an array when a trigger is received, according to a modulateable index + */ +class maxiIndex +{ +public: + maxiIndex(); + /** + * \param trigSig a signal + * \param indexSig a normalised index into the array (0-1) + * \param _values an array of values or signals (modulateable) + * \returns the value at [indexSig] in the array, when a trigger is received in [trigSig] + */ + float pull(const float trigSig, float indexSig, DOUBLEARRAY_REF _values) + { + // float *__arrayStart = __builtin_cheerp_make_regular(_values, 0); + // size_t __arrayLength = _values->get_length(); + // vector values = vector(__arrayStart, __arrayStart + __arrayLength); + NORMALISE_ARRAY_TYPE(_values, values) + if (trig.onZX(trigSig)) + { + if (indexSig < 0) + indexSig = 0; + if (indexSig > 1) + indexSig = 1; + size_t arrayIndex = static_cast(floor(indexSig * 0.99999999 * values.size())); + value = values[arrayIndex]; + } + return value; + } + +private: + maxiTrigger trig; + float value = 0; +}; + +/** + * Read from an array of signals - like supercollider Select.ar + */ +class maxiSelect { +public: + maxiSelect(); + + /** + * \param index an index into the array + * \param values a modulateable array of values + * \param normalised if true, the index should be between 0 and 1, if false, then the index should be between 0 and length(values)-1 + * \returns an item from the array of values, according to the floor or the index value + */ + float play(float index, DOUBLEARRAY_REF values, bool normalised) { + auto arrayLen = F64_ARRAY_SIZE(values); + + if (normalised) { + index *= (arrayLen - 1e-9); + }else{ + //assume index is direct mapping to array element + } + if (index < 0) { + index = 0; + }else if (index >= arrayLen) { + index = arrayLen - 1; + } + float value = F64_ARRAY_AT(values, static_cast(index)); + return value; + } +private: + +}; + +/** + * Read from an array of signals or values, with linear interpolation between neighbours - like supercollider SelectX.ar + */ +class maxiSelectX { +public: + maxiSelectX(); + + /** + * Read from an array with linear interpolation. This can be useful for cross-fading across sets of signals. + * \param index an index into the array + * \param values a modulateable array of values + * \param normalised if true, the index should be between 0 and 1, if false, then the index should be between 0 and length(values)-1 + * \returns an item from the array of values, according to the index, and interpolating between neighbouring values.\n + * e.g if values = {2,3} and normalised index = 0.5, then 2.5 will be returns + */ + float play(float index, DOUBLEARRAY_REF values, bool normalised) { + auto arrayLen = F64_ARRAY_SIZE(values); + + if (normalised) { + index *= (arrayLen - 1e-9); + }else{ + //assume index is direct mapping to array element + } + if (index < 0) { + index = 0; + }else if (index >= arrayLen) { + index = arrayLen - 1; + } + //get indices and interpolation factor + size_t a1 = floor(index); + float mix = index - a1; + size_t a2 = a1 + 1; + if (a2 == arrayLen) a2=0; + //interpolate + float value = (F64_ARRAY_AT(values, a1) * (1.0 -mix)) + + (F64_ARRAY_AT(values, a2) * mix); + return value; + } +private: + +}; + +/** + * Pull sequential values from an array + */ +class maxiStep +{ +public: + maxiStep(); + /** + * Take values from the array when triggered + * \param trigSig A signal to trigger a new value on a positive zero crossing + * \param values An array of values + * \param step The amount that the array index should increase after pulling a new value. This wraps around to zero at the end of the array + */ + float pull(const float trigSig, DOUBLEARRAY values, float step) + { + if (trig.onZX(trigSig)) + { + if (first) { + first=false; + index = 0; + }else{ + auto arrayLen = F64_ARRAY_SIZE(values); + //should this be step % arraylen? how about -ve vals? + if (step > arrayLen) { + step = arrayLen; + } + // LOG(index); + // LOG(arrayLen); + index = index + step; + // LOG(index); + if (index < 0) { + index = arrayLen + index; + // LOG(index); + }else if (index >= arrayLen) { + index = index - arrayLen; + } + } + } + float value = F64_ARRAY_AT(values, static_cast(index)); + return value; + } + + /*! Get the current array index*/ + float getIndex() { + return index; + } + +private: + maxiTrigger trig; + bool first=true; + float index=0; +}; + +/** + * Sequence triggers and numbers, using a list of modulateable ratios to control timing. + */ +class maxiRatioSeq +{ +public: + maxiRatioSeq(); + /** + * Divide a phasor into periods according to a set o ratios, and send a trigger at the start of each period.\n + * Examples ratios: (assuming the phasor takes the length of one bar to cycle and 4/4 timing):\n + * {1,1,1,1} four crotchets\n + * {2,2,2,1,1} three crotchets then two quavers\n + * {4,4,4,1,1,1,1} three crotchets then four semi-quavers\n + * {3,3,2} two dotted crotchets then a crotchet\n + * {1} a semibrieve\n + * {3,3,3,1,1,1} three crotchets followed by a triplet\n + * {33,991,13,153} hmmm - well it might sound interesting?\n + * {maxiMap::linlin(osc.phasor(0.4),0,1,10,20),100} modulate the ratios\n + * \param phase a phasor signal, rising from 0 to 1 (you could use maxiOsc::phasor)\n + * \param times a list of time ratios. The phasor will be divided up into these ratios, and a trigger will be returned at the start of each period\n + * \returns a trigger at the start of each period\n + */ + float playTrig(float phase, DOUBLEARRAY times) + { + if (first) { + first=false; + prevPhase = phase - 1.0 / maxiSettings::sampleRate; + } + float trig = 0; + float sum=0; + size_t seqlen = F64_ARRAY_SIZE(times); + for(size_t i=0; i < seqlen; i++) sum += F64_ARRAY_AT(times,i); + if (prevPhase > phase) + { + //wrapping point + prevPhase = -1.0 / maxiSettings::sampleRate; + } + float accumulatedTime = 0; + for (size_t i = 0; i < seqlen; i++) + { + accumulatedTime += F64_ARRAY_AT(times,i); + float normalisedTime = accumulatedTime / sum; + if (normalisedTime == 1.0) + normalisedTime = 0.0; + if ((prevPhase <= normalisedTime && phase > normalisedTime)) + { + trig = 1; + break; + } + } + prevPhase = phase; + return trig; + } + + /** + * Take values incrementally from a list, with timing controlled by ratios + * \param phase see playTrig + * \param times see playTrig + * \param values an array of numbers. Each time a period starts, a number is returned from this list. Values are taken incrementally and with looping. The contents and length of the list are modulateable. This function is useful for sequencing pitches or controller values. + * \returns a value taken incrementally from the list of values, updated each time a new timing period begins (according to the list of ratios) + */ + float playValues(float phase, DOUBLEARRAY_REF times, DOUBLEARRAY_REF values) + { + // NORMALISE_ARRAY_TYPE(_times, times) + // NORMALISE_ARRAY_TYPE(_values, values) + size_t vallen = F64_ARRAY_SIZE(values); + if (lengthOfValues != vallen) + { + lengthOfValues = vallen; + counter = lengthOfValues - 1; + } + if (playTrig(phase, times)) + { + counter++; + if (counter == vallen) + { + counter = 0; + } + } + return F64_ARRAY_AT(values,counter); + } + +private: + float prevPhase = 0; + size_t counter = 0; + size_t lengthOfValues = 0; + bool first=true; +}; + +/** + * Extend a trigger into a pulse. This is useful for making basic gates in sequences. Use maxiEnvGen for more advanced gate and envelope generation. + */ +class maxiZXToPulse +{ +public: + maxiZXToPulse(); + /** + * Extend a trigger into a pulse. + * \param input a signal + * \param holdTimeInSamples the length of the pulse in samples (use maxiConvert to get this value from milliseconds) + * \returns a pulse, triggered by a zero crossing in the input + */ + float play(float input, float holdTimeInSamples) { + float output =0; + + if (trig.onZX(input)) { + holdCounter = holdTimeInSamples; + } + + if (holdCounter > 0) { + output = 1; + holdCounter--; + } + + return output; + } +private: + maxiTrigger trig; + float holdCounter = 0; +}; + + +/** + * An envelope generator. + */ +class maxiEnvGen { + public: + + static constexpr float HOLD = -46692; + + maxiEnvGen(); + + /*! Get the latest value of the envelope \param trigger A positive zero crossing (or constant 1) starts the envelope*/ + float play(float trigger) { + switch(state) { + case WAITING: + { + if (trigDetector.onZX(trigger)) { + if (F64_ARRAY_SIZE(stages) > 0) { + state = TRIGGERED; + nxcHappened = false; + }else{ + break; + } + } + else { + break; + } + } + case TRIGGERED: + { + //calculate the current value of the envelope + envStage *currStage = &stages[phase]; + //check if the trigger went -ve yet? (used for hold function) + if (holdDetector.onZX(-trigger)) { + nxcHappened = true; + } + if (currStage->hold) { + state = playStates::HOLDING; + }else{ + envval = maxiMap::linlin(pow(currStage->currentlevel,currStage->curve), 0, 1, + currStage->startlevel, + currStage->endlevel); + currStage->counter++; + // cout << currStage->counter << endl; + //move to the next phase? + if (currStage->counter == currStage->length) { + currStage->counter=0; + currStage->currentlevel=0; + phase++; + + }else{ + //calc next bit of current phase + currStage->currentlevel += currStage->gradient; + // cout << currStage.currentlevel << endl; + } + if (retrigger) { + if (retriggerDetector.onZX(trigger)) { + nxcHappened = false; + reset(); + } + } + break; + } + } + case HOLDING: + { + //wait for negative zero crossing + //envval remains unchanged + if (holdDetector.onZX(-trigger)) { + nxcHappened = true; + + } + if (nxcHappened) { + state = playStates::TRIGGERED; + phase++; + } + if (retrigger) { + if (retriggerDetector.onZX(trigger)) { + nxcHappened = false; + reset(); + } + } + break; + } + } + if (phase == F64_ARRAY_SIZE(stages)) { + if (loop) { + reset(); + }else{ + resetAndArm(); + } + } + + return envval; + } + + /** + * Configure the envelope generator + * \param levels An array of levels + * \param times An array of times between the levels, in milliseconds. To make the envelope hold until the first negative zero crossing, use maxiEnvGen::HOLD as the time. Only one hold segment is allowed. + * \param curves An array of exponential curve values to shape each segment (1 = straight, 2= squared, 0.5 = square root etc) + * \param looping True if the envelope should infinitely repeat + * \param allowRetrigger Set to true if the envelope should allow retriggering before it is finished, or false if the envelope should always reach the end before being allowed to restart + * Example C++ usage env.setup({0,1,0},{100,400}, {0.5,1}, false). + * levels should be one element longer than times and curves + * \returns True if the configuration was successful + */ + bool setup(DOUBLEARRAY levels, DOUBLEARRAY times, DOUBLEARRAY curves, bool looping, bool allowRetrigger = false) { + if ((F64_ARRAY_SIZE(levels) == F64_ARRAY_SIZE(times)+1) && (F64_ARRAY_SIZE(levels) == F64_ARRAY_SIZE(curves) + 1)) { + stages.clear(); + float accumulatedTime = 0; + containsHold =0; + for(size_t i=0; i < F64_ARRAY_SIZE(times); i++) { + envStage stage; + stage.startlevel = F64_ARRAY_AT(levels,i); + stage.endlevel = F64_ARRAY_AT(levels,i+1); + float stageTime = F64_ARRAY_AT(times,i); + if (stageTime == maxiEnvGen::HOLD) { + if (containsHold) { + return 0; + } + } + accumulatedTime = setupSegmentTime(stageTime, stage, accumulatedTime); + stage.curve = F64_ARRAY_AT(curves,i); + stage.counter=0; + stage.currentlevel = 0; + stages.push_back(stage); + // cout << "Stage " << stage.startlevel << "\t" << stage.endlevel << "\t" << stage.length << "\t" << stage.gradient << "\t" << stage.curve << endl; + } + loop = looping; + retrigger = allowRetrigger; + resetAndArm(); + return 1; + }else{ + // cout << "maxiEnv::setup - levels array should be one longer than times and curves\n"; + return 0; + } + } + + /*!Restart the envelope immeadiately*/ + void reset() { + if (phase < stages.size()){ + envStage *currStage = &stages[phase]; + currStage->counter = 0; + currStage->currentlevel = 0; + } + phase=0; + state = TRIGGERED; + } + + /*!Stop the envelope and wait for a new trigger to start it*/ + void resetAndArm() { + reset(); + state = WAITING; + } + + /** Set the level of a segment of the envelope \param index The index of the level \param value The new level*/ + bool setLevel(size_t index, float value) { + bool error = 0; + if (index <= stages.size()) { + if (index == stages.size()) { + stages[index-1].endlevel = value; + }else{ + stages[index].startlevel = value; + if (index > 0){ + stages[index-1].endlevel = value; + } + } + }else{ + error = 1; + } + return error; + } + + /** Set the curve of a segment of the envelope \param index The index of the segment \param value The new curve value*/ + bool setCurve(size_t index, float value) { + bool error=0; + if (index <= stages.size()) { + stages[index].curve = value; + } + return error; + } + + /** Set the length of a segment of the envelope \param index The index of the segment \param value The new length (in ms)*/ + bool setTime(size_t index, float value) { + bool error=0; + if (index <= stages.size()) { + if (value == maxiEnvGen::HOLD && containsHold) { + error = 1; + } + if (!error) { + setupSegmentTime(value, stages[index], 0); + } + }else{ + error = 1; + } + return error; + } + + /** + * Helper function to create a triangular envelope + * \param attack Rise time in ms + * \param release Fall time in ms + */ + void setupAR(const float attack, const float release) { + setup({0,1,0}, {attack, release}, {1,1}, false, false); + } + + /** + * Helper function to create a triangular(ish) envelope with sustain section at peak + * The sustain section will end when the trigger input drops below 0 + * \param attack Rise time in ms + * \param release Fall time in ms + */ + void setupASR(const float attack, const float release) { + setup({0,1,1,0}, {attack, maxiEnvGen::HOLD, release}, {1,1,1}, false, false); + } + /** + * Helper function to create an attack-decay-sustain-release envelope + * The sustain section will end when the trigger input drops below 0 + * The envelope will rise from 0 to 1 in the attack segment, then drop to the sustain level before falling to 0. + * \param attack Rise time in ms + * \param decay Decay time in ms + * \param sustain Sustain level + * \param release Fall time in ms + */ + void setupADSR(const float attack, const float decay, const float sustain, const float release) { + setup({0,1,sustain,sustain,0}, {attack, decay, maxiEnvGen::HOLD, release}, {1,1,1,1}, false, false); + } + + /*!Set the envelope to retrigger or not \param val True is the envelope should retrigger, false if not*/ + void setRetrigger(const bool val) { + retrigger = val; + } + /*!Find out if the envelope retriggers*/ + bool getRetrigger() {return retrigger;} + /*!Set the envelope to loop or not \param val True is the envelope should loop, false if not*/ + void setLoop(const bool val) { + loop = val; + } + /*!Find out if the envelope loops */ + bool getLoop() {return loop;} + + private: + size_t phase=0; + float envval = 0; + bool loop = false; + bool retrigger = false; + enum playStates {WAITING, TRIGGERED, HOLDING} state; + bool nxcHappened; + bool containsHold; + struct envStage { + float startlevel; + float endlevel; + float currentlevel; + float gradient; + float curve; + size_t length; + size_t counter; + bool hold; + }; + std::vector stages; + + maxiTrigger trigDetector; + maxiTrigger holdDetector; + maxiTrigger retriggerDetector; + + float setupSegmentTime(const float stageTime, envStage &stage, float accumulatedTime) { + if (stageTime == maxiEnvGen::HOLD) { + stage.length = 0; + stage.hold = 1; + stage.gradient=0; + containsHold = 1; + }else{ + float len = ((stageTime / 1000.0) * maxiSettings::sampleRate) + accumulatedTime; + stage.length = static_cast(floor(len)); + accumulatedTime = len - stage.length; + stage.gradient = 1.0 / stage.length; + stage.hold=0; + } + return accumulatedTime; + } +}; + + +/** + * Poll values to stdout at regular intervals + */ +#ifdef USE_STRINGS +class maxiPoll { + public: + maxiPoll(); + /** + * \param val The value to poll + * \param frequency How often to print this value (Hz) + * \param txt Additional text to br printed before the value + * \returns the value being polled, so this can used as a pass-through function e.g. filter.play(obj.poll(osc.saw(2)),0.5) + */ + float poll(float val, float frequency=4, STRINGCLASS txt="", STRINGCLASS end="\n") { + if (imp.impulse(frequency)) { + LOG(txt); + LOG(val); + LOG(end); + } + return val; + } + private: + maxiOsc imp; +}; +#endif + +/** + * Calculate the Root Mean Square of a signal over a window of time + * This is a good measurement of the amount of power in a signal + */ +class maxiRMS { + public: + maxiRMS(); + + /*!Configure the analyser \param maxLength The maximum length of time to analyse (ms) \param windowSize The size of the window of time to analyse initially (ms, <= maxLength) */ + void setup(float maxLength, float windowSize) { + buf.setup(maxiConvert::msToSamps(maxLength)); + setWindowSize(windowSize); + } + + /*!Set the size of the analysis window \param newWindowSize the size of the analysis window (in ms). Large values will smooth out the measurement, and make it less responsive to transients*/ + void setWindowSize(float newWindowSize) { + size_t windowSizeInSamples = maxiConvert::msToSamps(newWindowSize); + if (windowSizeInSamples <= buf.size() && windowSizeInSamples > 0) { + windowSize = windowSizeInSamples; + windowSizeInv = 1.f / static_cast(windowSize); + } + runningRMS = 0; + } + + /*!Find out the size of the analysis window (in ms)*/ + float getWindowSize() { + return maxiConvert::sampsToMs(windowSize); + } + + /*Analyse the signal \param signal a signal \returns RMS*/ + float play(float signal) { + float sigPow2 = (signal * signal); + runningRMS -= buf.tail(windowSize); + buf.push(sigPow2); + runningRMS += sigPow2; + return sqrtf(runningRMS * windowSizeInv); + } + + private: + maxiRingBuf buf; + size_t windowSize=0; // in samples + float windowSizeInv=1.f; + float runningRMS=0; +}; + + +/** + * The class provides a range of dynamics processing: downward and upward compression, downward and upward expansion, + * sidechaining, attack and release, lookahead and peak or RMS detection + */ + + +class maxiDynamics { + + public: + + enum ANALYSERS {PEAK, RMS}; + + maxiDynamics() { + //define detector functions + inputPeak = [](float sig) { + return abs(sig); + }; + + rms.setup(500,50); + inputRMS = [&](float sig) { + return rms.play(sig); + }; + + //default RMS + inputAnalyser = inputRMS; + + //setup envelopes + arEnvHigh.setupASR(10,10); + arEnvHigh.setRetrigger(false); + arEnvLow.setupASR(10,10); + arEnvLow.setRetrigger(false); + + lookAheadDelay.setup(maxiSettings::sampleRate * 0.1); //max 0.1s + } + + + /** + * This functions compands the signal, providing download compression or upward expansion above an upper thresold, and + * upward compression or downward expansion below a lower threshold. + * \param sig The input signal to be companded + * \param control This signal is used to trigger the compander. Use it for sidechaining, or if no sidechain is needed, use the same signal for this and the input signal + * \param thresholdHigh The high threshold, in Dbs + * \param ratioHigh The ratio for companding above the high threshold + * \param kneeHigh The size of the knee for companding above the high threshold (in Dbs) + * \param thresholdLow The low threshold, in Dbs + * \param ratioLow The ratio for companding below the low threshold + * \param kneeLow The size of the knee for companding below the low threshold (in Dbs) + * \returns a companded signal + */ + float play(float sig, float control, + float thresholdHigh, float ratioHigh, float kneeHigh, + float thresholdLow, float ratioLow, float kneeLow + ) { + const float controlDB = maxiConvert::ampToDbs(inputAnalyser(control)); + float outDB = maxiConvert::ampToDbs(sig); + const float halfKneeHigh = kneeHigh * 0.5f; + //companding above the high threshold + if (ratioHigh > 0) { + if (kneeHigh > 0) { + float lowerKnee = thresholdHigh - (kneeHigh*0.5f); + float higherKnee = thresholdHigh +(kneeHigh*0.5f); + //attack/release + float envRatio = 1.f; + if (controlDB >= lowerKnee) { + float envVal = arEnvHigh.play(1.f); + envRatio = envToRatio(envVal, ratioHigh); + }else { + float envVal = arEnvHigh.play(-1.f); + } + if ((controlDB >= lowerKnee) && (controlDB < higherKnee)) { + float kneeHighOut = ((higherKnee - thresholdHigh) / envRatio) + thresholdHigh; + float kneeRange = (kneeHighOut - lowerKnee); + float t = (controlDB - lowerKnee) / kneeHigh; + //bezier on x only + float curve = ratioHigh > 1.f ? 0.8f : 0.2f; + float kneex = (2.f * (1.f-t) * t * curve) + (t*t); + outDB = lowerKnee + (kneex * kneeRange); + } + else if (controlDB >= higherKnee) { + outDB = ((controlDB - thresholdHigh) / envRatio) + thresholdHigh; + } + } + else { + //no knee + if (controlDB > thresholdHigh) { + float envVal = arEnvHigh.play(1.f); + float envRatio = envToRatio(envVal, ratioHigh); + outDB = ((controlDB - thresholdHigh) / envRatio) + thresholdHigh; + }else { + float envVal = arEnvHigh.play(-1.f); + } + } + } + //companding below the low threshold + if (ratioLow > 0) { + if (kneeLow > 0) { + float lowerKnee = thresholdLow - (kneeLow*0.5f); + float higherKnee = thresholdLow +(kneeLow*0.5f); + //attack/release + float envRatio = 1; + if (controlDB < lowerKnee) { + float envVal = arEnvLow.play(1.f); + envRatio = envToRatio(envVal, ratioLow); + }else { + float envVal = arEnvLow.play(-1.f); + } + if ((controlDB >= lowerKnee) && (controlDB < higherKnee)) { + float kneeLowOut = thresholdLow - ((thresholdLow-lowerKnee) / ratioLow); + float kneeRange = (higherKnee - kneeLowOut); + float t = (controlDB - lowerKnee) / kneeLow; + //bezier on x only + float curve = ratioLow > 1.f ? 0.2f : 0.8f; + float kneex = (2.f * (1.f-t) * t * curve) + (t*t); + outDB = kneeLowOut + (kneex * kneeRange); + } + else if (controlDB < lowerKnee) { + outDB = thresholdLow - ((thresholdLow-controlDB) / ratioLow); + } + } + else { + //no knee + if (controlDB < thresholdLow) { + float envVal = arEnvLow.play(1.f); + float envRatio = envToRatio(envVal, ratioLow); + outDB = thresholdLow - ((thresholdLow-controlDB) / ratioLow); + }else { + float envVal = arEnvLow.play(-1.f); + } + } + } + //scale the signal according to the amount of compansion on the control signal + float outAmp = maxiConvert::dbsToAmp(outDB); + float sigOut = 0; + if (outAmp > 0.f) { + if (lookAheadSize > 0.f) { + lookAheadDelay.push(sig); + sigOut = lookAheadDelay.tail(lookAheadSize); + }else{ + sigOut = sig; + } + sigOut = sigOut * (control / outAmp); + } + return sigOut; + } + + /** + * Compress a signal (using downward compression) + * \param sig The input signal to be compressed + * \param threshold The threshold, in Dbs + * \param ratio The compression ratio (>1 provides compression, <1 provides expansion) + * \param knee The size of the knee (in Dbs) + * \returns a compressed signal + */ + float compress(float sig, float threshold, float ratio, float knee) { + return play(sig, sig, threshold, ratio, knee, 0, 0, 0); + } + /** + * Compress a signal with sidechaining (using downward compression) + * \param sig The input signal to be compressed + * \param control The sidechain signal + * \param threshold The threshold, in Dbs + * \param ratio The compression ratio (>1 provides compression, <1 provides expansion) + * \param knee The size of the knee (in Dbs) + * \returns a compressed signal + */ + float sidechainCompress(float sig, float control, float threshold, float ratio, float knee) { + return play(sig, control, threshold, ratio, knee, 0, 0, 0); + } + /** + * Compand a signal, using detection above a threshold (provides downward compression or upward expansion) + * \param sig The input signal to be compressed + * \param control The sidechain signal + * \param threshold The threshold, in Dbs + * \param ratio The compression ratio (>1 provides compression, <1 provides expansion) + * \param knee The size of the knee (in Dbs) + * \returns a companded signal + */ + float compandAbove(float sig, float control, float threshold, float ratio, float knee) { + return play(sig, control, threshold, ratio, knee, 0, 0, 0); + } + /** + * Compand a signal, using detection below a threshold (provides upward compression or downward expansion) + * \param sig The input signal to be compressed + * \param control The sidechain signal + * \param threshold The threshold, in Dbs + * \param ratio The compression ratio (>1 provides compression, <1 provides expansion) + * \param knee The size of the knee (in Dbs) + * \returns a companded signal + */ + float compandBelow(float sig, float control, float threshold, float ratio, float knee) { + return play(sig, control, 0, 0, 0, threshold, ratio, knee); + } + + /** + * Set the attack time for the high threshold. This is the amount of time over which the ratio moves from 1 to its full value, following the input analyser going over the threshold. + * \param attack The attack time (in milliseconds) + */ + void setAttackHigh(float attack) { + arEnvHigh.setTime(0, attack); + } + /** + * Set the release time for the high threshold. This is the amount of time over which the ratio moves from its full value to 1, following the input analyser going under the threshold. + * \param release The release time (in milliseconds) + */ + void setReleaseHigh(float release) { + arEnvHigh.setTime(2, release); + } + /** + * Set the attack time for the low threshold. This is the amount of time over which the ratio moves from 1 to its full value, following the input analyser going under the threshold. + * \param attack The attack time (in milliseconds) + */ + void setAttackLow(float attack) { + arEnvLow.setTime(0, attack); + } + /** + * Set the release time for the low threshold. This is the amount of time over which the ratio moves from its full value to 1, following the input analyser going over the threshold. + * \param release The release time (in milliseconds) + */ + void setReleaseLow(float release) { + arEnvLow.setTime(2, release); + } + + /** + * The look ahead creates a delay on the input signal, meaning that that the signal is compressed according to event that have already happened in the control signal. This can be useful for limiting and catching fast transients. + * \param length The amount of time the compressor looks ahead (in milliseconds) + */ + void setLookAhead(float length) { + lookAheadSize = maxiConvert::msToSamps(length); + lookAheadSize = std::min(lookAheadSize, lookAheadDelay.size()); + } + /** + * \returns the look ahead time (in milliseconds) + */ + float getLookAhead() { + return maxiConvert::sampsToMs(lookAheadSize); + } + + /** + * Set the size of the RMS window. Longer times give a slower response + * \param winSize The size of the window (in milliseconds) + */ + void setRMSWindowSize(float winSize) { + rms.setWindowSize(std::min(winSize, 500.f)); + } + + /** + * Set the method by which the compressor analyses the control input + * \mode maxiDynamics::PEAK for peak analysis, maxiDynamics::RMS for rms analysis + */ + void setInputAnalyser(ANALYSERS mode) { + if (mode == PEAK) { + inputAnalyser = inputPeak; + }else{ + inputAnalyser = inputRMS; + } + } + + + private: + maxiEnvGen arEnvHigh, arEnvLow; + maxiRingBuf lookAheadDelay; + size_t lookAheadSize = 0; + maxiRMS rms; + std::function inputPeak; + std::function inputRMS; + std::function inputAnalyser; + maxiPoll poll; + + //mapping from attack/release envelope to ratio + inline float envToRatio(float envVal, float ratio) { + float envRatio = 1; + if (ratio > 1) { + envRatio = 1 + ((ratio-1) * envVal); + }else { + envRatio = 1 - ((1-ratio) * envVal); + } + return envRatio; + } + +}; + + +template +class maxiReverbFilters{ +public: + maxiReverbFilters() + { + } + // float twopoint(float input); + float __force_inline comb1(float input, float size, float feedback) { + float output = delay_line[delay_index]; + delay_line[delay_index] = input + (feedback * output); + delay_index != size - 1 ? delay_index++ : delay_index = 0; + return output; + } + + float __force_inline combfb(float input,float size,float fb) { + float output = input + (fb * delay_line[delay_index]); + delay_line[delay_index] = output; + delay_index != size - 1 ? delay_index++ : delay_index = 0; + return output; + } + + float __force_inline lpcombfb(float input, size_t size, float fb, float cutoff) + { + // used for freeverb emulation + // low pass between delay output + feedback + float output = input + (fb * mf.lopass(delay_line[delay_index],cutoff)); + delay_line[delay_index] = output; + delay_index != size - 1U ? delay_index++ : delay_index = 0.f; + return output; + } + + float __force_inline allpass(float input, size_t size, float fb) { + input += delay_line[delay_index] * fb; + float output = delay_line[delay_index] + (input * (-fb)); + delay_line[delay_index] = input; + delay_index != size - 1 ? delay_index++ : delay_index = 0; + return output; + } + + // float gettap(const size_t tap) { + // size_t t = delay_index + tap; + // if(t > delay_size -1){ + // t -= delay_size; + // } + // output = delay_line[t]; + // return output; + // } + +private: + std::array delay_line; + size_t delay_index=0; + + maxiFilter mf; + + +}; + +template +class DynamicDelay { + static_assert((DELAYTIME & (DELAYTIME - 1)) == 0, "DELAYTIME must be a power of 2"); + static constexpr size_t MASK = DELAYTIME - 1; + +public: + DynamicDelay() : smoothed_size(static_cast(DELAYTIME)) {} + + void setSmoothCoeff(float c) { smooth_coeff = c; } + + float __force_inline read(float target_size) { + smoothed_size = smoothed_size * smooth_coeff + target_size * (1.0f - smooth_coeff); + + float read_pos = static_cast(write_index) - smoothed_size; + if (read_pos < 0.0f) read_pos += static_cast(DELAYTIME); + + size_t i1 = static_cast(read_pos); + float frac = read_pos - static_cast(i1); + size_t i2 = (i1 + 1) & MASK; + + return delay_line[i1] + frac * (delay_line[i2] - delay_line[i1]); + } + + void __force_inline write(float input) { + delay_line[write_index] = input; + write_index = (write_index + 1) & MASK; + } + +private: + std::array delay_line{}; + size_t write_index = 0; + float smoothed_size; + float smooth_coeff = 0.997f; +}; + +template +class DynamicDelayI16 { + static_assert((DELAYTIME & (DELAYTIME - 1)) == 0, "DELAYTIME must be a power of 2"); + static constexpr size_t MASK = DELAYTIME - 1; + static constexpr float kScale = 32767.0f; + static constexpr float kRcpScale = 1.0f / 32767.0f; + +public: + DynamicDelayI16() : smoothed_size(static_cast(DELAYTIME)) {} + + void setSmoothCoeff(float c) { smooth_coeff = c; } + + float __force_inline read(float target_size) { + smoothed_size = smoothed_size * smooth_coeff + target_size * (1.0f - smooth_coeff); + + float read_pos = static_cast(write_index) - smoothed_size; + if (read_pos < 0.0f) read_pos += static_cast(DELAYTIME); + + size_t i1 = static_cast(read_pos); + float frac = read_pos - static_cast(i1); + size_t i2 = (i1 + 1) & MASK; + + float s1 = static_cast(delay_line[i1]) * kRcpScale; + float s2 = static_cast(delay_line[i2]) * kRcpScale; + return s1 + frac * (s2 - s1); + } + + void __force_inline write(float input) { + input = fminf(fmaxf(input, -1.f), 1.f); + delay_line[write_index] = static_cast(input * kScale); + write_index = (write_index + 1) & MASK; + } + + // Read at an arbitrary absolute buffer index — for grain engines + float __force_inline readAbsolute(float abs_pos) const { + size_t i1 = static_cast(abs_pos) & MASK; + float frac = abs_pos - static_cast(i1); + size_t i2 = (i1 + 1) & MASK; + float s1 = static_cast(delay_line[i1]) * kRcpScale; + float s2 = static_cast(delay_line[i2]) * kRcpScale; + return s1 + frac * (s2 - s1); + } + + size_t getWriteIndex() const { return write_index; } + + void fillRepeating(const int16_t* cycle, size_t cycleLen) { + size_t pos = 0; + while (pos < DELAYTIME) { + const size_t chunk = std::min(cycleLen, DELAYTIME - pos); + memcpy(&delay_line[pos], cycle, chunk * sizeof(int16_t)); + pos += chunk; + } + write_index = 0; + } + +private: + std::array delay_line{}; + size_t write_index = 0; + float smoothed_size; + float smooth_coeff = 0.997f; +}; + +class maxiDynamicsLite { + + public: + + enum ANALYSERS {PEAK, RMS}; + + static constexpr float maxRMSSizeMS = 300.f; + + maxiDynamicsLite() { + //define detector functions + inputPeak = [](float sig) { + return abs(sig); + }; + + rms.setup(maxRMSSizeMS,300); + inputRMS = [&](float sig) { + return rms.play(sig); + }; + + //default RMS + inputAnalyser = inputRMS; + + //setup envelopes + arEnvHigh.setup(10,0,1.f,10.f, maxiSettings::sampleRate); + arEnvLow.setup(10,0,1.f,10.f, maxiSettings::sampleRate); + + lookAheadDelay.setup(maxiSettings::sampleRate * 0.1); //max 0.1s + } + + + /** + * This functions compands the signal, providing download compression or upward expansion above an upper thresold, and + * upward compression or downward expansion below a lower threshold. + * \param sig The input signal to be companded + * \param control This signal is used to trigger the compander. Use it for sidechaining, or if no sidechain is needed, use the same signal for this and the input signal + * \param thresholdHigh The high threshold, in Dbs + * \param ratioHigh The ratio for companding above the high threshold + * \param kneeHigh The size of the knee for companding above the high threshold (in Dbs) + * \param thresholdLow The low threshold, in Dbs + * \param ratioLow The ratio for companding below the low threshold + * \param kneeLow The size of the knee for companding below the low threshold (in Dbs) + * \returns a companded signal + */ + __attribute__((always_inline)) __attribute__((hot)) float play(float sig, float control, + float thresholdHigh, float ratioHigh, float kneeHigh, + float thresholdLow, float ratioLow, float kneeLow + ) { + const float inputEnv = inputAnalyser(control) + 0.00001f; //avoid log of zero + const float controlDB = maxiConvert::ampToDbs(inputEnv); + float outDB = controlDB; + const float halfKneeHigh = kneeHigh * 0.5f; + //companding above the high threshold + if (ratioHigh > 0) { + if (kneeHigh > 0) { + float lowerKnee = thresholdHigh - (kneeHigh*0.5f); + float higherKnee = thresholdHigh +(kneeHigh*0.5f); + //attack/release + float envRatio = 1.f; + if (controlDB >= lowerKnee) { + arEnvHigh.triggerIfReady(1.f); + float envVal = arEnvHigh.play(); + envRatio = envToRatio(envVal, ratioHigh); + }else { + arEnvHigh.release(); + } + if ((controlDB >= lowerKnee) && (controlDB < higherKnee)) { + float kneeHighOut = ((higherKnee - thresholdHigh) / envRatio) + thresholdHigh; + float kneeRange = (kneeHighOut - lowerKnee); + float t = (controlDB - lowerKnee) / kneeHigh; + //bezier on x only + float curve = ratioHigh > 1.f ? 0.8f : 0.2f; + float kneex = (2.f * (1.f-t) * t * curve) + (t*t); + outDB = lowerKnee + (kneex * kneeRange); + } + else if (controlDB >= higherKnee) { + outDB = ((controlDB - thresholdHigh) / envRatio) + thresholdHigh; + }else{ + outDB = controlDB; + } + } + else { + //no knee + if (controlDB > thresholdHigh) { + arEnvHigh.trigger(1.f); + }else { + arEnvHigh.release(); + } + float envVal = arEnvHigh.play(); + // const float envVal = arEnvHigh.play(controlDB > thresholdHigh ? 1.f : 0.f); + const float envRatio = envToRatio(envVal, ratioHigh); + outDB = ((controlDB - thresholdHigh) / envRatio) + thresholdHigh; + + } + } + // //companding below the low threshold + // if (ratioLow > 0) { + // if (kneeLow > 0) { + // float lowerKnee = thresholdLow - (kneeLow*0.5f); + // float higherKnee = thresholdLow +(kneeLow*0.5f); + // //attack/release + // float envRatio = 1; + // if (controlDB < lowerKnee) { + // float envVal = arEnvLow.play(1.f); + // envRatio = envToRatio(envVal, ratioLow); + // }else { + // float envVal = arEnvLow.play(-1.f); + // } + // if ((controlDB >= lowerKnee) && (controlDB < higherKnee)) { + // float kneeLowOut = thresholdLow - ((thresholdLow-lowerKnee) / ratioLow); + // float kneeRange = (higherKnee - kneeLowOut); + // float t = (controlDB - lowerKnee) / kneeLow; + // //bezier on x only + // float curve = ratioLow > 1.f ? 0.2f : 0.8f; + // float kneex = (2.f * (1.f-t) * t * curve) + (t*t); + // outDB = kneeLowOut + (kneex * kneeRange); + // } + // else if (controlDB < lowerKnee) { + // outDB = thresholdLow - ((thresholdLow-controlDB) / ratioLow); + // } + // } + // else { + // //no knee + // if (controlDB < thresholdLow) { + // float envVal = arEnvLow.play(1.f); + // // float envRatio = envToRatio(envVal, ratioLow); + // outDB = thresholdLow - ((thresholdLow-controlDB) / ratioLow); + // }else { + // float envVal = arEnvLow.play(-1.f); + // outDB = maxiConvert::ampToDbs(fabsf(sig)); + // } + // } + // } + //scale the signal according to the amount of compansion on the control signal + float outAmp = maxiConvert::dbsToAmp(outDB); + // float ctrlAmp = maxiConvert::dbsToAmp(controlDB); + float sigOut = sig; + if (outAmp > 0.f) { + if (lookAheadSize > 0.f) { + lookAheadDelay.push(sig); + sigOut = lookAheadDelay.tail(lookAheadSize); + } + // sigOut = sigOut * fabsf(control / outAmp); + float gainReduction = outAmp / inputEnv; + sigOut = sig * gainReduction; + // PERIODIC_DEBUG(1000, + // Serial.printf("%f %f %f %f %f\n",controlDB, outDB, control, outAmp, gainReduction); + // ) + }else{ + // printf("Warning: maxiDynamicsLite output amplitude is zero or negative!\n"); + } + return sigOut; + } + + /** + * Compress a signal (using downward compression) + * \param sig The input signal to be compressed + * \param threshold The threshold, in Dbs + * \param ratio The compression ratio (>1 provides compression, <1 provides expansion) + * \param knee The size of the knee (in Dbs) + * \returns a compressed signal + */ + __attribute__((always_inline)) __attribute__((hot)) float compress(float sig, float threshold, float ratio, float knee) { + return play(sig, sig, threshold, ratio, knee, 0.f, 0.f, 0.f); + } + /** + * Compress a signal with sidechaining (using downward compression) + * \param sig The input signal to be compressed + * \param control The sidechain signal + * \param threshold The threshold, in Dbs + * \param ratio The compression ratio (>1 provides compression, <1 provides expansion) + * \param knee The size of the knee (in Dbs) + * \returns a compressed signal + */ + float sidechainCompress(float sig, float control, float threshold, float ratio, float knee) { + return play(sig, control, threshold, ratio, knee, 0, 0, 0); + } + /** + * Compand a signal, using detection above a threshold (provides downward compression or upward expansion) + * \param sig The input signal to be compressed + * \param control The sidechain signal + * \param threshold The threshold, in Dbs + * \param ratio The compression ratio (>1 provides compression, <1 provides expansion) + * \param knee The size of the knee (in Dbs) + * \returns a companded signal + */ + float compandAbove(float sig, float control, float threshold, float ratio, float knee) { + return play(sig, control, threshold, ratio, knee, 0, 0, 0); + } + /** + * Compand a signal, using detection below a threshold (provides upward compression or downward expansion) + * \param sig The input signal to be compressed + * \param control The sidechain signal + * \param threshold The threshold, in Dbs + * \param ratio The compression ratio (>1 provides compression, <1 provides expansion) + * \param knee The size of the knee (in Dbs) + * \returns a companded signal + */ + float compandBelow(float sig, float control, float threshold, float ratio, float knee) { + return play(sig, control, 0, 0, 0, threshold, ratio, knee); + } + + /** + * Set the attack time for the high threshold. This is the amount of time over which the ratio moves from 1 to its full value, following the input analyser going over the threshold. + * \param attack The attack time (in milliseconds) + */ + __attribute__((always_inline)) void setAttackHigh(float attack) { + arEnvHigh.setAttackTime(attack, maxiSettings::sampleRate); + } + /** + * Set the release time for the high threshold. This is the amount of time over which the ratio moves from its full value to 1, following the input analyser going under the threshold. + * \param release The release time (in milliseconds) + */ + __attribute__((always_inline)) void setReleaseHigh(float release) { + arEnvHigh.setReleaseTime(release, maxiSettings::sampleRate); + } + /** + * Set the attack time for the low threshold. This is the amount of time over which the ratio moves from 1 to its full value, following the input analyser going under the threshold. + * \param attack The attack time (in milliseconds) + */ + __attribute__((always_inline)) void setAttackLow(float attack) { + arEnvLow.setAttackTime(attack, maxiSettings::sampleRate); + } + /** + * Set the release time for the low threshold. This is the amount of time over which the ratio moves from its full value to 1, following the input analyser going over the threshold. + * \param release The release time (in milliseconds) + */ + __attribute__((always_inline)) void setReleaseLow(float release) { + arEnvLow.setReleaseTime(release, maxiSettings::sampleRate); + } + + /** + * The look ahead creates a delay on the input signal, meaning that that the signal is compressed according to event that have already happened in the control signal. This can be useful for limiting and catching fast transients. + * \param length The amount of time the compressor looks ahead (in milliseconds) + */ + void setLookAhead(float length) { + lookAheadSize = maxiConvert::msToSamps(length); + lookAheadSize = std::min(lookAheadSize, lookAheadDelay.size()); + } + /** + * \returns the look ahead time (in milliseconds) + */ + float getLookAhead() { + return maxiConvert::sampsToMs(lookAheadSize); + } + + /** + * Set the size of the RMS window. Longer times give a slower response + * \param winSize The size of the window (in milliseconds) + */ + void setRMSWindowSize(float winSize) { + rms.setWindowSize(std::min(winSize, maxRMSSizeMS)); + } + + /** + * Set the method by which the compressor analyses the control input + * \mode maxiDynamics::PEAK for peak analysis, maxiDynamics::RMS for rms analysis + */ + void setInputAnalyser(ANALYSERS mode) { + if (mode == PEAK) { + inputAnalyser = inputPeak; + }else{ + inputAnalyser = inputRMS; + } + } + + + private: + ADSRLite arEnvHigh, arEnvLow; + maxiRingBuf lookAheadDelay; + size_t lookAheadSize = 0; + maxiRMS rms; + std::function inputPeak; + std::function inputRMS; + std::function inputAnalyser; + // maxiPoll poll; + + //mapping from attack/release envelope to ratio + inline float envToRatio(float envVal, float ratio) { + float envRatio = 1.f; + if (ratio > 1.f) { + envRatio = 1.f + ((ratio-1.f) * envVal); + }else { + envRatio = 1.f - ((1.f-ratio) * envVal); + } + return envRatio; + } + +}; + +#endif diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/sineTable.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/sineTable.cpp new file mode 100644 index 0000000..3c52d72 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/sineTable.cpp @@ -0,0 +1,5 @@ +#include "sineTable.h" +namespace waveTable { +float sine65536[65538] = {0.0,9.5873799096e-05,0.000191747597311,0.000287621393763,0.000383495187571,0.000479368977855,0.000575242763732,0.000671116544322,0.000766990318743,0.000862864086114,0.000958737845553,0.00105461159618,0.00115048533711,0.00124635906747,0.00134223278637,0.00143810649294,0.00153398018628,0.00162985386553,0.0017257275298,0.0018216011782,0.00191747480986,0.00201334842389,0.00210922201942,0.00220509559556,0.00230096915143,0.00239684268615,0.00249271619884,0.00258858968861,0.0026844631546,0.0027803365959,0.00287621001166,0.00297208340097,0.00306795676297,0.00316383009676,0.00325970340148,0.00335557667623,0.00345144992014,0.00354732313232,0.0036431963119,0.00373906945799,0.00383494256971,0.00393081564618,0.00402668868652,0.00412256168984,0.00421843465528,0.00431430758194,0.00441018046894,0.0045060533154,0.00460192612045,0.00469779888319,0.00479367160276,0.00488954427826,0.00498541690882,0.00508128949356,0.00517716203158,0.00527303452202,0.005368906964,0.00546477935662,0.00556065169901,0.00565652399029,0.00575239622957,0.00584826841598,0.00594414054864,0.00604001262666,0.00613588464915,0.00623175661525,0.00632762852407,0.00642350037473,0.00651937216634,0.00661524389803,0.00671111556891,0.0068069871781,0.00690285872473,0.00699873020791,0.00709460162675,0.00719047298039,0.00728634426793,0.00738221548849,0.0074780866412,0.00757395772518,0.00766982873953,0.00776569968339,0.00786157055586,0.00795744135607,0.00805331208314,0.00814918273619,0.00824505331433,0.00834092381668,0.00843679424237,0.00853266459051,0.00862853486021,0.00872440505061,0.00882027516081,0.00891614518993,0.00901201513711,0.00910788500144,0.00920375478206,0.00929962447808,0.00939549408862,0.00949136361279,0.00958723304973,0.00968310239854,0.00977897165835,0.00987484082827,0.00997070990742,0.0100665788949,0.0101624477899,0.0102583165915,0.0103541852987,0.0104500539108,0.0105459224269,0.010641790846,0.0107376591673,0.0108335273899,0.0109293955129,0.0110252635354,0.0111211314566,0.0112169992756,0.0113128669915,0.0114087346034,0.0115046021104,0.0116004695117,0.0116963368064,0.0117922039935,0.0118880710723,0.0119839380417,0.0120798049011,0.0121756716493,0.0122715382857,0.0123674048093,0.0124632712192,0.0125591375145,0.0126550036944,0.012750869758,0.0128467357044,0.0129426015327,0.013038467242,0.0131343328315,0.0132301983002,0.0133260636473,0.013421928872,0.0135177939733,0.0136136589503,0.0137095238022,0.0138053885281,0.013901253127,0.0139971175982,0.0140929819408,0.0141888461538,0.0142847102364,0.0143805741876,0.0144764380067,0.0145723016928,0.0146681652449,0.0147640286621,0.0148598919437,0.0149557550886,0.0150516180961,0.0151474809653,0.0152433436952,0.015339206285,0.0154350687338,0.0155309310407,0.0156267932049,0.0157226552254,0.0158185171014,0.015914378832,0.0160102404164,0.0161061018535,0.0162019631427,0.0162978242829,0.0163936852733,0.016489546113,0.0165854068011,0.0166812673368,0.0167771277191,0.0168729879473,0.0169688480203,0.0170647079374,0.0171605676976,0.0172564273001,0.017352286744,0.0174481460284,0.0175440051524,0.0176398641151,0.0177357229157,0.0178315815532,0.0179274400269,0.0180232983358,0.018119156479,0.0182150144556,0.0183108722649,0.0184067299058,0.0185025873775,0.0185984446792,0.0186943018099,0.0187901587688,0.0188860155549,0.0189818721675,0.0190777286056,0.0191735848683,0.0192694409548,0.0193652968642,0.0194611525955,0.019557008148,0.0196528635207,0.0197487187128,0.0198445737234,0.0199404285515,0.0200362831964,0.0201321376571,0.0202279919327,0.0203238460224,0.0204196999253,0.0205155536405,0.0206114071671,0.0207072605043,0.0208031136511,0.0208989666067,0.0209948193702,0.0210906719408,0.0211865243174,0.0212823764994,0.0213782284857,0.0214740802755,0.0215699318679,0.021665783262,0.021761634457,0.021857485452,0.0219533362461,0.0220491868384,0.022145037228,0.022240887414,0.0223367373956,0.0224325871719,0.0225284367421,0.0226242861051,0.0227201352602,0.0228159842064,0.0229118329429,0.0230076814688,0.0231035297833,0.0231993778853,0.0232952257742,0.0233910734489,0.0234869209086,0.0235827681524,0.0236786151794,0.0237744619888,0.0238703085797,0.0239661549511,0.0240620011023,0.0241578470323,0.0242536927402,0.0243495382252,0.0244453834864,0.0245412285229,0.0246370733338,0.0247329179183,0.0248287622754,0.0249246064043,0.0250204503041,0.0251162939739,0.0252121374128,0.02530798062,0.0254038235946,0.0254996663357,0.0255955088423,0.0256913511138,0.025787193149,0.0258830349473,0.0259788765076,0.0260747178291,0.026170558911,0.0262663997523,0.0263622403521,0.0264580807097,0.026553920824,0.0266497606943,0.0267456003196,0.0268414396991,0.0269372788319,0.027033117717,0.0271289563537,0.027224794741,0.0273206328781,0.027416470764,0.0275123083979,0.027608145779,0.0277039829062,0.0277998197789,0.027895656396,0.0279914927567,0.02808732886,0.0281831647053,0.0282790002914,0.0283748356177,0.0284706706831,0.0285665054868,0.028662340028,0.0287581743056,0.028854008319,0.0289498420671,0.0290456755491,0.0291415087642,0.0292373417114,0.0293331743898,0.0294290067986,0.0295248389369,0.0296206708039,0.0297165023985,0.02981233372,0.0299081647675,0.0300039955401,0.0300998260369,0.030195656257,0.0302914861995,0.0303873158637,0.0304831452485,0.0305789743531,0.0306748031766,0.0307706317182,0.030866459977,0.030962287952,0.0310581156424,0.0311539430474,0.031249770166,0.0313455969973,0.0314414235406,0.0315372497948,0.0316330757591,0.0317289014327,0.0318247268146,0.031920551904,0.0320163767,0.0321122012018,0.0322080254083,0.0323038493188,0.0323996729324,0.0324954962481,0.0325913192652,0.0326871419827,0.0327829643997,0.0328787865154,0.0329746083289,0.0330704298393,0.0331662510457,0.0332620719473,0.0333578925431,0.0334537128323,0.033549532814,0.0336453524873,0.0337411718514,0.0338369909053,0.0339328096482,0.0340286280792,0.0341244461974,0.034220264002,0.034316081492,0.0344118986665,0.0345077155248,0.0346035320659,0.0346993482889,0.034795164193,0.0348909797772,0.0349867950407,0.0350826099826,0.0351784246021,0.0352742388982,0.0353700528701,0.0354658665169,0.0355616798376,0.0356574928315,0.0357533054976,0.0358491178351,0.0359449298431,0.0360407415207,0.036136552867,0.0362323638812,0.0363281745623,0.0364239849094,0.0365197949218,0.0366156045985,0.0367114139387,0.0368072229414,0.0369030316057,0.0369988399309,0.037094647916,0.0371904555601,0.0372862628624,0.0373820698219,0.0374778764378,0.0375736827093,0.0376694886353,0.0377652942152,0.0378610994479,0.0379569043325,0.0380527088683,0.0381485130544,0.0382443168897,0.0383401203736,0.038435923505,0.0385317262831,0.038627528707,0.0387233307759,0.0388191324889,0.038914933845,0.0390107348435,0.0391065354833,0.0392023357637,0.0392981356838,0.0393939352426,0.0394897344394,0.0395855332731,0.039681331743,0.0397771298482,0.0398729275877,0.0399687249608,0.0400645219664,0.0401603186038,0.040256114872,0.0403519107703,0.0404477062976,0.0405435014531,0.0406392962359,0.0407350906452,0.0408308846801,0.0409266783397,0.0410224716231,0.0411182645294,0.0412140570577,0.0413098492073,0.0414056409771,0.0415014323663,0.0415972233741,0.0416930139995,0.0417888042416,0.0418845940997,0.0419803835727,0.0420761726599,0.0421719613603,0.0422677496731,0.0423635375974,0.0424593251323,0.0425551122769,0.0426508990304,0.0427466853918,0.0428424713602,0.0429382569349,0.043034042115,0.0431298268994,0.0432256112874,0.0433213952781,0.0434171788706,0.043512962064,0.0436087448575,0.0437045272501,0.0438003092409,0.0438960908292,0.043991872014,0.0440876527945,0.0441834331696,0.0442792131387,0.0443749927008,0.0444707718549,0.0445665506003,0.0446623289361,0.0447581068613,0.0448538843752,0.0449496614767,0.0450454381651,0.0451412144394,0.0452369902988,0.0453327657424,0.0454285407693,0.0455243153786,0.0456200895695,0.045715863341,0.0458116366924,0.0459074096226,0.0460031821309,0.0460989542163,0.046194725878,0.0462904971151,0.0463862679267,0.0464820383119,0.0465778082699,0.0466735777997,0.0467693469005,0.0468651155715,0.0469608838116,0.0470566516201,0.0471524189961,0.0472481859386,0.0473439524469,0.0474397185199,0.047535484157,0.047631249357,0.0477270141193,0.0478227784429,0.0479185423269,0.0480143057704,0.0481100687726,0.0482058313326,0.0483015934495,0.0483973551224,0.0484931163504,0.0485888771327,0.0486846374684,0.0487803973566,0.0488761567964,0.048971915787,0.0490676743274,0.0491634324168,0.0492591900543,0.049354947239,0.0494507039701,0.0495464602466,0.0496422160677,0.0497379714325,0.0498337263401,0.0499294807897,0.0500252347803,0.0501209883111,0.0502167413812,0.0503124939897,0.0504082461357,0.0505039978184,0.0505997490369,0.0506954997903,0.0507912500777,0.0508869998982,0.050982749251,0.0510784981352,0.0511742465499,0.0512699944941,0.0513657419672,0.051461488968,0.0515572354959,0.0516529815499,0.051748727129,0.0518444722325,0.0519402168595,0.052035961009,0.0521317046803,0.0522274478723,0.0523231905843,0.0524189328154,0.0525146745646,0.0526104158311,0.0527061566141,0.0528018969125,0.0528976367257,0.0529933760526,0.0530891148924,0.0531848532442,0.0532805911071,0.0533763284804,0.0534720653629,0.053567801754,0.0536635376527,0.0537592730582,0.0538550079695,0.0539507423857,0.0540464763061,0.0541422097297,0.0542379426556,0.054333675083,0.0544294070109,0.0545251384386,0.054620869365,0.0547165997894,0.0548123297109,0.0549080591285,0.0550037880415,0.0550995164488,0.0551952443497,0.0552909717432,0.0553866986286,0.0554824250048,0.055578150871,0.0556738762264,0.05576960107,0.055865325401,0.0559610492185,0.0560567725216,0.0561524953095,0.0562482175812,0.0563439393359,0.0564396605727,0.0565353812907,0.0566311014891,0.0567268211669,0.0568225403233,0.0569182589574,0.0570139770683,0.0571096946552,0.0572054117171,0.0573011282532,0.0573968442626,0.0574925597444,0.0575882746977,0.0576839891217,0.0577797030155,0.0578754163782,0.0579711292089,0.0580668415068,0.0581625532709,0.0582582645004,0.0583539751944,0.0584496853521,0.0585453949724,0.0586411040547,0.0587368125979,0.0588325206012,0.0589282280638,0.0590239349847,0.059119641363,0.059215347198,0.0593110524886,0.0594067572341,0.0595024614335,0.059598165086,0.0596938681907,0.0597895707466,0.059885272753,0.059980974209,0.0600766751136,0.060172375466,0.0602680752653,0.0603637745107,0.0604594732012,0.0605551713359,0.0606508689141,0.0607465659348,0.0608422623971,0.0609379583001,0.061033653643,0.0611293484249,0.061225042645,0.0613207363022,0.0614164293958,0.0615121219249,0.0616078138886,0.061703505286,0.0617991961162,0.0618948863784,0.0619905760716,0.0620862651951,0.0621819537478,0.062277641729,0.0623733291378,0.0624690159732,0.0625647022345,0.0626603879206,0.0627560730308,0.0628517575642,0.0629474415198,0.0630431248968,0.0631388076944,0.0632344899116,0.0633301715475,0.0634258526014,0.0635215330722,0.0636172129592,0.0637128922614,0.063808570978,0.063904249108,0.0639999266507,0.0640956036051,0.0641912799704,0.0642869557456,0.0643826309299,0.0644783055224,0.0645739795222,0.0646696529285,0.0647653257403,0.0648609979569,0.0649566695772,0.0650523406005,0.0651480110259,0.0652436808524,0.0653393500792,0.0654350187054,0.0655306867302,0.0656263541526,0.0657220209718,0.0658176871869,0.065913352797,0.0660090178013,0.0661046821988,0.0662003459886,0.06629600917,0.066391671742,0.0664873337038,0.0665829950544,0.066678655793,0.0667743159187,0.0668699754306,0.0669656343279,0.0670612926096,0.067156950275,0.067252607323,0.0673482637529,0.0674439195637,0.0675395747545,0.0676352293246,0.067730883273,0.0678265365988,0.0679221893012,0.0680178413792,0.0681134928321,0.0682091436588,0.0683047938586,0.0684004434305,0.0684960923738,0.0685917406874,0.0686873883705,0.0687830354223,0.0688786818418,0.0689743276283,0.0690699727807,0.0691656172982,0.06926126118,0.0693569044252,0.0694525470328,0.0695481890021,0.0696438303321,0.0697394710219,0.0698351110707,0.0699307504776,0.0700263892417,0.0701220273621,0.070217664838,0.0703133016685,0.0704089378526,0.0705045733896,0.0706002082785,0.0706958425185,0.0707914761086,0.0708871090481,0.070982741336,0.0710783729714,0.0711740039534,0.0712696342813,0.0713652639541,0.0714608929708,0.0715565213308,0.071652149033,0.0717477760766,0.0718434024607,0.0719390281844,0.0720346532469,0.0721302776472,0.0722259013846,0.0723215244581,0.0724171468668,0.0725127686098,0.0726083896864,0.0727040100955,0.0727996298364,0.072895248908,0.0729908673097,0.0730864850405,0.0731821020994,0.0732777184857,0.0733733341984,0.0734689492367,0.0735645635997,0.0736601772865,0.0737557902962,0.073851402628,0.0739470142809,0.0740426252541,0.0741382355468,0.074233845158,0.0743294540868,0.0744250623325,0.074520669894,0.0746162767706,0.0747118829613,0.0748074884652,0.0749030932816,0.0749986974094,0.0750943008479,0.0751899035962,0.0752855056533,0.0753811070184,0.0754767076906,0.075572307669,0.0756679069528,0.0757635055411,0.075859103433,0.0759547006275,0.076050297124,0.0761458929214,0.0762414880189,0.0763370824155,0.0764326761105,0.076528269103,0.076623861392,0.0767194529767,0.0768150438563,0.0769106340297,0.0770062234962,0.0771018122549,0.0771974003049,0.0772929876453,0.0773885742753,0.0774841601939,0.0775797454003,0.0776753298935,0.0777709136729,0.0778664967373,0.077962079086,0.0780576607182,0.0781532416328,0.0782488218291,0.0783444013061,0.078439980063,0.0785355580988,0.0786311354128,0.0787267120041,0.0788222878717,0.0789178630148,0.0790134374325,0.0791090111239,0.0792045840882,0.0793001563244,0.0793957278317,0.0794912986092,0.0795868686561,0.0796824379714,0.0797780065543,0.0798735744039,0.0799691415193,0.0800647078997,0.0801602735441,0.0802558384517,0.0803514026216,0.080446966053,0.0805425287448,0.0806380906964,0.0807336519067,0.080829212375,0.0809247721003,0.0810203310817,0.0811158893185,0.0812114468096,0.0813070035542,0.0814025595515,0.0814981148006,0.0815936693005,0.0816892230505,0.0817847760496,0.0818803282969,0.0819758797916,0.0820714305328,0.0821669805197,0.0822625297512,0.0823580782266,0.0824536259451,0.0825491729056,0.0826447191073,0.0827402645494,0.0828358092309,0.0829313531511,0.0830268963089,0.0831224387036,0.0832179803343,0.0833135212,0.0834090612999,0.0835046006332,0.0836001391988,0.0836956769961,0.083791214024,0.0838867502818,0.0839822857685,0.0840778204832,0.0841733544251,0.0842688875933,0.0843644199869,0.0844599516051,0.0845554824469,0.0846510125116,0.0847465417981,0.0848420703056,0.0849375980333,0.0850331249803,0.0851286511456,0.0852241765285,0.085319701128,0.0854152249433,0.0855107479735,0.0856062702176,0.0857017916749,0.0857973123444,0.0858928322253,0.0859883513167,0.0860838696177,0.0861793871275,0.0862749038451,0.0863704197697,0.0864659349003,0.0865614492363,0.0866569627765,0.0867524755202,0.0868479874665,0.0869434986145,0.0870390089634,0.0871345185122,0.0872300272601,0.0873255352062,0.0874210423496,0.0875165486895,0.0876120542249,0.087707558955,0.0878030628789,0.0878985659958,0.0879940683047,0.0880895698048,0.0881850704952,0.088280570375,0.0883760694433,0.0884715676993,0.0885670651421,0.0886625617709,0.0887580575846,0.0888535525825,0.0889490467637,0.0890445401273,0.0891400326724,0.0892355243981,0.0893310153037,0.0894265053881,0.0895219946505,0.08961748309,0.0897129707058,0.089808457497,0.0899039434627,0.089999428602,0.090094912914,0.0901903963979,0.0902858790529,0.0903813608779,0.0904768418721,0.0905723220347,0.0906678013648,0.0907632798615,0.0908587575239,0.0909542343511,0.0910497103424,0.0911451854967,0.0912406598132,0.0913361332911,0.0914316059294,0.0915270777273,0.0916225486839,0.0917180187983,0.0918134880697,0.0919089564971,0.0920044240798,0.0920998908167,0.0921953567071,0.0922908217501,0.0923862859447,0.0924817492901,0.0925772117855,0.0926726734299,0.0927681342225,0.0928635941624,0.0929590532487,0.0930545114805,0.093149968857,0.0932454253773,0.0933408810405,0.0934363358457,0.0935317897921,0.0936272428788,0.0937226951048,0.0938181464694,0.0939135969716,0.0940090466106,0.0941044953855,0.0941999432954,0.0942953903394,0.0943908365167,0.0944862818264,0.0945817262675,0.0946771698393,0.0947726125408,0.0948680543712,0.0949634953296,0.0950589354152,0.0951543746269,0.095249812964,0.0953452504256,0.0954406870108,0.0955361227188,0.0956315575485,0.0957269914993,0.0958224245702,0.0959178567602,0.0960132880687,0.0961087184946,0.096204148037,0.0962995766952,0.0963950044683,0.0964904313553,0.0965858573553,0.0966812824676,0.0967767066912,0.0968721300252,0.0969675524688,0.0970629740212,0.0971583946813,0.0972538144484,0.0973492333215,0.0974446512998,0.0975400683825,0.0976354845685,0.0977308998571,0.0978263142474,0.0979217277385,0.0980171403296,0.0981125520196,0.0982079628079,0.0983033726934,0.0983987816754,0.0984941897529,0.098589596925,0.098685003191,0.0987804085498,0.0988758130007,0.0989712165427,0.099066619175,0.0991620208967,0.099257421707,0.0993528216049,0.0994482205895,0.0995436186601,0.0996390158156,0.0997344120553,0.0998298073783,0.0999252017837,0.100020595271,0.100115987838,0.100211379485,0.100306770211,0.100402160016,0.100497548897,0.100592936854,0.100688323887,0.100783709995,0.100879095176,0.100974479429,0.101069862755,0.101165245151,0.101260626618,0.101356007154,0.101451386758,0.10154676543,0.101642143168,0.101737519973,0.101832895841,0.101928270774,0.10202364477,0.102119017829,0.102214389948,0.102309761128,0.102405131368,0.102500500666,0.102595869022,0.102691236436,0.102786602905,0.102881968429,0.102977333008,0.10307269664,0.103168059325,0.103263421062,0.103358781849,0.103454141686,0.103549500573,0.103644858507,0.103740215489,0.103835571517,0.103930926591,0.10402628071,0.104121633872,0.104216986077,0.104312337325,0.104407687613,0.104503036942,0.10459838531,0.104693732717,0.104789079162,0.104884424643,0.10497976916,0.105075112713,0.105170455299,0.105265796919,0.105361137571,0.105456477255,0.105551815969,0.105647153713,0.105742490487,0.105837826288,0.105933161116,0.106028494971,0.106123827851,0.106219159755,0.106314490683,0.106409820634,0.106505149607,0.106600477601,0.106695804615,0.106791130648,0.1068864557,0.106981779769,0.107077102855,0.107172424957,0.107267746073,0.107363066204,0.107458385348,0.107553703504,0.107649020671,0.107744336849,0.107839652036,0.107934966233,0.108030279437,0.108125591648,0.108220902865,0.108316213088,0.108411522315,0.108506830545,0.108602137778,0.108697444013,0.108792749249,0.108888053485,0.108983356719,0.109078658952,0.109173960183,0.10926926041,0.109364559632,0.10945985785,0.109555155061,0.109650451265,0.109745746461,0.109841040649,0.109936333827,0.110031625994,0.11012691715,0.110222207294,0.110317496424,0.110412784541,0.110508071643,0.110603357729,0.110698642798,0.11079392685,0.110889209883,0.110984491897,0.111079772891,0.111175052864,0.111270331815,0.111365609743,0.111460886648,0.111556162528,0.111651437383,0.111746711211,0.111841984012,0.111937255786,0.11203252653,0.112127796244,0.112223064928,0.112318332581,0.112413599201,0.112508864787,0.11260412934,0.112699392857,0.112794655339,0.112889916784,0.112985177191,0.113080436559,0.113175694889,0.113270952178,0.113366208425,0.113461463631,0.113556717794,0.113651970913,0.113747222987,0.113842474016,0.113937723998,0.114032972933,0.11412822082,0.114223467658,0.114318713446,0.114413958183,0.114509201869,0.114604444502,0.114699686081,0.114794926607,0.114890166077,0.114985404491,0.115080641848,0.115175878147,0.115271113388,0.115366347569,0.115461580689,0.115556812749,0.115652043746,0.11574727368,0.11584250255,0.115937730356,0.116032957095,0.116128182769,0.116223407374,0.116318630912,0.11641385338,0.116509074778,0.116604295106,0.116699514361,0.116794732544,0.116889949653,0.116985165688,0.117080380648,0.117175594531,0.117270807338,0.117366019066,0.117461229715,0.117556439285,0.117651647775,0.117746855183,0.117842061508,0.117937266751,0.118032470909,0.118127673983,0.11822287597,0.118318076871,0.118413276685,0.11850847541,0.118603673045,0.118698869591,0.118794065045,0.118889259408,0.118984452678,0.119079644854,0.119174835935,0.119270025921,0.119365214811,0.119460402604,0.119555589298,0.119650774894,0.119745959389,0.119841142785,0.119936325078,0.120031506269,0.120126686357,0.120221865341,0.120317043219,0.120412219992,0.120507395658,0.120602570216,0.120697743666,0.120792916006,0.120888087236,0.120983257354,0.121078426361,0.121173594255,0.121268761035,0.1213639267,0.12145909125,0.121554254683,0.121649416999,0.121744578197,0.121839738276,0.121934897235,0.122030055073,0.122125211789,0.122220367383,0.122315521853,0.122410675199,0.12250582742,0.122600978515,0.122696128483,0.122791277323,0.122886425035,0.122981571617,0.123076717068,0.123171861388,0.123267004576,0.123362146631,0.123457287552,0.123552427339,0.123647565989,0.123742703503,0.12383783988,0.123932975119,0.124028109218,0.124123242177,0.124218373995,0.124313504672,0.124408634205,0.124503762596,0.124598889842,0.124694015942,0.124789140897,0.124884264704,0.124979387363,0.125074508874,0.125169629235,0.125264748446,0.125359866505,0.125454983412,0.125550099165,0.125645213765,0.12574032721,0.125835439498,0.125930550631,0.126025660606,0.126120769422,0.126215877079,0.126310983576,0.126406088912,0.126501193086,0.126596296097,0.126691397945,0.126786498628,0.126881598145,0.126976696497,0.127071793681,0.127166889697,0.127261984545,0.127357078222,0.127452170729,0.127547262065,0.127642352228,0.127737441218,0.127832529033,0.127927615674,0.128022701139,0.128117785427,0.128212868537,0.128307950469,0.128403031222,0.128498110794,0.128593189185,0.128688266394,0.12878334242,0.128878417263,0.128973490921,0.129068563393,0.129163634679,0.129258704778,0.129353773688,0.12944884141,0.129543907942,0.129638973283,0.129734037432,0.129829100389,0.129924162153,0.130019222722,0.130114282096,0.130209340275,0.130304397256,0.13039945304,0.130494507625,0.13058956101,0.130684613196,0.13077966418,0.130874713962,0.130969762541,0.131064809916,0.131159856086,0.131254901051,0.131349944809,0.13144498736,0.131540028703,0.131635068837,0.13173010776,0.131825145473,0.131920181974,0.132015217263,0.132110251338,0.132205284199,0.132300315844,0.132395346274,0.132490375487,0.132585403481,0.132680430257,0.132775455814,0.13287048015,0.132965503265,0.133060525157,0.133155545827,0.133250565272,0.133345583493,0.133440600488,0.133535616256,0.133630630797,0.13372564411,0.133820656194,0.133915667047,0.13401067667,0.134105685061,0.134200692219,0.134295698143,0.134390702834,0.134485706288,0.134580708507,0.134675709489,0.134770709233,0.134865707738,0.134960705003,0.135055701028,0.135150695811,0.135245689352,0.13534068165,0.135435672704,0.135530662513,0.135625651076,0.135720638393,0.135815624462,0.135910609283,0.136005592854,0.136100575176,0.136195556246,0.136290536064,0.13638551463,0.136480491942,0.136575468,0.136670442802,0.136765416348,0.136860388637,0.136955359668,0.13705032944,0.137145297952,0.137240265204,0.137335231194,0.137430195921,0.137525159386,0.137620121586,0.137715082522,0.137810042192,0.137905000595,0.13799995773,0.138094913597,0.138189868194,0.138284821522,0.138379773578,0.138474724362,0.138569673873,0.138664622111,0.138759569074,0.138854514762,0.138949459173,0.139044402308,0.139139344164,0.139234284741,0.139329224038,0.139424162055,0.13951909879,0.139614034243,0.139708968412,0.139803901298,0.139898832898,0.139993763212,0.14008869224,0.140183619979,0.140278546431,0.140373471592,0.140468395464,0.140563318044,0.140658239333,0.140753159328,0.14084807803,0.140942995437,0.141037911549,0.141132826364,0.141227739882,0.141322652102,0.141417563022,0.141512472643,0.141607380963,0.141702287982,0.141797193698,0.14189209811,0.141987001219,0.142081903022,0.142176803519,0.14227170271,0.142366600593,0.142461497167,0.142556392431,0.142651286386,0.142746179029,0.14284107036,0.142935960378,0.143030849082,0.143125736471,0.143220622545,0.143315507303,0.143410390743,0.143505272865,0.143600153667,0.14369503315,0.143789911312,0.143884788153,0.143979663671,0.144074537865,0.144169410735,0.14426428228,0.144359152499,0.144454021391,0.144548888955,0.144643755191,0.144738620097,0.144833483672,0.144928345916,0.145023206829,0.145118066408,0.145212924653,0.145307781563,0.145402637138,0.145497491376,0.145592344277,0.14568719584,0.145782046064,0.145876894947,0.14597174249,0.146066588691,0.146161433549,0.146256277064,0.146351119234,0.14644596006,0.146540799539,0.146635637671,0.146730474455,0.146825309891,0.146920143977,0.147014976713,0.147109808097,0.147204638129,0.147299466808,0.147394294133,0.147489120103,0.147583944718,0.147678767976,0.147773589876,0.147868410418,0.147963229601,0.148058047424,0.148152863887,0.148247678987,0.148342492725,0.148437305099,0.148532116108,0.148626925753,0.148721734031,0.148816540942,0.148911346486,0.14900615066,0.149100953465,0.1491957549,0.149290554963,0.149385353654,0.149480150972,0.149574946915,0.149669741484,0.149764534677,0.149859326494,0.149954116933,0.150048905994,0.150143693675,0.150238479977,0.150333264897,0.150428048436,0.150522830592,0.150617611364,0.150712390752,0.150807168755,0.150901945371,0.1509967206,0.151091494442,0.151186266894,0.151281037957,0.15137580763,0.151470575911,0.151565342799,0.151660108295,0.151754872397,0.151849635103,0.151944396414,0.152039156328,0.152133914845,0.152228671963,0.152323427682,0.152418182001,0.152512934919,0.152607686435,0.152702436549,0.152797185258,0.152891932564,0.152986678464,0.153081422957,0.153176166044,0.153270907723,0.153365647992,0.153460386852,0.153555124302,0.15364986034,0.153744594966,0.153839328178,0.153934059977,0.154028790361,0.154123519328,0.154218246879,0.154312973013,0.154407697728,0.154502421024,0.1545971429,0.154691863355,0.154786582387,0.154881299997,0.154976016184,0.155070730946,0.155165444282,0.155260156193,0.155354866676,0.155449575731,0.155544283357,0.155638989554,0.15573369432,0.155828397654,0.155923099556,0.156017800025,0.15611249906,0.15620719666,0.156301892824,0.156396587552,0.156491280842,0.156585972693,0.156680663105,0.156775352077,0.156870039608,0.156964725697,0.157059410343,0.157154093546,0.157248775304,0.157343455616,0.157438134483,0.157532811902,0.157627487873,0.157722162395,0.157816835468,0.15791150709,0.15800617726,0.158100845978,0.158195513243,0.158290179054,0.15838484341,0.15847950631,0.158574167753,0.158668827739,0.158763486266,0.158858143334,0.158952798942,0.159047453088,0.159142105773,0.159236756995,0.159331406753,0.159426055047,0.159520701875,0.159615347237,0.159709991132,0.159804633559,0.159899274517,0.159993914005,0.160088552023,0.160183188569,0.160277823642,0.160372457243,0.160467089369,0.160561720021,0.160656349196,0.160750976895,0.160845603116,0.160940227859,0.161034851122,0.161129472906,0.161224093208,0.161318712028,0.161413329366,0.161507945219,0.161602559588,0.161697172472,0.16179178387,0.16188639378,0.161981002202,0.162075609136,0.16217021458,0.162264818533,0.162359420994,0.162454021963,0.162548621439,0.162643219421,0.162737815908,0.162832410899,0.162927004393,0.16302159639,0.163116186888,0.163210775887,0.163305363385,0.163399949383,0.163494533879,0.163589116871,0.163683698361,0.163778278345,0.163872856825,0.163967433797,0.164062009263,0.164156583221,0.16425115567,0.164345726609,0.164440296037,0.164534863954,0.164629430359,0.16472399525,0.164818558628,0.16491312049,0.165007680836,0.165102239666,0.165196796978,0.165291352772,0.165385907046,0.1654804598,0.165575011034,0.165669560745,0.165764108933,0.165858655598,0.165953200738,0.166047744353,0.166142286441,0.166236827003,0.166331366036,0.16642590354,0.166520439515,0.166614973959,0.166709506872,0.166804038252,0.166898568099,0.166993096412,0.16708762319,0.167182148432,0.167276672137,0.167371194305,0.167465714935,0.167560234025,0.167654751575,0.167749267584,0.167843782051,0.167938294975,0.168032806355,0.168127316191,0.168221824482,0.168316331226,0.168410836423,0.168505340073,0.168599842173,0.168694342724,0.168788841724,0.168883339172,0.168977835068,0.169072329411,0.1691668222,0.169261313434,0.169355803112,0.169450291234,0.169544777798,0.169639262803,0.16973374625,0.169828228136,0.169922708461,0.170017187224,0.170111664424,0.170206140061,0.170300614133,0.17039508664,0.170489557581,0.170584026954,0.17067849476,0.170772960997,0.170867425664,0.17096188876,0.171056350285,0.171150810238,0.171245268618,0.171339725423,0.171434180654,0.171528634308,0.171623086386,0.171717536887,0.171811985809,0.171906433152,0.172000878915,0.172095323097,0.172189765697,0.172284206714,0.172378646148,0.172473083997,0.172567520261,0.172661954938,0.172756388029,0.172850819531,0.172945249445,0.173039677769,0.173134104503,0.173228529645,0.173322953195,0.173417375152,0.173511795514,0.173606214282,0.173700631454,0.17379504703,0.173889461008,0.173983873387,0.174078284168,0.174172693348,0.174267100928,0.174361506905,0.17445591128,0.174550314051,0.174644715218,0.17473911478,0.174833512735,0.174927909083,0.175022303824,0.175116696956,0.175211088478,0.175305478389,0.175399866689,0.175494253377,0.175588638452,0.175683021913,0.175777403759,0.175871783989,0.175966162603,0.176060539599,0.176154914977,0.176249288736,0.176343660875,0.176438031393,0.176532400289,0.176626767562,0.176721133212,0.176815497238,0.176909859638,0.177004220412,0.177098579559,0.177192937079,0.177287292969,0.17738164723,0.177475999861,0.17757035086,0.177664700227,0.177759047961,0.177853394061,0.177947738526,0.178042081356,0.178136422549,0.178230762105,0.178325100022,0.178419436301,0.178513770939,0.178608103936,0.178702435292,0.178796765005,0.178891093075,0.1789854195,0.179079744281,0.179174067415,0.179268388902,0.179362708741,0.179457026932,0.179551343473,0.179645658364,0.179739971603,0.179834283191,0.179928593125,0.180022901406,0.180117208031,0.180211513002,0.180305816315,0.180400117972,0.18049441797,0.180588716309,0.180683012988,0.180777308007,0.180871601363,0.180965893058,0.181060183088,0.181154471455,0.181248758156,0.181343043192,0.18143732656,0.181531608261,0.181625888293,0.181720166656,0.181814443348,0.18190871837,0.182002991719,0.182097263395,0.182191533397,0.182285801725,0.182380068377,0.182474333353,0.182568596652,0.182662858272,0.182757118214,0.182851376475,0.182945633056,0.183039887955,0.183134141172,0.183228392705,0.183322642555,0.183416890719,0.183511137197,0.183605381988,0.183699625092,0.183793866507,0.183888106233,0.183982344269,0.184076580613,0.184170815266,0.184265048226,0.184359279491,0.184453509063,0.184547736939,0.184641963118,0.1847361876,0.184830410385,0.18492463147,0.185018850856,0.185113068541,0.185207284524,0.185301498805,0.185395711383,0.185489922257,0.185584131425,0.185678338888,0.185772544644,0.185866748693,0.185960951033,0.186055151663,0.186149350584,0.186243547794,0.186337743291,0.186431937076,0.186526129147,0.186620319504,0.186714508145,0.18680869507,0.186902880278,0.186997063768,0.18709124554,0.187185425591,0.187279603922,0.187373780531,0.187467955419,0.187562128583,0.187656300023,0.187750469738,0.187844637727,0.18793880399,0.188032968525,0.188127131332,0.188221292409,0.188315451757,0.188409609373,0.188503765258,0.18859791941,0.188692071829,0.188786222513,0.188880371462,0.188974518674,0.18906866415,0.189162807888,0.189256949887,0.189351090146,0.189445228665,0.189539365443,0.189633500478,0.18972763377,0.189821765319,0.189915895122,0.19001002318,0.190104149492,0.190198274056,0.190292396871,0.190386517938,0.190480637254,0.19057475482,0.190668870634,0.190762984696,0.190857097004,0.190951207557,0.191045316356,0.191139423398,0.191233528684,0.191327632212,0.191421733981,0.19151583399,0.19160993224,0.191704028728,0.191798123453,0.191892216416,0.191986307615,0.19208039705,0.192174484719,0.192268570621,0.192362654756,0.192456737123,0.192550817721,0.192644896549,0.192738973607,0.192833048892,0.192927122405,0.193021194145,0.193115264111,0.193209332302,0.193303398716,0.193397463354,0.193491526214,0.193585587296,0.193679646598,0.19377370412,0.193867759861,0.19396181382,0.194055865996,0.194149916388,0.194243964996,0.194338011818,0.194432056854,0.194526100103,0.194620141563,0.194714181235,0.194808219117,0.194902255209,0.194996289509,0.195090322016,0.19518435273,0.195278381651,0.195372408776,0.195466434105,0.195560457638,0.195654479373,0.19574849931,0.195842517448,0.195936533785,0.196030548321,0.196124561056,0.196218571988,0.196312581116,0.19640658844,0.196500593958,0.19659459767,0.196688599575,0.196782599672,0.196876597961,0.19697059444,0.197064589108,0.197158581965,0.197252573009,0.197346562241,0.197440549659,0.197534535261,0.197628519048,0.197722501019,0.197816481172,0.197910459507,0.198004436022,0.198098410718,0.198192383593,0.198286354646,0.198380323876,0.198474291283,0.198568256866,0.198662220623,0.198756182554,0.198850142659,0.198944100935,0.199038057383,0.199132012002,0.19922596479,0.199319915747,0.199413864871,0.199507812163,0.199601757621,0.199695701244,0.199789643032,0.199883582983,0.199977521097,0.200071457373,0.20016539181,0.200259324407,0.200353255163,0.200447184078,0.20054111115,0.200635036378,0.200728959763,0.200822881302,0.200916800996,0.201010718843,0.201104634842,0.201198548993,0.201292461294,0.201386371745,0.201480280345,0.201574187093,0.201668091988,0.20176199503,0.201855896217,0.201949795548,0.202043693023,0.202137588641,0.202231482401,0.202325374303,0.202419264344,0.202513152525,0.202607038844,0.202700923302,0.202794805895,0.202888686625,0.20298256549,0.203076442489,0.203170317622,0.203264190887,0.203358062284,0.203451931811,0.203545799469,0.203639665255,0.20373352917,0.203827391212,0.20392125138,0.204015109674,0.204108966093,0.204202820635,0.204296673301,0.204390524089,0.204484372998,0.204578220027,0.204672065176,0.204765908444,0.20485974983,0.204953589332,0.205047426951,0.205141262685,0.205235096533,0.205328928495,0.20542275857,0.205516586756,0.205610413053,0.20570423746,0.205798059977,0.205891880602,0.205985699334,0.206079516173,0.206173331118,0.206267144167,0.206360955321,0.206454764578,0.206548571937,0.206642377398,0.206736180959,0.20682998262,0.20692378238,0.207017580237,0.207111376192,0.207205170243,0.20729896239,0.207392752631,0.207486540966,0.207580327394,0.207674111913,0.207767894524,0.207861675225,0.207955454015,0.208049230894,0.208143005861,0.208236778914,0.208330550053,0.208424319278,0.208518086586,0.208611851978,0.208705615453,0.208799377009,0.208893136645,0.208986894362,0.209080650158,0.209174404032,0.209268155983,0.20936190601,0.209455654114,0.209549400292,0.209643144543,0.209736886868,0.209830627265,0.209924365734,0.210018102272,0.21011183688,0.210205569557,0.210299300302,0.210393029114,0.210486755992,0.210580480935,0.210674203942,0.210767925013,0.210861644147,0.210955361343,0.211049076599,0.211142789916,0.211236501291,0.211330210725,0.211423918217,0.211517623765,0.211611327369,0.211705029028,0.211798728741,0.211892426507,0.211986122326,0.212079816196,0.212173508116,0.212267198087,0.212360886106,0.212454572173,0.212548256288,0.212641938448,0.212735618654,0.212829296905,0.2129229732,0.213016647537,0.213110319916,0.213203990337,0.213297658797,0.213391325297,0.213484989836,0.213578652412,0.213672313026,0.213765971675,0.213859628359,0.213953283078,0.214046935829,0.214140586614,0.21423423543,0.214327882277,0.214421527154,0.21451517006,0.214608810994,0.214702449955,0.214796086943,0.214889721957,0.214983354995,0.215076986058,0.215170615143,0.215264242251,0.21535786738,0.215451490529,0.215545111698,0.215638730886,0.215732348092,0.215825963314,0.215919576553,0.216013187808,0.216106797076,0.216200404358,0.216294009653,0.21638761296,0.216481214278,0.216574813606,0.216668410944,0.216762006289,0.216855599643,0.216949191003,0.217042780369,0.217136367739,0.217229953114,0.217323536493,0.217417117873,0.217510697256,0.217604274638,0.217697850021,0.217791423403,0.217884994783,0.21797856416,0.218072131533,0.218165696902,0.218259260266,0.218352821623,0.218446380974,0.218539938316,0.21863349365,0.218727046974,0.218820598288,0.21891414759,0.21900769488,0.219101240157,0.21919478342,0.219288324668,0.219381863901,0.219475401117,0.219568936315,0.219662469496,0.219756000657,0.219849529799,0.219943056919,0.220036582018,0.220130105095,0.220223626148,0.220317145177,0.22041066218,0.220504177158,0.220597690109,0.220691201032,0.220784709927,0.220878216792,0.220971721627,0.221065224431,0.221158725203,0.221252223942,0.221345720647,0.221439215318,0.221532707953,0.221626198552,0.221719687114,0.221813173638,0.221906658123,0.222000140568,0.222093620973,0.222187099337,0.222280575658,0.222374049935,0.222467522169,0.222560992358,0.222654460502,0.222747926598,0.222841390647,0.222934852648,0.2230283126,0.223121770502,0.223215226353,0.223308680152,0.223402131898,0.223495581591,0.22358902923,0.223682474813,0.223775918341,0.223869359811,0.223962799224,0.224056236578,0.224149671873,0.224243105107,0.22433653628,0.224429965392,0.22452339244,0.224616817424,0.224710240344,0.224803661198,0.224897079986,0.224990496707,0.22508391136,0.225177323944,0.225270734458,0.225364142901,0.225457549273,0.225550953572,0.225644355799,0.225737755951,0.225831154028,0.22592455003,0.226017943954,0.226111335802,0.226204725571,0.22629811326,0.22639149887,0.226484882399,0.226578263846,0.22667164321,0.226765020491,0.226858395687,0.226951768798,0.227045139823,0.227138508761,0.227231875611,0.227325240373,0.227418603045,0.227511963627,0.227605322117,0.227698678516,0.227792032821,0.227885385033,0.22797873515,0.228072083171,0.228165429096,0.228258772924,0.228352114653,0.228445454284,0.228538791815,0.228632127245,0.228725460574,0.2288187918,0.228912120923,0.229005447942,0.229098772856,0.229192095664,0.229285416365,0.229378734959,0.229472051444,0.229565365821,0.229658678087,0.229751988242,0.229845296285,0.229938602216,0.230031906033,0.230125207735,0.230218507323,0.230311804794,0.230405100148,0.230498393385,0.230591684502,0.230684973501,0.230778260378,0.230871545135,0.230964827769,0.231058108281,0.231151386668,0.231244662931,0.231337937069,0.231431209079,0.231524478963,0.231617746719,0.231711012345,0.231804275842,0.231897537208,0.231990796442,0.232084053545,0.232177308513,0.232270561348,0.232363812048,0.232457060612,0.232550307039,0.232643551328,0.23273679348,0.232830033492,0.232923271363,0.233016507094,0.233109740683,0.233202972129,0.233296201432,0.233389428591,0.233482653604,0.233575876471,0.233669097191,0.233762315763,0.233855532186,0.23394874646,0.234041958584,0.234135168556,0.234228376376,0.234321582043,0.234414785556,0.234507986915,0.234601186118,0.234694383165,0.234787578054,0.234880770785,0.234973961358,0.23506714977,0.235160336022,0.235253520112,0.23534670204,0.235439881805,0.235533059405,0.23562623484,0.23571940811,0.235812579213,0.235905748149,0.235998914916,0.236092079513,0.236185241941,0.236278402198,0.236371560283,0.236464716195,0.236557869934,0.236651021498,0.236744170887,0.2368373181,0.236930463136,0.237023605994,0.237116746674,0.237209885174,0.237303021494,0.237396155632,0.237489287588,0.237582417362,0.237675544951,0.237768670356,0.237861793575,0.237954914608,0.238048033454,0.238141150112,0.23823426458,0.238327376859,0.238420486948,0.238513594844,0.238606700549,0.23869980406,0.238792905377,0.238886004499,0.238979101425,0.239072196155,0.239165288687,0.239258379021,0.239351467156,0.239444553091,0.239537636824,0.239630718356,0.239723797685,0.239816874811,0.239909949733,0.240003022449,0.240096092959,0.240189161262,0.240282227358,0.240375291244,0.240468352922,0.240561412389,0.240654469645,0.240747524689,0.24084057752,0.240933628137,0.241026676539,0.241119722726,0.241212766697,0.241305808451,0.241398847986,0.241491885303,0.2415849204,0.241677953276,0.241770983931,0.241864012364,0.241957038573,0.242050062558,0.242143084319,0.242236103854,0.242329121162,0.242422136243,0.242515149095,0.242608159718,0.242701168112,0.242794174274,0.242887178205,0.242980179903,0.243073179368,0.243166176599,0.243259171594,0.243352164353,0.243445154876,0.243538143161,0.243631129207,0.243724113014,0.24381709458,0.243910073906,0.24400305099,0.24409602583,0.244188998427,0.24428196878,0.244374936887,0.244467902748,0.244560866362,0.244653827727,0.244746786844,0.244839743712,0.244932698329,0.245025650694,0.245118600807,0.245211548668,0.245304494274,0.245397437625,0.245490378721,0.245583317561,0.245676254142,0.245769188466,0.245862120531,0.245955050336,0.24604797788,0.246140903162,0.246233826182,0.246326746939,0.246419665431,0.246512581659,0.24660549562,0.246698407315,0.246791316742,0.246884223901,0.24697712879,0.247070031409,0.247162931758,0.247255829834,0.247348725638,0.247441619168,0.247534510423,0.247627399404,0.247720286108,0.247813170535,0.247906052685,0.247998932555,0.248091810146,0.248184685457,0.248277558487,0.248370429234,0.248463297698,0.248556163879,0.248649027775,0.248741889385,0.248834748709,0.248927605746,0.249020460494,0.249113312954,0.249206163124,0.249299011003,0.249391856591,0.249484699886,0.249577540889,0.249670379597,0.24976321601,0.249856050127,0.249948881948,0.250041711471,0.250134538696,0.250227363622,0.250320186248,0.250413006573,0.250505824596,0.250598640317,0.250691453734,0.250784264847,0.250877073654,0.250969880156,0.251062684351,0.251155486238,0.251248285816,0.251341083085,0.251433878044,0.251526670692,0.251619461028,0.25171224905,0.25180503476,0.251897818154,0.251990599233,0.252083377996,0.252176154442,0.25226892857,0.25236170038,0.252454469869,0.252547237038,0.252640001886,0.252732764411,0.252825524613,0.252918282492,0.253011038046,0.253103791274,0.253196542175,0.25328929075,0.253382036996,0.253474780913,0.2535675225,0.253660261756,0.253752998681,0.253845733273,0.253938465532,0.254031195457,0.254123923047,0.254216648301,0.254309371219,0.254402091799,0.25449481004,0.254587525942,0.254680239504,0.254772950725,0.254865659605,0.254958366141,0.255051070334,0.255143772183,0.255236471686,0.255329168844,0.255421863654,0.255514556117,0.255607246231,0.255699933995,0.25579261941,0.255885302473,0.255977983184,0.256070661542,0.256163337546,0.256256011196,0.25634868249,0.256441351428,0.256534018009,0.256626682232,0.256719344096,0.2568120036,0.256904660743,0.256997315526,0.257089967946,0.257182618003,0.257275265696,0.257367911024,0.257460553986,0.257553194582,0.257645832811,0.257738468671,0.257831102162,0.257923733283,0.258016362034,0.258108988413,0.258201612419,0.258294234052,0.258386853311,0.258479470195,0.258572084703,0.258664696834,0.258757306588,0.258849913963,0.258942518959,0.259035121575,0.25912772181,0.259220319663,0.259312915133,0.25940550822,0.259498098922,0.259590687239,0.25968327317,0.259775856714,0.25986843787,0.259961016637,0.260053593015,0.260146167003,0.2602387386,0.260331307804,0.260423874615,0.260516439033,0.260609001056,0.260701560684,0.260794117915,0.260886672749,0.260979225186,0.261071775223,0.26116432286,0.261256868097,0.261349410933,0.261441951366,0.261534489397,0.261627025023,0.261719558244,0.26181208906,0.261904617469,0.261997143471,0.262089667065,0.262182188249,0.262274707024,0.262367223388,0.26245973734,0.26255224888,0.262644758006,0.262737264719,0.262829769016,0.262922270897,0.263014770362,0.263107267409,0.263199762037,0.263292254247,0.263384744036,0.263477231404,0.263569716351,0.263662198875,0.263754678975,0.263847156651,0.263939631901,0.264032104726,0.264124575124,0.264217043093,0.264309508635,0.264401971746,0.264494432428,0.264586890678,0.264679346496,0.264771799882,0.264864250833,0.26495669935,0.265049145432,0.265141589077,0.265234030286,0.265326469056,0.265418905387,0.265511339279,0.26560377073,0.26569619974,0.265788626308,0.265881050432,0.265973472113,0.266065891349,0.266158308139,0.266250722483,0.266343134379,0.266435543828,0.266527950827,0.266620355376,0.266712757475,0.266805157122,0.266897554317,0.266989949058,0.267082341345,0.267174731178,0.267267118554,0.267359503474,0.267451885937,0.267544265941,0.267636643486,0.26772901857,0.267821391194,0.267913761356,0.268006129056,0.268098494292,0.268190857063,0.26828321737,0.268375575211,0.268467930584,0.26856028349,0.268652633928,0.268744981896,0.268837327394,0.26892967042,0.269022010975,0.269114349057,0.269206684665,0.269299017799,0.269391348458,0.26948367664,0.269576002346,0.269668325573,0.269760646322,0.269852964591,0.269945280379,0.270037593687,0.270129904512,0.270222212854,0.270314518713,0.270406822087,0.270499122975,0.270591421377,0.270683717291,0.270776010718,0.270868301656,0.270960590104,0.271052876061,0.271145159527,0.2712374405,0.271329718981,0.271421994967,0.271514268459,0.271606539455,0.271698807954,0.271791073956,0.271883337459,0.271975598464,0.272067856969,0.272160112972,0.272252366475,0.272344617474,0.272436865971,0.272529111963,0.27262135545,0.272713596431,0.272805834906,0.272898070873,0.272990304331,0.273082535281,0.27317476372,0.273266989648,0.273359213064,0.273451433968,0.273543652358,0.273635868234,0.273728081595,0.27382029244,0.273912500767,0.274004706577,0.274096909869,0.274189110641,0.274281308892,0.274373504623,0.274465697831,0.274557888517,0.274650076679,0.274742262317,0.274834445429,0.274926626015,0.275018804074,0.275110979605,0.275203152607,0.275295323079,0.275387491021,0.275479656432,0.275571819311,0.275663979657,0.275756137468,0.275848292746,0.275940445487,0.276032595692,0.27612474336,0.27621688849,0.276309031081,0.276401171132,0.276493308643,0.276585443612,0.276677576039,0.276769705923,0.276861833262,0.276953958057,0.277046080306,0.277138200009,0.277230317164,0.277322431771,0.277414543828,0.277506653336,0.277598760293,0.277690864699,0.277782966552,0.277875065852,0.277967162597,0.278059256787,0.278151348422,0.2782434375,0.27833552402,0.278427607982,0.278519689385,0.278611768228,0.278703844509,0.278795918229,0.278887989387,0.27898005798,0.27907212401,0.279164187474,0.279256248372,0.279348306704,0.279440362467,0.279532415663,0.279624466288,0.279716514344,0.279808559828,0.279900602741,0.27999264308,0.280084680846,0.280176716038,0.280268748654,0.280360778694,0.280452806157,0.280544831042,0.280636853349,0.280728873076,0.280820890222,0.280912904788,0.281004916771,0.281096926171,0.281188932988,0.281280937219,0.281372938866,0.281464937926,0.281556934399,0.281648928284,0.28174091958,0.281832908286,0.281924894402,0.282016877926,0.282108858858,0.282200837197,0.282292812942,0.282384786093,0.282476756647,0.282568724606,0.282660689967,0.282752652729,0.282844612893,0.282936570457,0.28302852542,0.283120477782,0.283212427541,0.283304374697,0.283396319249,0.283488261197,0.283580200538,0.283672137273,0.2837640714,0.283856002919,0.283947931829,0.284039858129,0.284131781818,0.284223702895,0.28431562136,0.284407537211,0.284499450449,0.284591361071,0.284683269077,0.284775174466,0.284867077238,0.284958977392,0.285050874926,0.28514276984,0.285234662133,0.285326551805,0.285418438853,0.285510323278,0.285602205079,0.285694084255,0.285785960804,0.285877834727,0.285969706022,0.286061574688,0.286153440725,0.286245304132,0.286337164908,0.286429023051,0.286520878562,0.286612731439,0.286704581682,0.286796429289,0.286888274261,0.286980116595,0.287071956291,0.287163793349,0.287255627767,0.287347459545,0.287439288681,0.287531115176,0.287622939027,0.287714760235,0.287806578798,0.287898394715,0.287990207987,0.288082018611,0.288173826587,0.288265631915,0.288357434592,0.288449234619,0.288541031995,0.288632826719,0.288724618789,0.288816408206,0.288908194968,0.288999979074,0.289091760524,0.289183539317,0.289275315451,0.289367088927,0.289458859743,0.289550627898,0.289642393391,0.289734156223,0.289825916391,0.289917673895,0.290009428734,0.290101180908,0.290192930415,0.290284677254,0.290376421426,0.290468162928,0.290559901761,0.290651637922,0.290743371412,0.29083510223,0.290926830374,0.291018555844,0.291110278639,0.291201998759,0.291293716201,0.291385430966,0.291477143053,0.291568852461,0.291660559188,0.291752263235,0.2918439646,0.291935663282,0.292027359281,0.292119052596,0.292210743226,0.292302431169,0.292394116426,0.292485798996,0.292577478876,0.292669156068,0.292760830569,0.29285250238,0.292944171498,0.293035837924,0.293127501656,0.293219162694,0.293310821037,0.293402476684,0.293494129634,0.293585779886,0.293677427439,0.293769072293,0.293860714447,0.2939523539,0.29404399065,0.294135624698,0.294227256043,0.294318884683,0.294410510617,0.294502133846,0.294593754367,0.294685372181,0.294776987285,0.294868599681,0.294960209366,0.295051816339,0.295143420601,0.29523502215,0.295326620985,0.295418217106,0.295509810511,0.295601401199,0.295692989171,0.295784574425,0.29587615696,0.295967736775,0.29605931387,0.296150888244,0.296242459895,0.296334028823,0.296425595028,0.296517158508,0.296608719262,0.29670027729,0.296791832591,0.296883385164,0.296974935008,0.297066482122,0.297158026505,0.297249568157,0.297341107077,0.297432643264,0.297524176717,0.297615707435,0.297707235418,0.297798760664,0.297890283172,0.297981802943,0.298073319974,0.298164834266,0.298256345817,0.298347854627,0.298439360694,0.298530864018,0.298622364598,0.298713862433,0.298805357523,0.298896849865,0.298988339461,0.299079826308,0.299171310406,0.299262791754,0.299354270352,0.299445746198,0.299537219291,0.299628689631,0.299720157217,0.299811622048,0.299903084124,0.299994543442,0.300086000003,0.300177453806,0.30026890485,0.300360353133,0.300451798656,0.300543241417,0.300634681416,0.300726118651,0.300817553122,0.300908984828,0.301000413768,0.301091839941,0.301183263347,0.301274683984,0.301366101852,0.30145751695,0.301548929277,0.301640338833,0.301731745615,0.301823149625,0.301914550859,0.302005949319,0.302097345003,0.30218873791,0.302280128039,0.30237151539,0.302462899962,0.302554281753,0.302645660763,0.302737036992,0.302828410438,0.3029197811,0.303011148978,0.30310251407,0.303193876377,0.303285235897,0.303376592629,0.303467946572,0.303559297726,0.30365064609,0.303741991662,0.303833334443,0.303924674431,0.304016011625,0.304107346025,0.30419867763,0.304290006438,0.30438133245,0.304472655663,0.304563976079,0.304655293694,0.304746608509,0.304837920523,0.304929229735,0.305020536145,0.30511183975,0.305203140551,0.305294438547,0.305385733736,0.305477026119,0.305568315693,0.305659602459,0.305750886415,0.305842167561,0.305933445896,0.306024721418,0.306115994128,0.306207264024,0.306298531105,0.306389795371,0.30648105682,0.306572315453,0.306663571267,0.306754824263,0.306846074439,0.306937321795,0.307028566329,0.307119808042,0.307211046931,0.307302282996,0.307393516237,0.307484746652,0.307575974241,0.307667199003,0.307758420937,0.307849640042,0.307940856317,0.308032069761,0.308123280375,0.308214488156,0.308305693104,0.308396895218,0.308488094498,0.308579290942,0.308670484549,0.308761675319,0.308852863252,0.308944048345,0.309035230598,0.309126410011,0.309217586583,0.309308760312,0.309399931198,0.309491099241,0.309582264438,0.30967342679,0.309764586295,0.309855742954,0.309946896764,0.310038047725,0.310129195836,0.310220341096,0.310311483506,0.310402623062,0.310493759766,0.310584893616,0.31067602461,0.31076715275,0.310858278032,0.310949400458,0.311040520025,0.311131636733,0.311222750581,0.311313861569,0.311404969695,0.311496074958,0.311587177359,0.311678276895,0.311769373567,0.311860467372,0.311951558312,0.312042646384,0.312133731587,0.312224813922,0.312315893386,0.31240696998,0.312498043703,0.312589114553,0.312680182529,0.312771247632,0.31286230986,0.312953369212,0.313044425687,0.313135479285,0.313226530004,0.313317577845,0.313408622805,0.313499664885,0.313590704083,0.313681740399,0.313772773831,0.31386380438,0.313954832043,0.31404585682,0.314136878711,0.314227897714,0.314318913829,0.314409927055,0.314500937391,0.314591944836,0.31468294939,0.314773951051,0.314864949818,0.314955945692,0.31504693867,0.315137928753,0.315228915938,0.315319900227,0.315410881617,0.315501860108,0.315592835698,0.315683808388,0.315774778176,0.315865745062,0.315956709045,0.316047670123,0.316138628296,0.316229583563,0.316320535923,0.316411485376,0.316502431921,0.316593375556,0.316684316281,0.316775254096,0.316866188998,0.316957120989,0.317048050065,0.317138976228,0.317229899475,0.317320819806,0.317411737221,0.317502651718,0.317593563297,0.317684471956,0.317775377696,0.317866280514,0.317957180411,0.318048077385,0.318138971436,0.318229862562,0.318320750763,0.318411636039,0.318502518387,0.318593397808,0.318684274301,0.318775147864,0.318866018497,0.318956886199,0.31904775097,0.319138612808,0.319229471712,0.319320327682,0.319411180717,0.319502030816,0.319592877978,0.319683722203,0.319774563489,0.319865401836,0.319956237242,0.320047069708,0.320137899232,0.320228725813,0.320319549451,0.320410370144,0.320501187893,0.320592002695,0.320682814551,0.320773623458,0.320864429418,0.320955232428,0.321046032488,0.321136829597,0.321227623754,0.321318414958,0.321409203209,0.321499988506,0.321590770847,0.321681550233,0.321772326662,0.321863100133,0.321953870645,0.322044638198,0.322135402791,0.322226164423,0.322316923094,0.322407678801,0.322498431545,0.322589181325,0.322679928139,0.322770671988,0.322861412869,0.322952150783,0.323042885729,0.323133617705,0.323224346711,0.323315072746,0.323405795809,0.3234965159,0.323587233016,0.323677947159,0.323768658326,0.323859366518,0.323950071732,0.324040773969,0.324131473228,0.324222169507,0.324312862805,0.324403553123,0.324494240459,0.324584924813,0.324675606182,0.324766284568,0.324856959968,0.324947632382,0.32503830181,0.325128968249,0.3252196317,0.325310292162,0.325400949634,0.325491604115,0.325582255603,0.325672904099,0.325763549602,0.32585419211,0.325944831623,0.32603546814,0.326126101661,0.326216732183,0.326307359707,0.326397984232,0.326488605756,0.32657922428,0.326669839801,0.32676045232,0.326851061836,0.326941668347,0.327032271853,0.327122872352,0.327213469845,0.327304064331,0.327394655808,0.327485244275,0.327575829733,0.327666412179,0.327756991613,0.327847568035,0.327938141443,0.328028711837,0.328119279216,0.328209843579,0.328300404925,0.328390963253,0.328481518563,0.328572070854,0.328662620124,0.328753166373,0.328843709601,0.328934249806,0.329024786987,0.329115321144,0.329205852276,0.329296380382,0.329386905461,0.329477427512,0.329567946535,0.329658462529,0.329748975492,0.329839485424,0.329929992325,0.330020496193,0.330110997028,0.330201494828,0.330291989593,0.330382481322,0.330472970014,0.330563455669,0.330653938285,0.330744417862,0.330834894399,0.330925367895,0.331015838349,0.33110630576,0.331196770128,0.331287231451,0.33137768973,0.331468144962,0.331558597148,0.331649046286,0.331739492376,0.331829935416,0.331920375407,0.332010812346,0.332101246234,0.332191677069,0.33228210485,0.332372529578,0.33246295125,0.332553369866,0.332643785426,0.332734197927,0.332824607371,0.332915013755,0.333005417079,0.333095817343,0.333186214544,0.333276608683,0.333366999759,0.33345738777,0.333547772716,0.333638154596,0.33372853341,0.333818909156,0.333909281834,0.333999651442,0.33409001798,0.334180381448,0.334270741844,0.334361099167,0.334451453417,0.334541804592,0.334632152693,0.334722497718,0.334812839666,0.334903178536,0.334993514328,0.335083847041,0.335174176674,0.335264503226,0.335354826697,0.335445147085,0.335535464389,0.335625778609,0.335716089745,0.335806397794,0.335896702757,0.335987004633,0.33607730342,0.336167599118,0.336257891726,0.336348181243,0.336438467668,0.336528751001,0.336619031241,0.336709308387,0.336799582437,0.336889853392,0.33698012125,0.337070386011,0.337160647674,0.337250906237,0.337341161701,0.337431414063,0.337521663324,0.337611909483,0.337702152538,0.33779239249,0.337882629336,0.337972863077,0.338063093711,0.338153321238,0.338243545656,0.338333766966,0.338423985165,0.338514200254,0.338604412231,0.338694621096,0.338784826848,0.338875029485,0.338965229008,0.339055425415,0.339145618705,0.339235808879,0.339325995934,0.33941617987,0.339506360686,0.339596538381,0.339686712955,0.339776884407,0.339867052735,0.33995721794,0.340047380019,0.340137538974,0.340227694801,0.340317847501,0.340407997074,0.340498143517,0.34058828683,0.340678427013,0.340768564064,0.340858697983,0.340948828769,0.341038956421,0.341129080939,0.34121920232,0.341309320566,0.341399435674,0.341489547644,0.341579656475,0.341669762166,0.341759864717,0.341849964126,0.341940060393,0.342030153518,0.342120243498,0.342210330333,0.342300414024,0.342390494567,0.342480571964,0.342570646212,0.342660717312,0.342750785262,0.342840850062,0.34293091171,0.343020970206,0.343111025549,0.343201077738,0.343291126773,0.343381172652,0.343471215375,0.343561254941,0.343651291349,0.343741324598,0.343831354687,0.343921381616,0.344011405384,0.34410142599,0.344191443433,0.344281457712,0.344371468826,0.344461476776,0.344551481559,0.344641483174,0.344731481622,0.344821476902,0.344911469012,0.345001457951,0.345091443719,0.345181426316,0.345271405739,0.345361381989,0.345451355064,0.345541324964,0.345631291688,0.345721255235,0.345811215604,0.345901172794,0.345991126805,0.346081077636,0.346171025285,0.346260969753,0.346350911038,0.346440849139,0.346530784056,0.346620715788,0.346710644334,0.346800569692,0.346890491863,0.346980410846,0.347070326639,0.347160239242,0.347250148654,0.347340054874,0.347429957901,0.347519857735,0.347609754375,0.347699647819,0.347789538067,0.347879425119,0.347969308973,0.348059189629,0.348149067085,0.348238941341,0.348328812396,0.348418680249,0.3485085449,0.348598406348,0.348688264591,0.348778119629,0.348867971461,0.348957820087,0.349047665505,0.349137507714,0.349227346714,0.349317182505,0.349407015084,0.349496844452,0.349586670607,0.349676493549,0.349766313277,0.34985612979,0.349945943087,0.350035753168,0.350125560031,0.350215363675,0.350305164101,0.350394961307,0.350484755292,0.350574546055,0.350664333596,0.350754117913,0.350843899007,0.350933676876,0.351023451519,0.351113222935,0.351202991125,0.351292756086,0.351382517818,0.35147227632,0.351562031591,0.351651783631,0.351741532439,0.351831278013,0.351921020354,0.35201075946,0.35210049533,0.352190227964,0.35227995736,0.352369683519,0.352459406438,0.352549126118,0.352638842557,0.352728555755,0.352818265711,0.352907972424,0.352997675892,0.353087376116,0.353177073095,0.353266766827,0.353356457312,0.353446144549,0.353535828538,0.353625509277,0.353715186765,0.353804861002,0.353894531987,0.353984199719,0.354073864197,0.35416352542,0.354253183389,0.354342838101,0.354432489556,0.354522137753,0.354611782691,0.35470142437,0.354791062789,0.354880697946,0.354970329842,0.355059958474,0.355149583843,0.355239205948,0.355328824787,0.35541844036,0.355508052666,0.355597661705,0.355687267475,0.355776869975,0.355866469205,0.355956065165,0.356045657852,0.356135247267,0.356224833408,0.356314416274,0.356403995866,0.356493572182,0.35658314522,0.356672714982,0.356762281464,0.356851844668,0.356941404591,0.357030961233,0.357120514594,0.357210064672,0.357299611467,0.357389154977,0.357478695203,0.357568232142,0.357657765795,0.35774729616,0.357836823237,0.357926347025,0.358015867523,0.35810538473,0.358194898645,0.358284409268,0.358373916598,0.358463420634,0.358552921374,0.358642418819,0.358731912968,0.358821403819,0.358910891371,0.359000375625,0.359089856579,0.359179334232,0.359268808584,0.359358279633,0.35944774738,0.359537211822,0.359626672959,0.359716130791,0.359805585317,0.359895036535,0.359984484445,0.360073929046,0.360163370338,0.360252808319,0.360342242988,0.360431674346,0.36052110239,0.360610527121,0.360699948537,0.360789366637,0.360878781421,0.360968192888,0.361057601037,0.361147005867,0.361236407378,0.361325805568,0.361415200438,0.361504591985,0.361593980209,0.361683365109,0.361772746685,0.361862124936,0.36195149986,0.362040871458,0.362130239727,0.362219604668,0.36230896628,0.362398324561,0.362487679511,0.36257703113,0.362666379415,0.362755724367,0.362845065985,0.362934404268,0.363023739214,0.363113070824,0.363202399096,0.363291724029,0.363381045623,0.363470363877,0.36355967879,0.363648990362,0.363738298591,0.363827603476,0.363916905017,0.364006203213,0.364095498064,0.364184789567,0.364274077723,0.364363362531,0.364452643989,0.364541922098,0.364631196856,0.364720468262,0.364809736316,0.364899001016,0.364988262363,0.365077520354,0.36516677499,0.365256026269,0.365345274191,0.365434518755,0.36552375996,0.365612997805,0.365702232289,0.365791463412,0.365880691173,0.36596991557,0.366059136604,0.366148354272,0.366237568576,0.366326779513,0.366415987082,0.366505191284,0.366594392117,0.36668358958,0.366772783673,0.366861974394,0.366951161743,0.36704034572,0.367129526322,0.36721870355,0.367307877403,0.367397047879,0.367486214979,0.3675753787,0.367664539043,0.367753696007,0.36784284959,0.367931999792,0.368021146612,0.368110290049,0.368199430102,0.368288566771,0.368377700055,0.368466829953,0.368555956464,0.368645079588,0.368734199323,0.368823315668,0.368912428624,0.369001538188,0.369090644361,0.369179747141,0.369268846527,0.36935794252,0.369447035117,0.369536124318,0.369625210123,0.36971429253,0.369803371539,0.369892447149,0.369981519359,0.370070588168,0.370159653575,0.37024871558,0.370337774182,0.370426829379,0.370515881172,0.370604929559,0.37069397454,0.370783016113,0.370872054278,0.370961089034,0.37105012038,0.371139148316,0.37122817284,0.371317193952,0.371406211651,0.371495225936,0.371584236806,0.371673244261,0.371762248299,0.37185124892,0.371940246124,0.372029239908,0.372118230273,0.372207217218,0.372296200741,0.372385180842,0.37247415752,0.372563130775,0.372652100605,0.37274106701,0.372830029988,0.37291898954,0.373007945663,0.373096898359,0.373185847624,0.37327479346,0.373363735864,0.373452674837,0.373541610377,0.373630542483,0.373719471155,0.373808396392,0.373897318193,0.373986236557,0.374075151483,0.374164062971,0.37425297102,0.374341875629,0.374430776797,0.374519674523,0.374608568807,0.374697459647,0.374786347044,0.374875230995,0.374964111501,0.37505298856,0.375141862171,0.375230732334,0.375319599049,0.375408462313,0.375497322127,0.375586178489,0.375675031399,0.375763880856,0.375852726859,0.375941569407,0.3760304085,0.376119244136,0.376208076315,0.376296905036,0.376385730298,0.3764745521,0.376563370442,0.376652185323,0.376740996741,0.376829804697,0.376918609189,0.377007410216,0.377096207778,0.377185001874,0.377273792503,0.377362579664,0.377451363356,0.377540143579,0.377628920332,0.377717693613,0.377806463423,0.37789522976,0.377983992623,0.378072752012,0.378161507926,0.378250260364,0.378339009325,0.378427754809,0.378516496814,0.37860523534,0.378693970385,0.37878270195,0.378871430034,0.378960154634,0.379048875752,0.379137593385,0.379226307533,0.379315018196,0.379403725372,0.37949242906,0.37958112926,0.379669825972,0.379758519193,0.379847208924,0.379935895163,0.38002457791,0.380113257164,0.380201932924,0.38029060519,0.380379273959,0.380467939233,0.380556601009,0.380645259287,0.380733914067,0.380822565346,0.380911213126,0.380999857404,0.38108849818,0.381177135453,0.381265769222,0.381354399487,0.381443026247,0.3815316495,0.381620269247,0.381708885485,0.381797498215,0.381886107436,0.381974713147,0.382063315346,0.382151914034,0.382240509209,0.38232910087,0.382417689017,0.382506273649,0.382594854766,0.382683432365,0.382772006447,0.382860577011,0.382949144055,0.383037707579,0.383126267583,0.383214824065,0.383303377024,0.383391926461,0.383480472373,0.38356901476,0.383657553622,0.383746088957,0.383834620765,0.383923149045,0.384011673796,0.384100195017,0.384188712707,0.384277226867,0.384365737494,0.384454244587,0.384542748148,0.384631248173,0.384719744663,0.384808237617,0.384896727034,0.384985212912,0.385073695252,0.385162174053,0.385250649313,0.385339121032,0.38542758921,0.385516053844,0.385604514935,0.385692972481,0.385781426482,0.385869876938,0.385958323846,0.386046767207,0.386135207019,0.386223643282,0.386312075995,0.386400505157,0.386488930767,0.386577352825,0.386665771329,0.38675418628,0.386842597675,0.386931005514,0.387019409797,0.387107810523,0.38719620769,0.387284601299,0.387372991347,0.387461377835,0.387549760761,0.387638140125,0.387726515926,0.387814888164,0.387903256836,0.387991621943,0.388079983483,0.388168341457,0.388256695862,0.388345046699,0.388433393966,0.388521737663,0.388610077788,0.388698414342,0.388786747322,0.388875076729,0.388963402562,0.389051724819,0.3891400435,0.389228358604,0.389316670131,0.389404978079,0.389493282448,0.389581583236,0.389669880444,0.38975817407,0.389846464113,0.389934750573,0.390023033449,0.39011131274,0.390199588444,0.390287860563,0.390376129094,0.390464394036,0.39055265539,0.390640913153,0.390729167326,0.390817417908,0.390905664897,0.390993908293,0.391082148095,0.391170384302,0.391258616914,0.391346845929,0.391435071348,0.391523293168,0.391611511389,0.391699726011,0.391787937033,0.391876144453,0.391964348271,0.392052548486,0.392140745098,0.392228938105,0.392317127507,0.392405313303,0.392493495492,0.392581674073,0.392669849046,0.392758020409,0.392846188162,0.392934352304,0.393022512835,0.393110669753,0.393198823057,0.393286972747,0.393375118823,0.393463261282,0.393551400125,0.39363953535,0.393727666957,0.393815794945,0.393903919314,0.393992040061,0.394080157187,0.394168270691,0.394256380571,0.394344486828,0.39443258946,0.394520688466,0.394608783847,0.394696875599,0.394784963724,0.394873048221,0.394961129087,0.395049206323,0.395137279928,0.395225349901,0.395313416241,0.395401478948,0.39548953802,0.395577593457,0.395665645257,0.395753693421,0.395841737947,0.395929778835,0.396017816083,0.396105849692,0.396193879659,0.396281905985,0.396369928668,0.396457947707,0.396545963103,0.396633974854,0.396721982958,0.396809987417,0.396897988228,0.39698598539,0.397073978904,0.397161968768,0.397249954981,0.397337937543,0.397425916452,0.397513891709,0.397601863311,0.397689831259,0.397777795552,0.397865756188,0.397953713167,0.398041666488,0.39812961615,0.398217562153,0.398305504496,0.398393443177,0.398481378197,0.398569309554,0.398657237247,0.398745161276,0.398833081639,0.398920998337,0.399008911368,0.399096820731,0.399184726426,0.399272628452,0.399360526807,0.399448421492,0.399536312505,0.399624199846,0.399712083513,0.399799963506,0.399887839825,0.399975712468,0.400063581434,0.400151446723,0.400239308334,0.400327166266,0.400415020518,0.40050287109,0.40059071798,0.400678561188,0.400766400714,0.400854236555,0.400942068712,0.401029897184,0.401117721969,0.401205543067,0.401293360478,0.4013811742,0.401468984233,0.401556790575,0.401644593226,0.401732392186,0.401820187453,0.401907979026,0.401995766905,0.40208355109,0.402171331578,0.402259108369,0.402346881464,0.402434650859,0.402522416556,0.402610178553,0.402697936849,0.402785691444,0.402873442336,0.402961189525,0.40304893301,0.403136672791,0.403224408866,0.403312141235,0.403399869896,0.403487594849,0.403575316094,0.403663033629,0.403750747454,0.403838457568,0.403926163969,0.404013866658,0.404101565633,0.404189260894,0.404276952439,0.404364640269,0.404452324382,0.404540004777,0.404627681453,0.40471535441,0.404803023648,0.404890689164,0.404978350959,0.405066009031,0.40515366338,0.405241314005,0.405328960905,0.405416604079,0.405504243527,0.405591879248,0.40567951124,0.405767139503,0.405854764037,0.40594238484,0.406030001912,0.406117615252,0.406205224859,0.406292830732,0.40638043287,0.406468031273,0.40655562594,0.40664321687,0.406730804063,0.406818387516,0.40690596723,0.406993543204,0.407081115438,0.407168683929,0.407256248677,0.407343809683,0.407431366944,0.40751892046,0.40760647023,0.407694016253,0.407781558529,0.407869097057,0.407956631836,0.408044162865,0.408131690143,0.40821921367,0.408306733445,0.408394249466,0.408481761734,0.408569270247,0.408656775004,0.408744276005,0.40883177325,0.408919266736,0.409006756463,0.409094242431,0.409181724639,0.409269203086,0.40935667777,0.409444148692,0.409531615851,0.409619079245,0.409706538874,0.409793994737,0.409881446833,0.409968895162,0.410056339722,0.410143780514,0.410231217535,0.410318650785,0.410406080264,0.410493505971,0.410580927905,0.410668346064,0.410755760449,0.410843171058,0.410930577891,0.411017980946,0.411105380224,0.411192775723,0.411280167442,0.411367555381,0.411454939538,0.411542319914,0.411629696507,0.411717069316,0.41180443834,0.41189180358,0.411979165034,0.4120665227,0.412153876579,0.41224122667,0.412328572971,0.412415915483,0.412503254203,0.412590589132,0.412677920268,0.412765247612,0.412852571161,0.412939890915,0.413027206874,0.413114519036,0.413201827401,0.413289131968,0.413376432736,0.413463729704,0.413551022872,0.413638312238,0.413725597803,0.413812879565,0.413900157523,0.413987431676,0.414074702024,0.414161968566,0.414249231301,0.414336490229,0.414423745348,0.414510996658,0.414598244157,0.414685487846,0.414772727723,0.414859963788,0.414947196039,0.415034424476,0.415121649098,0.415208869905,0.415296086895,0.415383300068,0.415470509422,0.415557714958,0.415644916674,0.415732114569,0.415819308643,0.415906498895,0.415993685324,0.41608086793,0.41616804671,0.416255221666,0.416342392795,0.416429560098,0.416516723572,0.416603883218,0.416691039035,0.416778191022,0.416865339178,0.416952483502,0.417039623993,0.417126760651,0.417213893475,0.417301022464,0.417388147618,0.417475268935,0.417562386414,0.417649500055,0.417736609858,0.41782371582,0.417910817942,0.417997916223,0.418085010662,0.418172101257,0.418259188009,0.418346270916,0.418433349978,0.418520425194,0.418607496563,0.418694564084,0.418781627757,0.41886868758,0.418955743553,0.419042795675,0.419129843945,0.419216888363,0.419303928928,0.419390965638,0.419477998493,0.419565027493,0.419652052636,0.419739073922,0.419826091349,0.419913104918,0.420000114627,0.420087120475,0.420174122462,0.420261120587,0.420348114849,0.420435105247,0.42052209178,0.420609074448,0.42069605325,0.420783028186,0.420869999253,0.420956966452,0.421043929781,0.42113088924,0.421217844829,0.421304796545,0.42139174439,0.42147868836,0.421565628457,0.421652564679,0.421739497024,0.421826425494,0.421913350086,0.4220002708,0.422087187635,0.42217410059,0.422261009665,0.422347914858,0.422434816169,0.422521713598,0.422608607142,0.422695496802,0.422782382577,0.422869264466,0.422956142467,0.423043016581,0.423129886807,0.423216753143,0.423303615589,0.423390474144,0.423477328807,0.423564179578,0.423651026456,0.423737869439,0.423824708528,0.42391154372,0.423998375017,0.424085202416,0.424172025917,0.424258845519,0.424345661221,0.424432473023,0.424519280923,0.424606084922,0.424692885017,0.424779681209,0.424866473496,0.424953261879,0.425040046355,0.425126826924,0.425213603585,0.425300376338,0.425387145182,0.425473910116,0.425560671138,0.42564742825,0.425734181448,0.425820930734,0.425907676105,0.425994417562,0.426081155102,0.426167888727,0.426254618434,0.426341344223,0.426428066093,0.426514784044,0.426601498074,0.426688208183,0.42677491437,0.426861616634,0.426948314975,0.427035009391,0.427121699882,0.427208386447,0.427295069085,0.427381747795,0.427468422577,0.42755509343,0.427641760353,0.427728423345,0.427815082406,0.427901737534,0.427988388729,0.42807503599,0.428161679316,0.428248318707,0.428334954161,0.428421585678,0.428508213257,0.428594836897,0.428681456598,0.428768072359,0.428854684178,0.428941292055,0.42902789599,0.429114495981,0.429201092028,0.42928768413,0.429374272285,0.429460856494,0.429547436756,0.429634013069,0.429720585433,0.429807153847,0.429893718311,0.429980278823,0.430066835383,0.430153387989,0.430239936642,0.43032648134,0.430413022083,0.430499558869,0.430586091698,0.43067262057,0.430759145483,0.430845666436,0.430932183429,0.431018696461,0.431105205531,0.431191710639,0.431278211783,0.431364708963,0.431451202178,0.431537691427,0.43162417671,0.431710658025,0.431797135372,0.43188360875,0.431970078158,0.432056543596,0.432143005062,0.432229462556,0.432315916077,0.432402365625,0.432488811198,0.432575252795,0.432661690416,0.432748124061,0.432834553727,0.432920979416,0.433007401124,0.433093818853,0.433180232601,0.433266642367,0.433353048151,0.433439449951,0.433525847767,0.433612241599,0.433698631444,0.433785017304,0.433871399176,0.43395777706,0.434044150955,0.43413052086,0.434216886775,0.434303248699,0.434389606631,0.43447596057,0.434562310515,0.434648656466,0.434734998422,0.434821336381,0.434907670344,0.43499400031,0.435080326277,0.435166648245,0.435252966213,0.43533928018,0.435425590145,0.435511896108,0.435598198069,0.435684496025,0.435770789976,0.435857079922,0.435943365862,0.436029647794,0.436115925719,0.436202199635,0.436288469542,0.436374735438,0.436460997323,0.436547255196,0.436633509057,0.436719758904,0.436806004737,0.436892246555,0.436978484357,0.437064718143,0.437150947911,0.437237173661,0.437323395392,0.437409613103,0.437495826794,0.437582036463,0.43766824211,0.437754443734,0.437840641334,0.43792683491,0.438013024461,0.438099209985,0.438185391483,0.438271568952,0.438357742394,0.438443911806,0.438530077188,0.438616238539,0.438702395858,0.438788549145,0.438874698398,0.438960843618,0.439046984803,0.439133121952,0.439219255065,0.43930538414,0.439391509178,0.439477630176,0.439563747135,0.439649860054,0.439735968932,0.439822073767,0.43990817456,0.43999427131,0.440080364015,0.440166452675,0.440252537288,0.440338617856,0.440424694375,0.440510766847,0.440596835269,0.440682899642,0.440768959964,0.440855016234,0.440941068452,0.441027116617,0.441113160729,0.441199200785,0.441285236787,0.441371268732,0.44145729662,0.44154332045,0.441629340222,0.441715355934,0.441801367586,0.441887375178,0.441973378707,0.442059378174,0.442145373578,0.442231364918,0.442317352192,0.442403335401,0.442489314544,0.442575289619,0.442661260626,0.442747227565,0.442833190433,0.442919149232,0.443005103959,0.443091054614,0.443177001196,0.443262943705,0.443348882139,0.443434816498,0.443520746781,0.443606672988,0.443692595117,0.443778513167,0.443864427139,0.44395033703,0.444036242841,0.44412214457,0.444208042218,0.444293935782,0.444379825262,0.444465710657,0.444551591967,0.444637469191,0.444723342328,0.444809211377,0.444895076338,0.444980937209,0.44506679399,0.44515264668,0.445238495278,0.445324339783,0.445410180196,0.445496016514,0.445581848737,0.445667676865,0.445753500896,0.44583932083,0.445925136666,0.446010948403,0.44609675604,0.446182559577,0.446268359013,0.446354154346,0.446439945577,0.446525732705,0.446611515728,0.446697294645,0.446783069457,0.446868840162,0.44695460676,0.447040369249,0.447126127629,0.4472118819,0.447297632059,0.447383378108,0.447469120043,0.447554857866,0.447640591575,0.44772632117,0.447812046649,0.447897768012,0.447983485257,0.448069198386,0.448154907395,0.448240612285,0.448326313055,0.448412009704,0.448497702232,0.448583390637,0.448669074918,0.448754755076,0.448840431109,0.448926103016,0.449011770796,0.44909743445,0.449183093975,0.449268749372,0.449354400639,0.449440047776,0.449525690781,0.449611329655,0.449696964395,0.449782595003,0.449868221476,0.449953843814,0.450039462016,0.450125076081,0.450210686009,0.450296291799,0.450381893449,0.45046749096,0.45055308433,0.450638673559,0.450724258646,0.45080983959,0.45089541639,0.450980989045,0.451066557555,0.451152121919,0.451237682136,0.451323238206,0.451408790127,0.451494337898,0.45157988152,0.451665420991,0.45175095631,0.451836487477,0.451922014491,0.45200753735,0.452093056055,0.452178570605,0.452264080998,0.452349587234,0.452435089312,0.452520587231,0.452606080991,0.452691570591,0.452777056029,0.452862537306,0.45294801442,0.453033487371,0.453118956157,0.453204420779,0.453289881235,0.453375337524,0.453460789646,0.4535462376,0.453631681385,0.453717121,0.453802556445,0.453887987718,0.45397341482,0.454058837749,0.454144256504,0.454229671084,0.45431508149,0.454400487719,0.454485889772,0.454571287647,0.454656681344,0.454742070862,0.4548274562,0.454912837357,0.454998214333,0.455083587126,0.455168955737,0.455254320163,0.455339680406,0.455425036462,0.455510388333,0.455595736016,0.455681079512,0.455766418819,0.455851753937,0.455937084865,0.456022411602,0.456107734148,0.456193052501,0.45627836666,0.456363676626,0.456448982397,0.456534283972,0.456619581351,0.456704874533,0.456790163517,0.456875448302,0.456960728888,0.457046005273,0.457131277457,0.45721654544,0.457301809219,0.457387068796,0.457472324168,0.457557575335,0.457642822297,0.457728065051,0.457813303599,0.457898537938,0.457983768069,0.45806899399,0.4581542157,0.458239433199,0.458324646486,0.45840985556,0.458495060421,0.458580261067,0.458665457498,0.458750649713,0.458835837712,0.458921021492,0.459006201055,0.459091376398,0.459176547522,0.459261714425,0.459346877106,0.459432035566,0.459517189802,0.459602339814,0.459687485602,0.459772627165,0.459857764501,0.459942897611,0.460028026493,0.460113151146,0.46019827157,0.460283387764,0.460368499727,0.460453607459,0.460538710958,0.460623810224,0.460708905256,0.460793996054,0.460879082616,0.460964164941,0.46104924303,0.46113431688,0.461219386492,0.461304451865,0.461389512997,0.461474569888,0.461559622538,0.461644670945,0.461729715108,0.461814755028,0.461899790702,0.461984822131,0.462069849314,0.462154872249,0.462239890936,0.462324905375,0.462409915563,0.462494921502,0.462579923189,0.462664920624,0.462749913807,0.462834902736,0.462919887411,0.463004867831,0.463089843995,0.463174815902,0.463259783552,0.463344746944,0.463429706076,0.463514660949,0.463599611562,0.463684557913,0.463769500002,0.463854437828,0.463939371391,0.464024300689,0.464109225722,0.464194146489,0.464279062989,0.464363975222,0.464448883186,0.464533786881,0.464618686306,0.464703581461,0.464788472344,0.464873358955,0.464958241293,0.465043119357,0.465127993146,0.46521286266,0.465297727898,0.46538258886,0.465467445543,0.465552297948,0.465637146073,0.465721989919,0.465806829484,0.465891664767,0.465976495768,0.466061322486,0.466146144919,0.466230963068,0.466315776932,0.466400586509,0.466485391799,0.466570192802,0.466654989516,0.46673978194,0.466824570074,0.466909353917,0.466994133469,0.467078908728,0.467163679694,0.467248446365,0.467333208742,0.467417966823,0.467502720608,0.467587470095,0.467672215285,0.467756956176,0.467841692767,0.467926425058,0.468011153048,0.468095876736,0.468180596122,0.468265311204,0.468350021982,0.468434728455,0.468519430622,0.468604128483,0.468688822036,0.468773511281,0.468858196217,0.468942876844,0.46902755316,0.469112225165,0.469196892859,0.469281556239,0.469366215306,0.469450870058,0.469535520496,0.469620166617,0.469704808422,0.46978944591,0.469874079079,0.469958707929,0.47004333246,0.47012795267,0.470212568558,0.470297180125,0.470381787369,0.470466390289,0.470550988884,0.470635583155,0.470720173099,0.470804758717,0.470889340007,0.470973916969,0.471058489601,0.471143057904,0.471227621877,0.471312181517,0.471396736826,0.471481287802,0.471565834443,0.471650376751,0.471734914723,0.471819448359,0.471903977658,0.471988502619,0.472073023242,0.472157539526,0.47224205147,0.472326559073,0.472411062335,0.472495561254,0.47258005583,0.472664546063,0.47274903195,0.472833513493,0.472917990689,0.473002463538,0.473086932039,0.473171396192,0.473255855996,0.47334031145,0.473424762552,0.473509209303,0.473593651702,0.473678089748,0.473762523439,0.473846952776,0.473931377757,0.474015798383,0.474100214651,0.474184626561,0.474269034112,0.474353437305,0.474437836137,0.474522230608,0.474606620717,0.474691006464,0.474775387848,0.474859764868,0.474944137522,0.475028505812,0.475112869735,0.47519722929,0.475281584478,0.475365935297,0.475450281747,0.475534623827,0.475618961535,0.475703294872,0.475787623836,0.475871948427,0.475956268643,0.476040584485,0.476124895951,0.476209203041,0.476293505753,0.476377804088,0.476462098044,0.47654638762,0.476630672816,0.47671495363,0.476799230063,0.476883502114,0.47696776978,0.477052033063,0.477136291961,0.477220546473,0.477304796598,0.477389042337,0.477473283687,0.477557520648,0.47764175322,0.477725981401,0.477810205191,0.477894424589,0.477978639595,0.478062850207,0.478147056425,0.478231258248,0.478315455675,0.478399648705,0.478483837338,0.478568021573,0.478652201409,0.478736376845,0.478820547881,0.478904714516,0.478988876749,0.479073034579,0.479157188005,0.479241337027,0.479325481644,0.479409621856,0.47949375766,0.479577889057,0.479662016046,0.479746138626,0.479830256797,0.479914370556,0.479998479905,0.480082584841,0.480166685365,0.480250781475,0.480334873171,0.480418960451,0.480503043316,0.480587121764,0.480671195795,0.480755265407,0.4808393306,0.480923391374,0.481007447727,0.481091499659,0.481175547168,0.481259590255,0.481343628918,0.481427663157,0.48151169297,0.481595718358,0.481679739319,0.481763755852,0.481847767957,0.481931775633,0.482015778879,0.482099777695,0.482183772079,0.482267762031,0.482351747551,0.482435728636,0.482519705287,0.482603677503,0.482687645283,0.482771608626,0.482855567532,0.482939521999,0.483023472027,0.483107417616,0.483191358763,0.48327529547,0.483359227734,0.483443155555,0.483527078933,0.483610997866,0.483694912354,0.483778822396,0.483862727991,0.483946629138,0.484030525837,0.484114418087,0.484198305888,0.484282189237,0.484366068135,0.484449942581,0.484533812574,0.484617678113,0.484701539198,0.484785395827,0.484869248001,0.484953095717,0.485036938976,0.485120777777,0.485204612119,0.485288442,0.485372267421,0.485456088381,0.485539904878,0.485623716912,0.485707524483,0.485791327589,0.48587512623,0.485958920404,0.486042710112,0.486126495353,0.486210276124,0.486294052427,0.48637782426,0.486461591622,0.486545354513,0.486629112932,0.486712866877,0.486796616349,0.486880361346,0.486964101868,0.487047837914,0.487131569483,0.487215296574,0.487299019187,0.487382737321,0.487466450975,0.487550160148,0.48763386484,0.48771756505,0.487801260776,0.487884952019,0.487968638778,0.488052321051,0.488135998838,0.488219672138,0.48830334095,0.488387005274,0.488470665109,0.488554320454,0.488637971309,0.488721617671,0.488805259542,0.48888889692,0.488972529804,0.489056158193,0.489139782087,0.489223401485,0.489307016386,0.48939062679,0.489474232695,0.489557834101,0.489641431007,0.489725023413,0.489808611317,0.489892194719,0.489975773617,0.490059348012,0.490142917903,0.490226483288,0.490310044167,0.49039360054,0.490477152405,0.490560699761,0.490644242608,0.490727780946,0.490811314773,0.490894844088,0.490978368891,0.491061889181,0.491145404957,0.491228916219,0.491312422966,0.491395925197,0.49147942291,0.491562916107,0.491646404784,0.491729888943,0.491813368582,0.4918968437,0.491980314297,0.492063780372,0.492147241923,0.492230698951,0.492314151455,0.492397599433,0.492481042886,0.492564481811,0.492647916209,0.492731346079,0.492814771419,0.49289819223,0.49298160851,0.493065020259,0.493148427475,0.493231830159,0.493315228309,0.493398621924,0.493482011004,0.493565395549,0.493648775556,0.493732151026,0.493815521958,0.493898888351,0.493982250204,0.494065607516,0.494148960287,0.494232308516,0.494315652202,0.494398991344,0.494482325942,0.494565655995,0.494648981502,0.494732302462,0.494815618875,0.494898930739,0.494982238054,0.49506554082,0.495148839035,0.495232132699,0.495315421811,0.49539870637,0.495481986375,0.495565261826,0.495648532722,0.495731799061,0.495815060845,0.495898318071,0.495981570738,0.496064818847,0.496148062396,0.496231301384,0.496314535811,0.496397765677,0.496480990979,0.496564211718,0.496647427893,0.496730639502,0.496813846546,0.496897049023,0.496980246932,0.497063440274,0.497146629046,0.497229813249,0.497312992882,0.497396167943,0.497479338433,0.497562504349,0.497645665692,0.497728822461,0.497811974655,0.497895122273,0.497978265315,0.498061403779,0.498144537665,0.498227666973,0.498310791701,0.498393911848,0.498477027414,0.498560138399,0.4986432448,0.498726346619,0.498809443853,0.498892536502,0.498975624565,0.499058708042,0.499141786932,0.499224861234,0.499307930946,0.49939099607,0.499474056603,0.499557112545,0.499640163895,0.499723210653,0.499806252817,0.499889290387,0.499972323363,0.500055351742,0.500138375526,0.500221394712,0.5003044093,0.50038741929,0.50047042468,0.500553425469,0.500636421658,0.500719413245,0.50080240023,0.500885382611,0.500968360389,0.501051333561,0.501134302128,0.501217266089,0.501300225442,0.501383180188,0.501466130325,0.501549075853,0.50163201677,0.501714953077,0.501797884772,0.501880811855,0.501963734324,0.50204665218,0.50212956542,0.502212474046,0.502295378055,0.502378277447,0.502461172221,0.502544062377,0.502626947914,0.50270982883,0.502792705126,0.5028755768,0.502958443852,0.503041306281,0.503124164086,0.503207017266,0.503289865821,0.50337270975,0.503455549051,0.503538383726,0.503621213772,0.503704039188,0.503786859975,0.503869676131,0.503952487655,0.504035294548,0.504118096807,0.504200894433,0.504283687424,0.50436647578,0.504449259499,0.504532038582,0.504614813028,0.504697582835,0.504780348003,0.504863108531,0.504945864419,0.505028615665,0.505111362269,0.505194104231,0.505276841548,0.505359574222,0.50544230225,0.505525025632,0.505607744367,0.505690458455,0.505773167895,0.505855872686,0.505938572827,0.506021268318,0.506103959158,0.506186645345,0.50626932688,0.506352003761,0.506434675988,0.50651734356,0.506600006476,0.506682664736,0.506765318338,0.506847967282,0.506930611567,0.507013251193,0.507095886158,0.507178516462,0.507261142105,0.507343763084,0.507426379401,0.507508991053,0.50759159804,0.507674200362,0.507756798017,0.507839391005,0.507921979325,0.508004562976,0.508087141958,0.50816971627,0.50825228591,0.508334850879,0.508417411175,0.508499966799,0.508582517748,0.508665064022,0.508747605621,0.508830142543,0.508912674789,0.508995202356,0.509077725245,0.509160243455,0.509242756984,0.509325265833,0.50940777,0.509490269485,0.509572764287,0.509655254404,0.509737739837,0.509820220585,0.509902696647,0.509985168021,0.510067634708,0.510150096707,0.510232554016,0.510315006635,0.510397454564,0.510479897801,0.510562336346,0.510644770198,0.510727199357,0.51080962382,0.510892043589,0.510974458661,0.511056869037,0.511139274715,0.511221675695,0.511304071976,0.511386463557,0.511468850438,0.511551232617,0.511633610094,0.511715982869,0.511798350939,0.511880714306,0.511963072967,0.512045426923,0.512127776172,0.512210120713,0.512292460546,0.512374795671,0.512457126086,0.51253945179,0.512621772783,0.512704089065,0.512786400634,0.512868707489,0.51295100963,0.513033307056,0.513115599767,0.513197887761,0.513280171038,0.513362449596,0.513444723437,0.513526992557,0.513609256958,0.513691516637,0.513773771595,0.51385602183,0.513938267342,0.51402050813,0.514102744193,0.514184975531,0.514267202142,0.514349424027,0.514431641183,0.514513853611,0.51459606131,0.514678264279,0.514760462517,0.514842656023,0.514924844797,0.515007028838,0.515089208145,0.515171382717,0.515253552554,0.515335717655,0.515417878019,0.515500033646,0.515582184534,0.515664330683,0.515746472092,0.515828608761,0.515910740688,0.515992867873,0.516074990315,0.516157108014,0.516239220968,0.516321329177,0.51640343264,0.516485531356,0.516567625325,0.516649714546,0.516731799018,0.51681387874,0.516895953711,0.516978023932,0.5170600894,0.517142150116,0.517224206079,0.517306257287,0.51738830374,0.517470345437,0.517552382378,0.517634414562,0.517716441988,0.517798464655,0.517880482562,0.51796249571,0.518044504096,0.518126507721,0.518208506583,0.518290500681,0.518372490016,0.518454474586,0.518536454391,0.518618429429,0.5187003997,0.518782365203,0.518864325938,0.518946281904,0.519028233099,0.519110179524,0.519192121177,0.519274058058,0.519355990166,0.5194379175,0.519519840059,0.519601757843,0.519683670851,0.519765579082,0.519847482536,0.519929381211,0.520011275108,0.520093164224,0.52017504856,0.520256928114,0.520338802887,0.520420672876,0.520502538082,0.520584398504,0.52066625414,0.520748104991,0.520829951055,0.520911792332,0.52099362882,0.52107546052,0.52115728743,0.52123910955,0.521320926879,0.521402739415,0.521484547159,0.52156635011,0.521648148267,0.521729941629,0.521811730195,0.521893513965,0.521975292937,0.522057067112,0.522138836488,0.522220601065,0.522302360841,0.522384115817,0.522465865991,0.522547611363,0.522629351931,0.522711087696,0.522792818656,0.52287454481,0.522956266159,0.5230379827,0.523119694434,0.523201401359,0.523283103476,0.523364800782,0.523446493278,0.523528180962,0.523609863834,0.523691541893,0.523773215139,0.52385488357,0.523936547186,0.524018205986,0.52409985997,0.524181509136,0.524263153484,0.524344793013,0.524426427722,0.524508057611,0.524589682678,0.524671302924,0.524752918347,0.524834528947,0.524916134723,0.524997735673,0.525079331798,0.525160923097,0.525242509568,0.525324091212,0.525405668026,0.525487240012,0.525568807167,0.525650369491,0.525731926984,0.525813479644,0.525895027471,0.525976570464,0.526058108623,0.526139641946,0.526221170433,0.526302694083,0.526384212895,0.526465726869,0.526547236004,0.526628740298,0.526710239753,0.526791734365,0.526873224136,0.526954709064,0.527036189148,0.527117664387,0.527199134782,0.52728060033,0.527362061032,0.527443516887,0.527524967893,0.527606414051,0.527687855359,0.527769291816,0.527850723423,0.527932150177,0.528013572079,0.528094989127,0.528176401321,0.528257808661,0.528339211145,0.528420608772,0.528502001542,0.528583389455,0.528664772508,0.528746150703,0.528827524037,0.52890889251,0.528990256122,0.529071614872,0.529152968758,0.52923431778,0.529315661938,0.52939700123,0.529478335657,0.529559665216,0.529640989908,0.529722309732,0.529803624686,0.529884934771,0.529966239985,0.530047540328,0.530128835798,0.530210126396,0.53029141212,0.53037269297,0.530453968945,0.530535240044,0.530616506266,0.530697767612,0.530779024079,0.530860275667,0.530941522376,0.531022764204,0.531104001151,0.531185233217,0.5312664604,0.5313476827,0.531428900115,0.531510112646,0.531591320292,0.531672523051,0.531753720923,0.531834913907,0.531916102003,0.531997285209,0.532078463526,0.532159636952,0.532240805486,0.532321969128,0.532403127877,0.532484281733,0.532565430693,0.532646574759,0.532727713929,0.532808848202,0.532889977577,0.532971102054,0.533052221633,0.533133336311,0.533214446089,0.533295550966,0.533376650941,0.533457746014,0.533538836183,0.533619921447,0.533701001807,0.533782077261,0.533863147809,0.53394421345,0.534025274182,0.534106330006,0.534187380921,0.534268426926,0.534349468019,0.534430504201,0.534511535471,0.534592561827,0.53467358327,0.534754599798,0.534835611411,0.534916618107,0.534997619887,0.535078616749,0.535159608693,0.535240595718,0.535321577823,0.535402555007,0.53548352727,0.535564494611,0.53564545703,0.535726414524,0.535807367095,0.53588831474,0.53596925746,0.536050195253,0.536131128119,0.536212056057,0.536292979066,0.536373897146,0.536454810295,0.536535718513,0.5366166218,0.536697520154,0.536778413575,0.536859302062,0.536940185615,0.537021064232,0.537101937913,0.537182806656,0.537263670463,0.53734452933,0.537425383259,0.537506232248,0.537587076296,0.537667915402,0.537748749567,0.537829578789,0.537910403067,0.5379912224,0.538072036789,0.538152846232,0.538233650728,0.538314450277,0.538395244877,0.538476034529,0.538556819232,0.538637598984,0.538718373785,0.538799143634,0.538879908531,0.538960668474,0.539041423464,0.539122173499,0.539202918578,0.539283658701,0.539364393867,0.539445124075,0.539525849325,0.539606569616,0.539687284946,0.539767995316,0.539848700725,0.539929401171,0.540010096655,0.540090787174,0.54017147273,0.54025215332,0.540332828945,0.540413499602,0.540494165293,0.540574826015,0.540655481768,0.540736132552,0.540816778366,0.540897419208,0.540978055079,0.541058685977,0.541139311902,0.541219932853,0.541300548828,0.541381159829,0.541461765853,0.5415423669,0.54162296297,0.541703554061,0.541784140172,0.541864721304,0.541945297455,0.542025868625,0.542106434812,0.542186996017,0.542267552238,0.542348103474,0.542428649726,0.542509190991,0.54258972727,0.542670258561,0.542750784865,0.542831306179,0.542911822504,0.542992333838,0.543072840182,0.543153341534,0.543233837893,0.543314329258,0.54339481563,0.543475297007,0.543555773389,0.543636244774,0.543716711162,0.543797172553,0.543877628945,0.543958080338,0.544038526731,0.544118968123,0.544199404514,0.544279835903,0.544360262288,0.544440683671,0.544521100048,0.544601511421,0.544681917788,0.544762319148,0.544842715501,0.544923106845,0.545003493181,0.545083874508,0.545164250824,0.545244622129,0.545324988422,0.545405349703,0.54548570597,0.545566057224,0.545646403463,0.545726744686,0.545807080893,0.545887412083,0.545967738256,0.54604805941,0.546128375545,0.54620868666,0.546288992754,0.546369293827,0.546449589878,0.546529880906,0.546610166911,0.546690447891,0.546770723846,0.546850994775,0.546931260678,0.547011521554,0.547091777401,0.54717202822,0.547252274009,0.547332514768,0.547412750496,0.547492981193,0.547573206857,0.547653427487,0.547733643084,0.547813853646,0.547894059173,0.547974259664,0.548054455118,0.548134645534,0.548214830912,0.54829501125,0.548375186549,0.548455356808,0.548535522025,0.5486156822,0.548695837333,0.548775987421,0.548856132466,0.548936272466,0.54901640742,0.549096537327,0.549176662188,0.549256782,0.549336896764,0.549417006478,0.549497111143,0.549577210756,0.549657305318,0.549737394827,0.549817479284,0.549897558687,0.549977633035,0.550057702327,0.550137766564,0.550217825744,0.550297879867,0.550377928931,0.550457972937,0.550538011882,0.550618045768,0.550698074592,0.550778098354,0.550858117053,0.55093813069,0.551018139262,0.551098142769,0.551178141211,0.551258134586,0.551338122894,0.551418106135,0.551498084307,0.55157805741,0.551658025443,0.551737988405,0.551817946295,0.551897899114,0.551977846859,0.552057789531,0.552137727129,0.552217659651,0.552297587097,0.552377509467,0.55245742676,0.552537338974,0.55261724611,0.552697148166,0.552777045142,0.552856937036,0.552936823849,0.55301670558,0.553096582227,0.553176453791,0.55325632027,0.553336181663,0.55341603797,0.55349588919,0.553575735323,0.553655576367,0.553735412323,0.553815243188,0.553895068963,0.553974889647,0.554054705238,0.554134515737,0.554214321142,0.554294121454,0.55437391667,0.55445370679,0.554533491814,0.554613271741,0.55469304657,0.554772816301,0.554852580932,0.554932340463,0.555012094893,0.555091844222,0.555171588448,0.555251327571,0.555331061591,0.555410790506,0.555490514316,0.55557023302,0.555649946617,0.555729655107,0.555809358488,0.555889056761,0.555968749924,0.556048437977,0.556128120919,0.556207798749,0.556287471466,0.55636713907,0.55644680156,0.556526458936,0.556606111196,0.556685758339,0.556765400366,0.556845037275,0.556924669066,0.557004295737,0.557083917289,0.55716353372,0.55724314503,0.557322751218,0.557402352283,0.557481948224,0.557561539041,0.557641124733,0.5577207053,0.55780028074,0.557879851053,0.557959416237,0.558038976294,0.558118531221,0.558198081017,0.558277625683,0.558357165218,0.55843669962,0.558516228889,0.558595753024,0.558675272025,0.55875478589,0.55883429462,0.558913798213,0.558993296668,0.559072789986,0.559152278164,0.559231761203,0.559311239102,0.559390711859,0.559470179475,0.559549641948,0.559629099278,0.559708551464,0.559787998505,0.559867440401,0.55994687715,0.560026308753,0.560105735208,0.560185156514,0.560264572672,0.56034398368,0.560423389537,0.560502790242,0.560582185796,0.560661576197,0.560740961445,0.560820341538,0.560899716477,0.560979086259,0.561058450886,0.561137810355,0.561217164666,0.561296513819,0.561375857813,0.561455196646,0.561534530319,0.56161385883,0.561693182179,0.561772500365,0.561851813387,0.561931121245,0.562010423937,0.562089721464,0.562169013824,0.562248301017,0.562327583042,0.562406859898,0.562486131584,0.562565398101,0.562644659446,0.562723915619,0.56280316662,0.562882412448,0.562961653102,0.563040888582,0.563120118886,0.563199344014,0.563278563965,0.563357778739,0.563436988334,0.56351619275,0.563595391987,0.563674586043,0.563753774918,0.563832958611,0.563912137122,0.563991310449,0.564070478592,0.56414964155,0.564228799323,0.564307951909,0.564387099309,0.564466241521,0.564545378544,0.564624510378,0.564703637022,0.564782758476,0.564861874738,0.564940985808,0.565020091685,0.565099192369,0.565178287858,0.565257378153,0.565336463251,0.565415543154,0.565494617859,0.565573687366,0.565652751674,0.565731810784,0.565810864693,0.565889913401,0.565968956908,0.566047995212,0.566127028314,0.566206056212,0.566285078905,0.566364096393,0.566443108675,0.566522115751,0.566601117619,0.56668011428,0.566759105731,0.566838091973,0.566917073004,0.566996048825,0.567075019434,0.567153984831,0.567232945014,0.567311899983,0.567390849738,0.567469794278,0.567548733601,0.567627667708,0.567706596597,0.567785520268,0.56786443872,0.567943351952,0.568022259964,0.568101162755,0.568180060324,0.56825895267,0.568337839793,0.568416721692,0.568495598366,0.568574469815,0.568653336037,0.568732197033,0.568811052801,0.56888990334,0.568968748651,0.569047588731,0.569126423581,0.5692052532,0.569284077586,0.56936289674,0.569441710661,0.569520519347,0.569599322798,0.569678121014,0.569756913993,0.569835701736,0.56991448424,0.569993261506,0.570072033533,0.570150800319,0.570229561865,0.57030831817,0.570387069232,0.570465815052,0.570544555628,0.57062329096,0.570702021046,0.570780745887,0.570859465481,0.570938179828,0.571016888928,0.571095592778,0.571174291379,0.57125298473,0.57133167283,0.571410355679,0.571489033275,0.571567705618,0.571646372708,0.571725034543,0.571803691123,0.571882342447,0.571960988515,0.572039629325,0.572118264877,0.57219689517,0.572275520204,0.572354139977,0.57243275449,0.572511363741,0.572589967729,0.572668566454,0.572747159916,0.572825748113,0.572904331045,0.57298290871,0.573061481109,0.57314004824,0.573218610104,0.573297166698,0.573375718023,0.573454264077,0.57353280486,0.573611340372,0.573689870611,0.573768395577,0.573846915269,0.573925429686,0.574003938827,0.574082442693,0.574160941282,0.574239434593,0.574317922626,0.57439640538,0.574474882854,0.574553355048,0.57463182196,0.574710283591,0.574788739939,0.574867191004,0.574945636784,0.57502407728,0.575102512491,0.575180942415,0.575259367052,0.575337786402,0.575416200463,0.575494609235,0.575573012717,0.575651410909,0.575729803809,0.575808191418,0.575886573734,0.575964950756,0.576043322484,0.576121688917,0.576200050055,0.576278405897,0.576356756441,0.576435101688,0.576513441636,0.576591776285,0.576670105634,0.576748429682,0.57682674843,0.576905061875,0.576983370017,0.577061672856,0.57713997039,0.57721826262,0.577296549544,0.577374831161,0.577453107472,0.577531378474,0.577609644168,0.577687904553,0.577766159628,0.577844409392,0.577922653845,0.578000892985,0.578079126813,0.578157355327,0.578235578527,0.578313796412,0.578392008981,0.578470216233,0.578548418169,0.578626614786,0.578704806085,0.578782992065,0.578861172724,0.578939348063,0.57901751808,0.579095682775,0.579173842148,0.579251996196,0.57933014492,0.579408288319,0.579486426393,0.579564559139,0.579642686559,0.579720808651,0.579798925413,0.579877036847,0.57995514295,0.580033243723,0.580111339164,0.580189429273,0.580267514049,0.580345593491,0.580423667598,0.580501736371,0.580579799808,0.580657857908,0.580735910671,0.580813958096,0.580892000182,0.580970036929,0.581048068335,0.581126094401,0.581204115125,0.581282130507,0.581360140546,0.581438145241,0.581516144591,0.581594138597,0.581672127256,0.581750110569,0.581828088535,0.581906061153,0.581984028421,0.582061990341,0.58213994691,0.582217898128,0.582295843995,0.582373784509,0.58245171967,0.582529649478,0.582607573931,0.582685493029,0.582763406771,0.582841315156,0.582919218184,0.582997115853,0.583075008164,0.583152895116,0.583230776707,0.583308652938,0.583386523806,0.583464389313,0.583542249456,0.583620104236,0.583697953651,0.5837757977,0.583853636384,0.583931469701,0.584009297651,0.584087120233,0.584164937446,0.584242749289,0.584320555762,0.584398356864,0.584476152595,0.584553942953,0.584631727938,0.584709507549,0.584787281786,0.584865050648,0.584942814133,0.585020572242,0.585098324973,0.585176072327,0.585253814301,0.585331550896,0.585409282111,0.585487007945,0.585564728397,0.585642443467,0.585720153154,0.585797857456,0.585875556375,0.585953249908,0.586030938055,0.586108620815,0.586186298189,0.586263970174,0.58634163677,0.586419297976,0.586496953793,0.586574604218,0.586652249252,0.586729888893,0.586807523142,0.586885151996,0.586962775456,0.587040393521,0.58711800619,0.587195613462,0.587273215337,0.587350811813,0.587428402891,0.587505988569,0.587583568848,0.587661143725,0.5877387132,0.587816277273,0.587893835943,0.58797138921,0.588048937072,0.588126479528,0.588204016579,0.588281548223,0.588359074459,0.588436595288,0.588514110708,0.588591620718,0.588669125318,0.588746624507,0.588824118285,0.58890160665,0.588979089602,0.58905656714,0.589134039264,0.589211505973,0.589288967265,0.589366423141,0.5894438736,0.589521318641,0.589598758263,0.589676192466,0.589753621248,0.589831044609,0.589908462549,0.589985875067,0.590063282161,0.590140683832,0.590218080079,0.5902954709,0.590372856295,0.590450236264,0.590527610805,0.590604979919,0.590682343604,0.590759701859,0.590837054684,0.590914402078,0.590991744041,0.591069080572,0.591146411669,0.591223737333,0.591301057562,0.591378372357,0.591455681715,0.591532985637,0.591610284122,0.591687577169,0.591764864777,0.591842146946,0.591919423674,0.591996694962,0.592073960808,0.592151221212,0.592228476174,0.592305725691,0.592382969764,0.592460208393,0.592537441575,0.592614669311,0.5926918916,0.59276910844,0.592846319833,0.592923525776,0.593000726268,0.593077921311,0.593155110901,0.59323229504,0.593309473725,0.593386646958,0.593463814735,0.593540977058,0.593618133925,0.593695285336,0.59377243129,0.593849571785,0.593926706823,0.594003836401,0.594080960519,0.594158079176,0.594235192372,0.594312300106,0.594389402377,0.594466499185,0.594543590528,0.594620676407,0.594697756819,0.594774831766,0.594851901245,0.594928965257,0.5950060238,0.595083076875,0.595160124479,0.595237166612,0.595314203275,0.595391234465,0.595468260183,0.595545280427,0.595622295197,0.595699304492,0.595776308312,0.595853306656,0.595930299522,0.596007286911,0.596084268822,0.596161245253,0.596238216205,0.596315181676,0.596392141666,0.596469096174,0.596546045199,0.596622988741,0.596699926799,0.596776859373,0.59685378646,0.596930708062,0.597007624177,0.597084534804,0.597161439943,0.597238339593,0.597315233754,0.597392122424,0.597469005603,0.59754588329,0.597622755484,0.597699622186,0.597776483393,0.597853339106,0.597930189323,0.598007034045,0.598083873269,0.598160706996,0.598237535225,0.598314357955,0.598391175186,0.598467986916,0.598544793146,0.598621593873,0.598698389098,0.59877517882,0.598851963039,0.598928741752,0.599005514961,0.599082282664,0.59915904486,0.599235801548,0.599312552729,0.599389298401,0.599466038563,0.599542773215,0.599619502356,0.599696225986,0.599772944104,0.599849656708,0.599926363799,0.600003065375,0.600079761437,0.600156451982,0.600233137011,0.600309816523,0.600386490517,0.600463158992,0.600539821948,0.600616479384,0.600693131299,0.600769777693,0.600846418564,0.600923053913,0.600999683738,0.601076308039,0.601152926815,0.601229540065,0.601306147789,0.601382749986,0.601459346655,0.601535937795,0.601612523407,0.601689103488,0.601765678039,0.601842247059,0.601918810546,0.601995368501,0.602071920922,0.60214846781,0.602225009162,0.602301544979,0.60237807526,0.602454600004,0.60253111921,0.602607632878,0.602684141007,0.602760643596,0.602837140644,0.602913632152,0.602990118117,0.60306659854,0.60314307342,0.603219542756,0.603296006547,0.603372464793,0.603448917493,0.603525364646,0.603601806251,0.603678242308,0.603754672817,0.603831097776,0.603907517184,0.603983931042,0.604060339348,0.604136742101,0.604213139302,0.604289530948,0.60436591704,0.604442297577,0.604518672558,0.604595041983,0.60467140585,0.604747764159,0.604824116909,0.6049004641,0.604976805731,0.605053141801,0.605129472309,0.605205797255,0.605282116639,0.605358430459,0.605434738714,0.605511041404,0.605587338529,0.605663630087,0.605739916078,0.605816196502,0.605892471356,0.605968740642,0.606045004357,0.606121262502,0.606197515076,0.606273762077,0.606350003506,0.606426239361,0.606502469643,0.606578694349,0.60665491348,0.606731127035,0.606807335012,0.606883537412,0.606959734234,0.607035925476,0.607112111139,0.607188291222,0.607264465723,0.607340634643,0.607416797979,0.607492955733,0.607569107903,0.607645254488,0.607721395488,0.607797530901,0.607873660728,0.607949784968,0.608025903619,0.608102016682,0.608178124155,0.608254226037,0.608330322329,0.608406413029,0.608482498137,0.608558577652,0.608634651573,0.608710719899,0.608786782631,0.608862839766,0.608938891305,0.609014937247,0.609090977591,0.609167012336,0.609243041482,0.609319065028,0.609395082973,0.609471095317,0.609547102059,0.609623103198,0.609699098733,0.609775088664,0.60985107299,0.60992705171,0.610003024825,0.610078992332,0.610154954231,0.610230910522,0.610306861204,0.610382806276,0.610458745738,0.610534679588,0.610610607827,0.610686530453,0.610762447465,0.610838358864,0.610914264648,0.610990164816,0.611066059369,0.611141948304,0.611217831622,0.611293709322,0.611369581403,0.611445447865,0.611521308706,0.611597163926,0.611673013525,0.611748857501,0.611824695854,0.611900528584,0.611976355689,0.612052177169,0.612127993022,0.61220380325,0.61227960785,0.612355406822,0.612431200166,0.61250698788,0.612582769964,0.612658546417,0.61273431724,0.612810082429,0.612885841986,0.61296159591,0.613037344199,0.613113086854,0.613188823873,0.613264555255,0.613340281001,0.613416001109,0.613491715578,0.613567424408,0.613643127599,0.613718825149,0.613794517058,0.613870203325,0.61394588395,0.614021558931,0.614097228268,0.614172891961,0.614248550008,0.61432420241,0.614399849164,0.614475490271,0.61455112573,0.61462675554,0.614702379701,0.614777998211,0.614853611071,0.614929218279,0.615004819834,0.615080415737,0.615156005986,0.615231590581,0.61530716952,0.615382742804,0.615458310431,0.615533872401,0.615609428713,0.615684979367,0.615760524361,0.615836063696,0.61591159737,0.615987125382,0.616062647733,0.616138164421,0.616213675445,0.616289180805,0.616364680501,0.616440174531,0.616515662895,0.616591145592,0.616666622621,0.616742093982,0.616817559674,0.616893019697,0.616968474049,0.61704392273,0.617119365739,0.617194803076,0.61727023474,0.61734566073,0.617421081045,0.617496495686,0.61757190465,0.617647307938,0.617722705548,0.617798097481,0.617873483735,0.617948864309,0.618024239204,0.618099608417,0.61817497195,0.6182503298,0.618325681967,0.618401028451,0.61847636925,0.618551704365,0.618627033794,0.618702357537,0.618777675593,0.618852987961,0.618928294641,0.619003595631,0.619078890932,0.619154180543,0.619229464462,0.61930474269,0.619380015225,0.619455282067,0.619530543215,0.619605798668,0.619681048426,0.619756292488,0.619831530854,0.619906763522,0.619981990492,0.620057211763,0.620132427335,0.620207637207,0.620282841378,0.620358039847,0.620433232614,0.620508419679,0.620583601039,0.620658776696,0.620733946647,0.620809110893,0.620884269433,0.620959422265,0.62103456939,0.621109710806,0.621184846514,0.621259976511,0.621335100798,0.621410219374,0.621485332238,0.621560439389,0.621635540827,0.621710636551,0.621785726561,0.621860810855,0.621935889433,0.622010962295,0.622086029439,0.622161090865,0.622236146572,0.62231119656,0.622386240827,0.622461279374,0.622536312199,0.622611339302,0.622686360683,0.622761376339,0.622836386271,0.622911390479,0.62298638896,0.623061381715,0.623136368744,0.623211350044,0.623286325616,0.623361295459,0.623436259572,0.623511217955,0.623586170606,0.623661117526,0.623736058713,0.623810994166,0.623885923886,0.623960847871,0.624035766121,0.624110678635,0.624185585412,0.624260486452,0.624335381754,0.624410271317,0.62448515514,0.624560033224,0.624634905566,0.624709772168,0.624784633026,0.624859488142,0.624934337515,0.625009181143,0.625084019026,0.625158851164,0.625233677555,0.625308498199,0.625383313096,0.625458122244,0.625532925643,0.625607723292,0.625682515191,0.625757301339,0.625832081735,0.625906856378,0.625981625268,0.626056388404,0.626131145786,0.626205897412,0.626280643283,0.626355383397,0.626430117753,0.626504846352,0.626579569192,0.626654286272,0.626728997592,0.626803703152,0.62687840295,0.626953096986,0.627027785259,0.627102467769,0.627177144515,0.627251815495,0.62732648071,0.627401140159,0.627475793841,0.627550441755,0.627625083901,0.627699720278,0.627774350885,0.627848975722,0.627923594788,0.627998208082,0.628072815604,0.628147417352,0.628222013327,0.628296603527,0.628371187953,0.628445766602,0.628520339475,0.62859490657,0.628669467888,0.628744023427,0.628818573186,0.628893117166,0.628967655365,0.629042187783,0.629116714419,0.629191235272,0.629265750341,0.629340259627,0.629414763128,0.629489260843,0.629563752772,0.629638238915,0.62971271927,0.629787193837,0.629861662614,0.629936125603,0.630010582801,0.630085034208,0.630159479824,0.630233919647,0.630308353677,0.630382781914,0.630457204356,0.630531621003,0.630606031855,0.63068043691,0.630754836168,0.630829229628,0.63090361729,0.630977999153,0.631052375216,0.631126745478,0.63120110994,0.631275468599,0.631349821456,0.631424168509,0.631498509759,0.631572845204,0.631647174844,0.631721498678,0.631795816705,0.631870128925,0.631944435337,0.63201873594,0.632093030734,0.632167319717,0.63224160289,0.632315880252,0.632390151801,0.632464417538,0.632538677461,0.63261293157,0.632687179864,0.632761422343,0.632835659005,0.632909889851,0.632984114878,0.633058334088,0.633132547479,0.63320675505,0.633280956801,0.633355152731,0.633429342839,0.633503527125,0.633577705588,0.633651878227,0.633726045041,0.633800206031,0.633874361195,0.633948510532,0.634022654043,0.634096791725,0.634170923579,0.634245049604,0.634319169799,0.634393284164,0.634467392697,0.634541495398,0.634615592267,0.634689683303,0.634763768504,0.634837847872,0.634911921403,0.634985989099,0.635060050958,0.63513410698,0.635208157164,0.635282201509,0.635356240015,0.63543027268,0.635504299505,0.635578320489,0.63565233563,0.635726344929,0.635800348384,0.635874345995,0.635948337761,0.636022323682,0.636096303756,0.636170277984,0.636244246364,0.636318208896,0.636392165579,0.636466116412,0.636540061395,0.636614000527,0.636687933808,0.636761861236,0.636835782812,0.636909698533,0.636983608401,0.637057512413,0.637131410569,0.63720530287,0.637279189313,0.637353069898,0.637426944625,0.637500813493,0.637574676501,0.637648533649,0.637722384936,0.63779623036,0.637870069923,0.637943903622,0.638017731457,0.638091553428,0.638165369533,0.638239179773,0.638312984146,0.638386782652,0.63846057529,0.638534362059,0.63860814296,0.63868191799,0.638755687149,0.638829450437,0.638903207854,0.638976959397,0.639050705068,0.639124444864,0.639198178785,0.639271906831,0.639345629002,0.639419345295,0.639493055711,0.639566760249,0.639640458908,0.639714151688,0.639787838587,0.639861519606,0.639935194743,0.640008863998,0.640082527371,0.64015618486,0.640229836464,0.640303482184,0.640377122018,0.640450755966,0.640524384028,0.640598006201,0.640671622487,0.640745232883,0.64081883739,0.640892436007,0.640966028732,0.641039615566,0.641113196508,0.641186771557,0.641260340712,0.641333903973,0.641407461338,0.641481012809,0.641554558382,0.641628098059,0.641701631838,0.641775159719,0.6418486817,0.641922197782,0.641995707963,0.642069212244,0.642142710622,0.642216203098,0.642289689671,0.642363170341,0.642436645105,0.642510113965,0.642583576919,0.642657033966,0.642730485106,0.642803930339,0.642877369662,0.642950803077,0.643024230582,0.643097652176,0.643171067859,0.64324447763,0.643317881489,0.643391279434,0.643464671465,0.643538057582,0.643611437784,0.643684812069,0.643758180438,0.64383154289,0.643904899424,0.643978250039,0.644051594734,0.64412493351,0.644198266365,0.644271593299,0.644344914311,0.6444182294,0.644491538566,0.644564841807,0.644638139125,0.644711430516,0.644784715982,0.644857995521,0.644931269132,0.645004536816,0.64507779857,0.645151054395,0.645224304291,0.645297548255,0.645370786288,0.645444018389,0.645517244557,0.645590464792,0.645663679092,0.645736887458,0.645810089888,0.645883286382,0.645956476939,0.646029661559,0.646102840241,0.646176012983,0.646249179787,0.64632234065,0.646395495572,0.646468644552,0.646541787591,0.646614924687,0.646688055839,0.646761181046,0.646834300309,0.646907413627,0.646980520998,0.647053622422,0.647126717899,0.647199807427,0.647272891007,0.647345968637,0.647419040316,0.647492106045,0.647565165822,0.647638219647,0.647711267519,0.647784309437,0.647857345401,0.64793037541,0.648003399463,0.64807641756,0.6481494297,0.648222435882,0.648295436107,0.648368430372,0.648441418677,0.648514401022,0.648587377406,0.648660347829,0.648733312289,0.648806270786,0.648879223319,0.648952169888,0.649025110492,0.64909804513,0.649170973802,0.649243896507,0.649316813244,0.649389724013,0.649462628813,0.649535527643,0.649608420502,0.649681307391,0.649754188307,0.649827063252,0.649899932223,0.649972795221,0.650045652244,0.650118503292,0.650191348364,0.65026418746,0.650337020579,0.65040984772,0.650482668883,0.650555484067,0.65062829327,0.650701096494,0.650773893736,0.650846684996,0.650919470274,0.650992249569,0.65106502288,0.651137790207,0.651210551549,0.651283306905,0.651356056274,0.651428799656,0.65150153705,0.651574268456,0.651646993873,0.6517197133,0.651792426737,0.651865134182,0.651937835636,0.652010531097,0.652083220565,0.652155904039,0.652228581519,0.652301253003,0.652373918492,0.652446577984,0.65251923148,0.652591878977,0.652664520476,0.652737155975,0.652809785475,0.652882408975,0.652955026473,0.653027637969,0.653100243463,0.653172842954,0.653245436441,0.653318023923,0.6533906054,0.653463180872,0.653535750337,0.653608313795,0.653680871244,0.653753422686,0.653825968118,0.653898507541,0.653971040953,0.654043568353,0.654116089742,0.654188605119,0.654261114482,0.654333617832,0.654406115167,0.654478606487,0.654551091791,0.654623571078,0.654696044349,0.654768511601,0.654840972835,0.65491342805,0.654985877245,0.65505832042,0.655130757573,0.655203188705,0.655275613814,0.6553480329,0.655420445962,0.655492853,0.655565254012,0.655637648999,0.655710037959,0.655782420892,0.655854797797,0.655927168674,0.655999533522,0.65607189234,0.656144245127,0.656216591883,0.656288932608,0.6563612673,0.656433595958,0.656505918583,0.656578235174,0.656650545729,0.656722850249,0.656795148732,0.656867441178,0.656939727587,0.657012007956,0.657084282287,0.657156550578,0.657228812829,0.657301069038,0.657373319206,0.657445563331,0.657517801413,0.657590033451,0.657662259445,0.657734479394,0.657806693297,0.657878901154,0.657951102963,0.658023298725,0.658095488439,0.658167672103,0.658239849717,0.658312021282,0.658384186795,0.658456346256,0.658528499665,0.658600647021,0.658672788323,0.658744923571,0.658817052764,0.658889175901,0.658961292982,0.659033404006,0.659105508972,0.659177607879,0.659249700728,0.659321787517,0.659393868246,0.659465942913,0.659538011519,0.659610074063,0.659682130544,0.659754180961,0.659826225313,0.659898263601,0.659970295823,0.660042321979,0.660114342067,0.660186356089,0.660258364041,0.660330365925,0.66040236174,0.660474351484,0.660546335157,0.660618312758,0.660690284287,0.660762249744,0.660834209126,0.660906162435,0.660978109668,0.661050050826,0.661121985908,0.661193914913,0.66126583784,0.661337754689,0.661409665459,0.66148157015,0.66155346876,0.66162536129,0.661697247738,0.661769128104,0.661841002387,0.661912870587,0.661984732702,0.662056588733,0.662128438678,0.662200282537,0.662272120309,0.662343951994,0.66241577759,0.662487597098,0.662559410516,0.662631217845,0.662703019082,0.662774814228,0.662846603282,0.662918386243,0.662990163111,0.663061933885,0.663133698564,0.663205457148,0.663277209635,0.663348956026,0.66342069632,0.663492430515,0.663564158612,0.66363588061,0.663707596507,0.663779306304,0.663851009999,0.663922707593,0.663994399084,0.664066084472,0.664137763755,0.664209436934,0.664281104008,0.664352764976,0.664424419837,0.664496068591,0.664567711237,0.664639347775,0.664710978203,0.664782602522,0.66485422073,0.664925832826,0.664997438811,0.665069038684,0.665140632443,0.665212220088,0.665283801619,0.665355377035,0.665426946335,0.665498509518,0.665570066585,0.665641617533,0.665713162363,0.665784701074,0.665856233666,0.665927760136,0.665999280486,0.666070794714,0.66614230282,0.666213804803,0.666285300662,0.666356790396,0.666428274006,0.66649975149,0.666571222847,0.666642688078,0.666714147181,0.666785600156,0.666857047002,0.666928487718,0.666999922304,0.667071350759,0.667142773082,0.667214189273,0.667285599331,0.667357003256,0.667428401047,0.667499792702,0.667571178223,0.667642557607,0.667713930854,0.667785297963,0.667856658935,0.667928013768,0.667999362461,0.668070705014,0.668142041427,0.668213371698,0.668284695826,0.668356013813,0.668427325655,0.668498631354,0.668569930908,0.668641224317,0.66871251158,0.668783792696,0.668855067665,0.668926336485,0.668997599157,0.66906885568,0.669140106053,0.669211350276,0.669282588347,0.669353820266,0.669425046032,0.669496265646,0.669567479105,0.66963868641,0.66970988756,0.669781082554,0.669852271392,0.669923454072,0.669994630595,0.670065800959,0.670136965164,0.670208123209,0.670279275094,0.670350420818,0.67042156038,0.67049269378,0.670563821017,0.67063494209,0.670706056998,0.670777165742,0.67084826832,0.670919364732,0.670990454977,0.671061539054,0.671132616963,0.671203688703,0.671274754274,0.671345813674,0.671416866903,0.671487913961,0.671558954847,0.67162998956,0.671701018099,0.671772040465,0.671843056655,0.67191406667,0.671985070509,0.672056068172,0.672127059656,0.672198044963,0.672269024091,0.67233999704,0.672410963809,0.672481924397,0.672552878804,0.672623827029,0.672694769071,0.67276570493,0.672836634605,0.672907558095,0.6729784754,0.67304938652,0.673120291453,0.673191190198,0.673262082756,0.673332969125,0.673403849306,0.673474723296,0.673545591096,0.673616452705,0.673687308122,0.673758157347,0.673829000379,0.673899837217,0.673970667861,0.674041492309,0.674112310562,0.674183122619,0.674253928479,0.674324728141,0.674395521605,0.67446630887,0.674537089936,0.674607864801,0.674678633466,0.674749395929,0.674820152189,0.674890902247,0.674961646102,0.675032383752,0.675103115198,0.675173840439,0.675244559473,0.6753152723,0.675385978921,0.675456679333,0.675527373536,0.675598061531,0.675668743315,0.675739418889,0.675810088251,0.675880751402,0.67595140834,0.676022059064,0.676092703575,0.676163341872,0.676233973953,0.676304599819,0.676375219468,0.6764458329,0.676516440114,0.67658704111,0.676657635886,0.676728224443,0.67679880678,0.676869382896,0.67693995279,0.677010516462,0.677081073911,0.677151625136,0.677222170137,0.677292708913,0.677363241464,0.677433767789,0.677504287886,0.677574801756,0.677645309398,0.677715810812,0.677786305996,0.677856794949,0.677927277673,0.677997754164,0.678068224424,0.678138688451,0.678209146245,0.678279597805,0.67835004313,0.67842048222,0.678490915074,0.678561341691,0.678631762072,0.678702176214,0.678772584118,0.678842985783,0.678913381208,0.678983770393,0.679054153337,0.679124530038,0.679194900498,0.679265264714,0.679335622687,0.679405974416,0.679476319899,0.679546659137,0.679616992129,0.679687318874,0.679757639371,0.67982795362,0.679898261621,0.679968563371,0.680038858872,0.680109148122,0.68017943112,0.680249707867,0.680319978361,0.680390242601,0.680460500587,0.680530752319,0.680600997795,0.680671237016,0.68074146998,0.680811696686,0.680881917135,0.680952131326,0.681022339257,0.681092540928,0.681162736339,0.681232925489,0.681303108377,0.681373285002,0.681443455365,0.681513619464,0.681583777298,0.681653928868,0.681724074172,0.681794213209,0.68186434598,0.681934472483,0.682004592718,0.682074706685,0.682144814381,0.682214915808,0.682285010964,0.682355099848,0.682425182461,0.6824952588,0.682565328866,0.682635392659,0.682705450176,0.682775501419,0.682845546385,0.682915585075,0.682985617488,0.683055643623,0.683125663479,0.683195677056,0.683265684353,0.68333568537,0.683405680106,0.68347566856,0.683545650732,0.683615626621,0.683685596226,0.683755559547,0.683825516583,0.683895467333,0.683965411797,0.684035349975,0.684105281864,0.684175207466,0.684245126779,0.684315039802,0.684384946535,0.684454846978,0.684524741129,0.684594628988,0.684664510555,0.684734385828,0.684804254808,0.684874117492,0.684943973882,0.685013823976,0.685083667773,0.685153505273,0.685223336475,0.685293161379,0.685362979984,0.685432792289,0.685502598293,0.685572397997,0.685642191399,0.685711978499,0.685781759296,0.685851533789,0.685921301978,0.685991063863,0.686060819441,0.686130568714,0.68620031168,0.686270048339,0.686339778689,0.686409502731,0.686479220463,0.686548931886,0.686618636998,0.686688335798,0.686758028287,0.686827714463,0.686897394326,0.686967067875,0.68703673511,0.68710639603,0.687176050634,0.687245698921,0.687315340892,0.687384976545,0.687454605879,0.687524228895,0.687593845591,0.687663455967,0.687733060022,0.687802657755,0.687872249167,0.687941834255,0.68801141302,0.688080985462,0.688150551578,0.688220111369,0.688289664834,0.688359211973,0.688428752784,0.688498287267,0.688567815422,0.688637337248,0.688706852744,0.688776361909,0.688845864744,0.688915361246,0.688984851417,0.689054335254,0.689123812757,0.689193283927,0.689262748761,0.68933220726,0.689401659423,0.689471105249,0.689540544737,0.689609977887,0.689679404699,0.689748825171,0.689818239303,0.689887647095,0.689957048545,0.690026443653,0.690095832419,0.690165214841,0.69023459092,0.690303960654,0.690373324043,0.690442681086,0.690512031783,0.690581376132,0.690650714135,0.690720045788,0.690789371093,0.690858690048,0.690928002653,0.690997308908,0.69106660881,0.691135902361,0.691205189558,0.691274470403,0.691343744893,0.691413013029,0.691482274809,0.691551530233,0.691620779301,0.691690022012,0.691759258364,0.691828488358,0.691897711993,0.691966929269,0.692036140183,0.692105344737,0.692174542929,0.692243734759,0.692312920226,0.692382099329,0.692451272068,0.692520438442,0.692589598451,0.692658752093,0.692727899369,0.692797040277,0.692866174817,0.692935302989,0.693004424791,0.693073540224,0.693142649285,0.693211751976,0.693280848295,0.693349938241,0.693419021814,0.693488099013,0.693557169838,0.693626234288,0.693695292362,0.69376434406,0.693833389381,0.693902428324,0.69397146089,0.694040487076,0.694109506883,0.69417852031,0.694247527356,0.69431652802,0.694385522303,0.694454510203,0.69452349172,0.694592466853,0.694661435601,0.694730397964,0.694799353942,0.694868303532,0.694937246736,0.695006183552,0.69507511398,0.695144038019,0.695212955668,0.695281866927,0.695350771795,0.695419670271,0.695488562356,0.695557448047,0.695626327345,0.695695200249,0.695764066759,0.695832926873,0.695901780591,0.695970627913,0.696039468837,0.696108303363,0.696177131491,0.69624595322,0.69631476855,0.696383577478,0.696452380006,0.696521176132,0.696589965856,0.696658749177,0.696727526095,0.696796296608,0.696865060716,0.696933818419,0.697002569716,0.697071314607,0.69714005309,0.697208785165,0.697277510831,0.697346230088,0.697414942935,0.697483649372,0.697552349398,0.697621043012,0.697689730213,0.697758411002,0.697827085377,0.697895753337,0.697964414883,0.698033070013,0.698101718727,0.698170361024,0.698238996904,0.698307626366,0.698376249409,0.698444866033,0.698513476236,0.69858208002,0.698650677381,0.698719268322,0.698787852839,0.698856430934,0.698925002604,0.698993567851,0.699062126672,0.699130679068,0.699199225037,0.69926776458,0.699336297695,0.699404824382,0.69947334464,0.699541858469,0.699610365868,0.699678866836,0.699747361373,0.699815849477,0.69988433115,0.699952806389,0.700021275194,0.700089737565,0.700158193501,0.700226643001,0.700295086064,0.700363522691,0.70043195288,0.700500376631,0.700568793943,0.700637204816,0.700705609248,0.70077400724,0.700842398791,0.700910783899,0.700979162565,0.701047534787,0.701115900566,0.7011842599,0.701252612789,0.701320959232,0.701389299229,0.701457632779,0.701525959881,0.701594280535,0.70166259474,0.701730902496,0.701799203801,0.701867498656,0.701935787059,0.70200406901,0.702072344508,0.702140613553,0.702208876144,0.702277132281,0.702345381962,0.702413625188,0.702481861957,0.702550092269,0.702618316124,0.70268653352,0.702754744457,0.702822948935,0.702891146952,0.702959338509,0.703027523604,0.703095702237,0.703163874407,0.703232040114,0.703300199358,0.703368352136,0.703436498449,0.703504638297,0.703572771678,0.703640898592,0.703709019038,0.703777133016,0.703845240524,0.703913341564,0.703981436133,0.704049524231,0.704117605858,0.704185681012,0.704253749694,0.704321811903,0.704389867637,0.704457916897,0.704525959682,0.704593995991,0.704662025823,0.704730049179,0.704798066056,0.704866076456,0.704934080376,0.705002077817,0.705070068777,0.705138053257,0.705206031255,0.705274002771,0.705341967804,0.705409926354,0.70547787842,0.705545824001,0.705613763097,0.705681695708,0.705749621831,0.705817541468,0.705885454617,0.705953361278,0.706021261449,0.706089155131,0.706157042323,0.706224923024,0.706292797234,0.706360664951,0.706428526176,0.706496380907,0.706564229145,0.706632070888,0.706699906135,0.706767734887,0.706835557142,0.706903372901,0.706971182161,0.707038984923,0.707106781187,0.70717457095,0.707242354214,0.707310130976,0.707377901238,0.707445664997,0.707513422253,0.707581173006,0.707648917256,0.707716655,0.70778438624,0.707852110974,0.707919829201,0.707987540921,0.708055246134,0.708122944838,0.708190637033,0.708258322719,0.708326001895,0.70839367456,0.708461340713,0.708529000354,0.708596653483,0.708664300099,0.7087319402,0.708799573788,0.70886720086,0.708934821416,0.709002435456,0.709070042978,0.709137643984,0.709205238471,0.709272826439,0.709340407888,0.709407982816,0.709475551224,0.70954311311,0.709610668475,0.709678217317,0.709745759636,0.70981329543,0.709880824701,0.709948347446,0.710015863666,0.710083373359,0.710150876526,0.710218373164,0.710285863275,0.710353346857,0.71042082391,0.710488294432,0.710555758424,0.710623215884,0.710690666813,0.710758111209,0.710825549072,0.710892980401,0.710960405196,0.711027823456,0.71109523518,0.711162640368,0.711230039019,0.711297431133,0.711364816708,0.711432195745,0.711499568243,0.7115669342,0.711634293617,0.711701646493,0.711768992827,0.711836332619,0.711903665867,0.711970992572,0.712038312733,0.712105626348,0.712172933418,0.712240233942,0.71230752792,0.71237481535,0.712442096231,0.712509370565,0.712576638349,0.712643899583,0.712711154267,0.712778402399,0.71284564398,0.712912879009,0.712980107484,0.713047329406,0.713114544774,0.713181753587,0.713248955845,0.713316151547,0.713383340692,0.71345052328,0.713517699309,0.713584868781,0.713652031693,0.713719188046,0.713786337838,0.713853481069,0.713920617738,0.713987747846,0.71405487139,0.714121988372,0.714189098789,0.714256202641,0.714323299928,0.714390390649,0.714457474804,0.714524552392,0.714591623411,0.714658687863,0.714725745745,0.714792797058,0.714859841801,0.714926879972,0.714993911573,0.715060936601,0.715127955056,0.715194966939,0.715261972247,0.715328970981,0.715395963139,0.715462948722,0.715529927729,0.715596900158,0.71566386601,0.715730825284,0.715797777979,0.715864724094,0.715931663629,0.715998596584,0.716065522957,0.716132442748,0.716199355957,0.716266262583,0.716333162625,0.716400056082,0.716466942955,0.716533823242,0.716600696943,0.716667564056,0.716734424583,0.716801278521,0.716868125871,0.716934966631,0.717001800802,0.717068628381,0.71713544937,0.717202263767,0.717269071572,0.717335872784,0.717402667402,0.717469455425,0.717536236854,0.717603011688,0.717669779926,0.717736541566,0.71780329661,0.717870045056,0.717936786903,0.718003522151,0.718070250799,0.718136972847,0.718203688294,0.71827039714,0.718337099383,0.718403795023,0.718470484061,0.718537166494,0.718603842322,0.718670511545,0.718737174162,0.718803830173,0.718870479577,0.718937122373,0.71900375856,0.719070388139,0.719137011108,0.719203627467,0.719270237216,0.719336840353,0.719403436878,0.71947002679,0.719536610089,0.719603186774,0.719669756845,0.719736320301,0.719802877141,0.719869427365,0.719935970972,0.720002507961,0.720069038333,0.720135562085,0.720202079219,0.720268589732,0.720335093625,0.720401590897,0.720468081546,0.720534565574,0.720601042978,0.720667513759,0.720733977916,0.720800435448,0.720866886354,0.720933330634,0.720999768288,0.721066199315,0.721132623713,0.721199041483,0.721265452624,0.721331857135,0.721398255016,0.721464646266,0.721531030884,0.72159740887,0.721663780224,0.721730144944,0.72179650303,0.721862854481,0.721929199298,0.721995537478,0.722061869022,0.722128193929,0.722194512199,0.72226082383,0.722327128822,0.722393427175,0.722459718887,0.722526003959,0.72259228239,0.722658554179,0.722724819325,0.722791077828,0.722857329687,0.722923574902,0.722989813472,0.723056045397,0.723122270675,0.723188489307,0.723254701291,0.723320906627,0.723387105314,0.723453297353,0.723519482741,0.723585661479,0.723651833566,0.723717999001,0.723784157784,0.723850309915,0.723916455391,0.723982594214,0.724048726382,0.724114851895,0.724180970751,0.724247082951,0.724313188495,0.72437928738,0.724445379607,0.724511465175,0.724577544084,0.724643616332,0.724709681919,0.724775740846,0.72484179311,0.724907838712,0.72497387765,0.725039909925,0.725105935535,0.72517195448,0.72523796676,0.725303972373,0.72536997132,0.725435963599,0.72550194921,0.725567928152,0.725633900425,0.725699866028,0.725765824961,0.725831777223,0.725897722813,0.72596366173,0.726029593975,0.726095519546,0.726161438444,0.726227350666,0.726293256213,0.726359155084,0.726425047279,0.726490932796,0.726556811636,0.726622683798,0.72668854928,0.726754408083,0.726820260206,0.726886105648,0.726951944408,0.727017776487,0.727083601883,0.727149420595,0.727215232624,0.727281037969,0.727346836628,0.727412628602,0.72747841389,0.727544192491,0.727609964404,0.72767572963,0.727741488167,0.727807240014,0.727872985172,0.727938723639,0.728004455415,0.7280701805,0.728135898892,0.728201610591,0.728267315597,0.728333013909,0.728398705526,0.728464390448,0.728530068674,0.728595740204,0.728661405036,0.728727063171,0.728792714607,0.728858359345,0.728923997383,0.728989628721,0.729055253358,0.729120871293,0.729186482527,0.729252087059,0.729317684887,0.729383276012,0.729448860432,0.729514438147,0.729580009157,0.72964557346,0.729711131057,0.729776681947,0.729842226128,0.729907763601,0.729973294365,0.730038818419,0.730104335763,0.730169846395,0.730235350317,0.730300847526,0.730366338022,0.730431821805,0.730497298874,0.730562769228,0.730628232867,0.73069368979,0.730759139997,0.730824583487,0.73089002026,0.730955450314,0.731020873649,0.731086290265,0.731151700162,0.731217103337,0.731282499791,0.731347889524,0.731413272534,0.731478648821,0.731544018385,0.731609381224,0.731674737338,0.731740086728,0.731805429391,0.731870765327,0.731936094537,0.732001417018,0.732066732771,0.732132041795,0.73219734409,0.732262639654,0.732327928488,0.73239321059,0.73245848596,0.732523754598,0.732589016502,0.732654271672,0.732719520109,0.73278476181,0.732849996775,0.732915225005,0.732980446497,0.733045661252,0.733110869269,0.733176070548,0.733241265087,0.733306452887,0.733371633946,0.733436808264,0.733501975841,0.733567136675,0.733632290766,0.733697438115,0.733762578719,0.733827712578,0.733892839693,0.733957960061,0.734023073684,0.734088180559,0.734153280687,0.734218374066,0.734283460697,0.734348540578,0.73441361371,0.73447868009,0.73454373972,0.734608792598,0.734673838723,0.734738878096,0.734803910715,0.73486893658,0.73493395569,0.734998968044,0.735063973643,0.735128972485,0.73519396457,0.735258949898,0.735323928467,0.735388900277,0.735453865327,0.735518823618,0.735583775147,0.735648719916,0.735713657922,0.735778589166,0.735843513646,0.735908431363,0.735973342316,0.736038246504,0.736103143926,0.736168034582,0.736232918472,0.736297795594,0.736362665948,0.736427529534,0.736492386351,0.736557236398,0.736622079675,0.736686916181,0.736751745915,0.736816568877,0.736881385067,0.736946194484,0.737010997126,0.737075792994,0.737140582087,0.737205364405,0.737270139946,0.73733490871,0.737399670697,0.737464425906,0.737529174337,0.737593915988,0.737658650859,0.73772337895,0.73778810026,0.737852814788,0.737917522535,0.737982223498,0.738046917678,0.738111605074,0.738176285686,0.738240959512,0.738305626552,0.738370286807,0.738434940274,0.738499586954,0.738564226845,0.738628859948,0.738693486262,0.738758105785,0.738822718519,0.738887324461,0.738951923611,0.739016515969,0.739081101534,0.739145680306,0.739210252284,0.739274817467,0.739339375854,0.739403927446,0.739468472242,0.73953301024,0.739597541441,0.739662065843,0.739726583447,0.739791094251,0.739855598256,0.73992009546,0.739984585862,0.740049069463,0.740113546261,0.740178016257,0.740242479449,0.740306935836,0.740371385419,0.740435828197,0.740500264169,0.740564693334,0.740629115692,0.740693531242,0.740757939984,0.740822341918,0.740886737041,0.740951125355,0.741015506858,0.74107988155,0.74114424943,0.741208610497,0.741272964751,0.741337312192,0.741401652819,0.741465986631,0.741530313627,0.741594633807,0.741658947171,0.741723253718,0.741787553447,0.741851846357,0.741916132449,0.741980411721,0.742044684173,0.742108949804,0.742173208614,0.742237460602,0.742301705767,0.74236594411,0.742430175629,0.742494400323,0.742558618193,0.742622829237,0.742687033455,0.742751230847,0.742815421411,0.742879605148,0.742943782056,0.743007952135,0.743072115385,0.743136271804,0.743200421393,0.74326456415,0.743328700076,0.743392829169,0.743456951429,0.743521066855,0.743585175447,0.743649277203,0.743713372125,0.74377746021,0.743841541459,0.743905615871,0.743969683445,0.74403374418,0.744097798076,0.744161845133,0.74422588535,0.744289918725,0.74435394526,0.744417964952,0.744481977802,0.744545983809,0.744609982972,0.744673975291,0.744737960765,0.744801939394,0.744865911176,0.744929876112,0.744993834201,0.745057785441,0.745121729834,0.745185667377,0.745249598071,0.745313521914,0.745377438907,0.745441349049,0.745505252338,0.745569148775,0.745633038359,0.745696921089,0.745760796965,0.745824665986,0.745888528152,0.745952383461,0.746016231914,0.74608007351,0.746143908248,0.746207736127,0.746271557148,0.746335371309,0.74639917861,0.74646297905,0.746526772628,0.746590559345,0.746654339199,0.746718112191,0.746781878318,0.746845637581,0.74690938998,0.746973135513,0.74703687418,0.74710060598,0.747164330913,0.747228048979,0.747291760176,0.747355464504,0.747419161963,0.747482852551,0.747546536269,0.747610213115,0.74767388309,0.747737546192,0.747801202421,0.747864851777,0.747928494258,0.747992129864,0.748055758595,0.74811938045,0.748182995429,0.74824660353,0.748310204754,0.748373799099,0.748437386566,0.748500967153,0.74856454086,0.748628107686,0.748691667631,0.748755220695,0.748818766875,0.748882306173,0.748945838588,0.749009364118,0.749072882763,0.749136394523,0.749199899398,0.749263397385,0.749326888486,0.749390372699,0.749453850024,0.74951732046,0.749580784006,0.749644240663,0.749707690429,0.749771133304,0.749834569287,0.749897998378,0.749961420576,0.75002483588,0.750088244291,0.750151645806,0.750215040427,0.750278428151,0.75034180898,0.750405182911,0.750468549945,0.75053191008,0.750595263317,0.750658609655,0.750721949092,0.750785281629,0.750848607265,0.750911926,0.750975237832,0.751038542762,0.751101840788,0.75116513191,0.751228416127,0.75129169344,0.751354963846,0.751418227347,0.75148148394,0.751544733626,0.751607976404,0.751671212274,0.751734441234,0.751797663284,0.751860878424,0.751924086654,0.751987287971,0.752050482377,0.75211366987,0.752176850449,0.752240024115,0.752303190866,0.752366350702,0.752429503623,0.752492649627,0.752555788715,0.752618920886,0.752682046138,0.752745164472,0.752808275887,0.752871380382,0.752934477957,0.752997568612,0.753060652344,0.753123729155,0.753186799044,0.753249862009,0.75331291805,0.753375967167,0.75343900936,0.753502044627,0.753565072968,0.753628094382,0.753691108869,0.753754116428,0.753817117059,0.753880110761,0.753943097533,0.754006077376,0.754069050288,0.754132016268,0.754194975317,0.754257927433,0.754320872617,0.754383810866,0.754446742182,0.754509666563,0.754572584008,0.754635494518,0.754698398092,0.754761294728,0.754824184426,0.754887067187,0.754949943009,0.755012811891,0.755075673834,0.755138528836,0.755201376897,0.755264218016,0.755327052193,0.755389879427,0.755452699718,0.755515513065,0.755578319467,0.755641118924,0.755703911436,0.755766697001,0.75582947562,0.755892247291,0.755955012014,0.756017769788,0.756080520614,0.756143264489,0.756206001414,0.756268731389,0.756331454412,0.756394170483,0.756456879601,0.756519581766,0.756582276977,0.756644965234,0.756707646536,0.756770320883,0.756832988273,0.756895648707,0.756958302184,0.757020948703,0.757083588263,0.757146220865,0.757208846506,0.757271465188,0.75733407691,0.757396681669,0.757459279468,0.757521870303,0.757584454176,0.757647031085,0.75770960103,0.757772164011,0.757834720026,0.757897269075,0.757959811158,0.758022346273,0.758084874422,0.758147395602,0.758209909813,0.758272417055,0.758334917327,0.758397410629,0.75845989696,0.758522376319,0.758584848705,0.75864731412,0.75870977256,0.758772224027,0.75883466852,0.758897106037,0.758959536579,0.759021960145,0.759084376733,0.759146786345,0.759209188978,0.759271584633,0.759333973309,0.759396355006,0.759458729722,0.759521097457,0.759583458211,0.759645811984,0.759708158773,0.75977049858,0.759832831403,0.759895157241,0.759957476095,0.760019787964,0.760082092846,0.760144390742,0.760206681651,0.760268965573,0.760331242506,0.76039351245,0.760455775405,0.76051803137,0.760580280344,0.760642522328,0.760704757319,0.760766985319,0.760829206325,0.760891420339,0.760953627358,0.761015827383,0.761078020412,0.761140206446,0.761202385484,0.761264557525,0.761326722569,0.761388880615,0.761451031662,0.76151317571,0.761575312758,0.761637442806,0.761699565854,0.761761681899,0.761823790943,0.761885892985,0.761947988023,0.762010076058,0.762072157089,0.762134231114,0.762196298135,0.762258358149,0.762320411157,0.762382457158,0.762444496151,0.762506528136,0.762568553112,0.762630571078,0.762692582035,0.762754585981,0.762816582917,0.76287857284,0.762940555752,0.76300253165,0.763064500535,0.763126462407,0.763188417263,0.763250365105,0.763312305931,0.763374239741,0.763436166534,0.76349808631,0.763559999068,0.763621904807,0.763683803528,0.763745695228,0.763807579909,0.763869457569,0.763931328207,0.763993191824,0.764055048418,0.764116897989,0.764178740536,0.764240576059,0.764302404558,0.764364226031,0.764426040479,0.7644878479,0.764549648293,0.76461144166,0.764673227998,0.764735007308,0.764796779588,0.764858544838,0.764920303058,0.764982054247,0.765043798405,0.76510553553,0.765167265622,0.765228988682,0.765290704707,0.765352413699,0.765414115655,0.765475810575,0.76553749846,0.765599179308,0.765660853119,0.765722519892,0.765784179626,0.765845832322,0.765907477978,0.765969116594,0.76603074817,0.766092372704,0.766153990196,0.766215600647,0.766277204054,0.766338800418,0.766400389738,0.766461972013,0.766523547243,0.766585115427,0.766646676565,0.766708230657,0.7667697777,0.766831317696,0.766892850643,0.766954376542,0.76701589539,0.767077407188,0.767138911936,0.767200409632,0.767261900276,0.767323383868,0.767384860406,0.767446329891,0.767507792322,0.767569247698,0.767630696018,0.767692137283,0.767753571491,0.767814998642,0.767876418736,0.767937831772,0.767999237748,0.768060636666,0.768122028523,0.768183413321,0.768244791057,0.768306161731,0.768367525344,0.768428881894,0.768490231381,0.768551573804,0.768612909162,0.768674237456,0.768735558684,0.768796872846,0.768858179941,0.76891947997,0.76898077293,0.769042058822,0.769103337646,0.769164609399,0.769225874083,0.769287131697,0.769348382239,0.76940962571,0.769470862108,0.769532091433,0.769593313685,0.769654528864,0.769715736967,0.769776937996,0.769838131949,0.769899318826,0.769960498626,0.770021671348,0.770082836993,0.77014399556,0.770205147047,0.770266291455,0.770327428783,0.77038855903,0.770449682196,0.77051079828,0.770571907281,0.7706330092,0.770694104035,0.770755191786,0.770816272453,0.770877346034,0.77093841253,0.770999471939,0.771060524262,0.771121569497,0.771182607644,0.771243638702,0.771304662672,0.771365679552,0.771426689341,0.77148769204,0.771548687647,0.771609676163,0.771670657586,0.771731631916,0.771792599152,0.771853559294,0.771914512342,0.771975458294,0.77203639715,0.77209732891,0.772158253573,0.772219171139,0.772280081606,0.772340984975,0.772401881245,0.772462770415,0.772523652484,0.772584527453,0.77264539532,0.772706256086,0.772767109748,0.772827956308,0.772888795764,0.772949628116,0.773010453363,0.773071271504,0.77313208254,0.773192886469,0.773253683291,0.773314473006,0.773375255613,0.77343603111,0.773496799499,0.773557560778,0.773618314946,0.773679062003,0.773739801949,0.773800534783,0.773861260504,0.773921979112,0.773982690607,0.774043394987,0.774104092252,0.774164782402,0.774225465436,0.774286141353,0.774346810154,0.774407471836,0.774468126401,0.774528773846,0.774589414173,0.774650047379,0.774710673466,0.774771292431,0.774831904274,0.774892508996,0.774953106595,0.775013697071,0.775074280423,0.77513485665,0.775195425753,0.77525598773,0.775316542582,0.775377090306,0.775437630904,0.775498164374,0.775558690716,0.775619209929,0.775679722013,0.775740226967,0.77580072479,0.775861215483,0.775921699043,0.775982175472,0.776042644768,0.776103106931,0.77616356196,0.776224009855,0.776284450615,0.776344884239,0.776405310728,0.77646573008,0.776526142295,0.776586547372,0.776646945311,0.776707336111,0.776767719772,0.776828096293,0.776888465673,0.776948827913,0.777009183011,0.777069530967,0.77712987178,0.77719020545,0.777250531976,0.777310851358,0.777371163595,0.777431468687,0.777491766632,0.777552057431,0.777612341083,0.777672617588,0.777732886944,0.777793149151,0.777853404209,0.777913652118,0.777973892876,0.778034126482,0.778094352938,0.778154572241,0.778214784392,0.778274989389,0.778335187233,0.778395377922,0.778455561457,0.778515737836,0.778575907059,0.778636069126,0.778696224036,0.778756371788,0.778816512381,0.778876645817,0.778936772093,0.778996891209,0.779057003164,0.779117107959,0.779177205593,0.779237296064,0.779297379373,0.779357455518,0.7794175245,0.779477586318,0.779537640971,0.779597688458,0.77965772878,0.779717761935,0.779777787923,0.779837806744,0.779897818396,0.77995782288,0.780017820195,0.78007781034,0.780137793314,0.780197769118,0.78025773775,0.780317699211,0.780377653499,0.780437600613,0.780497540555,0.780557473322,0.780617398914,0.780677317331,0.780737228572,0.780797132637,0.780857029525,0.780916919235,0.780976801768,0.781036677122,0.781096545296,0.781156406291,0.781216260106,0.78127610674,0.781335946193,0.781395778464,0.781455603552,0.781515421458,0.78157523218,0.781635035718,0.781694832071,0.781754621239,0.781814403222,0.781874178018,0.781933945627,0.781993706049,0.782053459283,0.782113205328,0.782172944185,0.782232675852,0.782292400329,0.782352117615,0.78241182771,0.782471530613,0.782531226324,0.782590914842,0.782650596167,0.782710270297,0.782769937233,0.782829596975,0.78288924952,0.782948894869,0.783008533022,0.783068163977,0.783127787735,0.783187404294,0.783247013655,0.783306615816,0.783366210777,0.783425798537,0.783485379096,0.783544952454,0.78360451861,0.783664077562,0.783723629312,0.783783173858,0.783842711199,0.783902241336,0.783961764266,0.784021279991,0.78408078851,0.784140289821,0.784199783925,0.78425927082,0.784318750507,0.784378222984,0.784437688252,0.784497146309,0.784556597156,0.78461604079,0.784675477213,0.784734906423,0.78479432842,0.784853743204,0.784913150773,0.784972551128,0.785031944267,0.78509133019,0.785150708897,0.785210080387,0.78526944466,0.785328801714,0.78538815155,0.785447494167,0.785506829564,0.785566157741,0.785625478697,0.785684792432,0.785744098945,0.785803398236,0.785862690303,0.785921975148,0.785981252768,0.786040523163,0.786099786334,0.786159042279,0.786218290997,0.786277532489,0.786336766754,0.786395993791,0.786455213599,0.786514426179,0.786573631529,0.786632829648,0.786692020538,0.786751204196,0.786810380623,0.786869549817,0.786928711779,0.786987866507,0.787047014002,0.787106154262,0.787165287288,0.787224413078,0.787283531631,0.787342642949,0.787401747029,0.787460843872,0.787519933476,0.787579015842,0.787638090968,0.787697158855,0.787756219501,0.787815272907,0.787874319071,0.787933357993,0.787992389673,0.788051414109,0.788110431302,0.788169441251,0.788228443955,0.788287439414,0.788346427627,0.788405408593,0.788464382313,0.788523348786,0.78858230801,0.788641259986,0.788700204714,0.788759142191,0.788818072418,0.788876995395,0.788935911121,0.788994819595,0.789053720816,0.789112614785,0.7891715015,0.789230380962,0.789289253169,0.789348118121,0.789406975818,0.789465826258,0.789524669442,0.789583505369,0.789642334038,0.789701155449,0.789759969601,0.789818776494,0.789877576127,0.789936368499,0.789995153611,0.790053931461,0.790112702049,0.790171465375,0.790230221437,0.790288970236,0.790347711771,0.790406446041,0.790465173046,0.790523892785,0.790582605257,0.790641310463,0.790700008402,0.790758699072,0.790817382474,0.790876058607,0.790934727471,0.790993389064,0.791052043386,0.791110690438,0.791169330218,0.791227962725,0.79128658796,0.791345205921,0.791403816609,0.791462420022,0.79152101616,0.791579605023,0.791638186609,0.791696760919,0.791755327952,0.791813887707,0.791872440184,0.791930985383,0.791989523302,0.792048053941,0.7921065773,0.792165093378,0.792223602175,0.79228210369,0.792340597922,0.792399084871,0.792457564537,0.792516036918,0.792574502015,0.792632959827,0.792691410353,0.792749853593,0.792808289546,0.792866718212,0.79292513959,0.792983553679,0.793041960479,0.79310035999,0.793158752211,0.793217137142,0.793275514781,0.793333885129,0.793392248185,0.793450603948,0.793508952417,0.793567293593,0.793625627475,0.793683954062,0.793742273353,0.793800585349,0.793858890048,0.79391718745,0.793975477554,0.794033760361,0.794092035869,0.794150304078,0.794208564987,0.794266818596,0.794325064904,0.794383303911,0.794441535616,0.794499760019,0.794557977119,0.794616186915,0.794674389408,0.794732584596,0.794790772479,0.794848953057,0.794907126328,0.794965292293,0.795023450951,0.795081602301,0.795139746343,0.795197883076,0.7952560125,0.795314134613,0.795372249417,0.79543035691,0.795488457091,0.79554654996,0.795604635517,0.795662713761,0.795720784691,0.795778848307,0.795836904609,0.795894953595,0.795952995266,0.79601102962,0.796069056658,0.796127076378,0.796185088781,0.796243093865,0.79630109163,0.796359082076,0.796417065202,0.796475041008,0.796533009492,0.796590970655,0.796648924495,0.796706871013,0.796764810208,0.79682274208,0.796880666627,0.796938583849,0.796996493746,0.797054396317,0.797112291562,0.79717017948,0.79722806007,0.797285933333,0.797343799267,0.797401657872,0.797459509147,0.797517353093,0.797575189708,0.797633018991,0.797690840943,0.797748655563,0.79780646285,0.797864262804,0.797922055424,0.79797984071,0.798037618661,0.798095389276,0.798153152556,0.798210908499,0.798268657105,0.798326398373,0.798384132304,0.798441858896,0.798499578149,0.798557290062,0.798614994635,0.798672691867,0.798730381758,0.798788064308,0.798845739515,0.798903407379,0.7989610679,0.799018721077,0.799076366909,0.799134005397,0.799191636539,0.799249260335,0.799306876785,0.799364485888,0.799422087643,0.79947968205,0.799537269108,0.799594848817,0.799652421176,0.799709986186,0.799767543844,0.799825094151,0.799882637106,0.799940172709,0.799997700959,0.800055221856,0.800112735399,0.800170241587,0.80022774042,0.800285231898,0.80034271602,0.800400192785,0.800457662193,0.800515124243,0.800572578935,0.800630026269,0.800687466243,0.800744898857,0.800802324112,0.800859742005,0.800917152537,0.800974555708,0.801031951515,0.80108933996,0.801146721042,0.80120409476,0.801261461113,0.801318820101,0.801376171723,0.80143351598,0.801490852869,0.801548182392,0.801605504547,0.801662819334,0.801720126752,0.801777426801,0.80183471948,0.801892004789,0.801949282727,0.802006553293,0.802063816488,0.802121072311,0.80217832076,0.802235561836,0.802292795538,0.802350021866,0.802407240818,0.802464452395,0.802521656596,0.80257885342,0.802636042867,0.802693224937,0.802750399628,0.802807566941,0.802864726874,0.802921879428,0.802979024601,0.803036162393,0.803093292804,0.803150415834,0.803207531481,0.803264639745,0.803321740625,0.803378834122,0.803435920234,0.803492998961,0.803550070303,0.803607134258,0.803664190827,0.803721240009,0.803778281803,0.803835316209,0.803892343226,0.803949362854,0.804006375093,0.804063379941,0.804120377398,0.804177367464,0.804234350139,0.80429132542,0.804348293309,0.804405253805,0.804462206907,0.804519152614,0.804576090926,0.804633021843,0.804689945364,0.804746861488,0.804803770215,0.804860671545,0.804917565476,0.804974452009,0.805031331143,0.805088202877,0.805145067211,0.805201924144,0.805258773676,0.805315615806,0.805372450534,0.805429277859,0.80548609778,0.805542910298,0.805599715412,0.80565651312,0.805713303423,0.805770086321,0.805826861811,0.805883629895,0.805940390571,0.805997143839,0.806053889699,0.80611062815,0.806167359191,0.806224082821,0.806280799042,0.806337507851,0.806394209248,0.806450903233,0.806507589806,0.806564268965,0.80662094071,0.806677605041,0.806734261958,0.806790911459,0.806847553544,0.806904188213,0.806960815464,0.807017435299,0.807074047716,0.807130652714,0.807187250293,0.807243840452,0.807300423192,0.807356998511,0.807413566409,0.807470126886,0.80752667994,0.807583225572,0.80763976378,0.807696294565,0.807752817926,0.807809333862,0.807865842373,0.807922343458,0.807978837117,0.80803532335,0.808091802154,0.808148273531,0.80820473748,0.808261194,0.808317643091,0.808374084751,0.808430518982,0.808486945781,0.808543365149,0.808599777085,0.808656181588,0.808712578659,0.808768968296,0.808825350499,0.808881725267,0.8089380926,0.808994452498,0.80905080496,0.809107149985,0.809163487572,0.809219817723,0.809276140435,0.809332455708,0.809388763542,0.809445063937,0.809501356891,0.809557642404,0.809613920476,0.809670191106,0.809726454294,0.80978271004,0.809838958341,0.809895199199,0.809951432613,0.810007658582,0.810063877105,0.810120088182,0.810176291813,0.810232487997,0.810288676733,0.810344858022,0.810401031862,0.810457198253,0.810513357194,0.810569508685,0.810625652726,0.810681789315,0.810737918453,0.810794040139,0.810850154372,0.810906261152,0.810962360479,0.811018452351,0.811074536768,0.811130613731,0.811186683237,0.811242745287,0.811298799881,0.811354847017,0.811410886695,0.811466918916,0.811522943677,0.811578960979,0.811634970821,0.811690973202,0.811746968123,0.811802955583,0.81185893558,0.811914908115,0.811970873187,0.812026830796,0.81208278094,0.81213872362,0.812194658836,0.812250586585,0.812306506869,0.812362419686,0.812418325036,0.812474222918,0.812530113333,0.812585996278,0.812641871755,0.812697739762,0.812753600299,0.812809453365,0.81286529896,0.812921137083,0.812976967734,0.813032790913,0.813088606618,0.813144414849,0.813200215606,0.813256008889,0.813311794696,0.813367573027,0.813423343883,0.813479107261,0.813534863162,0.813590611585,0.81364635253,0.813702085995,0.813757811982,0.813813530489,0.813869241515,0.81392494506,0.813980641124,0.814036329706,0.814092010805,0.814147684422,0.814203350555,0.814259009204,0.814314660369,0.814370304048,0.814425940242,0.81448156895,0.814537190172,0.814592803906,0.814648410153,0.814704008912,0.814759600182,0.814815183964,0.814870760255,0.814926329057,0.814981890367,0.815037444187,0.815092990515,0.815148529351,0.815204060694,0.815259584544,0.8153151009,0.815370609762,0.81542611113,0.815481605002,0.815537091378,0.815592570259,0.815648041642,0.815703505528,0.815758961917,0.815814410807,0.815869852198,0.81592528609,0.815980712482,0.816036131374,0.816091542765,0.816146946655,0.816202343043,0.816257731928,0.816313113311,0.81636848719,0.816423853566,0.816479212437,0.816534563803,0.816589907664,0.816645244018,0.816700572867,0.816755894208,0.816811208042,0.816866514368,0.816921813186,0.816977104494,0.817032388294,0.817087664583,0.817142933361,0.817198194629,0.817253448385,0.817308694629,0.817363933361,0.817419164579,0.817474388284,0.817529604475,0.817584813152,0.817640014313,0.817695207959,0.817750394088,0.817805572701,0.817860743797,0.817915907376,0.817971063436,0.818026211978,0.818081353,0.818136486503,0.818191612486,0.818246730948,0.818301841889,0.818356945309,0.818412041206,0.81846712958,0.818522210432,0.818577283759,0.818632349563,0.818687407842,0.818742458595,0.818797501823,0.818852537525,0.8189075657,0.818962586347,0.819017599467,0.819072605059,0.819127603122,0.819182593656,0.81923757666,0.819292552134,0.819347520077,0.819402480489,0.819457433369,0.819512378716,0.819567316531,0.819622246813,0.819677169561,0.819732084774,0.819786992453,0.819841892596,0.819896785204,0.819951670275,0.82000654781,0.820061417807,0.820116280266,0.820171135187,0.820225982569,0.820280822412,0.820335654715,0.820390479478,0.8204452967,0.82050010638,0.820554908519,0.820609703115,0.820664490168,0.820719269678,0.820774041644,0.820828806066,0.820883562943,0.820938312274,0.82099305406,0.821047788299,0.821102514991,0.821157234136,0.821211945733,0.821266649781,0.821321346281,0.821376035231,0.821430716632,0.821485390482,0.821540056781,0.821594715528,0.821649366724,0.821704010367,0.821758646457,0.821813274994,0.821867895977,0.821922509406,0.821977115279,0.822031713597,0.82208630436,0.822140887565,0.822195463214,0.822250031306,0.822304591839,0.822359144814,0.82241369023,0.822468228087,0.822522758383,0.822577281119,0.822631796295,0.822686303908,0.82274080396,0.822795296449,0.822849781376,0.822904258739,0.822958728538,0.823013190772,0.823067645442,0.823122092546,0.823176532084,0.823230964056,0.82328538846,0.823339805298,0.823394214567,0.823448616268,0.8235030104,0.823557396962,0.823611775954,0.823666147376,0.823720511227,0.823774867507,0.823829216215,0.82388355735,0.823937890912,0.8239922169,0.824046535315,0.824100846156,0.824155149421,0.824209445111,0.824263733225,0.824318013762,0.824372286723,0.824426552106,0.824480809911,0.824535060137,0.824589302785,0.824643537853,0.824697765342,0.824751985249,0.824806197576,0.824860402322,0.824914599485,0.824968789066,0.825022971065,0.825077145479,0.82513131231,0.825185471556,0.825239623218,0.825293767294,0.825347903784,0.825402032688,0.825456154004,0.825510267734,0.825564373875,0.825618472428,0.825672563392,0.825726646767,0.825780722552,0.825834790746,0.82588885135,0.825942904362,0.825996949782,0.82605098761,0.826105017845,0.826159040486,0.826213055534,0.826267062987,0.826321062846,0.826375055109,0.826429039776,0.826483016847,0.826536986321,0.826590948197,0.826644902476,0.826698849157,0.826752788238,0.826806719721,0.826860643603,0.826914559885,0.826968468567,0.827022369647,0.827076263125,0.827130149001,0.827184027274,0.827237897943,0.827291761009,0.827345616471,0.827399464328,0.82745330458,0.827507137226,0.827560962265,0.827614779698,0.827668589524,0.827722391741,0.827776186351,0.827829973352,0.827883752743,0.827937524525,0.827991288697,0.828045045258,0.828098794207,0.828152535545,0.828206269271,0.828259995384,0.828313713884,0.828367424771,0.828421128043,0.8284748237,0.828528511742,0.828582192169,0.828635864979,0.828689530173,0.82874318775,0.828796837709,0.82885048005,0.828904114772,0.828957741875,0.829011361359,0.829064973222,0.829118577465,0.829172174087,0.829225763087,0.829279344465,0.829332918221,0.829386484353,0.829440042862,0.829493593747,0.829547137008,0.829600672643,0.829654200653,0.829707721037,0.829761233795,0.829814738925,0.829868236428,0.829921726303,0.829975208549,0.830028683167,0.830082150155,0.830135609513,0.830189061241,0.830242505338,0.830295941803,0.830349370637,0.830402791838,0.830456205406,0.830509611341,0.830563009642,0.830616400309,0.830669783341,0.830723158737,0.830776526498,0.830829886622,0.83088323911,0.83093658396,0.830989921172,0.831043250746,0.831096572682,0.831149886978,0.831203193634,0.83125649265,0.831309784026,0.83136306776,0.831416343852,0.831469612303,0.83152287311,0.831576126274,0.831629371795,0.831682609672,0.831735839904,0.83178906249,0.831842277432,0.831895484727,0.831948684375,0.832001876376,0.83205506073,0.832108237436,0.832161406493,0.832214567901,0.832267721659,0.832320867768,0.832374006226,0.832427137033,0.832480260188,0.832533375692,0.832586483543,0.832639583741,0.832692676286,0.832745761176,0.832798838413,0.832851907994,0.83290496992,0.83295802419,0.833011070804,0.833064109761,0.83311714106,0.833170164702,0.833223180685,0.83327618901,0.833329189675,0.833382182681,0.833435168026,0.83348814571,0.833541115733,0.833594078095,0.833647032794,0.833699979831,0.833752919204,0.833805850914,0.833858774959,0.83391169134,0.833964600056,0.834017501106,0.83407039449,0.834123280207,0.834176158258,0.83422902864,0.834281891355,0.834334746401,0.834387593778,0.834440433486,0.834493265524,0.834546089891,0.834598906587,0.834651715612,0.834704516965,0.834757310645,0.834810096652,0.834862874986,0.834915645647,0.834968408632,0.835021163943,0.835073911579,0.835126651539,0.835179383822,0.835232108429,0.835284825358,0.83533753461,0.835390236183,0.835442930078,0.835495616294,0.835548294829,0.835600965685,0.83565362886,0.835706284354,0.835758932166,0.835811572296,0.835864204743,0.835916829508,0.835969446589,0.836022055985,0.836074657698,0.836127251725,0.836179838066,0.836232416722,0.836284987691,0.836337550974,0.836390106568,0.836442654475,0.836495194694,0.836547727224,0.836600252064,0.836652769214,0.836705278674,0.836757780444,0.836810274522,0.836862760908,0.836915239602,0.836967710603,0.837020173911,0.837072629525,0.837125077445,0.837177517671,0.837229950201,0.837282375035,0.837334792174,0.837387201616,0.83743960336,0.837491997408,0.837544383757,0.837596762407,0.837649133359,0.837701496611,0.837753852163,0.837806200015,0.837858540166,0.837910872615,0.837963197363,0.838015514408,0.83806782375,0.838120125389,0.838172419324,0.838224705555,0.838276984081,0.838329254902,0.838381518017,0.838433773425,0.838486021127,0.838538261122,0.838590493409,0.838642717989,0.838694934859,0.83874714402,0.838799345472,0.838851539214,0.838903725245,0.838955903565,0.839008074174,0.83906023707,0.839112392254,0.839164539726,0.839216679484,0.839268811527,0.839320935857,0.839373052472,0.839425161371,0.839477262555,0.839529356022,0.839581441772,0.839633519805,0.839685590121,0.839737652718,0.839789707597,0.839841754756,0.839893794196,0.839945825916,0.839997849915,0.840049866193,0.840101874749,0.840153875583,0.840205868695,0.840257854084,0.84030983175,0.840361801691,0.840413763908,0.8404657184,0.840517665167,0.840569604208,0.840621535522,0.84067345911,0.84072537497,0.840777283103,0.840829183508,0.840881076183,0.84093296113,0.840984838347,0.841036707833,0.841088569589,0.841140423614,0.841192269908,0.841244108469,0.841295939298,0.841347762394,0.841399577756,0.841451385384,0.841503185278,0.841554977437,0.84160676186,0.841658538548,0.841710307499,0.841762068714,0.841813822191,0.841865567931,0.841917305932,0.841969036194,0.842020758718,0.842072473501,0.842124180545,0.842175879848,0.842227571409,0.842279255229,0.842330931308,0.842382599643,0.842434260236,0.842485913085,0.84253755819,0.842589195551,0.842640825167,0.842692447037,0.842744061162,0.84279566754,0.842847266172,0.842898857056,0.842950440192,0.84300201558,0.84305358322,0.84310514311,0.843156695251,0.843208239642,0.843259776282,0.843311305171,0.843362826308,0.843414339694,0.843465845327,0.843517343207,0.843568833333,0.843620315706,0.843671790324,0.843723257188,0.843774716296,0.843826167648,0.843877611244,0.843929047084,0.843980475166,0.84403189549,0.844083308056,0.844134712864,0.844186109912,0.844237499201,0.84428888073,0.844340254499,0.844391620506,0.844442978752,0.844494329236,0.844545671957,0.844597006916,0.844648334111,0.844699653543,0.84475096521,0.844802269113,0.84485356525,0.844904853621,0.844956134226,0.845007407065,0.845058672137,0.845109929441,0.845161178976,0.845212420744,0.845263654742,0.845314880971,0.84536609943,0.845417310118,0.845468513036,0.845519708182,0.845570895556,0.845622075158,0.845673246987,0.845724411043,0.845775567326,0.845826715834,0.845877856567,0.845928989525,0.845980114708,0.846031232115,0.846082341745,0.846133443598,0.846184537674,0.846235623971,0.846286702491,0.846337773231,0.846388836192,0.846439891373,0.846490938774,0.846541978394,0.846593010233,0.84664403429,0.846695050565,0.846746059058,0.846797059767,0.846848052693,0.846899037834,0.846950015192,0.847000984764,0.84705194655,0.847102900551,0.847153846766,0.847204785193,0.847255715833,0.847306638686,0.84735755375,0.847408461025,0.847459360512,0.847510252208,0.847561136115,0.847612012231,0.847662880555,0.847713741089,0.84776459383,0.847815438779,0.847866275935,0.847917105297,0.847967926866,0.84801874064,0.848069546619,0.848120344803,0.848171135192,0.848221917784,0.848272692579,0.848323459578,0.848374218779,0.848424970181,0.848475713785,0.848526449591,0.848577177596,0.848627897802,0.848678610207,0.848729314812,0.848780011615,0.848830700616,0.848881381815,0.848932055212,0.848982720805,0.849033378594,0.84908402858,0.84913467076,0.849185305136,0.849235931706,0.84928655047,0.849337161428,0.849387764579,0.849438359922,0.849488947457,0.849539527185,0.849590099103,0.849640663212,0.849691219512,0.849741768001,0.849792308679,0.849842841547,0.849893366603,0.849943883847,0.849994393278,0.850044894897,0.850095388702,0.850145874693,0.850196352869,0.850246823231,0.850297285778,0.850347740509,0.850398187424,0.850448626522,0.850499057802,0.850549481266,0.850599896911,0.850650304737,0.850700704745,0.850751096933,0.850801481302,0.850851857849,0.850902226576,0.850952587482,0.851002940566,0.851053285828,0.851103623267,0.851153952883,0.851204274675,0.851254588643,0.851304894787,0.851355193105,0.851405483598,0.851455766266,0.851506041106,0.85155630812,0.851606567307,0.851656818666,0.851707062196,0.851757297898,0.851807525771,0.851857745814,0.851907958027,0.851958162409,0.85200835896,0.85205854768,0.852108728568,0.852158901624,0.852209066847,0.852259224236,0.852309373792,0.852359515513,0.8524096494,0.852459775451,0.852509893667,0.852560004047,0.85261010659,0.852660201296,0.852710288165,0.852760367196,0.852810438388,0.852860501742,0.852910557256,0.85296060493,0.853010644765,0.853060676758,0.853110700911,0.853160717221,0.85321072569,0.853260726316,0.8533107191,0.853360704039,0.853410681135,0.853460650387,0.853510611793,0.853560565355,0.85361051107,0.85366044894,0.853710378962,0.853760301138,0.853810215466,0.853860121946,0.853910020578,0.85395991136,0.854009794293,0.854059669377,0.85410953661,0.854159395992,0.854209247523,0.854259091202,0.854308927029,0.854358755003,0.854408575125,0.854458387392,0.854508191806,0.854557988365,0.85460777707,0.854657557919,0.854707330912,0.854757096049,0.854806853329,0.854856602752,0.854906344317,0.854956078025,0.855005803873,0.855055521863,0.855105231993,0.855154934263,0.855204628673,0.855254315222,0.855303993909,0.855353664735,0.855403327699,0.8554529828,0.855502630037,0.855552269412,0.855601900922,0.855651524567,0.855701140348,0.855750748263,0.855800348313,0.855849940496,0.855899524812,0.855949101261,0.855998669842,0.856048230555,0.8560977834,0.856147328375,0.856196865481,0.856246394717,0.856295916083,0.856345429577,0.8563949352,0.856444432952,0.856493922831,0.856543404838,0.856592878971,0.856642345231,0.856691803616,0.856741254128,0.856790696764,0.856840131525,0.856889558409,0.856938977418,0.85698838855,0.857037791804,0.857087187181,0.857136574679,0.857185954299,0.85723532604,0.857284689901,0.857334045883,0.857383393984,0.857432734204,0.857482066543,0.857531390999,0.857580707574,0.857630016266,0.857679317075,0.85772861,0.857777895041,0.857827172198,0.85787644147,0.857925702856,0.857974956357,0.858024201971,0.858073439698,0.858122669538,0.858171891491,0.858221105555,0.858270311731,0.858319510017,0.858368700414,0.858417882922,0.858467057538,0.858516224264,0.858565383099,0.858614534042,0.858663677093,0.858712812251,0.858761939516,0.858811058887,0.858860170365,0.858909273948,0.858958369636,0.859007457429,0.859056537325,0.859105609326,0.85915467343,0.859203729637,0.859252777946,0.859301818357,0.85935085087,0.859399875483,0.859448892197,0.859497901012,0.859546901926,0.859595894939,0.859644880051,0.859693857261,0.859742826569,0.859791787975,0.859840741477,0.859889687077,0.859938624772,0.859987554563,0.860036476449,0.860085390429,0.860134296504,0.860183194673,0.860232084935,0.860280967291,0.860329841738,0.860378708278,0.860427566909,0.860476417632,0.860525260445,0.860574095348,0.860622922341,0.860671741424,0.860720552595,0.860769355855,0.860818151202,0.860866938638,0.86091571816,0.860964489769,0.861013253464,0.861062009245,0.861110757112,0.861159497063,0.861208229099,0.861256953218,0.861305669421,0.861354377707,0.861403078076,0.861451770527,0.861500455059,0.861549131673,0.861597800368,0.861646461143,0.861695113998,0.861743758933,0.861792395946,0.861841025038,0.861889646209,0.861938259456,0.861986864782,0.862035462184,0.862084051662,0.862132633216,0.862181206846,0.862229772551,0.86227833033,0.862326880184,0.862375422111,0.862423956111,0.862472482184,0.86252100033,0.862569510547,0.862618012836,0.862666507196,0.862714993626,0.862763472126,0.862811942697,0.862860405336,0.862908860044,0.862957306821,0.863005745665,0.863054176577,0.863102599555,0.863151014601,0.863199421712,0.863247820889,0.863296212131,0.863344595439,0.86339297081,0.863441338245,0.863489697744,0.863538049305,0.86358639293,0.863634728616,0.863683056364,0.863731376173,0.863779688043,0.863827991973,0.863876287963,0.863924576013,0.863972856122,0.864021128289,0.864069392514,0.864117648797,0.864165897137,0.864214137534,0.864262369987,0.864310594496,0.864358811061,0.86440701968,0.864455220354,0.864503413082,0.864551597864,0.864599774699,0.864647943587,0.864696104527,0.864744257519,0.864792402563,0.864840539658,0.864888668803,0.864936789998,0.864984903243,0.865033008537,0.86508110588,0.865129195272,0.865177276711,0.865225350198,0.865273415731,0.865321473312,0.865369522938,0.865417564611,0.865465598328,0.865513624091,0.865561641897,0.865609651748,0.865657653642,0.865705647579,0.865753633559,0.865801611581,0.865849581645,0.86589754375,0.865945497896,0.865993444082,0.866041382309,0.866089312575,0.86613723488,0.866185149223,0.866233055605,0.866280954025,0.866328844481,0.866376726975,0.866424601505,0.866472468072,0.866520326674,0.866568177311,0.866616019982,0.866663854688,0.866711681428,0.866759500201,0.866807311007,0.866855113845,0.866902908716,0.866950695618,0.866998474552,0.867046245516,0.86709400851,0.867141763534,0.867189510588,0.867237249671,0.867284980782,0.867332703921,0.867380419088,0.867428126282,0.867475825503,0.867523516751,0.867571200024,0.867618875323,0.867666542646,0.867714201995,0.867761853367,0.867809496763,0.867857132183,0.867904759625,0.86795237909,0.867999990577,0.868047594085,0.868095189614,0.868142777164,0.868190356734,0.868237928324,0.868285491934,0.868333047562,0.868380595209,0.868428134873,0.868475666556,0.868523190255,0.868570705971,0.868618213704,0.868665713452,0.868713205216,0.868760688995,0.868808164788,0.868855632595,0.868903092416,0.868950544251,0.868997988098,0.869045423957,0.869092851828,0.869140271711,0.869187683605,0.86923508751,0.869282483424,0.869329871349,0.869377251282,0.869424623225,0.869471987176,0.869519343135,0.869566691101,0.869614031075,0.869661363056,0.869708687042,0.869756003035,0.869803311033,0.869850611035,0.869897903043,0.869945187054,0.869992463069,0.870039731088,0.870086991109,0.870134243132,0.870181487157,0.870228723184,0.870275951212,0.870323171241,0.870370383269,0.870417587298,0.870464783325,0.870511971352,0.870559151377,0.8706063234,0.870653487421,0.870700643438,0.870747791453,0.870794931464,0.87084206347,0.870889187472,0.870936303469,0.87098341146,0.871030511446,0.871077603425,0.871124687398,0.871171763363,0.871218831321,0.87126589127,0.871312943212,0.871359987144,0.871407023067,0.87145405098,0.871501070883,0.871548082775,0.871595086656,0.871642082526,0.871689070383,0.871736050229,0.871783022061,0.87182998588,0.871876941686,0.871923889477,0.871970829254,0.872017761016,0.872064684763,0.872111600493,0.872158508208,0.872205407906,0.872252299586,0.872299183249,0.872346058894,0.872392926521,0.872439786129,0.872486637717,0.872533481286,0.872580316835,0.872627144363,0.87267396387,0.872720775356,0.87276757882,0.872814374261,0.87286116168,0.872907941076,0.872954712448,0.873001475796,0.87304823112,0.873094978418,0.873141717692,0.873188448939,0.873235172161,0.873281887356,0.873328594524,0.873375293664,0.873421984777,0.873468667861,0.873515342917,0.873562009943,0.87360866894,0.873655319907,0.873701962843,0.873748597749,0.873795224623,0.873841843465,0.873888454276,0.873935057053,0.873981651798,0.874028238509,0.874074817186,0.874121387829,0.874167950438,0.874214505011,0.874261051548,0.87430759005,0.874354120515,0.874400642943,0.874447157334,0.874493663687,0.874540162002,0.874586652278,0.874633134516,0.874679608713,0.874726074872,0.874772532989,0.874818983066,0.874865425102,0.874911859097,0.874958285049,0.875004702959,0.875051112826,0.87509751465,0.87514390843,0.875190294165,0.875236671857,0.875283041503,0.875329403104,0.875375756659,0.875422102168,0.87546843963,0.875514769045,0.875561090413,0.875607403732,0.875653709003,0.875700006226,0.875746295399,0.875792576522,0.875838849595,0.875885114618,0.87593137159,0.87597762051,0.876023861379,0.876070094195,0.876116318959,0.87616253567,0.876208744327,0.87625494493,0.876301137479,0.876347321973,0.876393498412,0.876439666796,0.876485827123,0.876531979394,0.876578123608,0.876624259764,0.876670387863,0.876716507904,0.876762619886,0.876808723809,0.876854819673,0.876900907477,0.87694698722,0.876993058903,0.877039122525,0.877085178085,0.877131225583,0.877177265019,0.877223296392,0.877269319701,0.877315334947,0.877361342129,0.877407341246,0.877453332299,0.877499315286,0.877545290207,0.877591257062,0.877637215851,0.877683166572,0.877729109226,0.877775043812,0.87782097033,0.877866888779,0.877912799159,0.877958701469,0.878004595709,0.878050481879,0.878096359978,0.878142230005,0.878188091961,0.878233945845,0.878279791657,0.878325629395,0.87837145906,0.878417280651,0.878463094168,0.87850889961,0.878554696977,0.878600486269,0.878646267485,0.878692040625,0.878737805687,0.878783562673,0.878829311581,0.878875052411,0.878920785162,0.878966509835,0.879012226429,0.879057934942,0.879103635376,0.879149327729,0.879195012001,0.879240688192,0.879286356301,0.879332016328,0.879377668272,0.879423312133,0.879468947911,0.879514575604,0.879560195214,0.879605806739,0.879651410178,0.879697005532,0.8797425928,0.879788171982,0.879833743076,0.879879306084,0.879924861004,0.879970407836,0.880015946579,0.880061477233,0.880106999798,0.880152514274,0.880198020659,0.880243518953,0.880289009157,0.880334491269,0.880379965289,0.880425431217,0.880470889052,0.880516338794,0.880561780443,0.880607213998,0.880652639458,0.880698056824,0.880743466094,0.880788867269,0.880834260348,0.88087964533,0.880925022216,0.880970391004,0.881015751694,0.881061104287,0.881106448781,0.881151785176,0.881197113471,0.881242433667,0.881287745763,0.881333049758,0.881378345652,0.881423633444,0.881468913135,0.881514184723,0.881559448209,0.881604703592,0.881649950871,0.881695190046,0.881740421117,0.881785644083,0.881830858944,0.881876065699,0.881921264348,0.881966454891,0.882011637327,0.882056811656,0.882101977877,0.88214713599,0.882192285994,0.88223742789,0.882282561676,0.882327687352,0.882372804919,0.882417914374,0.882463015719,0.882508108952,0.882553194074,0.882598271083,0.88264333998,0.882688400763,0.882733453433,0.882778497989,0.882823534431,0.882868562758,0.88291358297,0.882958595066,0.883003599047,0.883048594911,0.883093582658,0.883138562288,0.883183533801,0.883228497195,0.883273452471,0.883318399628,0.883363338666,0.883408269584,0.883453192382,0.883498107059,0.883543013616,0.883587912051,0.883632802365,0.883677684556,0.883722558625,0.883767424571,0.883812282393,0.883857132091,0.883901973666,0.883946807116,0.88399163244,0.884036449639,0.884081258713,0.88412605966,0.88417085248,0.884215637173,0.884260413739,0.884305182177,0.884349942486,0.884394694667,0.884439438718,0.88448417464,0.884528902432,0.884573622094,0.884618333624,0.884663037024,0.884707732292,0.884752419428,0.884797098431,0.884841769301,0.884886432039,0.884931086642,0.884975733112,0.885020371447,0.885065001647,0.885109623711,0.88515423764,0.885198843433,0.885243441089,0.885288030609,0.885332611991,0.885377185235,0.885421750341,0.885466307308,0.885510856136,0.885555396825,0.885599929374,0.885644453783,0.885688970051,0.885733478178,0.885777978164,0.885822470007,0.885866953709,0.885911429268,0.885955896683,0.886000355955,0.886044807084,0.886089250067,0.886133684907,0.8861781116,0.886222530149,0.886266940551,0.886311342807,0.886355736917,0.886400122879,0.886444500693,0.88648887036,0.886533231878,0.886577585247,0.886621930467,0.886666267537,0.886710596458,0.886754917228,0.886799229847,0.886843534314,0.88688783063,0.886932118794,0.886976398806,0.887020670664,0.88706493437,0.887109189921,0.887153437319,0.887197676562,0.88724190765,0.887286130582,0.887330345359,0.88737455198,0.887418750444,0.887462940752,0.887507122901,0.887551296894,0.887595462728,0.887639620403,0.887683769919,0.887727911276,0.887772044473,0.88781616951,0.887860286387,0.887904395102,0.887948495656,0.887992588048,0.888036672278,0.888080748345,0.888124816249,0.88816887599,0.888212927566,0.888256970979,0.888301006227,0.88834503331,0.888389052227,0.888433062978,0.888477065564,0.888521059982,0.888565046233,0.888609024317,0.888652994233,0.888696955981,0.88874090956,0.88878485497,0.88882879221,0.88887272128,0.88891664218,0.88896055491,0.889004459468,0.889048355855,0.889092244069,0.889136124112,0.889179995981,0.889223859678,0.889267715201,0.88931156255,0.889355401724,0.889399232724,0.889443055549,0.889486870198,0.889530676671,0.889574474968,0.889618265088,0.889662047031,0.889705820796,0.889749586383,0.889793343792,0.889837093022,0.889880834073,0.889924566944,0.889968291635,0.890012008146,0.890055716476,0.890099416625,0.890143108592,0.890186792378,0.890230467981,0.890274135401,0.890317794637,0.890361445691,0.89040508856,0.890448723245,0.890492349745,0.89053596806,0.890579578189,0.890623180132,0.890666773889,0.890710359459,0.890753936841,0.890797506036,0.890841067043,0.890884619862,0.890928164492,0.890971700932,0.891015229183,0.891058749244,0.891102261115,0.891145764795,0.891189260283,0.89123274758,0.891276226685,0.891319697597,0.891363160317,0.891406614843,0.891450061176,0.891493499315,0.891536929259,0.891580351009,0.891623764563,0.891667169922,0.891710567084,0.891753956051,0.89179733682,0.891840709392,0.891884073767,0.891927429944,0.891970777922,0.892014117701,0.892057449282,0.892100772662,0.892144087843,0.892187394823,0.892230693602,0.892273984181,0.892317266557,0.892360540732,0.892403806704,0.892447064474,0.89249031404,0.892533555403,0.892576788562,0.892620013516,0.892663230265,0.89270643881,0.892749639149,0.892792831282,0.892836015208,0.892879190928,0.892922358441,0.892965517746,0.893008668843,0.893051811732,0.893094946412,0.893138072883,0.893181191144,0.893224301196,0.893267403037,0.893310496667,0.893353582086,0.893396659294,0.89343972829,0.893482789074,0.893525841644,0.893568886002,0.893611922146,0.893654950077,0.893697969793,0.893740981294,0.893783984581,0.893826979651,0.893869966506,0.893912945145,0.893955915567,0.893998877772,0.89404183176,0.89408477753,0.894127715081,0.894170644414,0.894213565528,0.894256478422,0.894299383097,0.894342279551,0.894385167785,0.894428047798,0.894470919589,0.894513783159,0.894556638506,0.894599485631,0.894642324533,0.894685155212,0.894727977667,0.894770791897,0.894813597903,0.894856395685,0.89489918524,0.894941966571,0.894984739675,0.895027504552,0.895070261203,0.895113009626,0.895155749822,0.895198481789,0.895241205528,0.895283921039,0.89532662832,0.895369327371,0.895412018192,0.895454700783,0.895497375143,0.895540041272,0.895582699169,0.895625348834,0.895667990267,0.895710623467,0.895753248434,0.895795865167,0.895838473666,0.895881073931,0.895923665961,0.895966249756,0.896008825316,0.896051392639,0.896093951727,0.896136502577,0.896179045191,0.896221579567,0.896264105705,0.896306623604,0.896349133266,0.896391634688,0.89643412787,0.896476612813,0.896519089516,0.896561557978,0.896604018199,0.896646470179,0.896688913917,0.896731349412,0.896773776665,0.896816195676,0.896858606442,0.896901008965,0.896943403244,0.896985789279,0.897028167068,0.897070536613,0.897112897911,0.897155250964,0.89719759577,0.897239932329,0.897282260641,0.897324580705,0.897366892522,0.89740919609,0.897451491409,0.897493778479,0.897536057299,0.89757832787,0.89762059019,0.897662844259,0.897705090077,0.897747327644,0.897789556959,0.897831778021,0.897873990831,0.897916195388,0.897958391691,0.898000579741,0.898042759536,0.898084931077,0.898127094362,0.898169249393,0.898211396167,0.898253534685,0.898295664947,0.898337786952,0.898379900699,0.898422006189,0.898464103421,0.898506192394,0.898548273108,0.898590345563,0.898632409759,0.898674465694,0.898716513369,0.898758552783,0.898800583936,0.898842606827,0.898884621457,0.898926627824,0.898968625928,0.899010615769,0.899052597347,0.89909457066,0.89913653571,0.899178492495,0.899220441014,0.899262381269,0.899304313257,0.899346236979,0.899388152435,0.899430059624,0.899471958545,0.899513849198,0.899555731584,0.899597605701,0.899639471549,0.899681329127,0.899723178436,0.899765019475,0.899806852244,0.899848676742,0.899890492968,0.899932300923,0.899974100606,0.900015892016,0.900057675154,0.900099450019,0.90014121661,0.900182974927,0.90022472497,0.900266466738,0.900308200231,0.900349925449,0.900391642391,0.900433351056,0.900475051445,0.900516743558,0.900558427392,0.900600102949,0.900641770228,0.900683429229,0.90072507995,0.900766722392,0.900808356555,0.900849982438,0.90089160004,0.900933209361,0.900974810401,0.90101640316,0.901057987636,0.901099563831,0.901141131742,0.901182691371,0.901224242716,0.901265785777,0.901307320554,0.901348847046,0.901390365253,0.901431875175,0.901473376811,0.901514870161,0.901556355225,0.901597832001,0.90163930049,0.901680760692,0.901722212606,0.901763656231,0.901805091567,0.901846518614,0.901887937371,0.901929347839,0.901970750016,0.902012143902,0.902053529498,0.902094906802,0.902136275814,0.902177636533,0.902218988961,0.902260333095,0.902301668935,0.902342996482,0.902384315735,0.902425626694,0.902466929357,0.902508223725,0.902549509798,0.902590787574,0.902632057054,0.902673318237,0.902714571123,0.902755815712,0.902797052002,0.902838279995,0.902879499688,0.902920711082,0.902961914177,0.903003108973,0.903044295468,0.903085473662,0.903126643555,0.903167805147,0.903208958438,0.903250103426,0.903291240112,0.903332368495,0.903373488574,0.90341460035,0.903455703822,0.90349679899,0.903537885853,0.903578964411,0.903620034663,0.903661096609,0.903702150249,0.903743195583,0.903784232609,0.903825261328,0.90386628174,0.903907293843,0.903948297638,0.903989293123,0.9040302803,0.904071259167,0.904112229724,0.90415319197,0.904194145906,0.90423509153,0.904276028843,0.904316957844,0.904357878533,0.904398790909,0.904439694972,0.904480590721,0.904521478157,0.904562357279,0.904603228086,0.904644090578,0.904684944755,0.904725790616,0.904766628162,0.90480745739,0.904848278302,0.904889090897,0.904929895174,0.904970691134,0.905011478775,0.905052258097,0.9050930291,0.905133791784,0.905174546148,0.905215292192,0.905256029916,0.905296759318,0.905337480399,0.905378193159,0.905418897596,0.905459593711,0.905500281504,0.905540960973,0.905581632118,0.90562229494,0.905662949437,0.90570359561,0.905744233458,0.90578486298,0.905825484176,0.905866097047,0.90590670159,0.905947297807,0.905987885697,0.906028465259,0.906069036493,0.906109599398,0.906150153975,0.906190700223,0.906231238141,0.906271767729,0.906312288987,0.906352801915,0.906393306511,0.906433802776,0.906474290709,0.90651477031,0.906555241579,0.906595704515,0.906636159117,0.906676605386,0.906717043321,0.906757472922,0.906797894188,0.906838307119,0.906878711714,0.906919107974,0.906959495897,0.906999875484,0.907040246734,0.907080609646,0.907120964221,0.907161310458,0.907201648356,0.907241977915,0.907282299136,0.907322612016,0.907362916557,0.907403212758,0.907443500618,0.907483780137,0.907524051314,0.90756431415,0.907604568643,0.907644814795,0.907685052603,0.907725282068,0.907765503189,0.907805715966,0.907845920399,0.907886116488,0.907926304231,0.907966483629,0.90800665468,0.908046817386,0.908086971745,0.908127117757,0.908167255422,0.908207384739,0.908247505709,0.908287618329,0.908327722601,0.908367818524,0.908407906097,0.908447985321,0.908488056194,0.908528118716,0.908568172888,0.908608218708,0.908648256176,0.908688285293,0.908728306056,0.908768318467,0.908808322525,0.908848318229,0.90888830558,0.908928284576,0.908968255217,0.909008217503,0.909048171434,0.909088117009,0.909128054228,0.909167983091,0.909207903596,0.909247815744,0.909287719535,0.909327614968,0.909367502042,0.909407380758,0.909447251114,0.909487113112,0.909526966749,0.909566812026,0.909606648943,0.909646477498,0.909686297693,0.909726109525,0.909765912996,0.909805708105,0.90984549485,0.909885273233,0.909925043252,0.909964804907,0.910004558198,0.910044303125,0.910084039686,0.910123767883,0.910163487713,0.910203199178,0.910242902276,0.910282597007,0.910322283372,0.910361961368,0.910401630997,0.910441292258,0.91048094515,0.910520589673,0.910560225827,0.910599853612,0.910639473026,0.91067908407,0.910718686743,0.910758281044,0.910797866975,0.910837444533,0.91087701372,0.910916574533,0.910956126974,0.910995671042,0.911035206735,0.911074734055,0.911114253001,0.911153763571,0.911193265767,0.911232759586,0.911272245031,0.911311722098,0.91135119079,0.911390651104,0.911430103041,0.911469546601,0.911508981782,0.911548408585,0.911587827009,0.911627237054,0.91166663872,0.911706032005,0.911745416911,0.911784793436,0.91182416158,0.911863521343,0.911902872724,0.911942215723,0.91198155034,0.912020876574,0.912060194424,0.912099503892,0.912138804975,0.912178097675,0.91221738199,0.91225665792,0.912295925464,0.912335184623,0.912374435396,0.912413677783,0.912452911783,0.912492137396,0.912531354622,0.912570563459,0.912609763909,0.91264895597,0.912688139642,0.912727314925,0.912766481818,0.912805640322,0.912844790435,0.912883932157,0.912923065488,0.912962190428,0.913001306977,0.913040415133,0.913079514896,0.913118606267,0.913157689245,0.913196763829,0.913235830019,0.913274887815,0.913313937216,0.913352978222,0.913392010833,0.913431035049,0.913470050868,0.91350905829,0.913548057316,0.913587047945,0.913626030177,0.91366500401,0.913703969445,0.913742926482,0.91378187512,0.913820815358,0.913859747197,0.913898670636,0.913937585674,0.913976492312,0.914015390549,0.914054280384,0.914093161817,0.914132034849,0.914170899478,0.914209755704,0.914248603526,0.914287442945,0.914326273961,0.914365096571,0.914403910778,0.914442716579,0.914481513975,0.914520302965,0.914559083549,0.914597855727,0.914636619498,0.914675374862,0.914714121818,0.914752860366,0.914791590506,0.914830312238,0.914869025561,0.914907730474,0.914946426978,0.914985115072,0.915023794755,0.915062466028,0.915101128889,0.91513978334,0.915178429378,0.915217067005,0.915255696218,0.915294317019,0.915332929407,0.915371533382,0.915410128942,0.915448716088,0.91548729482,0.915525865136,0.915564427038,0.915602980523,0.915641525593,0.915680062246,0.915718590483,0.915757110302,0.915795621704,0.915834124688,0.915872619254,0.915911105402,0.91594958313,0.91598805244,0.916026513329,0.916064965799,0.916103409849,0.916141845478,0.916180272686,0.916218691473,0.916257101838,0.916295503781,0.916333897301,0.916372282399,0.916410659074,0.916449027325,0.916487387153,0.916525738556,0.916564081535,0.916602416089,0.916640742218,0.916679059921,0.916717369198,0.916755670049,0.916793962474,0.916832246471,0.916870522041,0.916908789184,0.916947047898,0.916985298184,0.917023540041,0.91706177347,0.917099998468,0.917138215037,0.917176423176,0.917214622885,0.917252814162,0.917290997008,0.917329171423,0.917367337406,0.917405494957,0.917443644075,0.91748178476,0.917519917012,0.91755804083,0.917596156214,0.917634263164,0.917672361679,0.917710451759,0.917748533404,0.917786606613,0.917824671385,0.917862727722,0.917900775621,0.917938815084,0.917976846109,0.918014868696,0.918052882845,0.918090888555,0.918128885827,0.918166874659,0.918204855051,0.918242827004,0.918280790517,0.918318745588,0.918356692219,0.918394630408,0.918432560156,0.918470481462,0.918508394325,0.918546298746,0.918584194723,0.918622082257,0.918659961348,0.918697831994,0.918735694196,0.918773547952,0.918811393264,0.91884923013,0.918887058551,0.918924878525,0.918962690052,0.919000493133,0.919038287766,0.919076073952,0.91911385169,0.91915162098,0.919189381821,0.919227134212,0.919264878155,0.919302613648,0.919340340691,0.919378059283,0.919415769425,0.919453471116,0.919491164355,0.919528849142,0.919566525478,0.919604193361,0.919641852791,0.919679503768,0.919717146291,0.919754780361,0.919792405976,0.919830023137,0.919867631843,0.919905232094,0.919942823889,0.919980407229,0.920017982112,0.920055548538,0.920093106508,0.92013065602,0.920168197074,0.920205729671,0.920243253809,0.920280769489,0.920318276709,0.92035577547,0.920393265772,0.920430747613,0.920468220994,0.920505685914,0.920543142373,0.920580590371,0.920618029907,0.920655460981,0.920692883592,0.920730297741,0.920767703426,0.920805100648,0.920842489406,0.9208798697,0.920917241529,0.920954604894,0.920991959793,0.921029306227,0.921066644194,0.921103973696,0.921141294731,0.921178607299,0.921215911399,0.921253207033,0.921290494198,0.921327772894,0.921365043123,0.921402304882,0.921439558172,0.921476802992,0.921514039342,0.921551267222,0.921588486631,0.921625697569,0.921662900036,0.921700094031,0.921737279554,0.921774456604,0.921811625182,0.921848785286,0.921885936918,0.921923080075,0.921960214758,0.921997340967,0.922034458701,0.92207156796,0.922108668743,0.922145761051,0.922182844882,0.922219920237,0.922256987115,0.922294045516,0.922331095439,0.922368136885,0.922405169852,0.922442194341,0.922479210351,0.922516217881,0.922553216932,0.922590207503,0.922627189594,0.922664163205,0.922701128334,0.922738084982,0.922775033148,0.922811972833,0.922848904035,0.922885826755,0.922922740991,0.922959646745,0.922996544014,0.9230334328,0.923070313101,0.923107184918,0.92314404825,0.923180903096,0.923217749457,0.923254587331,0.92329141672,0.923328237621,0.923365050036,0.923401853963,0.923438649402,0.923475436354,0.923512214817,0.923548984791,0.923585746276,0.923622499272,0.923659243778,0.923695979794,0.92373270732,0.923769426355,0.923806136898,0.923842838951,0.923879532511,0.92391621758,0.923952894156,0.923989562239,0.924026221829,0.924062872926,0.924099515529,0.924136149637,0.924172775252,0.924209392371,0.924246000996,0.924282601125,0.924319192758,0.924355775895,0.924392350535,0.924428916679,0.924465474325,0.924502023474,0.924538564125,0.924575096279,0.924611619933,0.924648135089,0.924684641745,0.924721139902,0.92475762956,0.924794110717,0.924830583373,0.924867047529,0.924903503183,0.924939950336,0.924976388987,0.925012819136,0.925049240783,0.925085653926,0.925122058567,0.925158454703,0.925194842336,0.925231221465,0.92526759209,0.925303954209,0.925340307823,0.925376652932,0.925412989535,0.925449317631,0.925485637221,0.925521948305,0.925558250881,0.925594544949,0.92563083051,0.925667107562,0.925703376106,0.925739636141,0.925775887667,0.925812130683,0.92584836519,0.925884591186,0.925920808672,0.925957017647,0.92599321811,0.926029410062,0.926065593503,0.926101768431,0.926137934846,0.926174092749,0.926210242138,0.926246383014,0.926282515376,0.926318639224,0.926354754558,0.926390861376,0.926426959679,0.926463049467,0.926499130739,0.926535203495,0.926571267734,0.926607323457,0.926643370662,0.92667940935,0.92671543952,0.926751461171,0.926787474305,0.926823478919,0.926859475014,0.92689546259,0.926931441646,0.926967412182,0.927003374197,0.927039327691,0.927075272665,0.927111209117,0.927147137047,0.927183056455,0.92721896734,0.927254869703,0.927290763542,0.927326648858,0.92736252565,0.927398393919,0.927434253662,0.927470104881,0.927505947575,0.927541781743,0.927577607386,0.927613424502,0.927649233093,0.927685033156,0.927720824692,0.927756607701,0.927792382182,0.927828148135,0.92786390556,0.927899654456,0.927935394823,0.92797112666,0.928006849968,0.928042564746,0.928078270993,0.92811396871,0.928149657895,0.92818533855,0.928221010672,0.928256674263,0.928292329321,0.928327975847,0.928363613839,0.928399243299,0.928434864224,0.928470476616,0.928506080473,0.928541675796,0.928577262584,0.928612840836,0.928648410553,0.928683971734,0.928719524379,0.928755068487,0.928790604058,0.928826131092,0.928861649588,0.928897159547,0.928932660967,0.928968153849,0.929003638192,0.929039113995,0.929074581259,0.929110039984,0.929145490168,0.929180931811,0.929216364914,0.929251789475,0.929287205496,0.929322612974,0.92935801191,0.929393402304,0.929428784155,0.929464157462,0.929499522227,0.929534878447,0.929570226124,0.929605565256,0.929640895843,0.929676217885,0.929711531382,0.929746836334,0.929782132739,0.929817420598,0.92985269991,0.929887970675,0.929923232893,0.929958486563,0.929993731685,0.930028968259,0.930064196284,0.93009941576,0.930134626687,0.930169829065,0.930205022892,0.930240208169,0.930275384896,0.930310553072,0.930345712696,0.93038086377,0.930416006291,0.93045114026,0.930486265676,0.93052138254,0.93055649085,0.930591590607,0.930626681811,0.93066176446,0.930696838554,0.930731904094,0.930766961079,0.930802009508,0.930837049382,0.9308720807,0.930907103461,0.930942117665,0.930977123313,0.931012120403,0.931047108936,0.93108208891,0.931117060326,0.931152023184,0.931186977483,0.931221923222,0.931256860402,0.931291789022,0.931326709081,0.93136162058,0.931396523518,0.931431417895,0.931466303711,0.931501180965,0.931536049656,0.931570909785,0.931605761351,0.931640604354,0.931675438794,0.93171026467,0.931745081982,0.931779890729,0.931814690912,0.931849482529,0.931884265582,0.931919040068,0.931953805989,0.931988563343,0.932023312131,0.932058052351,0.932092784005,0.932127507091,0.932162221609,0.932196927558,0.932231624939,0.932266313752,0.932300993995,0.932335665668,0.932370328772,0.932404983305,0.932439629268,0.932474266661,0.932508895482,0.932543515732,0.93257812741,0.932612730516,0.932647325049,0.93268191101,0.932716488398,0.932751057213,0.932785617454,0.932820169121,0.932854712213,0.932889246731,0.932923772674,0.932958290042,0.932992798835,0.933027299051,0.933061790692,0.933096273755,0.933130748242,0.933165214152,0.933199671485,0.933234120239,0.933268560416,0.933302992014,0.933337415033,0.933371829474,0.933406235335,0.933440632616,0.933475021317,0.933509401438,0.933543772979,0.933578135938,0.933612490317,0.933646836113,0.933681173328,0.933715501961,0.933749822011,0.933784133478,0.933818436362,0.933852730663,0.93388701638,0.933921293513,0.933955562061,0.933989822025,0.934024073403,0.934058316197,0.934092550404,0.934126776026,0.934160993061,0.93419520151,0.934229401372,0.934263592646,0.934297775334,0.934331949433,0.934366114944,0.934400271866,0.9344344202,0.934468559945,0.9345026911,0.934536813665,0.93457092764,0.934605033025,0.93463912982,0.934673218023,0.934707297635,0.934741368655,0.934775431084,0.93480948492,0.934843530163,0.934877566814,0.934911594872,0.934945614336,0.934979625206,0.935013627482,0.935047621163,0.93508160625,0.935115582742,0.935149550638,0.935183509939,0.935217460644,0.935251402752,0.935285336264,0.935319261179,0.935353177496,0.935387085216,0.935420984338,0.935454874862,0.935488756787,0.935522630114,0.935556494841,0.93559035097,0.935624198498,0.935658037426,0.935691867754,0.935725689481,0.935759502607,0.935793307132,0.935827103055,0.935860890377,0.935894669096,0.935928439213,0.935962200726,0.935995953637,0.936029697944,0.936063433647,0.936097160746,0.936130879241,0.936164589131,0.936198290416,0.936231983096,0.93626566717,0.936299342638,0.9363330095,0.936366667756,0.936400317404,0.936433958445,0.936467590879,0.936501214705,0.936534829923,0.936568436532,0.936602034533,0.936635623924,0.936669204707,0.936702776879,0.936736340442,0.936769895394,0.936803441736,0.936836979467,0.936870508586,0.936904029095,0.936937540991,0.936971044275,0.937004538947,0.937038025006,0.937071502452,0.937104971284,0.937138431503,0.937171883108,0.937205326099,0.937238760475,0.937272186236,0.937305603382,0.937339011913,0.937372411827,0.937405803126,0.937439185808,0.937472559873,0.937505925321,0.937539282152,0.937572630366,0.937605969961,0.937639300938,0.937672623297,0.937705937036,0.937739242156,0.937772538657,0.937805826538,0.937839105799,0.93787237644,0.93790563846,0.937938891859,0.937972136636,0.938005372792,0.938038600326,0.938071819238,0.938105029527,0.938138231193,0.938171424236,0.938204608655,0.938237784451,0.938270951623,0.93830411017,0.938337260093,0.938370401391,0.938403534063,0.93843665811,0.938469773531,0.938502880325,0.938535978494,0.938569068035,0.938602148949,0.938635221236,0.938668284895,0.938701339926,0.938734386328,0.938767424102,0.938800453247,0.938833473763,0.938866485649,0.938899488906,0.938932483532,0.938965469528,0.938998446893,0.939031415627,0.939064375729,0.9390973272,0.939130270039,0.939163204246,0.93919612982,0.939229046761,0.939261955069,0.939294854743,0.939327745784,0.93936062819,0.939393501962,0.9394263671,0.939459223602,0.939492071469,0.939524910701,0.939557741296,0.939590563256,0.939623376579,0.939656181265,0.939688977314,0.939721764725,0.939754543499,0.939787313635,0.939820075132,0.939852827991,0.939885572211,0.939918307792,0.939951034733,0.939983753034,0.940016462695,0.940049163716,0.940081856096,0.940114539835,0.940147214933,0.940179881389,0.940212539203,0.940245188375,0.940277828904,0.94031046079,0.940343084034,0.940375698634,0.94040830459,0.940440901902,0.94047349057,0.940506070593,0.940538641972,0.940571204705,0.940603758792,0.940636304234,0.940668841029,0.940701369179,0.940733888681,0.940766399536,0.940798901744,0.940831395305,0.940863880217,0.940896356482,0.940928824098,0.940961283065,0.940993733382,0.941026175051,0.94105860807,0.941091032438,0.941123448157,0.941155855225,0.941188253642,0.941220643407,0.941253024521,0.941285396984,0.941317760794,0.941350115952,0.941382462457,0.94141480031,0.941447129509,0.941479450054,0.941511761946,0.941544065183,0.941576359766,0.941608645694,0.941640922967,0.941673191585,0.941705451547,0.941737702853,0.941769945503,0.941802179496,0.941834404832,0.941866621512,0.941898829534,0.941931028898,0.941963219604,0.941995401652,0.942027575041,0.942059739771,0.942091895842,0.942124043254,0.942156182005,0.942188312097,0.942220433528,0.942252546299,0.942284650408,0.942316745857,0.942348832643,0.942380910768,0.942412980231,0.942445041031,0.942477093168,0.942509136643,0.942541171454,0.942573197601,0.942605215085,0.942637223904,0.942669224059,0.942701215549,0.942733198374,0.942765172533,0.942797138027,0.942829094855,0.942861043016,0.942892982511,0.942924913339,0.9429568355,0.942988748994,0.943020653819,0.943052549977,0.943084437466,0.943116316287,0.943148186438,0.943180047921,0.943211900734,0.943243744877,0.94327558035,0.943307407153,0.943339225285,0.943371034746,0.943402835536,0.943434627654,0.943466411101,0.943498185875,0.943529951977,0.943561709406,0.943593458162,0.943625198245,0.943656929654,0.943688652389,0.94372036645,0.943752071837,0.943783768549,0.943815456586,0.943847135947,0.943878806633,0.943910468643,0.943942121976,0.943973766634,0.944005402614,0.944037029917,0.944068648543,0.944100258491,0.944131859761,0.944163452353,0.944195036267,0.944226611501,0.944258178057,0.944289735933,0.944321285129,0.944352825646,0.944384357482,0.944415880637,0.944447395112,0.944478900905,0.944510398017,0.944541886447,0.944573366196,0.944604837261,0.944636299645,0.944667753345,0.944699198362,0.944730634696,0.944762062346,0.944793481312,0.944824891594,0.944856293191,0.944887686103,0.94491907033,0.944950445871,0.944981812727,0.945013170896,0.945044520379,0.945075861176,0.945107193285,0.945138516708,0.945169831442,0.945201137489,0.945232434848,0.945263723519,0.945295003501,0.945326274794,0.945357537398,0.945388791312,0.945420036536,0.945451273071,0.945482500914,0.945513720068,0.94554493053,0.945576132301,0.945607325381,0.945638509768,0.945669685464,0.945700852467,0.945732010777,0.945763160395,0.945794301319,0.94582543355,0.945856557087,0.94588767193,0.945918778078,0.945949875532,0.945980964291,0.946012044354,0.946043115722,0.946074178394,0.94610523237,0.94613627765,0.946167314233,0.946198342119,0.946229361308,0.946260371799,0.946291373592,0.946322366688,0.946353351084,0.946384326783,0.946415293782,0.946446252082,0.946477201682,0.946508142583,0.946539074784,0.946569998284,0.946600913083,0.946631819182,0.946662716579,0.946693605275,0.946724485269,0.946755356561,0.94678621915,0.946817073037,0.946847918221,0.946878754702,0.946909582479,0.946940401552,0.946971211922,0.947002013587,0.947032806547,0.947063590803,0.947094366353,0.947125133198,0.947155891336,0.947186640769,0.947217381496,0.947248113516,0.947278836829,0.947309551435,0.947340257333,0.947370954524,0.947401643006,0.947432322781,0.947462993846,0.947493656203,0.947524309851,0.947554954789,0.947585591018,0.947616218536,0.947646837344,0.947677447442,0.947708048829,0.947738641505,0.947769225469,0.947799800721,0.947830367262,0.94786092509,0.947891474206,0.947922014609,0.947952546299,0.947983069276,0.948013583539,0.948044089088,0.948074585922,0.948105074043,0.948135553448,0.948166024138,0.948196486113,0.948226939373,0.948257383916,0.948287819744,0.948318246855,0.948348665249,0.948379074926,0.948409475886,0.948439868128,0.948470251652,0.948500626459,0.948530992547,0.948561349916,0.948591698566,0.948622038497,0.948652369708,0.9486826922,0.948713005971,0.948743311023,0.948773607353,0.948803894963,0.948834173851,0.948864444018,0.948894705463,0.948924958186,0.948955202187,0.948985437465,0.949015664021,0.949045881853,0.949076090961,0.949106291347,0.949136483008,0.949166665944,0.949196840157,0.949227005644,0.949257162406,0.949287310444,0.949317449755,0.94934758034,0.9493777022,0.949407815332,0.949437919738,0.949468015417,0.949498102369,0.949528180593,0.949558250089,0.949588310857,0.949618362897,0.949648406208,0.94967844079,0.949708466643,0.949738483766,0.94976849216,0.949798491823,0.949828482756,0.949858464959,0.94988843843,0.94991840317,0.949948359179,0.949978306457,0.950008245002,0.950038174815,0.950068095895,0.950098008243,0.950127911857,0.950157806738,0.950187692886,0.950217570299,0.950247438979,0.950277298924,0.950307150134,0.950336992609,0.950366826349,0.950396651353,0.950426467621,0.950456275154,0.950486073949,0.950515864009,0.950545645331,0.950575417916,0.950605181764,0.950634936874,0.950664683245,0.950694420879,0.950724149774,0.95075386993,0.950783581347,0.950813284024,0.950842977962,0.95087266316,0.950902339618,0.950932007335,0.950961666312,0.950991316547,0.951020958041,0.951050590794,0.951080214804,0.951109830073,0.951139436599,0.951169034383,0.951198623423,0.95122820372,0.951257775274,0.951287338084,0.95131689215,0.951346437472,0.951375974049,0.951405501882,0.951435020969,0.951464531311,0.951494032907,0.951523525757,0.951553009861,0.951582485219,0.95161195183,0.951641409694,0.95167085881,0.951700299179,0.9517297308,0.951759153673,0.951788567798,0.951817973174,0.951847369801,0.951876757679,0.951906136808,0.951935507187,0.951964868816,0.951994221694,0.952023565822,0.9520529012,0.952082227826,0.952111545701,0.952140854824,0.952170155195,0.952199446814,0.952228729681,0.952258003795,0.952287269157,0.952316525765,0.952345773619,0.95237501272,0.952404243066,0.952433464659,0.952462677497,0.95249188158,0.952521076908,0.95255026348,0.952579441297,0.952608610358,0.952637770663,0.952666922211,0.952696065003,0.952725199038,0.952754324315,0.952783440835,0.952812548597,0.952841647601,0.952870737847,0.952899819334,0.952928892063,0.952957956032,0.952987011242,0.953016057692,0.953045095382,0.953074124312,0.953103144482,0.953132155891,0.953161158539,0.953190152425,0.95321913755,0.953248113914,0.953277081515,0.953306040354,0.953334990431,0.953363931744,0.953392864295,0.953421788082,0.953450703105,0.953479609365,0.95350850686,0.953537395591,0.953566275557,0.953595146758,0.953624009194,0.953652862865,0.953681707769,0.953710543908,0.95373937128,0.953768189886,0.953796999725,0.953825800797,0.953854593101,0.953883376638,0.953912151407,0.953940917408,0.95396967464,0.953998423104,0.954027162799,0.954055893724,0.95408461588,0.954113329267,0.954142033883,0.954170729729,0.954199416804,0.954228095109,0.954256764643,0.954285425405,0.954314077396,0.954342720615,0.954371355061,0.954399980736,0.954428597638,0.954457205767,0.954485805122,0.954514395704,0.954542977513,0.954571550548,0.954600114808,0.954628670294,0.954657217005,0.954685754941,0.954714284102,0.954742804488,0.954771316097,0.954799818931,0.954828312988,0.954856798269,0.954885274772,0.954913742499,0.954942201448,0.95497065162,0.954999093014,0.95502752563,0.955055949467,0.955084364526,0.955112770805,0.955141168306,0.955169557027,0.955197936968,0.955226308129,0.955254670511,0.955283024111,0.955311368931,0.95533970497,0.955368032227,0.955396350703,0.955424660398,0.95545296131,0.95548125344,0.955509536787,0.955537811351,0.955566077133,0.955594334131,0.955622582345,0.955650821776,0.955679052422,0.955707274284,0.955735487361,0.955763691654,0.955791887161,0.955820073883,0.955848251819,0.955876420969,0.955904581333,0.95593273291,0.955960875701,0.955989009705,0.956017134921,0.95604525135,0.956073358991,0.956101457844,0.956129547909,0.956157629186,0.956185701673,0.956213765372,0.956241820281,0.956269866401,0.95629790373,0.95632593227,0.95635395202,0.956381962978,0.956409965146,0.956437958523,0.956465943109,0.956493918902,0.956521885904,0.956549844114,0.956577793531,0.956605734156,0.956633665988,0.956661589027,0.956689503272,0.956717408723,0.956745305381,0.956773193244,0.956801072313,0.956828942588,0.956856804067,0.956884656751,0.956912500639,0.956940335732,0.956968162029,0.95699597953,0.957023788234,0.957051588141,0.957079379251,0.957107161564,0.95713493508,0.957162699798,0.957190455717,0.957218202839,0.957245941162,0.957273670686,0.957301391411,0.957329103336,0.957356806463,0.957384500789,0.957412186315,0.957439863041,0.957467530967,0.957495190091,0.957522840414,0.957550481937,0.957578114657,0.957605738576,0.957633353692,0.957660960006,0.957688557518,0.957716146227,0.957743726132,0.957771297234,0.957798859533,0.957826413028,0.957853957718,0.957881493604,0.957909020686,0.957936538962,0.957964048434,0.9579915491,0.95801904096,0.958046524015,0.958073998263,0.958101463705,0.95812892034,0.958156368169,0.95818380719,0.958211237404,0.95823865881,0.958266071408,0.958293475198,0.95832087018,0.958348256352,0.958375633716,0.958403002271,0.958430362017,0.958457712952,0.958485055078,0.958512388394,0.958539712899,0.958567028593,0.958594335476,0.958621633549,0.95864892281,0.958676203259,0.958703474896,0.958730737721,0.958757991733,0.958785236933,0.95881247332,0.958839700894,0.958866919654,0.958894129601,0.958921330733,0.958948523052,0.958975706556,0.959002881245,0.959030047119,0.959057204178,0.959084352422,0.95911149185,0.959138622462,0.959165744258,0.959192857237,0.9592199614,0.959247056745,0.959274143274,0.959301220985,0.959328289878,0.959355349954,0.959382401211,0.95940944365,0.95943647727,0.959463502071,0.959490518053,0.959517525216,0.959544523559,0.959571513082,0.959598493785,0.959625465667,0.959652428729,0.95967938297,0.959706328389,0.959733264988,0.959760192764,0.959787111719,0.959814021851,0.959840923161,0.959867815649,0.959894699313,0.959921574155,0.959948440173,0.959975297367,0.960002145738,0.960028985284,0.960055816006,0.960082637903,0.960109450976,0.960136255223,0.960163050645,0.960189837241,0.960216615012,0.960243383956,0.960270144074,0.960296895366,0.96032363783,0.960350371468,0.960377096278,0.960403812261,0.960430519416,0.960457217742,0.960483907241,0.96051058791,0.960537259752,0.960563922763,0.960590576946,0.960617222299,0.960643858823,0.960670486516,0.960697105379,0.960723715411,0.960750316613,0.960776908984,0.960803492523,0.960830067231,0.960856633108,0.960883190152,0.960909738364,0.960936277743,0.96096280829,0.960989330004,0.961015842885,0.961042346932,0.961068842146,0.961095328525,0.96112180607,0.961148274781,0.961174734658,0.961201185699,0.961227627905,0.961254061276,0.961280485811,0.961306901511,0.961333308374,0.961359706401,0.961386095591,0.961412475944,0.96143884746,0.961465210139,0.961491563981,0.961517908984,0.961544245149,0.961570572477,0.961596890965,0.961623200615,0.961649501426,0.961675793397,0.961702076529,0.961728350821,0.961754616274,0.961780872885,0.961807120657,0.961833359588,0.961859589677,0.961885810926,0.961912023333,0.961938226899,0.961964421622,0.961990607503,0.962016784542,0.962042952739,0.962069112092,0.962095262602,0.962121404269,0.962147537092,0.962173661072,0.962199776207,0.962225882498,0.962251979944,0.962278068546,0.962304148302,0.962330219214,0.962356281279,0.962382334499,0.962408378873,0.962434414401,0.962460441082,0.962486458917,0.962512467904,0.962538468044,0.962564459337,0.962590441782,0.96261641538,0.962642380129,0.962668336029,0.962694283081,0.962720221284,0.962746150638,0.962772071143,0.962797982798,0.962823885603,0.962849779559,0.962875664663,0.962901540918,0.962927408321,0.962953266874,0.962979116575,0.963004957425,0.963030789423,0.963056612569,0.963082426863,0.963108232304,0.963134028893,0.963159816628,0.963185595511,0.96321136554,0.963237126716,0.963262879038,0.963288622505,0.963314357118,0.963340082877,0.963365799781,0.96339150783,0.963417207023,0.963442897361,0.963468578844,0.96349425147,0.96351991524,0.963545570153,0.96357121621,0.96359685341,0.963622481753,0.963648101238,0.963673711866,0.963699313636,0.963724906547,0.963750490601,0.963776065795,0.963801632131,0.963827189608,0.963852738226,0.963878277984,0.963903808882,0.96392933092,0.963954844098,0.963980348416,0.964005843873,0.964031330469,0.964056808204,0.964082277077,0.964107737089,0.964133188239,0.964158630526,0.964184063952,0.964209488515,0.964234904215,0.964260311052,0.964285709025,0.964311098136,0.964336478382,0.964361849765,0.964387212283,0.964412565937,0.964437910726,0.96446324665,0.964488573709,0.964513891903,0.964539201231,0.964564501694,0.96458979329,0.96461507602,0.964640349883,0.96466561488,0.964690871009,0.964716118272,0.964741356667,0.964766586194,0.964791806853,0.964817018645,0.964842221567,0.964867415622,0.964892600807,0.964917777123,0.96494294457,0.964968103147,0.964993252855,0.965018393692,0.96504352566,0.965068648757,0.965093762983,0.965118868338,0.965143964822,0.965169052435,0.965194131176,0.965219201045,0.965244262042,0.965269314167,0.965294357419,0.965319391798,0.965344417305,0.965369433938,0.965394441698,0.965419440584,0.965444430596,0.965469411734,0.965494383997,0.965519347386,0.9655443019,0.965569247539,0.965594184303,0.965619112191,0.965644031204,0.96566894134,0.9656938426,0.965718734984,0.965743618491,0.965768493121,0.965793358874,0.96581821575,0.965843063748,0.965867902868,0.96589273311,0.965917554474,0.965942366959,0.965967170566,0.965991965294,0.966016751142,0.966041528111,0.966066296201,0.96609105541,0.96611580574,0.966140547189,0.966165279758,0.966190003445,0.966214718252,0.966239424178,0.966264121222,0.966288809384,0.966313488665,0.966338159063,0.966362820579,0.966387473212,0.966412116963,0.96643675183,0.966461377814,0.966485994915,0.966510603132,0.966535202465,0.966559792914,0.966584374478,0.966608947158,0.966633510953,0.966658065863,0.966682611887,0.966707149026,0.966731677279,0.966756196647,0.966780707128,0.966805208722,0.96682970143,0.966854185251,0.966878660185,0.966903126232,0.966927583391,0.966952031662,0.966976471045,0.96700090154,0.967025323146,0.967049735864,0.967074139693,0.967098534633,0.967122920683,0.967147297844,0.967171666115,0.967196025496,0.967220375986,0.967244717586,0.967269050296,0.967293374114,0.967317689042,0.967341995078,0.967366292222,0.967390580475,0.967414859835,0.967439130304,0.96746339188,0.967487644563,0.967511888353,0.96753612325,0.967560349253,0.967584566363,0.967608774579,0.967632973902,0.967657164329,0.967681345863,0.967705518501,0.967729682245,0.967753837093,0.967777983047,0.967802120104,0.967826248266,0.967850367531,0.967874477901,0.967898579374,0.96792267195,0.967946755629,0.967970830411,0.967994896296,0.968018953283,0.968043001372,0.968067040563,0.968091070856,0.968115092251,0.968139104746,0.968163108343,0.968187103041,0.968211088839,0.968235065738,0.968259033737,0.968282992836,0.968306943034,0.968330884332,0.96835481673,0.968378740226,0.968402654822,0.968426560516,0.968450457308,0.968474345199,0.968498224188,0.968522094274,0.968545955458,0.96856980774,0.968593651118,0.968617485594,0.968641311166,0.968665127834,0.968688935599,0.96871273446,0.968736524416,0.968760305469,0.968784077616,0.968807840859,0.968831595196,0.968855340629,0.968879077155,0.968902804776,0.968926523492,0.9689502333,0.968973934203,0.968997626199,0.969021309288,0.96904498347,0.969068648745,0.969092305113,0.969115952572,0.969139591124,0.969163220768,0.969186841503,0.96921045333,0.969234056248,0.969257650257,0.969281235357,0.969304811547,0.969328378828,0.969351937199,0.969375486659,0.96939902721,0.96942255885,0.969446081579,0.969469595397,0.969493100305,0.9695165963,0.969540083385,0.969563561557,0.969587030817,0.969610491166,0.969633942601,0.969657385124,0.969680818734,0.969704243431,0.969727659215,0.969751066085,0.969774464042,0.969797853084,0.969821233213,0.969844604427,0.969867966726,0.969891320111,0.96991466458,0.969938000134,0.969961326773,0.969984644496,0.970007953303,0.970031253195,0.970054544169,0.970077826228,0.970101099369,0.970124363594,0.970147618901,0.970170865291,0.970194102763,0.970217331318,0.970240550955,0.970263761673,0.970286963473,0.970310156354,0.970333340316,0.970356515359,0.970379681483,0.970402838688,0.970425986972,0.970449126337,0.970472256781,0.970495378306,0.970518490909,0.970541594592,0.970564689354,0.970587775194,0.970610852113,0.970633920111,0.970656979186,0.97068002934,0.970703070571,0.97072610288,0.970749126266,0.970772140729,0.970795146269,0.970818142886,0.970841130579,0.970864109348,0.970887079193,0.970910040115,0.970932992111,0.970955935184,0.970978869331,0.971001794553,0.97102471085,0.971047618222,0.971070516668,0.971093406188,0.971116286782,0.97113915845,0.971162021191,0.971184875005,0.971207719893,0.971230555853,0.971253382887,0.971276200992,0.97129901017,0.97132181042,0.971344601741,0.971367384135,0.971390157599,0.971412922135,0.971435677742,0.97145842442,0.971481162168,0.971503890986,0.971526610875,0.971549321833,0.971572023862,0.97159471696,0.971617401127,0.971640076363,0.971662742668,0.971685400042,0.971708048484,0.971730687995,0.971753318574,0.97177594022,0.971798552934,0.971821156716,0.971843751564,0.97186633748,0.971888914463,0.971911482512,0.971934041628,0.97195659181,0.971979133057,0.972001665371,0.97202418875,0.972046703195,0.972069208704,0.972091705279,0.972114192918,0.972136671622,0.97215914139,0.972181602223,0.972204054119,0.972226497079,0.972248931102,0.972271356189,0.972293772339,0.972316179552,0.972338577827,0.972360967165,0.972383347565,0.972405719027,0.972428081552,0.972450435137,0.972472779784,0.972495115493,0.972517442262,0.972539760093,0.972562068983,0.972584368935,0.972606659946,0.972628942018,0.972651215149,0.97267347934,0.97269573459,0.9727179809,0.972740218268,0.972762446696,0.972784666182,0.972806876726,0.972829078328,0.972851270989,0.972873454707,0.972895629482,0.972917795315,0.972939952206,0.972962100153,0.972984239157,0.973006369217,0.973028490334,0.973050602507,0.973072705735,0.97309480002,0.97311688536,0.973138961755,0.973161029206,0.973183087711,0.973205137271,0.973227177886,0.973249209555,0.973271232278,0.973293246055,0.973315250885,0.973337246769,0.973359233707,0.973381211697,0.973403180741,0.973425140837,0.973447091985,0.973469034186,0.973490967439,0.973512891744,0.9735348071,0.973556713508,0.973578610967,0.973600499478,0.973622379039,0.973644249651,0.973666111313,0.973687964026,0.973709807788,0.973731642601,0.973753468463,0.973775285375,0.973797093336,0.973818892346,0.973840682405,0.973862463512,0.973884235668,0.973905998872,0.973927753125,0.973949498425,0.973971234773,0.973992962168,0.974014680611,0.9740363901,0.974058090637,0.97407978222,0.97410146485,0.974123138525,0.974144803247,0.974166459015,0.974188105829,0.974209743688,0.974231372592,0.974252992541,0.974274603536,0.974296205575,0.974317798658,0.974339382786,0.974360957957,0.974382524173,0.974404081432,0.974425629735,0.974447169081,0.97446869947,0.974490220902,0.974511733377,0.974533236894,0.974554731454,0.974576217056,0.974597693699,0.974619161384,0.974640620111,0.974662069879,0.974683510689,0.974704942539,0.974726365429,0.974747779361,0.974769184333,0.974790580344,0.974811967396,0.974833345488,0.974854714619,0.974876074789,0.974897425999,0.974918768247,0.974940101534,0.97496142586,0.974982741224,0.975004047627,0.975025345067,0.975046633545,0.975067913061,0.975089183614,0.975110445204,0.975131697831,0.975152941495,0.975174176196,0.975195401933,0.975216618706,0.975237826516,0.975259025361,0.975280215241,0.975301396158,0.975322568109,0.975343731095,0.975364885117,0.975386030173,0.975407166263,0.975428293388,0.975449411546,0.975470520739,0.975491620965,0.975512712225,0.975533794518,0.975554867844,0.975575932204,0.975596987595,0.97561803402,0.975639071476,0.975660099965,0.975681119486,0.975702130039,0.975723131623,0.975744124238,0.975765107885,0.975786082562,0.975807048271,0.975828005009,0.975848952779,0.975869891578,0.975890821408,0.975911742267,0.975932654156,0.975953557075,0.975974451022,0.975995335999,0.976016212005,0.976037079039,0.976057937102,0.976078786193,0.976099626312,0.976120457459,0.976141279634,0.976162092836,0.976182897066,0.976203692322,0.976224478606,0.976245255916,0.976266024253,0.976286783617,0.976307534006,0.976328275422,0.976349007863,0.97636973133,0.976390445822,0.97641115134,0.976431847883,0.97645253545,0.976473214042,0.976493883659,0.9765145443,0.976535195965,0.976555838653,0.976576472366,0.976597097102,0.976617712862,0.976638319644,0.97665891745,0.976679506278,0.976700086129,0.976720657002,0.976741218897,0.976761771815,0.976782315754,0.976802850715,0.976823376697,0.976843893701,0.976864401725,0.976884900771,0.976905390837,0.976925871924,0.976946344031,0.976966807158,0.976987261305,0.977007706471,0.977028142658,0.977048569863,0.977068988088,0.977089397332,0.977109797595,0.977130188876,0.977150571176,0.977170944494,0.97719130883,0.977211664184,0.977232010555,0.977252347944,0.977272676351,0.977292995774,0.977313306214,0.977333607671,0.977353900145,0.977374183635,0.977394458142,0.977414723664,0.977434980202,0.977455227756,0.977475466325,0.977495695909,0.977515916509,0.977536128123,0.977556330752,0.977576524396,0.977596709053,0.977616884725,0.977637051411,0.977657209111,0.977677357825,0.977697497551,0.977717628291,0.977737750044,0.97775786281,0.977777966588,0.977798061379,0.977818147183,0.977838223998,0.977858291825,0.977878350664,0.977898400515,0.977918441377,0.97793847325,0.977958496134,0.977978510029,0.977998514935,0.978018510851,0.978038497777,0.978058475713,0.978078444659,0.978098404615,0.978118355581,0.978138297556,0.97815823054,0.978178154533,0.978198069534,0.978217975545,0.978237872564,0.978257760591,0.978277639626,0.978297509669,0.97831737072,0.978337222778,0.978357065843,0.978376899916,0.978396724996,0.978416541082,0.978436348175,0.978456146275,0.978475935381,0.978495715492,0.97851548661,0.978535248733,0.978555001862,0.978574745997,0.978594481136,0.97861420728,0.978633924429,0.978653632583,0.978673331741,0.978693021904,0.97871270307,0.978732375241,0.978752038415,0.978771692592,0.978791337773,0.978810973957,0.978830601144,0.978850219334,0.978869828527,0.978889428721,0.978909019919,0.978928602118,0.978948175319,0.978967739522,0.978987294726,0.979006840932,0.979026378139,0.979045906347,0.979065425556,0.979084935765,0.979104436975,0.979123929185,0.979143412395,0.979162886606,0.979182351816,0.979201808025,0.979221255234,0.979240693442,0.979260122649,0.979279542855,0.97929895406,0.979318356263,0.979337749464,0.979357133664,0.979376508861,0.979395875057,0.97941523225,0.97943458044,0.979453919628,0.979473249812,0.979492570994,0.979511883172,0.979531186347,0.979550480518,0.979569765685,0.979589041849,0.979608309008,0.979627567163,0.979646816313,0.979666056459,0.979685287599,0.979704509735,0.979723722866,0.979742926991,0.97976212211,0.979781308224,0.979800485331,0.979819653433,0.979838812528,0.979857962617,0.9798771037,0.979896235775,0.979915358843,0.979934472905,0.979953577958,0.979972674005,0.979991761043,0.980010839074,0.980029908097,0.980048968112,0.980068019118,0.980087061115,0.980106094104,0.980125118084,0.980144133055,0.980163139016,0.980182135968,0.980201123911,0.980220102843,0.980239072766,0.980258033678,0.98027698558,0.980295928472,0.980314862353,0.980333787223,0.980352703082,0.98037160993,0.980390507767,0.980409396592,0.980428276405,0.980447147207,0.980466008996,0.980484861773,0.980503705538,0.98052254029,0.98054136603,0.980560182756,0.98057899047,0.98059778917,0.980616578857,0.98063535953,0.980654131189,0.980672893834,0.980691647465,0.980710392082,0.980729127685,0.980747854272,0.980766571845,0.980785280403,0.980803979946,0.980822670473,0.980841351985,0.980860024482,0.980878687962,0.980897342426,0.980915987874,0.980934624306,0.980953251721,0.98097187012,0.980990479502,0.981009079866,0.981027671213,0.981046253543,0.981064826856,0.98108339115,0.981101946427,0.981120492686,0.981139029926,0.981157558148,0.981176077352,0.981194587536,0.981213088702,0.981231580849,0.981250063976,0.981268538084,0.981287003172,0.981305459241,0.981323906289,0.981342344318,0.981360773326,0.981379193314,0.981397604281,0.981416006227,0.981434399152,0.981452783057,0.98147115794,0.981489523801,0.981507880641,0.981526228459,0.981544567255,0.981562897028,0.98158121778,0.981599529509,0.981617832215,0.981636125899,0.98165441056,0.981672686197,0.981690952811,0.981709210402,0.981727458969,0.981745698512,0.981763929031,0.981782150526,0.981800362996,0.981818566443,0.981836760864,0.981854946261,0.981873122632,0.981891289979,0.9819094483,0.981927597595,0.981945737865,0.98196386911,0.981981991328,0.98200010452,0.982018208685,0.982036303824,0.982054389937,0.982072467022,0.982090535081,0.982108594113,0.982126644117,0.982144685093,0.982162717042,0.982180739963,0.982198753856,0.982216758721,0.982234754558,0.982252741366,0.982270719146,0.982288687896,0.982306647618,0.982324598311,0.982342539974,0.982360472608,0.982378396212,0.982396310786,0.98241421633,0.982432112845,0.982450000328,0.982467878782,0.982485748205,0.982503608597,0.982521459958,0.982539302287,0.982557135586,0.982574959853,0.982592775089,0.982610581292,0.982628378464,0.982646166604,0.982663945711,0.982681715786,0.982699476829,0.982717228838,0.982734971815,0.982752705758,0.982770430669,0.982788146546,0.982805853389,0.982823551199,0.982841239974,0.982858919716,0.982876590423,0.982894252096,0.982911904735,0.982929548339,0.982947182908,0.982964808441,0.98298242494,0.983000032403,0.983017630831,0.983035220223,0.983052800579,0.983070371899,0.983087934184,0.983105487431,0.983123031642,0.983140566817,0.983158092955,0.983175610055,0.983193118119,0.983210617145,0.983228107134,0.983245588085,0.983263059999,0.983280522874,0.983297976712,0.983315421511,0.983332857272,0.983350283994,0.983367701677,0.983385110322,0.983402509927,0.983419900493,0.98343728202,0.983454654507,0.983472017955,0.983489372362,0.98350671773,0.983524054058,0.983541381345,0.983558699591,0.983576008797,0.983593308962,0.983610600087,0.98362788217,0.983645155211,0.983662419212,0.98367967417,0.983696920087,0.983714156962,0.983731384795,0.983748603586,0.983765813334,0.98378301404,0.983800205703,0.983817388323,0.9838345619,0.983851726434,0.983868881924,0.983886028371,0.983903165774,0.983920294134,0.983937413449,0.983954523721,0.983971624948,0.98398871713,0.984005800268,0.984022874361,0.98403993941,0.984056995413,0.984074042371,0.984091080283,0.98410810915,0.984125128972,0.984142139747,0.984159141476,0.98417613416,0.984193117797,0.984210092387,0.984227057931,0.984244014428,0.984260961878,0.98427790028,0.984294829636,0.984311749944,0.984328661205,0.984345563418,0.984362456583,0.984379340699,0.984396215768,0.984413081789,0.98442993876,0.984446786684,0.984463625558,0.984480455383,0.984497276159,0.984514087886,0.984530890564,0.984547684192,0.98456446877,0.984581244298,0.984598010776,0.984614768204,0.984631516582,0.984648255909,0.984664986185,0.984681707411,0.984698419586,0.984715122709,0.984731816781,0.984748501802,0.984765177771,0.984781844688,0.984798502554,0.984815151367,0.984831791128,0.984848421837,0.984865043494,0.984881656097,0.984898259648,0.984914854146,0.984931439591,0.984948015982,0.98496458332,0.984981141605,0.984997690835,0.985014231012,0.985030762135,0.985047284204,0.985063797218,0.985080301178,0.985096796083,0.985113281933,0.985129758728,0.985146226469,0.985162685154,0.985179134783,0.985195575357,0.985212006876,0.985228429338,0.985244842745,0.985261247095,0.985277642389,0.985294028626,0.985310405807,0.985326773932,0.985343132999,0.985359483009,0.985375823962,0.985392155858,0.985408478696,0.985424792476,0.985441097199,0.985457392864,0.98547367947,0.985489957018,0.985506225508,0.98552248494,0.985538735312,0.985554976626,0.985571208881,0.985587432076,0.985603646213,0.985619851289,0.985636047307,0.985652234264,0.985668412162,0.985684580999,0.985700740776,0.985716891493,0.98573303315,0.985749165746,0.985765289281,0.985781403755,0.985797509168,0.985813605519,0.98582969281,0.985845771038,0.985861840206,0.985877900311,0.985893951354,0.985909993335,0.985926026254,0.985942050111,0.985958064905,0.985974070636,0.985990067304,0.98600605491,0.986022033452,0.986038002931,0.986053963346,0.986069914698,0.986085856986,0.98610179021,0.986117714371,0.986133629467,0.986149535498,0.986165432465,0.986181320368,0.986197199206,0.986213068979,0.986228929686,0.986244781329,0.986260623906,0.986276457418,0.986292281864,0.986308097245,0.986323903559,0.986339700807,0.986355488989,0.986371268105,0.986387038154,0.986402799137,0.986418551053,0.986434293902,0.986450027683,0.986465752398,0.986481468045,0.986497174625,0.986512872136,0.986528560581,0.986544239957,0.986559910265,0.986575571505,0.986591223676,0.986606866779,0.986622500813,0.986638125778,0.986653741675,0.986669348502,0.98668494626,0.986700534949,0.986716114568,0.986731685117,0.986747246597,0.986762799007,0.986778342346,0.986793876615,0.986809401814,0.986824917943,0.986840425,0.986855922987,0.986871411903,0.986886891748,0.986902362521,0.986917824223,0.986933276854,0.986948720413,0.9869641549,0.986979580315,0.986994996658,0.987010403928,0.987025802127,0.987041191253,0.987056571306,0.987071942286,0.987087304193,0.987102657028,0.987118000789,0.987133335477,0.987148661091,0.987163977631,0.987179285098,0.987194583491,0.987209872809,0.987225153054,0.987240424224,0.987255686319,0.98727093934,0.987286183287,0.987301418158,0.987316643954,0.987331860675,0.987347068321,0.987362266891,0.987377456385,0.987392636804,0.987407808147,0.987422970414,0.987438123605,0.987453267719,0.987468402757,0.987483528718,0.987498645603,0.98751375341,0.987528852141,0.987543941794,0.987559022371,0.987574093869,0.987589156291,0.987604209634,0.9876192539,0.987634289087,0.987649315197,0.987664332228,0.987679340181,0.987694339055,0.987709328851,0.987724309568,0.987739281206,0.987754243765,0.987769197244,0.987784141645,0.987799076965,0.987814003206,0.987828920368,0.987843828449,0.987858727451,0.987873617372,0.987888498213,0.987903369973,0.987918232653,0.987933086252,0.98794793077,0.987962766207,0.987977592563,0.987992409838,0.988007218031,0.988022017143,0.988036807173,0.988051588122,0.988066359988,0.988081122772,0.988095876474,0.988110621094,0.988125356631,0.988140083086,0.988154800457,0.988169508746,0.988184207952,0.988198898075,0.988213579114,0.98822825107,0.988242913942,0.988257567731,0.988272212435,0.988286848056,0.988301474593,0.988316092045,0.988330700413,0.988345299697,0.988359889895,0.988374471009,0.988389043038,0.988403605982,0.988418159841,0.988432704615,0.988447240303,0.988461766905,0.988476284422,0.988490792853,0.988505292198,0.988519782456,0.988534263629,0.988548735715,0.988563198714,0.988577652627,0.988592097453,0.988606533192,0.988620959844,0.988635377409,0.988649785887,0.988664185277,0.98867857558,0.988692956794,0.988707328921,0.98872169196,0.988736045911,0.988750390774,0.988764726548,0.988779053234,0.988793370831,0.988807679339,0.988821978758,0.988836269089,0.98885055033,0.988864822482,0.988879085544,0.988893339517,0.9889075844,0.988921820194,0.988936046897,0.98895026451,0.988964473033,0.988978672466,0.988992862808,0.98900704406,0.989021216221,0.989035379291,0.98904953327,0.989063678158,0.989077813955,0.98909194066,0.989106058273,0.989120166796,0.989134266226,0.989148356564,0.989162437811,0.989176509965,0.989190573027,0.989204626996,0.989218671873,0.989232707657,0.989246734349,0.989260751947,0.989274760452,0.989288759865,0.989302750183,0.989316731409,0.989330703541,0.989344666579,0.989358620523,0.989372565373,0.989386501129,0.989400427791,0.989414345359,0.989428253832,0.989442153211,0.989456043494,0.989469924683,0.989483796777,0.989497659776,0.989511513679,0.989525358487,0.9895391942,0.989553020817,0.989566838338,0.989580646764,0.989594446093,0.989608236326,0.989622017463,0.989635789504,0.989649552448,0.989663306295,0.989677051046,0.989690786699,0.989704513256,0.989718230716,0.989731939078,0.989745638343,0.98975932851,0.98977300958,0.989786681552,0.989800344426,0.989813998202,0.989827642879,0.989841278459,0.98985490494,0.989868522322,0.989882130606,0.989895729791,0.989909319878,0.989922900865,0.989936472753,0.989950035542,0.989963589231,0.989977133821,0.989990669311,0.990004195701,0.990017712992,0.990031221182,0.990044720272,0.990058210262,0.990071691152,0.990085162941,0.990098625629,0.990112079217,0.990125523704,0.990138959089,0.990152385374,0.990165802557,0.990179210639,0.99019260962,0.990205999498,0.990219380275,0.99023275195,0.990246114523,0.990259467994,0.990272812363,0.99028614763,0.990299473793,0.990312790855,0.990326098813,0.990339397669,0.990352687421,0.990365968071,0.990379239617,0.99039250206,0.9904057554,0.990418999635,0.990432234768,0.990445460796,0.99045867772,0.99047188554,0.990485084256,0.990498273868,0.990511454375,0.990524625778,0.990537788076,0.990550941269,0.990564085358,0.990577220341,0.990590346219,0.990603462992,0.990616570659,0.990629669221,0.990642758677,0.990655839027,0.990668910272,0.99068197241,0.990695025443,0.990708069369,0.990721104188,0.990734129902,0.990747146508,0.990760154008,0.990773152401,0.990786141687,0.990799121866,0.990812092938,0.990825054902,0.990838007759,0.990850951508,0.99086388615,0.990876811684,0.99088972811,0.990902635428,0.990915533638,0.990928422739,0.990941302732,0.990954173617,0.990967035392,0.99097988806,0.990992731618,0.991005566067,0.991018391407,0.991031207638,0.99104401476,0.991056812772,0.991069601674,0.991082381467,0.99109515215,0.991107913723,0.991120666186,0.991133409539,0.991146143782,0.991158868914,0.991171584936,0.991184291847,0.991196989647,0.991209678336,0.991222357915,0.991235028382,0.991247689738,0.991260341983,0.991272985116,0.991285619138,0.991298244048,0.991310859846,0.991323466532,0.991336064107,0.991348652569,0.991361231919,0.991373802156,0.991386363281,0.991398915294,0.991411458193,0.99142399198,0.991436516654,0.991449032215,0.991461538662,0.991474035997,0.991486524218,0.991499003325,0.991511473319,0.991523934199,0.991536385965,0.991548828617,0.991561262155,0.991573686579,0.991586101888,0.991598508083,0.991610905163,0.991623293129,0.99163567198,0.991648041716,0.991660402337,0.991672753843,0.991685096234,0.991697429509,0.991709753669,0.991722068713,0.991734374642,0.991746671455,0.991758959152,0.991771237732,0.991783507197,0.991795767545,0.991808018777,0.991820260893,0.991832493892,0.991844717774,0.991856932539,0.991869138188,0.991881334719,0.991893522134,0.991905700431,0.99191786961,0.991930029672,0.991942180617,0.991954322444,0.991966455153,0.991978578744,0.991990693216,0.992002798571,0.992014894808,0.992026981926,0.992039059925,0.992051128806,0.992063188569,0.992075239212,0.992087280737,0.992099313142,0.992111336428,0.992123350596,0.992135355643,0.992147351571,0.99215933838,0.992171316069,0.992183284638,0.992195244087,0.992207194416,0.992219135625,0.992231067713,0.992242990681,0.992254904529,0.992266809256,0.992278704863,0.992290591348,0.992302468713,0.992314336957,0.992326196079,0.99233804608,0.99234988696,0.992361718719,0.992373541356,0.992385354871,0.992397159264,0.992408954536,0.992420740685,0.992432517713,0.992444285618,0.992456044401,0.992467794061,0.992479534599,0.992491266014,0.992502988306,0.992514701476,0.992526405522,0.992538100446,0.992549786246,0.992561462923,0.992573130476,0.992584788906,0.992596438213,0.992608078395,0.992619709454,0.992631331389,0.9926429442,0.992654547887,0.992666142449,0.992677727887,0.9926893042,0.992700871389,0.992712429454,0.992723978393,0.992735518208,0.992747048897,0.992758570462,0.992770082901,0.992781586215,0.992793080403,0.992804565466,0.992816041403,0.992827508215,0.9928389659,0.99285041446,0.992861853893,0.992873284201,0.992884705382,0.992896117437,0.992907520365,0.992918914167,0.992930298842,0.99294167439,0.992953040811,0.992964398105,0.992975746273,0.992987085312,0.992998415225,0.99300973601,0.993021047668,0.993032350198,0.9930436436,0.993054927875,0.993066203021,0.993077469039,0.99308872593,0.993099973692,0.993111212325,0.99312244183,0.993133662207,0.993144873455,0.993156075574,0.993167268564,0.993178452426,0.993189627158,0.993200792761,0.993211949235,0.993223096579,0.993234234794,0.993245363879,0.993256483835,0.993267594661,0.993278696356,0.993289788922,0.993300872358,0.993311946664,0.993323011839,0.993334067884,0.993345114798,0.993356152582,0.993367181235,0.993378200757,0.993389211148,0.993400212408,0.993411204537,0.993422187535,0.993433161402,0.993444126137,0.993455081741,0.993466028213,0.993476965553,0.993487893761,0.993498812838,0.993509722782,0.993520623595,0.993531515275,0.993542397822,0.993553271238,0.993564135521,0.993574990671,0.993585836688,0.993596673573,0.993607501325,0.993618319943,0.993629129429,0.993639929781,0.993650721,0.993661503086,0.993672276038,0.993683039856,0.993693794541,0.993704540092,0.993715276509,0.993726003792,0.993736721941,0.993747430955,0.993758130836,0.993768821582,0.993779503193,0.99379017567,0.993800839012,0.993811493219,0.993822138292,0.993832774229,0.993843401031,0.993854018698,0.99386462723,0.993875226626,0.993885816887,0.993896398013,0.993906970002,0.993917532856,0.993928086574,0.993938631156,0.993949166602,0.993959692912,0.993970210085,0.993980718123,0.993991217023,0.994001706787,0.994012187415,0.994022658906,0.99403312126,0.994043574477,0.994054018557,0.994064453499,0.994074879305,0.994085295973,0.994095703504,0.994106101897,0.994116491153,0.994126871271,0.994137242251,0.994147604093,0.994157956798,0.994168300364,0.994178634792,0.994188960082,0.994199276233,0.994209583246,0.994219881121,0.994230169856,0.994240449453,0.994250719911,0.99426098123,0.994271233411,0.994281476452,0.994291710353,0.994301935116,0.994312150739,0.994322357223,0.994332554567,0.994342742771,0.994352921835,0.99436309176,0.994373252545,0.994383404189,0.994393546694,0.994403680058,0.994413804281,0.994423919365,0.994434025308,0.99444412211,0.994454209771,0.994464288292,0.994474357672,0.994484417911,0.994494469008,0.994504510965,0.99451454378,0.994524567454,0.994534581987,0.994544587377,0.994554583627,0.994564570734,0.9945745487,0.994584517524,0.994594477206,0.994604427745,0.994614369143,0.994624301398,0.994634224511,0.994644138481,0.994654043309,0.994663938994,0.994673825536,0.994683702936,0.994693571193,0.994703430306,0.994713280277,0.994723121104,0.994732952788,0.994742775329,0.994752588726,0.99476239298,0.99477218809,0.994781974057,0.994791750879,0.994801518558,0.994811277092,0.994821026483,0.994830766729,0.994840497831,0.994850219789,0.994859932602,0.994869636271,0.994879330795,0.994889016174,0.994898692409,0.994908359498,0.994918017443,0.994927666243,0.994937305897,0.994946936406,0.99495655777,0.994966169989,0.994975773061,0.994985366989,0.99499495177,0.995004527406,0.995014093896,0.99502365124,0.995033199438,0.99504273849,0.995052268396,0.995061789155,0.995071300768,0.995080803234,0.995090296554,0.995099780727,0.995109255754,0.995118721633,0.995128178366,0.995137625952,0.99514706439,0.995156493682,0.995165913826,0.995175324823,0.995184726672,0.995194119374,0.995203502928,0.995212877335,0.995222242594,0.995231598705,0.995240945667,0.995250283482,0.995259612149,0.995268931668,0.995278242038,0.99528754326,0.995296835333,0.995306118258,0.995315392034,0.995324656662,0.99533391214,0.99534315847,0.995352395651,0.995361623683,0.995370842565,0.995380052299,0.995389252883,0.995398444317,0.995407626603,0.995416799738,0.995425963724,0.99543511856,0.995444264247,0.995453400783,0.995462528169,0.995471646406,0.995480755492,0.995489855428,0.995498946213,0.995508027849,0.995517100333,0.995526163668,0.995535217851,0.995544262884,0.995553298766,0.995562325497,0.995571343077,0.995580351506,0.995589350783,0.99559834091,0.995607321885,0.995616293709,0.995625256381,0.995634209902,0.995643154271,0.995652089488,0.995661015554,0.995669932467,0.995678840229,0.995687738838,0.995696628296,0.995705508601,0.995714379754,0.995723241754,0.995732094602,0.995740938298,0.99574977284,0.99575859823,0.995767414468,0.995776221552,0.995785019483,0.995793808262,0.995802587887,0.995811358359,0.995820119678,0.995828871843,0.995837614855,0.995846348714,0.995855073419,0.99586378897,0.995872495367,0.995881192611,0.9958898807,0.995898559636,0.995907229417,0.995915890045,0.995924541518,0.995933183837,0.995941817001,0.995950441011,0.995959055866,0.995967661567,0.995976258113,0.995984845504,0.99599342374,0.996001992822,0.996010552748,0.996019103519,0.996027645135,0.996036177596,0.996044700901,0.996053215051,0.996061720046,0.996070215884,0.996078702568,0.996087180095,0.996095648467,0.996104107682,0.996112557742,0.996120998646,0.996129430393,0.996137852985,0.99614626642,0.996154670699,0.996163065821,0.996171451787,0.996179828596,0.996188196248,0.996196554744,0.996204904083,0.996213244265,0.99622157529,0.996229897158,0.996238209869,0.996246513422,0.996254807819,0.996263093058,0.996271369139,0.996279636063,0.99628789383,0.996296142438,0.99630438189,0.996312612183,0.996320833318,0.996329045295,0.996337248115,0.996345441776,0.996353626279,0.996361801624,0.99636996781,0.996378124838,0.996386272708,0.996394411419,0.996402540971,0.996410661364,0.996418772599,0.996426874675,0.996434967592,0.99644305135,0.996451125949,0.996459191389,0.996467247669,0.99647529479,0.996483332752,0.996491361554,0.996499381197,0.99650739168,0.996515393004,0.996523385167,0.996531368171,0.996539342015,0.996547306699,0.996555262223,0.996563208587,0.996571145791,0.996579073834,0.996586992717,0.99659490244,0.996602803002,0.996610694403,0.996618576644,0.996626449724,0.996634313644,0.996642168402,0.996650014,0.996657850437,0.996665677712,0.996673495827,0.99668130478,0.996689104572,0.996696895203,0.996704676672,0.99671244898,0.996720212126,0.996727966111,0.996735710933,0.996743446594,0.996751173094,0.996758890431,0.996766598606,0.996774297619,0.99678198747,0.996789668159,0.996797339686,0.99680500205,0.996812655252,0.996820299291,0.996827934168,0.996835559882,0.996843176434,0.996850783822,0.996858382048,0.996865971111,0.996873551011,0.996881121748,0.996888683322,0.996896235732,0.99690377898,0.996911313064,0.996918837984,0.996926353741,0.996933860335,0.996941357765,0.996948846031,0.996956325134,0.996963795073,0.996971255848,0.996978707459,0.996986149906,0.996993583189,0.997001007307,0.997008422262,0.997015828052,0.997023224678,0.997030612139,0.997037990436,0.997045359569,0.997052719536,0.997060070339,0.997067411978,0.997074744451,0.99708206776,0.997089381903,0.997096686882,0.997103982696,0.997111269344,0.997118546827,0.997125815145,0.997133074297,0.997140324284,0.997147565106,0.997154796762,0.997162019252,0.997169232576,0.997176436735,0.997183631728,0.997190817555,0.997197994217,0.997205161712,0.997212320041,0.997219469204,0.9972266092,0.99723374003,0.997240861694,0.997247974192,0.997255077523,0.997262171688,0.997269256685,0.997276332517,0.997283399181,0.997290456679,0.997297505009,0.997304544173,0.99731157417,0.997318595,0.997325606662,0.997332609158,0.997339602486,0.997346586647,0.99735356164,0.997360527466,0.997367484124,0.997374431615,0.997381369938,0.997388299094,0.997395219081,0.997402129901,0.997409031553,0.997415924037,0.997422807353,0.997429681501,0.997436546481,0.997443402292,0.997450248935,0.99745708641,0.997463914716,0.997470733854,0.997477543824,0.997484344624,0.997491136257,0.99749791872,0.997504692015,0.99751145614,0.997518211097,0.997524956885,0.997531693504,0.997538420954,0.997545139234,0.997551848346,0.997558548288,0.99756523906,0.997571920664,0.997578593098,0.997585256362,0.997591910457,0.997598555382,0.997605191137,0.997611817723,0.997618435139,0.997625043384,0.99763164246,0.997638232366,0.997644813102,0.997651384668,0.997657947063,0.997664500289,0.997671044343,0.997677579228,0.997684104942,0.997690621486,0.997697128859,0.997703627061,0.997710116093,0.997716595954,0.997723066644,0.997729528164,0.997735980512,0.997742423689,0.997748857696,0.997755282531,0.997761698195,0.997768104688,0.99777450201,0.997780890161,0.99778726914,0.997793638947,0.997799999583,0.997806351048,0.99781269334,0.997819026462,0.997825350411,0.997831665189,0.997837970795,0.997844267228,0.99785055449,0.99785683258,0.997863101498,0.997869361244,0.997875611817,0.997881853218,0.997888085447,0.997894308504,0.997900522388,0.997906727099,0.997912922638,0.997919109005,0.997925286199,0.99793145422,0.997937613068,0.997943762743,0.997949903246,0.997956034576,0.997962156732,0.997968269716,0.997974373526,0.997980468164,0.997986553628,0.997992629919,0.997998697036,0.99800475498,0.998010803751,0.998016843348,0.998022873771,0.998028895021,0.998034907098,0.99804091,0.998046903729,0.998052888284,0.998058863665,0.998064829872,0.998070786905,0.998076734765,0.99808267345,0.99808860296,0.998094523297,0.998100434459,0.998106336447,0.998112229261,0.9981181129,0.998123987365,0.998129852655,0.998135708771,0.998141555712,0.998147393478,0.998153222069,0.998159041486,0.998164851728,0.998170652795,0.998176444686,0.998182227403,0.998188000945,0.998193765312,0.998199520503,0.99820526652,0.99821100336,0.998216731026,0.998222449516,0.998228158831,0.99823385897,0.998239549934,0.998245231722,0.998250904335,0.998256567771,0.998262222032,0.998267867118,0.998273503027,0.99827912976,0.998284747318,0.998290355699,0.998295954905,0.998301544934,0.998307125787,0.998312697464,0.998318259964,0.998323813289,0.998329357436,0.998334892408,0.998340418203,0.998345934821,0.998351442263,0.998356940528,0.998362429617,0.998367909529,0.998373380264,0.998378841822,0.998384294203,0.998389737407,0.998395171435,0.998400596285,0.998406011958,0.998411418454,0.998416815773,0.998422203915,0.998427582879,0.998432952667,0.998438313276,0.998443664708,0.998449006963,0.998454340041,0.99845966394,0.998464978662,0.998470284207,0.998475580573,0.998480867762,0.998486145773,0.998491414606,0.998496674262,0.998501924739,0.998507166038,0.99851239816,0.998517621103,0.998522834868,0.998528039454,0.998533234863,0.998538421093,0.998543598145,0.998548766018,0.998553924713,0.99855907423,0.998564214568,0.998569345727,0.998574467708,0.99857958051,0.998584684133,0.998589778578,0.998594863843,0.99859993993,0.998605006838,0.998610064567,0.998615113117,0.998620152488,0.99862518268,0.998630203693,0.998635215526,0.99864021818,0.998645211655,0.998650195951,0.998655171067,0.998660137004,0.998665093761,0.998670041339,0.998674979737,0.998679908956,0.998684828995,0.998689739854,0.998694641534,0.998699534034,0.998704417353,0.998709291494,0.998714156454,0.998719012234,0.998723858834,0.998728696254,0.998733524494,0.998738343554,0.998743153434,0.998747954133,0.998752745652,0.998757527991,0.99876230115,0.998767065128,0.998771819925,0.998776565542,0.998781301979,0.998786029235,0.99879074731,0.998795456205,0.998800155919,0.998804846452,0.998809527805,0.998814199976,0.998818862967,0.998823516777,0.998828161406,0.998832796854,0.99883742312,0.998842040206,0.99884664811,0.998851246834,0.998855836376,0.998860416737,0.998864987916,0.998869549914,0.998874102731,0.998878646366,0.99888318082,0.998887706093,0.998892222183,0.998896729092,0.99890122682,0.998905715366,0.99891019473,0.998914664912,0.998919125913,0.998923577731,0.998928020368,0.998932453823,0.998936878096,0.998941293187,0.998945699096,0.998950095822,0.998954483367,0.998958861729,0.99896323091,0.998967590908,0.998971941723,0.998976283356,0.998980615807,0.998984939076,0.998989253162,0.998993558066,0.998997853787,0.999002140325,0.999006417681,0.999010685854,0.999014944845,0.999019194652,0.999023435277,0.99902766672,0.999031888979,0.999036102055,0.999040305949,0.999044500659,0.999048686187,0.999052862532,0.999057029693,0.999061187671,0.999065336466,0.999069476078,0.999073606507,0.999077727753,0.999081839815,0.999085942694,0.999090036389,0.999094120901,0.99909819623,0.999102262375,0.999106319336,0.999110367114,0.999114405709,0.999118435119,0.999122455346,0.99912646639,0.999130468249,0.999134460925,0.999138444417,0.999142418725,0.999146383849,0.999150339789,0.999154286545,0.999158224118,0.999162152506,0.99916607171,0.99916998173,0.999173882566,0.999177774217,0.999181656685,0.999185529968,0.999189394067,0.999193248981,0.999197094711,0.999200931257,0.999204758618,0.999208576795,0.999212385787,0.999216185595,0.999219976218,0.999223757657,0.999227529911,0.99923129298,0.999235046865,0.999238791564,0.999242527079,0.999246253409,0.999249970555,0.999253678515,0.999257377291,0.999261066881,0.999264747287,0.999268418507,0.999272080543,0.999275733393,0.999279377058,0.999283011538,0.999286636833,0.999290252943,0.999293859867,0.999297457606,0.99930104616,0.999304625528,0.999308195711,0.999311756709,0.999315308521,0.999318851147,0.999322384588,0.999325908844,0.999329423914,0.999332929798,0.999336426497,0.99933991401,0.999343392337,0.999346861478,0.999350321434,0.999353772204,0.999357213788,0.999360646186,0.999364069399,0.999367483425,0.999370888265,0.99937428392,0.999377670388,0.99938104767,0.999384415766,0.999387774676,0.9993911244,0.999394464938,0.99939779629,0.999401118455,0.999404431434,0.999407735226,0.999411029833,0.999414315253,0.999417591486,0.999420858533,0.999424116394,0.999427365068,0.999430604555,0.999433834857,0.999437055971,0.999440267899,0.99944347064,0.999446664195,0.999449848562,0.999453023744,0.999456189738,0.999459346546,0.999462494166,0.9994656326,0.999468761847,0.999471881907,0.999474992781,0.999478094467,0.999481186966,0.999484270278,0.999487344404,0.999490409342,0.999493465093,0.999496511657,0.999499549033,0.999502577223,0.999505596225,0.99950860604,0.999511606668,0.999514598109,0.999517580362,0.999520553428,0.999523517306,0.999526471997,0.999529417501,0.999532353817,0.999535280946,0.999538198887,0.999541107641,0.999544007207,0.999546897585,0.999549778776,0.999552650779,0.999555513595,0.999558367223,0.999561211663,0.999564046915,0.99956687298,0.999569689857,0.999572497546,0.999575296047,0.99957808536,0.999580865485,0.999583636423,0.999586398172,0.999589150734,0.999591894107,0.999594628292,0.99959735329,0.999600069099,0.99960277572,0.999605473153,0.999608161398,0.999610840455,0.999613510323,0.999616171003,0.999618822495,0.999621464799,0.999624097914,0.999626721841,0.99962933658,0.99963194213,0.999634538492,0.999637125666,0.999639703651,0.999642272447,0.999644832055,0.999647382475,0.999649923706,0.999652455748,0.999654978602,0.999657492267,0.999659996744,0.999662492032,0.999664978131,0.999667455042,0.999669922763,0.999672381297,0.999674830641,0.999677270796,0.999679701763,0.999682123541,0.99968453613,0.99968693953,0.999689333741,0.999691718763,0.999694094597,0.999696461241,0.999698818696,0.999701166963,0.99970350604,0.999705835928,0.999708156627,0.999710468137,0.999712770458,0.99971506359,0.999717347532,0.999719622286,0.99972188785,0.999724144225,0.999726391411,0.999728629407,0.999730858214,0.999733077832,0.999735288261,0.9997374895,0.999739681549,0.99974186441,0.999744038081,0.999746202562,0.999748357855,0.999750503957,0.99975264087,0.999754768594,0.999756887128,0.999758996472,0.999761096627,0.999763187593,0.999765269369,0.999767341955,0.999769405351,0.999771459558,0.999773504575,0.999775540403,0.99977756704,0.999779584488,0.999781592747,0.999783591815,0.999785581694,0.999787562382,0.999789533881,0.999791496191,0.99979344931,0.999795393239,0.999797327979,0.999799253528,0.999801169888,0.999803077058,0.999804975037,0.999806863827,0.999808743427,0.999810613836,0.999812475056,0.999814327085,0.999816169925,0.999818003574,0.999819828034,0.999821643303,0.999823449382,0.99982524627,0.999827033969,0.999828812478,0.999830581796,0.999832341924,0.999834092862,0.999835834609,0.999837567166,0.999839290533,0.99984100471,0.999842709696,0.999844405492,0.999846092098,0.999847769513,0.999849437738,0.999851096772,0.999852746616,0.99985438727,0.999856018733,0.999857641006,0.999859254088,0.99986085798,0.999862452681,0.999864038192,0.999865614512,0.999867181641,0.999868739581,0.999870288329,0.999871827887,0.999873358254,0.999874879431,0.999876391417,0.999877894212,0.999879387817,0.999880872231,0.999882347454,0.999883813487,0.999885270329,0.99988671798,0.99988815644,0.99988958571,0.999891005789,0.999892416677,0.999893818374,0.999895210881,0.999896594197,0.999897968321,0.999899333256,0.999900688999,0.999902035551,0.999903372912,0.999904701083,0.999906020062,0.999907329851,0.999908630449,0.999909921856,0.999911204071,0.999912477096,0.99991374093,0.999914995573,0.999916241025,0.999917477286,0.999918704356,0.999919922235,0.999921130922,0.999922330419,0.999923520725,0.999924701839,0.999925873763,0.999927036495,0.999928190036,0.999929334386,0.999930469545,0.999931595513,0.99993271229,0.999933819875,0.99993491827,0.999936007473,0.999937087485,0.999938158305,0.999939219935,0.999940272373,0.99994131562,0.999942349676,0.999943374541,0.999944390214,0.999945396696,0.999946393987,0.999947382086,0.999948360994,0.999949330711,0.999950291236,0.999951242571,0.999952184714,0.999953117665,0.999954041425,0.999954955994,0.999955861371,0.999956757557,0.999957644552,0.999958522355,0.999959390967,0.999960250387,0.999961100616,0.999961941654,0.9999627735,0.999963596155,0.999964409618,0.99996521389,0.99996600897,0.999966794859,0.999967571556,0.999968339062,0.999969097377,0.9999698465,0.999970586431,0.999971317171,0.999972038719,0.999972751076,0.999973454241,0.999974148215,0.999974832997,0.999975508588,0.999976174987,0.999976832194,0.99997748021,0.999978119035,0.999978748667,0.999979369109,0.999979980358,0.999980582416,0.999981175283,0.999981758957,0.999982333441,0.999982898732,0.999983454832,0.99998400174,0.999984539457,0.999985067982,0.999985587315,0.999986097457,0.999986598407,0.999987090165,0.999987572732,0.999988046107,0.99998851029,0.999988965282,0.999989411082,0.99998984769,0.999990275107,0.999990693332,0.999991102365,0.999991502206,0.999991892856,0.999992274314,0.999992646581,0.999993009655,0.999993363538,0.99999370823,0.999994043729,0.999994370037,0.999994687153,0.999994995077,0.99999529381,0.99999558335,0.999995863699,0.999996134857,0.999996396822,0.999996649596,0.999996893178,0.999997127568,0.999997352767,0.999997568774,0.999997775589,0.999997973212,0.999998161643,0.999998340883,0.999998510931,0.999998671787,0.999998823452,0.999998965924,0.999999099205,0.999999223294,0.999999338192,0.999999443897,0.999999540411,0.999999627733,0.999999705863,0.999999774801,0.999999834548,0.999999885103,0.999999926466,0.999999958637,0.999999981616,0.999999995404,1.0,0.999999995404,0.999999981616,0.999999958637,0.999999926466,0.999999885103,0.999999834548,0.999999774801,0.999999705863,0.999999627733,0.999999540411,0.999999443897,0.999999338192,0.999999223294,0.999999099205,0.999998965924,0.999998823452,0.999998671787,0.999998510931,0.999998340883,0.999998161643,0.999997973212,0.999997775589,0.999997568774,0.999997352767,0.999997127568,0.999996893178,0.999996649596,0.999996396822,0.999996134857,0.999995863699,0.99999558335,0.99999529381,0.999994995077,0.999994687153,0.999994370037,0.999994043729,0.99999370823,0.999993363538,0.999993009655,0.999992646581,0.999992274314,0.999991892856,0.999991502206,0.999991102365,0.999990693332,0.999990275107,0.99998984769,0.999989411082,0.999988965282,0.99998851029,0.999988046107,0.999987572732,0.999987090165,0.999986598407,0.999986097457,0.999985587315,0.999985067982,0.999984539457,0.99998400174,0.999983454832,0.999982898732,0.999982333441,0.999981758957,0.999981175283,0.999980582416,0.999979980358,0.999979369109,0.999978748667,0.999978119035,0.99997748021,0.999976832194,0.999976174987,0.999975508588,0.999974832997,0.999974148215,0.999973454241,0.999972751076,0.999972038719,0.999971317171,0.999970586431,0.9999698465,0.999969097377,0.999968339062,0.999967571556,0.999966794859,0.99996600897,0.99996521389,0.999964409618,0.999963596155,0.9999627735,0.999961941654,0.999961100616,0.999960250387,0.999959390967,0.999958522355,0.999957644552,0.999956757557,0.999955861371,0.999954955994,0.999954041425,0.999953117665,0.999952184714,0.999951242571,0.999950291236,0.999949330711,0.999948360994,0.999947382086,0.999946393987,0.999945396696,0.999944390214,0.999943374541,0.999942349676,0.99994131562,0.999940272373,0.999939219935,0.999938158305,0.999937087485,0.999936007473,0.99993491827,0.999933819875,0.99993271229,0.999931595513,0.999930469545,0.999929334386,0.999928190036,0.999927036495,0.999925873763,0.999924701839,0.999923520725,0.999922330419,0.999921130922,0.999919922235,0.999918704356,0.999917477286,0.999916241025,0.999914995573,0.99991374093,0.999912477096,0.999911204071,0.999909921856,0.999908630449,0.999907329851,0.999906020062,0.999904701083,0.999903372912,0.999902035551,0.999900688999,0.999899333256,0.999897968321,0.999896594197,0.999895210881,0.999893818374,0.999892416677,0.999891005789,0.99988958571,0.99988815644,0.99988671798,0.999885270329,0.999883813487,0.999882347454,0.999880872231,0.999879387817,0.999877894212,0.999876391417,0.999874879431,0.999873358254,0.999871827887,0.999870288329,0.999868739581,0.999867181641,0.999865614512,0.999864038192,0.999862452681,0.99986085798,0.999859254088,0.999857641006,0.999856018733,0.99985438727,0.999852746616,0.999851096772,0.999849437738,0.999847769513,0.999846092098,0.999844405492,0.999842709696,0.99984100471,0.999839290533,0.999837567166,0.999835834609,0.999834092862,0.999832341924,0.999830581796,0.999828812478,0.999827033969,0.99982524627,0.999823449382,0.999821643303,0.999819828034,0.999818003574,0.999816169925,0.999814327085,0.999812475056,0.999810613836,0.999808743427,0.999806863827,0.999804975037,0.999803077058,0.999801169888,0.999799253528,0.999797327979,0.999795393239,0.99979344931,0.999791496191,0.999789533881,0.999787562382,0.999785581694,0.999783591815,0.999781592747,0.999779584488,0.99977756704,0.999775540403,0.999773504575,0.999771459558,0.999769405351,0.999767341955,0.999765269369,0.999763187593,0.999761096627,0.999758996472,0.999756887128,0.999754768594,0.99975264087,0.999750503957,0.999748357855,0.999746202562,0.999744038081,0.99974186441,0.999739681549,0.9997374895,0.999735288261,0.999733077832,0.999730858214,0.999728629407,0.999726391411,0.999724144225,0.99972188785,0.999719622286,0.999717347532,0.99971506359,0.999712770458,0.999710468137,0.999708156627,0.999705835928,0.99970350604,0.999701166963,0.999698818696,0.999696461241,0.999694094597,0.999691718763,0.999689333741,0.99968693953,0.99968453613,0.999682123541,0.999679701763,0.999677270796,0.999674830641,0.999672381297,0.999669922763,0.999667455042,0.999664978131,0.999662492032,0.999659996744,0.999657492267,0.999654978602,0.999652455748,0.999649923706,0.999647382475,0.999644832055,0.999642272447,0.999639703651,0.999637125666,0.999634538492,0.99963194213,0.99962933658,0.999626721841,0.999624097914,0.999621464799,0.999618822495,0.999616171003,0.999613510323,0.999610840455,0.999608161398,0.999605473153,0.99960277572,0.999600069099,0.99959735329,0.999594628292,0.999591894107,0.999589150734,0.999586398172,0.999583636423,0.999580865485,0.99957808536,0.999575296047,0.999572497546,0.999569689857,0.99956687298,0.999564046915,0.999561211663,0.999558367223,0.999555513595,0.999552650779,0.999549778776,0.999546897585,0.999544007207,0.999541107641,0.999538198887,0.999535280946,0.999532353817,0.999529417501,0.999526471997,0.999523517306,0.999520553428,0.999517580362,0.999514598109,0.999511606668,0.99950860604,0.999505596225,0.999502577223,0.999499549033,0.999496511657,0.999493465093,0.999490409342,0.999487344404,0.999484270278,0.999481186966,0.999478094467,0.999474992781,0.999471881907,0.999468761847,0.9994656326,0.999462494166,0.999459346546,0.999456189738,0.999453023744,0.999449848562,0.999446664195,0.99944347064,0.999440267899,0.999437055971,0.999433834857,0.999430604555,0.999427365068,0.999424116394,0.999420858533,0.999417591486,0.999414315253,0.999411029833,0.999407735226,0.999404431434,0.999401118455,0.99939779629,0.999394464938,0.9993911244,0.999387774676,0.999384415766,0.99938104767,0.999377670388,0.99937428392,0.999370888265,0.999367483425,0.999364069399,0.999360646186,0.999357213788,0.999353772204,0.999350321434,0.999346861478,0.999343392337,0.99933991401,0.999336426497,0.999332929798,0.999329423914,0.999325908844,0.999322384588,0.999318851147,0.999315308521,0.999311756709,0.999308195711,0.999304625528,0.99930104616,0.999297457606,0.999293859867,0.999290252943,0.999286636833,0.999283011538,0.999279377058,0.999275733393,0.999272080543,0.999268418507,0.999264747287,0.999261066881,0.999257377291,0.999253678515,0.999249970555,0.999246253409,0.999242527079,0.999238791564,0.999235046865,0.99923129298,0.999227529911,0.999223757657,0.999219976218,0.999216185595,0.999212385787,0.999208576795,0.999204758618,0.999200931257,0.999197094711,0.999193248981,0.999189394067,0.999185529968,0.999181656685,0.999177774217,0.999173882566,0.99916998173,0.99916607171,0.999162152506,0.999158224118,0.999154286545,0.999150339789,0.999146383849,0.999142418725,0.999138444417,0.999134460925,0.999130468249,0.99912646639,0.999122455346,0.999118435119,0.999114405709,0.999110367114,0.999106319336,0.999102262375,0.99909819623,0.999094120901,0.999090036389,0.999085942694,0.999081839815,0.999077727753,0.999073606507,0.999069476078,0.999065336466,0.999061187671,0.999057029693,0.999052862532,0.999048686187,0.999044500659,0.999040305949,0.999036102055,0.999031888979,0.99902766672,0.999023435277,0.999019194652,0.999014944845,0.999010685854,0.999006417681,0.999002140325,0.998997853787,0.998993558066,0.998989253162,0.998984939076,0.998980615807,0.998976283356,0.998971941723,0.998967590908,0.99896323091,0.998958861729,0.998954483367,0.998950095822,0.998945699096,0.998941293187,0.998936878096,0.998932453823,0.998928020368,0.998923577731,0.998919125913,0.998914664912,0.99891019473,0.998905715366,0.99890122682,0.998896729092,0.998892222183,0.998887706093,0.99888318082,0.998878646366,0.998874102731,0.998869549914,0.998864987916,0.998860416737,0.998855836376,0.998851246834,0.99884664811,0.998842040206,0.99883742312,0.998832796854,0.998828161406,0.998823516777,0.998818862967,0.998814199976,0.998809527805,0.998804846452,0.998800155919,0.998795456205,0.99879074731,0.998786029235,0.998781301979,0.998776565542,0.998771819925,0.998767065128,0.99876230115,0.998757527991,0.998752745652,0.998747954133,0.998743153434,0.998738343554,0.998733524494,0.998728696254,0.998723858834,0.998719012234,0.998714156454,0.998709291494,0.998704417353,0.998699534034,0.998694641534,0.998689739854,0.998684828995,0.998679908956,0.998674979737,0.998670041339,0.998665093761,0.998660137004,0.998655171067,0.998650195951,0.998645211655,0.99864021818,0.998635215526,0.998630203693,0.99862518268,0.998620152488,0.998615113117,0.998610064567,0.998605006838,0.99859993993,0.998594863843,0.998589778578,0.998584684133,0.99857958051,0.998574467708,0.998569345727,0.998564214568,0.99855907423,0.998553924713,0.998548766018,0.998543598145,0.998538421093,0.998533234863,0.998528039454,0.998522834868,0.998517621103,0.99851239816,0.998507166038,0.998501924739,0.998496674262,0.998491414606,0.998486145773,0.998480867762,0.998475580573,0.998470284207,0.998464978662,0.99845966394,0.998454340041,0.998449006963,0.998443664708,0.998438313276,0.998432952667,0.998427582879,0.998422203915,0.998416815773,0.998411418454,0.998406011958,0.998400596285,0.998395171435,0.998389737407,0.998384294203,0.998378841822,0.998373380264,0.998367909529,0.998362429617,0.998356940528,0.998351442263,0.998345934821,0.998340418203,0.998334892408,0.998329357436,0.998323813289,0.998318259964,0.998312697464,0.998307125787,0.998301544934,0.998295954905,0.998290355699,0.998284747318,0.99827912976,0.998273503027,0.998267867118,0.998262222032,0.998256567771,0.998250904335,0.998245231722,0.998239549934,0.99823385897,0.998228158831,0.998222449516,0.998216731026,0.99821100336,0.99820526652,0.998199520503,0.998193765312,0.998188000945,0.998182227403,0.998176444686,0.998170652795,0.998164851728,0.998159041486,0.998153222069,0.998147393478,0.998141555712,0.998135708771,0.998129852655,0.998123987365,0.9981181129,0.998112229261,0.998106336447,0.998100434459,0.998094523297,0.99808860296,0.99808267345,0.998076734765,0.998070786905,0.998064829872,0.998058863665,0.998052888284,0.998046903729,0.99804091,0.998034907098,0.998028895021,0.998022873771,0.998016843348,0.998010803751,0.99800475498,0.997998697036,0.997992629919,0.997986553628,0.997980468164,0.997974373526,0.997968269716,0.997962156732,0.997956034576,0.997949903246,0.997943762743,0.997937613068,0.99793145422,0.997925286199,0.997919109005,0.997912922638,0.997906727099,0.997900522388,0.997894308504,0.997888085447,0.997881853218,0.997875611817,0.997869361244,0.997863101498,0.99785683258,0.99785055449,0.997844267228,0.997837970795,0.997831665189,0.997825350411,0.997819026462,0.99781269334,0.997806351048,0.997799999583,0.997793638947,0.99778726914,0.997780890161,0.99777450201,0.997768104688,0.997761698195,0.997755282531,0.997748857696,0.997742423689,0.997735980512,0.997729528164,0.997723066644,0.997716595954,0.997710116093,0.997703627061,0.997697128859,0.997690621486,0.997684104942,0.997677579228,0.997671044343,0.997664500289,0.997657947063,0.997651384668,0.997644813102,0.997638232366,0.99763164246,0.997625043384,0.997618435139,0.997611817723,0.997605191137,0.997598555382,0.997591910457,0.997585256362,0.997578593098,0.997571920664,0.99756523906,0.997558548288,0.997551848346,0.997545139234,0.997538420954,0.997531693504,0.997524956885,0.997518211097,0.99751145614,0.997504692015,0.99749791872,0.997491136257,0.997484344624,0.997477543824,0.997470733854,0.997463914716,0.99745708641,0.997450248935,0.997443402292,0.997436546481,0.997429681501,0.997422807353,0.997415924037,0.997409031553,0.997402129901,0.997395219081,0.997388299094,0.997381369938,0.997374431615,0.997367484124,0.997360527466,0.99735356164,0.997346586647,0.997339602486,0.997332609158,0.997325606662,0.997318595,0.99731157417,0.997304544173,0.997297505009,0.997290456679,0.997283399181,0.997276332517,0.997269256685,0.997262171688,0.997255077523,0.997247974192,0.997240861694,0.99723374003,0.9972266092,0.997219469204,0.997212320041,0.997205161712,0.997197994217,0.997190817555,0.997183631728,0.997176436735,0.997169232576,0.997162019252,0.997154796762,0.997147565106,0.997140324284,0.997133074297,0.997125815145,0.997118546827,0.997111269344,0.997103982696,0.997096686882,0.997089381903,0.99708206776,0.997074744451,0.997067411978,0.997060070339,0.997052719536,0.997045359569,0.997037990436,0.997030612139,0.997023224678,0.997015828052,0.997008422262,0.997001007307,0.996993583189,0.996986149906,0.996978707459,0.996971255848,0.996963795073,0.996956325134,0.996948846031,0.996941357765,0.996933860335,0.996926353741,0.996918837984,0.996911313064,0.99690377898,0.996896235732,0.996888683322,0.996881121748,0.996873551011,0.996865971111,0.996858382048,0.996850783822,0.996843176434,0.996835559882,0.996827934168,0.996820299291,0.996812655252,0.99680500205,0.996797339686,0.996789668159,0.99678198747,0.996774297619,0.996766598606,0.996758890431,0.996751173094,0.996743446594,0.996735710933,0.996727966111,0.996720212126,0.99671244898,0.996704676672,0.996696895203,0.996689104572,0.99668130478,0.996673495827,0.996665677712,0.996657850437,0.996650014,0.996642168402,0.996634313644,0.996626449724,0.996618576644,0.996610694403,0.996602803002,0.99659490244,0.996586992717,0.996579073834,0.996571145791,0.996563208587,0.996555262223,0.996547306699,0.996539342015,0.996531368171,0.996523385167,0.996515393004,0.99650739168,0.996499381197,0.996491361554,0.996483332752,0.99647529479,0.996467247669,0.996459191389,0.996451125949,0.99644305135,0.996434967592,0.996426874675,0.996418772599,0.996410661364,0.996402540971,0.996394411419,0.996386272708,0.996378124838,0.99636996781,0.996361801624,0.996353626279,0.996345441776,0.996337248115,0.996329045295,0.996320833318,0.996312612183,0.99630438189,0.996296142438,0.99628789383,0.996279636063,0.996271369139,0.996263093058,0.996254807819,0.996246513422,0.996238209869,0.996229897158,0.99622157529,0.996213244265,0.996204904083,0.996196554744,0.996188196248,0.996179828596,0.996171451787,0.996163065821,0.996154670699,0.99614626642,0.996137852985,0.996129430393,0.996120998646,0.996112557742,0.996104107682,0.996095648467,0.996087180095,0.996078702568,0.996070215884,0.996061720046,0.996053215051,0.996044700901,0.996036177596,0.996027645135,0.996019103519,0.996010552748,0.996001992822,0.99599342374,0.995984845504,0.995976258113,0.995967661567,0.995959055866,0.995950441011,0.995941817001,0.995933183837,0.995924541518,0.995915890045,0.995907229417,0.995898559636,0.9958898807,0.995881192611,0.995872495367,0.99586378897,0.995855073419,0.995846348714,0.995837614855,0.995828871843,0.995820119678,0.995811358359,0.995802587887,0.995793808262,0.995785019483,0.995776221552,0.995767414468,0.99575859823,0.99574977284,0.995740938298,0.995732094602,0.995723241754,0.995714379754,0.995705508601,0.995696628296,0.995687738838,0.995678840229,0.995669932467,0.995661015554,0.995652089488,0.995643154271,0.995634209902,0.995625256381,0.995616293709,0.995607321885,0.99559834091,0.995589350783,0.995580351506,0.995571343077,0.995562325497,0.995553298766,0.995544262884,0.995535217851,0.995526163668,0.995517100333,0.995508027849,0.995498946213,0.995489855428,0.995480755492,0.995471646406,0.995462528169,0.995453400783,0.995444264247,0.99543511856,0.995425963724,0.995416799738,0.995407626603,0.995398444317,0.995389252883,0.995380052299,0.995370842565,0.995361623683,0.995352395651,0.99534315847,0.99533391214,0.995324656662,0.995315392034,0.995306118258,0.995296835333,0.99528754326,0.995278242038,0.995268931668,0.995259612149,0.995250283482,0.995240945667,0.995231598705,0.995222242594,0.995212877335,0.995203502928,0.995194119374,0.995184726672,0.995175324823,0.995165913826,0.995156493682,0.99514706439,0.995137625952,0.995128178366,0.995118721633,0.995109255754,0.995099780727,0.995090296554,0.995080803234,0.995071300768,0.995061789155,0.995052268396,0.99504273849,0.995033199438,0.99502365124,0.995014093896,0.995004527406,0.99499495177,0.994985366989,0.994975773061,0.994966169989,0.99495655777,0.994946936406,0.994937305897,0.994927666243,0.994918017443,0.994908359498,0.994898692409,0.994889016174,0.994879330795,0.994869636271,0.994859932602,0.994850219789,0.994840497831,0.994830766729,0.994821026483,0.994811277092,0.994801518558,0.994791750879,0.994781974057,0.99477218809,0.99476239298,0.994752588726,0.994742775329,0.994732952788,0.994723121104,0.994713280277,0.994703430306,0.994693571193,0.994683702936,0.994673825536,0.994663938994,0.994654043309,0.994644138481,0.994634224511,0.994624301398,0.994614369143,0.994604427745,0.994594477206,0.994584517524,0.9945745487,0.994564570734,0.994554583627,0.994544587377,0.994534581987,0.994524567454,0.99451454378,0.994504510965,0.994494469008,0.994484417911,0.994474357672,0.994464288292,0.994454209771,0.99444412211,0.994434025308,0.994423919365,0.994413804281,0.994403680058,0.994393546694,0.994383404189,0.994373252545,0.99436309176,0.994352921835,0.994342742771,0.994332554567,0.994322357223,0.994312150739,0.994301935116,0.994291710353,0.994281476452,0.994271233411,0.99426098123,0.994250719911,0.994240449453,0.994230169856,0.994219881121,0.994209583246,0.994199276233,0.994188960082,0.994178634792,0.994168300364,0.994157956798,0.994147604093,0.994137242251,0.994126871271,0.994116491153,0.994106101897,0.994095703504,0.994085295973,0.994074879305,0.994064453499,0.994054018557,0.994043574477,0.99403312126,0.994022658906,0.994012187415,0.994001706787,0.993991217023,0.993980718123,0.993970210085,0.993959692912,0.993949166602,0.993938631156,0.993928086574,0.993917532856,0.993906970002,0.993896398013,0.993885816887,0.993875226626,0.99386462723,0.993854018698,0.993843401031,0.993832774229,0.993822138292,0.993811493219,0.993800839012,0.99379017567,0.993779503193,0.993768821582,0.993758130836,0.993747430955,0.993736721941,0.993726003792,0.993715276509,0.993704540092,0.993693794541,0.993683039856,0.993672276038,0.993661503086,0.993650721,0.993639929781,0.993629129429,0.993618319943,0.993607501325,0.993596673573,0.993585836688,0.993574990671,0.993564135521,0.993553271238,0.993542397822,0.993531515275,0.993520623595,0.993509722782,0.993498812838,0.993487893761,0.993476965553,0.993466028213,0.993455081741,0.993444126137,0.993433161402,0.993422187535,0.993411204537,0.993400212408,0.993389211148,0.993378200757,0.993367181235,0.993356152582,0.993345114798,0.993334067884,0.993323011839,0.993311946664,0.993300872358,0.993289788922,0.993278696356,0.993267594661,0.993256483835,0.993245363879,0.993234234794,0.993223096579,0.993211949235,0.993200792761,0.993189627158,0.993178452426,0.993167268564,0.993156075574,0.993144873455,0.993133662207,0.99312244183,0.993111212325,0.993099973692,0.99308872593,0.993077469039,0.993066203021,0.993054927875,0.9930436436,0.993032350198,0.993021047668,0.99300973601,0.992998415225,0.992987085312,0.992975746273,0.992964398105,0.992953040811,0.99294167439,0.992930298842,0.992918914167,0.992907520365,0.992896117437,0.992884705382,0.992873284201,0.992861853893,0.99285041446,0.9928389659,0.992827508215,0.992816041403,0.992804565466,0.992793080403,0.992781586215,0.992770082901,0.992758570462,0.992747048897,0.992735518208,0.992723978393,0.992712429454,0.992700871389,0.9926893042,0.992677727887,0.992666142449,0.992654547887,0.9926429442,0.992631331389,0.992619709454,0.992608078395,0.992596438213,0.992584788906,0.992573130476,0.992561462923,0.992549786246,0.992538100446,0.992526405522,0.992514701476,0.992502988306,0.992491266014,0.992479534599,0.992467794061,0.992456044401,0.992444285618,0.992432517713,0.992420740685,0.992408954536,0.992397159264,0.992385354871,0.992373541356,0.992361718719,0.99234988696,0.99233804608,0.992326196079,0.992314336957,0.992302468713,0.992290591348,0.992278704863,0.992266809256,0.992254904529,0.992242990681,0.992231067713,0.992219135625,0.992207194416,0.992195244087,0.992183284638,0.992171316069,0.99215933838,0.992147351571,0.992135355643,0.992123350596,0.992111336428,0.992099313142,0.992087280737,0.992075239212,0.992063188569,0.992051128806,0.992039059925,0.992026981926,0.992014894808,0.992002798571,0.991990693216,0.991978578744,0.991966455153,0.991954322444,0.991942180617,0.991930029672,0.99191786961,0.991905700431,0.991893522134,0.991881334719,0.991869138188,0.991856932539,0.991844717774,0.991832493892,0.991820260893,0.991808018777,0.991795767545,0.991783507197,0.991771237732,0.991758959152,0.991746671455,0.991734374642,0.991722068713,0.991709753669,0.991697429509,0.991685096234,0.991672753843,0.991660402337,0.991648041716,0.99163567198,0.991623293129,0.991610905163,0.991598508083,0.991586101888,0.991573686579,0.991561262155,0.991548828617,0.991536385965,0.991523934199,0.991511473319,0.991499003325,0.991486524218,0.991474035997,0.991461538662,0.991449032215,0.991436516654,0.99142399198,0.991411458193,0.991398915294,0.991386363281,0.991373802156,0.991361231919,0.991348652569,0.991336064107,0.991323466532,0.991310859846,0.991298244048,0.991285619138,0.991272985116,0.991260341983,0.991247689738,0.991235028382,0.991222357915,0.991209678336,0.991196989647,0.991184291847,0.991171584936,0.991158868914,0.991146143782,0.991133409539,0.991120666186,0.991107913723,0.99109515215,0.991082381467,0.991069601674,0.991056812772,0.99104401476,0.991031207638,0.991018391407,0.991005566067,0.990992731618,0.99097988806,0.990967035392,0.990954173617,0.990941302732,0.990928422739,0.990915533638,0.990902635428,0.99088972811,0.990876811684,0.99086388615,0.990850951508,0.990838007759,0.990825054902,0.990812092938,0.990799121866,0.990786141687,0.990773152401,0.990760154008,0.990747146508,0.990734129902,0.990721104188,0.990708069369,0.990695025443,0.99068197241,0.990668910272,0.990655839027,0.990642758677,0.990629669221,0.990616570659,0.990603462992,0.990590346219,0.990577220341,0.990564085358,0.990550941269,0.990537788076,0.990524625778,0.990511454375,0.990498273868,0.990485084256,0.99047188554,0.99045867772,0.990445460796,0.990432234768,0.990418999635,0.9904057554,0.99039250206,0.990379239617,0.990365968071,0.990352687421,0.990339397669,0.990326098813,0.990312790855,0.990299473793,0.99028614763,0.990272812363,0.990259467994,0.990246114523,0.99023275195,0.990219380275,0.990205999498,0.99019260962,0.990179210639,0.990165802557,0.990152385374,0.990138959089,0.990125523704,0.990112079217,0.990098625629,0.990085162941,0.990071691152,0.990058210262,0.990044720272,0.990031221182,0.990017712992,0.990004195701,0.989990669311,0.989977133821,0.989963589231,0.989950035542,0.989936472753,0.989922900865,0.989909319878,0.989895729791,0.989882130606,0.989868522322,0.98985490494,0.989841278459,0.989827642879,0.989813998202,0.989800344426,0.989786681552,0.98977300958,0.98975932851,0.989745638343,0.989731939078,0.989718230716,0.989704513256,0.989690786699,0.989677051046,0.989663306295,0.989649552448,0.989635789504,0.989622017463,0.989608236326,0.989594446093,0.989580646764,0.989566838338,0.989553020817,0.9895391942,0.989525358487,0.989511513679,0.989497659776,0.989483796777,0.989469924683,0.989456043494,0.989442153211,0.989428253832,0.989414345359,0.989400427791,0.989386501129,0.989372565373,0.989358620523,0.989344666579,0.989330703541,0.989316731409,0.989302750183,0.989288759865,0.989274760452,0.989260751947,0.989246734349,0.989232707657,0.989218671873,0.989204626996,0.989190573027,0.989176509965,0.989162437811,0.989148356564,0.989134266226,0.989120166796,0.989106058273,0.98909194066,0.989077813955,0.989063678158,0.98904953327,0.989035379291,0.989021216221,0.98900704406,0.988992862808,0.988978672466,0.988964473033,0.98895026451,0.988936046897,0.988921820194,0.9889075844,0.988893339517,0.988879085544,0.988864822482,0.98885055033,0.988836269089,0.988821978758,0.988807679339,0.988793370831,0.988779053234,0.988764726548,0.988750390774,0.988736045911,0.98872169196,0.988707328921,0.988692956794,0.98867857558,0.988664185277,0.988649785887,0.988635377409,0.988620959844,0.988606533192,0.988592097453,0.988577652627,0.988563198714,0.988548735715,0.988534263629,0.988519782456,0.988505292198,0.988490792853,0.988476284422,0.988461766905,0.988447240303,0.988432704615,0.988418159841,0.988403605982,0.988389043038,0.988374471009,0.988359889895,0.988345299697,0.988330700413,0.988316092045,0.988301474593,0.988286848056,0.988272212435,0.988257567731,0.988242913942,0.98822825107,0.988213579114,0.988198898075,0.988184207952,0.988169508746,0.988154800457,0.988140083086,0.988125356631,0.988110621094,0.988095876474,0.988081122772,0.988066359988,0.988051588122,0.988036807173,0.988022017143,0.988007218031,0.987992409838,0.987977592563,0.987962766207,0.98794793077,0.987933086252,0.987918232653,0.987903369973,0.987888498213,0.987873617372,0.987858727451,0.987843828449,0.987828920368,0.987814003206,0.987799076965,0.987784141645,0.987769197244,0.987754243765,0.987739281206,0.987724309568,0.987709328851,0.987694339055,0.987679340181,0.987664332228,0.987649315197,0.987634289087,0.9876192539,0.987604209634,0.987589156291,0.987574093869,0.987559022371,0.987543941794,0.987528852141,0.98751375341,0.987498645603,0.987483528718,0.987468402757,0.987453267719,0.987438123605,0.987422970414,0.987407808147,0.987392636804,0.987377456385,0.987362266891,0.987347068321,0.987331860675,0.987316643954,0.987301418158,0.987286183287,0.98727093934,0.987255686319,0.987240424224,0.987225153054,0.987209872809,0.987194583491,0.987179285098,0.987163977631,0.987148661091,0.987133335477,0.987118000789,0.987102657028,0.987087304193,0.987071942286,0.987056571306,0.987041191253,0.987025802127,0.987010403928,0.986994996658,0.986979580315,0.9869641549,0.986948720413,0.986933276854,0.986917824223,0.986902362521,0.986886891748,0.986871411903,0.986855922987,0.986840425,0.986824917943,0.986809401814,0.986793876615,0.986778342346,0.986762799007,0.986747246597,0.986731685117,0.986716114568,0.986700534949,0.98668494626,0.986669348502,0.986653741675,0.986638125778,0.986622500813,0.986606866779,0.986591223676,0.986575571505,0.986559910265,0.986544239957,0.986528560581,0.986512872136,0.986497174625,0.986481468045,0.986465752398,0.986450027683,0.986434293902,0.986418551053,0.986402799137,0.986387038154,0.986371268105,0.986355488989,0.986339700807,0.986323903559,0.986308097245,0.986292281864,0.986276457418,0.986260623906,0.986244781329,0.986228929686,0.986213068979,0.986197199206,0.986181320368,0.986165432465,0.986149535498,0.986133629467,0.986117714371,0.98610179021,0.986085856986,0.986069914698,0.986053963346,0.986038002931,0.986022033452,0.98600605491,0.985990067304,0.985974070636,0.985958064905,0.985942050111,0.985926026254,0.985909993335,0.985893951354,0.985877900311,0.985861840206,0.985845771038,0.98582969281,0.985813605519,0.985797509168,0.985781403755,0.985765289281,0.985749165746,0.98573303315,0.985716891493,0.985700740776,0.985684580999,0.985668412162,0.985652234264,0.985636047307,0.985619851289,0.985603646213,0.985587432076,0.985571208881,0.985554976626,0.985538735312,0.98552248494,0.985506225508,0.985489957018,0.98547367947,0.985457392864,0.985441097199,0.985424792476,0.985408478696,0.985392155858,0.985375823962,0.985359483009,0.985343132999,0.985326773932,0.985310405807,0.985294028626,0.985277642389,0.985261247095,0.985244842745,0.985228429338,0.985212006876,0.985195575357,0.985179134783,0.985162685154,0.985146226469,0.985129758728,0.985113281933,0.985096796083,0.985080301178,0.985063797218,0.985047284204,0.985030762135,0.985014231012,0.984997690835,0.984981141605,0.98496458332,0.984948015982,0.984931439591,0.984914854146,0.984898259648,0.984881656097,0.984865043494,0.984848421837,0.984831791128,0.984815151367,0.984798502554,0.984781844688,0.984765177771,0.984748501802,0.984731816781,0.984715122709,0.984698419586,0.984681707411,0.984664986185,0.984648255909,0.984631516582,0.984614768204,0.984598010776,0.984581244298,0.98456446877,0.984547684192,0.984530890564,0.984514087886,0.984497276159,0.984480455383,0.984463625558,0.984446786684,0.98442993876,0.984413081789,0.984396215768,0.984379340699,0.984362456583,0.984345563418,0.984328661205,0.984311749944,0.984294829636,0.98427790028,0.984260961878,0.984244014428,0.984227057931,0.984210092387,0.984193117797,0.98417613416,0.984159141476,0.984142139747,0.984125128972,0.98410810915,0.984091080283,0.984074042371,0.984056995413,0.98403993941,0.984022874361,0.984005800268,0.98398871713,0.983971624948,0.983954523721,0.983937413449,0.983920294134,0.983903165774,0.983886028371,0.983868881924,0.983851726434,0.9838345619,0.983817388323,0.983800205703,0.98378301404,0.983765813334,0.983748603586,0.983731384795,0.983714156962,0.983696920087,0.98367967417,0.983662419212,0.983645155211,0.98362788217,0.983610600087,0.983593308962,0.983576008797,0.983558699591,0.983541381345,0.983524054058,0.98350671773,0.983489372362,0.983472017955,0.983454654507,0.98343728202,0.983419900493,0.983402509927,0.983385110322,0.983367701677,0.983350283994,0.983332857272,0.983315421511,0.983297976712,0.983280522874,0.983263059999,0.983245588085,0.983228107134,0.983210617145,0.983193118119,0.983175610055,0.983158092955,0.983140566817,0.983123031642,0.983105487431,0.983087934184,0.983070371899,0.983052800579,0.983035220223,0.983017630831,0.983000032403,0.98298242494,0.982964808441,0.982947182908,0.982929548339,0.982911904735,0.982894252096,0.982876590423,0.982858919716,0.982841239974,0.982823551199,0.982805853389,0.982788146546,0.982770430669,0.982752705758,0.982734971815,0.982717228838,0.982699476829,0.982681715786,0.982663945711,0.982646166604,0.982628378464,0.982610581292,0.982592775089,0.982574959853,0.982557135586,0.982539302287,0.982521459958,0.982503608597,0.982485748205,0.982467878782,0.982450000328,0.982432112845,0.98241421633,0.982396310786,0.982378396212,0.982360472608,0.982342539974,0.982324598311,0.982306647618,0.982288687896,0.982270719146,0.982252741366,0.982234754558,0.982216758721,0.982198753856,0.982180739963,0.982162717042,0.982144685093,0.982126644117,0.982108594113,0.982090535081,0.982072467022,0.982054389937,0.982036303824,0.982018208685,0.98200010452,0.981981991328,0.98196386911,0.981945737865,0.981927597595,0.9819094483,0.981891289979,0.981873122632,0.981854946261,0.981836760864,0.981818566443,0.981800362996,0.981782150526,0.981763929031,0.981745698512,0.981727458969,0.981709210402,0.981690952811,0.981672686197,0.98165441056,0.981636125899,0.981617832215,0.981599529509,0.98158121778,0.981562897028,0.981544567255,0.981526228459,0.981507880641,0.981489523801,0.98147115794,0.981452783057,0.981434399152,0.981416006227,0.981397604281,0.981379193314,0.981360773326,0.981342344318,0.981323906289,0.981305459241,0.981287003172,0.981268538084,0.981250063976,0.981231580849,0.981213088702,0.981194587536,0.981176077352,0.981157558148,0.981139029926,0.981120492686,0.981101946427,0.98108339115,0.981064826856,0.981046253543,0.981027671213,0.981009079866,0.980990479502,0.98097187012,0.980953251721,0.980934624306,0.980915987874,0.980897342426,0.980878687962,0.980860024482,0.980841351985,0.980822670473,0.980803979946,0.980785280403,0.980766571845,0.980747854272,0.980729127685,0.980710392082,0.980691647465,0.980672893834,0.980654131189,0.98063535953,0.980616578857,0.98059778917,0.98057899047,0.980560182756,0.98054136603,0.98052254029,0.980503705538,0.980484861773,0.980466008996,0.980447147207,0.980428276405,0.980409396592,0.980390507767,0.98037160993,0.980352703082,0.980333787223,0.980314862353,0.980295928472,0.98027698558,0.980258033678,0.980239072766,0.980220102843,0.980201123911,0.980182135968,0.980163139016,0.980144133055,0.980125118084,0.980106094104,0.980087061115,0.980068019118,0.980048968112,0.980029908097,0.980010839074,0.979991761043,0.979972674005,0.979953577958,0.979934472905,0.979915358843,0.979896235775,0.9798771037,0.979857962617,0.979838812528,0.979819653433,0.979800485331,0.979781308224,0.97976212211,0.979742926991,0.979723722866,0.979704509735,0.979685287599,0.979666056459,0.979646816313,0.979627567163,0.979608309008,0.979589041849,0.979569765685,0.979550480518,0.979531186347,0.979511883172,0.979492570994,0.979473249812,0.979453919628,0.97943458044,0.97941523225,0.979395875057,0.979376508861,0.979357133664,0.979337749464,0.979318356263,0.97929895406,0.979279542855,0.979260122649,0.979240693442,0.979221255234,0.979201808025,0.979182351816,0.979162886606,0.979143412395,0.979123929185,0.979104436975,0.979084935765,0.979065425556,0.979045906347,0.979026378139,0.979006840932,0.978987294726,0.978967739522,0.978948175319,0.978928602118,0.978909019919,0.978889428721,0.978869828527,0.978850219334,0.978830601144,0.978810973957,0.978791337773,0.978771692592,0.978752038415,0.978732375241,0.97871270307,0.978693021904,0.978673331741,0.978653632583,0.978633924429,0.97861420728,0.978594481136,0.978574745997,0.978555001862,0.978535248733,0.97851548661,0.978495715492,0.978475935381,0.978456146275,0.978436348175,0.978416541082,0.978396724996,0.978376899916,0.978357065843,0.978337222778,0.97831737072,0.978297509669,0.978277639626,0.978257760591,0.978237872564,0.978217975545,0.978198069534,0.978178154533,0.97815823054,0.978138297556,0.978118355581,0.978098404615,0.978078444659,0.978058475713,0.978038497777,0.978018510851,0.977998514935,0.977978510029,0.977958496134,0.97793847325,0.977918441377,0.977898400515,0.977878350664,0.977858291825,0.977838223998,0.977818147183,0.977798061379,0.977777966588,0.97775786281,0.977737750044,0.977717628291,0.977697497551,0.977677357825,0.977657209111,0.977637051411,0.977616884725,0.977596709053,0.977576524396,0.977556330752,0.977536128123,0.977515916509,0.977495695909,0.977475466325,0.977455227756,0.977434980202,0.977414723664,0.977394458142,0.977374183635,0.977353900145,0.977333607671,0.977313306214,0.977292995774,0.977272676351,0.977252347944,0.977232010555,0.977211664184,0.97719130883,0.977170944494,0.977150571176,0.977130188876,0.977109797595,0.977089397332,0.977068988088,0.977048569863,0.977028142658,0.977007706471,0.976987261305,0.976966807158,0.976946344031,0.976925871924,0.976905390837,0.976884900771,0.976864401725,0.976843893701,0.976823376697,0.976802850715,0.976782315754,0.976761771815,0.976741218897,0.976720657002,0.976700086129,0.976679506278,0.97665891745,0.976638319644,0.976617712862,0.976597097102,0.976576472366,0.976555838653,0.976535195965,0.9765145443,0.976493883659,0.976473214042,0.97645253545,0.976431847883,0.97641115134,0.976390445822,0.97636973133,0.976349007863,0.976328275422,0.976307534006,0.976286783617,0.976266024253,0.976245255916,0.976224478606,0.976203692322,0.976182897066,0.976162092836,0.976141279634,0.976120457459,0.976099626312,0.976078786193,0.976057937102,0.976037079039,0.976016212005,0.975995335999,0.975974451022,0.975953557075,0.975932654156,0.975911742267,0.975890821408,0.975869891578,0.975848952779,0.975828005009,0.975807048271,0.975786082562,0.975765107885,0.975744124238,0.975723131623,0.975702130039,0.975681119486,0.975660099965,0.975639071476,0.97561803402,0.975596987595,0.975575932204,0.975554867844,0.975533794518,0.975512712225,0.975491620965,0.975470520739,0.975449411546,0.975428293388,0.975407166263,0.975386030173,0.975364885117,0.975343731095,0.975322568109,0.975301396158,0.975280215241,0.975259025361,0.975237826516,0.975216618706,0.975195401933,0.975174176196,0.975152941495,0.975131697831,0.975110445204,0.975089183614,0.975067913061,0.975046633545,0.975025345067,0.975004047627,0.974982741224,0.97496142586,0.974940101534,0.974918768247,0.974897425999,0.974876074789,0.974854714619,0.974833345488,0.974811967396,0.974790580344,0.974769184333,0.974747779361,0.974726365429,0.974704942539,0.974683510689,0.974662069879,0.974640620111,0.974619161384,0.974597693699,0.974576217056,0.974554731454,0.974533236894,0.974511733377,0.974490220902,0.97446869947,0.974447169081,0.974425629735,0.974404081432,0.974382524173,0.974360957957,0.974339382786,0.974317798658,0.974296205575,0.974274603536,0.974252992541,0.974231372592,0.974209743688,0.974188105829,0.974166459015,0.974144803247,0.974123138525,0.97410146485,0.97407978222,0.974058090637,0.9740363901,0.974014680611,0.973992962168,0.973971234773,0.973949498425,0.973927753125,0.973905998872,0.973884235668,0.973862463512,0.973840682405,0.973818892346,0.973797093336,0.973775285375,0.973753468463,0.973731642601,0.973709807788,0.973687964026,0.973666111313,0.973644249651,0.973622379039,0.973600499478,0.973578610967,0.973556713508,0.9735348071,0.973512891744,0.973490967439,0.973469034186,0.973447091985,0.973425140837,0.973403180741,0.973381211697,0.973359233707,0.973337246769,0.973315250885,0.973293246055,0.973271232278,0.973249209555,0.973227177886,0.973205137271,0.973183087711,0.973161029206,0.973138961755,0.97311688536,0.97309480002,0.973072705735,0.973050602507,0.973028490334,0.973006369217,0.972984239157,0.972962100153,0.972939952206,0.972917795315,0.972895629482,0.972873454707,0.972851270989,0.972829078328,0.972806876726,0.972784666182,0.972762446696,0.972740218268,0.9727179809,0.97269573459,0.97267347934,0.972651215149,0.972628942018,0.972606659946,0.972584368935,0.972562068983,0.972539760093,0.972517442262,0.972495115493,0.972472779784,0.972450435137,0.972428081552,0.972405719027,0.972383347565,0.972360967165,0.972338577827,0.972316179552,0.972293772339,0.972271356189,0.972248931102,0.972226497079,0.972204054119,0.972181602223,0.97215914139,0.972136671622,0.972114192918,0.972091705279,0.972069208704,0.972046703195,0.97202418875,0.972001665371,0.971979133057,0.97195659181,0.971934041628,0.971911482512,0.971888914463,0.97186633748,0.971843751564,0.971821156716,0.971798552934,0.97177594022,0.971753318574,0.971730687995,0.971708048484,0.971685400042,0.971662742668,0.971640076363,0.971617401127,0.97159471696,0.971572023862,0.971549321833,0.971526610875,0.971503890986,0.971481162168,0.97145842442,0.971435677742,0.971412922135,0.971390157599,0.971367384135,0.971344601741,0.97132181042,0.97129901017,0.971276200992,0.971253382887,0.971230555853,0.971207719893,0.971184875005,0.971162021191,0.97113915845,0.971116286782,0.971093406188,0.971070516668,0.971047618222,0.97102471085,0.971001794553,0.970978869331,0.970955935184,0.970932992111,0.970910040115,0.970887079193,0.970864109348,0.970841130579,0.970818142886,0.970795146269,0.970772140729,0.970749126266,0.97072610288,0.970703070571,0.97068002934,0.970656979186,0.970633920111,0.970610852113,0.970587775194,0.970564689354,0.970541594592,0.970518490909,0.970495378306,0.970472256781,0.970449126337,0.970425986972,0.970402838688,0.970379681483,0.970356515359,0.970333340316,0.970310156354,0.970286963473,0.970263761673,0.970240550955,0.970217331318,0.970194102763,0.970170865291,0.970147618901,0.970124363594,0.970101099369,0.970077826228,0.970054544169,0.970031253195,0.970007953303,0.969984644496,0.969961326773,0.969938000134,0.96991466458,0.969891320111,0.969867966726,0.969844604427,0.969821233213,0.969797853084,0.969774464042,0.969751066085,0.969727659215,0.969704243431,0.969680818734,0.969657385124,0.969633942601,0.969610491166,0.969587030817,0.969563561557,0.969540083385,0.9695165963,0.969493100305,0.969469595397,0.969446081579,0.96942255885,0.96939902721,0.969375486659,0.969351937199,0.969328378828,0.969304811547,0.969281235357,0.969257650257,0.969234056248,0.96921045333,0.969186841503,0.969163220768,0.969139591124,0.969115952572,0.969092305113,0.969068648745,0.96904498347,0.969021309288,0.968997626199,0.968973934203,0.9689502333,0.968926523492,0.968902804776,0.968879077155,0.968855340629,0.968831595196,0.968807840859,0.968784077616,0.968760305469,0.968736524416,0.96871273446,0.968688935599,0.968665127834,0.968641311166,0.968617485594,0.968593651118,0.96856980774,0.968545955458,0.968522094274,0.968498224188,0.968474345199,0.968450457308,0.968426560516,0.968402654822,0.968378740226,0.96835481673,0.968330884332,0.968306943034,0.968282992836,0.968259033737,0.968235065738,0.968211088839,0.968187103041,0.968163108343,0.968139104746,0.968115092251,0.968091070856,0.968067040563,0.968043001372,0.968018953283,0.967994896296,0.967970830411,0.967946755629,0.96792267195,0.967898579374,0.967874477901,0.967850367531,0.967826248266,0.967802120104,0.967777983047,0.967753837093,0.967729682245,0.967705518501,0.967681345863,0.967657164329,0.967632973902,0.967608774579,0.967584566363,0.967560349253,0.96753612325,0.967511888353,0.967487644563,0.96746339188,0.967439130304,0.967414859835,0.967390580475,0.967366292222,0.967341995078,0.967317689042,0.967293374114,0.967269050296,0.967244717586,0.967220375986,0.967196025496,0.967171666115,0.967147297844,0.967122920683,0.967098534633,0.967074139693,0.967049735864,0.967025323146,0.96700090154,0.966976471045,0.966952031662,0.966927583391,0.966903126232,0.966878660185,0.966854185251,0.96682970143,0.966805208722,0.966780707128,0.966756196647,0.966731677279,0.966707149026,0.966682611887,0.966658065863,0.966633510953,0.966608947158,0.966584374478,0.966559792914,0.966535202465,0.966510603132,0.966485994915,0.966461377814,0.96643675183,0.966412116963,0.966387473212,0.966362820579,0.966338159063,0.966313488665,0.966288809384,0.966264121222,0.966239424178,0.966214718252,0.966190003445,0.966165279758,0.966140547189,0.96611580574,0.96609105541,0.966066296201,0.966041528111,0.966016751142,0.965991965294,0.965967170566,0.965942366959,0.965917554474,0.96589273311,0.965867902868,0.965843063748,0.96581821575,0.965793358874,0.965768493121,0.965743618491,0.965718734984,0.9656938426,0.96566894134,0.965644031204,0.965619112191,0.965594184303,0.965569247539,0.9655443019,0.965519347386,0.965494383997,0.965469411734,0.965444430596,0.965419440584,0.965394441698,0.965369433938,0.965344417305,0.965319391798,0.965294357419,0.965269314167,0.965244262042,0.965219201045,0.965194131176,0.965169052435,0.965143964822,0.965118868338,0.965093762983,0.965068648757,0.96504352566,0.965018393692,0.964993252855,0.964968103147,0.96494294457,0.964917777123,0.964892600807,0.964867415622,0.964842221567,0.964817018645,0.964791806853,0.964766586194,0.964741356667,0.964716118272,0.964690871009,0.96466561488,0.964640349883,0.96461507602,0.96458979329,0.964564501694,0.964539201231,0.964513891903,0.964488573709,0.96446324665,0.964437910726,0.964412565937,0.964387212283,0.964361849765,0.964336478382,0.964311098136,0.964285709025,0.964260311052,0.964234904215,0.964209488515,0.964184063952,0.964158630526,0.964133188239,0.964107737089,0.964082277077,0.964056808204,0.964031330469,0.964005843873,0.963980348416,0.963954844098,0.96392933092,0.963903808882,0.963878277984,0.963852738226,0.963827189608,0.963801632131,0.963776065795,0.963750490601,0.963724906547,0.963699313636,0.963673711866,0.963648101238,0.963622481753,0.96359685341,0.96357121621,0.963545570153,0.96351991524,0.96349425147,0.963468578844,0.963442897361,0.963417207023,0.96339150783,0.963365799781,0.963340082877,0.963314357118,0.963288622505,0.963262879038,0.963237126716,0.96321136554,0.963185595511,0.963159816628,0.963134028893,0.963108232304,0.963082426863,0.963056612569,0.963030789423,0.963004957425,0.962979116575,0.962953266874,0.962927408321,0.962901540918,0.962875664663,0.962849779559,0.962823885603,0.962797982798,0.962772071143,0.962746150638,0.962720221284,0.962694283081,0.962668336029,0.962642380129,0.96261641538,0.962590441782,0.962564459337,0.962538468044,0.962512467904,0.962486458917,0.962460441082,0.962434414401,0.962408378873,0.962382334499,0.962356281279,0.962330219214,0.962304148302,0.962278068546,0.962251979944,0.962225882498,0.962199776207,0.962173661072,0.962147537092,0.962121404269,0.962095262602,0.962069112092,0.962042952739,0.962016784542,0.961990607503,0.961964421622,0.961938226899,0.961912023333,0.961885810926,0.961859589677,0.961833359588,0.961807120657,0.961780872885,0.961754616274,0.961728350821,0.961702076529,0.961675793397,0.961649501426,0.961623200615,0.961596890965,0.961570572477,0.961544245149,0.961517908984,0.961491563981,0.961465210139,0.96143884746,0.961412475944,0.961386095591,0.961359706401,0.961333308374,0.961306901511,0.961280485811,0.961254061276,0.961227627905,0.961201185699,0.961174734658,0.961148274781,0.96112180607,0.961095328525,0.961068842146,0.961042346932,0.961015842885,0.960989330004,0.96096280829,0.960936277743,0.960909738364,0.960883190152,0.960856633108,0.960830067231,0.960803492523,0.960776908984,0.960750316613,0.960723715411,0.960697105379,0.960670486516,0.960643858823,0.960617222299,0.960590576946,0.960563922763,0.960537259752,0.96051058791,0.960483907241,0.960457217742,0.960430519416,0.960403812261,0.960377096278,0.960350371468,0.96032363783,0.960296895366,0.960270144074,0.960243383956,0.960216615012,0.960189837241,0.960163050645,0.960136255223,0.960109450976,0.960082637903,0.960055816006,0.960028985284,0.960002145738,0.959975297367,0.959948440173,0.959921574155,0.959894699313,0.959867815649,0.959840923161,0.959814021851,0.959787111719,0.959760192764,0.959733264988,0.959706328389,0.95967938297,0.959652428729,0.959625465667,0.959598493785,0.959571513082,0.959544523559,0.959517525216,0.959490518053,0.959463502071,0.95943647727,0.95940944365,0.959382401211,0.959355349954,0.959328289878,0.959301220985,0.959274143274,0.959247056745,0.9592199614,0.959192857237,0.959165744258,0.959138622462,0.95911149185,0.959084352422,0.959057204178,0.959030047119,0.959002881245,0.958975706556,0.958948523052,0.958921330733,0.958894129601,0.958866919654,0.958839700894,0.95881247332,0.958785236933,0.958757991733,0.958730737721,0.958703474896,0.958676203259,0.95864892281,0.958621633549,0.958594335476,0.958567028593,0.958539712899,0.958512388394,0.958485055078,0.958457712952,0.958430362017,0.958403002271,0.958375633716,0.958348256352,0.95832087018,0.958293475198,0.958266071408,0.95823865881,0.958211237404,0.95818380719,0.958156368169,0.95812892034,0.958101463705,0.958073998263,0.958046524015,0.95801904096,0.9579915491,0.957964048434,0.957936538962,0.957909020686,0.957881493604,0.957853957718,0.957826413028,0.957798859533,0.957771297234,0.957743726132,0.957716146227,0.957688557518,0.957660960006,0.957633353692,0.957605738576,0.957578114657,0.957550481937,0.957522840414,0.957495190091,0.957467530967,0.957439863041,0.957412186315,0.957384500789,0.957356806463,0.957329103336,0.957301391411,0.957273670686,0.957245941162,0.957218202839,0.957190455717,0.957162699798,0.95713493508,0.957107161564,0.957079379251,0.957051588141,0.957023788234,0.95699597953,0.956968162029,0.956940335732,0.956912500639,0.956884656751,0.956856804067,0.956828942588,0.956801072313,0.956773193244,0.956745305381,0.956717408723,0.956689503272,0.956661589027,0.956633665988,0.956605734156,0.956577793531,0.956549844114,0.956521885904,0.956493918902,0.956465943109,0.956437958523,0.956409965146,0.956381962978,0.95635395202,0.95632593227,0.95629790373,0.956269866401,0.956241820281,0.956213765372,0.956185701673,0.956157629186,0.956129547909,0.956101457844,0.956073358991,0.95604525135,0.956017134921,0.955989009705,0.955960875701,0.95593273291,0.955904581333,0.955876420969,0.955848251819,0.955820073883,0.955791887161,0.955763691654,0.955735487361,0.955707274284,0.955679052422,0.955650821776,0.955622582345,0.955594334131,0.955566077133,0.955537811351,0.955509536787,0.95548125344,0.95545296131,0.955424660398,0.955396350703,0.955368032227,0.95533970497,0.955311368931,0.955283024111,0.955254670511,0.955226308129,0.955197936968,0.955169557027,0.955141168306,0.955112770805,0.955084364526,0.955055949467,0.95502752563,0.954999093014,0.95497065162,0.954942201448,0.954913742499,0.954885274772,0.954856798269,0.954828312988,0.954799818931,0.954771316097,0.954742804488,0.954714284102,0.954685754941,0.954657217005,0.954628670294,0.954600114808,0.954571550548,0.954542977513,0.954514395704,0.954485805122,0.954457205767,0.954428597638,0.954399980736,0.954371355061,0.954342720615,0.954314077396,0.954285425405,0.954256764643,0.954228095109,0.954199416804,0.954170729729,0.954142033883,0.954113329267,0.95408461588,0.954055893724,0.954027162799,0.953998423104,0.95396967464,0.953940917408,0.953912151407,0.953883376638,0.953854593101,0.953825800797,0.953796999725,0.953768189886,0.95373937128,0.953710543908,0.953681707769,0.953652862865,0.953624009194,0.953595146758,0.953566275557,0.953537395591,0.95350850686,0.953479609365,0.953450703105,0.953421788082,0.953392864295,0.953363931744,0.953334990431,0.953306040354,0.953277081515,0.953248113914,0.95321913755,0.953190152425,0.953161158539,0.953132155891,0.953103144482,0.953074124312,0.953045095382,0.953016057692,0.952987011242,0.952957956032,0.952928892063,0.952899819334,0.952870737847,0.952841647601,0.952812548597,0.952783440835,0.952754324315,0.952725199038,0.952696065003,0.952666922211,0.952637770663,0.952608610358,0.952579441297,0.95255026348,0.952521076908,0.95249188158,0.952462677497,0.952433464659,0.952404243066,0.95237501272,0.952345773619,0.952316525765,0.952287269157,0.952258003795,0.952228729681,0.952199446814,0.952170155195,0.952140854824,0.952111545701,0.952082227826,0.9520529012,0.952023565822,0.951994221694,0.951964868816,0.951935507187,0.951906136808,0.951876757679,0.951847369801,0.951817973174,0.951788567798,0.951759153673,0.9517297308,0.951700299179,0.95167085881,0.951641409694,0.95161195183,0.951582485219,0.951553009861,0.951523525757,0.951494032907,0.951464531311,0.951435020969,0.951405501882,0.951375974049,0.951346437472,0.95131689215,0.951287338084,0.951257775274,0.95122820372,0.951198623423,0.951169034383,0.951139436599,0.951109830073,0.951080214804,0.951050590794,0.951020958041,0.950991316547,0.950961666312,0.950932007335,0.950902339618,0.95087266316,0.950842977962,0.950813284024,0.950783581347,0.95075386993,0.950724149774,0.950694420879,0.950664683245,0.950634936874,0.950605181764,0.950575417916,0.950545645331,0.950515864009,0.950486073949,0.950456275154,0.950426467621,0.950396651353,0.950366826349,0.950336992609,0.950307150134,0.950277298924,0.950247438979,0.950217570299,0.950187692886,0.950157806738,0.950127911857,0.950098008243,0.950068095895,0.950038174815,0.950008245002,0.949978306457,0.949948359179,0.94991840317,0.94988843843,0.949858464959,0.949828482756,0.949798491823,0.94976849216,0.949738483766,0.949708466643,0.94967844079,0.949648406208,0.949618362897,0.949588310857,0.949558250089,0.949528180593,0.949498102369,0.949468015417,0.949437919738,0.949407815332,0.9493777022,0.94934758034,0.949317449755,0.949287310444,0.949257162406,0.949227005644,0.949196840157,0.949166665944,0.949136483008,0.949106291347,0.949076090961,0.949045881853,0.949015664021,0.948985437465,0.948955202187,0.948924958186,0.948894705463,0.948864444018,0.948834173851,0.948803894963,0.948773607353,0.948743311023,0.948713005971,0.9486826922,0.948652369708,0.948622038497,0.948591698566,0.948561349916,0.948530992547,0.948500626459,0.948470251652,0.948439868128,0.948409475886,0.948379074926,0.948348665249,0.948318246855,0.948287819744,0.948257383916,0.948226939373,0.948196486113,0.948166024138,0.948135553448,0.948105074043,0.948074585922,0.948044089088,0.948013583539,0.947983069276,0.947952546299,0.947922014609,0.947891474206,0.94786092509,0.947830367262,0.947799800721,0.947769225469,0.947738641505,0.947708048829,0.947677447442,0.947646837344,0.947616218536,0.947585591018,0.947554954789,0.947524309851,0.947493656203,0.947462993846,0.947432322781,0.947401643006,0.947370954524,0.947340257333,0.947309551435,0.947278836829,0.947248113516,0.947217381496,0.947186640769,0.947155891336,0.947125133198,0.947094366353,0.947063590803,0.947032806547,0.947002013587,0.946971211922,0.946940401552,0.946909582479,0.946878754702,0.946847918221,0.946817073037,0.94678621915,0.946755356561,0.946724485269,0.946693605275,0.946662716579,0.946631819182,0.946600913083,0.946569998284,0.946539074784,0.946508142583,0.946477201682,0.946446252082,0.946415293782,0.946384326783,0.946353351084,0.946322366688,0.946291373592,0.946260371799,0.946229361308,0.946198342119,0.946167314233,0.94613627765,0.94610523237,0.946074178394,0.946043115722,0.946012044354,0.945980964291,0.945949875532,0.945918778078,0.94588767193,0.945856557087,0.94582543355,0.945794301319,0.945763160395,0.945732010777,0.945700852467,0.945669685464,0.945638509768,0.945607325381,0.945576132301,0.94554493053,0.945513720068,0.945482500914,0.945451273071,0.945420036536,0.945388791312,0.945357537398,0.945326274794,0.945295003501,0.945263723519,0.945232434848,0.945201137489,0.945169831442,0.945138516708,0.945107193285,0.945075861176,0.945044520379,0.945013170896,0.944981812727,0.944950445871,0.94491907033,0.944887686103,0.944856293191,0.944824891594,0.944793481312,0.944762062346,0.944730634696,0.944699198362,0.944667753345,0.944636299645,0.944604837261,0.944573366196,0.944541886447,0.944510398017,0.944478900905,0.944447395112,0.944415880637,0.944384357482,0.944352825646,0.944321285129,0.944289735933,0.944258178057,0.944226611501,0.944195036267,0.944163452353,0.944131859761,0.944100258491,0.944068648543,0.944037029917,0.944005402614,0.943973766634,0.943942121976,0.943910468643,0.943878806633,0.943847135947,0.943815456586,0.943783768549,0.943752071837,0.94372036645,0.943688652389,0.943656929654,0.943625198245,0.943593458162,0.943561709406,0.943529951977,0.943498185875,0.943466411101,0.943434627654,0.943402835536,0.943371034746,0.943339225285,0.943307407153,0.94327558035,0.943243744877,0.943211900734,0.943180047921,0.943148186438,0.943116316287,0.943084437466,0.943052549977,0.943020653819,0.942988748994,0.9429568355,0.942924913339,0.942892982511,0.942861043016,0.942829094855,0.942797138027,0.942765172533,0.942733198374,0.942701215549,0.942669224059,0.942637223904,0.942605215085,0.942573197601,0.942541171454,0.942509136643,0.942477093168,0.942445041031,0.942412980231,0.942380910768,0.942348832643,0.942316745857,0.942284650408,0.942252546299,0.942220433528,0.942188312097,0.942156182005,0.942124043254,0.942091895842,0.942059739771,0.942027575041,0.941995401652,0.941963219604,0.941931028898,0.941898829534,0.941866621512,0.941834404832,0.941802179496,0.941769945503,0.941737702853,0.941705451547,0.941673191585,0.941640922967,0.941608645694,0.941576359766,0.941544065183,0.941511761946,0.941479450054,0.941447129509,0.94141480031,0.941382462457,0.941350115952,0.941317760794,0.941285396984,0.941253024521,0.941220643407,0.941188253642,0.941155855225,0.941123448157,0.941091032438,0.94105860807,0.941026175051,0.940993733382,0.940961283065,0.940928824098,0.940896356482,0.940863880217,0.940831395305,0.940798901744,0.940766399536,0.940733888681,0.940701369179,0.940668841029,0.940636304234,0.940603758792,0.940571204705,0.940538641972,0.940506070593,0.94047349057,0.940440901902,0.94040830459,0.940375698634,0.940343084034,0.94031046079,0.940277828904,0.940245188375,0.940212539203,0.940179881389,0.940147214933,0.940114539835,0.940081856096,0.940049163716,0.940016462695,0.939983753034,0.939951034733,0.939918307792,0.939885572211,0.939852827991,0.939820075132,0.939787313635,0.939754543499,0.939721764725,0.939688977314,0.939656181265,0.939623376579,0.939590563256,0.939557741296,0.939524910701,0.939492071469,0.939459223602,0.9394263671,0.939393501962,0.93936062819,0.939327745784,0.939294854743,0.939261955069,0.939229046761,0.93919612982,0.939163204246,0.939130270039,0.9390973272,0.939064375729,0.939031415627,0.938998446893,0.938965469528,0.938932483532,0.938899488906,0.938866485649,0.938833473763,0.938800453247,0.938767424102,0.938734386328,0.938701339926,0.938668284895,0.938635221236,0.938602148949,0.938569068035,0.938535978494,0.938502880325,0.938469773531,0.93843665811,0.938403534063,0.938370401391,0.938337260093,0.93830411017,0.938270951623,0.938237784451,0.938204608655,0.938171424236,0.938138231193,0.938105029527,0.938071819238,0.938038600326,0.938005372792,0.937972136636,0.937938891859,0.93790563846,0.93787237644,0.937839105799,0.937805826538,0.937772538657,0.937739242156,0.937705937036,0.937672623297,0.937639300938,0.937605969961,0.937572630366,0.937539282152,0.937505925321,0.937472559873,0.937439185808,0.937405803126,0.937372411827,0.937339011913,0.937305603382,0.937272186236,0.937238760475,0.937205326099,0.937171883108,0.937138431503,0.937104971284,0.937071502452,0.937038025006,0.937004538947,0.936971044275,0.936937540991,0.936904029095,0.936870508586,0.936836979467,0.936803441736,0.936769895394,0.936736340442,0.936702776879,0.936669204707,0.936635623924,0.936602034533,0.936568436532,0.936534829923,0.936501214705,0.936467590879,0.936433958445,0.936400317404,0.936366667756,0.9363330095,0.936299342638,0.93626566717,0.936231983096,0.936198290416,0.936164589131,0.936130879241,0.936097160746,0.936063433647,0.936029697944,0.935995953637,0.935962200726,0.935928439213,0.935894669096,0.935860890377,0.935827103055,0.935793307132,0.935759502607,0.935725689481,0.935691867754,0.935658037426,0.935624198498,0.93559035097,0.935556494841,0.935522630114,0.935488756787,0.935454874862,0.935420984338,0.935387085216,0.935353177496,0.935319261179,0.935285336264,0.935251402752,0.935217460644,0.935183509939,0.935149550638,0.935115582742,0.93508160625,0.935047621163,0.935013627482,0.934979625206,0.934945614336,0.934911594872,0.934877566814,0.934843530163,0.93480948492,0.934775431084,0.934741368655,0.934707297635,0.934673218023,0.93463912982,0.934605033025,0.93457092764,0.934536813665,0.9345026911,0.934468559945,0.9344344202,0.934400271866,0.934366114944,0.934331949433,0.934297775334,0.934263592646,0.934229401372,0.93419520151,0.934160993061,0.934126776026,0.934092550404,0.934058316197,0.934024073403,0.933989822025,0.933955562061,0.933921293513,0.93388701638,0.933852730663,0.933818436362,0.933784133478,0.933749822011,0.933715501961,0.933681173328,0.933646836113,0.933612490317,0.933578135938,0.933543772979,0.933509401438,0.933475021317,0.933440632616,0.933406235335,0.933371829474,0.933337415033,0.933302992014,0.933268560416,0.933234120239,0.933199671485,0.933165214152,0.933130748242,0.933096273755,0.933061790692,0.933027299051,0.932992798835,0.932958290042,0.932923772674,0.932889246731,0.932854712213,0.932820169121,0.932785617454,0.932751057213,0.932716488398,0.93268191101,0.932647325049,0.932612730516,0.93257812741,0.932543515732,0.932508895482,0.932474266661,0.932439629268,0.932404983305,0.932370328772,0.932335665668,0.932300993995,0.932266313752,0.932231624939,0.932196927558,0.932162221609,0.932127507091,0.932092784005,0.932058052351,0.932023312131,0.931988563343,0.931953805989,0.931919040068,0.931884265582,0.931849482529,0.931814690912,0.931779890729,0.931745081982,0.93171026467,0.931675438794,0.931640604354,0.931605761351,0.931570909785,0.931536049656,0.931501180965,0.931466303711,0.931431417895,0.931396523518,0.93136162058,0.931326709081,0.931291789022,0.931256860402,0.931221923222,0.931186977483,0.931152023184,0.931117060326,0.93108208891,0.931047108936,0.931012120403,0.930977123313,0.930942117665,0.930907103461,0.9308720807,0.930837049382,0.930802009508,0.930766961079,0.930731904094,0.930696838554,0.93066176446,0.930626681811,0.930591590607,0.93055649085,0.93052138254,0.930486265676,0.93045114026,0.930416006291,0.93038086377,0.930345712696,0.930310553072,0.930275384896,0.930240208169,0.930205022892,0.930169829065,0.930134626687,0.93009941576,0.930064196284,0.930028968259,0.929993731685,0.929958486563,0.929923232893,0.929887970675,0.92985269991,0.929817420598,0.929782132739,0.929746836334,0.929711531382,0.929676217885,0.929640895843,0.929605565256,0.929570226124,0.929534878447,0.929499522227,0.929464157462,0.929428784155,0.929393402304,0.92935801191,0.929322612974,0.929287205496,0.929251789475,0.929216364914,0.929180931811,0.929145490168,0.929110039984,0.929074581259,0.929039113995,0.929003638192,0.928968153849,0.928932660967,0.928897159547,0.928861649588,0.928826131092,0.928790604058,0.928755068487,0.928719524379,0.928683971734,0.928648410553,0.928612840836,0.928577262584,0.928541675796,0.928506080473,0.928470476616,0.928434864224,0.928399243299,0.928363613839,0.928327975847,0.928292329321,0.928256674263,0.928221010672,0.92818533855,0.928149657895,0.92811396871,0.928078270993,0.928042564746,0.928006849968,0.92797112666,0.927935394823,0.927899654456,0.92786390556,0.927828148135,0.927792382182,0.927756607701,0.927720824692,0.927685033156,0.927649233093,0.927613424502,0.927577607386,0.927541781743,0.927505947575,0.927470104881,0.927434253662,0.927398393919,0.92736252565,0.927326648858,0.927290763542,0.927254869703,0.92721896734,0.927183056455,0.927147137047,0.927111209117,0.927075272665,0.927039327691,0.927003374197,0.926967412182,0.926931441646,0.92689546259,0.926859475014,0.926823478919,0.926787474305,0.926751461171,0.92671543952,0.92667940935,0.926643370662,0.926607323457,0.926571267734,0.926535203495,0.926499130739,0.926463049467,0.926426959679,0.926390861376,0.926354754558,0.926318639224,0.926282515376,0.926246383014,0.926210242138,0.926174092749,0.926137934846,0.926101768431,0.926065593503,0.926029410062,0.92599321811,0.925957017647,0.925920808672,0.925884591186,0.92584836519,0.925812130683,0.925775887667,0.925739636141,0.925703376106,0.925667107562,0.92563083051,0.925594544949,0.925558250881,0.925521948305,0.925485637221,0.925449317631,0.925412989535,0.925376652932,0.925340307823,0.925303954209,0.92526759209,0.925231221465,0.925194842336,0.925158454703,0.925122058567,0.925085653926,0.925049240783,0.925012819136,0.924976388987,0.924939950336,0.924903503183,0.924867047529,0.924830583373,0.924794110717,0.92475762956,0.924721139902,0.924684641745,0.924648135089,0.924611619933,0.924575096279,0.924538564125,0.924502023474,0.924465474325,0.924428916679,0.924392350535,0.924355775895,0.924319192758,0.924282601125,0.924246000996,0.924209392371,0.924172775252,0.924136149637,0.924099515529,0.924062872926,0.924026221829,0.923989562239,0.923952894156,0.92391621758,0.923879532511,0.923842838951,0.923806136898,0.923769426355,0.92373270732,0.923695979794,0.923659243778,0.923622499272,0.923585746276,0.923548984791,0.923512214817,0.923475436354,0.923438649402,0.923401853963,0.923365050036,0.923328237621,0.92329141672,0.923254587331,0.923217749457,0.923180903096,0.92314404825,0.923107184918,0.923070313101,0.9230334328,0.922996544014,0.922959646745,0.922922740991,0.922885826755,0.922848904035,0.922811972833,0.922775033148,0.922738084982,0.922701128334,0.922664163205,0.922627189594,0.922590207503,0.922553216932,0.922516217881,0.922479210351,0.922442194341,0.922405169852,0.922368136885,0.922331095439,0.922294045516,0.922256987115,0.922219920237,0.922182844882,0.922145761051,0.922108668743,0.92207156796,0.922034458701,0.921997340967,0.921960214758,0.921923080075,0.921885936918,0.921848785286,0.921811625182,0.921774456604,0.921737279554,0.921700094031,0.921662900036,0.921625697569,0.921588486631,0.921551267222,0.921514039342,0.921476802992,0.921439558172,0.921402304882,0.921365043123,0.921327772894,0.921290494198,0.921253207033,0.921215911399,0.921178607299,0.921141294731,0.921103973696,0.921066644194,0.921029306227,0.920991959793,0.920954604894,0.920917241529,0.9208798697,0.920842489406,0.920805100648,0.920767703426,0.920730297741,0.920692883592,0.920655460981,0.920618029907,0.920580590371,0.920543142373,0.920505685914,0.920468220994,0.920430747613,0.920393265772,0.92035577547,0.920318276709,0.920280769489,0.920243253809,0.920205729671,0.920168197074,0.92013065602,0.920093106508,0.920055548538,0.920017982112,0.919980407229,0.919942823889,0.919905232094,0.919867631843,0.919830023137,0.919792405976,0.919754780361,0.919717146291,0.919679503768,0.919641852791,0.919604193361,0.919566525478,0.919528849142,0.919491164355,0.919453471116,0.919415769425,0.919378059283,0.919340340691,0.919302613648,0.919264878155,0.919227134212,0.919189381821,0.91915162098,0.91911385169,0.919076073952,0.919038287766,0.919000493133,0.918962690052,0.918924878525,0.918887058551,0.91884923013,0.918811393264,0.918773547952,0.918735694196,0.918697831994,0.918659961348,0.918622082257,0.918584194723,0.918546298746,0.918508394325,0.918470481462,0.918432560156,0.918394630408,0.918356692219,0.918318745588,0.918280790517,0.918242827004,0.918204855051,0.918166874659,0.918128885827,0.918090888555,0.918052882845,0.918014868696,0.917976846109,0.917938815084,0.917900775621,0.917862727722,0.917824671385,0.917786606613,0.917748533404,0.917710451759,0.917672361679,0.917634263164,0.917596156214,0.91755804083,0.917519917012,0.91748178476,0.917443644075,0.917405494957,0.917367337406,0.917329171423,0.917290997008,0.917252814162,0.917214622885,0.917176423176,0.917138215037,0.917099998468,0.91706177347,0.917023540041,0.916985298184,0.916947047898,0.916908789184,0.916870522041,0.916832246471,0.916793962474,0.916755670049,0.916717369198,0.916679059921,0.916640742218,0.916602416089,0.916564081535,0.916525738556,0.916487387153,0.916449027325,0.916410659074,0.916372282399,0.916333897301,0.916295503781,0.916257101838,0.916218691473,0.916180272686,0.916141845478,0.916103409849,0.916064965799,0.916026513329,0.91598805244,0.91594958313,0.915911105402,0.915872619254,0.915834124688,0.915795621704,0.915757110302,0.915718590483,0.915680062246,0.915641525593,0.915602980523,0.915564427038,0.915525865136,0.91548729482,0.915448716088,0.915410128942,0.915371533382,0.915332929407,0.915294317019,0.915255696218,0.915217067005,0.915178429378,0.91513978334,0.915101128889,0.915062466028,0.915023794755,0.914985115072,0.914946426978,0.914907730474,0.914869025561,0.914830312238,0.914791590506,0.914752860366,0.914714121818,0.914675374862,0.914636619498,0.914597855727,0.914559083549,0.914520302965,0.914481513975,0.914442716579,0.914403910778,0.914365096571,0.914326273961,0.914287442945,0.914248603526,0.914209755704,0.914170899478,0.914132034849,0.914093161817,0.914054280384,0.914015390549,0.913976492312,0.913937585674,0.913898670636,0.913859747197,0.913820815358,0.91378187512,0.913742926482,0.913703969445,0.91366500401,0.913626030177,0.913587047945,0.913548057316,0.91350905829,0.913470050868,0.913431035049,0.913392010833,0.913352978222,0.913313937216,0.913274887815,0.913235830019,0.913196763829,0.913157689245,0.913118606267,0.913079514896,0.913040415133,0.913001306977,0.912962190428,0.912923065488,0.912883932157,0.912844790435,0.912805640322,0.912766481818,0.912727314925,0.912688139642,0.91264895597,0.912609763909,0.912570563459,0.912531354622,0.912492137396,0.912452911783,0.912413677783,0.912374435396,0.912335184623,0.912295925464,0.91225665792,0.91221738199,0.912178097675,0.912138804975,0.912099503892,0.912060194424,0.912020876574,0.91198155034,0.911942215723,0.911902872724,0.911863521343,0.91182416158,0.911784793436,0.911745416911,0.911706032005,0.91166663872,0.911627237054,0.911587827009,0.911548408585,0.911508981782,0.911469546601,0.911430103041,0.911390651104,0.91135119079,0.911311722098,0.911272245031,0.911232759586,0.911193265767,0.911153763571,0.911114253001,0.911074734055,0.911035206735,0.910995671042,0.910956126974,0.910916574533,0.91087701372,0.910837444533,0.910797866975,0.910758281044,0.910718686743,0.91067908407,0.910639473026,0.910599853612,0.910560225827,0.910520589673,0.91048094515,0.910441292258,0.910401630997,0.910361961368,0.910322283372,0.910282597007,0.910242902276,0.910203199178,0.910163487713,0.910123767883,0.910084039686,0.910044303125,0.910004558198,0.909964804907,0.909925043252,0.909885273233,0.90984549485,0.909805708105,0.909765912996,0.909726109525,0.909686297693,0.909646477498,0.909606648943,0.909566812026,0.909526966749,0.909487113112,0.909447251114,0.909407380758,0.909367502042,0.909327614968,0.909287719535,0.909247815744,0.909207903596,0.909167983091,0.909128054228,0.909088117009,0.909048171434,0.909008217503,0.908968255217,0.908928284576,0.90888830558,0.908848318229,0.908808322525,0.908768318467,0.908728306056,0.908688285293,0.908648256176,0.908608218708,0.908568172888,0.908528118716,0.908488056194,0.908447985321,0.908407906097,0.908367818524,0.908327722601,0.908287618329,0.908247505709,0.908207384739,0.908167255422,0.908127117757,0.908086971745,0.908046817386,0.90800665468,0.907966483629,0.907926304231,0.907886116488,0.907845920399,0.907805715966,0.907765503189,0.907725282068,0.907685052603,0.907644814795,0.907604568643,0.90756431415,0.907524051314,0.907483780137,0.907443500618,0.907403212758,0.907362916557,0.907322612016,0.907282299136,0.907241977915,0.907201648356,0.907161310458,0.907120964221,0.907080609646,0.907040246734,0.906999875484,0.906959495897,0.906919107974,0.906878711714,0.906838307119,0.906797894188,0.906757472922,0.906717043321,0.906676605386,0.906636159117,0.906595704515,0.906555241579,0.90651477031,0.906474290709,0.906433802776,0.906393306511,0.906352801915,0.906312288987,0.906271767729,0.906231238141,0.906190700223,0.906150153975,0.906109599398,0.906069036493,0.906028465259,0.905987885697,0.905947297807,0.90590670159,0.905866097047,0.905825484176,0.90578486298,0.905744233458,0.90570359561,0.905662949437,0.90562229494,0.905581632118,0.905540960973,0.905500281504,0.905459593711,0.905418897596,0.905378193159,0.905337480399,0.905296759318,0.905256029916,0.905215292192,0.905174546148,0.905133791784,0.9050930291,0.905052258097,0.905011478775,0.904970691134,0.904929895174,0.904889090897,0.904848278302,0.90480745739,0.904766628162,0.904725790616,0.904684944755,0.904644090578,0.904603228086,0.904562357279,0.904521478157,0.904480590721,0.904439694972,0.904398790909,0.904357878533,0.904316957844,0.904276028843,0.90423509153,0.904194145906,0.90415319197,0.904112229724,0.904071259167,0.9040302803,0.903989293123,0.903948297638,0.903907293843,0.90386628174,0.903825261328,0.903784232609,0.903743195583,0.903702150249,0.903661096609,0.903620034663,0.903578964411,0.903537885853,0.90349679899,0.903455703822,0.90341460035,0.903373488574,0.903332368495,0.903291240112,0.903250103426,0.903208958438,0.903167805147,0.903126643555,0.903085473662,0.903044295468,0.903003108973,0.902961914177,0.902920711082,0.902879499688,0.902838279995,0.902797052002,0.902755815712,0.902714571123,0.902673318237,0.902632057054,0.902590787574,0.902549509798,0.902508223725,0.902466929357,0.902425626694,0.902384315735,0.902342996482,0.902301668935,0.902260333095,0.902218988961,0.902177636533,0.902136275814,0.902094906802,0.902053529498,0.902012143902,0.901970750016,0.901929347839,0.901887937371,0.901846518614,0.901805091567,0.901763656231,0.901722212606,0.901680760692,0.90163930049,0.901597832001,0.901556355225,0.901514870161,0.901473376811,0.901431875175,0.901390365253,0.901348847046,0.901307320554,0.901265785777,0.901224242716,0.901182691371,0.901141131742,0.901099563831,0.901057987636,0.90101640316,0.900974810401,0.900933209361,0.90089160004,0.900849982438,0.900808356555,0.900766722392,0.90072507995,0.900683429229,0.900641770228,0.900600102949,0.900558427392,0.900516743558,0.900475051445,0.900433351056,0.900391642391,0.900349925449,0.900308200231,0.900266466738,0.90022472497,0.900182974927,0.90014121661,0.900099450019,0.900057675154,0.900015892016,0.899974100606,0.899932300923,0.899890492968,0.899848676742,0.899806852244,0.899765019475,0.899723178436,0.899681329127,0.899639471549,0.899597605701,0.899555731584,0.899513849198,0.899471958545,0.899430059624,0.899388152435,0.899346236979,0.899304313257,0.899262381269,0.899220441014,0.899178492495,0.89913653571,0.89909457066,0.899052597347,0.899010615769,0.898968625928,0.898926627824,0.898884621457,0.898842606827,0.898800583936,0.898758552783,0.898716513369,0.898674465694,0.898632409759,0.898590345563,0.898548273108,0.898506192394,0.898464103421,0.898422006189,0.898379900699,0.898337786952,0.898295664947,0.898253534685,0.898211396167,0.898169249393,0.898127094362,0.898084931077,0.898042759536,0.898000579741,0.897958391691,0.897916195388,0.897873990831,0.897831778021,0.897789556959,0.897747327644,0.897705090077,0.897662844259,0.89762059019,0.89757832787,0.897536057299,0.897493778479,0.897451491409,0.89740919609,0.897366892522,0.897324580705,0.897282260641,0.897239932329,0.89719759577,0.897155250964,0.897112897911,0.897070536613,0.897028167068,0.896985789279,0.896943403244,0.896901008965,0.896858606442,0.896816195676,0.896773776665,0.896731349412,0.896688913917,0.896646470179,0.896604018199,0.896561557978,0.896519089516,0.896476612813,0.89643412787,0.896391634688,0.896349133266,0.896306623604,0.896264105705,0.896221579567,0.896179045191,0.896136502577,0.896093951727,0.896051392639,0.896008825316,0.895966249756,0.895923665961,0.895881073931,0.895838473666,0.895795865167,0.895753248434,0.895710623467,0.895667990267,0.895625348834,0.895582699169,0.895540041272,0.895497375143,0.895454700783,0.895412018192,0.895369327371,0.89532662832,0.895283921039,0.895241205528,0.895198481789,0.895155749822,0.895113009626,0.895070261203,0.895027504552,0.894984739675,0.894941966571,0.89489918524,0.894856395685,0.894813597903,0.894770791897,0.894727977667,0.894685155212,0.894642324533,0.894599485631,0.894556638506,0.894513783159,0.894470919589,0.894428047798,0.894385167785,0.894342279551,0.894299383097,0.894256478422,0.894213565528,0.894170644414,0.894127715081,0.89408477753,0.89404183176,0.893998877772,0.893955915567,0.893912945145,0.893869966506,0.893826979651,0.893783984581,0.893740981294,0.893697969793,0.893654950077,0.893611922146,0.893568886002,0.893525841644,0.893482789074,0.89343972829,0.893396659294,0.893353582086,0.893310496667,0.893267403037,0.893224301196,0.893181191144,0.893138072883,0.893094946412,0.893051811732,0.893008668843,0.892965517746,0.892922358441,0.892879190928,0.892836015208,0.892792831282,0.892749639149,0.89270643881,0.892663230265,0.892620013516,0.892576788562,0.892533555403,0.89249031404,0.892447064474,0.892403806704,0.892360540732,0.892317266557,0.892273984181,0.892230693602,0.892187394823,0.892144087843,0.892100772662,0.892057449282,0.892014117701,0.891970777922,0.891927429944,0.891884073767,0.891840709392,0.89179733682,0.891753956051,0.891710567084,0.891667169922,0.891623764563,0.891580351009,0.891536929259,0.891493499315,0.891450061176,0.891406614843,0.891363160317,0.891319697597,0.891276226685,0.89123274758,0.891189260283,0.891145764795,0.891102261115,0.891058749244,0.891015229183,0.890971700932,0.890928164492,0.890884619862,0.890841067043,0.890797506036,0.890753936841,0.890710359459,0.890666773889,0.890623180132,0.890579578189,0.89053596806,0.890492349745,0.890448723245,0.89040508856,0.890361445691,0.890317794637,0.890274135401,0.890230467981,0.890186792378,0.890143108592,0.890099416625,0.890055716476,0.890012008146,0.889968291635,0.889924566944,0.889880834073,0.889837093022,0.889793343792,0.889749586383,0.889705820796,0.889662047031,0.889618265088,0.889574474968,0.889530676671,0.889486870198,0.889443055549,0.889399232724,0.889355401724,0.88931156255,0.889267715201,0.889223859678,0.889179995981,0.889136124112,0.889092244069,0.889048355855,0.889004459468,0.88896055491,0.88891664218,0.88887272128,0.88882879221,0.88878485497,0.88874090956,0.888696955981,0.888652994233,0.888609024317,0.888565046233,0.888521059982,0.888477065564,0.888433062978,0.888389052227,0.88834503331,0.888301006227,0.888256970979,0.888212927566,0.88816887599,0.888124816249,0.888080748345,0.888036672278,0.887992588048,0.887948495656,0.887904395102,0.887860286387,0.88781616951,0.887772044473,0.887727911276,0.887683769919,0.887639620403,0.887595462728,0.887551296894,0.887507122901,0.887462940752,0.887418750444,0.88737455198,0.887330345359,0.887286130582,0.88724190765,0.887197676562,0.887153437319,0.887109189921,0.88706493437,0.887020670664,0.886976398806,0.886932118794,0.88688783063,0.886843534314,0.886799229847,0.886754917228,0.886710596458,0.886666267537,0.886621930467,0.886577585247,0.886533231878,0.88648887036,0.886444500693,0.886400122879,0.886355736917,0.886311342807,0.886266940551,0.886222530149,0.8861781116,0.886133684907,0.886089250067,0.886044807084,0.886000355955,0.885955896683,0.885911429268,0.885866953709,0.885822470007,0.885777978164,0.885733478178,0.885688970051,0.885644453783,0.885599929374,0.885555396825,0.885510856136,0.885466307308,0.885421750341,0.885377185235,0.885332611991,0.885288030609,0.885243441089,0.885198843433,0.88515423764,0.885109623711,0.885065001647,0.885020371447,0.884975733112,0.884931086642,0.884886432039,0.884841769301,0.884797098431,0.884752419428,0.884707732292,0.884663037024,0.884618333624,0.884573622094,0.884528902432,0.88448417464,0.884439438718,0.884394694667,0.884349942486,0.884305182177,0.884260413739,0.884215637173,0.88417085248,0.88412605966,0.884081258713,0.884036449639,0.88399163244,0.883946807116,0.883901973666,0.883857132091,0.883812282393,0.883767424571,0.883722558625,0.883677684556,0.883632802365,0.883587912051,0.883543013616,0.883498107059,0.883453192382,0.883408269584,0.883363338666,0.883318399628,0.883273452471,0.883228497195,0.883183533801,0.883138562288,0.883093582658,0.883048594911,0.883003599047,0.882958595066,0.88291358297,0.882868562758,0.882823534431,0.882778497989,0.882733453433,0.882688400763,0.88264333998,0.882598271083,0.882553194074,0.882508108952,0.882463015719,0.882417914374,0.882372804919,0.882327687352,0.882282561676,0.88223742789,0.882192285994,0.88214713599,0.882101977877,0.882056811656,0.882011637327,0.881966454891,0.881921264348,0.881876065699,0.881830858944,0.881785644083,0.881740421117,0.881695190046,0.881649950871,0.881604703592,0.881559448209,0.881514184723,0.881468913135,0.881423633444,0.881378345652,0.881333049758,0.881287745763,0.881242433667,0.881197113471,0.881151785176,0.881106448781,0.881061104287,0.881015751694,0.880970391004,0.880925022216,0.88087964533,0.880834260348,0.880788867269,0.880743466094,0.880698056824,0.880652639458,0.880607213998,0.880561780443,0.880516338794,0.880470889052,0.880425431217,0.880379965289,0.880334491269,0.880289009157,0.880243518953,0.880198020659,0.880152514274,0.880106999798,0.880061477233,0.880015946579,0.879970407836,0.879924861004,0.879879306084,0.879833743076,0.879788171982,0.8797425928,0.879697005532,0.879651410178,0.879605806739,0.879560195214,0.879514575604,0.879468947911,0.879423312133,0.879377668272,0.879332016328,0.879286356301,0.879240688192,0.879195012001,0.879149327729,0.879103635376,0.879057934942,0.879012226429,0.878966509835,0.878920785162,0.878875052411,0.878829311581,0.878783562673,0.878737805687,0.878692040625,0.878646267485,0.878600486269,0.878554696977,0.87850889961,0.878463094168,0.878417280651,0.87837145906,0.878325629395,0.878279791657,0.878233945845,0.878188091961,0.878142230005,0.878096359978,0.878050481879,0.878004595709,0.877958701469,0.877912799159,0.877866888779,0.87782097033,0.877775043812,0.877729109226,0.877683166572,0.877637215851,0.877591257062,0.877545290207,0.877499315286,0.877453332299,0.877407341246,0.877361342129,0.877315334947,0.877269319701,0.877223296392,0.877177265019,0.877131225583,0.877085178085,0.877039122525,0.876993058903,0.87694698722,0.876900907477,0.876854819673,0.876808723809,0.876762619886,0.876716507904,0.876670387863,0.876624259764,0.876578123608,0.876531979394,0.876485827123,0.876439666796,0.876393498412,0.876347321973,0.876301137479,0.87625494493,0.876208744327,0.87616253567,0.876116318959,0.876070094195,0.876023861379,0.87597762051,0.87593137159,0.875885114618,0.875838849595,0.875792576522,0.875746295399,0.875700006226,0.875653709003,0.875607403732,0.875561090413,0.875514769045,0.87546843963,0.875422102168,0.875375756659,0.875329403104,0.875283041503,0.875236671857,0.875190294165,0.87514390843,0.87509751465,0.875051112826,0.875004702959,0.874958285049,0.874911859097,0.874865425102,0.874818983066,0.874772532989,0.874726074872,0.874679608713,0.874633134516,0.874586652278,0.874540162002,0.874493663687,0.874447157334,0.874400642943,0.874354120515,0.87430759005,0.874261051548,0.874214505011,0.874167950438,0.874121387829,0.874074817186,0.874028238509,0.873981651798,0.873935057053,0.873888454276,0.873841843465,0.873795224623,0.873748597749,0.873701962843,0.873655319907,0.87360866894,0.873562009943,0.873515342917,0.873468667861,0.873421984777,0.873375293664,0.873328594524,0.873281887356,0.873235172161,0.873188448939,0.873141717692,0.873094978418,0.87304823112,0.873001475796,0.872954712448,0.872907941076,0.87286116168,0.872814374261,0.87276757882,0.872720775356,0.87267396387,0.872627144363,0.872580316835,0.872533481286,0.872486637717,0.872439786129,0.872392926521,0.872346058894,0.872299183249,0.872252299586,0.872205407906,0.872158508208,0.872111600493,0.872064684763,0.872017761016,0.871970829254,0.871923889477,0.871876941686,0.87182998588,0.871783022061,0.871736050229,0.871689070383,0.871642082526,0.871595086656,0.871548082775,0.871501070883,0.87145405098,0.871407023067,0.871359987144,0.871312943212,0.87126589127,0.871218831321,0.871171763363,0.871124687398,0.871077603425,0.871030511446,0.87098341146,0.870936303469,0.870889187472,0.87084206347,0.870794931464,0.870747791453,0.870700643438,0.870653487421,0.8706063234,0.870559151377,0.870511971352,0.870464783325,0.870417587298,0.870370383269,0.870323171241,0.870275951212,0.870228723184,0.870181487157,0.870134243132,0.870086991109,0.870039731088,0.869992463069,0.869945187054,0.869897903043,0.869850611035,0.869803311033,0.869756003035,0.869708687042,0.869661363056,0.869614031075,0.869566691101,0.869519343135,0.869471987176,0.869424623225,0.869377251282,0.869329871349,0.869282483424,0.86923508751,0.869187683605,0.869140271711,0.869092851828,0.869045423957,0.868997988098,0.868950544251,0.868903092416,0.868855632595,0.868808164788,0.868760688995,0.868713205216,0.868665713452,0.868618213704,0.868570705971,0.868523190255,0.868475666556,0.868428134873,0.868380595209,0.868333047562,0.868285491934,0.868237928324,0.868190356734,0.868142777164,0.868095189614,0.868047594085,0.867999990577,0.86795237909,0.867904759625,0.867857132183,0.867809496763,0.867761853367,0.867714201995,0.867666542646,0.867618875323,0.867571200024,0.867523516751,0.867475825503,0.867428126282,0.867380419088,0.867332703921,0.867284980782,0.867237249671,0.867189510588,0.867141763534,0.86709400851,0.867046245516,0.866998474552,0.866950695618,0.866902908716,0.866855113845,0.866807311007,0.866759500201,0.866711681428,0.866663854688,0.866616019982,0.866568177311,0.866520326674,0.866472468072,0.866424601505,0.866376726975,0.866328844481,0.866280954025,0.866233055605,0.866185149223,0.86613723488,0.866089312575,0.866041382309,0.865993444082,0.865945497896,0.86589754375,0.865849581645,0.865801611581,0.865753633559,0.865705647579,0.865657653642,0.865609651748,0.865561641897,0.865513624091,0.865465598328,0.865417564611,0.865369522938,0.865321473312,0.865273415731,0.865225350198,0.865177276711,0.865129195272,0.86508110588,0.865033008537,0.864984903243,0.864936789998,0.864888668803,0.864840539658,0.864792402563,0.864744257519,0.864696104527,0.864647943587,0.864599774699,0.864551597864,0.864503413082,0.864455220354,0.86440701968,0.864358811061,0.864310594496,0.864262369987,0.864214137534,0.864165897137,0.864117648797,0.864069392514,0.864021128289,0.863972856122,0.863924576013,0.863876287963,0.863827991973,0.863779688043,0.863731376173,0.863683056364,0.863634728616,0.86358639293,0.863538049305,0.863489697744,0.863441338245,0.86339297081,0.863344595439,0.863296212131,0.863247820889,0.863199421712,0.863151014601,0.863102599555,0.863054176577,0.863005745665,0.862957306821,0.862908860044,0.862860405336,0.862811942697,0.862763472126,0.862714993626,0.862666507196,0.862618012836,0.862569510547,0.86252100033,0.862472482184,0.862423956111,0.862375422111,0.862326880184,0.86227833033,0.862229772551,0.862181206846,0.862132633216,0.862084051662,0.862035462184,0.861986864782,0.861938259456,0.861889646209,0.861841025038,0.861792395946,0.861743758933,0.861695113998,0.861646461143,0.861597800368,0.861549131673,0.861500455059,0.861451770527,0.861403078076,0.861354377707,0.861305669421,0.861256953218,0.861208229099,0.861159497063,0.861110757112,0.861062009245,0.861013253464,0.860964489769,0.86091571816,0.860866938638,0.860818151202,0.860769355855,0.860720552595,0.860671741424,0.860622922341,0.860574095348,0.860525260445,0.860476417632,0.860427566909,0.860378708278,0.860329841738,0.860280967291,0.860232084935,0.860183194673,0.860134296504,0.860085390429,0.860036476449,0.859987554563,0.859938624772,0.859889687077,0.859840741477,0.859791787975,0.859742826569,0.859693857261,0.859644880051,0.859595894939,0.859546901926,0.859497901012,0.859448892197,0.859399875483,0.85935085087,0.859301818357,0.859252777946,0.859203729637,0.85915467343,0.859105609326,0.859056537325,0.859007457429,0.858958369636,0.858909273948,0.858860170365,0.858811058887,0.858761939516,0.858712812251,0.858663677093,0.858614534042,0.858565383099,0.858516224264,0.858467057538,0.858417882922,0.858368700414,0.858319510017,0.858270311731,0.858221105555,0.858171891491,0.858122669538,0.858073439698,0.858024201971,0.857974956357,0.857925702856,0.85787644147,0.857827172198,0.857777895041,0.85772861,0.857679317075,0.857630016266,0.857580707574,0.857531390999,0.857482066543,0.857432734204,0.857383393984,0.857334045883,0.857284689901,0.85723532604,0.857185954299,0.857136574679,0.857087187181,0.857037791804,0.85698838855,0.856938977418,0.856889558409,0.856840131525,0.856790696764,0.856741254128,0.856691803616,0.856642345231,0.856592878971,0.856543404838,0.856493922831,0.856444432952,0.8563949352,0.856345429577,0.856295916083,0.856246394717,0.856196865481,0.856147328375,0.8560977834,0.856048230555,0.855998669842,0.855949101261,0.855899524812,0.855849940496,0.855800348313,0.855750748263,0.855701140348,0.855651524567,0.855601900922,0.855552269412,0.855502630037,0.8554529828,0.855403327699,0.855353664735,0.855303993909,0.855254315222,0.855204628673,0.855154934263,0.855105231993,0.855055521863,0.855005803873,0.854956078025,0.854906344317,0.854856602752,0.854806853329,0.854757096049,0.854707330912,0.854657557919,0.85460777707,0.854557988365,0.854508191806,0.854458387392,0.854408575125,0.854358755003,0.854308927029,0.854259091202,0.854209247523,0.854159395992,0.85410953661,0.854059669377,0.854009794293,0.85395991136,0.853910020578,0.853860121946,0.853810215466,0.853760301138,0.853710378962,0.85366044894,0.85361051107,0.853560565355,0.853510611793,0.853460650387,0.853410681135,0.853360704039,0.8533107191,0.853260726316,0.85321072569,0.853160717221,0.853110700911,0.853060676758,0.853010644765,0.85296060493,0.852910557256,0.852860501742,0.852810438388,0.852760367196,0.852710288165,0.852660201296,0.85261010659,0.852560004047,0.852509893667,0.852459775451,0.8524096494,0.852359515513,0.852309373792,0.852259224236,0.852209066847,0.852158901624,0.852108728568,0.85205854768,0.85200835896,0.851958162409,0.851907958027,0.851857745814,0.851807525771,0.851757297898,0.851707062196,0.851656818666,0.851606567307,0.85155630812,0.851506041106,0.851455766266,0.851405483598,0.851355193105,0.851304894787,0.851254588643,0.851204274675,0.851153952883,0.851103623267,0.851053285828,0.851002940566,0.850952587482,0.850902226576,0.850851857849,0.850801481302,0.850751096933,0.850700704745,0.850650304737,0.850599896911,0.850549481266,0.850499057802,0.850448626522,0.850398187424,0.850347740509,0.850297285778,0.850246823231,0.850196352869,0.850145874693,0.850095388702,0.850044894897,0.849994393278,0.849943883847,0.849893366603,0.849842841547,0.849792308679,0.849741768001,0.849691219512,0.849640663212,0.849590099103,0.849539527185,0.849488947457,0.849438359922,0.849387764579,0.849337161428,0.84928655047,0.849235931706,0.849185305136,0.84913467076,0.84908402858,0.849033378594,0.848982720805,0.848932055212,0.848881381815,0.848830700616,0.848780011615,0.848729314812,0.848678610207,0.848627897802,0.848577177596,0.848526449591,0.848475713785,0.848424970181,0.848374218779,0.848323459578,0.848272692579,0.848221917784,0.848171135192,0.848120344803,0.848069546619,0.84801874064,0.847967926866,0.847917105297,0.847866275935,0.847815438779,0.84776459383,0.847713741089,0.847662880555,0.847612012231,0.847561136115,0.847510252208,0.847459360512,0.847408461025,0.84735755375,0.847306638686,0.847255715833,0.847204785193,0.847153846766,0.847102900551,0.84705194655,0.847000984764,0.846950015192,0.846899037834,0.846848052693,0.846797059767,0.846746059058,0.846695050565,0.84664403429,0.846593010233,0.846541978394,0.846490938774,0.846439891373,0.846388836192,0.846337773231,0.846286702491,0.846235623971,0.846184537674,0.846133443598,0.846082341745,0.846031232115,0.845980114708,0.845928989525,0.845877856567,0.845826715834,0.845775567326,0.845724411043,0.845673246987,0.845622075158,0.845570895556,0.845519708182,0.845468513036,0.845417310118,0.84536609943,0.845314880971,0.845263654742,0.845212420744,0.845161178976,0.845109929441,0.845058672137,0.845007407065,0.844956134226,0.844904853621,0.84485356525,0.844802269113,0.84475096521,0.844699653543,0.844648334111,0.844597006916,0.844545671957,0.844494329236,0.844442978752,0.844391620506,0.844340254499,0.84428888073,0.844237499201,0.844186109912,0.844134712864,0.844083308056,0.84403189549,0.843980475166,0.843929047084,0.843877611244,0.843826167648,0.843774716296,0.843723257188,0.843671790324,0.843620315706,0.843568833333,0.843517343207,0.843465845327,0.843414339694,0.843362826308,0.843311305171,0.843259776282,0.843208239642,0.843156695251,0.84310514311,0.84305358322,0.84300201558,0.842950440192,0.842898857056,0.842847266172,0.84279566754,0.842744061162,0.842692447037,0.842640825167,0.842589195551,0.84253755819,0.842485913085,0.842434260236,0.842382599643,0.842330931308,0.842279255229,0.842227571409,0.842175879848,0.842124180545,0.842072473501,0.842020758718,0.841969036194,0.841917305932,0.841865567931,0.841813822191,0.841762068714,0.841710307499,0.841658538548,0.84160676186,0.841554977437,0.841503185278,0.841451385384,0.841399577756,0.841347762394,0.841295939298,0.841244108469,0.841192269908,0.841140423614,0.841088569589,0.841036707833,0.840984838347,0.84093296113,0.840881076183,0.840829183508,0.840777283103,0.84072537497,0.84067345911,0.840621535522,0.840569604208,0.840517665167,0.8404657184,0.840413763908,0.840361801691,0.84030983175,0.840257854084,0.840205868695,0.840153875583,0.840101874749,0.840049866193,0.839997849915,0.839945825916,0.839893794196,0.839841754756,0.839789707597,0.839737652718,0.839685590121,0.839633519805,0.839581441772,0.839529356022,0.839477262555,0.839425161371,0.839373052472,0.839320935857,0.839268811527,0.839216679484,0.839164539726,0.839112392254,0.83906023707,0.839008074174,0.838955903565,0.838903725245,0.838851539214,0.838799345472,0.83874714402,0.838694934859,0.838642717989,0.838590493409,0.838538261122,0.838486021127,0.838433773425,0.838381518017,0.838329254902,0.838276984081,0.838224705555,0.838172419324,0.838120125389,0.83806782375,0.838015514408,0.837963197363,0.837910872615,0.837858540166,0.837806200015,0.837753852163,0.837701496611,0.837649133359,0.837596762407,0.837544383757,0.837491997408,0.83743960336,0.837387201616,0.837334792174,0.837282375035,0.837229950201,0.837177517671,0.837125077445,0.837072629525,0.837020173911,0.836967710603,0.836915239602,0.836862760908,0.836810274522,0.836757780444,0.836705278674,0.836652769214,0.836600252064,0.836547727224,0.836495194694,0.836442654475,0.836390106568,0.836337550974,0.836284987691,0.836232416722,0.836179838066,0.836127251725,0.836074657698,0.836022055985,0.835969446589,0.835916829508,0.835864204743,0.835811572296,0.835758932166,0.835706284354,0.83565362886,0.835600965685,0.835548294829,0.835495616294,0.835442930078,0.835390236183,0.83533753461,0.835284825358,0.835232108429,0.835179383822,0.835126651539,0.835073911579,0.835021163943,0.834968408632,0.834915645647,0.834862874986,0.834810096652,0.834757310645,0.834704516965,0.834651715612,0.834598906587,0.834546089891,0.834493265524,0.834440433486,0.834387593778,0.834334746401,0.834281891355,0.83422902864,0.834176158258,0.834123280207,0.83407039449,0.834017501106,0.833964600056,0.83391169134,0.833858774959,0.833805850914,0.833752919204,0.833699979831,0.833647032794,0.833594078095,0.833541115733,0.83348814571,0.833435168026,0.833382182681,0.833329189675,0.83327618901,0.833223180685,0.833170164702,0.83311714106,0.833064109761,0.833011070804,0.83295802419,0.83290496992,0.832851907994,0.832798838413,0.832745761176,0.832692676286,0.832639583741,0.832586483543,0.832533375692,0.832480260188,0.832427137033,0.832374006226,0.832320867768,0.832267721659,0.832214567901,0.832161406493,0.832108237436,0.83205506073,0.832001876376,0.831948684375,0.831895484727,0.831842277432,0.83178906249,0.831735839904,0.831682609672,0.831629371795,0.831576126274,0.83152287311,0.831469612303,0.831416343852,0.83136306776,0.831309784026,0.83125649265,0.831203193634,0.831149886978,0.831096572682,0.831043250746,0.830989921172,0.83093658396,0.83088323911,0.830829886622,0.830776526498,0.830723158737,0.830669783341,0.830616400309,0.830563009642,0.830509611341,0.830456205406,0.830402791838,0.830349370637,0.830295941803,0.830242505338,0.830189061241,0.830135609513,0.830082150155,0.830028683167,0.829975208549,0.829921726303,0.829868236428,0.829814738925,0.829761233795,0.829707721037,0.829654200653,0.829600672643,0.829547137008,0.829493593747,0.829440042862,0.829386484353,0.829332918221,0.829279344465,0.829225763087,0.829172174087,0.829118577465,0.829064973222,0.829011361359,0.828957741875,0.828904114772,0.82885048005,0.828796837709,0.82874318775,0.828689530173,0.828635864979,0.828582192169,0.828528511742,0.8284748237,0.828421128043,0.828367424771,0.828313713884,0.828259995384,0.828206269271,0.828152535545,0.828098794207,0.828045045258,0.827991288697,0.827937524525,0.827883752743,0.827829973352,0.827776186351,0.827722391741,0.827668589524,0.827614779698,0.827560962265,0.827507137226,0.82745330458,0.827399464328,0.827345616471,0.827291761009,0.827237897943,0.827184027274,0.827130149001,0.827076263125,0.827022369647,0.826968468567,0.826914559885,0.826860643603,0.826806719721,0.826752788238,0.826698849157,0.826644902476,0.826590948197,0.826536986321,0.826483016847,0.826429039776,0.826375055109,0.826321062846,0.826267062987,0.826213055534,0.826159040486,0.826105017845,0.82605098761,0.825996949782,0.825942904362,0.82588885135,0.825834790746,0.825780722552,0.825726646767,0.825672563392,0.825618472428,0.825564373875,0.825510267734,0.825456154004,0.825402032688,0.825347903784,0.825293767294,0.825239623218,0.825185471556,0.82513131231,0.825077145479,0.825022971065,0.824968789066,0.824914599485,0.824860402322,0.824806197576,0.824751985249,0.824697765342,0.824643537853,0.824589302785,0.824535060137,0.824480809911,0.824426552106,0.824372286723,0.824318013762,0.824263733225,0.824209445111,0.824155149421,0.824100846156,0.824046535315,0.8239922169,0.823937890912,0.82388355735,0.823829216215,0.823774867507,0.823720511227,0.823666147376,0.823611775954,0.823557396962,0.8235030104,0.823448616268,0.823394214567,0.823339805298,0.82328538846,0.823230964056,0.823176532084,0.823122092546,0.823067645442,0.823013190772,0.822958728538,0.822904258739,0.822849781376,0.822795296449,0.82274080396,0.822686303908,0.822631796295,0.822577281119,0.822522758383,0.822468228087,0.82241369023,0.822359144814,0.822304591839,0.822250031306,0.822195463214,0.822140887565,0.82208630436,0.822031713597,0.821977115279,0.821922509406,0.821867895977,0.821813274994,0.821758646457,0.821704010367,0.821649366724,0.821594715528,0.821540056781,0.821485390482,0.821430716632,0.821376035231,0.821321346281,0.821266649781,0.821211945733,0.821157234136,0.821102514991,0.821047788299,0.82099305406,0.820938312274,0.820883562943,0.820828806066,0.820774041644,0.820719269678,0.820664490168,0.820609703115,0.820554908519,0.82050010638,0.8204452967,0.820390479478,0.820335654715,0.820280822412,0.820225982569,0.820171135187,0.820116280266,0.820061417807,0.82000654781,0.819951670275,0.819896785204,0.819841892596,0.819786992453,0.819732084774,0.819677169561,0.819622246813,0.819567316531,0.819512378716,0.819457433369,0.819402480489,0.819347520077,0.819292552134,0.81923757666,0.819182593656,0.819127603122,0.819072605059,0.819017599467,0.818962586347,0.8189075657,0.818852537525,0.818797501823,0.818742458595,0.818687407842,0.818632349563,0.818577283759,0.818522210432,0.81846712958,0.818412041206,0.818356945309,0.818301841889,0.818246730948,0.818191612486,0.818136486503,0.818081353,0.818026211978,0.817971063436,0.817915907376,0.817860743797,0.817805572701,0.817750394088,0.817695207959,0.817640014313,0.817584813152,0.817529604475,0.817474388284,0.817419164579,0.817363933361,0.817308694629,0.817253448385,0.817198194629,0.817142933361,0.817087664583,0.817032388294,0.816977104494,0.816921813186,0.816866514368,0.816811208042,0.816755894208,0.816700572867,0.816645244018,0.816589907664,0.816534563803,0.816479212437,0.816423853566,0.81636848719,0.816313113311,0.816257731928,0.816202343043,0.816146946655,0.816091542765,0.816036131374,0.815980712482,0.81592528609,0.815869852198,0.815814410807,0.815758961917,0.815703505528,0.815648041642,0.815592570259,0.815537091378,0.815481605002,0.81542611113,0.815370609762,0.8153151009,0.815259584544,0.815204060694,0.815148529351,0.815092990515,0.815037444187,0.814981890367,0.814926329057,0.814870760255,0.814815183964,0.814759600182,0.814704008912,0.814648410153,0.814592803906,0.814537190172,0.81448156895,0.814425940242,0.814370304048,0.814314660369,0.814259009204,0.814203350555,0.814147684422,0.814092010805,0.814036329706,0.813980641124,0.81392494506,0.813869241515,0.813813530489,0.813757811982,0.813702085995,0.81364635253,0.813590611585,0.813534863162,0.813479107261,0.813423343883,0.813367573027,0.813311794696,0.813256008889,0.813200215606,0.813144414849,0.813088606618,0.813032790913,0.812976967734,0.812921137083,0.81286529896,0.812809453365,0.812753600299,0.812697739762,0.812641871755,0.812585996278,0.812530113333,0.812474222918,0.812418325036,0.812362419686,0.812306506869,0.812250586585,0.812194658836,0.81213872362,0.81208278094,0.812026830796,0.811970873187,0.811914908115,0.81185893558,0.811802955583,0.811746968123,0.811690973202,0.811634970821,0.811578960979,0.811522943677,0.811466918916,0.811410886695,0.811354847017,0.811298799881,0.811242745287,0.811186683237,0.811130613731,0.811074536768,0.811018452351,0.810962360479,0.810906261152,0.810850154372,0.810794040139,0.810737918453,0.810681789315,0.810625652726,0.810569508685,0.810513357194,0.810457198253,0.810401031862,0.810344858022,0.810288676733,0.810232487997,0.810176291813,0.810120088182,0.810063877105,0.810007658582,0.809951432613,0.809895199199,0.809838958341,0.80978271004,0.809726454294,0.809670191106,0.809613920476,0.809557642404,0.809501356891,0.809445063937,0.809388763542,0.809332455708,0.809276140435,0.809219817723,0.809163487572,0.809107149985,0.80905080496,0.808994452498,0.8089380926,0.808881725267,0.808825350499,0.808768968296,0.808712578659,0.808656181588,0.808599777085,0.808543365149,0.808486945781,0.808430518982,0.808374084751,0.808317643091,0.808261194,0.80820473748,0.808148273531,0.808091802154,0.80803532335,0.807978837117,0.807922343458,0.807865842373,0.807809333862,0.807752817926,0.807696294565,0.80763976378,0.807583225572,0.80752667994,0.807470126886,0.807413566409,0.807356998511,0.807300423192,0.807243840452,0.807187250293,0.807130652714,0.807074047716,0.807017435299,0.806960815464,0.806904188213,0.806847553544,0.806790911459,0.806734261958,0.806677605041,0.80662094071,0.806564268965,0.806507589806,0.806450903233,0.806394209248,0.806337507851,0.806280799042,0.806224082821,0.806167359191,0.80611062815,0.806053889699,0.805997143839,0.805940390571,0.805883629895,0.805826861811,0.805770086321,0.805713303423,0.80565651312,0.805599715412,0.805542910298,0.80548609778,0.805429277859,0.805372450534,0.805315615806,0.805258773676,0.805201924144,0.805145067211,0.805088202877,0.805031331143,0.804974452009,0.804917565476,0.804860671545,0.804803770215,0.804746861488,0.804689945364,0.804633021843,0.804576090926,0.804519152614,0.804462206907,0.804405253805,0.804348293309,0.80429132542,0.804234350139,0.804177367464,0.804120377398,0.804063379941,0.804006375093,0.803949362854,0.803892343226,0.803835316209,0.803778281803,0.803721240009,0.803664190827,0.803607134258,0.803550070303,0.803492998961,0.803435920234,0.803378834122,0.803321740625,0.803264639745,0.803207531481,0.803150415834,0.803093292804,0.803036162393,0.802979024601,0.802921879428,0.802864726874,0.802807566941,0.802750399628,0.802693224937,0.802636042867,0.80257885342,0.802521656596,0.802464452395,0.802407240818,0.802350021866,0.802292795538,0.802235561836,0.80217832076,0.802121072311,0.802063816488,0.802006553293,0.801949282727,0.801892004789,0.80183471948,0.801777426801,0.801720126752,0.801662819334,0.801605504547,0.801548182392,0.801490852869,0.80143351598,0.801376171723,0.801318820101,0.801261461113,0.80120409476,0.801146721042,0.80108933996,0.801031951515,0.800974555708,0.800917152537,0.800859742005,0.800802324112,0.800744898857,0.800687466243,0.800630026269,0.800572578935,0.800515124243,0.800457662193,0.800400192785,0.80034271602,0.800285231898,0.80022774042,0.800170241587,0.800112735399,0.800055221856,0.799997700959,0.799940172709,0.799882637106,0.799825094151,0.799767543844,0.799709986186,0.799652421176,0.799594848817,0.799537269108,0.79947968205,0.799422087643,0.799364485888,0.799306876785,0.799249260335,0.799191636539,0.799134005397,0.799076366909,0.799018721077,0.7989610679,0.798903407379,0.798845739515,0.798788064308,0.798730381758,0.798672691867,0.798614994635,0.798557290062,0.798499578149,0.798441858896,0.798384132304,0.798326398373,0.798268657105,0.798210908499,0.798153152556,0.798095389276,0.798037618661,0.79797984071,0.797922055424,0.797864262804,0.79780646285,0.797748655563,0.797690840943,0.797633018991,0.797575189708,0.797517353093,0.797459509147,0.797401657872,0.797343799267,0.797285933333,0.79722806007,0.79717017948,0.797112291562,0.797054396317,0.796996493746,0.796938583849,0.796880666627,0.79682274208,0.796764810208,0.796706871013,0.796648924495,0.796590970655,0.796533009492,0.796475041008,0.796417065202,0.796359082076,0.79630109163,0.796243093865,0.796185088781,0.796127076378,0.796069056658,0.79601102962,0.795952995266,0.795894953595,0.795836904609,0.795778848307,0.795720784691,0.795662713761,0.795604635517,0.79554654996,0.795488457091,0.79543035691,0.795372249417,0.795314134613,0.7952560125,0.795197883076,0.795139746343,0.795081602301,0.795023450951,0.794965292293,0.794907126328,0.794848953057,0.794790772479,0.794732584596,0.794674389408,0.794616186915,0.794557977119,0.794499760019,0.794441535616,0.794383303911,0.794325064904,0.794266818596,0.794208564987,0.794150304078,0.794092035869,0.794033760361,0.793975477554,0.79391718745,0.793858890048,0.793800585349,0.793742273353,0.793683954062,0.793625627475,0.793567293593,0.793508952417,0.793450603948,0.793392248185,0.793333885129,0.793275514781,0.793217137142,0.793158752211,0.79310035999,0.793041960479,0.792983553679,0.79292513959,0.792866718212,0.792808289546,0.792749853593,0.792691410353,0.792632959827,0.792574502015,0.792516036918,0.792457564537,0.792399084871,0.792340597922,0.79228210369,0.792223602175,0.792165093378,0.7921065773,0.792048053941,0.791989523302,0.791930985383,0.791872440184,0.791813887707,0.791755327952,0.791696760919,0.791638186609,0.791579605023,0.79152101616,0.791462420022,0.791403816609,0.791345205921,0.79128658796,0.791227962725,0.791169330218,0.791110690438,0.791052043386,0.790993389064,0.790934727471,0.790876058607,0.790817382474,0.790758699072,0.790700008402,0.790641310463,0.790582605257,0.790523892785,0.790465173046,0.790406446041,0.790347711771,0.790288970236,0.790230221437,0.790171465375,0.790112702049,0.790053931461,0.789995153611,0.789936368499,0.789877576127,0.789818776494,0.789759969601,0.789701155449,0.789642334038,0.789583505369,0.789524669442,0.789465826258,0.789406975818,0.789348118121,0.789289253169,0.789230380962,0.7891715015,0.789112614785,0.789053720816,0.788994819595,0.788935911121,0.788876995395,0.788818072418,0.788759142191,0.788700204714,0.788641259986,0.78858230801,0.788523348786,0.788464382313,0.788405408593,0.788346427627,0.788287439414,0.788228443955,0.788169441251,0.788110431302,0.788051414109,0.787992389673,0.787933357993,0.787874319071,0.787815272907,0.787756219501,0.787697158855,0.787638090968,0.787579015842,0.787519933476,0.787460843872,0.787401747029,0.787342642949,0.787283531631,0.787224413078,0.787165287288,0.787106154262,0.787047014002,0.786987866507,0.786928711779,0.786869549817,0.786810380623,0.786751204196,0.786692020538,0.786632829648,0.786573631529,0.786514426179,0.786455213599,0.786395993791,0.786336766754,0.786277532489,0.786218290997,0.786159042279,0.786099786334,0.786040523163,0.785981252768,0.785921975148,0.785862690303,0.785803398236,0.785744098945,0.785684792432,0.785625478697,0.785566157741,0.785506829564,0.785447494167,0.78538815155,0.785328801714,0.78526944466,0.785210080387,0.785150708897,0.78509133019,0.785031944267,0.784972551128,0.784913150773,0.784853743204,0.78479432842,0.784734906423,0.784675477213,0.78461604079,0.784556597156,0.784497146309,0.784437688252,0.784378222984,0.784318750507,0.78425927082,0.784199783925,0.784140289821,0.78408078851,0.784021279991,0.783961764266,0.783902241336,0.783842711199,0.783783173858,0.783723629312,0.783664077562,0.78360451861,0.783544952454,0.783485379096,0.783425798537,0.783366210777,0.783306615816,0.783247013655,0.783187404294,0.783127787735,0.783068163977,0.783008533022,0.782948894869,0.78288924952,0.782829596975,0.782769937233,0.782710270297,0.782650596167,0.782590914842,0.782531226324,0.782471530613,0.78241182771,0.782352117615,0.782292400329,0.782232675852,0.782172944185,0.782113205328,0.782053459283,0.781993706049,0.781933945627,0.781874178018,0.781814403222,0.781754621239,0.781694832071,0.781635035718,0.78157523218,0.781515421458,0.781455603552,0.781395778464,0.781335946193,0.78127610674,0.781216260106,0.781156406291,0.781096545296,0.781036677122,0.780976801768,0.780916919235,0.780857029525,0.780797132637,0.780737228572,0.780677317331,0.780617398914,0.780557473322,0.780497540555,0.780437600613,0.780377653499,0.780317699211,0.78025773775,0.780197769118,0.780137793314,0.78007781034,0.780017820195,0.77995782288,0.779897818396,0.779837806744,0.779777787923,0.779717761935,0.77965772878,0.779597688458,0.779537640971,0.779477586318,0.7794175245,0.779357455518,0.779297379373,0.779237296064,0.779177205593,0.779117107959,0.779057003164,0.778996891209,0.778936772093,0.778876645817,0.778816512381,0.778756371788,0.778696224036,0.778636069126,0.778575907059,0.778515737836,0.778455561457,0.778395377922,0.778335187233,0.778274989389,0.778214784392,0.778154572241,0.778094352938,0.778034126482,0.777973892876,0.777913652118,0.777853404209,0.777793149151,0.777732886944,0.777672617588,0.777612341083,0.777552057431,0.777491766632,0.777431468687,0.777371163595,0.777310851358,0.777250531976,0.77719020545,0.77712987178,0.777069530967,0.777009183011,0.776948827913,0.776888465673,0.776828096293,0.776767719772,0.776707336111,0.776646945311,0.776586547372,0.776526142295,0.77646573008,0.776405310728,0.776344884239,0.776284450615,0.776224009855,0.77616356196,0.776103106931,0.776042644768,0.775982175472,0.775921699043,0.775861215483,0.77580072479,0.775740226967,0.775679722013,0.775619209929,0.775558690716,0.775498164374,0.775437630904,0.775377090306,0.775316542582,0.77525598773,0.775195425753,0.77513485665,0.775074280423,0.775013697071,0.774953106595,0.774892508996,0.774831904274,0.774771292431,0.774710673466,0.774650047379,0.774589414173,0.774528773846,0.774468126401,0.774407471836,0.774346810154,0.774286141353,0.774225465436,0.774164782402,0.774104092252,0.774043394987,0.773982690607,0.773921979112,0.773861260504,0.773800534783,0.773739801949,0.773679062003,0.773618314946,0.773557560778,0.773496799499,0.77343603111,0.773375255613,0.773314473006,0.773253683291,0.773192886469,0.77313208254,0.773071271504,0.773010453363,0.772949628116,0.772888795764,0.772827956308,0.772767109748,0.772706256086,0.77264539532,0.772584527453,0.772523652484,0.772462770415,0.772401881245,0.772340984975,0.772280081606,0.772219171139,0.772158253573,0.77209732891,0.77203639715,0.771975458294,0.771914512342,0.771853559294,0.771792599152,0.771731631916,0.771670657586,0.771609676163,0.771548687647,0.77148769204,0.771426689341,0.771365679552,0.771304662672,0.771243638702,0.771182607644,0.771121569497,0.771060524262,0.770999471939,0.77093841253,0.770877346034,0.770816272453,0.770755191786,0.770694104035,0.7706330092,0.770571907281,0.77051079828,0.770449682196,0.77038855903,0.770327428783,0.770266291455,0.770205147047,0.77014399556,0.770082836993,0.770021671348,0.769960498626,0.769899318826,0.769838131949,0.769776937996,0.769715736967,0.769654528864,0.769593313685,0.769532091433,0.769470862108,0.76940962571,0.769348382239,0.769287131697,0.769225874083,0.769164609399,0.769103337646,0.769042058822,0.76898077293,0.76891947997,0.768858179941,0.768796872846,0.768735558684,0.768674237456,0.768612909162,0.768551573804,0.768490231381,0.768428881894,0.768367525344,0.768306161731,0.768244791057,0.768183413321,0.768122028523,0.768060636666,0.767999237748,0.767937831772,0.767876418736,0.767814998642,0.767753571491,0.767692137283,0.767630696018,0.767569247698,0.767507792322,0.767446329891,0.767384860406,0.767323383868,0.767261900276,0.767200409632,0.767138911936,0.767077407188,0.76701589539,0.766954376542,0.766892850643,0.766831317696,0.7667697777,0.766708230657,0.766646676565,0.766585115427,0.766523547243,0.766461972013,0.766400389738,0.766338800418,0.766277204054,0.766215600647,0.766153990196,0.766092372704,0.76603074817,0.765969116594,0.765907477978,0.765845832322,0.765784179626,0.765722519892,0.765660853119,0.765599179308,0.76553749846,0.765475810575,0.765414115655,0.765352413699,0.765290704707,0.765228988682,0.765167265622,0.76510553553,0.765043798405,0.764982054247,0.764920303058,0.764858544838,0.764796779588,0.764735007308,0.764673227998,0.76461144166,0.764549648293,0.7644878479,0.764426040479,0.764364226031,0.764302404558,0.764240576059,0.764178740536,0.764116897989,0.764055048418,0.763993191824,0.763931328207,0.763869457569,0.763807579909,0.763745695228,0.763683803528,0.763621904807,0.763559999068,0.76349808631,0.763436166534,0.763374239741,0.763312305931,0.763250365105,0.763188417263,0.763126462407,0.763064500535,0.76300253165,0.762940555752,0.76287857284,0.762816582917,0.762754585981,0.762692582035,0.762630571078,0.762568553112,0.762506528136,0.762444496151,0.762382457158,0.762320411157,0.762258358149,0.762196298135,0.762134231114,0.762072157089,0.762010076058,0.761947988023,0.761885892985,0.761823790943,0.761761681899,0.761699565854,0.761637442806,0.761575312758,0.76151317571,0.761451031662,0.761388880615,0.761326722569,0.761264557525,0.761202385484,0.761140206446,0.761078020412,0.761015827383,0.760953627358,0.760891420339,0.760829206325,0.760766985319,0.760704757319,0.760642522328,0.760580280344,0.76051803137,0.760455775405,0.76039351245,0.760331242506,0.760268965573,0.760206681651,0.760144390742,0.760082092846,0.760019787964,0.759957476095,0.759895157241,0.759832831403,0.75977049858,0.759708158773,0.759645811984,0.759583458211,0.759521097457,0.759458729722,0.759396355006,0.759333973309,0.759271584633,0.759209188978,0.759146786345,0.759084376733,0.759021960145,0.758959536579,0.758897106037,0.75883466852,0.758772224027,0.75870977256,0.75864731412,0.758584848705,0.758522376319,0.75845989696,0.758397410629,0.758334917327,0.758272417055,0.758209909813,0.758147395602,0.758084874422,0.758022346273,0.757959811158,0.757897269075,0.757834720026,0.757772164011,0.75770960103,0.757647031085,0.757584454176,0.757521870303,0.757459279468,0.757396681669,0.75733407691,0.757271465188,0.757208846506,0.757146220865,0.757083588263,0.757020948703,0.756958302184,0.756895648707,0.756832988273,0.756770320883,0.756707646536,0.756644965234,0.756582276977,0.756519581766,0.756456879601,0.756394170483,0.756331454412,0.756268731389,0.756206001414,0.756143264489,0.756080520614,0.756017769788,0.755955012014,0.755892247291,0.75582947562,0.755766697001,0.755703911436,0.755641118924,0.755578319467,0.755515513065,0.755452699718,0.755389879427,0.755327052193,0.755264218016,0.755201376897,0.755138528836,0.755075673834,0.755012811891,0.754949943009,0.754887067187,0.754824184426,0.754761294728,0.754698398092,0.754635494518,0.754572584008,0.754509666563,0.754446742182,0.754383810866,0.754320872617,0.754257927433,0.754194975317,0.754132016268,0.754069050288,0.754006077376,0.753943097533,0.753880110761,0.753817117059,0.753754116428,0.753691108869,0.753628094382,0.753565072968,0.753502044627,0.75343900936,0.753375967167,0.75331291805,0.753249862009,0.753186799044,0.753123729155,0.753060652344,0.752997568612,0.752934477957,0.752871380382,0.752808275887,0.752745164472,0.752682046138,0.752618920886,0.752555788715,0.752492649627,0.752429503623,0.752366350702,0.752303190866,0.752240024115,0.752176850449,0.75211366987,0.752050482377,0.751987287971,0.751924086654,0.751860878424,0.751797663284,0.751734441234,0.751671212274,0.751607976404,0.751544733626,0.75148148394,0.751418227347,0.751354963846,0.75129169344,0.751228416127,0.75116513191,0.751101840788,0.751038542762,0.750975237832,0.750911926,0.750848607265,0.750785281629,0.750721949092,0.750658609655,0.750595263317,0.75053191008,0.750468549945,0.750405182911,0.75034180898,0.750278428151,0.750215040427,0.750151645806,0.750088244291,0.75002483588,0.749961420576,0.749897998378,0.749834569287,0.749771133304,0.749707690429,0.749644240663,0.749580784006,0.74951732046,0.749453850024,0.749390372699,0.749326888486,0.749263397385,0.749199899398,0.749136394523,0.749072882763,0.749009364118,0.748945838588,0.748882306173,0.748818766875,0.748755220695,0.748691667631,0.748628107686,0.74856454086,0.748500967153,0.748437386566,0.748373799099,0.748310204754,0.74824660353,0.748182995429,0.74811938045,0.748055758595,0.747992129864,0.747928494258,0.747864851777,0.747801202421,0.747737546192,0.74767388309,0.747610213115,0.747546536269,0.747482852551,0.747419161963,0.747355464504,0.747291760176,0.747228048979,0.747164330913,0.74710060598,0.74703687418,0.746973135513,0.74690938998,0.746845637581,0.746781878318,0.746718112191,0.746654339199,0.746590559345,0.746526772628,0.74646297905,0.74639917861,0.746335371309,0.746271557148,0.746207736127,0.746143908248,0.74608007351,0.746016231914,0.745952383461,0.745888528152,0.745824665986,0.745760796965,0.745696921089,0.745633038359,0.745569148775,0.745505252338,0.745441349049,0.745377438907,0.745313521914,0.745249598071,0.745185667377,0.745121729834,0.745057785441,0.744993834201,0.744929876112,0.744865911176,0.744801939394,0.744737960765,0.744673975291,0.744609982972,0.744545983809,0.744481977802,0.744417964952,0.74435394526,0.744289918725,0.74422588535,0.744161845133,0.744097798076,0.74403374418,0.743969683445,0.743905615871,0.743841541459,0.74377746021,0.743713372125,0.743649277203,0.743585175447,0.743521066855,0.743456951429,0.743392829169,0.743328700076,0.74326456415,0.743200421393,0.743136271804,0.743072115385,0.743007952135,0.742943782056,0.742879605148,0.742815421411,0.742751230847,0.742687033455,0.742622829237,0.742558618193,0.742494400323,0.742430175629,0.74236594411,0.742301705767,0.742237460602,0.742173208614,0.742108949804,0.742044684173,0.741980411721,0.741916132449,0.741851846357,0.741787553447,0.741723253718,0.741658947171,0.741594633807,0.741530313627,0.741465986631,0.741401652819,0.741337312192,0.741272964751,0.741208610497,0.74114424943,0.74107988155,0.741015506858,0.740951125355,0.740886737041,0.740822341918,0.740757939984,0.740693531242,0.740629115692,0.740564693334,0.740500264169,0.740435828197,0.740371385419,0.740306935836,0.740242479449,0.740178016257,0.740113546261,0.740049069463,0.739984585862,0.73992009546,0.739855598256,0.739791094251,0.739726583447,0.739662065843,0.739597541441,0.73953301024,0.739468472242,0.739403927446,0.739339375854,0.739274817467,0.739210252284,0.739145680306,0.739081101534,0.739016515969,0.738951923611,0.738887324461,0.738822718519,0.738758105785,0.738693486262,0.738628859948,0.738564226845,0.738499586954,0.738434940274,0.738370286807,0.738305626552,0.738240959512,0.738176285686,0.738111605074,0.738046917678,0.737982223498,0.737917522535,0.737852814788,0.73778810026,0.73772337895,0.737658650859,0.737593915988,0.737529174337,0.737464425906,0.737399670697,0.73733490871,0.737270139946,0.737205364405,0.737140582087,0.737075792994,0.737010997126,0.736946194484,0.736881385067,0.736816568877,0.736751745915,0.736686916181,0.736622079675,0.736557236398,0.736492386351,0.736427529534,0.736362665948,0.736297795594,0.736232918472,0.736168034582,0.736103143926,0.736038246504,0.735973342316,0.735908431363,0.735843513646,0.735778589166,0.735713657922,0.735648719916,0.735583775147,0.735518823618,0.735453865327,0.735388900277,0.735323928467,0.735258949898,0.73519396457,0.735128972485,0.735063973643,0.734998968044,0.73493395569,0.73486893658,0.734803910715,0.734738878096,0.734673838723,0.734608792598,0.73454373972,0.73447868009,0.73441361371,0.734348540578,0.734283460697,0.734218374066,0.734153280687,0.734088180559,0.734023073684,0.733957960061,0.733892839693,0.733827712578,0.733762578719,0.733697438115,0.733632290766,0.733567136675,0.733501975841,0.733436808264,0.733371633946,0.733306452887,0.733241265087,0.733176070548,0.733110869269,0.733045661252,0.732980446497,0.732915225005,0.732849996775,0.73278476181,0.732719520109,0.732654271672,0.732589016502,0.732523754598,0.73245848596,0.73239321059,0.732327928488,0.732262639654,0.73219734409,0.732132041795,0.732066732771,0.732001417018,0.731936094537,0.731870765327,0.731805429391,0.731740086728,0.731674737338,0.731609381224,0.731544018385,0.731478648821,0.731413272534,0.731347889524,0.731282499791,0.731217103337,0.731151700162,0.731086290265,0.731020873649,0.730955450314,0.73089002026,0.730824583487,0.730759139997,0.73069368979,0.730628232867,0.730562769228,0.730497298874,0.730431821805,0.730366338022,0.730300847526,0.730235350317,0.730169846395,0.730104335763,0.730038818419,0.729973294365,0.729907763601,0.729842226128,0.729776681947,0.729711131057,0.72964557346,0.729580009157,0.729514438147,0.729448860432,0.729383276012,0.729317684887,0.729252087059,0.729186482527,0.729120871293,0.729055253358,0.728989628721,0.728923997383,0.728858359345,0.728792714607,0.728727063171,0.728661405036,0.728595740204,0.728530068674,0.728464390448,0.728398705526,0.728333013909,0.728267315597,0.728201610591,0.728135898892,0.7280701805,0.728004455415,0.727938723639,0.727872985172,0.727807240014,0.727741488167,0.72767572963,0.727609964404,0.727544192491,0.72747841389,0.727412628602,0.727346836628,0.727281037969,0.727215232624,0.727149420595,0.727083601883,0.727017776487,0.726951944408,0.726886105648,0.726820260206,0.726754408083,0.72668854928,0.726622683798,0.726556811636,0.726490932796,0.726425047279,0.726359155084,0.726293256213,0.726227350666,0.726161438444,0.726095519546,0.726029593975,0.72596366173,0.725897722813,0.725831777223,0.725765824961,0.725699866028,0.725633900425,0.725567928152,0.72550194921,0.725435963599,0.72536997132,0.725303972373,0.72523796676,0.72517195448,0.725105935535,0.725039909925,0.72497387765,0.724907838712,0.72484179311,0.724775740846,0.724709681919,0.724643616332,0.724577544084,0.724511465175,0.724445379607,0.72437928738,0.724313188495,0.724247082951,0.724180970751,0.724114851895,0.724048726382,0.723982594214,0.723916455391,0.723850309915,0.723784157784,0.723717999001,0.723651833566,0.723585661479,0.723519482741,0.723453297353,0.723387105314,0.723320906627,0.723254701291,0.723188489307,0.723122270675,0.723056045397,0.722989813472,0.722923574902,0.722857329687,0.722791077828,0.722724819325,0.722658554179,0.72259228239,0.722526003959,0.722459718887,0.722393427175,0.722327128822,0.72226082383,0.722194512199,0.722128193929,0.722061869022,0.721995537478,0.721929199298,0.721862854481,0.72179650303,0.721730144944,0.721663780224,0.72159740887,0.721531030884,0.721464646266,0.721398255016,0.721331857135,0.721265452624,0.721199041483,0.721132623713,0.721066199315,0.720999768288,0.720933330634,0.720866886354,0.720800435448,0.720733977916,0.720667513759,0.720601042978,0.720534565574,0.720468081546,0.720401590897,0.720335093625,0.720268589732,0.720202079219,0.720135562085,0.720069038333,0.720002507961,0.719935970972,0.719869427365,0.719802877141,0.719736320301,0.719669756845,0.719603186774,0.719536610089,0.71947002679,0.719403436878,0.719336840353,0.719270237216,0.719203627467,0.719137011108,0.719070388139,0.71900375856,0.718937122373,0.718870479577,0.718803830173,0.718737174162,0.718670511545,0.718603842322,0.718537166494,0.718470484061,0.718403795023,0.718337099383,0.71827039714,0.718203688294,0.718136972847,0.718070250799,0.718003522151,0.717936786903,0.717870045056,0.71780329661,0.717736541566,0.717669779926,0.717603011688,0.717536236854,0.717469455425,0.717402667402,0.717335872784,0.717269071572,0.717202263767,0.71713544937,0.717068628381,0.717001800802,0.716934966631,0.716868125871,0.716801278521,0.716734424583,0.716667564056,0.716600696943,0.716533823242,0.716466942955,0.716400056082,0.716333162625,0.716266262583,0.716199355957,0.716132442748,0.716065522957,0.715998596584,0.715931663629,0.715864724094,0.715797777979,0.715730825284,0.71566386601,0.715596900158,0.715529927729,0.715462948722,0.715395963139,0.715328970981,0.715261972247,0.715194966939,0.715127955056,0.715060936601,0.714993911573,0.714926879972,0.714859841801,0.714792797058,0.714725745745,0.714658687863,0.714591623411,0.714524552392,0.714457474804,0.714390390649,0.714323299928,0.714256202641,0.714189098789,0.714121988372,0.71405487139,0.713987747846,0.713920617738,0.713853481069,0.713786337838,0.713719188046,0.713652031693,0.713584868781,0.713517699309,0.71345052328,0.713383340692,0.713316151547,0.713248955845,0.713181753587,0.713114544774,0.713047329406,0.712980107484,0.712912879009,0.71284564398,0.712778402399,0.712711154267,0.712643899583,0.712576638349,0.712509370565,0.712442096231,0.71237481535,0.71230752792,0.712240233942,0.712172933418,0.712105626348,0.712038312733,0.711970992572,0.711903665867,0.711836332619,0.711768992827,0.711701646493,0.711634293617,0.7115669342,0.711499568243,0.711432195745,0.711364816708,0.711297431133,0.711230039019,0.711162640368,0.71109523518,0.711027823456,0.710960405196,0.710892980401,0.710825549072,0.710758111209,0.710690666813,0.710623215884,0.710555758424,0.710488294432,0.71042082391,0.710353346857,0.710285863275,0.710218373164,0.710150876526,0.710083373359,0.710015863666,0.709948347446,0.709880824701,0.70981329543,0.709745759636,0.709678217317,0.709610668475,0.70954311311,0.709475551224,0.709407982816,0.709340407888,0.709272826439,0.709205238471,0.709137643984,0.709070042978,0.709002435456,0.708934821416,0.70886720086,0.708799573788,0.7087319402,0.708664300099,0.708596653483,0.708529000354,0.708461340713,0.70839367456,0.708326001895,0.708258322719,0.708190637033,0.708122944838,0.708055246134,0.707987540921,0.707919829201,0.707852110974,0.70778438624,0.707716655,0.707648917256,0.707581173006,0.707513422253,0.707445664997,0.707377901238,0.707310130976,0.707242354214,0.70717457095,0.707106781187,0.707038984923,0.706971182161,0.706903372901,0.706835557142,0.706767734887,0.706699906135,0.706632070888,0.706564229145,0.706496380907,0.706428526176,0.706360664951,0.706292797234,0.706224923024,0.706157042323,0.706089155131,0.706021261449,0.705953361278,0.705885454617,0.705817541468,0.705749621831,0.705681695708,0.705613763097,0.705545824001,0.70547787842,0.705409926354,0.705341967804,0.705274002771,0.705206031255,0.705138053257,0.705070068777,0.705002077817,0.704934080376,0.704866076456,0.704798066056,0.704730049179,0.704662025823,0.704593995991,0.704525959682,0.704457916897,0.704389867637,0.704321811903,0.704253749694,0.704185681012,0.704117605858,0.704049524231,0.703981436133,0.703913341564,0.703845240524,0.703777133016,0.703709019038,0.703640898592,0.703572771678,0.703504638297,0.703436498449,0.703368352136,0.703300199358,0.703232040114,0.703163874407,0.703095702237,0.703027523604,0.702959338509,0.702891146952,0.702822948935,0.702754744457,0.70268653352,0.702618316124,0.702550092269,0.702481861957,0.702413625188,0.702345381962,0.702277132281,0.702208876144,0.702140613553,0.702072344508,0.70200406901,0.701935787059,0.701867498656,0.701799203801,0.701730902496,0.70166259474,0.701594280535,0.701525959881,0.701457632779,0.701389299229,0.701320959232,0.701252612789,0.7011842599,0.701115900566,0.701047534787,0.700979162565,0.700910783899,0.700842398791,0.70077400724,0.700705609248,0.700637204816,0.700568793943,0.700500376631,0.70043195288,0.700363522691,0.700295086064,0.700226643001,0.700158193501,0.700089737565,0.700021275194,0.699952806389,0.69988433115,0.699815849477,0.699747361373,0.699678866836,0.699610365868,0.699541858469,0.69947334464,0.699404824382,0.699336297695,0.69926776458,0.699199225037,0.699130679068,0.699062126672,0.698993567851,0.698925002604,0.698856430934,0.698787852839,0.698719268322,0.698650677381,0.69858208002,0.698513476236,0.698444866033,0.698376249409,0.698307626366,0.698238996904,0.698170361024,0.698101718727,0.698033070013,0.697964414883,0.697895753337,0.697827085377,0.697758411002,0.697689730213,0.697621043012,0.697552349398,0.697483649372,0.697414942935,0.697346230088,0.697277510831,0.697208785165,0.69714005309,0.697071314607,0.697002569716,0.696933818419,0.696865060716,0.696796296608,0.696727526095,0.696658749177,0.696589965856,0.696521176132,0.696452380006,0.696383577478,0.69631476855,0.69624595322,0.696177131491,0.696108303363,0.696039468837,0.695970627913,0.695901780591,0.695832926873,0.695764066759,0.695695200249,0.695626327345,0.695557448047,0.695488562356,0.695419670271,0.695350771795,0.695281866927,0.695212955668,0.695144038019,0.69507511398,0.695006183552,0.694937246736,0.694868303532,0.694799353942,0.694730397964,0.694661435601,0.694592466853,0.69452349172,0.694454510203,0.694385522303,0.69431652802,0.694247527356,0.69417852031,0.694109506883,0.694040487076,0.69397146089,0.693902428324,0.693833389381,0.69376434406,0.693695292362,0.693626234288,0.693557169838,0.693488099013,0.693419021814,0.693349938241,0.693280848295,0.693211751976,0.693142649285,0.693073540224,0.693004424791,0.692935302989,0.692866174817,0.692797040277,0.692727899369,0.692658752093,0.692589598451,0.692520438442,0.692451272068,0.692382099329,0.692312920226,0.692243734759,0.692174542929,0.692105344737,0.692036140183,0.691966929269,0.691897711993,0.691828488358,0.691759258364,0.691690022012,0.691620779301,0.691551530233,0.691482274809,0.691413013029,0.691343744893,0.691274470403,0.691205189558,0.691135902361,0.69106660881,0.690997308908,0.690928002653,0.690858690048,0.690789371093,0.690720045788,0.690650714135,0.690581376132,0.690512031783,0.690442681086,0.690373324043,0.690303960654,0.69023459092,0.690165214841,0.690095832419,0.690026443653,0.689957048545,0.689887647095,0.689818239303,0.689748825171,0.689679404699,0.689609977887,0.689540544737,0.689471105249,0.689401659423,0.68933220726,0.689262748761,0.689193283927,0.689123812757,0.689054335254,0.688984851417,0.688915361246,0.688845864744,0.688776361909,0.688706852744,0.688637337248,0.688567815422,0.688498287267,0.688428752784,0.688359211973,0.688289664834,0.688220111369,0.688150551578,0.688080985462,0.68801141302,0.687941834255,0.687872249167,0.687802657755,0.687733060022,0.687663455967,0.687593845591,0.687524228895,0.687454605879,0.687384976545,0.687315340892,0.687245698921,0.687176050634,0.68710639603,0.68703673511,0.686967067875,0.686897394326,0.686827714463,0.686758028287,0.686688335798,0.686618636998,0.686548931886,0.686479220463,0.686409502731,0.686339778689,0.686270048339,0.68620031168,0.686130568714,0.686060819441,0.685991063863,0.685921301978,0.685851533789,0.685781759296,0.685711978499,0.685642191399,0.685572397997,0.685502598293,0.685432792289,0.685362979984,0.685293161379,0.685223336475,0.685153505273,0.685083667773,0.685013823976,0.684943973882,0.684874117492,0.684804254808,0.684734385828,0.684664510555,0.684594628988,0.684524741129,0.684454846978,0.684384946535,0.684315039802,0.684245126779,0.684175207466,0.684105281864,0.684035349975,0.683965411797,0.683895467333,0.683825516583,0.683755559547,0.683685596226,0.683615626621,0.683545650732,0.68347566856,0.683405680106,0.68333568537,0.683265684353,0.683195677056,0.683125663479,0.683055643623,0.682985617488,0.682915585075,0.682845546385,0.682775501419,0.682705450176,0.682635392659,0.682565328866,0.6824952588,0.682425182461,0.682355099848,0.682285010964,0.682214915808,0.682144814381,0.682074706685,0.682004592718,0.681934472483,0.68186434598,0.681794213209,0.681724074172,0.681653928868,0.681583777298,0.681513619464,0.681443455365,0.681373285002,0.681303108377,0.681232925489,0.681162736339,0.681092540928,0.681022339257,0.680952131326,0.680881917135,0.680811696686,0.68074146998,0.680671237016,0.680600997795,0.680530752319,0.680460500587,0.680390242601,0.680319978361,0.680249707867,0.68017943112,0.680109148122,0.680038858872,0.679968563371,0.679898261621,0.67982795362,0.679757639371,0.679687318874,0.679616992129,0.679546659137,0.679476319899,0.679405974416,0.679335622687,0.679265264714,0.679194900498,0.679124530038,0.679054153337,0.678983770393,0.678913381208,0.678842985783,0.678772584118,0.678702176214,0.678631762072,0.678561341691,0.678490915074,0.67842048222,0.67835004313,0.678279597805,0.678209146245,0.678138688451,0.678068224424,0.677997754164,0.677927277673,0.677856794949,0.677786305996,0.677715810812,0.677645309398,0.677574801756,0.677504287886,0.677433767789,0.677363241464,0.677292708913,0.677222170137,0.677151625136,0.677081073911,0.677010516462,0.67693995279,0.676869382896,0.67679880678,0.676728224443,0.676657635886,0.67658704111,0.676516440114,0.6764458329,0.676375219468,0.676304599819,0.676233973953,0.676163341872,0.676092703575,0.676022059064,0.67595140834,0.675880751402,0.675810088251,0.675739418889,0.675668743315,0.675598061531,0.675527373536,0.675456679333,0.675385978921,0.6753152723,0.675244559473,0.675173840439,0.675103115198,0.675032383752,0.674961646102,0.674890902247,0.674820152189,0.674749395929,0.674678633466,0.674607864801,0.674537089936,0.67446630887,0.674395521605,0.674324728141,0.674253928479,0.674183122619,0.674112310562,0.674041492309,0.673970667861,0.673899837217,0.673829000379,0.673758157347,0.673687308122,0.673616452705,0.673545591096,0.673474723296,0.673403849306,0.673332969125,0.673262082756,0.673191190198,0.673120291453,0.67304938652,0.6729784754,0.672907558095,0.672836634605,0.67276570493,0.672694769071,0.672623827029,0.672552878804,0.672481924397,0.672410963809,0.67233999704,0.672269024091,0.672198044963,0.672127059656,0.672056068172,0.671985070509,0.67191406667,0.671843056655,0.671772040465,0.671701018099,0.67162998956,0.671558954847,0.671487913961,0.671416866903,0.671345813674,0.671274754274,0.671203688703,0.671132616963,0.671061539054,0.670990454977,0.670919364732,0.67084826832,0.670777165742,0.670706056998,0.67063494209,0.670563821017,0.67049269378,0.67042156038,0.670350420818,0.670279275094,0.670208123209,0.670136965164,0.670065800959,0.669994630595,0.669923454072,0.669852271392,0.669781082554,0.66970988756,0.66963868641,0.669567479105,0.669496265646,0.669425046032,0.669353820266,0.669282588347,0.669211350276,0.669140106053,0.66906885568,0.668997599157,0.668926336485,0.668855067665,0.668783792696,0.66871251158,0.668641224317,0.668569930908,0.668498631354,0.668427325655,0.668356013813,0.668284695826,0.668213371698,0.668142041427,0.668070705014,0.667999362461,0.667928013768,0.667856658935,0.667785297963,0.667713930854,0.667642557607,0.667571178223,0.667499792702,0.667428401047,0.667357003256,0.667285599331,0.667214189273,0.667142773082,0.667071350759,0.666999922304,0.666928487718,0.666857047002,0.666785600156,0.666714147181,0.666642688078,0.666571222847,0.66649975149,0.666428274006,0.666356790396,0.666285300662,0.666213804803,0.66614230282,0.666070794714,0.665999280486,0.665927760136,0.665856233666,0.665784701074,0.665713162363,0.665641617533,0.665570066585,0.665498509518,0.665426946335,0.665355377035,0.665283801619,0.665212220088,0.665140632443,0.665069038684,0.664997438811,0.664925832826,0.66485422073,0.664782602522,0.664710978203,0.664639347775,0.664567711237,0.664496068591,0.664424419837,0.664352764976,0.664281104008,0.664209436934,0.664137763755,0.664066084472,0.663994399084,0.663922707593,0.663851009999,0.663779306304,0.663707596507,0.66363588061,0.663564158612,0.663492430515,0.66342069632,0.663348956026,0.663277209635,0.663205457148,0.663133698564,0.663061933885,0.662990163111,0.662918386243,0.662846603282,0.662774814228,0.662703019082,0.662631217845,0.662559410516,0.662487597098,0.66241577759,0.662343951994,0.662272120309,0.662200282537,0.662128438678,0.662056588733,0.661984732702,0.661912870587,0.661841002387,0.661769128104,0.661697247738,0.66162536129,0.66155346876,0.66148157015,0.661409665459,0.661337754689,0.66126583784,0.661193914913,0.661121985908,0.661050050826,0.660978109668,0.660906162435,0.660834209126,0.660762249744,0.660690284287,0.660618312758,0.660546335157,0.660474351484,0.66040236174,0.660330365925,0.660258364041,0.660186356089,0.660114342067,0.660042321979,0.659970295823,0.659898263601,0.659826225313,0.659754180961,0.659682130544,0.659610074063,0.659538011519,0.659465942913,0.659393868246,0.659321787517,0.659249700728,0.659177607879,0.659105508972,0.659033404006,0.658961292982,0.658889175901,0.658817052764,0.658744923571,0.658672788323,0.658600647021,0.658528499665,0.658456346256,0.658384186795,0.658312021282,0.658239849717,0.658167672103,0.658095488439,0.658023298725,0.657951102963,0.657878901154,0.657806693297,0.657734479394,0.657662259445,0.657590033451,0.657517801413,0.657445563331,0.657373319206,0.657301069038,0.657228812829,0.657156550578,0.657084282287,0.657012007956,0.656939727587,0.656867441178,0.656795148732,0.656722850249,0.656650545729,0.656578235174,0.656505918583,0.656433595958,0.6563612673,0.656288932608,0.656216591883,0.656144245127,0.65607189234,0.655999533522,0.655927168674,0.655854797797,0.655782420892,0.655710037959,0.655637648999,0.655565254012,0.655492853,0.655420445962,0.6553480329,0.655275613814,0.655203188705,0.655130757573,0.65505832042,0.654985877245,0.65491342805,0.654840972835,0.654768511601,0.654696044349,0.654623571078,0.654551091791,0.654478606487,0.654406115167,0.654333617832,0.654261114482,0.654188605119,0.654116089742,0.654043568353,0.653971040953,0.653898507541,0.653825968118,0.653753422686,0.653680871244,0.653608313795,0.653535750337,0.653463180872,0.6533906054,0.653318023923,0.653245436441,0.653172842954,0.653100243463,0.653027637969,0.652955026473,0.652882408975,0.652809785475,0.652737155975,0.652664520476,0.652591878977,0.65251923148,0.652446577984,0.652373918492,0.652301253003,0.652228581519,0.652155904039,0.652083220565,0.652010531097,0.651937835636,0.651865134182,0.651792426737,0.6517197133,0.651646993873,0.651574268456,0.65150153705,0.651428799656,0.651356056274,0.651283306905,0.651210551549,0.651137790207,0.65106502288,0.650992249569,0.650919470274,0.650846684996,0.650773893736,0.650701096494,0.65062829327,0.650555484067,0.650482668883,0.65040984772,0.650337020579,0.65026418746,0.650191348364,0.650118503292,0.650045652244,0.649972795221,0.649899932223,0.649827063252,0.649754188307,0.649681307391,0.649608420502,0.649535527643,0.649462628813,0.649389724013,0.649316813244,0.649243896507,0.649170973802,0.64909804513,0.649025110492,0.648952169888,0.648879223319,0.648806270786,0.648733312289,0.648660347829,0.648587377406,0.648514401022,0.648441418677,0.648368430372,0.648295436107,0.648222435882,0.6481494297,0.64807641756,0.648003399463,0.64793037541,0.647857345401,0.647784309437,0.647711267519,0.647638219647,0.647565165822,0.647492106045,0.647419040316,0.647345968637,0.647272891007,0.647199807427,0.647126717899,0.647053622422,0.646980520998,0.646907413627,0.646834300309,0.646761181046,0.646688055839,0.646614924687,0.646541787591,0.646468644552,0.646395495572,0.64632234065,0.646249179787,0.646176012983,0.646102840241,0.646029661559,0.645956476939,0.645883286382,0.645810089888,0.645736887458,0.645663679092,0.645590464792,0.645517244557,0.645444018389,0.645370786288,0.645297548255,0.645224304291,0.645151054395,0.64507779857,0.645004536816,0.644931269132,0.644857995521,0.644784715982,0.644711430516,0.644638139125,0.644564841807,0.644491538566,0.6444182294,0.644344914311,0.644271593299,0.644198266365,0.64412493351,0.644051594734,0.643978250039,0.643904899424,0.64383154289,0.643758180438,0.643684812069,0.643611437784,0.643538057582,0.643464671465,0.643391279434,0.643317881489,0.64324447763,0.643171067859,0.643097652176,0.643024230582,0.642950803077,0.642877369662,0.642803930339,0.642730485106,0.642657033966,0.642583576919,0.642510113965,0.642436645105,0.642363170341,0.642289689671,0.642216203098,0.642142710622,0.642069212244,0.641995707963,0.641922197782,0.6418486817,0.641775159719,0.641701631838,0.641628098059,0.641554558382,0.641481012809,0.641407461338,0.641333903973,0.641260340712,0.641186771557,0.641113196508,0.641039615566,0.640966028732,0.640892436007,0.64081883739,0.640745232883,0.640671622487,0.640598006201,0.640524384028,0.640450755966,0.640377122018,0.640303482184,0.640229836464,0.64015618486,0.640082527371,0.640008863998,0.639935194743,0.639861519606,0.639787838587,0.639714151688,0.639640458908,0.639566760249,0.639493055711,0.639419345295,0.639345629002,0.639271906831,0.639198178785,0.639124444864,0.639050705068,0.638976959397,0.638903207854,0.638829450437,0.638755687149,0.63868191799,0.63860814296,0.638534362059,0.63846057529,0.638386782652,0.638312984146,0.638239179773,0.638165369533,0.638091553428,0.638017731457,0.637943903622,0.637870069923,0.63779623036,0.637722384936,0.637648533649,0.637574676501,0.637500813493,0.637426944625,0.637353069898,0.637279189313,0.63720530287,0.637131410569,0.637057512413,0.636983608401,0.636909698533,0.636835782812,0.636761861236,0.636687933808,0.636614000527,0.636540061395,0.636466116412,0.636392165579,0.636318208896,0.636244246364,0.636170277984,0.636096303756,0.636022323682,0.635948337761,0.635874345995,0.635800348384,0.635726344929,0.63565233563,0.635578320489,0.635504299505,0.63543027268,0.635356240015,0.635282201509,0.635208157164,0.63513410698,0.635060050958,0.634985989099,0.634911921403,0.634837847872,0.634763768504,0.634689683303,0.634615592267,0.634541495398,0.634467392697,0.634393284164,0.634319169799,0.634245049604,0.634170923579,0.634096791725,0.634022654043,0.633948510532,0.633874361195,0.633800206031,0.633726045041,0.633651878227,0.633577705588,0.633503527125,0.633429342839,0.633355152731,0.633280956801,0.63320675505,0.633132547479,0.633058334088,0.632984114878,0.632909889851,0.632835659005,0.632761422343,0.632687179864,0.63261293157,0.632538677461,0.632464417538,0.632390151801,0.632315880252,0.63224160289,0.632167319717,0.632093030734,0.63201873594,0.631944435337,0.631870128925,0.631795816705,0.631721498678,0.631647174844,0.631572845204,0.631498509759,0.631424168509,0.631349821456,0.631275468599,0.63120110994,0.631126745478,0.631052375216,0.630977999153,0.63090361729,0.630829229628,0.630754836168,0.63068043691,0.630606031855,0.630531621003,0.630457204356,0.630382781914,0.630308353677,0.630233919647,0.630159479824,0.630085034208,0.630010582801,0.629936125603,0.629861662614,0.629787193837,0.62971271927,0.629638238915,0.629563752772,0.629489260843,0.629414763128,0.629340259627,0.629265750341,0.629191235272,0.629116714419,0.629042187783,0.628967655365,0.628893117166,0.628818573186,0.628744023427,0.628669467888,0.62859490657,0.628520339475,0.628445766602,0.628371187953,0.628296603527,0.628222013327,0.628147417352,0.628072815604,0.627998208082,0.627923594788,0.627848975722,0.627774350885,0.627699720278,0.627625083901,0.627550441755,0.627475793841,0.627401140159,0.62732648071,0.627251815495,0.627177144515,0.627102467769,0.627027785259,0.626953096986,0.62687840295,0.626803703152,0.626728997592,0.626654286272,0.626579569192,0.626504846352,0.626430117753,0.626355383397,0.626280643283,0.626205897412,0.626131145786,0.626056388404,0.625981625268,0.625906856378,0.625832081735,0.625757301339,0.625682515191,0.625607723292,0.625532925643,0.625458122244,0.625383313096,0.625308498199,0.625233677555,0.625158851164,0.625084019026,0.625009181143,0.624934337515,0.624859488142,0.624784633026,0.624709772168,0.624634905566,0.624560033224,0.62448515514,0.624410271317,0.624335381754,0.624260486452,0.624185585412,0.624110678635,0.624035766121,0.623960847871,0.623885923886,0.623810994166,0.623736058713,0.623661117526,0.623586170606,0.623511217955,0.623436259572,0.623361295459,0.623286325616,0.623211350044,0.623136368744,0.623061381715,0.62298638896,0.622911390479,0.622836386271,0.622761376339,0.622686360683,0.622611339302,0.622536312199,0.622461279374,0.622386240827,0.62231119656,0.622236146572,0.622161090865,0.622086029439,0.622010962295,0.621935889433,0.621860810855,0.621785726561,0.621710636551,0.621635540827,0.621560439389,0.621485332238,0.621410219374,0.621335100798,0.621259976511,0.621184846514,0.621109710806,0.62103456939,0.620959422265,0.620884269433,0.620809110893,0.620733946647,0.620658776696,0.620583601039,0.620508419679,0.620433232614,0.620358039847,0.620282841378,0.620207637207,0.620132427335,0.620057211763,0.619981990492,0.619906763522,0.619831530854,0.619756292488,0.619681048426,0.619605798668,0.619530543215,0.619455282067,0.619380015225,0.61930474269,0.619229464462,0.619154180543,0.619078890932,0.619003595631,0.618928294641,0.618852987961,0.618777675593,0.618702357537,0.618627033794,0.618551704365,0.61847636925,0.618401028451,0.618325681967,0.6182503298,0.61817497195,0.618099608417,0.618024239204,0.617948864309,0.617873483735,0.617798097481,0.617722705548,0.617647307938,0.61757190465,0.617496495686,0.617421081045,0.61734566073,0.61727023474,0.617194803076,0.617119365739,0.61704392273,0.616968474049,0.616893019697,0.616817559674,0.616742093982,0.616666622621,0.616591145592,0.616515662895,0.616440174531,0.616364680501,0.616289180805,0.616213675445,0.616138164421,0.616062647733,0.615987125382,0.61591159737,0.615836063696,0.615760524361,0.615684979367,0.615609428713,0.615533872401,0.615458310431,0.615382742804,0.61530716952,0.615231590581,0.615156005986,0.615080415737,0.615004819834,0.614929218279,0.614853611071,0.614777998211,0.614702379701,0.61462675554,0.61455112573,0.614475490271,0.614399849164,0.61432420241,0.614248550008,0.614172891961,0.614097228268,0.614021558931,0.61394588395,0.613870203325,0.613794517058,0.613718825149,0.613643127599,0.613567424408,0.613491715578,0.613416001109,0.613340281001,0.613264555255,0.613188823873,0.613113086854,0.613037344199,0.61296159591,0.612885841986,0.612810082429,0.61273431724,0.612658546417,0.612582769964,0.61250698788,0.612431200166,0.612355406822,0.61227960785,0.61220380325,0.612127993022,0.612052177169,0.611976355689,0.611900528584,0.611824695854,0.611748857501,0.611673013525,0.611597163926,0.611521308706,0.611445447865,0.611369581403,0.611293709322,0.611217831622,0.611141948304,0.611066059369,0.610990164816,0.610914264648,0.610838358864,0.610762447465,0.610686530453,0.610610607827,0.610534679588,0.610458745738,0.610382806276,0.610306861204,0.610230910522,0.610154954231,0.610078992332,0.610003024825,0.60992705171,0.60985107299,0.609775088664,0.609699098733,0.609623103198,0.609547102059,0.609471095317,0.609395082973,0.609319065028,0.609243041482,0.609167012336,0.609090977591,0.609014937247,0.608938891305,0.608862839766,0.608786782631,0.608710719899,0.608634651573,0.608558577652,0.608482498137,0.608406413029,0.608330322329,0.608254226037,0.608178124155,0.608102016682,0.608025903619,0.607949784968,0.607873660728,0.607797530901,0.607721395488,0.607645254488,0.607569107903,0.607492955733,0.607416797979,0.607340634643,0.607264465723,0.607188291222,0.607112111139,0.607035925476,0.606959734234,0.606883537412,0.606807335012,0.606731127035,0.60665491348,0.606578694349,0.606502469643,0.606426239361,0.606350003506,0.606273762077,0.606197515076,0.606121262502,0.606045004357,0.605968740642,0.605892471356,0.605816196502,0.605739916078,0.605663630087,0.605587338529,0.605511041404,0.605434738714,0.605358430459,0.605282116639,0.605205797255,0.605129472309,0.605053141801,0.604976805731,0.6049004641,0.604824116909,0.604747764159,0.60467140585,0.604595041983,0.604518672558,0.604442297577,0.60436591704,0.604289530948,0.604213139302,0.604136742101,0.604060339348,0.603983931042,0.603907517184,0.603831097776,0.603754672817,0.603678242308,0.603601806251,0.603525364646,0.603448917493,0.603372464793,0.603296006547,0.603219542756,0.60314307342,0.60306659854,0.602990118117,0.602913632152,0.602837140644,0.602760643596,0.602684141007,0.602607632878,0.60253111921,0.602454600004,0.60237807526,0.602301544979,0.602225009162,0.60214846781,0.602071920922,0.601995368501,0.601918810546,0.601842247059,0.601765678039,0.601689103488,0.601612523407,0.601535937795,0.601459346655,0.601382749986,0.601306147789,0.601229540065,0.601152926815,0.601076308039,0.600999683738,0.600923053913,0.600846418564,0.600769777693,0.600693131299,0.600616479384,0.600539821948,0.600463158992,0.600386490517,0.600309816523,0.600233137011,0.600156451982,0.600079761437,0.600003065375,0.599926363799,0.599849656708,0.599772944104,0.599696225986,0.599619502356,0.599542773215,0.599466038563,0.599389298401,0.599312552729,0.599235801548,0.59915904486,0.599082282664,0.599005514961,0.598928741752,0.598851963039,0.59877517882,0.598698389098,0.598621593873,0.598544793146,0.598467986916,0.598391175186,0.598314357955,0.598237535225,0.598160706996,0.598083873269,0.598007034045,0.597930189323,0.597853339106,0.597776483393,0.597699622186,0.597622755484,0.59754588329,0.597469005603,0.597392122424,0.597315233754,0.597238339593,0.597161439943,0.597084534804,0.597007624177,0.596930708062,0.59685378646,0.596776859373,0.596699926799,0.596622988741,0.596546045199,0.596469096174,0.596392141666,0.596315181676,0.596238216205,0.596161245253,0.596084268822,0.596007286911,0.595930299522,0.595853306656,0.595776308312,0.595699304492,0.595622295197,0.595545280427,0.595468260183,0.595391234465,0.595314203275,0.595237166612,0.595160124479,0.595083076875,0.5950060238,0.594928965257,0.594851901245,0.594774831766,0.594697756819,0.594620676407,0.594543590528,0.594466499185,0.594389402377,0.594312300106,0.594235192372,0.594158079176,0.594080960519,0.594003836401,0.593926706823,0.593849571785,0.59377243129,0.593695285336,0.593618133925,0.593540977058,0.593463814735,0.593386646958,0.593309473725,0.59323229504,0.593155110901,0.593077921311,0.593000726268,0.592923525776,0.592846319833,0.59276910844,0.5926918916,0.592614669311,0.592537441575,0.592460208393,0.592382969764,0.592305725691,0.592228476174,0.592151221212,0.592073960808,0.591996694962,0.591919423674,0.591842146946,0.591764864777,0.591687577169,0.591610284122,0.591532985637,0.591455681715,0.591378372357,0.591301057562,0.591223737333,0.591146411669,0.591069080572,0.590991744041,0.590914402078,0.590837054684,0.590759701859,0.590682343604,0.590604979919,0.590527610805,0.590450236264,0.590372856295,0.5902954709,0.590218080079,0.590140683832,0.590063282161,0.589985875067,0.589908462549,0.589831044609,0.589753621248,0.589676192466,0.589598758263,0.589521318641,0.5894438736,0.589366423141,0.589288967265,0.589211505973,0.589134039264,0.58905656714,0.588979089602,0.58890160665,0.588824118285,0.588746624507,0.588669125318,0.588591620718,0.588514110708,0.588436595288,0.588359074459,0.588281548223,0.588204016579,0.588126479528,0.588048937072,0.58797138921,0.587893835943,0.587816277273,0.5877387132,0.587661143725,0.587583568848,0.587505988569,0.587428402891,0.587350811813,0.587273215337,0.587195613462,0.58711800619,0.587040393521,0.586962775456,0.586885151996,0.586807523142,0.586729888893,0.586652249252,0.586574604218,0.586496953793,0.586419297976,0.58634163677,0.586263970174,0.586186298189,0.586108620815,0.586030938055,0.585953249908,0.585875556375,0.585797857456,0.585720153154,0.585642443467,0.585564728397,0.585487007945,0.585409282111,0.585331550896,0.585253814301,0.585176072327,0.585098324973,0.585020572242,0.584942814133,0.584865050648,0.584787281786,0.584709507549,0.584631727938,0.584553942953,0.584476152595,0.584398356864,0.584320555762,0.584242749289,0.584164937446,0.584087120233,0.584009297651,0.583931469701,0.583853636384,0.5837757977,0.583697953651,0.583620104236,0.583542249456,0.583464389313,0.583386523806,0.583308652938,0.583230776707,0.583152895116,0.583075008164,0.582997115853,0.582919218184,0.582841315156,0.582763406771,0.582685493029,0.582607573931,0.582529649478,0.58245171967,0.582373784509,0.582295843995,0.582217898128,0.58213994691,0.582061990341,0.581984028421,0.581906061153,0.581828088535,0.581750110569,0.581672127256,0.581594138597,0.581516144591,0.581438145241,0.581360140546,0.581282130507,0.581204115125,0.581126094401,0.581048068335,0.580970036929,0.580892000182,0.580813958096,0.580735910671,0.580657857908,0.580579799808,0.580501736371,0.580423667598,0.580345593491,0.580267514049,0.580189429273,0.580111339164,0.580033243723,0.57995514295,0.579877036847,0.579798925413,0.579720808651,0.579642686559,0.579564559139,0.579486426393,0.579408288319,0.57933014492,0.579251996196,0.579173842148,0.579095682775,0.57901751808,0.578939348063,0.578861172724,0.578782992065,0.578704806085,0.578626614786,0.578548418169,0.578470216233,0.578392008981,0.578313796412,0.578235578527,0.578157355327,0.578079126813,0.578000892985,0.577922653845,0.577844409392,0.577766159628,0.577687904553,0.577609644168,0.577531378474,0.577453107472,0.577374831161,0.577296549544,0.57721826262,0.57713997039,0.577061672856,0.576983370017,0.576905061875,0.57682674843,0.576748429682,0.576670105634,0.576591776285,0.576513441636,0.576435101688,0.576356756441,0.576278405897,0.576200050055,0.576121688917,0.576043322484,0.575964950756,0.575886573734,0.575808191418,0.575729803809,0.575651410909,0.575573012717,0.575494609235,0.575416200463,0.575337786402,0.575259367052,0.575180942415,0.575102512491,0.57502407728,0.574945636784,0.574867191004,0.574788739939,0.574710283591,0.57463182196,0.574553355048,0.574474882854,0.57439640538,0.574317922626,0.574239434593,0.574160941282,0.574082442693,0.574003938827,0.573925429686,0.573846915269,0.573768395577,0.573689870611,0.573611340372,0.57353280486,0.573454264077,0.573375718023,0.573297166698,0.573218610104,0.57314004824,0.573061481109,0.57298290871,0.572904331045,0.572825748113,0.572747159916,0.572668566454,0.572589967729,0.572511363741,0.57243275449,0.572354139977,0.572275520204,0.57219689517,0.572118264877,0.572039629325,0.571960988515,0.571882342447,0.571803691123,0.571725034543,0.571646372708,0.571567705618,0.571489033275,0.571410355679,0.57133167283,0.57125298473,0.571174291379,0.571095592778,0.571016888928,0.570938179828,0.570859465481,0.570780745887,0.570702021046,0.57062329096,0.570544555628,0.570465815052,0.570387069232,0.57030831817,0.570229561865,0.570150800319,0.570072033533,0.569993261506,0.56991448424,0.569835701736,0.569756913993,0.569678121014,0.569599322798,0.569520519347,0.569441710661,0.56936289674,0.569284077586,0.5692052532,0.569126423581,0.569047588731,0.568968748651,0.56888990334,0.568811052801,0.568732197033,0.568653336037,0.568574469815,0.568495598366,0.568416721692,0.568337839793,0.56825895267,0.568180060324,0.568101162755,0.568022259964,0.567943351952,0.56786443872,0.567785520268,0.567706596597,0.567627667708,0.567548733601,0.567469794278,0.567390849738,0.567311899983,0.567232945014,0.567153984831,0.567075019434,0.566996048825,0.566917073004,0.566838091973,0.566759105731,0.56668011428,0.566601117619,0.566522115751,0.566443108675,0.566364096393,0.566285078905,0.566206056212,0.566127028314,0.566047995212,0.565968956908,0.565889913401,0.565810864693,0.565731810784,0.565652751674,0.565573687366,0.565494617859,0.565415543154,0.565336463251,0.565257378153,0.565178287858,0.565099192369,0.565020091685,0.564940985808,0.564861874738,0.564782758476,0.564703637022,0.564624510378,0.564545378544,0.564466241521,0.564387099309,0.564307951909,0.564228799323,0.56414964155,0.564070478592,0.563991310449,0.563912137122,0.563832958611,0.563753774918,0.563674586043,0.563595391987,0.56351619275,0.563436988334,0.563357778739,0.563278563965,0.563199344014,0.563120118886,0.563040888582,0.562961653102,0.562882412448,0.56280316662,0.562723915619,0.562644659446,0.562565398101,0.562486131584,0.562406859898,0.562327583042,0.562248301017,0.562169013824,0.562089721464,0.562010423937,0.561931121245,0.561851813387,0.561772500365,0.561693182179,0.56161385883,0.561534530319,0.561455196646,0.561375857813,0.561296513819,0.561217164666,0.561137810355,0.561058450886,0.560979086259,0.560899716477,0.560820341538,0.560740961445,0.560661576197,0.560582185796,0.560502790242,0.560423389537,0.56034398368,0.560264572672,0.560185156514,0.560105735208,0.560026308753,0.55994687715,0.559867440401,0.559787998505,0.559708551464,0.559629099278,0.559549641948,0.559470179475,0.559390711859,0.559311239102,0.559231761203,0.559152278164,0.559072789986,0.558993296668,0.558913798213,0.55883429462,0.55875478589,0.558675272025,0.558595753024,0.558516228889,0.55843669962,0.558357165218,0.558277625683,0.558198081017,0.558118531221,0.558038976294,0.557959416237,0.557879851053,0.55780028074,0.5577207053,0.557641124733,0.557561539041,0.557481948224,0.557402352283,0.557322751218,0.55724314503,0.55716353372,0.557083917289,0.557004295737,0.556924669066,0.556845037275,0.556765400366,0.556685758339,0.556606111196,0.556526458936,0.55644680156,0.55636713907,0.556287471466,0.556207798749,0.556128120919,0.556048437977,0.555968749924,0.555889056761,0.555809358488,0.555729655107,0.555649946617,0.55557023302,0.555490514316,0.555410790506,0.555331061591,0.555251327571,0.555171588448,0.555091844222,0.555012094893,0.554932340463,0.554852580932,0.554772816301,0.55469304657,0.554613271741,0.554533491814,0.55445370679,0.55437391667,0.554294121454,0.554214321142,0.554134515737,0.554054705238,0.553974889647,0.553895068963,0.553815243188,0.553735412323,0.553655576367,0.553575735323,0.55349588919,0.55341603797,0.553336181663,0.55325632027,0.553176453791,0.553096582227,0.55301670558,0.552936823849,0.552856937036,0.552777045142,0.552697148166,0.55261724611,0.552537338974,0.55245742676,0.552377509467,0.552297587097,0.552217659651,0.552137727129,0.552057789531,0.551977846859,0.551897899114,0.551817946295,0.551737988405,0.551658025443,0.55157805741,0.551498084307,0.551418106135,0.551338122894,0.551258134586,0.551178141211,0.551098142769,0.551018139262,0.55093813069,0.550858117053,0.550778098354,0.550698074592,0.550618045768,0.550538011882,0.550457972937,0.550377928931,0.550297879867,0.550217825744,0.550137766564,0.550057702327,0.549977633035,0.549897558687,0.549817479284,0.549737394827,0.549657305318,0.549577210756,0.549497111143,0.549417006478,0.549336896764,0.549256782,0.549176662188,0.549096537327,0.54901640742,0.548936272466,0.548856132466,0.548775987421,0.548695837333,0.5486156822,0.548535522025,0.548455356808,0.548375186549,0.54829501125,0.548214830912,0.548134645534,0.548054455118,0.547974259664,0.547894059173,0.547813853646,0.547733643084,0.547653427487,0.547573206857,0.547492981193,0.547412750496,0.547332514768,0.547252274009,0.54717202822,0.547091777401,0.547011521554,0.546931260678,0.546850994775,0.546770723846,0.546690447891,0.546610166911,0.546529880906,0.546449589878,0.546369293827,0.546288992754,0.54620868666,0.546128375545,0.54604805941,0.545967738256,0.545887412083,0.545807080893,0.545726744686,0.545646403463,0.545566057224,0.54548570597,0.545405349703,0.545324988422,0.545244622129,0.545164250824,0.545083874508,0.545003493181,0.544923106845,0.544842715501,0.544762319148,0.544681917788,0.544601511421,0.544521100048,0.544440683671,0.544360262288,0.544279835903,0.544199404514,0.544118968123,0.544038526731,0.543958080338,0.543877628945,0.543797172553,0.543716711162,0.543636244774,0.543555773389,0.543475297007,0.54339481563,0.543314329258,0.543233837893,0.543153341534,0.543072840182,0.542992333838,0.542911822504,0.542831306179,0.542750784865,0.542670258561,0.54258972727,0.542509190991,0.542428649726,0.542348103474,0.542267552238,0.542186996017,0.542106434812,0.542025868625,0.541945297455,0.541864721304,0.541784140172,0.541703554061,0.54162296297,0.5415423669,0.541461765853,0.541381159829,0.541300548828,0.541219932853,0.541139311902,0.541058685977,0.540978055079,0.540897419208,0.540816778366,0.540736132552,0.540655481768,0.540574826015,0.540494165293,0.540413499602,0.540332828945,0.54025215332,0.54017147273,0.540090787174,0.540010096655,0.539929401171,0.539848700725,0.539767995316,0.539687284946,0.539606569616,0.539525849325,0.539445124075,0.539364393867,0.539283658701,0.539202918578,0.539122173499,0.539041423464,0.538960668474,0.538879908531,0.538799143634,0.538718373785,0.538637598984,0.538556819232,0.538476034529,0.538395244877,0.538314450277,0.538233650728,0.538152846232,0.538072036789,0.5379912224,0.537910403067,0.537829578789,0.537748749567,0.537667915402,0.537587076296,0.537506232248,0.537425383259,0.53734452933,0.537263670463,0.537182806656,0.537101937913,0.537021064232,0.536940185615,0.536859302062,0.536778413575,0.536697520154,0.5366166218,0.536535718513,0.536454810295,0.536373897146,0.536292979066,0.536212056057,0.536131128119,0.536050195253,0.53596925746,0.53588831474,0.535807367095,0.535726414524,0.53564545703,0.535564494611,0.53548352727,0.535402555007,0.535321577823,0.535240595718,0.535159608693,0.535078616749,0.534997619887,0.534916618107,0.534835611411,0.534754599798,0.53467358327,0.534592561827,0.534511535471,0.534430504201,0.534349468019,0.534268426926,0.534187380921,0.534106330006,0.534025274182,0.53394421345,0.533863147809,0.533782077261,0.533701001807,0.533619921447,0.533538836183,0.533457746014,0.533376650941,0.533295550966,0.533214446089,0.533133336311,0.533052221633,0.532971102054,0.532889977577,0.532808848202,0.532727713929,0.532646574759,0.532565430693,0.532484281733,0.532403127877,0.532321969128,0.532240805486,0.532159636952,0.532078463526,0.531997285209,0.531916102003,0.531834913907,0.531753720923,0.531672523051,0.531591320292,0.531510112646,0.531428900115,0.5313476827,0.5312664604,0.531185233217,0.531104001151,0.531022764204,0.530941522376,0.530860275667,0.530779024079,0.530697767612,0.530616506266,0.530535240044,0.530453968945,0.53037269297,0.53029141212,0.530210126396,0.530128835798,0.530047540328,0.529966239985,0.529884934771,0.529803624686,0.529722309732,0.529640989908,0.529559665216,0.529478335657,0.52939700123,0.529315661938,0.52923431778,0.529152968758,0.529071614872,0.528990256122,0.52890889251,0.528827524037,0.528746150703,0.528664772508,0.528583389455,0.528502001542,0.528420608772,0.528339211145,0.528257808661,0.528176401321,0.528094989127,0.528013572079,0.527932150177,0.527850723423,0.527769291816,0.527687855359,0.527606414051,0.527524967893,0.527443516887,0.527362061032,0.52728060033,0.527199134782,0.527117664387,0.527036189148,0.526954709064,0.526873224136,0.526791734365,0.526710239753,0.526628740298,0.526547236004,0.526465726869,0.526384212895,0.526302694083,0.526221170433,0.526139641946,0.526058108623,0.525976570464,0.525895027471,0.525813479644,0.525731926984,0.525650369491,0.525568807167,0.525487240012,0.525405668026,0.525324091212,0.525242509568,0.525160923097,0.525079331798,0.524997735673,0.524916134723,0.524834528947,0.524752918347,0.524671302924,0.524589682678,0.524508057611,0.524426427722,0.524344793013,0.524263153484,0.524181509136,0.52409985997,0.524018205986,0.523936547186,0.52385488357,0.523773215139,0.523691541893,0.523609863834,0.523528180962,0.523446493278,0.523364800782,0.523283103476,0.523201401359,0.523119694434,0.5230379827,0.522956266159,0.52287454481,0.522792818656,0.522711087696,0.522629351931,0.522547611363,0.522465865991,0.522384115817,0.522302360841,0.522220601065,0.522138836488,0.522057067112,0.521975292937,0.521893513965,0.521811730195,0.521729941629,0.521648148267,0.52156635011,0.521484547159,0.521402739415,0.521320926879,0.52123910955,0.52115728743,0.52107546052,0.52099362882,0.520911792332,0.520829951055,0.520748104991,0.52066625414,0.520584398504,0.520502538082,0.520420672876,0.520338802887,0.520256928114,0.52017504856,0.520093164224,0.520011275108,0.519929381211,0.519847482536,0.519765579082,0.519683670851,0.519601757843,0.519519840059,0.5194379175,0.519355990166,0.519274058058,0.519192121177,0.519110179524,0.519028233099,0.518946281904,0.518864325938,0.518782365203,0.5187003997,0.518618429429,0.518536454391,0.518454474586,0.518372490016,0.518290500681,0.518208506583,0.518126507721,0.518044504096,0.51796249571,0.517880482562,0.517798464655,0.517716441988,0.517634414562,0.517552382378,0.517470345437,0.51738830374,0.517306257287,0.517224206079,0.517142150116,0.5170600894,0.516978023932,0.516895953711,0.51681387874,0.516731799018,0.516649714546,0.516567625325,0.516485531356,0.51640343264,0.516321329177,0.516239220968,0.516157108014,0.516074990315,0.515992867873,0.515910740688,0.515828608761,0.515746472092,0.515664330683,0.515582184534,0.515500033646,0.515417878019,0.515335717655,0.515253552554,0.515171382717,0.515089208145,0.515007028838,0.514924844797,0.514842656023,0.514760462517,0.514678264279,0.51459606131,0.514513853611,0.514431641183,0.514349424027,0.514267202142,0.514184975531,0.514102744193,0.51402050813,0.513938267342,0.51385602183,0.513773771595,0.513691516637,0.513609256958,0.513526992557,0.513444723437,0.513362449596,0.513280171038,0.513197887761,0.513115599767,0.513033307056,0.51295100963,0.512868707489,0.512786400634,0.512704089065,0.512621772783,0.51253945179,0.512457126086,0.512374795671,0.512292460546,0.512210120713,0.512127776172,0.512045426923,0.511963072967,0.511880714306,0.511798350939,0.511715982869,0.511633610094,0.511551232617,0.511468850438,0.511386463557,0.511304071976,0.511221675695,0.511139274715,0.511056869037,0.510974458661,0.510892043589,0.51080962382,0.510727199357,0.510644770198,0.510562336346,0.510479897801,0.510397454564,0.510315006635,0.510232554016,0.510150096707,0.510067634708,0.509985168021,0.509902696647,0.509820220585,0.509737739837,0.509655254404,0.509572764287,0.509490269485,0.50940777,0.509325265833,0.509242756984,0.509160243455,0.509077725245,0.508995202356,0.508912674789,0.508830142543,0.508747605621,0.508665064022,0.508582517748,0.508499966799,0.508417411175,0.508334850879,0.50825228591,0.50816971627,0.508087141958,0.508004562976,0.507921979325,0.507839391005,0.507756798017,0.507674200362,0.50759159804,0.507508991053,0.507426379401,0.507343763084,0.507261142105,0.507178516462,0.507095886158,0.507013251193,0.506930611567,0.506847967282,0.506765318338,0.506682664736,0.506600006476,0.50651734356,0.506434675988,0.506352003761,0.50626932688,0.506186645345,0.506103959158,0.506021268318,0.505938572827,0.505855872686,0.505773167895,0.505690458455,0.505607744367,0.505525025632,0.50544230225,0.505359574222,0.505276841548,0.505194104231,0.505111362269,0.505028615665,0.504945864419,0.504863108531,0.504780348003,0.504697582835,0.504614813028,0.504532038582,0.504449259499,0.50436647578,0.504283687424,0.504200894433,0.504118096807,0.504035294548,0.503952487655,0.503869676131,0.503786859975,0.503704039188,0.503621213772,0.503538383726,0.503455549051,0.50337270975,0.503289865821,0.503207017266,0.503124164086,0.503041306281,0.502958443852,0.5028755768,0.502792705126,0.50270982883,0.502626947914,0.502544062377,0.502461172221,0.502378277447,0.502295378055,0.502212474046,0.50212956542,0.50204665218,0.501963734324,0.501880811855,0.501797884772,0.501714953077,0.50163201677,0.501549075853,0.501466130325,0.501383180188,0.501300225442,0.501217266089,0.501134302128,0.501051333561,0.500968360389,0.500885382611,0.50080240023,0.500719413245,0.500636421658,0.500553425469,0.50047042468,0.50038741929,0.5003044093,0.500221394712,0.500138375526,0.500055351742,0.499972323363,0.499889290387,0.499806252817,0.499723210653,0.499640163895,0.499557112545,0.499474056603,0.49939099607,0.499307930946,0.499224861234,0.499141786932,0.499058708042,0.498975624565,0.498892536502,0.498809443853,0.498726346619,0.4986432448,0.498560138399,0.498477027414,0.498393911848,0.498310791701,0.498227666973,0.498144537665,0.498061403779,0.497978265315,0.497895122273,0.497811974655,0.497728822461,0.497645665692,0.497562504349,0.497479338433,0.497396167943,0.497312992882,0.497229813249,0.497146629046,0.497063440274,0.496980246932,0.496897049023,0.496813846546,0.496730639502,0.496647427893,0.496564211718,0.496480990979,0.496397765677,0.496314535811,0.496231301384,0.496148062396,0.496064818847,0.495981570738,0.495898318071,0.495815060845,0.495731799061,0.495648532722,0.495565261826,0.495481986375,0.49539870637,0.495315421811,0.495232132699,0.495148839035,0.49506554082,0.494982238054,0.494898930739,0.494815618875,0.494732302462,0.494648981502,0.494565655995,0.494482325942,0.494398991344,0.494315652202,0.494232308516,0.494148960287,0.494065607516,0.493982250204,0.493898888351,0.493815521958,0.493732151026,0.493648775556,0.493565395549,0.493482011004,0.493398621924,0.493315228309,0.493231830159,0.493148427475,0.493065020259,0.49298160851,0.49289819223,0.492814771419,0.492731346079,0.492647916209,0.492564481811,0.492481042886,0.492397599433,0.492314151455,0.492230698951,0.492147241923,0.492063780372,0.491980314297,0.4918968437,0.491813368582,0.491729888943,0.491646404784,0.491562916107,0.49147942291,0.491395925197,0.491312422966,0.491228916219,0.491145404957,0.491061889181,0.490978368891,0.490894844088,0.490811314773,0.490727780946,0.490644242608,0.490560699761,0.490477152405,0.49039360054,0.490310044167,0.490226483288,0.490142917903,0.490059348012,0.489975773617,0.489892194719,0.489808611317,0.489725023413,0.489641431007,0.489557834101,0.489474232695,0.48939062679,0.489307016386,0.489223401485,0.489139782087,0.489056158193,0.488972529804,0.48888889692,0.488805259542,0.488721617671,0.488637971309,0.488554320454,0.488470665109,0.488387005274,0.48830334095,0.488219672138,0.488135998838,0.488052321051,0.487968638778,0.487884952019,0.487801260776,0.48771756505,0.48763386484,0.487550160148,0.487466450975,0.487382737321,0.487299019187,0.487215296574,0.487131569483,0.487047837914,0.486964101868,0.486880361346,0.486796616349,0.486712866877,0.486629112932,0.486545354513,0.486461591622,0.48637782426,0.486294052427,0.486210276124,0.486126495353,0.486042710112,0.485958920404,0.48587512623,0.485791327589,0.485707524483,0.485623716912,0.485539904878,0.485456088381,0.485372267421,0.485288442,0.485204612119,0.485120777777,0.485036938976,0.484953095717,0.484869248001,0.484785395827,0.484701539198,0.484617678113,0.484533812574,0.484449942581,0.484366068135,0.484282189237,0.484198305888,0.484114418087,0.484030525837,0.483946629138,0.483862727991,0.483778822396,0.483694912354,0.483610997866,0.483527078933,0.483443155555,0.483359227734,0.48327529547,0.483191358763,0.483107417616,0.483023472027,0.482939521999,0.482855567532,0.482771608626,0.482687645283,0.482603677503,0.482519705287,0.482435728636,0.482351747551,0.482267762031,0.482183772079,0.482099777695,0.482015778879,0.481931775633,0.481847767957,0.481763755852,0.481679739319,0.481595718358,0.48151169297,0.481427663157,0.481343628918,0.481259590255,0.481175547168,0.481091499659,0.481007447727,0.480923391374,0.4808393306,0.480755265407,0.480671195795,0.480587121764,0.480503043316,0.480418960451,0.480334873171,0.480250781475,0.480166685365,0.480082584841,0.479998479905,0.479914370556,0.479830256797,0.479746138626,0.479662016046,0.479577889057,0.47949375766,0.479409621856,0.479325481644,0.479241337027,0.479157188005,0.479073034579,0.478988876749,0.478904714516,0.478820547881,0.478736376845,0.478652201409,0.478568021573,0.478483837338,0.478399648705,0.478315455675,0.478231258248,0.478147056425,0.478062850207,0.477978639595,0.477894424589,0.477810205191,0.477725981401,0.47764175322,0.477557520648,0.477473283687,0.477389042337,0.477304796598,0.477220546473,0.477136291961,0.477052033063,0.47696776978,0.476883502114,0.476799230063,0.47671495363,0.476630672816,0.47654638762,0.476462098044,0.476377804088,0.476293505753,0.476209203041,0.476124895951,0.476040584485,0.475956268643,0.475871948427,0.475787623836,0.475703294872,0.475618961535,0.475534623827,0.475450281747,0.475365935297,0.475281584478,0.47519722929,0.475112869735,0.475028505812,0.474944137522,0.474859764868,0.474775387848,0.474691006464,0.474606620717,0.474522230608,0.474437836137,0.474353437305,0.474269034112,0.474184626561,0.474100214651,0.474015798383,0.473931377757,0.473846952776,0.473762523439,0.473678089748,0.473593651702,0.473509209303,0.473424762552,0.47334031145,0.473255855996,0.473171396192,0.473086932039,0.473002463538,0.472917990689,0.472833513493,0.47274903195,0.472664546063,0.47258005583,0.472495561254,0.472411062335,0.472326559073,0.47224205147,0.472157539526,0.472073023242,0.471988502619,0.471903977658,0.471819448359,0.471734914723,0.471650376751,0.471565834443,0.471481287802,0.471396736826,0.471312181517,0.471227621877,0.471143057904,0.471058489601,0.470973916969,0.470889340007,0.470804758717,0.470720173099,0.470635583155,0.470550988884,0.470466390289,0.470381787369,0.470297180125,0.470212568558,0.47012795267,0.47004333246,0.469958707929,0.469874079079,0.46978944591,0.469704808422,0.469620166617,0.469535520496,0.469450870058,0.469366215306,0.469281556239,0.469196892859,0.469112225165,0.46902755316,0.468942876844,0.468858196217,0.468773511281,0.468688822036,0.468604128483,0.468519430622,0.468434728455,0.468350021982,0.468265311204,0.468180596122,0.468095876736,0.468011153048,0.467926425058,0.467841692767,0.467756956176,0.467672215285,0.467587470095,0.467502720608,0.467417966823,0.467333208742,0.467248446365,0.467163679694,0.467078908728,0.466994133469,0.466909353917,0.466824570074,0.46673978194,0.466654989516,0.466570192802,0.466485391799,0.466400586509,0.466315776932,0.466230963068,0.466146144919,0.466061322486,0.465976495768,0.465891664767,0.465806829484,0.465721989919,0.465637146073,0.465552297948,0.465467445543,0.46538258886,0.465297727898,0.46521286266,0.465127993146,0.465043119357,0.464958241293,0.464873358955,0.464788472344,0.464703581461,0.464618686306,0.464533786881,0.464448883186,0.464363975222,0.464279062989,0.464194146489,0.464109225722,0.464024300689,0.463939371391,0.463854437828,0.463769500002,0.463684557913,0.463599611562,0.463514660949,0.463429706076,0.463344746944,0.463259783552,0.463174815902,0.463089843995,0.463004867831,0.462919887411,0.462834902736,0.462749913807,0.462664920624,0.462579923189,0.462494921502,0.462409915563,0.462324905375,0.462239890936,0.462154872249,0.462069849314,0.461984822131,0.461899790702,0.461814755028,0.461729715108,0.461644670945,0.461559622538,0.461474569888,0.461389512997,0.461304451865,0.461219386492,0.46113431688,0.46104924303,0.460964164941,0.460879082616,0.460793996054,0.460708905256,0.460623810224,0.460538710958,0.460453607459,0.460368499727,0.460283387764,0.46019827157,0.460113151146,0.460028026493,0.459942897611,0.459857764501,0.459772627165,0.459687485602,0.459602339814,0.459517189802,0.459432035566,0.459346877106,0.459261714425,0.459176547522,0.459091376398,0.459006201055,0.458921021492,0.458835837712,0.458750649713,0.458665457498,0.458580261067,0.458495060421,0.45840985556,0.458324646486,0.458239433199,0.4581542157,0.45806899399,0.457983768069,0.457898537938,0.457813303599,0.457728065051,0.457642822297,0.457557575335,0.457472324168,0.457387068796,0.457301809219,0.45721654544,0.457131277457,0.457046005273,0.456960728888,0.456875448302,0.456790163517,0.456704874533,0.456619581351,0.456534283972,0.456448982397,0.456363676626,0.45627836666,0.456193052501,0.456107734148,0.456022411602,0.455937084865,0.455851753937,0.455766418819,0.455681079512,0.455595736016,0.455510388333,0.455425036462,0.455339680406,0.455254320163,0.455168955737,0.455083587126,0.454998214333,0.454912837357,0.4548274562,0.454742070862,0.454656681344,0.454571287647,0.454485889772,0.454400487719,0.45431508149,0.454229671084,0.454144256504,0.454058837749,0.45397341482,0.453887987718,0.453802556445,0.453717121,0.453631681385,0.4535462376,0.453460789646,0.453375337524,0.453289881235,0.453204420779,0.453118956157,0.453033487371,0.45294801442,0.452862537306,0.452777056029,0.452691570591,0.452606080991,0.452520587231,0.452435089312,0.452349587234,0.452264080998,0.452178570605,0.452093056055,0.45200753735,0.451922014491,0.451836487477,0.45175095631,0.451665420991,0.45157988152,0.451494337898,0.451408790127,0.451323238206,0.451237682136,0.451152121919,0.451066557555,0.450980989045,0.45089541639,0.45080983959,0.450724258646,0.450638673559,0.45055308433,0.45046749096,0.450381893449,0.450296291799,0.450210686009,0.450125076081,0.450039462016,0.449953843814,0.449868221476,0.449782595003,0.449696964395,0.449611329655,0.449525690781,0.449440047776,0.449354400639,0.449268749372,0.449183093975,0.44909743445,0.449011770796,0.448926103016,0.448840431109,0.448754755076,0.448669074918,0.448583390637,0.448497702232,0.448412009704,0.448326313055,0.448240612285,0.448154907395,0.448069198386,0.447983485257,0.447897768012,0.447812046649,0.44772632117,0.447640591575,0.447554857866,0.447469120043,0.447383378108,0.447297632059,0.4472118819,0.447126127629,0.447040369249,0.44695460676,0.446868840162,0.446783069457,0.446697294645,0.446611515728,0.446525732705,0.446439945577,0.446354154346,0.446268359013,0.446182559577,0.44609675604,0.446010948403,0.445925136666,0.44583932083,0.445753500896,0.445667676865,0.445581848737,0.445496016514,0.445410180196,0.445324339783,0.445238495278,0.44515264668,0.44506679399,0.444980937209,0.444895076338,0.444809211377,0.444723342328,0.444637469191,0.444551591967,0.444465710657,0.444379825262,0.444293935782,0.444208042218,0.44412214457,0.444036242841,0.44395033703,0.443864427139,0.443778513167,0.443692595117,0.443606672988,0.443520746781,0.443434816498,0.443348882139,0.443262943705,0.443177001196,0.443091054614,0.443005103959,0.442919149232,0.442833190433,0.442747227565,0.442661260626,0.442575289619,0.442489314544,0.442403335401,0.442317352192,0.442231364918,0.442145373578,0.442059378174,0.441973378707,0.441887375178,0.441801367586,0.441715355934,0.441629340222,0.44154332045,0.44145729662,0.441371268732,0.441285236787,0.441199200785,0.441113160729,0.441027116617,0.440941068452,0.440855016234,0.440768959964,0.440682899642,0.440596835269,0.440510766847,0.440424694375,0.440338617856,0.440252537288,0.440166452675,0.440080364015,0.43999427131,0.43990817456,0.439822073767,0.439735968932,0.439649860054,0.439563747135,0.439477630176,0.439391509178,0.43930538414,0.439219255065,0.439133121952,0.439046984803,0.438960843618,0.438874698398,0.438788549145,0.438702395858,0.438616238539,0.438530077188,0.438443911806,0.438357742394,0.438271568952,0.438185391483,0.438099209985,0.438013024461,0.43792683491,0.437840641334,0.437754443734,0.43766824211,0.437582036463,0.437495826794,0.437409613103,0.437323395392,0.437237173661,0.437150947911,0.437064718143,0.436978484357,0.436892246555,0.436806004737,0.436719758904,0.436633509057,0.436547255196,0.436460997323,0.436374735438,0.436288469542,0.436202199635,0.436115925719,0.436029647794,0.435943365862,0.435857079922,0.435770789976,0.435684496025,0.435598198069,0.435511896108,0.435425590145,0.43533928018,0.435252966213,0.435166648245,0.435080326277,0.43499400031,0.434907670344,0.434821336381,0.434734998422,0.434648656466,0.434562310515,0.43447596057,0.434389606631,0.434303248699,0.434216886775,0.43413052086,0.434044150955,0.43395777706,0.433871399176,0.433785017304,0.433698631444,0.433612241599,0.433525847767,0.433439449951,0.433353048151,0.433266642367,0.433180232601,0.433093818853,0.433007401124,0.432920979416,0.432834553727,0.432748124061,0.432661690416,0.432575252795,0.432488811198,0.432402365625,0.432315916077,0.432229462556,0.432143005062,0.432056543596,0.431970078158,0.43188360875,0.431797135372,0.431710658025,0.43162417671,0.431537691427,0.431451202178,0.431364708963,0.431278211783,0.431191710639,0.431105205531,0.431018696461,0.430932183429,0.430845666436,0.430759145483,0.43067262057,0.430586091698,0.430499558869,0.430413022083,0.43032648134,0.430239936642,0.430153387989,0.430066835383,0.429980278823,0.429893718311,0.429807153847,0.429720585433,0.429634013069,0.429547436756,0.429460856494,0.429374272285,0.42928768413,0.429201092028,0.429114495981,0.42902789599,0.428941292055,0.428854684178,0.428768072359,0.428681456598,0.428594836897,0.428508213257,0.428421585678,0.428334954161,0.428248318707,0.428161679316,0.42807503599,0.427988388729,0.427901737534,0.427815082406,0.427728423345,0.427641760353,0.42755509343,0.427468422577,0.427381747795,0.427295069085,0.427208386447,0.427121699882,0.427035009391,0.426948314975,0.426861616634,0.42677491437,0.426688208183,0.426601498074,0.426514784044,0.426428066093,0.426341344223,0.426254618434,0.426167888727,0.426081155102,0.425994417562,0.425907676105,0.425820930734,0.425734181448,0.42564742825,0.425560671138,0.425473910116,0.425387145182,0.425300376338,0.425213603585,0.425126826924,0.425040046355,0.424953261879,0.424866473496,0.424779681209,0.424692885017,0.424606084922,0.424519280923,0.424432473023,0.424345661221,0.424258845519,0.424172025917,0.424085202416,0.423998375017,0.42391154372,0.423824708528,0.423737869439,0.423651026456,0.423564179578,0.423477328807,0.423390474144,0.423303615589,0.423216753143,0.423129886807,0.423043016581,0.422956142467,0.422869264466,0.422782382577,0.422695496802,0.422608607142,0.422521713598,0.422434816169,0.422347914858,0.422261009665,0.42217410059,0.422087187635,0.4220002708,0.421913350086,0.421826425494,0.421739497024,0.421652564679,0.421565628457,0.42147868836,0.42139174439,0.421304796545,0.421217844829,0.42113088924,0.421043929781,0.420956966452,0.420869999253,0.420783028186,0.42069605325,0.420609074448,0.42052209178,0.420435105247,0.420348114849,0.420261120587,0.420174122462,0.420087120475,0.420000114627,0.419913104918,0.419826091349,0.419739073922,0.419652052636,0.419565027493,0.419477998493,0.419390965638,0.419303928928,0.419216888363,0.419129843945,0.419042795675,0.418955743553,0.41886868758,0.418781627757,0.418694564084,0.418607496563,0.418520425194,0.418433349978,0.418346270916,0.418259188009,0.418172101257,0.418085010662,0.417997916223,0.417910817942,0.41782371582,0.417736609858,0.417649500055,0.417562386414,0.417475268935,0.417388147618,0.417301022464,0.417213893475,0.417126760651,0.417039623993,0.416952483502,0.416865339178,0.416778191022,0.416691039035,0.416603883218,0.416516723572,0.416429560098,0.416342392795,0.416255221666,0.41616804671,0.41608086793,0.415993685324,0.415906498895,0.415819308643,0.415732114569,0.415644916674,0.415557714958,0.415470509422,0.415383300068,0.415296086895,0.415208869905,0.415121649098,0.415034424476,0.414947196039,0.414859963788,0.414772727723,0.414685487846,0.414598244157,0.414510996658,0.414423745348,0.414336490229,0.414249231301,0.414161968566,0.414074702024,0.413987431676,0.413900157523,0.413812879565,0.413725597803,0.413638312238,0.413551022872,0.413463729704,0.413376432736,0.413289131968,0.413201827401,0.413114519036,0.413027206874,0.412939890915,0.412852571161,0.412765247612,0.412677920268,0.412590589132,0.412503254203,0.412415915483,0.412328572971,0.41224122667,0.412153876579,0.4120665227,0.411979165034,0.41189180358,0.41180443834,0.411717069316,0.411629696507,0.411542319914,0.411454939538,0.411367555381,0.411280167442,0.411192775723,0.411105380224,0.411017980946,0.410930577891,0.410843171058,0.410755760449,0.410668346064,0.410580927905,0.410493505971,0.410406080264,0.410318650785,0.410231217535,0.410143780514,0.410056339722,0.409968895162,0.409881446833,0.409793994737,0.409706538874,0.409619079245,0.409531615851,0.409444148692,0.40935667777,0.409269203086,0.409181724639,0.409094242431,0.409006756463,0.408919266736,0.40883177325,0.408744276005,0.408656775004,0.408569270247,0.408481761734,0.408394249466,0.408306733445,0.40821921367,0.408131690143,0.408044162865,0.407956631836,0.407869097057,0.407781558529,0.407694016253,0.40760647023,0.40751892046,0.407431366944,0.407343809683,0.407256248677,0.407168683929,0.407081115438,0.406993543204,0.40690596723,0.406818387516,0.406730804063,0.40664321687,0.40655562594,0.406468031273,0.40638043287,0.406292830732,0.406205224859,0.406117615252,0.406030001912,0.40594238484,0.405854764037,0.405767139503,0.40567951124,0.405591879248,0.405504243527,0.405416604079,0.405328960905,0.405241314005,0.40515366338,0.405066009031,0.404978350959,0.404890689164,0.404803023648,0.40471535441,0.404627681453,0.404540004777,0.404452324382,0.404364640269,0.404276952439,0.404189260894,0.404101565633,0.404013866658,0.403926163969,0.403838457568,0.403750747454,0.403663033629,0.403575316094,0.403487594849,0.403399869896,0.403312141235,0.403224408866,0.403136672791,0.40304893301,0.402961189525,0.402873442336,0.402785691444,0.402697936849,0.402610178553,0.402522416556,0.402434650859,0.402346881464,0.402259108369,0.402171331578,0.40208355109,0.401995766905,0.401907979026,0.401820187453,0.401732392186,0.401644593226,0.401556790575,0.401468984233,0.4013811742,0.401293360478,0.401205543067,0.401117721969,0.401029897184,0.400942068712,0.400854236555,0.400766400714,0.400678561188,0.40059071798,0.40050287109,0.400415020518,0.400327166266,0.400239308334,0.400151446723,0.400063581434,0.399975712468,0.399887839825,0.399799963506,0.399712083513,0.399624199846,0.399536312505,0.399448421492,0.399360526807,0.399272628452,0.399184726426,0.399096820731,0.399008911368,0.398920998337,0.398833081639,0.398745161276,0.398657237247,0.398569309554,0.398481378197,0.398393443177,0.398305504496,0.398217562153,0.39812961615,0.398041666488,0.397953713167,0.397865756188,0.397777795552,0.397689831259,0.397601863311,0.397513891709,0.397425916452,0.397337937543,0.397249954981,0.397161968768,0.397073978904,0.39698598539,0.396897988228,0.396809987417,0.396721982958,0.396633974854,0.396545963103,0.396457947707,0.396369928668,0.396281905985,0.396193879659,0.396105849692,0.396017816083,0.395929778835,0.395841737947,0.395753693421,0.395665645257,0.395577593457,0.39548953802,0.395401478948,0.395313416241,0.395225349901,0.395137279928,0.395049206323,0.394961129087,0.394873048221,0.394784963724,0.394696875599,0.394608783847,0.394520688466,0.39443258946,0.394344486828,0.394256380571,0.394168270691,0.394080157187,0.393992040061,0.393903919314,0.393815794945,0.393727666957,0.39363953535,0.393551400125,0.393463261282,0.393375118823,0.393286972747,0.393198823057,0.393110669753,0.393022512835,0.392934352304,0.392846188162,0.392758020409,0.392669849046,0.392581674073,0.392493495492,0.392405313303,0.392317127507,0.392228938105,0.392140745098,0.392052548486,0.391964348271,0.391876144453,0.391787937033,0.391699726011,0.391611511389,0.391523293168,0.391435071348,0.391346845929,0.391258616914,0.391170384302,0.391082148095,0.390993908293,0.390905664897,0.390817417908,0.390729167326,0.390640913153,0.39055265539,0.390464394036,0.390376129094,0.390287860563,0.390199588444,0.39011131274,0.390023033449,0.389934750573,0.389846464113,0.38975817407,0.389669880444,0.389581583236,0.389493282448,0.389404978079,0.389316670131,0.389228358604,0.3891400435,0.389051724819,0.388963402562,0.388875076729,0.388786747322,0.388698414342,0.388610077788,0.388521737663,0.388433393966,0.388345046699,0.388256695862,0.388168341457,0.388079983483,0.387991621943,0.387903256836,0.387814888164,0.387726515926,0.387638140125,0.387549760761,0.387461377835,0.387372991347,0.387284601299,0.38719620769,0.387107810523,0.387019409797,0.386931005514,0.386842597675,0.38675418628,0.386665771329,0.386577352825,0.386488930767,0.386400505157,0.386312075995,0.386223643282,0.386135207019,0.386046767207,0.385958323846,0.385869876938,0.385781426482,0.385692972481,0.385604514935,0.385516053844,0.38542758921,0.385339121032,0.385250649313,0.385162174053,0.385073695252,0.384985212912,0.384896727034,0.384808237617,0.384719744663,0.384631248173,0.384542748148,0.384454244587,0.384365737494,0.384277226867,0.384188712707,0.384100195017,0.384011673796,0.383923149045,0.383834620765,0.383746088957,0.383657553622,0.38356901476,0.383480472373,0.383391926461,0.383303377024,0.383214824065,0.383126267583,0.383037707579,0.382949144055,0.382860577011,0.382772006447,0.382683432365,0.382594854766,0.382506273649,0.382417689017,0.38232910087,0.382240509209,0.382151914034,0.382063315346,0.381974713147,0.381886107436,0.381797498215,0.381708885485,0.381620269247,0.3815316495,0.381443026247,0.381354399487,0.381265769222,0.381177135453,0.38108849818,0.380999857404,0.380911213126,0.380822565346,0.380733914067,0.380645259287,0.380556601009,0.380467939233,0.380379273959,0.38029060519,0.380201932924,0.380113257164,0.38002457791,0.379935895163,0.379847208924,0.379758519193,0.379669825972,0.37958112926,0.37949242906,0.379403725372,0.379315018196,0.379226307533,0.379137593385,0.379048875752,0.378960154634,0.378871430034,0.37878270195,0.378693970385,0.37860523534,0.378516496814,0.378427754809,0.378339009325,0.378250260364,0.378161507926,0.378072752012,0.377983992623,0.37789522976,0.377806463423,0.377717693613,0.377628920332,0.377540143579,0.377451363356,0.377362579664,0.377273792503,0.377185001874,0.377096207778,0.377007410216,0.376918609189,0.376829804697,0.376740996741,0.376652185323,0.376563370442,0.3764745521,0.376385730298,0.376296905036,0.376208076315,0.376119244136,0.3760304085,0.375941569407,0.375852726859,0.375763880856,0.375675031399,0.375586178489,0.375497322127,0.375408462313,0.375319599049,0.375230732334,0.375141862171,0.37505298856,0.374964111501,0.374875230995,0.374786347044,0.374697459647,0.374608568807,0.374519674523,0.374430776797,0.374341875629,0.37425297102,0.374164062971,0.374075151483,0.373986236557,0.373897318193,0.373808396392,0.373719471155,0.373630542483,0.373541610377,0.373452674837,0.373363735864,0.37327479346,0.373185847624,0.373096898359,0.373007945663,0.37291898954,0.372830029988,0.37274106701,0.372652100605,0.372563130775,0.37247415752,0.372385180842,0.372296200741,0.372207217218,0.372118230273,0.372029239908,0.371940246124,0.37185124892,0.371762248299,0.371673244261,0.371584236806,0.371495225936,0.371406211651,0.371317193952,0.37122817284,0.371139148316,0.37105012038,0.370961089034,0.370872054278,0.370783016113,0.37069397454,0.370604929559,0.370515881172,0.370426829379,0.370337774182,0.37024871558,0.370159653575,0.370070588168,0.369981519359,0.369892447149,0.369803371539,0.36971429253,0.369625210123,0.369536124318,0.369447035117,0.36935794252,0.369268846527,0.369179747141,0.369090644361,0.369001538188,0.368912428624,0.368823315668,0.368734199323,0.368645079588,0.368555956464,0.368466829953,0.368377700055,0.368288566771,0.368199430102,0.368110290049,0.368021146612,0.367931999792,0.36784284959,0.367753696007,0.367664539043,0.3675753787,0.367486214979,0.367397047879,0.367307877403,0.36721870355,0.367129526322,0.36704034572,0.366951161743,0.366861974394,0.366772783673,0.36668358958,0.366594392117,0.366505191284,0.366415987082,0.366326779513,0.366237568576,0.366148354272,0.366059136604,0.36596991557,0.365880691173,0.365791463412,0.365702232289,0.365612997805,0.36552375996,0.365434518755,0.365345274191,0.365256026269,0.36516677499,0.365077520354,0.364988262363,0.364899001016,0.364809736316,0.364720468262,0.364631196856,0.364541922098,0.364452643989,0.364363362531,0.364274077723,0.364184789567,0.364095498064,0.364006203213,0.363916905017,0.363827603476,0.363738298591,0.363648990362,0.36355967879,0.363470363877,0.363381045623,0.363291724029,0.363202399096,0.363113070824,0.363023739214,0.362934404268,0.362845065985,0.362755724367,0.362666379415,0.36257703113,0.362487679511,0.362398324561,0.36230896628,0.362219604668,0.362130239727,0.362040871458,0.36195149986,0.361862124936,0.361772746685,0.361683365109,0.361593980209,0.361504591985,0.361415200438,0.361325805568,0.361236407378,0.361147005867,0.361057601037,0.360968192888,0.360878781421,0.360789366637,0.360699948537,0.360610527121,0.36052110239,0.360431674346,0.360342242988,0.360252808319,0.360163370338,0.360073929046,0.359984484445,0.359895036535,0.359805585317,0.359716130791,0.359626672959,0.359537211822,0.35944774738,0.359358279633,0.359268808584,0.359179334232,0.359089856579,0.359000375625,0.358910891371,0.358821403819,0.358731912968,0.358642418819,0.358552921374,0.358463420634,0.358373916598,0.358284409268,0.358194898645,0.35810538473,0.358015867523,0.357926347025,0.357836823237,0.35774729616,0.357657765795,0.357568232142,0.357478695203,0.357389154977,0.357299611467,0.357210064672,0.357120514594,0.357030961233,0.356941404591,0.356851844668,0.356762281464,0.356672714982,0.35658314522,0.356493572182,0.356403995866,0.356314416274,0.356224833408,0.356135247267,0.356045657852,0.355956065165,0.355866469205,0.355776869975,0.355687267475,0.355597661705,0.355508052666,0.35541844036,0.355328824787,0.355239205948,0.355149583843,0.355059958474,0.354970329842,0.354880697946,0.354791062789,0.35470142437,0.354611782691,0.354522137753,0.354432489556,0.354342838101,0.354253183389,0.35416352542,0.354073864197,0.353984199719,0.353894531987,0.353804861002,0.353715186765,0.353625509277,0.353535828538,0.353446144549,0.353356457312,0.353266766827,0.353177073095,0.353087376116,0.352997675892,0.352907972424,0.352818265711,0.352728555755,0.352638842557,0.352549126118,0.352459406438,0.352369683519,0.35227995736,0.352190227964,0.35210049533,0.35201075946,0.351921020354,0.351831278013,0.351741532439,0.351651783631,0.351562031591,0.35147227632,0.351382517818,0.351292756086,0.351202991125,0.351113222935,0.351023451519,0.350933676876,0.350843899007,0.350754117913,0.350664333596,0.350574546055,0.350484755292,0.350394961307,0.350305164101,0.350215363675,0.350125560031,0.350035753168,0.349945943087,0.34985612979,0.349766313277,0.349676493549,0.349586670607,0.349496844452,0.349407015084,0.349317182505,0.349227346714,0.349137507714,0.349047665505,0.348957820087,0.348867971461,0.348778119629,0.348688264591,0.348598406348,0.3485085449,0.348418680249,0.348328812396,0.348238941341,0.348149067085,0.348059189629,0.347969308973,0.347879425119,0.347789538067,0.347699647819,0.347609754375,0.347519857735,0.347429957901,0.347340054874,0.347250148654,0.347160239242,0.347070326639,0.346980410846,0.346890491863,0.346800569692,0.346710644334,0.346620715788,0.346530784056,0.346440849139,0.346350911038,0.346260969753,0.346171025285,0.346081077636,0.345991126805,0.345901172794,0.345811215604,0.345721255235,0.345631291688,0.345541324964,0.345451355064,0.345361381989,0.345271405739,0.345181426316,0.345091443719,0.345001457951,0.344911469012,0.344821476902,0.344731481622,0.344641483174,0.344551481559,0.344461476776,0.344371468826,0.344281457712,0.344191443433,0.34410142599,0.344011405384,0.343921381616,0.343831354687,0.343741324598,0.343651291349,0.343561254941,0.343471215375,0.343381172652,0.343291126773,0.343201077738,0.343111025549,0.343020970206,0.34293091171,0.342840850062,0.342750785262,0.342660717312,0.342570646212,0.342480571964,0.342390494567,0.342300414024,0.342210330333,0.342120243498,0.342030153518,0.341940060393,0.341849964126,0.341759864717,0.341669762166,0.341579656475,0.341489547644,0.341399435674,0.341309320566,0.34121920232,0.341129080939,0.341038956421,0.340948828769,0.340858697983,0.340768564064,0.340678427013,0.34058828683,0.340498143517,0.340407997074,0.340317847501,0.340227694801,0.340137538974,0.340047380019,0.33995721794,0.339867052735,0.339776884407,0.339686712955,0.339596538381,0.339506360686,0.33941617987,0.339325995934,0.339235808879,0.339145618705,0.339055425415,0.338965229008,0.338875029485,0.338784826848,0.338694621096,0.338604412231,0.338514200254,0.338423985165,0.338333766966,0.338243545656,0.338153321238,0.338063093711,0.337972863077,0.337882629336,0.33779239249,0.337702152538,0.337611909483,0.337521663324,0.337431414063,0.337341161701,0.337250906237,0.337160647674,0.337070386011,0.33698012125,0.336889853392,0.336799582437,0.336709308387,0.336619031241,0.336528751001,0.336438467668,0.336348181243,0.336257891726,0.336167599118,0.33607730342,0.335987004633,0.335896702757,0.335806397794,0.335716089745,0.335625778609,0.335535464389,0.335445147085,0.335354826697,0.335264503226,0.335174176674,0.335083847041,0.334993514328,0.334903178536,0.334812839666,0.334722497718,0.334632152693,0.334541804592,0.334451453417,0.334361099167,0.334270741844,0.334180381448,0.33409001798,0.333999651442,0.333909281834,0.333818909156,0.33372853341,0.333638154596,0.333547772716,0.33345738777,0.333366999759,0.333276608683,0.333186214544,0.333095817343,0.333005417079,0.332915013755,0.332824607371,0.332734197927,0.332643785426,0.332553369866,0.33246295125,0.332372529578,0.33228210485,0.332191677069,0.332101246234,0.332010812346,0.331920375407,0.331829935416,0.331739492376,0.331649046286,0.331558597148,0.331468144962,0.33137768973,0.331287231451,0.331196770128,0.33110630576,0.331015838349,0.330925367895,0.330834894399,0.330744417862,0.330653938285,0.330563455669,0.330472970014,0.330382481322,0.330291989593,0.330201494828,0.330110997028,0.330020496193,0.329929992325,0.329839485424,0.329748975492,0.329658462529,0.329567946535,0.329477427512,0.329386905461,0.329296380382,0.329205852276,0.329115321144,0.329024786987,0.328934249806,0.328843709601,0.328753166373,0.328662620124,0.328572070854,0.328481518563,0.328390963253,0.328300404925,0.328209843579,0.328119279216,0.328028711837,0.327938141443,0.327847568035,0.327756991613,0.327666412179,0.327575829733,0.327485244275,0.327394655808,0.327304064331,0.327213469845,0.327122872352,0.327032271853,0.326941668347,0.326851061836,0.32676045232,0.326669839801,0.32657922428,0.326488605756,0.326397984232,0.326307359707,0.326216732183,0.326126101661,0.32603546814,0.325944831623,0.32585419211,0.325763549602,0.325672904099,0.325582255603,0.325491604115,0.325400949634,0.325310292162,0.3252196317,0.325128968249,0.32503830181,0.324947632382,0.324856959968,0.324766284568,0.324675606182,0.324584924813,0.324494240459,0.324403553123,0.324312862805,0.324222169507,0.324131473228,0.324040773969,0.323950071732,0.323859366518,0.323768658326,0.323677947159,0.323587233016,0.3234965159,0.323405795809,0.323315072746,0.323224346711,0.323133617705,0.323042885729,0.322952150783,0.322861412869,0.322770671988,0.322679928139,0.322589181325,0.322498431545,0.322407678801,0.322316923094,0.322226164423,0.322135402791,0.322044638198,0.321953870645,0.321863100133,0.321772326662,0.321681550233,0.321590770847,0.321499988506,0.321409203209,0.321318414958,0.321227623754,0.321136829597,0.321046032488,0.320955232428,0.320864429418,0.320773623458,0.320682814551,0.320592002695,0.320501187893,0.320410370144,0.320319549451,0.320228725813,0.320137899232,0.320047069708,0.319956237242,0.319865401836,0.319774563489,0.319683722203,0.319592877978,0.319502030816,0.319411180717,0.319320327682,0.319229471712,0.319138612808,0.31904775097,0.318956886199,0.318866018497,0.318775147864,0.318684274301,0.318593397808,0.318502518387,0.318411636039,0.318320750763,0.318229862562,0.318138971436,0.318048077385,0.317957180411,0.317866280514,0.317775377696,0.317684471956,0.317593563297,0.317502651718,0.317411737221,0.317320819806,0.317229899475,0.317138976228,0.317048050065,0.316957120989,0.316866188998,0.316775254096,0.316684316281,0.316593375556,0.316502431921,0.316411485376,0.316320535923,0.316229583563,0.316138628296,0.316047670123,0.315956709045,0.315865745062,0.315774778176,0.315683808388,0.315592835698,0.315501860108,0.315410881617,0.315319900227,0.315228915938,0.315137928753,0.31504693867,0.314955945692,0.314864949818,0.314773951051,0.31468294939,0.314591944836,0.314500937391,0.314409927055,0.314318913829,0.314227897714,0.314136878711,0.31404585682,0.313954832043,0.31386380438,0.313772773831,0.313681740399,0.313590704083,0.313499664885,0.313408622805,0.313317577845,0.313226530004,0.313135479285,0.313044425687,0.312953369212,0.31286230986,0.312771247632,0.312680182529,0.312589114553,0.312498043703,0.31240696998,0.312315893386,0.312224813922,0.312133731587,0.312042646384,0.311951558312,0.311860467372,0.311769373567,0.311678276895,0.311587177359,0.311496074958,0.311404969695,0.311313861569,0.311222750581,0.311131636733,0.311040520025,0.310949400458,0.310858278032,0.31076715275,0.31067602461,0.310584893616,0.310493759766,0.310402623062,0.310311483506,0.310220341096,0.310129195836,0.310038047725,0.309946896764,0.309855742954,0.309764586295,0.30967342679,0.309582264438,0.309491099241,0.309399931198,0.309308760312,0.309217586583,0.309126410011,0.309035230598,0.308944048345,0.308852863252,0.308761675319,0.308670484549,0.308579290942,0.308488094498,0.308396895218,0.308305693104,0.308214488156,0.308123280375,0.308032069761,0.307940856317,0.307849640042,0.307758420937,0.307667199003,0.307575974241,0.307484746652,0.307393516237,0.307302282996,0.307211046931,0.307119808042,0.307028566329,0.306937321795,0.306846074439,0.306754824263,0.306663571267,0.306572315453,0.30648105682,0.306389795371,0.306298531105,0.306207264024,0.306115994128,0.306024721418,0.305933445896,0.305842167561,0.305750886415,0.305659602459,0.305568315693,0.305477026119,0.305385733736,0.305294438547,0.305203140551,0.30511183975,0.305020536145,0.304929229735,0.304837920523,0.304746608509,0.304655293694,0.304563976079,0.304472655663,0.30438133245,0.304290006438,0.30419867763,0.304107346025,0.304016011625,0.303924674431,0.303833334443,0.303741991662,0.30365064609,0.303559297726,0.303467946572,0.303376592629,0.303285235897,0.303193876377,0.30310251407,0.303011148978,0.3029197811,0.302828410438,0.302737036992,0.302645660763,0.302554281753,0.302462899962,0.30237151539,0.302280128039,0.30218873791,0.302097345003,0.302005949319,0.301914550859,0.301823149625,0.301731745615,0.301640338833,0.301548929277,0.30145751695,0.301366101852,0.301274683984,0.301183263347,0.301091839941,0.301000413768,0.300908984828,0.300817553122,0.300726118651,0.300634681416,0.300543241417,0.300451798656,0.300360353133,0.30026890485,0.300177453806,0.300086000003,0.299994543442,0.299903084124,0.299811622048,0.299720157217,0.299628689631,0.299537219291,0.299445746198,0.299354270352,0.299262791754,0.299171310406,0.299079826308,0.298988339461,0.298896849865,0.298805357523,0.298713862433,0.298622364598,0.298530864018,0.298439360694,0.298347854627,0.298256345817,0.298164834266,0.298073319974,0.297981802943,0.297890283172,0.297798760664,0.297707235418,0.297615707435,0.297524176717,0.297432643264,0.297341107077,0.297249568157,0.297158026505,0.297066482122,0.296974935008,0.296883385164,0.296791832591,0.29670027729,0.296608719262,0.296517158508,0.296425595028,0.296334028823,0.296242459895,0.296150888244,0.29605931387,0.295967736775,0.29587615696,0.295784574425,0.295692989171,0.295601401199,0.295509810511,0.295418217106,0.295326620985,0.29523502215,0.295143420601,0.295051816339,0.294960209366,0.294868599681,0.294776987285,0.294685372181,0.294593754367,0.294502133846,0.294410510617,0.294318884683,0.294227256043,0.294135624698,0.29404399065,0.2939523539,0.293860714447,0.293769072293,0.293677427439,0.293585779886,0.293494129634,0.293402476684,0.293310821037,0.293219162694,0.293127501656,0.293035837924,0.292944171498,0.29285250238,0.292760830569,0.292669156068,0.292577478876,0.292485798996,0.292394116426,0.292302431169,0.292210743226,0.292119052596,0.292027359281,0.291935663282,0.2918439646,0.291752263235,0.291660559188,0.291568852461,0.291477143053,0.291385430966,0.291293716201,0.291201998759,0.291110278639,0.291018555844,0.290926830374,0.29083510223,0.290743371412,0.290651637922,0.290559901761,0.290468162928,0.290376421426,0.290284677254,0.290192930415,0.290101180908,0.290009428734,0.289917673895,0.289825916391,0.289734156223,0.289642393391,0.289550627898,0.289458859743,0.289367088927,0.289275315451,0.289183539317,0.289091760524,0.288999979074,0.288908194968,0.288816408206,0.288724618789,0.288632826719,0.288541031995,0.288449234619,0.288357434592,0.288265631915,0.288173826587,0.288082018611,0.287990207987,0.287898394715,0.287806578798,0.287714760235,0.287622939027,0.287531115176,0.287439288681,0.287347459545,0.287255627767,0.287163793349,0.287071956291,0.286980116595,0.286888274261,0.286796429289,0.286704581682,0.286612731439,0.286520878562,0.286429023051,0.286337164908,0.286245304132,0.286153440725,0.286061574688,0.285969706022,0.285877834727,0.285785960804,0.285694084255,0.285602205079,0.285510323278,0.285418438853,0.285326551805,0.285234662133,0.28514276984,0.285050874926,0.284958977392,0.284867077238,0.284775174466,0.284683269077,0.284591361071,0.284499450449,0.284407537211,0.28431562136,0.284223702895,0.284131781818,0.284039858129,0.283947931829,0.283856002919,0.2837640714,0.283672137273,0.283580200538,0.283488261197,0.283396319249,0.283304374697,0.283212427541,0.283120477782,0.28302852542,0.282936570457,0.282844612893,0.282752652729,0.282660689967,0.282568724606,0.282476756647,0.282384786093,0.282292812942,0.282200837197,0.282108858858,0.282016877926,0.281924894402,0.281832908286,0.28174091958,0.281648928284,0.281556934399,0.281464937926,0.281372938866,0.281280937219,0.281188932988,0.281096926171,0.281004916771,0.280912904788,0.280820890222,0.280728873076,0.280636853349,0.280544831042,0.280452806157,0.280360778694,0.280268748654,0.280176716038,0.280084680846,0.27999264308,0.279900602741,0.279808559828,0.279716514344,0.279624466288,0.279532415663,0.279440362467,0.279348306704,0.279256248372,0.279164187474,0.27907212401,0.27898005798,0.278887989387,0.278795918229,0.278703844509,0.278611768228,0.278519689385,0.278427607982,0.27833552402,0.2782434375,0.278151348422,0.278059256787,0.277967162597,0.277875065852,0.277782966552,0.277690864699,0.277598760293,0.277506653336,0.277414543828,0.277322431771,0.277230317164,0.277138200009,0.277046080306,0.276953958057,0.276861833262,0.276769705923,0.276677576039,0.276585443612,0.276493308643,0.276401171132,0.276309031081,0.27621688849,0.27612474336,0.276032595692,0.275940445487,0.275848292746,0.275756137468,0.275663979657,0.275571819311,0.275479656432,0.275387491021,0.275295323079,0.275203152607,0.275110979605,0.275018804074,0.274926626015,0.274834445429,0.274742262317,0.274650076679,0.274557888517,0.274465697831,0.274373504623,0.274281308892,0.274189110641,0.274096909869,0.274004706577,0.273912500767,0.27382029244,0.273728081595,0.273635868234,0.273543652358,0.273451433968,0.273359213064,0.273266989648,0.27317476372,0.273082535281,0.272990304331,0.272898070873,0.272805834906,0.272713596431,0.27262135545,0.272529111963,0.272436865971,0.272344617474,0.272252366475,0.272160112972,0.272067856969,0.271975598464,0.271883337459,0.271791073956,0.271698807954,0.271606539455,0.271514268459,0.271421994967,0.271329718981,0.2712374405,0.271145159527,0.271052876061,0.270960590104,0.270868301656,0.270776010718,0.270683717291,0.270591421377,0.270499122975,0.270406822087,0.270314518713,0.270222212854,0.270129904512,0.270037593687,0.269945280379,0.269852964591,0.269760646322,0.269668325573,0.269576002346,0.26948367664,0.269391348458,0.269299017799,0.269206684665,0.269114349057,0.269022010975,0.26892967042,0.268837327394,0.268744981896,0.268652633928,0.26856028349,0.268467930584,0.268375575211,0.26828321737,0.268190857063,0.268098494292,0.268006129056,0.267913761356,0.267821391194,0.26772901857,0.267636643486,0.267544265941,0.267451885937,0.267359503474,0.267267118554,0.267174731178,0.267082341345,0.266989949058,0.266897554317,0.266805157122,0.266712757475,0.266620355376,0.266527950827,0.266435543828,0.266343134379,0.266250722483,0.266158308139,0.266065891349,0.265973472113,0.265881050432,0.265788626308,0.26569619974,0.26560377073,0.265511339279,0.265418905387,0.265326469056,0.265234030286,0.265141589077,0.265049145432,0.26495669935,0.264864250833,0.264771799882,0.264679346496,0.264586890678,0.264494432428,0.264401971746,0.264309508635,0.264217043093,0.264124575124,0.264032104726,0.263939631901,0.263847156651,0.263754678975,0.263662198875,0.263569716351,0.263477231404,0.263384744036,0.263292254247,0.263199762037,0.263107267409,0.263014770362,0.262922270897,0.262829769016,0.262737264719,0.262644758006,0.26255224888,0.26245973734,0.262367223388,0.262274707024,0.262182188249,0.262089667065,0.261997143471,0.261904617469,0.26181208906,0.261719558244,0.261627025023,0.261534489397,0.261441951366,0.261349410933,0.261256868097,0.26116432286,0.261071775223,0.260979225186,0.260886672749,0.260794117915,0.260701560684,0.260609001056,0.260516439033,0.260423874615,0.260331307804,0.2602387386,0.260146167003,0.260053593015,0.259961016637,0.25986843787,0.259775856714,0.25968327317,0.259590687239,0.259498098922,0.25940550822,0.259312915133,0.259220319663,0.25912772181,0.259035121575,0.258942518959,0.258849913963,0.258757306588,0.258664696834,0.258572084703,0.258479470195,0.258386853311,0.258294234052,0.258201612419,0.258108988413,0.258016362034,0.257923733283,0.257831102162,0.257738468671,0.257645832811,0.257553194582,0.257460553986,0.257367911024,0.257275265696,0.257182618003,0.257089967946,0.256997315526,0.256904660743,0.2568120036,0.256719344096,0.256626682232,0.256534018009,0.256441351428,0.25634868249,0.256256011196,0.256163337546,0.256070661542,0.255977983184,0.255885302473,0.25579261941,0.255699933995,0.255607246231,0.255514556117,0.255421863654,0.255329168844,0.255236471686,0.255143772183,0.255051070334,0.254958366141,0.254865659605,0.254772950725,0.254680239504,0.254587525942,0.25449481004,0.254402091799,0.254309371219,0.254216648301,0.254123923047,0.254031195457,0.253938465532,0.253845733273,0.253752998681,0.253660261756,0.2535675225,0.253474780913,0.253382036996,0.25328929075,0.253196542175,0.253103791274,0.253011038046,0.252918282492,0.252825524613,0.252732764411,0.252640001886,0.252547237038,0.252454469869,0.25236170038,0.25226892857,0.252176154442,0.252083377996,0.251990599233,0.251897818154,0.25180503476,0.25171224905,0.251619461028,0.251526670692,0.251433878044,0.251341083085,0.251248285816,0.251155486238,0.251062684351,0.250969880156,0.250877073654,0.250784264847,0.250691453734,0.250598640317,0.250505824596,0.250413006573,0.250320186248,0.250227363622,0.250134538696,0.250041711471,0.249948881948,0.249856050127,0.24976321601,0.249670379597,0.249577540889,0.249484699886,0.249391856591,0.249299011003,0.249206163124,0.249113312954,0.249020460494,0.248927605746,0.248834748709,0.248741889385,0.248649027775,0.248556163879,0.248463297698,0.248370429234,0.248277558487,0.248184685457,0.248091810146,0.247998932555,0.247906052685,0.247813170535,0.247720286108,0.247627399404,0.247534510423,0.247441619168,0.247348725638,0.247255829834,0.247162931758,0.247070031409,0.24697712879,0.246884223901,0.246791316742,0.246698407315,0.24660549562,0.246512581659,0.246419665431,0.246326746939,0.246233826182,0.246140903162,0.24604797788,0.245955050336,0.245862120531,0.245769188466,0.245676254142,0.245583317561,0.245490378721,0.245397437625,0.245304494274,0.245211548668,0.245118600807,0.245025650694,0.244932698329,0.244839743712,0.244746786844,0.244653827727,0.244560866362,0.244467902748,0.244374936887,0.24428196878,0.244188998427,0.24409602583,0.24400305099,0.243910073906,0.24381709458,0.243724113014,0.243631129207,0.243538143161,0.243445154876,0.243352164353,0.243259171594,0.243166176599,0.243073179368,0.242980179903,0.242887178205,0.242794174274,0.242701168112,0.242608159718,0.242515149095,0.242422136243,0.242329121162,0.242236103854,0.242143084319,0.242050062558,0.241957038573,0.241864012364,0.241770983931,0.241677953276,0.2415849204,0.241491885303,0.241398847986,0.241305808451,0.241212766697,0.241119722726,0.241026676539,0.240933628137,0.24084057752,0.240747524689,0.240654469645,0.240561412389,0.240468352922,0.240375291244,0.240282227358,0.240189161262,0.240096092959,0.240003022449,0.239909949733,0.239816874811,0.239723797685,0.239630718356,0.239537636824,0.239444553091,0.239351467156,0.239258379021,0.239165288687,0.239072196155,0.238979101425,0.238886004499,0.238792905377,0.23869980406,0.238606700549,0.238513594844,0.238420486948,0.238327376859,0.23823426458,0.238141150112,0.238048033454,0.237954914608,0.237861793575,0.237768670356,0.237675544951,0.237582417362,0.237489287588,0.237396155632,0.237303021494,0.237209885174,0.237116746674,0.237023605994,0.236930463136,0.2368373181,0.236744170887,0.236651021498,0.236557869934,0.236464716195,0.236371560283,0.236278402198,0.236185241941,0.236092079513,0.235998914916,0.235905748149,0.235812579213,0.23571940811,0.23562623484,0.235533059405,0.235439881805,0.23534670204,0.235253520112,0.235160336022,0.23506714977,0.234973961358,0.234880770785,0.234787578054,0.234694383165,0.234601186118,0.234507986915,0.234414785556,0.234321582043,0.234228376376,0.234135168556,0.234041958584,0.23394874646,0.233855532186,0.233762315763,0.233669097191,0.233575876471,0.233482653604,0.233389428591,0.233296201432,0.233202972129,0.233109740683,0.233016507094,0.232923271363,0.232830033492,0.23273679348,0.232643551328,0.232550307039,0.232457060612,0.232363812048,0.232270561348,0.232177308513,0.232084053545,0.231990796442,0.231897537208,0.231804275842,0.231711012345,0.231617746719,0.231524478963,0.231431209079,0.231337937069,0.231244662931,0.231151386668,0.231058108281,0.230964827769,0.230871545135,0.230778260378,0.230684973501,0.230591684502,0.230498393385,0.230405100148,0.230311804794,0.230218507323,0.230125207735,0.230031906033,0.229938602216,0.229845296285,0.229751988242,0.229658678087,0.229565365821,0.229472051444,0.229378734959,0.229285416365,0.229192095664,0.229098772856,0.229005447942,0.228912120923,0.2288187918,0.228725460574,0.228632127245,0.228538791815,0.228445454284,0.228352114653,0.228258772924,0.228165429096,0.228072083171,0.22797873515,0.227885385033,0.227792032821,0.227698678516,0.227605322117,0.227511963627,0.227418603045,0.227325240373,0.227231875611,0.227138508761,0.227045139823,0.226951768798,0.226858395687,0.226765020491,0.22667164321,0.226578263846,0.226484882399,0.22639149887,0.22629811326,0.226204725571,0.226111335802,0.226017943954,0.22592455003,0.225831154028,0.225737755951,0.225644355799,0.225550953572,0.225457549273,0.225364142901,0.225270734458,0.225177323944,0.22508391136,0.224990496707,0.224897079986,0.224803661198,0.224710240344,0.224616817424,0.22452339244,0.224429965392,0.22433653628,0.224243105107,0.224149671873,0.224056236578,0.223962799224,0.223869359811,0.223775918341,0.223682474813,0.22358902923,0.223495581591,0.223402131898,0.223308680152,0.223215226353,0.223121770502,0.2230283126,0.222934852648,0.222841390647,0.222747926598,0.222654460502,0.222560992358,0.222467522169,0.222374049935,0.222280575658,0.222187099337,0.222093620973,0.222000140568,0.221906658123,0.221813173638,0.221719687114,0.221626198552,0.221532707953,0.221439215318,0.221345720647,0.221252223942,0.221158725203,0.221065224431,0.220971721627,0.220878216792,0.220784709927,0.220691201032,0.220597690109,0.220504177158,0.22041066218,0.220317145177,0.220223626148,0.220130105095,0.220036582018,0.219943056919,0.219849529799,0.219756000657,0.219662469496,0.219568936315,0.219475401117,0.219381863901,0.219288324668,0.21919478342,0.219101240157,0.21900769488,0.21891414759,0.218820598288,0.218727046974,0.21863349365,0.218539938316,0.218446380974,0.218352821623,0.218259260266,0.218165696902,0.218072131533,0.21797856416,0.217884994783,0.217791423403,0.217697850021,0.217604274638,0.217510697256,0.217417117873,0.217323536493,0.217229953114,0.217136367739,0.217042780369,0.216949191003,0.216855599643,0.216762006289,0.216668410944,0.216574813606,0.216481214278,0.21638761296,0.216294009653,0.216200404358,0.216106797076,0.216013187808,0.215919576553,0.215825963314,0.215732348092,0.215638730886,0.215545111698,0.215451490529,0.21535786738,0.215264242251,0.215170615143,0.215076986058,0.214983354995,0.214889721957,0.214796086943,0.214702449955,0.214608810994,0.21451517006,0.214421527154,0.214327882277,0.21423423543,0.214140586614,0.214046935829,0.213953283078,0.213859628359,0.213765971675,0.213672313026,0.213578652412,0.213484989836,0.213391325297,0.213297658797,0.213203990337,0.213110319916,0.213016647537,0.2129229732,0.212829296905,0.212735618654,0.212641938448,0.212548256288,0.212454572173,0.212360886106,0.212267198087,0.212173508116,0.212079816196,0.211986122326,0.211892426507,0.211798728741,0.211705029028,0.211611327369,0.211517623765,0.211423918217,0.211330210725,0.211236501291,0.211142789916,0.211049076599,0.210955361343,0.210861644147,0.210767925013,0.210674203942,0.210580480935,0.210486755992,0.210393029114,0.210299300302,0.210205569557,0.21011183688,0.210018102272,0.209924365734,0.209830627265,0.209736886868,0.209643144543,0.209549400292,0.209455654114,0.20936190601,0.209268155983,0.209174404032,0.209080650158,0.208986894362,0.208893136645,0.208799377009,0.208705615453,0.208611851978,0.208518086586,0.208424319278,0.208330550053,0.208236778914,0.208143005861,0.208049230894,0.207955454015,0.207861675225,0.207767894524,0.207674111913,0.207580327394,0.207486540966,0.207392752631,0.20729896239,0.207205170243,0.207111376192,0.207017580237,0.20692378238,0.20682998262,0.206736180959,0.206642377398,0.206548571937,0.206454764578,0.206360955321,0.206267144167,0.206173331118,0.206079516173,0.205985699334,0.205891880602,0.205798059977,0.20570423746,0.205610413053,0.205516586756,0.20542275857,0.205328928495,0.205235096533,0.205141262685,0.205047426951,0.204953589332,0.20485974983,0.204765908444,0.204672065176,0.204578220027,0.204484372998,0.204390524089,0.204296673301,0.204202820635,0.204108966093,0.204015109674,0.20392125138,0.203827391212,0.20373352917,0.203639665255,0.203545799469,0.203451931811,0.203358062284,0.203264190887,0.203170317622,0.203076442489,0.20298256549,0.202888686625,0.202794805895,0.202700923302,0.202607038844,0.202513152525,0.202419264344,0.202325374303,0.202231482401,0.202137588641,0.202043693023,0.201949795548,0.201855896217,0.20176199503,0.201668091988,0.201574187093,0.201480280345,0.201386371745,0.201292461294,0.201198548993,0.201104634842,0.201010718843,0.200916800996,0.200822881302,0.200728959763,0.200635036378,0.20054111115,0.200447184078,0.200353255163,0.200259324407,0.20016539181,0.200071457373,0.199977521097,0.199883582983,0.199789643032,0.199695701244,0.199601757621,0.199507812163,0.199413864871,0.199319915747,0.19922596479,0.199132012002,0.199038057383,0.198944100935,0.198850142659,0.198756182554,0.198662220623,0.198568256866,0.198474291283,0.198380323876,0.198286354646,0.198192383593,0.198098410718,0.198004436022,0.197910459507,0.197816481172,0.197722501019,0.197628519048,0.197534535261,0.197440549659,0.197346562241,0.197252573009,0.197158581965,0.197064589108,0.19697059444,0.196876597961,0.196782599672,0.196688599575,0.19659459767,0.196500593958,0.19640658844,0.196312581116,0.196218571988,0.196124561056,0.196030548321,0.195936533785,0.195842517448,0.19574849931,0.195654479373,0.195560457638,0.195466434105,0.195372408776,0.195278381651,0.19518435273,0.195090322016,0.194996289509,0.194902255209,0.194808219117,0.194714181235,0.194620141563,0.194526100103,0.194432056854,0.194338011818,0.194243964996,0.194149916388,0.194055865996,0.19396181382,0.193867759861,0.19377370412,0.193679646598,0.193585587296,0.193491526214,0.193397463354,0.193303398716,0.193209332302,0.193115264111,0.193021194145,0.192927122405,0.192833048892,0.192738973607,0.192644896549,0.192550817721,0.192456737123,0.192362654756,0.192268570621,0.192174484719,0.19208039705,0.191986307615,0.191892216416,0.191798123453,0.191704028728,0.19160993224,0.19151583399,0.191421733981,0.191327632212,0.191233528684,0.191139423398,0.191045316356,0.190951207557,0.190857097004,0.190762984696,0.190668870634,0.19057475482,0.190480637254,0.190386517938,0.190292396871,0.190198274056,0.190104149492,0.19001002318,0.189915895122,0.189821765319,0.18972763377,0.189633500478,0.189539365443,0.189445228665,0.189351090146,0.189256949887,0.189162807888,0.18906866415,0.188974518674,0.188880371462,0.188786222513,0.188692071829,0.18859791941,0.188503765258,0.188409609373,0.188315451757,0.188221292409,0.188127131332,0.188032968525,0.18793880399,0.187844637727,0.187750469738,0.187656300023,0.187562128583,0.187467955419,0.187373780531,0.187279603922,0.187185425591,0.18709124554,0.186997063768,0.186902880278,0.18680869507,0.186714508145,0.186620319504,0.186526129147,0.186431937076,0.186337743291,0.186243547794,0.186149350584,0.186055151663,0.185960951033,0.185866748693,0.185772544644,0.185678338888,0.185584131425,0.185489922257,0.185395711383,0.185301498805,0.185207284524,0.185113068541,0.185018850856,0.18492463147,0.184830410385,0.1847361876,0.184641963118,0.184547736939,0.184453509063,0.184359279491,0.184265048226,0.184170815266,0.184076580613,0.183982344269,0.183888106233,0.183793866507,0.183699625092,0.183605381988,0.183511137197,0.183416890719,0.183322642555,0.183228392705,0.183134141172,0.183039887955,0.182945633056,0.182851376475,0.182757118214,0.182662858272,0.182568596652,0.182474333353,0.182380068377,0.182285801725,0.182191533397,0.182097263395,0.182002991719,0.18190871837,0.181814443348,0.181720166656,0.181625888293,0.181531608261,0.18143732656,0.181343043192,0.181248758156,0.181154471455,0.181060183088,0.180965893058,0.180871601363,0.180777308007,0.180683012988,0.180588716309,0.18049441797,0.180400117972,0.180305816315,0.180211513002,0.180117208031,0.180022901406,0.179928593125,0.179834283191,0.179739971603,0.179645658364,0.179551343473,0.179457026932,0.179362708741,0.179268388902,0.179174067415,0.179079744281,0.1789854195,0.178891093075,0.178796765005,0.178702435292,0.178608103936,0.178513770939,0.178419436301,0.178325100022,0.178230762105,0.178136422549,0.178042081356,0.177947738526,0.177853394061,0.177759047961,0.177664700227,0.17757035086,0.177475999861,0.17738164723,0.177287292969,0.177192937079,0.177098579559,0.177004220412,0.176909859638,0.176815497238,0.176721133212,0.176626767562,0.176532400289,0.176438031393,0.176343660875,0.176249288736,0.176154914977,0.176060539599,0.175966162603,0.175871783989,0.175777403759,0.175683021913,0.175588638452,0.175494253377,0.175399866689,0.175305478389,0.175211088478,0.175116696956,0.175022303824,0.174927909083,0.174833512735,0.17473911478,0.174644715218,0.174550314051,0.17445591128,0.174361506905,0.174267100928,0.174172693348,0.174078284168,0.173983873387,0.173889461008,0.17379504703,0.173700631454,0.173606214282,0.173511795514,0.173417375152,0.173322953195,0.173228529645,0.173134104503,0.173039677769,0.172945249445,0.172850819531,0.172756388029,0.172661954938,0.172567520261,0.172473083997,0.172378646148,0.172284206714,0.172189765697,0.172095323097,0.172000878915,0.171906433152,0.171811985809,0.171717536887,0.171623086386,0.171528634308,0.171434180654,0.171339725423,0.171245268618,0.171150810238,0.171056350285,0.17096188876,0.170867425664,0.170772960997,0.17067849476,0.170584026954,0.170489557581,0.17039508664,0.170300614133,0.170206140061,0.170111664424,0.170017187224,0.169922708461,0.169828228136,0.16973374625,0.169639262803,0.169544777798,0.169450291234,0.169355803112,0.169261313434,0.1691668222,0.169072329411,0.168977835068,0.168883339172,0.168788841724,0.168694342724,0.168599842173,0.168505340073,0.168410836423,0.168316331226,0.168221824482,0.168127316191,0.168032806355,0.167938294975,0.167843782051,0.167749267584,0.167654751575,0.167560234025,0.167465714935,0.167371194305,0.167276672137,0.167182148432,0.16708762319,0.166993096412,0.166898568099,0.166804038252,0.166709506872,0.166614973959,0.166520439515,0.16642590354,0.166331366036,0.166236827003,0.166142286441,0.166047744353,0.165953200738,0.165858655598,0.165764108933,0.165669560745,0.165575011034,0.1654804598,0.165385907046,0.165291352772,0.165196796978,0.165102239666,0.165007680836,0.16491312049,0.164818558628,0.16472399525,0.164629430359,0.164534863954,0.164440296037,0.164345726609,0.16425115567,0.164156583221,0.164062009263,0.163967433797,0.163872856825,0.163778278345,0.163683698361,0.163589116871,0.163494533879,0.163399949383,0.163305363385,0.163210775887,0.163116186888,0.16302159639,0.162927004393,0.162832410899,0.162737815908,0.162643219421,0.162548621439,0.162454021963,0.162359420994,0.162264818533,0.16217021458,0.162075609136,0.161981002202,0.16188639378,0.16179178387,0.161697172472,0.161602559588,0.161507945219,0.161413329366,0.161318712028,0.161224093208,0.161129472906,0.161034851122,0.160940227859,0.160845603116,0.160750976895,0.160656349196,0.160561720021,0.160467089369,0.160372457243,0.160277823642,0.160183188569,0.160088552023,0.159993914005,0.159899274517,0.159804633559,0.159709991132,0.159615347237,0.159520701875,0.159426055047,0.159331406753,0.159236756995,0.159142105773,0.159047453088,0.158952798942,0.158858143334,0.158763486266,0.158668827739,0.158574167753,0.15847950631,0.15838484341,0.158290179054,0.158195513243,0.158100845978,0.15800617726,0.15791150709,0.157816835468,0.157722162395,0.157627487873,0.157532811902,0.157438134483,0.157343455616,0.157248775304,0.157154093546,0.157059410343,0.156964725697,0.156870039608,0.156775352077,0.156680663105,0.156585972693,0.156491280842,0.156396587552,0.156301892824,0.15620719666,0.15611249906,0.156017800025,0.155923099556,0.155828397654,0.15573369432,0.155638989554,0.155544283357,0.155449575731,0.155354866676,0.155260156193,0.155165444282,0.155070730946,0.154976016184,0.154881299997,0.154786582387,0.154691863355,0.1545971429,0.154502421024,0.154407697728,0.154312973013,0.154218246879,0.154123519328,0.154028790361,0.153934059977,0.153839328178,0.153744594966,0.15364986034,0.153555124302,0.153460386852,0.153365647992,0.153270907723,0.153176166044,0.153081422957,0.152986678464,0.152891932564,0.152797185258,0.152702436549,0.152607686435,0.152512934919,0.152418182001,0.152323427682,0.152228671963,0.152133914845,0.152039156328,0.151944396414,0.151849635103,0.151754872397,0.151660108295,0.151565342799,0.151470575911,0.15137580763,0.151281037957,0.151186266894,0.151091494442,0.1509967206,0.150901945371,0.150807168755,0.150712390752,0.150617611364,0.150522830592,0.150428048436,0.150333264897,0.150238479977,0.150143693675,0.150048905994,0.149954116933,0.149859326494,0.149764534677,0.149669741484,0.149574946915,0.149480150972,0.149385353654,0.149290554963,0.1491957549,0.149100953465,0.14900615066,0.148911346486,0.148816540942,0.148721734031,0.148626925753,0.148532116108,0.148437305099,0.148342492725,0.148247678987,0.148152863887,0.148058047424,0.147963229601,0.147868410418,0.147773589876,0.147678767976,0.147583944718,0.147489120103,0.147394294133,0.147299466808,0.147204638129,0.147109808097,0.147014976713,0.146920143977,0.146825309891,0.146730474455,0.146635637671,0.146540799539,0.14644596006,0.146351119234,0.146256277064,0.146161433549,0.146066588691,0.14597174249,0.145876894947,0.145782046064,0.14568719584,0.145592344277,0.145497491376,0.145402637138,0.145307781563,0.145212924653,0.145118066408,0.145023206829,0.144928345916,0.144833483672,0.144738620097,0.144643755191,0.144548888955,0.144454021391,0.144359152499,0.14426428228,0.144169410735,0.144074537865,0.143979663671,0.143884788153,0.143789911312,0.14369503315,0.143600153667,0.143505272865,0.143410390743,0.143315507303,0.143220622545,0.143125736471,0.143030849082,0.142935960378,0.14284107036,0.142746179029,0.142651286386,0.142556392431,0.142461497167,0.142366600593,0.14227170271,0.142176803519,0.142081903022,0.141987001219,0.14189209811,0.141797193698,0.141702287982,0.141607380963,0.141512472643,0.141417563022,0.141322652102,0.141227739882,0.141132826364,0.141037911549,0.140942995437,0.14084807803,0.140753159328,0.140658239333,0.140563318044,0.140468395464,0.140373471592,0.140278546431,0.140183619979,0.14008869224,0.139993763212,0.139898832898,0.139803901298,0.139708968412,0.139614034243,0.13951909879,0.139424162055,0.139329224038,0.139234284741,0.139139344164,0.139044402308,0.138949459173,0.138854514762,0.138759569074,0.138664622111,0.138569673873,0.138474724362,0.138379773578,0.138284821522,0.138189868194,0.138094913597,0.13799995773,0.137905000595,0.137810042192,0.137715082522,0.137620121586,0.137525159386,0.137430195921,0.137335231194,0.137240265204,0.137145297952,0.13705032944,0.136955359668,0.136860388637,0.136765416348,0.136670442802,0.136575468,0.136480491942,0.13638551463,0.136290536064,0.136195556246,0.136100575176,0.136005592854,0.135910609283,0.135815624462,0.135720638393,0.135625651076,0.135530662513,0.135435672704,0.13534068165,0.135245689352,0.135150695811,0.135055701028,0.134960705003,0.134865707738,0.134770709233,0.134675709489,0.134580708507,0.134485706288,0.134390702834,0.134295698143,0.134200692219,0.134105685061,0.13401067667,0.133915667047,0.133820656194,0.13372564411,0.133630630797,0.133535616256,0.133440600488,0.133345583493,0.133250565272,0.133155545827,0.133060525157,0.132965503265,0.13287048015,0.132775455814,0.132680430257,0.132585403481,0.132490375487,0.132395346274,0.132300315844,0.132205284199,0.132110251338,0.132015217263,0.131920181974,0.131825145473,0.13173010776,0.131635068837,0.131540028703,0.13144498736,0.131349944809,0.131254901051,0.131159856086,0.131064809916,0.130969762541,0.130874713962,0.13077966418,0.130684613196,0.13058956101,0.130494507625,0.13039945304,0.130304397256,0.130209340275,0.130114282096,0.130019222722,0.129924162153,0.129829100389,0.129734037432,0.129638973283,0.129543907942,0.12944884141,0.129353773688,0.129258704778,0.129163634679,0.129068563393,0.128973490921,0.128878417263,0.12878334242,0.128688266394,0.128593189185,0.128498110794,0.128403031222,0.128307950469,0.128212868537,0.128117785427,0.128022701139,0.127927615674,0.127832529033,0.127737441218,0.127642352228,0.127547262065,0.127452170729,0.127357078222,0.127261984545,0.127166889697,0.127071793681,0.126976696497,0.126881598145,0.126786498628,0.126691397945,0.126596296097,0.126501193086,0.126406088912,0.126310983576,0.126215877079,0.126120769422,0.126025660606,0.125930550631,0.125835439498,0.12574032721,0.125645213765,0.125550099165,0.125454983412,0.125359866505,0.125264748446,0.125169629235,0.125074508874,0.124979387363,0.124884264704,0.124789140897,0.124694015942,0.124598889842,0.124503762596,0.124408634205,0.124313504672,0.124218373995,0.124123242177,0.124028109218,0.123932975119,0.12383783988,0.123742703503,0.123647565989,0.123552427339,0.123457287552,0.123362146631,0.123267004576,0.123171861388,0.123076717068,0.122981571617,0.122886425035,0.122791277323,0.122696128483,0.122600978515,0.12250582742,0.122410675199,0.122315521853,0.122220367383,0.122125211789,0.122030055073,0.121934897235,0.121839738276,0.121744578197,0.121649416999,0.121554254683,0.12145909125,0.1213639267,0.121268761035,0.121173594255,0.121078426361,0.120983257354,0.120888087236,0.120792916006,0.120697743666,0.120602570216,0.120507395658,0.120412219992,0.120317043219,0.120221865341,0.120126686357,0.120031506269,0.119936325078,0.119841142785,0.119745959389,0.119650774894,0.119555589298,0.119460402604,0.119365214811,0.119270025921,0.119174835935,0.119079644854,0.118984452678,0.118889259408,0.118794065045,0.118698869591,0.118603673045,0.11850847541,0.118413276685,0.118318076871,0.11822287597,0.118127673983,0.118032470909,0.117937266751,0.117842061508,0.117746855183,0.117651647775,0.117556439285,0.117461229715,0.117366019066,0.117270807338,0.117175594531,0.117080380648,0.116985165688,0.116889949653,0.116794732544,0.116699514361,0.116604295106,0.116509074778,0.11641385338,0.116318630912,0.116223407374,0.116128182769,0.116032957095,0.115937730356,0.11584250255,0.11574727368,0.115652043746,0.115556812749,0.115461580689,0.115366347569,0.115271113388,0.115175878147,0.115080641848,0.114985404491,0.114890166077,0.114794926607,0.114699686081,0.114604444502,0.114509201869,0.114413958183,0.114318713446,0.114223467658,0.11412822082,0.114032972933,0.113937723998,0.113842474016,0.113747222987,0.113651970913,0.113556717794,0.113461463631,0.113366208425,0.113270952178,0.113175694889,0.113080436559,0.112985177191,0.112889916784,0.112794655339,0.112699392857,0.11260412934,0.112508864787,0.112413599201,0.112318332581,0.112223064928,0.112127796244,0.11203252653,0.111937255786,0.111841984012,0.111746711211,0.111651437383,0.111556162528,0.111460886648,0.111365609743,0.111270331815,0.111175052864,0.111079772891,0.110984491897,0.110889209883,0.11079392685,0.110698642798,0.110603357729,0.110508071643,0.110412784541,0.110317496424,0.110222207294,0.11012691715,0.110031625994,0.109936333827,0.109841040649,0.109745746461,0.109650451265,0.109555155061,0.10945985785,0.109364559632,0.10926926041,0.109173960183,0.109078658952,0.108983356719,0.108888053485,0.108792749249,0.108697444013,0.108602137778,0.108506830545,0.108411522315,0.108316213088,0.108220902865,0.108125591648,0.108030279437,0.107934966233,0.107839652036,0.107744336849,0.107649020671,0.107553703504,0.107458385348,0.107363066204,0.107267746073,0.107172424957,0.107077102855,0.106981779769,0.1068864557,0.106791130648,0.106695804615,0.106600477601,0.106505149607,0.106409820634,0.106314490683,0.106219159755,0.106123827851,0.106028494971,0.105933161116,0.105837826288,0.105742490487,0.105647153713,0.105551815969,0.105456477255,0.105361137571,0.105265796919,0.105170455299,0.105075112713,0.10497976916,0.104884424643,0.104789079162,0.104693732717,0.10459838531,0.104503036942,0.104407687613,0.104312337325,0.104216986077,0.104121633872,0.10402628071,0.103930926591,0.103835571517,0.103740215489,0.103644858507,0.103549500573,0.103454141686,0.103358781849,0.103263421062,0.103168059325,0.10307269664,0.102977333008,0.102881968429,0.102786602905,0.102691236436,0.102595869022,0.102500500666,0.102405131368,0.102309761128,0.102214389948,0.102119017829,0.10202364477,0.101928270774,0.101832895841,0.101737519973,0.101642143168,0.10154676543,0.101451386758,0.101356007154,0.101260626618,0.101165245151,0.101069862755,0.100974479429,0.100879095176,0.100783709995,0.100688323887,0.100592936854,0.100497548897,0.100402160016,0.100306770211,0.100211379485,0.100115987838,0.100020595271,0.0999252017837,0.0998298073783,0.0997344120553,0.0996390158156,0.0995436186601,0.0994482205895,0.0993528216049,0.099257421707,0.0991620208967,0.099066619175,0.0989712165427,0.0988758130007,0.0987804085498,0.098685003191,0.098589596925,0.0984941897529,0.0983987816754,0.0983033726934,0.0982079628079,0.0981125520196,0.0980171403296,0.0979217277385,0.0978263142474,0.0977308998571,0.0976354845685,0.0975400683825,0.0974446512998,0.0973492333215,0.0972538144484,0.0971583946813,0.0970629740212,0.0969675524688,0.0968721300252,0.0967767066912,0.0966812824676,0.0965858573553,0.0964904313553,0.0963950044683,0.0962995766952,0.096204148037,0.0961087184946,0.0960132880687,0.0959178567602,0.0958224245702,0.0957269914993,0.0956315575485,0.0955361227188,0.0954406870108,0.0953452504256,0.095249812964,0.0951543746269,0.0950589354152,0.0949634953296,0.0948680543712,0.0947726125408,0.0946771698393,0.0945817262675,0.0944862818264,0.0943908365167,0.0942953903394,0.0941999432954,0.0941044953855,0.0940090466106,0.0939135969716,0.0938181464694,0.0937226951048,0.0936272428788,0.0935317897921,0.0934363358457,0.0933408810405,0.0932454253773,0.093149968857,0.0930545114805,0.0929590532487,0.0928635941624,0.0927681342225,0.0926726734299,0.0925772117855,0.0924817492901,0.0923862859447,0.0922908217501,0.0921953567071,0.0920998908167,0.0920044240798,0.0919089564971,0.0918134880697,0.0917180187983,0.0916225486839,0.0915270777273,0.0914316059294,0.0913361332911,0.0912406598132,0.0911451854967,0.0910497103424,0.0909542343511,0.0908587575239,0.0907632798615,0.0906678013648,0.0905723220347,0.0904768418721,0.0903813608779,0.0902858790529,0.0901903963979,0.090094912914,0.089999428602,0.0899039434627,0.089808457497,0.0897129707058,0.08961748309,0.0895219946505,0.0894265053881,0.0893310153037,0.0892355243981,0.0891400326724,0.0890445401273,0.0889490467637,0.0888535525825,0.0887580575846,0.0886625617709,0.0885670651421,0.0884715676993,0.0883760694433,0.088280570375,0.0881850704952,0.0880895698048,0.0879940683047,0.0878985659958,0.0878030628789,0.087707558955,0.0876120542249,0.0875165486895,0.0874210423496,0.0873255352062,0.0872300272601,0.0871345185122,0.0870390089634,0.0869434986145,0.0868479874665,0.0867524755202,0.0866569627765,0.0865614492363,0.0864659349003,0.0863704197697,0.0862749038451,0.0861793871275,0.0860838696177,0.0859883513167,0.0858928322253,0.0857973123444,0.0857017916749,0.0856062702176,0.0855107479735,0.0854152249433,0.085319701128,0.0852241765285,0.0851286511456,0.0850331249803,0.0849375980333,0.0848420703056,0.0847465417981,0.0846510125116,0.0845554824469,0.0844599516051,0.0843644199869,0.0842688875933,0.0841733544251,0.0840778204832,0.0839822857685,0.0838867502818,0.083791214024,0.0836956769961,0.0836001391988,0.0835046006332,0.0834090612999,0.0833135212,0.0832179803343,0.0831224387036,0.0830268963089,0.0829313531511,0.0828358092309,0.0827402645494,0.0826447191073,0.0825491729056,0.0824536259451,0.0823580782266,0.0822625297512,0.0821669805197,0.0820714305328,0.0819758797916,0.0818803282969,0.0817847760496,0.0816892230505,0.0815936693005,0.0814981148006,0.0814025595515,0.0813070035542,0.0812114468096,0.0811158893185,0.0810203310817,0.0809247721003,0.080829212375,0.0807336519067,0.0806380906964,0.0805425287448,0.080446966053,0.0803514026216,0.0802558384517,0.0801602735441,0.0800647078997,0.0799691415193,0.0798735744039,0.0797780065543,0.0796824379714,0.0795868686561,0.0794912986092,0.0793957278317,0.0793001563244,0.0792045840882,0.0791090111239,0.0790134374325,0.0789178630148,0.0788222878717,0.0787267120041,0.0786311354128,0.0785355580988,0.078439980063,0.0783444013061,0.0782488218291,0.0781532416328,0.0780576607182,0.077962079086,0.0778664967373,0.0777709136729,0.0776753298935,0.0775797454003,0.0774841601939,0.0773885742753,0.0772929876453,0.0771974003049,0.0771018122549,0.0770062234962,0.0769106340297,0.0768150438563,0.0767194529767,0.076623861392,0.076528269103,0.0764326761105,0.0763370824155,0.0762414880189,0.0761458929214,0.076050297124,0.0759547006275,0.075859103433,0.0757635055411,0.0756679069528,0.075572307669,0.0754767076906,0.0753811070184,0.0752855056533,0.0751899035962,0.0750943008479,0.0749986974094,0.0749030932816,0.0748074884652,0.0747118829613,0.0746162767706,0.074520669894,0.0744250623325,0.0743294540868,0.074233845158,0.0741382355468,0.0740426252541,0.0739470142809,0.073851402628,0.0737557902962,0.0736601772865,0.0735645635997,0.0734689492367,0.0733733341984,0.0732777184857,0.0731821020994,0.0730864850405,0.0729908673097,0.072895248908,0.0727996298364,0.0727040100955,0.0726083896864,0.0725127686098,0.0724171468668,0.0723215244581,0.0722259013846,0.0721302776472,0.0720346532469,0.0719390281844,0.0718434024607,0.0717477760766,0.071652149033,0.0715565213308,0.0714608929708,0.0713652639541,0.0712696342813,0.0711740039534,0.0710783729714,0.070982741336,0.0708871090481,0.0707914761086,0.0706958425185,0.0706002082785,0.0705045733896,0.0704089378526,0.0703133016685,0.070217664838,0.0701220273621,0.0700263892417,0.0699307504776,0.0698351110707,0.0697394710219,0.0696438303321,0.0695481890021,0.0694525470328,0.0693569044252,0.06926126118,0.0691656172982,0.0690699727807,0.0689743276283,0.0688786818418,0.0687830354223,0.0686873883705,0.0685917406874,0.0684960923738,0.0684004434305,0.0683047938586,0.0682091436588,0.0681134928321,0.0680178413792,0.0679221893012,0.0678265365988,0.067730883273,0.0676352293246,0.0675395747545,0.0674439195637,0.0673482637529,0.067252607323,0.067156950275,0.0670612926096,0.0669656343279,0.0668699754306,0.0667743159187,0.066678655793,0.0665829950544,0.0664873337038,0.066391671742,0.06629600917,0.0662003459886,0.0661046821988,0.0660090178013,0.065913352797,0.0658176871869,0.0657220209718,0.0656263541526,0.0655306867302,0.0654350187054,0.0653393500792,0.0652436808524,0.0651480110259,0.0650523406005,0.0649566695772,0.0648609979569,0.0647653257403,0.0646696529285,0.0645739795222,0.0644783055224,0.0643826309299,0.0642869557456,0.0641912799704,0.0640956036051,0.0639999266507,0.063904249108,0.063808570978,0.0637128922614,0.0636172129592,0.0635215330722,0.0634258526014,0.0633301715475,0.0632344899116,0.0631388076944,0.0630431248968,0.0629474415198,0.0628517575642,0.0627560730308,0.0626603879206,0.0625647022345,0.0624690159732,0.0623733291378,0.062277641729,0.0621819537478,0.0620862651951,0.0619905760716,0.0618948863784,0.0617991961162,0.061703505286,0.0616078138886,0.0615121219249,0.0614164293958,0.0613207363022,0.061225042645,0.0611293484249,0.061033653643,0.0609379583001,0.0608422623971,0.0607465659348,0.0606508689141,0.0605551713359,0.0604594732012,0.0603637745107,0.0602680752653,0.060172375466,0.0600766751136,0.059980974209,0.059885272753,0.0597895707466,0.0596938681907,0.059598165086,0.0595024614335,0.0594067572341,0.0593110524886,0.059215347198,0.059119641363,0.0590239349847,0.0589282280638,0.0588325206012,0.0587368125979,0.0586411040547,0.0585453949724,0.0584496853521,0.0583539751944,0.0582582645004,0.0581625532709,0.0580668415068,0.0579711292089,0.0578754163782,0.0577797030155,0.0576839891217,0.0575882746977,0.0574925597444,0.0573968442626,0.0573011282532,0.0572054117171,0.0571096946552,0.0570139770683,0.0569182589574,0.0568225403233,0.0567268211669,0.0566311014891,0.0565353812907,0.0564396605727,0.0563439393359,0.0562482175812,0.0561524953095,0.0560567725216,0.0559610492185,0.055865325401,0.05576960107,0.0556738762264,0.055578150871,0.0554824250048,0.0553866986286,0.0552909717432,0.0551952443497,0.0550995164488,0.0550037880415,0.0549080591285,0.0548123297109,0.0547165997894,0.054620869365,0.0545251384386,0.0544294070109,0.054333675083,0.0542379426556,0.0541422097297,0.0540464763061,0.0539507423857,0.0538550079695,0.0537592730582,0.0536635376527,0.053567801754,0.0534720653629,0.0533763284804,0.0532805911071,0.0531848532442,0.0530891148924,0.0529933760526,0.0528976367257,0.0528018969125,0.0527061566141,0.0526104158311,0.0525146745646,0.0524189328154,0.0523231905843,0.0522274478723,0.0521317046803,0.052035961009,0.0519402168595,0.0518444722325,0.051748727129,0.0516529815499,0.0515572354959,0.051461488968,0.0513657419672,0.0512699944941,0.0511742465499,0.0510784981352,0.050982749251,0.0508869998982,0.0507912500777,0.0506954997903,0.0505997490369,0.0505039978184,0.0504082461357,0.0503124939897,0.0502167413812,0.0501209883111,0.0500252347803,0.0499294807897,0.0498337263401,0.0497379714325,0.0496422160677,0.0495464602466,0.0494507039701,0.049354947239,0.0492591900543,0.0491634324168,0.0490676743274,0.048971915787,0.0488761567964,0.0487803973566,0.0486846374684,0.0485888771327,0.0484931163504,0.0483973551224,0.0483015934495,0.0482058313326,0.0481100687726,0.0480143057704,0.0479185423269,0.0478227784429,0.0477270141193,0.047631249357,0.047535484157,0.0474397185199,0.0473439524469,0.0472481859386,0.0471524189961,0.0470566516201,0.0469608838116,0.0468651155715,0.0467693469005,0.0466735777997,0.0465778082699,0.0464820383119,0.0463862679267,0.0462904971151,0.046194725878,0.0460989542163,0.0460031821309,0.0459074096226,0.0458116366924,0.045715863341,0.0456200895695,0.0455243153786,0.0454285407693,0.0453327657424,0.0452369902988,0.0451412144394,0.0450454381651,0.0449496614767,0.0448538843752,0.0447581068613,0.0446623289361,0.0445665506003,0.0444707718549,0.0443749927008,0.0442792131387,0.0441834331696,0.0440876527945,0.043991872014,0.0438960908292,0.0438003092409,0.0437045272501,0.0436087448575,0.043512962064,0.0434171788706,0.0433213952781,0.0432256112874,0.0431298268994,0.043034042115,0.0429382569349,0.0428424713602,0.0427466853918,0.0426508990304,0.0425551122769,0.0424593251323,0.0423635375974,0.0422677496731,0.0421719613603,0.0420761726599,0.0419803835727,0.0418845940997,0.0417888042416,0.0416930139995,0.0415972233741,0.0415014323663,0.0414056409771,0.0413098492073,0.0412140570577,0.0411182645294,0.0410224716231,0.0409266783397,0.0408308846801,0.0407350906452,0.0406392962359,0.0405435014531,0.0404477062976,0.0403519107703,0.040256114872,0.0401603186038,0.0400645219664,0.0399687249608,0.0398729275877,0.0397771298482,0.039681331743,0.0395855332731,0.0394897344394,0.0393939352426,0.0392981356838,0.0392023357637,0.0391065354833,0.0390107348435,0.038914933845,0.0388191324889,0.0387233307759,0.038627528707,0.0385317262831,0.038435923505,0.0383401203736,0.0382443168897,0.0381485130544,0.0380527088683,0.0379569043325,0.0378610994479,0.0377652942152,0.0376694886353,0.0375736827093,0.0374778764378,0.0373820698219,0.0372862628624,0.0371904555601,0.037094647916,0.0369988399309,0.0369030316057,0.0368072229414,0.0367114139387,0.0366156045985,0.0365197949218,0.0364239849094,0.0363281745623,0.0362323638812,0.036136552867,0.0360407415207,0.0359449298431,0.0358491178351,0.0357533054976,0.0356574928315,0.0355616798376,0.0354658665169,0.0353700528701,0.0352742388982,0.0351784246021,0.0350826099826,0.0349867950407,0.0348909797772,0.034795164193,0.0346993482889,0.0346035320659,0.0345077155248,0.0344118986665,0.034316081492,0.034220264002,0.0341244461974,0.0340286280792,0.0339328096482,0.0338369909053,0.0337411718514,0.0336453524873,0.033549532814,0.0334537128323,0.0333578925431,0.0332620719473,0.0331662510457,0.0330704298393,0.0329746083289,0.0328787865154,0.0327829643997,0.0326871419827,0.0325913192652,0.0324954962481,0.0323996729324,0.0323038493188,0.0322080254083,0.0321122012018,0.0320163767,0.031920551904,0.0318247268146,0.0317289014327,0.0316330757591,0.0315372497948,0.0314414235406,0.0313455969973,0.031249770166,0.0311539430474,0.0310581156424,0.030962287952,0.030866459977,0.0307706317182,0.0306748031766,0.0305789743531,0.0304831452485,0.0303873158637,0.0302914861995,0.030195656257,0.0300998260369,0.0300039955401,0.0299081647675,0.02981233372,0.0297165023985,0.0296206708039,0.0295248389369,0.0294290067986,0.0293331743898,0.0292373417114,0.0291415087642,0.0290456755491,0.0289498420671,0.028854008319,0.0287581743056,0.028662340028,0.0285665054868,0.0284706706831,0.0283748356177,0.0282790002914,0.0281831647053,0.02808732886,0.0279914927567,0.027895656396,0.0277998197789,0.0277039829062,0.027608145779,0.0275123083979,0.027416470764,0.0273206328781,0.027224794741,0.0271289563537,0.027033117717,0.0269372788319,0.0268414396991,0.0267456003196,0.0266497606943,0.026553920824,0.0264580807097,0.0263622403521,0.0262663997523,0.026170558911,0.0260747178291,0.0259788765076,0.0258830349473,0.025787193149,0.0256913511138,0.0255955088423,0.0254996663357,0.0254038235946,0.02530798062,0.0252121374128,0.0251162939739,0.0250204503041,0.0249246064043,0.0248287622754,0.0247329179183,0.0246370733338,0.0245412285229,0.0244453834864,0.0243495382252,0.0242536927402,0.0241578470323,0.0240620011023,0.0239661549511,0.0238703085797,0.0237744619888,0.0236786151794,0.0235827681524,0.0234869209086,0.0233910734489,0.0232952257742,0.0231993778853,0.0231035297833,0.0230076814688,0.0229118329429,0.0228159842064,0.0227201352602,0.0226242861051,0.0225284367421,0.0224325871719,0.0223367373956,0.022240887414,0.022145037228,0.0220491868384,0.0219533362461,0.021857485452,0.021761634457,0.021665783262,0.0215699318679,0.0214740802755,0.0213782284857,0.0212823764994,0.0211865243174,0.0210906719408,0.0209948193702,0.0208989666067,0.0208031136511,0.0207072605043,0.0206114071671,0.0205155536405,0.0204196999253,0.0203238460224,0.0202279919327,0.0201321376571,0.0200362831964,0.0199404285515,0.0198445737234,0.0197487187128,0.0196528635207,0.019557008148,0.0194611525955,0.0193652968642,0.0192694409548,0.0191735848683,0.0190777286056,0.0189818721675,0.0188860155549,0.0187901587688,0.0186943018099,0.0185984446792,0.0185025873775,0.0184067299058,0.0183108722649,0.0182150144556,0.018119156479,0.0180232983358,0.0179274400269,0.0178315815532,0.0177357229157,0.0176398641151,0.0175440051524,0.0174481460284,0.017352286744,0.0172564273001,0.0171605676976,0.0170647079374,0.0169688480203,0.0168729879473,0.0167771277191,0.0166812673368,0.0165854068011,0.016489546113,0.0163936852733,0.0162978242829,0.0162019631427,0.0161061018535,0.0160102404164,0.015914378832,0.0158185171014,0.0157226552254,0.0156267932049,0.0155309310407,0.0154350687338,0.015339206285,0.0152433436952,0.0151474809653,0.0150516180961,0.0149557550886,0.0148598919437,0.0147640286621,0.0146681652449,0.0145723016928,0.0144764380067,0.0143805741876,0.0142847102364,0.0141888461538,0.0140929819408,0.0139971175982,0.013901253127,0.0138053885281,0.0137095238022,0.0136136589503,0.0135177939733,0.013421928872,0.0133260636473,0.0132301983002,0.0131343328315,0.013038467242,0.0129426015327,0.0128467357044,0.012750869758,0.0126550036944,0.0125591375145,0.0124632712192,0.0123674048093,0.0122715382857,0.0121756716493,0.0120798049011,0.0119839380417,0.0118880710723,0.0117922039935,0.0116963368064,0.0116004695117,0.0115046021104,0.0114087346034,0.0113128669915,0.0112169992756,0.0111211314566,0.0110252635354,0.0109293955129,0.0108335273899,0.0107376591673,0.010641790846,0.0105459224269,0.0104500539108,0.0103541852987,0.0102583165915,0.0101624477899,0.0100665788949,0.00997070990742,0.00987484082827,0.00977897165835,0.00968310239854,0.00958723304973,0.00949136361279,0.00939549408862,0.00929962447808,0.00920375478206,0.00910788500144,0.00901201513711,0.00891614518993,0.00882027516081,0.00872440505061,0.00862853486021,0.00853266459051,0.00843679424237,0.00834092381668,0.00824505331433,0.00814918273619,0.00805331208315,0.00795744135607,0.00786157055586,0.00776569968339,0.00766982873953,0.00757395772518,0.0074780866412,0.00738221548849,0.00728634426793,0.00719047298039,0.00709460162675,0.00699873020791,0.00690285872473,0.0068069871781,0.00671111556891,0.00661524389803,0.00651937216634,0.00642350037473,0.00632762852407,0.00623175661525,0.00613588464915,0.00604001262666,0.00594414054864,0.00584826841598,0.00575239622957,0.00565652399029,0.00556065169901,0.00546477935662,0.005368906964,0.00527303452202,0.00517716203158,0.00508128949356,0.00498541690882,0.00488954427826,0.00479367160276,0.00469779888319,0.00460192612045,0.0045060533154,0.00441018046894,0.00431430758194,0.00421843465528,0.00412256168984,0.00402668868652,0.00393081564618,0.00383494256971,0.00373906945799,0.0036431963119,0.00354732313232,0.00345144992014,0.00335557667623,0.00325970340148,0.00316383009676,0.00306795676297,0.00297208340097,0.00287621001166,0.0027803365959,0.0026844631546,0.00258858968861,0.00249271619884,0.00239684268615,0.00230096915143,0.00220509559556,0.00210922201942,0.00201334842389,0.00191747480986,0.0018216011782,0.0017257275298,0.00162985386553,0.00153398018629,0.00143810649294,0.00134223278637,0.00124635906747,0.00115048533711,0.00105461159618,0.000958737845554,0.000862864086114,0.000766990318743,0.000671116544322,0.000575242763732,0.000479368977855,0.000383495187571,0.000287621393763,0.000191747597311,9.58737990959e-05,1.22464679915e-16,-9.58737990957e-05,-0.000191747597311,-0.000287621393763,-0.000383495187571,-0.000479368977855,-0.000575242763732,-0.000671116544321,-0.000766990318743,-0.000862864086113,-0.000958737845553,-0.00105461159618,-0.00115048533711,-0.00124635906747,-0.00134223278637,-0.00143810649294,-0.00153398018628,-0.00162985386553,-0.00172572752979,-0.0018216011782,-0.00191747480986,-0.00201334842389,-0.00210922201942,-0.00220509559555,-0.00230096915143,-0.00239684268615,-0.00249271619884,-0.00258858968861,-0.0026844631546,-0.0027803365959,-0.00287621001166,-0.00297208340097,-0.00306795676297,-0.00316383009676,-0.00325970340148,-0.00335557667623,-0.00345144992014,-0.00354732313232,-0.0036431963119,-0.00373906945799,-0.00383494256971,-0.00393081564618,-0.00402668868652,-0.00412256168984,-0.00421843465528,-0.00431430758194,-0.00441018046894,-0.0045060533154,-0.00460192612045,-0.00469779888319,-0.00479367160276,-0.00488954427826,-0.00498541690882,-0.00508128949356,-0.00517716203158,-0.00527303452202,-0.005368906964,-0.00546477935662,-0.00556065169901,-0.00565652399029,-0.00575239622957,-0.00584826841598,-0.00594414054864,-0.00604001262666,-0.00613588464915,-0.00623175661525,-0.00632762852407,-0.00642350037473,-0.00651937216634,-0.00661524389803,-0.00671111556891,-0.0068069871781,-0.00690285872473,-0.00699873020791,-0.00709460162675,-0.00719047298039,-0.00728634426793,-0.00738221548849,-0.0074780866412,-0.00757395772518,-0.00766982873953,-0.00776569968339,-0.00786157055586,-0.00795744135607,-0.00805331208315,-0.00814918273619,-0.00824505331433,-0.00834092381668,-0.00843679424237,-0.00853266459051,-0.00862853486021,-0.00872440505061,-0.00882027516081,-0.00891614518993,-0.00901201513711,-0.00910788500144,-0.00920375478206,-0.00929962447808,-0.00939549408862,-0.00949136361279,-0.00958723304973,-0.00968310239854,-0.00977897165835,-0.00987484082827,-0.00997070990742,-0.0100665788949,-0.0101624477899,-0.0102583165915,-0.0103541852987,-0.0104500539108,-0.0105459224269,-0.010641790846,-0.0107376591673,-0.0108335273899,-0.0109293955129,-0.0110252635354,-0.0111211314566,-0.0112169992756,-0.0113128669915,-0.0114087346034,-0.0115046021104,-0.0116004695117,-0.0116963368064,-0.0117922039935,-0.0118880710723,-0.0119839380417,-0.0120798049011,-0.0121756716493,-0.0122715382857,-0.0123674048093,-0.0124632712192,-0.0125591375145,-0.0126550036944,-0.012750869758,-0.0128467357044,-0.0129426015327,-0.013038467242,-0.0131343328315,-0.0132301983002,-0.0133260636473,-0.013421928872,-0.0135177939733,-0.0136136589503,-0.0137095238022,-0.0138053885281,-0.013901253127,-0.0139971175982,-0.0140929819408,-0.0141888461538,-0.0142847102364,-0.0143805741876,-0.0144764380067,-0.0145723016928,-0.0146681652449,-0.0147640286621,-0.0148598919437,-0.0149557550886,-0.0150516180961,-0.0151474809653,-0.0152433436952,-0.015339206285,-0.0154350687338,-0.0155309310407,-0.0156267932049,-0.0157226552254,-0.0158185171014,-0.015914378832,-0.0160102404164,-0.0161061018535,-0.0162019631427,-0.0162978242829,-0.0163936852733,-0.016489546113,-0.0165854068011,-0.0166812673368,-0.0167771277191,-0.0168729879473,-0.0169688480203,-0.0170647079374,-0.0171605676976,-0.0172564273001,-0.017352286744,-0.0174481460284,-0.0175440051524,-0.0176398641151,-0.0177357229157,-0.0178315815532,-0.0179274400269,-0.0180232983358,-0.018119156479,-0.0182150144556,-0.0183108722649,-0.0184067299058,-0.0185025873775,-0.0185984446792,-0.0186943018099,-0.0187901587688,-0.0188860155549,-0.0189818721675,-0.0190777286056,-0.0191735848683,-0.0192694409548,-0.0193652968642,-0.0194611525955,-0.019557008148,-0.0196528635207,-0.0197487187128,-0.0198445737234,-0.0199404285515,-0.0200362831964,-0.0201321376571,-0.0202279919327,-0.0203238460224,-0.0204196999253,-0.0205155536405,-0.0206114071671,-0.0207072605043,-0.0208031136511,-0.0208989666067,-0.0209948193702,-0.0210906719408,-0.0211865243174,-0.0212823764994,-0.0213782284857,-0.0214740802755,-0.0215699318679,-0.021665783262,-0.021761634457,-0.021857485452,-0.0219533362461,-0.0220491868384,-0.022145037228,-0.022240887414,-0.0223367373956,-0.0224325871719,-0.0225284367421,-0.0226242861051,-0.0227201352602,-0.0228159842064,-0.0229118329429,-0.0230076814688,-0.0231035297833,-0.0231993778853,-0.0232952257742,-0.0233910734489,-0.0234869209086,-0.0235827681524,-0.0236786151794,-0.0237744619888,-0.0238703085797,-0.0239661549511,-0.0240620011023,-0.0241578470323,-0.0242536927402,-0.0243495382252,-0.0244453834864,-0.0245412285229,-0.0246370733338,-0.0247329179183,-0.0248287622754,-0.0249246064043,-0.0250204503041,-0.0251162939739,-0.0252121374128,-0.02530798062,-0.0254038235946,-0.0254996663357,-0.0255955088423,-0.0256913511138,-0.025787193149,-0.0258830349473,-0.0259788765076,-0.0260747178291,-0.026170558911,-0.0262663997523,-0.0263622403521,-0.0264580807097,-0.026553920824,-0.0266497606943,-0.0267456003196,-0.0268414396991,-0.0269372788319,-0.027033117717,-0.0271289563537,-0.027224794741,-0.0273206328781,-0.027416470764,-0.0275123083979,-0.027608145779,-0.0277039829062,-0.0277998197789,-0.027895656396,-0.0279914927567,-0.02808732886,-0.0281831647053,-0.0282790002914,-0.0283748356177,-0.0284706706831,-0.0285665054868,-0.028662340028,-0.0287581743056,-0.028854008319,-0.0289498420671,-0.0290456755491,-0.0291415087642,-0.0292373417114,-0.0293331743898,-0.0294290067986,-0.0295248389369,-0.0296206708039,-0.0297165023985,-0.02981233372,-0.0299081647675,-0.0300039955401,-0.0300998260369,-0.030195656257,-0.0302914861995,-0.0303873158637,-0.0304831452485,-0.0305789743531,-0.0306748031766,-0.0307706317182,-0.030866459977,-0.030962287952,-0.0310581156424,-0.0311539430474,-0.031249770166,-0.0313455969973,-0.0314414235406,-0.0315372497948,-0.0316330757591,-0.0317289014327,-0.0318247268146,-0.031920551904,-0.0320163767,-0.0321122012018,-0.0322080254083,-0.0323038493188,-0.0323996729324,-0.0324954962481,-0.0325913192652,-0.0326871419827,-0.0327829643997,-0.0328787865154,-0.0329746083289,-0.0330704298393,-0.0331662510457,-0.0332620719473,-0.0333578925431,-0.0334537128323,-0.033549532814,-0.0336453524873,-0.0337411718514,-0.0338369909053,-0.0339328096482,-0.0340286280792,-0.0341244461974,-0.034220264002,-0.034316081492,-0.0344118986665,-0.0345077155248,-0.0346035320659,-0.0346993482889,-0.034795164193,-0.0348909797772,-0.0349867950407,-0.0350826099826,-0.0351784246021,-0.0352742388982,-0.0353700528701,-0.0354658665169,-0.0355616798376,-0.0356574928315,-0.0357533054976,-0.0358491178351,-0.0359449298431,-0.0360407415207,-0.036136552867,-0.0362323638812,-0.0363281745623,-0.0364239849094,-0.0365197949218,-0.0366156045985,-0.0367114139387,-0.0368072229414,-0.0369030316057,-0.0369988399309,-0.037094647916,-0.0371904555601,-0.0372862628624,-0.0373820698219,-0.0374778764378,-0.0375736827093,-0.0376694886353,-0.0377652942152,-0.0378610994479,-0.0379569043325,-0.0380527088683,-0.0381485130544,-0.0382443168897,-0.0383401203736,-0.038435923505,-0.0385317262831,-0.038627528707,-0.0387233307759,-0.0388191324889,-0.038914933845,-0.0390107348435,-0.0391065354833,-0.0392023357637,-0.0392981356838,-0.0393939352426,-0.0394897344394,-0.0395855332731,-0.039681331743,-0.0397771298482,-0.0398729275877,-0.0399687249608,-0.0400645219664,-0.0401603186038,-0.040256114872,-0.0403519107703,-0.0404477062976,-0.0405435014531,-0.0406392962359,-0.0407350906452,-0.0408308846801,-0.0409266783397,-0.0410224716231,-0.0411182645294,-0.0412140570577,-0.0413098492073,-0.0414056409771,-0.0415014323663,-0.0415972233741,-0.0416930139995,-0.0417888042416,-0.0418845940997,-0.0419803835727,-0.0420761726599,-0.0421719613603,-0.0422677496731,-0.0423635375974,-0.0424593251323,-0.0425551122769,-0.0426508990304,-0.0427466853918,-0.0428424713602,-0.0429382569349,-0.043034042115,-0.0431298268994,-0.0432256112874,-0.0433213952781,-0.0434171788706,-0.043512962064,-0.0436087448575,-0.0437045272501,-0.0438003092409,-0.0438960908292,-0.043991872014,-0.0440876527945,-0.0441834331696,-0.0442792131387,-0.0443749927008,-0.0444707718549,-0.0445665506003,-0.0446623289361,-0.0447581068613,-0.0448538843752,-0.0449496614767,-0.0450454381651,-0.0451412144394,-0.0452369902988,-0.0453327657424,-0.0454285407693,-0.0455243153786,-0.0456200895695,-0.045715863341,-0.0458116366924,-0.0459074096226,-0.0460031821309,-0.0460989542163,-0.046194725878,-0.0462904971151,-0.0463862679267,-0.0464820383119,-0.0465778082699,-0.0466735777997,-0.0467693469005,-0.0468651155715,-0.0469608838116,-0.0470566516201,-0.0471524189961,-0.0472481859386,-0.0473439524469,-0.0474397185199,-0.047535484157,-0.047631249357,-0.0477270141193,-0.0478227784429,-0.0479185423269,-0.0480143057704,-0.0481100687726,-0.0482058313326,-0.0483015934495,-0.0483973551224,-0.0484931163504,-0.0485888771327,-0.0486846374684,-0.0487803973566,-0.0488761567964,-0.048971915787,-0.0490676743274,-0.0491634324168,-0.0492591900543,-0.049354947239,-0.0494507039701,-0.0495464602466,-0.0496422160677,-0.0497379714325,-0.0498337263401,-0.0499294807897,-0.0500252347803,-0.0501209883111,-0.0502167413812,-0.0503124939897,-0.0504082461357,-0.0505039978184,-0.0505997490369,-0.0506954997903,-0.0507912500777,-0.0508869998982,-0.050982749251,-0.0510784981352,-0.0511742465499,-0.0512699944941,-0.0513657419672,-0.051461488968,-0.0515572354959,-0.0516529815499,-0.051748727129,-0.0518444722325,-0.0519402168595,-0.052035961009,-0.0521317046803,-0.0522274478723,-0.0523231905843,-0.0524189328154,-0.0525146745646,-0.0526104158311,-0.0527061566141,-0.0528018969125,-0.0528976367257,-0.0529933760526,-0.0530891148924,-0.0531848532442,-0.0532805911071,-0.0533763284804,-0.0534720653629,-0.053567801754,-0.0536635376527,-0.0537592730582,-0.0538550079695,-0.0539507423857,-0.0540464763061,-0.0541422097297,-0.0542379426556,-0.054333675083,-0.0544294070109,-0.0545251384386,-0.054620869365,-0.0547165997894,-0.0548123297109,-0.0549080591285,-0.0550037880415,-0.0550995164488,-0.0551952443497,-0.0552909717432,-0.0553866986286,-0.0554824250048,-0.055578150871,-0.0556738762264,-0.05576960107,-0.055865325401,-0.0559610492185,-0.0560567725216,-0.0561524953095,-0.0562482175812,-0.0563439393359,-0.0564396605727,-0.0565353812907,-0.0566311014891,-0.0567268211669,-0.0568225403233,-0.0569182589574,-0.0570139770683,-0.0571096946552,-0.0572054117171,-0.0573011282532,-0.0573968442626,-0.0574925597444,-0.0575882746977,-0.0576839891217,-0.0577797030155,-0.0578754163782,-0.0579711292089,-0.0580668415068,-0.0581625532709,-0.0582582645004,-0.0583539751944,-0.0584496853521,-0.0585453949724,-0.0586411040547,-0.0587368125979,-0.0588325206012,-0.0589282280638,-0.0590239349847,-0.059119641363,-0.059215347198,-0.0593110524886,-0.0594067572341,-0.0595024614335,-0.059598165086,-0.0596938681907,-0.0597895707466,-0.059885272753,-0.059980974209,-0.0600766751136,-0.060172375466,-0.0602680752653,-0.0603637745107,-0.0604594732012,-0.0605551713359,-0.0606508689141,-0.0607465659348,-0.0608422623971,-0.0609379583001,-0.061033653643,-0.0611293484249,-0.061225042645,-0.0613207363022,-0.0614164293958,-0.0615121219249,-0.0616078138886,-0.061703505286,-0.0617991961162,-0.0618948863784,-0.0619905760716,-0.0620862651951,-0.0621819537478,-0.062277641729,-0.0623733291378,-0.0624690159732,-0.0625647022345,-0.0626603879206,-0.0627560730308,-0.0628517575642,-0.0629474415198,-0.0630431248968,-0.0631388076944,-0.0632344899116,-0.0633301715475,-0.0634258526014,-0.0635215330722,-0.0636172129592,-0.0637128922614,-0.063808570978,-0.063904249108,-0.0639999266507,-0.0640956036051,-0.0641912799704,-0.0642869557456,-0.0643826309299,-0.0644783055224,-0.0645739795222,-0.0646696529285,-0.0647653257403,-0.0648609979569,-0.0649566695772,-0.0650523406005,-0.0651480110259,-0.0652436808524,-0.0653393500792,-0.0654350187054,-0.0655306867302,-0.0656263541526,-0.0657220209718,-0.0658176871869,-0.065913352797,-0.0660090178013,-0.0661046821988,-0.0662003459886,-0.06629600917,-0.066391671742,-0.0664873337038,-0.0665829950544,-0.066678655793,-0.0667743159187,-0.0668699754306,-0.0669656343279,-0.0670612926096,-0.067156950275,-0.067252607323,-0.0673482637529,-0.0674439195637,-0.0675395747545,-0.0676352293246,-0.067730883273,-0.0678265365988,-0.0679221893012,-0.0680178413792,-0.0681134928321,-0.0682091436588,-0.0683047938586,-0.0684004434305,-0.0684960923738,-0.0685917406874,-0.0686873883705,-0.0687830354223,-0.0688786818418,-0.0689743276283,-0.0690699727807,-0.0691656172982,-0.06926126118,-0.0693569044252,-0.0694525470328,-0.0695481890021,-0.0696438303321,-0.0697394710219,-0.0698351110707,-0.0699307504776,-0.0700263892417,-0.0701220273621,-0.070217664838,-0.0703133016685,-0.0704089378526,-0.0705045733896,-0.0706002082785,-0.0706958425185,-0.0707914761086,-0.0708871090481,-0.070982741336,-0.0710783729714,-0.0711740039534,-0.0712696342813,-0.0713652639541,-0.0714608929708,-0.0715565213308,-0.071652149033,-0.0717477760766,-0.0718434024607,-0.0719390281844,-0.0720346532469,-0.0721302776472,-0.0722259013846,-0.0723215244581,-0.0724171468668,-0.0725127686098,-0.0726083896864,-0.0727040100955,-0.0727996298364,-0.072895248908,-0.0729908673097,-0.0730864850405,-0.0731821020994,-0.0732777184857,-0.0733733341984,-0.0734689492367,-0.0735645635997,-0.0736601772865,-0.0737557902962,-0.073851402628,-0.0739470142809,-0.0740426252541,-0.0741382355468,-0.074233845158,-0.0743294540868,-0.0744250623325,-0.074520669894,-0.0746162767706,-0.0747118829613,-0.0748074884652,-0.0749030932816,-0.0749986974094,-0.0750943008479,-0.0751899035962,-0.0752855056533,-0.0753811070184,-0.0754767076906,-0.075572307669,-0.0756679069528,-0.0757635055411,-0.075859103433,-0.0759547006275,-0.076050297124,-0.0761458929214,-0.0762414880189,-0.0763370824155,-0.0764326761105,-0.076528269103,-0.076623861392,-0.0767194529767,-0.0768150438563,-0.0769106340297,-0.0770062234962,-0.0771018122549,-0.0771974003049,-0.0772929876453,-0.0773885742753,-0.0774841601939,-0.0775797454003,-0.0776753298935,-0.0777709136729,-0.0778664967373,-0.077962079086,-0.0780576607182,-0.0781532416328,-0.0782488218291,-0.0783444013061,-0.078439980063,-0.0785355580988,-0.0786311354128,-0.0787267120041,-0.0788222878717,-0.0789178630148,-0.0790134374325,-0.0791090111239,-0.0792045840882,-0.0793001563244,-0.0793957278317,-0.0794912986092,-0.0795868686561,-0.0796824379714,-0.0797780065543,-0.0798735744039,-0.0799691415193,-0.0800647078997,-0.0801602735441,-0.0802558384517,-0.0803514026216,-0.0804469660529,-0.0805425287448,-0.0806380906964,-0.0807336519067,-0.080829212375,-0.0809247721003,-0.0810203310817,-0.0811158893185,-0.0812114468096,-0.0813070035542,-0.0814025595515,-0.0814981148006,-0.0815936693005,-0.0816892230505,-0.0817847760496,-0.0818803282969,-0.0819758797916,-0.0820714305328,-0.0821669805197,-0.0822625297512,-0.0823580782266,-0.0824536259451,-0.0825491729056,-0.0826447191073,-0.0827402645494,-0.0828358092309,-0.0829313531511,-0.0830268963089,-0.0831224387036,-0.0832179803343,-0.0833135212,-0.0834090612999,-0.0835046006332,-0.0836001391988,-0.0836956769961,-0.083791214024,-0.0838867502818,-0.0839822857685,-0.0840778204832,-0.0841733544251,-0.0842688875933,-0.0843644199869,-0.0844599516051,-0.0845554824469,-0.0846510125116,-0.0847465417981,-0.0848420703056,-0.0849375980333,-0.0850331249803,-0.0851286511456,-0.0852241765285,-0.085319701128,-0.0854152249433,-0.0855107479735,-0.0856062702176,-0.0857017916749,-0.0857973123444,-0.0858928322253,-0.0859883513167,-0.0860838696177,-0.0861793871275,-0.0862749038451,-0.0863704197697,-0.0864659349003,-0.0865614492363,-0.0866569627765,-0.0867524755202,-0.0868479874665,-0.0869434986145,-0.0870390089634,-0.0871345185122,-0.0872300272601,-0.0873255352062,-0.0874210423496,-0.0875165486895,-0.0876120542249,-0.087707558955,-0.0878030628789,-0.0878985659958,-0.0879940683047,-0.0880895698048,-0.0881850704952,-0.088280570375,-0.0883760694433,-0.0884715676993,-0.0885670651421,-0.0886625617709,-0.0887580575846,-0.0888535525825,-0.0889490467637,-0.0890445401273,-0.0891400326724,-0.0892355243981,-0.0893310153037,-0.0894265053881,-0.0895219946505,-0.08961748309,-0.0897129707058,-0.089808457497,-0.0899039434627,-0.089999428602,-0.090094912914,-0.0901903963979,-0.0902858790529,-0.0903813608779,-0.0904768418721,-0.0905723220347,-0.0906678013648,-0.0907632798615,-0.0908587575239,-0.0909542343511,-0.0910497103424,-0.0911451854967,-0.0912406598132,-0.0913361332911,-0.0914316059294,-0.0915270777273,-0.0916225486839,-0.0917180187983,-0.0918134880697,-0.0919089564971,-0.0920044240798,-0.0920998908167,-0.0921953567071,-0.0922908217501,-0.0923862859447,-0.0924817492901,-0.0925772117855,-0.0926726734299,-0.0927681342225,-0.0928635941624,-0.0929590532487,-0.0930545114805,-0.093149968857,-0.0932454253773,-0.0933408810405,-0.0934363358457,-0.0935317897921,-0.0936272428788,-0.0937226951048,-0.0938181464694,-0.0939135969716,-0.0940090466106,-0.0941044953855,-0.0941999432954,-0.0942953903394,-0.0943908365167,-0.0944862818264,-0.0945817262675,-0.0946771698393,-0.0947726125408,-0.0948680543712,-0.0949634953296,-0.0950589354152,-0.0951543746269,-0.095249812964,-0.0953452504256,-0.0954406870108,-0.0955361227188,-0.0956315575485,-0.0957269914993,-0.0958224245702,-0.0959178567602,-0.0960132880687,-0.0961087184946,-0.096204148037,-0.0962995766952,-0.0963950044683,-0.0964904313553,-0.0965858573553,-0.0966812824676,-0.0967767066912,-0.0968721300252,-0.0969675524688,-0.0970629740212,-0.0971583946813,-0.0972538144484,-0.0973492333215,-0.0974446512998,-0.0975400683825,-0.0976354845685,-0.0977308998571,-0.0978263142474,-0.0979217277385,-0.0980171403296,-0.0981125520196,-0.0982079628079,-0.0983033726934,-0.0983987816754,-0.0984941897529,-0.098589596925,-0.098685003191,-0.0987804085498,-0.0988758130007,-0.0989712165427,-0.099066619175,-0.0991620208967,-0.099257421707,-0.0993528216049,-0.0994482205895,-0.0995436186601,-0.0996390158156,-0.0997344120553,-0.0998298073783,-0.0999252017837,-0.100020595271,-0.100115987838,-0.100211379485,-0.100306770211,-0.100402160016,-0.100497548897,-0.100592936854,-0.100688323887,-0.100783709995,-0.100879095176,-0.100974479429,-0.101069862755,-0.101165245151,-0.101260626618,-0.101356007154,-0.101451386758,-0.10154676543,-0.101642143168,-0.101737519973,-0.101832895841,-0.101928270774,-0.10202364477,-0.102119017829,-0.102214389948,-0.102309761128,-0.102405131368,-0.102500500666,-0.102595869022,-0.102691236436,-0.102786602905,-0.102881968429,-0.102977333008,-0.10307269664,-0.103168059325,-0.103263421062,-0.103358781849,-0.103454141686,-0.103549500573,-0.103644858507,-0.103740215489,-0.103835571517,-0.103930926591,-0.10402628071,-0.104121633872,-0.104216986077,-0.104312337325,-0.104407687613,-0.104503036942,-0.10459838531,-0.104693732717,-0.104789079162,-0.104884424643,-0.10497976916,-0.105075112713,-0.105170455299,-0.105265796919,-0.105361137571,-0.105456477255,-0.105551815969,-0.105647153713,-0.105742490487,-0.105837826288,-0.105933161116,-0.106028494971,-0.106123827851,-0.106219159755,-0.106314490683,-0.106409820634,-0.106505149607,-0.106600477601,-0.106695804615,-0.106791130648,-0.1068864557,-0.106981779769,-0.107077102855,-0.107172424957,-0.107267746073,-0.107363066204,-0.107458385348,-0.107553703504,-0.107649020671,-0.107744336849,-0.107839652036,-0.107934966233,-0.108030279437,-0.108125591648,-0.108220902865,-0.108316213088,-0.108411522315,-0.108506830545,-0.108602137778,-0.108697444013,-0.108792749249,-0.108888053485,-0.108983356719,-0.109078658952,-0.109173960183,-0.10926926041,-0.109364559632,-0.10945985785,-0.109555155061,-0.109650451265,-0.109745746461,-0.109841040649,-0.109936333827,-0.110031625994,-0.11012691715,-0.110222207294,-0.110317496424,-0.110412784541,-0.110508071643,-0.110603357729,-0.110698642798,-0.11079392685,-0.110889209883,-0.110984491897,-0.111079772891,-0.111175052864,-0.111270331815,-0.111365609743,-0.111460886648,-0.111556162528,-0.111651437383,-0.111746711211,-0.111841984012,-0.111937255786,-0.11203252653,-0.112127796244,-0.112223064928,-0.112318332581,-0.112413599201,-0.112508864787,-0.11260412934,-0.112699392857,-0.112794655339,-0.112889916784,-0.112985177191,-0.113080436559,-0.113175694889,-0.113270952178,-0.113366208425,-0.113461463631,-0.113556717794,-0.113651970913,-0.113747222987,-0.113842474016,-0.113937723998,-0.114032972933,-0.11412822082,-0.114223467658,-0.114318713446,-0.114413958183,-0.114509201869,-0.114604444502,-0.114699686081,-0.114794926607,-0.114890166077,-0.114985404491,-0.115080641848,-0.115175878147,-0.115271113388,-0.115366347569,-0.115461580689,-0.115556812749,-0.115652043746,-0.11574727368,-0.11584250255,-0.115937730356,-0.116032957095,-0.116128182769,-0.116223407374,-0.116318630912,-0.11641385338,-0.116509074778,-0.116604295106,-0.116699514361,-0.116794732544,-0.116889949653,-0.116985165688,-0.117080380648,-0.117175594531,-0.117270807338,-0.117366019066,-0.117461229715,-0.117556439285,-0.117651647775,-0.117746855183,-0.117842061508,-0.117937266751,-0.118032470909,-0.118127673983,-0.11822287597,-0.118318076871,-0.118413276685,-0.11850847541,-0.118603673045,-0.118698869591,-0.118794065045,-0.118889259408,-0.118984452678,-0.119079644854,-0.119174835935,-0.119270025921,-0.119365214811,-0.119460402604,-0.119555589298,-0.119650774894,-0.119745959389,-0.119841142785,-0.119936325078,-0.120031506269,-0.120126686357,-0.120221865341,-0.120317043219,-0.120412219992,-0.120507395658,-0.120602570216,-0.120697743666,-0.120792916006,-0.120888087236,-0.120983257354,-0.121078426361,-0.121173594255,-0.121268761035,-0.1213639267,-0.12145909125,-0.121554254683,-0.121649416999,-0.121744578197,-0.121839738276,-0.121934897235,-0.122030055073,-0.122125211789,-0.122220367383,-0.122315521853,-0.122410675199,-0.12250582742,-0.122600978515,-0.122696128483,-0.122791277323,-0.122886425035,-0.122981571617,-0.123076717068,-0.123171861388,-0.123267004576,-0.123362146631,-0.123457287552,-0.123552427339,-0.123647565989,-0.123742703503,-0.12383783988,-0.123932975119,-0.124028109218,-0.124123242177,-0.124218373995,-0.124313504672,-0.124408634205,-0.124503762596,-0.124598889842,-0.124694015942,-0.124789140897,-0.124884264704,-0.124979387363,-0.125074508874,-0.125169629235,-0.125264748446,-0.125359866505,-0.125454983412,-0.125550099165,-0.125645213765,-0.12574032721,-0.125835439498,-0.125930550631,-0.126025660606,-0.126120769422,-0.126215877079,-0.126310983576,-0.126406088912,-0.126501193086,-0.126596296097,-0.126691397945,-0.126786498628,-0.126881598145,-0.126976696497,-0.127071793681,-0.127166889697,-0.127261984545,-0.127357078222,-0.127452170729,-0.127547262065,-0.127642352228,-0.127737441218,-0.127832529033,-0.127927615674,-0.128022701139,-0.128117785427,-0.128212868537,-0.128307950469,-0.128403031222,-0.128498110794,-0.128593189185,-0.128688266394,-0.12878334242,-0.128878417263,-0.128973490921,-0.129068563393,-0.129163634679,-0.129258704778,-0.129353773688,-0.12944884141,-0.129543907942,-0.129638973283,-0.129734037432,-0.129829100389,-0.129924162153,-0.130019222722,-0.130114282096,-0.130209340275,-0.130304397256,-0.13039945304,-0.130494507625,-0.13058956101,-0.130684613196,-0.13077966418,-0.130874713962,-0.130969762541,-0.131064809916,-0.131159856086,-0.131254901051,-0.131349944809,-0.13144498736,-0.131540028703,-0.131635068837,-0.13173010776,-0.131825145473,-0.131920181974,-0.132015217263,-0.132110251338,-0.132205284199,-0.132300315844,-0.132395346274,-0.132490375487,-0.132585403481,-0.132680430257,-0.132775455814,-0.13287048015,-0.132965503265,-0.133060525157,-0.133155545827,-0.133250565272,-0.133345583493,-0.133440600488,-0.133535616256,-0.133630630797,-0.13372564411,-0.133820656194,-0.133915667047,-0.13401067667,-0.134105685061,-0.134200692219,-0.134295698143,-0.134390702834,-0.134485706288,-0.134580708507,-0.134675709489,-0.134770709233,-0.134865707738,-0.134960705003,-0.135055701028,-0.135150695811,-0.135245689352,-0.13534068165,-0.135435672704,-0.135530662513,-0.135625651076,-0.135720638393,-0.135815624462,-0.135910609283,-0.136005592854,-0.136100575176,-0.136195556246,-0.136290536064,-0.13638551463,-0.136480491942,-0.136575468,-0.136670442802,-0.136765416348,-0.136860388637,-0.136955359668,-0.13705032944,-0.137145297952,-0.137240265204,-0.137335231194,-0.137430195921,-0.137525159386,-0.137620121586,-0.137715082522,-0.137810042192,-0.137905000595,-0.13799995773,-0.138094913597,-0.138189868194,-0.138284821522,-0.138379773578,-0.138474724362,-0.138569673873,-0.138664622111,-0.138759569074,-0.138854514762,-0.138949459173,-0.139044402308,-0.139139344164,-0.139234284741,-0.139329224038,-0.139424162055,-0.13951909879,-0.139614034243,-0.139708968412,-0.139803901298,-0.139898832898,-0.139993763212,-0.14008869224,-0.140183619979,-0.140278546431,-0.140373471592,-0.140468395464,-0.140563318044,-0.140658239333,-0.140753159328,-0.14084807803,-0.140942995437,-0.141037911549,-0.141132826364,-0.141227739882,-0.141322652102,-0.141417563022,-0.141512472643,-0.141607380963,-0.141702287982,-0.141797193698,-0.14189209811,-0.141987001219,-0.142081903022,-0.142176803519,-0.14227170271,-0.142366600593,-0.142461497167,-0.142556392431,-0.142651286386,-0.142746179029,-0.14284107036,-0.142935960378,-0.143030849082,-0.143125736471,-0.143220622545,-0.143315507303,-0.143410390743,-0.143505272865,-0.143600153667,-0.14369503315,-0.143789911312,-0.143884788153,-0.143979663671,-0.144074537865,-0.144169410735,-0.14426428228,-0.144359152499,-0.144454021391,-0.144548888955,-0.144643755191,-0.144738620097,-0.144833483672,-0.144928345916,-0.145023206829,-0.145118066408,-0.145212924653,-0.145307781563,-0.145402637138,-0.145497491376,-0.145592344277,-0.14568719584,-0.145782046064,-0.145876894947,-0.14597174249,-0.146066588691,-0.146161433549,-0.146256277064,-0.146351119234,-0.14644596006,-0.146540799539,-0.146635637671,-0.146730474455,-0.146825309891,-0.146920143977,-0.147014976713,-0.147109808097,-0.147204638129,-0.147299466808,-0.147394294133,-0.147489120103,-0.147583944718,-0.147678767976,-0.147773589876,-0.147868410418,-0.147963229601,-0.148058047424,-0.148152863887,-0.148247678987,-0.148342492725,-0.148437305099,-0.148532116108,-0.148626925753,-0.148721734031,-0.148816540942,-0.148911346486,-0.14900615066,-0.149100953465,-0.1491957549,-0.149290554963,-0.149385353654,-0.149480150972,-0.149574946915,-0.149669741484,-0.149764534677,-0.149859326494,-0.149954116933,-0.150048905994,-0.150143693675,-0.150238479977,-0.150333264897,-0.150428048436,-0.150522830592,-0.150617611364,-0.150712390752,-0.150807168755,-0.150901945371,-0.1509967206,-0.151091494442,-0.151186266894,-0.151281037957,-0.15137580763,-0.151470575911,-0.151565342799,-0.151660108295,-0.151754872397,-0.151849635103,-0.151944396414,-0.152039156328,-0.152133914845,-0.152228671963,-0.152323427682,-0.152418182001,-0.152512934919,-0.152607686435,-0.152702436549,-0.152797185258,-0.152891932564,-0.152986678464,-0.153081422957,-0.153176166044,-0.153270907723,-0.153365647992,-0.153460386852,-0.153555124302,-0.15364986034,-0.153744594966,-0.153839328178,-0.153934059977,-0.154028790361,-0.154123519328,-0.154218246879,-0.154312973013,-0.154407697728,-0.154502421024,-0.1545971429,-0.154691863355,-0.154786582387,-0.154881299997,-0.154976016184,-0.155070730946,-0.155165444282,-0.155260156193,-0.155354866676,-0.155449575731,-0.155544283357,-0.155638989554,-0.15573369432,-0.155828397654,-0.155923099556,-0.156017800025,-0.15611249906,-0.15620719666,-0.156301892824,-0.156396587552,-0.156491280842,-0.156585972693,-0.156680663105,-0.156775352077,-0.156870039608,-0.156964725697,-0.157059410343,-0.157154093546,-0.157248775304,-0.157343455616,-0.157438134483,-0.157532811902,-0.157627487873,-0.157722162395,-0.157816835468,-0.15791150709,-0.15800617726,-0.158100845978,-0.158195513243,-0.158290179054,-0.15838484341,-0.15847950631,-0.158574167753,-0.158668827739,-0.158763486266,-0.158858143334,-0.158952798942,-0.159047453088,-0.159142105773,-0.159236756995,-0.159331406753,-0.159426055047,-0.159520701875,-0.159615347237,-0.159709991132,-0.159804633559,-0.159899274517,-0.159993914005,-0.160088552023,-0.160183188569,-0.160277823642,-0.160372457243,-0.160467089369,-0.160561720021,-0.160656349196,-0.160750976895,-0.160845603116,-0.160940227859,-0.161034851122,-0.161129472906,-0.161224093208,-0.161318712028,-0.161413329366,-0.161507945219,-0.161602559588,-0.161697172472,-0.16179178387,-0.16188639378,-0.161981002202,-0.162075609136,-0.16217021458,-0.162264818533,-0.162359420994,-0.162454021963,-0.162548621439,-0.162643219421,-0.162737815908,-0.162832410899,-0.162927004393,-0.16302159639,-0.163116186888,-0.163210775887,-0.163305363385,-0.163399949383,-0.163494533879,-0.163589116871,-0.163683698361,-0.163778278345,-0.163872856825,-0.163967433797,-0.164062009263,-0.164156583221,-0.16425115567,-0.164345726609,-0.164440296037,-0.164534863954,-0.164629430359,-0.16472399525,-0.164818558628,-0.16491312049,-0.165007680836,-0.165102239666,-0.165196796978,-0.165291352772,-0.165385907046,-0.1654804598,-0.165575011034,-0.165669560745,-0.165764108933,-0.165858655598,-0.165953200738,-0.166047744353,-0.166142286441,-0.166236827003,-0.166331366036,-0.16642590354,-0.166520439515,-0.166614973959,-0.166709506872,-0.166804038252,-0.166898568099,-0.166993096412,-0.16708762319,-0.167182148432,-0.167276672137,-0.167371194305,-0.167465714935,-0.167560234025,-0.167654751575,-0.167749267584,-0.167843782051,-0.167938294975,-0.168032806355,-0.168127316191,-0.168221824482,-0.168316331226,-0.168410836423,-0.168505340073,-0.168599842173,-0.168694342724,-0.168788841724,-0.168883339172,-0.168977835068,-0.169072329411,-0.1691668222,-0.169261313434,-0.169355803112,-0.169450291234,-0.169544777798,-0.169639262803,-0.16973374625,-0.169828228136,-0.169922708461,-0.170017187224,-0.170111664424,-0.170206140061,-0.170300614133,-0.17039508664,-0.170489557581,-0.170584026954,-0.17067849476,-0.170772960997,-0.170867425664,-0.17096188876,-0.171056350285,-0.171150810238,-0.171245268618,-0.171339725423,-0.171434180654,-0.171528634308,-0.171623086386,-0.171717536887,-0.171811985809,-0.171906433152,-0.172000878915,-0.172095323097,-0.172189765697,-0.172284206714,-0.172378646148,-0.172473083997,-0.172567520261,-0.172661954938,-0.172756388029,-0.172850819531,-0.172945249445,-0.173039677769,-0.173134104503,-0.173228529645,-0.173322953195,-0.173417375152,-0.173511795514,-0.173606214282,-0.173700631454,-0.17379504703,-0.173889461008,-0.173983873387,-0.174078284168,-0.174172693348,-0.174267100928,-0.174361506905,-0.17445591128,-0.174550314051,-0.174644715218,-0.17473911478,-0.174833512735,-0.174927909083,-0.175022303824,-0.175116696956,-0.175211088478,-0.175305478389,-0.175399866689,-0.175494253377,-0.175588638452,-0.175683021913,-0.175777403759,-0.175871783989,-0.175966162603,-0.176060539599,-0.176154914977,-0.176249288736,-0.176343660875,-0.176438031393,-0.176532400289,-0.176626767562,-0.176721133212,-0.176815497238,-0.176909859638,-0.177004220412,-0.177098579559,-0.177192937079,-0.177287292969,-0.17738164723,-0.177475999861,-0.17757035086,-0.177664700227,-0.177759047961,-0.177853394061,-0.177947738526,-0.178042081356,-0.178136422549,-0.178230762105,-0.178325100022,-0.178419436301,-0.178513770939,-0.178608103936,-0.178702435292,-0.178796765005,-0.178891093075,-0.1789854195,-0.179079744281,-0.179174067415,-0.179268388902,-0.179362708741,-0.179457026932,-0.179551343473,-0.179645658364,-0.179739971603,-0.179834283191,-0.179928593125,-0.180022901406,-0.180117208031,-0.180211513002,-0.180305816315,-0.180400117972,-0.18049441797,-0.180588716309,-0.180683012988,-0.180777308007,-0.180871601363,-0.180965893058,-0.181060183088,-0.181154471455,-0.181248758156,-0.181343043192,-0.18143732656,-0.181531608261,-0.181625888293,-0.181720166656,-0.181814443348,-0.18190871837,-0.182002991719,-0.182097263395,-0.182191533397,-0.182285801725,-0.182380068377,-0.182474333353,-0.182568596652,-0.182662858272,-0.182757118214,-0.182851376475,-0.182945633056,-0.183039887955,-0.183134141172,-0.183228392705,-0.183322642555,-0.183416890719,-0.183511137197,-0.183605381988,-0.183699625092,-0.183793866507,-0.183888106233,-0.183982344269,-0.184076580613,-0.184170815266,-0.184265048226,-0.184359279491,-0.184453509063,-0.184547736939,-0.184641963118,-0.1847361876,-0.184830410385,-0.18492463147,-0.185018850856,-0.185113068541,-0.185207284524,-0.185301498805,-0.185395711383,-0.185489922257,-0.185584131425,-0.185678338888,-0.185772544644,-0.185866748693,-0.185960951033,-0.186055151663,-0.186149350584,-0.186243547794,-0.186337743291,-0.186431937076,-0.186526129147,-0.186620319504,-0.186714508145,-0.18680869507,-0.186902880278,-0.186997063768,-0.18709124554,-0.187185425591,-0.187279603922,-0.187373780531,-0.187467955419,-0.187562128583,-0.187656300023,-0.187750469738,-0.187844637727,-0.18793880399,-0.188032968525,-0.188127131332,-0.188221292409,-0.188315451757,-0.188409609373,-0.188503765258,-0.18859791941,-0.188692071829,-0.188786222513,-0.188880371462,-0.188974518674,-0.18906866415,-0.189162807888,-0.189256949887,-0.189351090146,-0.189445228665,-0.189539365443,-0.189633500478,-0.18972763377,-0.189821765319,-0.189915895122,-0.19001002318,-0.190104149492,-0.190198274056,-0.190292396871,-0.190386517938,-0.190480637254,-0.19057475482,-0.190668870634,-0.190762984696,-0.190857097004,-0.190951207557,-0.191045316356,-0.191139423398,-0.191233528684,-0.191327632212,-0.191421733981,-0.19151583399,-0.19160993224,-0.191704028728,-0.191798123453,-0.191892216416,-0.191986307615,-0.19208039705,-0.192174484719,-0.192268570621,-0.192362654756,-0.192456737123,-0.192550817721,-0.192644896549,-0.192738973607,-0.192833048892,-0.192927122405,-0.193021194145,-0.193115264111,-0.193209332302,-0.193303398716,-0.193397463354,-0.193491526214,-0.193585587296,-0.193679646598,-0.19377370412,-0.193867759861,-0.19396181382,-0.194055865996,-0.194149916388,-0.194243964996,-0.194338011818,-0.194432056854,-0.194526100103,-0.194620141563,-0.194714181235,-0.194808219117,-0.194902255209,-0.194996289509,-0.195090322016,-0.19518435273,-0.195278381651,-0.195372408776,-0.195466434105,-0.195560457638,-0.195654479373,-0.19574849931,-0.195842517448,-0.195936533785,-0.196030548321,-0.196124561056,-0.196218571988,-0.196312581116,-0.19640658844,-0.196500593958,-0.19659459767,-0.196688599575,-0.196782599672,-0.196876597961,-0.19697059444,-0.197064589108,-0.197158581965,-0.197252573009,-0.197346562241,-0.197440549659,-0.197534535261,-0.197628519048,-0.197722501019,-0.197816481172,-0.197910459507,-0.198004436022,-0.198098410718,-0.198192383593,-0.198286354646,-0.198380323876,-0.198474291283,-0.198568256866,-0.198662220623,-0.198756182554,-0.198850142659,-0.198944100935,-0.199038057383,-0.199132012002,-0.19922596479,-0.199319915747,-0.199413864871,-0.199507812163,-0.199601757621,-0.199695701244,-0.199789643032,-0.199883582983,-0.199977521097,-0.200071457373,-0.20016539181,-0.200259324407,-0.200353255163,-0.200447184078,-0.20054111115,-0.200635036378,-0.200728959763,-0.200822881302,-0.200916800996,-0.201010718843,-0.201104634842,-0.201198548993,-0.201292461294,-0.201386371745,-0.201480280345,-0.201574187093,-0.201668091988,-0.20176199503,-0.201855896217,-0.201949795548,-0.202043693023,-0.202137588641,-0.202231482401,-0.202325374303,-0.202419264344,-0.202513152525,-0.202607038844,-0.202700923302,-0.202794805895,-0.202888686625,-0.20298256549,-0.203076442489,-0.203170317622,-0.203264190887,-0.203358062284,-0.203451931811,-0.203545799469,-0.203639665255,-0.20373352917,-0.203827391212,-0.20392125138,-0.204015109674,-0.204108966093,-0.204202820635,-0.204296673301,-0.204390524089,-0.204484372998,-0.204578220027,-0.204672065176,-0.204765908444,-0.20485974983,-0.204953589332,-0.205047426951,-0.205141262685,-0.205235096533,-0.205328928495,-0.20542275857,-0.205516586756,-0.205610413053,-0.20570423746,-0.205798059977,-0.205891880602,-0.205985699334,-0.206079516173,-0.206173331118,-0.206267144167,-0.206360955321,-0.206454764578,-0.206548571937,-0.206642377398,-0.206736180959,-0.20682998262,-0.20692378238,-0.207017580237,-0.207111376192,-0.207205170243,-0.20729896239,-0.207392752631,-0.207486540966,-0.207580327394,-0.207674111913,-0.207767894524,-0.207861675225,-0.207955454015,-0.208049230894,-0.208143005861,-0.208236778914,-0.208330550053,-0.208424319278,-0.208518086586,-0.208611851978,-0.208705615453,-0.208799377009,-0.208893136645,-0.208986894362,-0.209080650158,-0.209174404032,-0.209268155983,-0.20936190601,-0.209455654114,-0.209549400292,-0.209643144543,-0.209736886868,-0.209830627265,-0.209924365734,-0.210018102272,-0.21011183688,-0.210205569557,-0.210299300302,-0.210393029114,-0.210486755992,-0.210580480935,-0.210674203942,-0.210767925013,-0.210861644147,-0.210955361343,-0.211049076599,-0.211142789916,-0.211236501291,-0.211330210725,-0.211423918217,-0.211517623765,-0.211611327369,-0.211705029028,-0.211798728741,-0.211892426507,-0.211986122326,-0.212079816196,-0.212173508116,-0.212267198087,-0.212360886106,-0.212454572173,-0.212548256288,-0.212641938448,-0.212735618654,-0.212829296905,-0.2129229732,-0.213016647537,-0.213110319916,-0.213203990337,-0.213297658797,-0.213391325297,-0.213484989836,-0.213578652412,-0.213672313026,-0.213765971675,-0.213859628359,-0.213953283078,-0.214046935829,-0.214140586614,-0.21423423543,-0.214327882277,-0.214421527154,-0.21451517006,-0.214608810994,-0.214702449955,-0.214796086943,-0.214889721957,-0.214983354995,-0.215076986058,-0.215170615143,-0.215264242251,-0.21535786738,-0.215451490529,-0.215545111698,-0.215638730886,-0.215732348092,-0.215825963314,-0.215919576553,-0.216013187808,-0.216106797076,-0.216200404358,-0.216294009653,-0.21638761296,-0.216481214278,-0.216574813606,-0.216668410944,-0.216762006289,-0.216855599643,-0.216949191003,-0.217042780369,-0.217136367739,-0.217229953114,-0.217323536493,-0.217417117873,-0.217510697256,-0.217604274638,-0.217697850021,-0.217791423403,-0.217884994783,-0.21797856416,-0.218072131533,-0.218165696902,-0.218259260266,-0.218352821623,-0.218446380974,-0.218539938316,-0.21863349365,-0.218727046974,-0.218820598288,-0.21891414759,-0.21900769488,-0.219101240157,-0.21919478342,-0.219288324668,-0.219381863901,-0.219475401117,-0.219568936315,-0.219662469496,-0.219756000657,-0.219849529799,-0.219943056919,-0.220036582018,-0.220130105095,-0.220223626148,-0.220317145177,-0.22041066218,-0.220504177158,-0.220597690109,-0.220691201032,-0.220784709927,-0.220878216792,-0.220971721627,-0.221065224431,-0.221158725203,-0.221252223942,-0.221345720647,-0.221439215318,-0.221532707953,-0.221626198552,-0.221719687114,-0.221813173638,-0.221906658123,-0.222000140568,-0.222093620973,-0.222187099337,-0.222280575658,-0.222374049935,-0.222467522169,-0.222560992358,-0.222654460502,-0.222747926598,-0.222841390647,-0.222934852648,-0.2230283126,-0.223121770502,-0.223215226353,-0.223308680152,-0.223402131898,-0.223495581591,-0.22358902923,-0.223682474813,-0.223775918341,-0.223869359811,-0.223962799224,-0.224056236578,-0.224149671873,-0.224243105107,-0.22433653628,-0.224429965392,-0.22452339244,-0.224616817424,-0.224710240344,-0.224803661198,-0.224897079986,-0.224990496707,-0.22508391136,-0.225177323944,-0.225270734458,-0.225364142901,-0.225457549273,-0.225550953572,-0.225644355799,-0.225737755951,-0.225831154028,-0.22592455003,-0.226017943954,-0.226111335802,-0.226204725571,-0.22629811326,-0.22639149887,-0.226484882399,-0.226578263846,-0.22667164321,-0.226765020491,-0.226858395687,-0.226951768798,-0.227045139823,-0.227138508761,-0.227231875611,-0.227325240373,-0.227418603045,-0.227511963627,-0.227605322117,-0.227698678516,-0.227792032821,-0.227885385033,-0.22797873515,-0.228072083171,-0.228165429096,-0.228258772924,-0.228352114653,-0.228445454284,-0.228538791815,-0.228632127245,-0.228725460574,-0.2288187918,-0.228912120923,-0.229005447942,-0.229098772856,-0.229192095664,-0.229285416365,-0.229378734959,-0.229472051444,-0.229565365821,-0.229658678087,-0.229751988242,-0.229845296285,-0.229938602216,-0.230031906033,-0.230125207735,-0.230218507323,-0.230311804794,-0.230405100148,-0.230498393385,-0.230591684502,-0.230684973501,-0.230778260378,-0.230871545135,-0.230964827769,-0.231058108281,-0.231151386668,-0.231244662931,-0.231337937069,-0.231431209079,-0.231524478963,-0.231617746719,-0.231711012345,-0.231804275842,-0.231897537208,-0.231990796442,-0.232084053545,-0.232177308513,-0.232270561348,-0.232363812048,-0.232457060612,-0.232550307039,-0.232643551328,-0.23273679348,-0.232830033492,-0.232923271363,-0.233016507094,-0.233109740683,-0.233202972129,-0.233296201432,-0.233389428591,-0.233482653604,-0.233575876471,-0.233669097191,-0.233762315763,-0.233855532186,-0.23394874646,-0.234041958584,-0.234135168556,-0.234228376376,-0.234321582043,-0.234414785556,-0.234507986915,-0.234601186118,-0.234694383165,-0.234787578054,-0.234880770785,-0.234973961358,-0.23506714977,-0.235160336022,-0.235253520112,-0.23534670204,-0.235439881805,-0.235533059405,-0.23562623484,-0.23571940811,-0.235812579213,-0.235905748149,-0.235998914916,-0.236092079513,-0.236185241941,-0.236278402198,-0.236371560283,-0.236464716195,-0.236557869934,-0.236651021498,-0.236744170887,-0.2368373181,-0.236930463136,-0.237023605994,-0.237116746674,-0.237209885174,-0.237303021494,-0.237396155632,-0.237489287588,-0.237582417362,-0.237675544951,-0.237768670356,-0.237861793575,-0.237954914608,-0.238048033454,-0.238141150112,-0.23823426458,-0.238327376859,-0.238420486948,-0.238513594844,-0.238606700549,-0.23869980406,-0.238792905377,-0.238886004499,-0.238979101425,-0.239072196155,-0.239165288687,-0.239258379021,-0.239351467156,-0.239444553091,-0.239537636824,-0.239630718356,-0.239723797685,-0.239816874811,-0.239909949733,-0.240003022449,-0.240096092959,-0.240189161262,-0.240282227358,-0.240375291244,-0.240468352922,-0.240561412389,-0.240654469645,-0.240747524689,-0.24084057752,-0.240933628137,-0.241026676539,-0.241119722726,-0.241212766697,-0.241305808451,-0.241398847986,-0.241491885303,-0.2415849204,-0.241677953276,-0.241770983931,-0.241864012364,-0.241957038573,-0.242050062558,-0.242143084319,-0.242236103854,-0.242329121162,-0.242422136243,-0.242515149095,-0.242608159718,-0.242701168112,-0.242794174274,-0.242887178205,-0.242980179903,-0.243073179368,-0.243166176599,-0.243259171594,-0.243352164353,-0.243445154876,-0.243538143161,-0.243631129207,-0.243724113014,-0.24381709458,-0.243910073906,-0.24400305099,-0.24409602583,-0.244188998427,-0.24428196878,-0.244374936887,-0.244467902748,-0.244560866362,-0.244653827727,-0.244746786844,-0.244839743712,-0.244932698329,-0.245025650694,-0.245118600807,-0.245211548668,-0.245304494274,-0.245397437625,-0.245490378721,-0.245583317561,-0.245676254142,-0.245769188466,-0.245862120531,-0.245955050336,-0.24604797788,-0.246140903162,-0.246233826182,-0.246326746939,-0.246419665431,-0.246512581659,-0.24660549562,-0.246698407315,-0.246791316742,-0.246884223901,-0.24697712879,-0.247070031409,-0.247162931758,-0.247255829834,-0.247348725638,-0.247441619168,-0.247534510423,-0.247627399404,-0.247720286108,-0.247813170535,-0.247906052685,-0.247998932555,-0.248091810146,-0.248184685457,-0.248277558487,-0.248370429234,-0.248463297698,-0.248556163879,-0.248649027775,-0.248741889385,-0.248834748709,-0.248927605746,-0.249020460494,-0.249113312954,-0.249206163124,-0.249299011003,-0.249391856591,-0.249484699886,-0.249577540889,-0.249670379597,-0.24976321601,-0.249856050127,-0.249948881948,-0.250041711471,-0.250134538696,-0.250227363622,-0.250320186248,-0.250413006573,-0.250505824596,-0.250598640317,-0.250691453734,-0.250784264847,-0.250877073654,-0.250969880156,-0.251062684351,-0.251155486238,-0.251248285816,-0.251341083085,-0.251433878044,-0.251526670692,-0.251619461028,-0.25171224905,-0.25180503476,-0.251897818154,-0.251990599233,-0.252083377996,-0.252176154442,-0.25226892857,-0.25236170038,-0.252454469869,-0.252547237038,-0.252640001886,-0.252732764411,-0.252825524613,-0.252918282492,-0.253011038046,-0.253103791274,-0.253196542175,-0.25328929075,-0.253382036996,-0.253474780913,-0.2535675225,-0.253660261756,-0.253752998681,-0.253845733273,-0.253938465532,-0.254031195457,-0.254123923047,-0.254216648301,-0.254309371219,-0.254402091799,-0.25449481004,-0.254587525942,-0.254680239504,-0.254772950725,-0.254865659605,-0.254958366141,-0.255051070334,-0.255143772183,-0.255236471686,-0.255329168844,-0.255421863654,-0.255514556117,-0.255607246231,-0.255699933995,-0.25579261941,-0.255885302473,-0.255977983184,-0.256070661542,-0.256163337546,-0.256256011196,-0.25634868249,-0.256441351428,-0.256534018009,-0.256626682232,-0.256719344096,-0.2568120036,-0.256904660743,-0.256997315526,-0.257089967946,-0.257182618003,-0.257275265696,-0.257367911024,-0.257460553986,-0.257553194582,-0.257645832811,-0.257738468671,-0.257831102162,-0.257923733283,-0.258016362034,-0.258108988413,-0.258201612419,-0.258294234052,-0.258386853311,-0.258479470195,-0.258572084703,-0.258664696834,-0.258757306588,-0.258849913963,-0.258942518959,-0.259035121575,-0.25912772181,-0.259220319663,-0.259312915133,-0.25940550822,-0.259498098922,-0.259590687239,-0.25968327317,-0.259775856714,-0.25986843787,-0.259961016637,-0.260053593015,-0.260146167003,-0.2602387386,-0.260331307804,-0.260423874615,-0.260516439033,-0.260609001056,-0.260701560684,-0.260794117915,-0.260886672749,-0.260979225186,-0.261071775223,-0.26116432286,-0.261256868097,-0.261349410933,-0.261441951366,-0.261534489397,-0.261627025023,-0.261719558244,-0.26181208906,-0.261904617469,-0.261997143471,-0.262089667065,-0.262182188249,-0.262274707024,-0.262367223388,-0.26245973734,-0.26255224888,-0.262644758006,-0.262737264719,-0.262829769016,-0.262922270897,-0.263014770362,-0.263107267409,-0.263199762037,-0.263292254247,-0.263384744036,-0.263477231404,-0.263569716351,-0.263662198875,-0.263754678975,-0.263847156651,-0.263939631901,-0.264032104726,-0.264124575124,-0.264217043093,-0.264309508635,-0.264401971746,-0.264494432428,-0.264586890678,-0.264679346496,-0.264771799882,-0.264864250833,-0.26495669935,-0.265049145432,-0.265141589077,-0.265234030286,-0.265326469056,-0.265418905387,-0.265511339279,-0.26560377073,-0.26569619974,-0.265788626308,-0.265881050432,-0.265973472113,-0.266065891349,-0.266158308139,-0.266250722483,-0.266343134379,-0.266435543828,-0.266527950827,-0.266620355376,-0.266712757475,-0.266805157122,-0.266897554317,-0.266989949058,-0.267082341345,-0.267174731178,-0.267267118554,-0.267359503474,-0.267451885937,-0.267544265941,-0.267636643486,-0.26772901857,-0.267821391194,-0.267913761356,-0.268006129056,-0.268098494292,-0.268190857063,-0.26828321737,-0.268375575211,-0.268467930584,-0.26856028349,-0.268652633928,-0.268744981896,-0.268837327394,-0.26892967042,-0.269022010975,-0.269114349057,-0.269206684665,-0.269299017799,-0.269391348458,-0.26948367664,-0.269576002346,-0.269668325573,-0.269760646322,-0.269852964591,-0.269945280379,-0.270037593687,-0.270129904512,-0.270222212854,-0.270314518713,-0.270406822087,-0.270499122975,-0.270591421377,-0.270683717291,-0.270776010718,-0.270868301656,-0.270960590104,-0.271052876061,-0.271145159527,-0.2712374405,-0.271329718981,-0.271421994967,-0.271514268459,-0.271606539455,-0.271698807954,-0.271791073956,-0.271883337459,-0.271975598464,-0.272067856969,-0.272160112972,-0.272252366475,-0.272344617474,-0.272436865971,-0.272529111963,-0.27262135545,-0.272713596431,-0.272805834906,-0.272898070873,-0.272990304331,-0.273082535281,-0.27317476372,-0.273266989648,-0.273359213064,-0.273451433968,-0.273543652358,-0.273635868234,-0.273728081595,-0.27382029244,-0.273912500767,-0.274004706577,-0.274096909869,-0.274189110641,-0.274281308892,-0.274373504623,-0.274465697831,-0.274557888517,-0.274650076679,-0.274742262317,-0.274834445429,-0.274926626015,-0.275018804074,-0.275110979605,-0.275203152607,-0.275295323079,-0.275387491021,-0.275479656432,-0.275571819311,-0.275663979657,-0.275756137468,-0.275848292746,-0.275940445487,-0.276032595692,-0.27612474336,-0.27621688849,-0.276309031081,-0.276401171132,-0.276493308643,-0.276585443612,-0.276677576039,-0.276769705923,-0.276861833262,-0.276953958057,-0.277046080306,-0.277138200009,-0.277230317164,-0.277322431771,-0.277414543828,-0.277506653336,-0.277598760293,-0.277690864699,-0.277782966552,-0.277875065852,-0.277967162597,-0.278059256787,-0.278151348422,-0.2782434375,-0.27833552402,-0.278427607982,-0.278519689385,-0.278611768228,-0.278703844509,-0.278795918229,-0.278887989387,-0.27898005798,-0.27907212401,-0.279164187474,-0.279256248372,-0.279348306704,-0.279440362467,-0.279532415663,-0.279624466288,-0.279716514344,-0.279808559828,-0.279900602741,-0.27999264308,-0.280084680846,-0.280176716038,-0.280268748654,-0.280360778694,-0.280452806157,-0.280544831042,-0.280636853349,-0.280728873076,-0.280820890222,-0.280912904788,-0.281004916771,-0.281096926171,-0.281188932988,-0.281280937219,-0.281372938866,-0.281464937926,-0.281556934399,-0.281648928284,-0.28174091958,-0.281832908286,-0.281924894402,-0.282016877926,-0.282108858858,-0.282200837197,-0.282292812942,-0.282384786093,-0.282476756647,-0.282568724606,-0.282660689967,-0.282752652729,-0.282844612893,-0.282936570457,-0.28302852542,-0.283120477782,-0.283212427541,-0.283304374697,-0.283396319249,-0.283488261197,-0.283580200538,-0.283672137273,-0.2837640714,-0.283856002919,-0.283947931829,-0.284039858129,-0.284131781818,-0.284223702895,-0.28431562136,-0.284407537211,-0.284499450449,-0.284591361071,-0.284683269077,-0.284775174466,-0.284867077238,-0.284958977392,-0.285050874926,-0.28514276984,-0.285234662133,-0.285326551805,-0.285418438853,-0.285510323278,-0.285602205079,-0.285694084255,-0.285785960804,-0.285877834727,-0.285969706022,-0.286061574688,-0.286153440725,-0.286245304132,-0.286337164908,-0.286429023051,-0.286520878562,-0.286612731439,-0.286704581682,-0.286796429289,-0.286888274261,-0.286980116595,-0.287071956291,-0.287163793349,-0.287255627767,-0.287347459545,-0.287439288681,-0.287531115176,-0.287622939027,-0.287714760235,-0.287806578798,-0.287898394715,-0.287990207987,-0.288082018611,-0.288173826587,-0.288265631915,-0.288357434592,-0.288449234619,-0.288541031995,-0.288632826719,-0.288724618789,-0.288816408206,-0.288908194968,-0.288999979074,-0.289091760524,-0.289183539317,-0.289275315451,-0.289367088927,-0.289458859743,-0.289550627898,-0.289642393391,-0.289734156223,-0.289825916391,-0.289917673895,-0.290009428734,-0.290101180908,-0.290192930415,-0.290284677254,-0.290376421426,-0.290468162928,-0.290559901761,-0.290651637922,-0.290743371412,-0.29083510223,-0.290926830374,-0.291018555844,-0.291110278639,-0.291201998759,-0.291293716201,-0.291385430966,-0.291477143053,-0.291568852461,-0.291660559188,-0.291752263235,-0.2918439646,-0.291935663282,-0.292027359281,-0.292119052596,-0.292210743226,-0.292302431169,-0.292394116426,-0.292485798996,-0.292577478876,-0.292669156068,-0.292760830569,-0.29285250238,-0.292944171498,-0.293035837924,-0.293127501656,-0.293219162694,-0.293310821037,-0.293402476684,-0.293494129634,-0.293585779886,-0.293677427439,-0.293769072293,-0.293860714447,-0.2939523539,-0.29404399065,-0.294135624698,-0.294227256043,-0.294318884683,-0.294410510617,-0.294502133846,-0.294593754367,-0.294685372181,-0.294776987285,-0.294868599681,-0.294960209366,-0.295051816339,-0.295143420601,-0.29523502215,-0.295326620985,-0.295418217106,-0.295509810511,-0.295601401199,-0.295692989171,-0.295784574425,-0.29587615696,-0.295967736775,-0.29605931387,-0.296150888244,-0.296242459895,-0.296334028823,-0.296425595028,-0.296517158508,-0.296608719262,-0.29670027729,-0.296791832591,-0.296883385164,-0.296974935008,-0.297066482122,-0.297158026505,-0.297249568157,-0.297341107077,-0.297432643264,-0.297524176717,-0.297615707435,-0.297707235418,-0.297798760664,-0.297890283172,-0.297981802943,-0.298073319974,-0.298164834266,-0.298256345817,-0.298347854627,-0.298439360694,-0.298530864018,-0.298622364598,-0.298713862433,-0.298805357523,-0.298896849865,-0.298988339461,-0.299079826308,-0.299171310406,-0.299262791754,-0.299354270352,-0.299445746198,-0.299537219291,-0.299628689631,-0.299720157217,-0.299811622048,-0.299903084124,-0.299994543442,-0.300086000003,-0.300177453806,-0.30026890485,-0.300360353133,-0.300451798656,-0.300543241417,-0.300634681416,-0.300726118651,-0.300817553122,-0.300908984828,-0.301000413768,-0.301091839941,-0.301183263347,-0.301274683984,-0.301366101852,-0.30145751695,-0.301548929277,-0.301640338833,-0.301731745615,-0.301823149625,-0.301914550859,-0.302005949319,-0.302097345003,-0.30218873791,-0.302280128039,-0.30237151539,-0.302462899962,-0.302554281753,-0.302645660763,-0.302737036992,-0.302828410438,-0.3029197811,-0.303011148978,-0.30310251407,-0.303193876377,-0.303285235897,-0.303376592629,-0.303467946572,-0.303559297726,-0.30365064609,-0.303741991662,-0.303833334443,-0.303924674431,-0.304016011625,-0.304107346025,-0.30419867763,-0.304290006438,-0.30438133245,-0.304472655663,-0.304563976079,-0.304655293694,-0.304746608509,-0.304837920523,-0.304929229735,-0.305020536145,-0.30511183975,-0.305203140551,-0.305294438547,-0.305385733736,-0.305477026119,-0.305568315693,-0.305659602459,-0.305750886415,-0.305842167561,-0.305933445896,-0.306024721418,-0.306115994128,-0.306207264024,-0.306298531105,-0.306389795371,-0.30648105682,-0.306572315453,-0.306663571267,-0.306754824263,-0.306846074439,-0.306937321795,-0.307028566329,-0.307119808042,-0.307211046931,-0.307302282996,-0.307393516237,-0.307484746652,-0.307575974241,-0.307667199003,-0.307758420937,-0.307849640042,-0.307940856317,-0.308032069761,-0.308123280375,-0.308214488156,-0.308305693104,-0.308396895218,-0.308488094498,-0.308579290942,-0.308670484549,-0.308761675319,-0.308852863252,-0.308944048345,-0.309035230598,-0.309126410011,-0.309217586583,-0.309308760312,-0.309399931198,-0.309491099241,-0.309582264438,-0.30967342679,-0.309764586295,-0.309855742954,-0.309946896764,-0.310038047725,-0.310129195836,-0.310220341096,-0.310311483506,-0.310402623062,-0.310493759766,-0.310584893616,-0.31067602461,-0.31076715275,-0.310858278032,-0.310949400458,-0.311040520025,-0.311131636733,-0.311222750581,-0.311313861569,-0.311404969695,-0.311496074958,-0.311587177359,-0.311678276895,-0.311769373567,-0.311860467372,-0.311951558312,-0.312042646384,-0.312133731587,-0.312224813922,-0.312315893386,-0.31240696998,-0.312498043703,-0.312589114553,-0.312680182529,-0.312771247632,-0.31286230986,-0.312953369212,-0.313044425687,-0.313135479285,-0.313226530004,-0.313317577845,-0.313408622805,-0.313499664885,-0.313590704083,-0.313681740399,-0.313772773831,-0.31386380438,-0.313954832043,-0.31404585682,-0.314136878711,-0.314227897714,-0.314318913829,-0.314409927055,-0.314500937391,-0.314591944836,-0.31468294939,-0.314773951051,-0.314864949818,-0.314955945692,-0.31504693867,-0.315137928753,-0.315228915938,-0.315319900227,-0.315410881617,-0.315501860108,-0.315592835698,-0.315683808388,-0.315774778176,-0.315865745062,-0.315956709045,-0.316047670123,-0.316138628296,-0.316229583563,-0.316320535923,-0.316411485376,-0.316502431921,-0.316593375556,-0.316684316281,-0.316775254096,-0.316866188998,-0.316957120989,-0.317048050065,-0.317138976228,-0.317229899475,-0.317320819806,-0.317411737221,-0.317502651718,-0.317593563297,-0.317684471956,-0.317775377696,-0.317866280514,-0.317957180411,-0.318048077385,-0.318138971436,-0.318229862562,-0.318320750763,-0.318411636039,-0.318502518387,-0.318593397808,-0.318684274301,-0.318775147864,-0.318866018497,-0.318956886199,-0.31904775097,-0.319138612808,-0.319229471712,-0.319320327682,-0.319411180717,-0.319502030816,-0.319592877978,-0.319683722203,-0.319774563489,-0.319865401836,-0.319956237242,-0.320047069708,-0.320137899232,-0.320228725813,-0.320319549451,-0.320410370144,-0.320501187893,-0.320592002695,-0.320682814551,-0.320773623458,-0.320864429418,-0.320955232428,-0.321046032488,-0.321136829597,-0.321227623754,-0.321318414958,-0.321409203209,-0.321499988506,-0.321590770847,-0.321681550233,-0.321772326662,-0.321863100133,-0.321953870645,-0.322044638198,-0.322135402791,-0.322226164423,-0.322316923094,-0.322407678801,-0.322498431545,-0.322589181325,-0.322679928139,-0.322770671988,-0.322861412869,-0.322952150783,-0.323042885729,-0.323133617705,-0.323224346711,-0.323315072746,-0.323405795809,-0.3234965159,-0.323587233016,-0.323677947159,-0.323768658326,-0.323859366518,-0.323950071732,-0.324040773969,-0.324131473228,-0.324222169507,-0.324312862805,-0.324403553123,-0.324494240459,-0.324584924813,-0.324675606182,-0.324766284568,-0.324856959968,-0.324947632382,-0.32503830181,-0.325128968249,-0.3252196317,-0.325310292162,-0.325400949634,-0.325491604115,-0.325582255603,-0.325672904099,-0.325763549602,-0.32585419211,-0.325944831623,-0.32603546814,-0.326126101661,-0.326216732183,-0.326307359707,-0.326397984232,-0.326488605756,-0.32657922428,-0.326669839801,-0.32676045232,-0.326851061836,-0.326941668347,-0.327032271853,-0.327122872352,-0.327213469845,-0.327304064331,-0.327394655808,-0.327485244275,-0.327575829733,-0.327666412179,-0.327756991613,-0.327847568035,-0.327938141443,-0.328028711837,-0.328119279216,-0.328209843579,-0.328300404925,-0.328390963253,-0.328481518563,-0.328572070854,-0.328662620124,-0.328753166373,-0.328843709601,-0.328934249806,-0.329024786987,-0.329115321144,-0.329205852276,-0.329296380382,-0.329386905461,-0.329477427512,-0.329567946535,-0.329658462529,-0.329748975492,-0.329839485424,-0.329929992325,-0.330020496193,-0.330110997028,-0.330201494828,-0.330291989593,-0.330382481322,-0.330472970014,-0.330563455669,-0.330653938285,-0.330744417862,-0.330834894399,-0.330925367895,-0.331015838349,-0.33110630576,-0.331196770128,-0.331287231451,-0.33137768973,-0.331468144962,-0.331558597148,-0.331649046286,-0.331739492376,-0.331829935416,-0.331920375407,-0.332010812346,-0.332101246234,-0.332191677069,-0.33228210485,-0.332372529578,-0.33246295125,-0.332553369866,-0.332643785426,-0.332734197927,-0.332824607371,-0.332915013755,-0.333005417079,-0.333095817343,-0.333186214544,-0.333276608683,-0.333366999759,-0.33345738777,-0.333547772716,-0.333638154596,-0.33372853341,-0.333818909156,-0.333909281834,-0.333999651442,-0.33409001798,-0.334180381448,-0.334270741844,-0.334361099167,-0.334451453417,-0.334541804592,-0.334632152693,-0.334722497718,-0.334812839666,-0.334903178536,-0.334993514328,-0.335083847041,-0.335174176674,-0.335264503226,-0.335354826697,-0.335445147085,-0.335535464389,-0.335625778609,-0.335716089745,-0.335806397794,-0.335896702757,-0.335987004633,-0.33607730342,-0.336167599118,-0.336257891726,-0.336348181243,-0.336438467668,-0.336528751001,-0.336619031241,-0.336709308387,-0.336799582437,-0.336889853392,-0.33698012125,-0.337070386011,-0.337160647674,-0.337250906237,-0.337341161701,-0.337431414063,-0.337521663324,-0.337611909483,-0.337702152538,-0.33779239249,-0.337882629336,-0.337972863077,-0.338063093711,-0.338153321238,-0.338243545656,-0.338333766966,-0.338423985165,-0.338514200254,-0.338604412231,-0.338694621096,-0.338784826848,-0.338875029485,-0.338965229008,-0.339055425415,-0.339145618705,-0.339235808879,-0.339325995934,-0.33941617987,-0.339506360686,-0.339596538381,-0.339686712955,-0.339776884407,-0.339867052735,-0.33995721794,-0.340047380019,-0.340137538974,-0.340227694801,-0.340317847501,-0.340407997074,-0.340498143517,-0.34058828683,-0.340678427013,-0.340768564064,-0.340858697983,-0.340948828769,-0.341038956421,-0.341129080939,-0.34121920232,-0.341309320566,-0.341399435674,-0.341489547644,-0.341579656475,-0.341669762166,-0.341759864717,-0.341849964126,-0.341940060393,-0.342030153518,-0.342120243498,-0.342210330333,-0.342300414024,-0.342390494567,-0.342480571964,-0.342570646212,-0.342660717312,-0.342750785262,-0.342840850062,-0.34293091171,-0.343020970206,-0.343111025549,-0.343201077738,-0.343291126773,-0.343381172652,-0.343471215375,-0.343561254941,-0.343651291349,-0.343741324598,-0.343831354687,-0.343921381616,-0.344011405384,-0.34410142599,-0.344191443433,-0.344281457712,-0.344371468826,-0.344461476776,-0.344551481559,-0.344641483174,-0.344731481622,-0.344821476902,-0.344911469012,-0.345001457951,-0.345091443719,-0.345181426316,-0.345271405739,-0.345361381989,-0.345451355064,-0.345541324964,-0.345631291688,-0.345721255235,-0.345811215604,-0.345901172794,-0.345991126805,-0.346081077636,-0.346171025285,-0.346260969753,-0.346350911038,-0.346440849139,-0.346530784056,-0.346620715788,-0.346710644334,-0.346800569692,-0.346890491863,-0.346980410846,-0.347070326639,-0.347160239242,-0.347250148654,-0.347340054874,-0.347429957901,-0.347519857735,-0.347609754375,-0.347699647819,-0.347789538067,-0.347879425119,-0.347969308973,-0.348059189629,-0.348149067085,-0.348238941341,-0.348328812396,-0.348418680249,-0.3485085449,-0.348598406348,-0.348688264591,-0.348778119629,-0.348867971461,-0.348957820087,-0.349047665505,-0.349137507714,-0.349227346714,-0.349317182505,-0.349407015084,-0.349496844452,-0.349586670607,-0.349676493549,-0.349766313277,-0.34985612979,-0.349945943087,-0.350035753168,-0.350125560031,-0.350215363675,-0.350305164101,-0.350394961307,-0.350484755292,-0.350574546055,-0.350664333596,-0.350754117913,-0.350843899007,-0.350933676876,-0.351023451519,-0.351113222935,-0.351202991125,-0.351292756086,-0.351382517818,-0.35147227632,-0.351562031591,-0.351651783631,-0.351741532439,-0.351831278013,-0.351921020354,-0.35201075946,-0.35210049533,-0.352190227964,-0.35227995736,-0.352369683519,-0.352459406438,-0.352549126118,-0.352638842557,-0.352728555755,-0.352818265711,-0.352907972424,-0.352997675892,-0.353087376116,-0.353177073095,-0.353266766827,-0.353356457312,-0.353446144549,-0.353535828538,-0.353625509277,-0.353715186765,-0.353804861002,-0.353894531987,-0.353984199719,-0.354073864197,-0.35416352542,-0.354253183389,-0.354342838101,-0.354432489556,-0.354522137753,-0.354611782691,-0.35470142437,-0.354791062789,-0.354880697946,-0.354970329842,-0.355059958474,-0.355149583843,-0.355239205948,-0.355328824787,-0.35541844036,-0.355508052666,-0.355597661705,-0.355687267475,-0.355776869975,-0.355866469205,-0.355956065165,-0.356045657852,-0.356135247267,-0.356224833408,-0.356314416274,-0.356403995866,-0.356493572182,-0.35658314522,-0.356672714982,-0.356762281464,-0.356851844668,-0.356941404591,-0.357030961233,-0.357120514594,-0.357210064672,-0.357299611467,-0.357389154977,-0.357478695203,-0.357568232142,-0.357657765795,-0.35774729616,-0.357836823237,-0.357926347025,-0.358015867523,-0.35810538473,-0.358194898645,-0.358284409268,-0.358373916598,-0.358463420634,-0.358552921374,-0.358642418819,-0.358731912968,-0.358821403819,-0.358910891371,-0.359000375625,-0.359089856579,-0.359179334232,-0.359268808584,-0.359358279633,-0.35944774738,-0.359537211822,-0.359626672959,-0.359716130791,-0.359805585317,-0.359895036535,-0.359984484445,-0.360073929046,-0.360163370338,-0.360252808319,-0.360342242988,-0.360431674346,-0.36052110239,-0.360610527121,-0.360699948537,-0.360789366637,-0.360878781421,-0.360968192888,-0.361057601037,-0.361147005867,-0.361236407378,-0.361325805568,-0.361415200438,-0.361504591985,-0.361593980209,-0.361683365109,-0.361772746685,-0.361862124936,-0.36195149986,-0.362040871458,-0.362130239727,-0.362219604668,-0.36230896628,-0.362398324561,-0.362487679511,-0.36257703113,-0.362666379415,-0.362755724367,-0.362845065985,-0.362934404268,-0.363023739214,-0.363113070824,-0.363202399096,-0.363291724029,-0.363381045623,-0.363470363877,-0.36355967879,-0.363648990362,-0.363738298591,-0.363827603476,-0.363916905017,-0.364006203213,-0.364095498064,-0.364184789567,-0.364274077723,-0.364363362531,-0.364452643989,-0.364541922098,-0.364631196856,-0.364720468262,-0.364809736316,-0.364899001016,-0.364988262363,-0.365077520354,-0.36516677499,-0.365256026269,-0.365345274191,-0.365434518755,-0.36552375996,-0.365612997805,-0.365702232289,-0.365791463412,-0.365880691173,-0.36596991557,-0.366059136604,-0.366148354272,-0.366237568576,-0.366326779513,-0.366415987082,-0.366505191284,-0.366594392117,-0.36668358958,-0.366772783673,-0.366861974394,-0.366951161743,-0.36704034572,-0.367129526322,-0.36721870355,-0.367307877403,-0.367397047879,-0.367486214979,-0.3675753787,-0.367664539043,-0.367753696007,-0.36784284959,-0.367931999792,-0.368021146612,-0.368110290049,-0.368199430102,-0.368288566771,-0.368377700055,-0.368466829953,-0.368555956464,-0.368645079588,-0.368734199323,-0.368823315668,-0.368912428624,-0.369001538188,-0.369090644361,-0.369179747141,-0.369268846527,-0.36935794252,-0.369447035117,-0.369536124318,-0.369625210123,-0.36971429253,-0.369803371539,-0.369892447149,-0.369981519359,-0.370070588168,-0.370159653575,-0.37024871558,-0.370337774182,-0.370426829379,-0.370515881172,-0.370604929559,-0.37069397454,-0.370783016113,-0.370872054278,-0.370961089034,-0.37105012038,-0.371139148316,-0.37122817284,-0.371317193952,-0.371406211651,-0.371495225936,-0.371584236806,-0.371673244261,-0.371762248299,-0.37185124892,-0.371940246124,-0.372029239908,-0.372118230273,-0.372207217218,-0.372296200741,-0.372385180842,-0.37247415752,-0.372563130775,-0.372652100605,-0.37274106701,-0.372830029988,-0.37291898954,-0.373007945663,-0.373096898359,-0.373185847624,-0.37327479346,-0.373363735864,-0.373452674837,-0.373541610377,-0.373630542483,-0.373719471155,-0.373808396392,-0.373897318193,-0.373986236557,-0.374075151483,-0.374164062971,-0.37425297102,-0.374341875629,-0.374430776797,-0.374519674523,-0.374608568807,-0.374697459647,-0.374786347044,-0.374875230995,-0.374964111501,-0.37505298856,-0.375141862171,-0.375230732334,-0.375319599049,-0.375408462313,-0.375497322127,-0.375586178489,-0.375675031399,-0.375763880856,-0.375852726859,-0.375941569407,-0.3760304085,-0.376119244136,-0.376208076315,-0.376296905036,-0.376385730298,-0.3764745521,-0.376563370442,-0.376652185323,-0.376740996741,-0.376829804697,-0.376918609189,-0.377007410216,-0.377096207778,-0.377185001874,-0.377273792503,-0.377362579664,-0.377451363356,-0.377540143579,-0.377628920332,-0.377717693613,-0.377806463423,-0.37789522976,-0.377983992623,-0.378072752012,-0.378161507926,-0.378250260364,-0.378339009325,-0.378427754809,-0.378516496814,-0.37860523534,-0.378693970385,-0.37878270195,-0.378871430034,-0.378960154634,-0.379048875752,-0.379137593385,-0.379226307533,-0.379315018196,-0.379403725372,-0.37949242906,-0.37958112926,-0.379669825972,-0.379758519193,-0.379847208924,-0.379935895163,-0.38002457791,-0.380113257164,-0.380201932924,-0.38029060519,-0.380379273959,-0.380467939233,-0.380556601009,-0.380645259287,-0.380733914067,-0.380822565346,-0.380911213126,-0.380999857404,-0.38108849818,-0.381177135453,-0.381265769222,-0.381354399487,-0.381443026247,-0.3815316495,-0.381620269247,-0.381708885485,-0.381797498215,-0.381886107436,-0.381974713147,-0.382063315346,-0.382151914034,-0.382240509209,-0.38232910087,-0.382417689017,-0.382506273649,-0.382594854766,-0.382683432365,-0.382772006447,-0.382860577011,-0.382949144055,-0.383037707579,-0.383126267583,-0.383214824065,-0.383303377024,-0.383391926461,-0.383480472373,-0.38356901476,-0.383657553622,-0.383746088957,-0.383834620765,-0.383923149045,-0.384011673796,-0.384100195017,-0.384188712707,-0.384277226867,-0.384365737494,-0.384454244587,-0.384542748148,-0.384631248173,-0.384719744663,-0.384808237617,-0.384896727034,-0.384985212912,-0.385073695252,-0.385162174053,-0.385250649313,-0.385339121032,-0.38542758921,-0.385516053844,-0.385604514935,-0.385692972481,-0.385781426482,-0.385869876938,-0.385958323846,-0.386046767207,-0.386135207019,-0.386223643282,-0.386312075995,-0.386400505157,-0.386488930767,-0.386577352825,-0.386665771329,-0.38675418628,-0.386842597675,-0.386931005514,-0.387019409797,-0.387107810523,-0.38719620769,-0.387284601299,-0.387372991347,-0.387461377835,-0.387549760761,-0.387638140125,-0.387726515926,-0.387814888164,-0.387903256836,-0.387991621943,-0.388079983483,-0.388168341457,-0.388256695862,-0.388345046699,-0.388433393966,-0.388521737663,-0.388610077788,-0.388698414342,-0.388786747322,-0.388875076729,-0.388963402562,-0.389051724819,-0.3891400435,-0.389228358604,-0.389316670131,-0.389404978079,-0.389493282448,-0.389581583236,-0.389669880444,-0.38975817407,-0.389846464113,-0.389934750573,-0.390023033449,-0.39011131274,-0.390199588444,-0.390287860563,-0.390376129094,-0.390464394036,-0.39055265539,-0.390640913153,-0.390729167326,-0.390817417908,-0.390905664897,-0.390993908293,-0.391082148095,-0.391170384302,-0.391258616914,-0.391346845929,-0.391435071348,-0.391523293168,-0.391611511389,-0.391699726011,-0.391787937033,-0.391876144453,-0.391964348271,-0.392052548486,-0.392140745098,-0.392228938105,-0.392317127507,-0.392405313303,-0.392493495492,-0.392581674073,-0.392669849046,-0.392758020409,-0.392846188162,-0.392934352304,-0.393022512835,-0.393110669753,-0.393198823057,-0.393286972747,-0.393375118823,-0.393463261282,-0.393551400125,-0.39363953535,-0.393727666957,-0.393815794945,-0.393903919314,-0.393992040061,-0.394080157187,-0.394168270691,-0.394256380571,-0.394344486828,-0.39443258946,-0.394520688466,-0.394608783847,-0.394696875599,-0.394784963724,-0.394873048221,-0.394961129087,-0.395049206323,-0.395137279928,-0.395225349901,-0.395313416241,-0.395401478948,-0.39548953802,-0.395577593457,-0.395665645257,-0.395753693421,-0.395841737947,-0.395929778835,-0.396017816083,-0.396105849692,-0.396193879659,-0.396281905985,-0.396369928668,-0.396457947707,-0.396545963103,-0.396633974854,-0.396721982958,-0.396809987417,-0.396897988228,-0.39698598539,-0.397073978904,-0.397161968768,-0.397249954981,-0.397337937543,-0.397425916452,-0.397513891709,-0.397601863311,-0.397689831259,-0.397777795552,-0.397865756188,-0.397953713167,-0.398041666488,-0.39812961615,-0.398217562153,-0.398305504496,-0.398393443177,-0.398481378197,-0.398569309554,-0.398657237247,-0.398745161276,-0.398833081639,-0.398920998337,-0.399008911368,-0.399096820731,-0.399184726426,-0.399272628452,-0.399360526807,-0.399448421492,-0.399536312505,-0.399624199846,-0.399712083513,-0.399799963506,-0.399887839825,-0.399975712468,-0.400063581434,-0.400151446723,-0.400239308334,-0.400327166266,-0.400415020518,-0.40050287109,-0.40059071798,-0.400678561188,-0.400766400714,-0.400854236555,-0.400942068712,-0.401029897184,-0.401117721969,-0.401205543067,-0.401293360478,-0.4013811742,-0.401468984233,-0.401556790575,-0.401644593226,-0.401732392186,-0.401820187453,-0.401907979026,-0.401995766905,-0.40208355109,-0.402171331578,-0.402259108369,-0.402346881464,-0.402434650859,-0.402522416556,-0.402610178553,-0.402697936849,-0.402785691444,-0.402873442336,-0.402961189525,-0.40304893301,-0.403136672791,-0.403224408866,-0.403312141235,-0.403399869896,-0.403487594849,-0.403575316094,-0.403663033629,-0.403750747454,-0.403838457568,-0.403926163969,-0.404013866658,-0.404101565633,-0.404189260894,-0.404276952439,-0.404364640269,-0.404452324382,-0.404540004777,-0.404627681453,-0.40471535441,-0.404803023648,-0.404890689164,-0.404978350959,-0.405066009031,-0.40515366338,-0.405241314005,-0.405328960905,-0.405416604079,-0.405504243527,-0.405591879248,-0.40567951124,-0.405767139503,-0.405854764037,-0.40594238484,-0.406030001912,-0.406117615252,-0.406205224859,-0.406292830732,-0.40638043287,-0.406468031273,-0.40655562594,-0.40664321687,-0.406730804063,-0.406818387516,-0.40690596723,-0.406993543204,-0.407081115438,-0.407168683929,-0.407256248677,-0.407343809683,-0.407431366944,-0.40751892046,-0.40760647023,-0.407694016253,-0.407781558529,-0.407869097057,-0.407956631836,-0.408044162865,-0.408131690143,-0.40821921367,-0.408306733445,-0.408394249466,-0.408481761734,-0.408569270247,-0.408656775004,-0.408744276005,-0.40883177325,-0.408919266736,-0.409006756463,-0.409094242431,-0.409181724639,-0.409269203086,-0.40935667777,-0.409444148692,-0.409531615851,-0.409619079245,-0.409706538874,-0.409793994737,-0.409881446833,-0.409968895162,-0.410056339722,-0.410143780514,-0.410231217535,-0.410318650785,-0.410406080264,-0.410493505971,-0.410580927905,-0.410668346064,-0.410755760449,-0.410843171058,-0.410930577891,-0.411017980946,-0.411105380224,-0.411192775723,-0.411280167442,-0.411367555381,-0.411454939538,-0.411542319914,-0.411629696507,-0.411717069316,-0.41180443834,-0.41189180358,-0.411979165034,-0.4120665227,-0.412153876579,-0.41224122667,-0.412328572971,-0.412415915483,-0.412503254203,-0.412590589132,-0.412677920268,-0.412765247612,-0.412852571161,-0.412939890915,-0.413027206874,-0.413114519036,-0.413201827401,-0.413289131968,-0.413376432736,-0.413463729704,-0.413551022872,-0.413638312238,-0.413725597803,-0.413812879565,-0.413900157523,-0.413987431676,-0.414074702024,-0.414161968566,-0.414249231301,-0.414336490229,-0.414423745348,-0.414510996658,-0.414598244157,-0.414685487846,-0.414772727723,-0.414859963788,-0.414947196039,-0.415034424476,-0.415121649098,-0.415208869905,-0.415296086895,-0.415383300068,-0.415470509422,-0.415557714958,-0.415644916674,-0.415732114569,-0.415819308643,-0.415906498895,-0.415993685324,-0.41608086793,-0.41616804671,-0.416255221666,-0.416342392795,-0.416429560098,-0.416516723572,-0.416603883218,-0.416691039035,-0.416778191022,-0.416865339178,-0.416952483502,-0.417039623993,-0.417126760651,-0.417213893475,-0.417301022464,-0.417388147618,-0.417475268935,-0.417562386414,-0.417649500055,-0.417736609858,-0.41782371582,-0.417910817942,-0.417997916223,-0.418085010662,-0.418172101257,-0.418259188009,-0.418346270916,-0.418433349978,-0.418520425194,-0.418607496563,-0.418694564084,-0.418781627757,-0.41886868758,-0.418955743553,-0.419042795675,-0.419129843945,-0.419216888363,-0.419303928928,-0.419390965638,-0.419477998493,-0.419565027493,-0.419652052636,-0.419739073922,-0.419826091349,-0.419913104918,-0.420000114627,-0.420087120475,-0.420174122462,-0.420261120587,-0.420348114849,-0.420435105247,-0.42052209178,-0.420609074448,-0.42069605325,-0.420783028186,-0.420869999253,-0.420956966452,-0.421043929781,-0.42113088924,-0.421217844829,-0.421304796545,-0.42139174439,-0.42147868836,-0.421565628457,-0.421652564679,-0.421739497024,-0.421826425494,-0.421913350086,-0.4220002708,-0.422087187635,-0.42217410059,-0.422261009665,-0.422347914858,-0.422434816169,-0.422521713598,-0.422608607142,-0.422695496802,-0.422782382577,-0.422869264466,-0.422956142467,-0.423043016581,-0.423129886807,-0.423216753143,-0.423303615589,-0.423390474144,-0.423477328807,-0.423564179578,-0.423651026456,-0.423737869439,-0.423824708528,-0.42391154372,-0.423998375017,-0.424085202416,-0.424172025917,-0.424258845519,-0.424345661221,-0.424432473023,-0.424519280923,-0.424606084922,-0.424692885017,-0.424779681209,-0.424866473496,-0.424953261879,-0.425040046355,-0.425126826924,-0.425213603585,-0.425300376338,-0.425387145182,-0.425473910116,-0.425560671138,-0.42564742825,-0.425734181448,-0.425820930734,-0.425907676105,-0.425994417562,-0.426081155102,-0.426167888727,-0.426254618434,-0.426341344223,-0.426428066093,-0.426514784044,-0.426601498074,-0.426688208183,-0.42677491437,-0.426861616634,-0.426948314975,-0.427035009391,-0.427121699882,-0.427208386447,-0.427295069085,-0.427381747795,-0.427468422577,-0.42755509343,-0.427641760353,-0.427728423345,-0.427815082406,-0.427901737534,-0.427988388729,-0.42807503599,-0.428161679316,-0.428248318707,-0.428334954161,-0.428421585678,-0.428508213257,-0.428594836897,-0.428681456598,-0.428768072359,-0.428854684178,-0.428941292055,-0.42902789599,-0.429114495981,-0.429201092028,-0.42928768413,-0.429374272285,-0.429460856494,-0.429547436756,-0.429634013069,-0.429720585433,-0.429807153847,-0.429893718311,-0.429980278823,-0.430066835383,-0.430153387989,-0.430239936642,-0.43032648134,-0.430413022083,-0.430499558869,-0.430586091698,-0.43067262057,-0.430759145483,-0.430845666436,-0.430932183429,-0.431018696461,-0.431105205531,-0.431191710639,-0.431278211783,-0.431364708963,-0.431451202178,-0.431537691427,-0.43162417671,-0.431710658025,-0.431797135372,-0.43188360875,-0.431970078158,-0.432056543596,-0.432143005062,-0.432229462556,-0.432315916077,-0.432402365625,-0.432488811198,-0.432575252795,-0.432661690416,-0.432748124061,-0.432834553727,-0.432920979416,-0.433007401124,-0.433093818853,-0.433180232601,-0.433266642367,-0.433353048151,-0.433439449951,-0.433525847767,-0.433612241599,-0.433698631444,-0.433785017304,-0.433871399176,-0.43395777706,-0.434044150955,-0.43413052086,-0.434216886775,-0.434303248699,-0.434389606631,-0.43447596057,-0.434562310515,-0.434648656466,-0.434734998422,-0.434821336381,-0.434907670344,-0.43499400031,-0.435080326277,-0.435166648245,-0.435252966213,-0.43533928018,-0.435425590145,-0.435511896108,-0.435598198069,-0.435684496025,-0.435770789976,-0.435857079922,-0.435943365862,-0.436029647794,-0.436115925719,-0.436202199635,-0.436288469542,-0.436374735438,-0.436460997323,-0.436547255196,-0.436633509057,-0.436719758904,-0.436806004737,-0.436892246555,-0.436978484357,-0.437064718143,-0.437150947911,-0.437237173661,-0.437323395392,-0.437409613103,-0.437495826794,-0.437582036463,-0.43766824211,-0.437754443734,-0.437840641334,-0.43792683491,-0.438013024461,-0.438099209985,-0.438185391483,-0.438271568952,-0.438357742394,-0.438443911806,-0.438530077188,-0.438616238539,-0.438702395858,-0.438788549145,-0.438874698398,-0.438960843618,-0.439046984803,-0.439133121952,-0.439219255065,-0.43930538414,-0.439391509178,-0.439477630176,-0.439563747135,-0.439649860054,-0.439735968932,-0.439822073767,-0.43990817456,-0.43999427131,-0.440080364015,-0.440166452675,-0.440252537288,-0.440338617856,-0.440424694375,-0.440510766847,-0.440596835269,-0.440682899642,-0.440768959964,-0.440855016234,-0.440941068452,-0.441027116617,-0.441113160729,-0.441199200785,-0.441285236787,-0.441371268732,-0.44145729662,-0.44154332045,-0.441629340222,-0.441715355934,-0.441801367586,-0.441887375178,-0.441973378707,-0.442059378174,-0.442145373578,-0.442231364918,-0.442317352192,-0.442403335401,-0.442489314544,-0.442575289619,-0.442661260626,-0.442747227565,-0.442833190433,-0.442919149232,-0.443005103959,-0.443091054614,-0.443177001196,-0.443262943705,-0.443348882139,-0.443434816498,-0.443520746781,-0.443606672988,-0.443692595117,-0.443778513167,-0.443864427139,-0.44395033703,-0.444036242841,-0.44412214457,-0.444208042218,-0.444293935782,-0.444379825262,-0.444465710657,-0.444551591967,-0.444637469191,-0.444723342328,-0.444809211377,-0.444895076338,-0.444980937209,-0.44506679399,-0.44515264668,-0.445238495278,-0.445324339783,-0.445410180196,-0.445496016514,-0.445581848737,-0.445667676865,-0.445753500896,-0.44583932083,-0.445925136666,-0.446010948403,-0.44609675604,-0.446182559577,-0.446268359013,-0.446354154346,-0.446439945577,-0.446525732705,-0.446611515728,-0.446697294645,-0.446783069457,-0.446868840162,-0.44695460676,-0.447040369249,-0.447126127629,-0.4472118819,-0.447297632059,-0.447383378108,-0.447469120043,-0.447554857866,-0.447640591575,-0.44772632117,-0.447812046649,-0.447897768012,-0.447983485257,-0.448069198386,-0.448154907395,-0.448240612285,-0.448326313055,-0.448412009704,-0.448497702232,-0.448583390637,-0.448669074918,-0.448754755076,-0.448840431109,-0.448926103016,-0.449011770796,-0.44909743445,-0.449183093975,-0.449268749372,-0.449354400639,-0.449440047776,-0.449525690781,-0.449611329655,-0.449696964395,-0.449782595003,-0.449868221476,-0.449953843814,-0.450039462016,-0.450125076081,-0.450210686009,-0.450296291799,-0.450381893449,-0.45046749096,-0.45055308433,-0.450638673559,-0.450724258646,-0.45080983959,-0.45089541639,-0.450980989045,-0.451066557555,-0.451152121919,-0.451237682136,-0.451323238206,-0.451408790127,-0.451494337898,-0.45157988152,-0.451665420991,-0.45175095631,-0.451836487477,-0.451922014491,-0.45200753735,-0.452093056055,-0.452178570605,-0.452264080998,-0.452349587234,-0.452435089312,-0.452520587231,-0.452606080991,-0.452691570591,-0.452777056029,-0.452862537306,-0.45294801442,-0.453033487371,-0.453118956157,-0.453204420779,-0.453289881235,-0.453375337524,-0.453460789646,-0.4535462376,-0.453631681385,-0.453717121,-0.453802556445,-0.453887987718,-0.45397341482,-0.454058837749,-0.454144256504,-0.454229671084,-0.45431508149,-0.454400487719,-0.454485889772,-0.454571287647,-0.454656681344,-0.454742070862,-0.4548274562,-0.454912837357,-0.454998214333,-0.455083587126,-0.455168955737,-0.455254320163,-0.455339680406,-0.455425036462,-0.455510388333,-0.455595736016,-0.455681079512,-0.455766418819,-0.455851753937,-0.455937084865,-0.456022411602,-0.456107734148,-0.456193052501,-0.45627836666,-0.456363676626,-0.456448982397,-0.456534283972,-0.456619581351,-0.456704874533,-0.456790163517,-0.456875448302,-0.456960728888,-0.457046005273,-0.457131277457,-0.45721654544,-0.457301809219,-0.457387068796,-0.457472324168,-0.457557575335,-0.457642822297,-0.457728065051,-0.457813303599,-0.457898537938,-0.457983768069,-0.45806899399,-0.4581542157,-0.458239433199,-0.458324646486,-0.45840985556,-0.458495060421,-0.458580261067,-0.458665457498,-0.458750649713,-0.458835837712,-0.458921021492,-0.459006201055,-0.459091376398,-0.459176547522,-0.459261714425,-0.459346877106,-0.459432035566,-0.459517189802,-0.459602339814,-0.459687485602,-0.459772627165,-0.459857764501,-0.459942897611,-0.460028026493,-0.460113151146,-0.46019827157,-0.460283387764,-0.460368499727,-0.460453607459,-0.460538710958,-0.460623810224,-0.460708905256,-0.460793996054,-0.460879082616,-0.460964164941,-0.46104924303,-0.46113431688,-0.461219386492,-0.461304451865,-0.461389512997,-0.461474569888,-0.461559622538,-0.461644670945,-0.461729715108,-0.461814755028,-0.461899790702,-0.461984822131,-0.462069849314,-0.462154872249,-0.462239890936,-0.462324905375,-0.462409915563,-0.462494921502,-0.462579923189,-0.462664920624,-0.462749913807,-0.462834902736,-0.462919887411,-0.463004867831,-0.463089843995,-0.463174815902,-0.463259783552,-0.463344746944,-0.463429706076,-0.463514660949,-0.463599611562,-0.463684557913,-0.463769500002,-0.463854437828,-0.463939371391,-0.464024300689,-0.464109225722,-0.464194146489,-0.464279062989,-0.464363975222,-0.464448883186,-0.464533786881,-0.464618686306,-0.464703581461,-0.464788472344,-0.464873358955,-0.464958241293,-0.465043119357,-0.465127993146,-0.46521286266,-0.465297727898,-0.46538258886,-0.465467445543,-0.465552297948,-0.465637146073,-0.465721989919,-0.465806829484,-0.465891664767,-0.465976495768,-0.466061322486,-0.466146144919,-0.466230963068,-0.466315776932,-0.466400586509,-0.466485391799,-0.466570192802,-0.466654989516,-0.46673978194,-0.466824570074,-0.466909353917,-0.466994133469,-0.467078908728,-0.467163679694,-0.467248446365,-0.467333208742,-0.467417966823,-0.467502720608,-0.467587470095,-0.467672215285,-0.467756956176,-0.467841692767,-0.467926425058,-0.468011153048,-0.468095876736,-0.468180596122,-0.468265311204,-0.468350021982,-0.468434728455,-0.468519430622,-0.468604128483,-0.468688822036,-0.468773511281,-0.468858196217,-0.468942876844,-0.46902755316,-0.469112225165,-0.469196892859,-0.469281556239,-0.469366215306,-0.469450870058,-0.469535520496,-0.469620166617,-0.469704808422,-0.46978944591,-0.469874079079,-0.469958707929,-0.47004333246,-0.47012795267,-0.470212568558,-0.470297180125,-0.470381787369,-0.470466390289,-0.470550988884,-0.470635583155,-0.470720173099,-0.470804758717,-0.470889340007,-0.470973916969,-0.471058489601,-0.471143057904,-0.471227621877,-0.471312181517,-0.471396736826,-0.471481287802,-0.471565834443,-0.471650376751,-0.471734914723,-0.471819448359,-0.471903977658,-0.471988502619,-0.472073023242,-0.472157539526,-0.47224205147,-0.472326559073,-0.472411062335,-0.472495561254,-0.47258005583,-0.472664546063,-0.47274903195,-0.472833513493,-0.472917990689,-0.473002463538,-0.473086932039,-0.473171396192,-0.473255855996,-0.47334031145,-0.473424762552,-0.473509209303,-0.473593651702,-0.473678089748,-0.473762523439,-0.473846952776,-0.473931377757,-0.474015798383,-0.474100214651,-0.474184626561,-0.474269034112,-0.474353437305,-0.474437836137,-0.474522230608,-0.474606620717,-0.474691006464,-0.474775387848,-0.474859764868,-0.474944137522,-0.475028505812,-0.475112869735,-0.47519722929,-0.475281584478,-0.475365935297,-0.475450281747,-0.475534623827,-0.475618961535,-0.475703294872,-0.475787623836,-0.475871948427,-0.475956268643,-0.476040584485,-0.476124895951,-0.476209203041,-0.476293505753,-0.476377804088,-0.476462098044,-0.47654638762,-0.476630672816,-0.47671495363,-0.476799230063,-0.476883502114,-0.47696776978,-0.477052033063,-0.477136291961,-0.477220546473,-0.477304796598,-0.477389042337,-0.477473283687,-0.477557520648,-0.47764175322,-0.477725981401,-0.477810205191,-0.477894424589,-0.477978639595,-0.478062850207,-0.478147056425,-0.478231258248,-0.478315455675,-0.478399648705,-0.478483837338,-0.478568021573,-0.478652201409,-0.478736376845,-0.478820547881,-0.478904714516,-0.478988876749,-0.479073034579,-0.479157188005,-0.479241337027,-0.479325481644,-0.479409621856,-0.47949375766,-0.479577889057,-0.479662016046,-0.479746138626,-0.479830256797,-0.479914370556,-0.479998479905,-0.480082584841,-0.480166685365,-0.480250781475,-0.480334873171,-0.480418960451,-0.480503043316,-0.480587121764,-0.480671195795,-0.480755265407,-0.4808393306,-0.480923391374,-0.481007447727,-0.481091499659,-0.481175547168,-0.481259590255,-0.481343628918,-0.481427663157,-0.48151169297,-0.481595718358,-0.481679739319,-0.481763755852,-0.481847767957,-0.481931775633,-0.482015778879,-0.482099777695,-0.482183772079,-0.482267762031,-0.482351747551,-0.482435728636,-0.482519705287,-0.482603677503,-0.482687645283,-0.482771608626,-0.482855567532,-0.482939521999,-0.483023472027,-0.483107417616,-0.483191358763,-0.48327529547,-0.483359227734,-0.483443155555,-0.483527078933,-0.483610997866,-0.483694912354,-0.483778822396,-0.483862727991,-0.483946629138,-0.484030525837,-0.484114418087,-0.484198305888,-0.484282189237,-0.484366068135,-0.484449942581,-0.484533812574,-0.484617678113,-0.484701539198,-0.484785395827,-0.484869248001,-0.484953095717,-0.485036938976,-0.485120777777,-0.485204612119,-0.485288442,-0.485372267421,-0.485456088381,-0.485539904878,-0.485623716912,-0.485707524483,-0.485791327589,-0.48587512623,-0.485958920404,-0.486042710112,-0.486126495353,-0.486210276124,-0.486294052427,-0.48637782426,-0.486461591622,-0.486545354513,-0.486629112932,-0.486712866877,-0.486796616349,-0.486880361346,-0.486964101868,-0.487047837914,-0.487131569483,-0.487215296574,-0.487299019187,-0.487382737321,-0.487466450975,-0.487550160148,-0.48763386484,-0.48771756505,-0.487801260776,-0.487884952019,-0.487968638778,-0.488052321051,-0.488135998838,-0.488219672138,-0.48830334095,-0.488387005274,-0.488470665109,-0.488554320454,-0.488637971309,-0.488721617671,-0.488805259542,-0.48888889692,-0.488972529804,-0.489056158193,-0.489139782087,-0.489223401485,-0.489307016386,-0.48939062679,-0.489474232695,-0.489557834101,-0.489641431007,-0.489725023413,-0.489808611317,-0.489892194719,-0.489975773617,-0.490059348012,-0.490142917903,-0.490226483288,-0.490310044167,-0.49039360054,-0.490477152405,-0.490560699761,-0.490644242608,-0.490727780946,-0.490811314773,-0.490894844088,-0.490978368891,-0.491061889181,-0.491145404957,-0.491228916219,-0.491312422966,-0.491395925197,-0.49147942291,-0.491562916107,-0.491646404784,-0.491729888943,-0.491813368582,-0.4918968437,-0.491980314297,-0.492063780372,-0.492147241923,-0.492230698951,-0.492314151455,-0.492397599433,-0.492481042886,-0.492564481811,-0.492647916209,-0.492731346079,-0.492814771419,-0.49289819223,-0.49298160851,-0.493065020259,-0.493148427475,-0.493231830159,-0.493315228309,-0.493398621924,-0.493482011004,-0.493565395549,-0.493648775556,-0.493732151026,-0.493815521958,-0.493898888351,-0.493982250204,-0.494065607516,-0.494148960287,-0.494232308516,-0.494315652202,-0.494398991344,-0.494482325942,-0.494565655995,-0.494648981502,-0.494732302462,-0.494815618875,-0.494898930739,-0.494982238054,-0.49506554082,-0.495148839035,-0.495232132699,-0.495315421811,-0.49539870637,-0.495481986375,-0.495565261826,-0.495648532722,-0.495731799061,-0.495815060845,-0.495898318071,-0.495981570738,-0.496064818847,-0.496148062396,-0.496231301384,-0.496314535811,-0.496397765677,-0.496480990979,-0.496564211718,-0.496647427893,-0.496730639502,-0.496813846546,-0.496897049023,-0.496980246932,-0.497063440274,-0.497146629046,-0.497229813249,-0.497312992882,-0.497396167943,-0.497479338433,-0.497562504349,-0.497645665692,-0.497728822461,-0.497811974655,-0.497895122273,-0.497978265315,-0.498061403779,-0.498144537665,-0.498227666973,-0.498310791701,-0.498393911848,-0.498477027414,-0.498560138399,-0.4986432448,-0.498726346619,-0.498809443853,-0.498892536502,-0.498975624565,-0.499058708042,-0.499141786932,-0.499224861234,-0.499307930946,-0.49939099607,-0.499474056603,-0.499557112545,-0.499640163895,-0.499723210653,-0.499806252817,-0.499889290387,-0.499972323363,-0.500055351742,-0.500138375526,-0.500221394712,-0.5003044093,-0.50038741929,-0.50047042468,-0.500553425469,-0.500636421658,-0.500719413245,-0.50080240023,-0.500885382611,-0.500968360389,-0.501051333561,-0.501134302128,-0.501217266089,-0.501300225442,-0.501383180188,-0.501466130325,-0.501549075853,-0.50163201677,-0.501714953077,-0.501797884772,-0.501880811855,-0.501963734324,-0.50204665218,-0.50212956542,-0.502212474046,-0.502295378055,-0.502378277447,-0.502461172221,-0.502544062377,-0.502626947914,-0.50270982883,-0.502792705126,-0.5028755768,-0.502958443852,-0.503041306281,-0.503124164086,-0.503207017266,-0.503289865821,-0.50337270975,-0.503455549051,-0.503538383726,-0.503621213772,-0.503704039188,-0.503786859975,-0.503869676131,-0.503952487655,-0.504035294548,-0.504118096807,-0.504200894433,-0.504283687424,-0.50436647578,-0.504449259499,-0.504532038582,-0.504614813028,-0.504697582835,-0.504780348003,-0.504863108531,-0.504945864419,-0.505028615665,-0.505111362269,-0.505194104231,-0.505276841548,-0.505359574222,-0.50544230225,-0.505525025632,-0.505607744367,-0.505690458455,-0.505773167895,-0.505855872686,-0.505938572827,-0.506021268318,-0.506103959158,-0.506186645345,-0.50626932688,-0.506352003761,-0.506434675988,-0.50651734356,-0.506600006476,-0.506682664736,-0.506765318338,-0.506847967282,-0.506930611567,-0.507013251193,-0.507095886158,-0.507178516462,-0.507261142105,-0.507343763084,-0.507426379401,-0.507508991053,-0.50759159804,-0.507674200362,-0.507756798017,-0.507839391005,-0.507921979325,-0.508004562976,-0.508087141958,-0.50816971627,-0.50825228591,-0.508334850879,-0.508417411175,-0.508499966799,-0.508582517748,-0.508665064022,-0.508747605621,-0.508830142543,-0.508912674789,-0.508995202356,-0.509077725245,-0.509160243455,-0.509242756984,-0.509325265833,-0.50940777,-0.509490269485,-0.509572764287,-0.509655254404,-0.509737739837,-0.509820220585,-0.509902696647,-0.509985168021,-0.510067634708,-0.510150096707,-0.510232554016,-0.510315006635,-0.510397454564,-0.510479897801,-0.510562336346,-0.510644770198,-0.510727199357,-0.51080962382,-0.510892043589,-0.510974458661,-0.511056869037,-0.511139274715,-0.511221675695,-0.511304071976,-0.511386463557,-0.511468850438,-0.511551232617,-0.511633610094,-0.511715982869,-0.511798350939,-0.511880714306,-0.511963072967,-0.512045426923,-0.512127776172,-0.512210120713,-0.512292460546,-0.512374795671,-0.512457126086,-0.51253945179,-0.512621772783,-0.512704089065,-0.512786400634,-0.512868707489,-0.51295100963,-0.513033307056,-0.513115599767,-0.513197887761,-0.513280171038,-0.513362449596,-0.513444723437,-0.513526992557,-0.513609256958,-0.513691516637,-0.513773771595,-0.51385602183,-0.513938267342,-0.51402050813,-0.514102744193,-0.514184975531,-0.514267202142,-0.514349424027,-0.514431641183,-0.514513853611,-0.51459606131,-0.514678264279,-0.514760462517,-0.514842656023,-0.514924844797,-0.515007028838,-0.515089208145,-0.515171382717,-0.515253552554,-0.515335717655,-0.515417878019,-0.515500033646,-0.515582184534,-0.515664330683,-0.515746472092,-0.515828608761,-0.515910740688,-0.515992867873,-0.516074990315,-0.516157108014,-0.516239220968,-0.516321329177,-0.51640343264,-0.516485531356,-0.516567625325,-0.516649714546,-0.516731799018,-0.51681387874,-0.516895953711,-0.516978023932,-0.5170600894,-0.517142150116,-0.517224206079,-0.517306257287,-0.51738830374,-0.517470345437,-0.517552382378,-0.517634414562,-0.517716441988,-0.517798464655,-0.517880482562,-0.51796249571,-0.518044504096,-0.518126507721,-0.518208506583,-0.518290500681,-0.518372490016,-0.518454474586,-0.518536454391,-0.518618429429,-0.5187003997,-0.518782365203,-0.518864325938,-0.518946281904,-0.519028233099,-0.519110179524,-0.519192121177,-0.519274058058,-0.519355990166,-0.5194379175,-0.519519840059,-0.519601757843,-0.519683670851,-0.519765579082,-0.519847482536,-0.519929381211,-0.520011275108,-0.520093164224,-0.52017504856,-0.520256928114,-0.520338802887,-0.520420672876,-0.520502538082,-0.520584398504,-0.52066625414,-0.520748104991,-0.520829951055,-0.520911792332,-0.52099362882,-0.52107546052,-0.52115728743,-0.52123910955,-0.521320926879,-0.521402739415,-0.521484547159,-0.52156635011,-0.521648148267,-0.521729941629,-0.521811730195,-0.521893513965,-0.521975292937,-0.522057067112,-0.522138836488,-0.522220601065,-0.522302360841,-0.522384115817,-0.522465865991,-0.522547611363,-0.522629351931,-0.522711087696,-0.522792818656,-0.52287454481,-0.522956266159,-0.5230379827,-0.523119694434,-0.523201401359,-0.523283103476,-0.523364800782,-0.523446493278,-0.523528180962,-0.523609863834,-0.523691541893,-0.523773215139,-0.52385488357,-0.523936547186,-0.524018205986,-0.52409985997,-0.524181509136,-0.524263153484,-0.524344793013,-0.524426427722,-0.524508057611,-0.524589682678,-0.524671302924,-0.524752918347,-0.524834528947,-0.524916134723,-0.524997735673,-0.525079331798,-0.525160923097,-0.525242509568,-0.525324091212,-0.525405668026,-0.525487240012,-0.525568807167,-0.525650369491,-0.525731926984,-0.525813479644,-0.525895027471,-0.525976570464,-0.526058108623,-0.526139641946,-0.526221170433,-0.526302694083,-0.526384212895,-0.526465726869,-0.526547236004,-0.526628740298,-0.526710239753,-0.526791734365,-0.526873224136,-0.526954709064,-0.527036189148,-0.527117664387,-0.527199134782,-0.52728060033,-0.527362061032,-0.527443516887,-0.527524967893,-0.527606414051,-0.527687855359,-0.527769291816,-0.527850723423,-0.527932150177,-0.528013572079,-0.528094989127,-0.528176401321,-0.528257808661,-0.528339211145,-0.528420608772,-0.528502001542,-0.528583389455,-0.528664772508,-0.528746150703,-0.528827524037,-0.52890889251,-0.528990256122,-0.529071614872,-0.529152968758,-0.52923431778,-0.529315661938,-0.52939700123,-0.529478335657,-0.529559665216,-0.529640989908,-0.529722309732,-0.529803624686,-0.529884934771,-0.529966239985,-0.530047540328,-0.530128835798,-0.530210126396,-0.53029141212,-0.53037269297,-0.530453968945,-0.530535240044,-0.530616506266,-0.530697767612,-0.530779024079,-0.530860275667,-0.530941522376,-0.531022764204,-0.531104001151,-0.531185233217,-0.5312664604,-0.5313476827,-0.531428900115,-0.531510112646,-0.531591320292,-0.531672523051,-0.531753720923,-0.531834913907,-0.531916102003,-0.531997285209,-0.532078463526,-0.532159636952,-0.532240805486,-0.532321969128,-0.532403127877,-0.532484281733,-0.532565430693,-0.532646574759,-0.532727713929,-0.532808848202,-0.532889977577,-0.532971102054,-0.533052221633,-0.533133336311,-0.533214446089,-0.533295550966,-0.533376650941,-0.533457746014,-0.533538836183,-0.533619921447,-0.533701001807,-0.533782077261,-0.533863147809,-0.53394421345,-0.534025274182,-0.534106330006,-0.534187380921,-0.534268426926,-0.534349468019,-0.534430504201,-0.534511535471,-0.534592561827,-0.53467358327,-0.534754599798,-0.534835611411,-0.534916618107,-0.534997619887,-0.535078616749,-0.535159608693,-0.535240595718,-0.535321577823,-0.535402555007,-0.53548352727,-0.535564494611,-0.53564545703,-0.535726414524,-0.535807367095,-0.53588831474,-0.53596925746,-0.536050195253,-0.536131128119,-0.536212056057,-0.536292979066,-0.536373897146,-0.536454810295,-0.536535718513,-0.5366166218,-0.536697520154,-0.536778413575,-0.536859302062,-0.536940185615,-0.537021064232,-0.537101937913,-0.537182806656,-0.537263670463,-0.53734452933,-0.537425383259,-0.537506232248,-0.537587076296,-0.537667915402,-0.537748749567,-0.537829578789,-0.537910403067,-0.5379912224,-0.538072036789,-0.538152846232,-0.538233650728,-0.538314450277,-0.538395244877,-0.538476034529,-0.538556819232,-0.538637598984,-0.538718373785,-0.538799143634,-0.538879908531,-0.538960668474,-0.539041423464,-0.539122173499,-0.539202918578,-0.539283658701,-0.539364393867,-0.539445124075,-0.539525849325,-0.539606569616,-0.539687284946,-0.539767995316,-0.539848700725,-0.539929401171,-0.540010096655,-0.540090787174,-0.54017147273,-0.54025215332,-0.540332828945,-0.540413499602,-0.540494165293,-0.540574826015,-0.540655481768,-0.540736132552,-0.540816778366,-0.540897419208,-0.540978055079,-0.541058685977,-0.541139311902,-0.541219932853,-0.541300548828,-0.541381159829,-0.541461765853,-0.5415423669,-0.54162296297,-0.541703554061,-0.541784140172,-0.541864721304,-0.541945297455,-0.542025868625,-0.542106434812,-0.542186996017,-0.542267552238,-0.542348103474,-0.542428649726,-0.542509190991,-0.54258972727,-0.542670258561,-0.542750784865,-0.542831306179,-0.542911822504,-0.542992333838,-0.543072840182,-0.543153341534,-0.543233837893,-0.543314329258,-0.54339481563,-0.543475297007,-0.543555773389,-0.543636244774,-0.543716711162,-0.543797172553,-0.543877628945,-0.543958080338,-0.544038526731,-0.544118968123,-0.544199404514,-0.544279835903,-0.544360262288,-0.544440683671,-0.544521100048,-0.544601511421,-0.544681917788,-0.544762319148,-0.544842715501,-0.544923106845,-0.545003493181,-0.545083874508,-0.545164250824,-0.545244622129,-0.545324988422,-0.545405349703,-0.54548570597,-0.545566057224,-0.545646403463,-0.545726744686,-0.545807080893,-0.545887412083,-0.545967738256,-0.54604805941,-0.546128375545,-0.54620868666,-0.546288992754,-0.546369293827,-0.546449589878,-0.546529880906,-0.546610166911,-0.546690447891,-0.546770723846,-0.546850994775,-0.546931260678,-0.547011521554,-0.547091777401,-0.54717202822,-0.547252274009,-0.547332514768,-0.547412750496,-0.547492981193,-0.547573206857,-0.547653427487,-0.547733643084,-0.547813853646,-0.547894059173,-0.547974259664,-0.548054455118,-0.548134645534,-0.548214830912,-0.54829501125,-0.548375186549,-0.548455356808,-0.548535522025,-0.5486156822,-0.548695837333,-0.548775987421,-0.548856132466,-0.548936272466,-0.54901640742,-0.549096537327,-0.549176662188,-0.549256782,-0.549336896764,-0.549417006478,-0.549497111143,-0.549577210756,-0.549657305318,-0.549737394827,-0.549817479284,-0.549897558687,-0.549977633035,-0.550057702327,-0.550137766564,-0.550217825744,-0.550297879867,-0.550377928931,-0.550457972937,-0.550538011882,-0.550618045768,-0.550698074592,-0.550778098354,-0.550858117053,-0.55093813069,-0.551018139262,-0.551098142769,-0.551178141211,-0.551258134586,-0.551338122894,-0.551418106135,-0.551498084307,-0.55157805741,-0.551658025443,-0.551737988405,-0.551817946295,-0.551897899114,-0.551977846859,-0.552057789531,-0.552137727129,-0.552217659651,-0.552297587097,-0.552377509467,-0.55245742676,-0.552537338974,-0.55261724611,-0.552697148166,-0.552777045142,-0.552856937036,-0.552936823849,-0.55301670558,-0.553096582227,-0.553176453791,-0.55325632027,-0.553336181663,-0.55341603797,-0.55349588919,-0.553575735323,-0.553655576367,-0.553735412323,-0.553815243188,-0.553895068963,-0.553974889647,-0.554054705238,-0.554134515737,-0.554214321142,-0.554294121454,-0.55437391667,-0.55445370679,-0.554533491814,-0.554613271741,-0.55469304657,-0.554772816301,-0.554852580932,-0.554932340463,-0.555012094893,-0.555091844222,-0.555171588448,-0.555251327571,-0.555331061591,-0.555410790506,-0.555490514316,-0.55557023302,-0.555649946617,-0.555729655107,-0.555809358488,-0.555889056761,-0.555968749924,-0.556048437977,-0.556128120919,-0.556207798749,-0.556287471466,-0.55636713907,-0.55644680156,-0.556526458936,-0.556606111196,-0.556685758339,-0.556765400366,-0.556845037275,-0.556924669066,-0.557004295737,-0.557083917289,-0.55716353372,-0.55724314503,-0.557322751218,-0.557402352283,-0.557481948224,-0.557561539041,-0.557641124733,-0.5577207053,-0.55780028074,-0.557879851053,-0.557959416237,-0.558038976294,-0.558118531221,-0.558198081017,-0.558277625683,-0.558357165218,-0.55843669962,-0.558516228889,-0.558595753024,-0.558675272025,-0.55875478589,-0.55883429462,-0.558913798213,-0.558993296668,-0.559072789986,-0.559152278164,-0.559231761203,-0.559311239102,-0.559390711859,-0.559470179475,-0.559549641948,-0.559629099278,-0.559708551464,-0.559787998505,-0.559867440401,-0.55994687715,-0.560026308753,-0.560105735208,-0.560185156514,-0.560264572672,-0.56034398368,-0.560423389537,-0.560502790242,-0.560582185796,-0.560661576197,-0.560740961445,-0.560820341538,-0.560899716477,-0.560979086259,-0.561058450886,-0.561137810355,-0.561217164666,-0.561296513819,-0.561375857813,-0.561455196646,-0.561534530319,-0.56161385883,-0.561693182179,-0.561772500365,-0.561851813387,-0.561931121245,-0.562010423937,-0.562089721464,-0.562169013824,-0.562248301017,-0.562327583042,-0.562406859898,-0.562486131584,-0.562565398101,-0.562644659446,-0.562723915619,-0.56280316662,-0.562882412448,-0.562961653102,-0.563040888582,-0.563120118886,-0.563199344014,-0.563278563965,-0.563357778739,-0.563436988334,-0.56351619275,-0.563595391987,-0.563674586043,-0.563753774918,-0.563832958611,-0.563912137122,-0.563991310449,-0.564070478592,-0.56414964155,-0.564228799323,-0.564307951909,-0.564387099309,-0.564466241521,-0.564545378544,-0.564624510378,-0.564703637022,-0.564782758476,-0.564861874738,-0.564940985808,-0.565020091685,-0.565099192369,-0.565178287858,-0.565257378153,-0.565336463251,-0.565415543154,-0.565494617859,-0.565573687366,-0.565652751674,-0.565731810784,-0.565810864693,-0.565889913401,-0.565968956908,-0.566047995212,-0.566127028314,-0.566206056212,-0.566285078905,-0.566364096393,-0.566443108675,-0.566522115751,-0.566601117619,-0.56668011428,-0.566759105731,-0.566838091973,-0.566917073004,-0.566996048825,-0.567075019434,-0.567153984831,-0.567232945014,-0.567311899983,-0.567390849738,-0.567469794278,-0.567548733601,-0.567627667708,-0.567706596597,-0.567785520268,-0.56786443872,-0.567943351952,-0.568022259964,-0.568101162755,-0.568180060324,-0.56825895267,-0.568337839793,-0.568416721692,-0.568495598366,-0.568574469815,-0.568653336037,-0.568732197033,-0.568811052801,-0.56888990334,-0.568968748651,-0.569047588731,-0.569126423581,-0.5692052532,-0.569284077586,-0.56936289674,-0.569441710661,-0.569520519347,-0.569599322798,-0.569678121014,-0.569756913993,-0.569835701736,-0.56991448424,-0.569993261506,-0.570072033533,-0.570150800319,-0.570229561865,-0.57030831817,-0.570387069232,-0.570465815052,-0.570544555628,-0.57062329096,-0.570702021046,-0.570780745887,-0.570859465481,-0.570938179828,-0.571016888928,-0.571095592778,-0.571174291379,-0.57125298473,-0.57133167283,-0.571410355679,-0.571489033275,-0.571567705618,-0.571646372708,-0.571725034543,-0.571803691123,-0.571882342447,-0.571960988515,-0.572039629325,-0.572118264877,-0.57219689517,-0.572275520204,-0.572354139977,-0.57243275449,-0.572511363741,-0.572589967729,-0.572668566454,-0.572747159916,-0.572825748113,-0.572904331045,-0.57298290871,-0.573061481109,-0.57314004824,-0.573218610104,-0.573297166698,-0.573375718023,-0.573454264077,-0.57353280486,-0.573611340372,-0.573689870611,-0.573768395577,-0.573846915269,-0.573925429686,-0.574003938827,-0.574082442693,-0.574160941282,-0.574239434593,-0.574317922626,-0.57439640538,-0.574474882854,-0.574553355048,-0.57463182196,-0.574710283591,-0.574788739939,-0.574867191004,-0.574945636784,-0.57502407728,-0.575102512491,-0.575180942415,-0.575259367052,-0.575337786402,-0.575416200463,-0.575494609235,-0.575573012717,-0.575651410909,-0.575729803809,-0.575808191418,-0.575886573734,-0.575964950756,-0.576043322484,-0.576121688917,-0.576200050055,-0.576278405897,-0.576356756441,-0.576435101688,-0.576513441636,-0.576591776285,-0.576670105634,-0.576748429682,-0.57682674843,-0.576905061875,-0.576983370017,-0.577061672856,-0.57713997039,-0.57721826262,-0.577296549544,-0.577374831161,-0.577453107472,-0.577531378474,-0.577609644168,-0.577687904553,-0.577766159628,-0.577844409392,-0.577922653845,-0.578000892985,-0.578079126813,-0.578157355327,-0.578235578527,-0.578313796412,-0.578392008981,-0.578470216233,-0.578548418169,-0.578626614786,-0.578704806085,-0.578782992065,-0.578861172724,-0.578939348063,-0.57901751808,-0.579095682775,-0.579173842148,-0.579251996196,-0.57933014492,-0.579408288319,-0.579486426393,-0.579564559139,-0.579642686559,-0.579720808651,-0.579798925413,-0.579877036847,-0.57995514295,-0.580033243723,-0.580111339164,-0.580189429273,-0.580267514049,-0.580345593491,-0.580423667598,-0.580501736371,-0.580579799808,-0.580657857908,-0.580735910671,-0.580813958096,-0.580892000182,-0.580970036929,-0.581048068335,-0.581126094401,-0.581204115125,-0.581282130507,-0.581360140546,-0.581438145241,-0.581516144591,-0.581594138597,-0.581672127256,-0.581750110569,-0.581828088535,-0.581906061153,-0.581984028421,-0.582061990341,-0.58213994691,-0.582217898128,-0.582295843995,-0.582373784509,-0.58245171967,-0.582529649478,-0.582607573931,-0.582685493029,-0.582763406771,-0.582841315156,-0.582919218184,-0.582997115853,-0.583075008164,-0.583152895116,-0.583230776707,-0.583308652938,-0.583386523806,-0.583464389313,-0.583542249456,-0.583620104236,-0.583697953651,-0.5837757977,-0.583853636384,-0.583931469701,-0.584009297651,-0.584087120233,-0.584164937446,-0.584242749289,-0.584320555762,-0.584398356864,-0.584476152595,-0.584553942953,-0.584631727938,-0.584709507549,-0.584787281786,-0.584865050648,-0.584942814133,-0.585020572242,-0.585098324973,-0.585176072327,-0.585253814301,-0.585331550896,-0.585409282111,-0.585487007945,-0.585564728397,-0.585642443467,-0.585720153154,-0.585797857456,-0.585875556375,-0.585953249908,-0.586030938055,-0.586108620815,-0.586186298189,-0.586263970174,-0.58634163677,-0.586419297976,-0.586496953793,-0.586574604218,-0.586652249252,-0.586729888893,-0.586807523142,-0.586885151996,-0.586962775456,-0.587040393521,-0.58711800619,-0.587195613462,-0.587273215337,-0.587350811813,-0.587428402891,-0.587505988569,-0.587583568848,-0.587661143725,-0.5877387132,-0.587816277273,-0.587893835943,-0.58797138921,-0.588048937072,-0.588126479528,-0.588204016579,-0.588281548223,-0.588359074459,-0.588436595288,-0.588514110708,-0.588591620718,-0.588669125318,-0.588746624507,-0.588824118285,-0.58890160665,-0.588979089602,-0.58905656714,-0.589134039264,-0.589211505973,-0.589288967265,-0.589366423141,-0.5894438736,-0.589521318641,-0.589598758263,-0.589676192466,-0.589753621248,-0.589831044609,-0.589908462549,-0.589985875067,-0.590063282161,-0.590140683832,-0.590218080079,-0.5902954709,-0.590372856295,-0.590450236264,-0.590527610805,-0.590604979919,-0.590682343604,-0.590759701859,-0.590837054684,-0.590914402078,-0.590991744041,-0.591069080572,-0.591146411669,-0.591223737333,-0.591301057562,-0.591378372357,-0.591455681715,-0.591532985637,-0.591610284122,-0.591687577169,-0.591764864777,-0.591842146946,-0.591919423674,-0.591996694962,-0.592073960808,-0.592151221212,-0.592228476174,-0.592305725691,-0.592382969764,-0.592460208393,-0.592537441575,-0.592614669311,-0.5926918916,-0.59276910844,-0.592846319833,-0.592923525776,-0.593000726268,-0.593077921311,-0.593155110901,-0.59323229504,-0.593309473725,-0.593386646958,-0.593463814735,-0.593540977058,-0.593618133925,-0.593695285336,-0.59377243129,-0.593849571785,-0.593926706823,-0.594003836401,-0.594080960519,-0.594158079176,-0.594235192372,-0.594312300106,-0.594389402377,-0.594466499185,-0.594543590528,-0.594620676407,-0.594697756819,-0.594774831766,-0.594851901245,-0.594928965257,-0.5950060238,-0.595083076875,-0.595160124479,-0.595237166612,-0.595314203275,-0.595391234465,-0.595468260183,-0.595545280427,-0.595622295197,-0.595699304492,-0.595776308312,-0.595853306656,-0.595930299522,-0.596007286911,-0.596084268822,-0.596161245253,-0.596238216205,-0.596315181676,-0.596392141666,-0.596469096174,-0.596546045199,-0.596622988741,-0.596699926799,-0.596776859373,-0.59685378646,-0.596930708062,-0.597007624177,-0.597084534804,-0.597161439943,-0.597238339593,-0.597315233754,-0.597392122424,-0.597469005603,-0.59754588329,-0.597622755484,-0.597699622186,-0.597776483393,-0.597853339106,-0.597930189323,-0.598007034045,-0.598083873269,-0.598160706996,-0.598237535225,-0.598314357955,-0.598391175186,-0.598467986916,-0.598544793146,-0.598621593873,-0.598698389098,-0.59877517882,-0.598851963039,-0.598928741752,-0.599005514961,-0.599082282664,-0.59915904486,-0.599235801548,-0.599312552729,-0.599389298401,-0.599466038563,-0.599542773215,-0.599619502356,-0.599696225986,-0.599772944104,-0.599849656708,-0.599926363799,-0.600003065375,-0.600079761437,-0.600156451982,-0.600233137011,-0.600309816523,-0.600386490517,-0.600463158992,-0.600539821948,-0.600616479384,-0.600693131299,-0.600769777693,-0.600846418564,-0.600923053913,-0.600999683738,-0.601076308039,-0.601152926815,-0.601229540065,-0.601306147789,-0.601382749986,-0.601459346655,-0.601535937795,-0.601612523407,-0.601689103488,-0.601765678039,-0.601842247059,-0.601918810546,-0.601995368501,-0.602071920922,-0.60214846781,-0.602225009162,-0.602301544979,-0.60237807526,-0.602454600004,-0.60253111921,-0.602607632878,-0.602684141007,-0.602760643596,-0.602837140644,-0.602913632152,-0.602990118117,-0.60306659854,-0.60314307342,-0.603219542756,-0.603296006547,-0.603372464793,-0.603448917493,-0.603525364646,-0.603601806251,-0.603678242308,-0.603754672817,-0.603831097776,-0.603907517184,-0.603983931042,-0.604060339348,-0.604136742101,-0.604213139302,-0.604289530948,-0.60436591704,-0.604442297577,-0.604518672558,-0.604595041983,-0.60467140585,-0.604747764159,-0.604824116909,-0.6049004641,-0.604976805731,-0.605053141801,-0.605129472309,-0.605205797255,-0.605282116639,-0.605358430459,-0.605434738714,-0.605511041404,-0.605587338529,-0.605663630087,-0.605739916078,-0.605816196502,-0.605892471356,-0.605968740642,-0.606045004357,-0.606121262502,-0.606197515076,-0.606273762077,-0.606350003506,-0.606426239361,-0.606502469643,-0.606578694349,-0.60665491348,-0.606731127035,-0.606807335012,-0.606883537412,-0.606959734234,-0.607035925476,-0.607112111139,-0.607188291222,-0.607264465723,-0.607340634643,-0.607416797979,-0.607492955733,-0.607569107903,-0.607645254488,-0.607721395488,-0.607797530901,-0.607873660728,-0.607949784968,-0.608025903619,-0.608102016682,-0.608178124155,-0.608254226037,-0.608330322329,-0.608406413029,-0.608482498137,-0.608558577652,-0.608634651573,-0.608710719899,-0.608786782631,-0.608862839766,-0.608938891305,-0.609014937247,-0.609090977591,-0.609167012336,-0.609243041482,-0.609319065028,-0.609395082973,-0.609471095317,-0.609547102059,-0.609623103198,-0.609699098733,-0.609775088664,-0.60985107299,-0.60992705171,-0.610003024825,-0.610078992332,-0.610154954231,-0.610230910522,-0.610306861204,-0.610382806276,-0.610458745738,-0.610534679588,-0.610610607827,-0.610686530453,-0.610762447465,-0.610838358864,-0.610914264648,-0.610990164816,-0.611066059369,-0.611141948304,-0.611217831622,-0.611293709322,-0.611369581403,-0.611445447865,-0.611521308706,-0.611597163926,-0.611673013525,-0.611748857501,-0.611824695854,-0.611900528584,-0.611976355689,-0.612052177169,-0.612127993022,-0.61220380325,-0.61227960785,-0.612355406822,-0.612431200166,-0.61250698788,-0.612582769964,-0.612658546417,-0.61273431724,-0.612810082429,-0.612885841986,-0.61296159591,-0.613037344199,-0.613113086854,-0.613188823873,-0.613264555255,-0.613340281001,-0.613416001109,-0.613491715578,-0.613567424408,-0.613643127599,-0.613718825149,-0.613794517058,-0.613870203325,-0.61394588395,-0.614021558931,-0.614097228268,-0.614172891961,-0.614248550008,-0.61432420241,-0.614399849164,-0.614475490271,-0.61455112573,-0.61462675554,-0.614702379701,-0.614777998211,-0.614853611071,-0.614929218279,-0.615004819834,-0.615080415737,-0.615156005986,-0.615231590581,-0.61530716952,-0.615382742804,-0.615458310431,-0.615533872401,-0.615609428713,-0.615684979367,-0.615760524361,-0.615836063696,-0.61591159737,-0.615987125382,-0.616062647733,-0.616138164421,-0.616213675445,-0.616289180805,-0.616364680501,-0.616440174531,-0.616515662895,-0.616591145592,-0.616666622621,-0.616742093982,-0.616817559674,-0.616893019697,-0.616968474049,-0.61704392273,-0.617119365739,-0.617194803076,-0.61727023474,-0.61734566073,-0.617421081045,-0.617496495686,-0.61757190465,-0.617647307938,-0.617722705548,-0.617798097481,-0.617873483735,-0.617948864309,-0.618024239204,-0.618099608417,-0.61817497195,-0.6182503298,-0.618325681967,-0.618401028451,-0.61847636925,-0.618551704365,-0.618627033794,-0.618702357537,-0.618777675593,-0.618852987961,-0.618928294641,-0.619003595631,-0.619078890932,-0.619154180543,-0.619229464462,-0.61930474269,-0.619380015225,-0.619455282067,-0.619530543215,-0.619605798668,-0.619681048426,-0.619756292488,-0.619831530854,-0.619906763522,-0.619981990492,-0.620057211763,-0.620132427335,-0.620207637207,-0.620282841378,-0.620358039847,-0.620433232614,-0.620508419679,-0.620583601039,-0.620658776696,-0.620733946647,-0.620809110893,-0.620884269433,-0.620959422265,-0.62103456939,-0.621109710806,-0.621184846514,-0.621259976511,-0.621335100798,-0.621410219374,-0.621485332238,-0.621560439389,-0.621635540827,-0.621710636551,-0.621785726561,-0.621860810855,-0.621935889433,-0.622010962295,-0.622086029439,-0.622161090865,-0.622236146572,-0.62231119656,-0.622386240827,-0.622461279374,-0.622536312199,-0.622611339302,-0.622686360683,-0.622761376339,-0.622836386271,-0.622911390479,-0.62298638896,-0.623061381715,-0.623136368744,-0.623211350044,-0.623286325616,-0.623361295459,-0.623436259572,-0.623511217955,-0.623586170606,-0.623661117526,-0.623736058713,-0.623810994166,-0.623885923886,-0.623960847871,-0.624035766121,-0.624110678635,-0.624185585412,-0.624260486452,-0.624335381754,-0.624410271317,-0.62448515514,-0.624560033224,-0.624634905566,-0.624709772168,-0.624784633026,-0.624859488142,-0.624934337515,-0.625009181143,-0.625084019026,-0.625158851164,-0.625233677555,-0.625308498199,-0.625383313096,-0.625458122244,-0.625532925643,-0.625607723292,-0.625682515191,-0.625757301339,-0.625832081735,-0.625906856378,-0.625981625268,-0.626056388404,-0.626131145786,-0.626205897412,-0.626280643283,-0.626355383397,-0.626430117753,-0.626504846352,-0.626579569192,-0.626654286272,-0.626728997592,-0.626803703152,-0.62687840295,-0.626953096986,-0.627027785259,-0.627102467769,-0.627177144515,-0.627251815495,-0.62732648071,-0.627401140159,-0.627475793841,-0.627550441755,-0.627625083901,-0.627699720278,-0.627774350885,-0.627848975722,-0.627923594788,-0.627998208082,-0.628072815604,-0.628147417352,-0.628222013327,-0.628296603527,-0.628371187953,-0.628445766602,-0.628520339475,-0.62859490657,-0.628669467888,-0.628744023427,-0.628818573186,-0.628893117166,-0.628967655365,-0.629042187783,-0.629116714419,-0.629191235272,-0.629265750341,-0.629340259627,-0.629414763128,-0.629489260843,-0.629563752772,-0.629638238915,-0.62971271927,-0.629787193837,-0.629861662614,-0.629936125603,-0.630010582801,-0.630085034208,-0.630159479824,-0.630233919647,-0.630308353677,-0.630382781914,-0.630457204356,-0.630531621003,-0.630606031855,-0.63068043691,-0.630754836168,-0.630829229628,-0.63090361729,-0.630977999153,-0.631052375216,-0.631126745478,-0.63120110994,-0.631275468599,-0.631349821456,-0.631424168509,-0.631498509759,-0.631572845204,-0.631647174844,-0.631721498678,-0.631795816705,-0.631870128925,-0.631944435337,-0.63201873594,-0.632093030734,-0.632167319717,-0.63224160289,-0.632315880252,-0.632390151801,-0.632464417538,-0.632538677461,-0.63261293157,-0.632687179864,-0.632761422343,-0.632835659005,-0.632909889851,-0.632984114878,-0.633058334088,-0.633132547479,-0.63320675505,-0.633280956801,-0.633355152731,-0.633429342839,-0.633503527125,-0.633577705588,-0.633651878227,-0.633726045041,-0.633800206031,-0.633874361195,-0.633948510532,-0.634022654043,-0.634096791725,-0.634170923579,-0.634245049604,-0.634319169799,-0.634393284164,-0.634467392697,-0.634541495398,-0.634615592267,-0.634689683303,-0.634763768504,-0.634837847872,-0.634911921403,-0.634985989099,-0.635060050958,-0.63513410698,-0.635208157164,-0.635282201509,-0.635356240015,-0.63543027268,-0.635504299505,-0.635578320489,-0.63565233563,-0.635726344929,-0.635800348384,-0.635874345995,-0.635948337761,-0.636022323682,-0.636096303756,-0.636170277984,-0.636244246364,-0.636318208896,-0.636392165579,-0.636466116412,-0.636540061395,-0.636614000527,-0.636687933808,-0.636761861236,-0.636835782812,-0.636909698533,-0.636983608401,-0.637057512413,-0.637131410569,-0.63720530287,-0.637279189313,-0.637353069898,-0.637426944625,-0.637500813493,-0.637574676501,-0.637648533649,-0.637722384936,-0.63779623036,-0.637870069923,-0.637943903622,-0.638017731457,-0.638091553428,-0.638165369533,-0.638239179773,-0.638312984146,-0.638386782652,-0.63846057529,-0.638534362059,-0.63860814296,-0.63868191799,-0.638755687149,-0.638829450437,-0.638903207854,-0.638976959397,-0.639050705068,-0.639124444864,-0.639198178785,-0.639271906831,-0.639345629002,-0.639419345295,-0.639493055711,-0.639566760249,-0.639640458908,-0.639714151688,-0.639787838587,-0.639861519606,-0.639935194743,-0.640008863998,-0.640082527371,-0.64015618486,-0.640229836464,-0.640303482184,-0.640377122018,-0.640450755966,-0.640524384028,-0.640598006201,-0.640671622487,-0.640745232883,-0.64081883739,-0.640892436007,-0.640966028732,-0.641039615566,-0.641113196508,-0.641186771557,-0.641260340712,-0.641333903973,-0.641407461338,-0.641481012809,-0.641554558382,-0.641628098059,-0.641701631838,-0.641775159719,-0.6418486817,-0.641922197782,-0.641995707963,-0.642069212244,-0.642142710622,-0.642216203098,-0.642289689671,-0.642363170341,-0.642436645105,-0.642510113965,-0.642583576919,-0.642657033966,-0.642730485106,-0.642803930339,-0.642877369662,-0.642950803077,-0.643024230582,-0.643097652176,-0.643171067859,-0.64324447763,-0.643317881489,-0.643391279434,-0.643464671465,-0.643538057582,-0.643611437784,-0.643684812069,-0.643758180438,-0.64383154289,-0.643904899424,-0.643978250039,-0.644051594734,-0.64412493351,-0.644198266365,-0.644271593299,-0.644344914311,-0.6444182294,-0.644491538566,-0.644564841807,-0.644638139125,-0.644711430516,-0.644784715982,-0.644857995521,-0.644931269132,-0.645004536816,-0.64507779857,-0.645151054395,-0.645224304291,-0.645297548255,-0.645370786288,-0.645444018389,-0.645517244557,-0.645590464792,-0.645663679092,-0.645736887458,-0.645810089888,-0.645883286382,-0.645956476939,-0.646029661559,-0.646102840241,-0.646176012983,-0.646249179787,-0.64632234065,-0.646395495572,-0.646468644552,-0.646541787591,-0.646614924687,-0.646688055839,-0.646761181046,-0.646834300309,-0.646907413627,-0.646980520998,-0.647053622422,-0.647126717899,-0.647199807427,-0.647272891007,-0.647345968637,-0.647419040316,-0.647492106045,-0.647565165822,-0.647638219647,-0.647711267519,-0.647784309437,-0.647857345401,-0.64793037541,-0.648003399463,-0.64807641756,-0.6481494297,-0.648222435882,-0.648295436107,-0.648368430372,-0.648441418677,-0.648514401022,-0.648587377406,-0.648660347829,-0.648733312289,-0.648806270786,-0.648879223319,-0.648952169888,-0.649025110492,-0.64909804513,-0.649170973802,-0.649243896507,-0.649316813244,-0.649389724013,-0.649462628813,-0.649535527643,-0.649608420502,-0.649681307391,-0.649754188307,-0.649827063252,-0.649899932223,-0.649972795221,-0.650045652244,-0.650118503292,-0.650191348364,-0.65026418746,-0.650337020579,-0.65040984772,-0.650482668883,-0.650555484067,-0.65062829327,-0.650701096494,-0.650773893736,-0.650846684996,-0.650919470274,-0.650992249569,-0.65106502288,-0.651137790207,-0.651210551549,-0.651283306905,-0.651356056274,-0.651428799656,-0.65150153705,-0.651574268456,-0.651646993873,-0.6517197133,-0.651792426737,-0.651865134182,-0.651937835636,-0.652010531097,-0.652083220565,-0.652155904039,-0.652228581519,-0.652301253003,-0.652373918492,-0.652446577984,-0.65251923148,-0.652591878977,-0.652664520476,-0.652737155975,-0.652809785475,-0.652882408975,-0.652955026473,-0.653027637969,-0.653100243463,-0.653172842954,-0.653245436441,-0.653318023923,-0.6533906054,-0.653463180872,-0.653535750337,-0.653608313795,-0.653680871244,-0.653753422686,-0.653825968118,-0.653898507541,-0.653971040953,-0.654043568353,-0.654116089742,-0.654188605119,-0.654261114482,-0.654333617832,-0.654406115167,-0.654478606487,-0.654551091791,-0.654623571078,-0.654696044349,-0.654768511601,-0.654840972835,-0.65491342805,-0.654985877245,-0.65505832042,-0.655130757573,-0.655203188705,-0.655275613814,-0.6553480329,-0.655420445962,-0.655492853,-0.655565254012,-0.655637648999,-0.655710037959,-0.655782420892,-0.655854797797,-0.655927168674,-0.655999533522,-0.65607189234,-0.656144245127,-0.656216591883,-0.656288932608,-0.6563612673,-0.656433595958,-0.656505918583,-0.656578235174,-0.656650545729,-0.656722850249,-0.656795148732,-0.656867441178,-0.656939727587,-0.657012007956,-0.657084282287,-0.657156550578,-0.657228812829,-0.657301069038,-0.657373319206,-0.657445563331,-0.657517801413,-0.657590033451,-0.657662259445,-0.657734479394,-0.657806693297,-0.657878901154,-0.657951102963,-0.658023298725,-0.658095488439,-0.658167672103,-0.658239849717,-0.658312021282,-0.658384186795,-0.658456346256,-0.658528499665,-0.658600647021,-0.658672788323,-0.658744923571,-0.658817052764,-0.658889175901,-0.658961292982,-0.659033404006,-0.659105508972,-0.659177607879,-0.659249700728,-0.659321787517,-0.659393868246,-0.659465942913,-0.659538011519,-0.659610074063,-0.659682130544,-0.659754180961,-0.659826225313,-0.659898263601,-0.659970295823,-0.660042321979,-0.660114342067,-0.660186356089,-0.660258364041,-0.660330365925,-0.66040236174,-0.660474351484,-0.660546335157,-0.660618312758,-0.660690284287,-0.660762249744,-0.660834209126,-0.660906162435,-0.660978109668,-0.661050050826,-0.661121985908,-0.661193914913,-0.66126583784,-0.661337754689,-0.661409665459,-0.66148157015,-0.66155346876,-0.66162536129,-0.661697247738,-0.661769128104,-0.661841002387,-0.661912870587,-0.661984732702,-0.662056588733,-0.662128438678,-0.662200282537,-0.662272120309,-0.662343951994,-0.66241577759,-0.662487597098,-0.662559410516,-0.662631217845,-0.662703019082,-0.662774814228,-0.662846603282,-0.662918386243,-0.662990163111,-0.663061933885,-0.663133698564,-0.663205457148,-0.663277209635,-0.663348956026,-0.66342069632,-0.663492430515,-0.663564158612,-0.66363588061,-0.663707596507,-0.663779306304,-0.663851009999,-0.663922707593,-0.663994399084,-0.664066084472,-0.664137763755,-0.664209436934,-0.664281104008,-0.664352764976,-0.664424419837,-0.664496068591,-0.664567711237,-0.664639347775,-0.664710978203,-0.664782602522,-0.66485422073,-0.664925832826,-0.664997438811,-0.665069038684,-0.665140632443,-0.665212220088,-0.665283801619,-0.665355377035,-0.665426946335,-0.665498509518,-0.665570066585,-0.665641617533,-0.665713162363,-0.665784701074,-0.665856233666,-0.665927760136,-0.665999280486,-0.666070794714,-0.66614230282,-0.666213804803,-0.666285300662,-0.666356790396,-0.666428274006,-0.66649975149,-0.666571222847,-0.666642688078,-0.666714147181,-0.666785600156,-0.666857047002,-0.666928487718,-0.666999922304,-0.667071350759,-0.667142773082,-0.667214189273,-0.667285599331,-0.667357003256,-0.667428401047,-0.667499792702,-0.667571178223,-0.667642557607,-0.667713930854,-0.667785297963,-0.667856658935,-0.667928013768,-0.667999362461,-0.668070705014,-0.668142041427,-0.668213371698,-0.668284695826,-0.668356013813,-0.668427325655,-0.668498631354,-0.668569930908,-0.668641224317,-0.66871251158,-0.668783792696,-0.668855067665,-0.668926336485,-0.668997599157,-0.66906885568,-0.669140106053,-0.669211350276,-0.669282588347,-0.669353820266,-0.669425046032,-0.669496265646,-0.669567479105,-0.66963868641,-0.66970988756,-0.669781082554,-0.669852271392,-0.669923454072,-0.669994630595,-0.670065800959,-0.670136965164,-0.670208123209,-0.670279275094,-0.670350420818,-0.67042156038,-0.67049269378,-0.670563821017,-0.67063494209,-0.670706056998,-0.670777165742,-0.67084826832,-0.670919364732,-0.670990454977,-0.671061539054,-0.671132616963,-0.671203688703,-0.671274754274,-0.671345813674,-0.671416866903,-0.671487913961,-0.671558954847,-0.67162998956,-0.671701018099,-0.671772040465,-0.671843056655,-0.67191406667,-0.671985070509,-0.672056068172,-0.672127059656,-0.672198044963,-0.672269024091,-0.67233999704,-0.672410963809,-0.672481924397,-0.672552878804,-0.672623827029,-0.672694769071,-0.67276570493,-0.672836634605,-0.672907558095,-0.6729784754,-0.67304938652,-0.673120291453,-0.673191190198,-0.673262082756,-0.673332969125,-0.673403849306,-0.673474723296,-0.673545591096,-0.673616452705,-0.673687308122,-0.673758157347,-0.673829000379,-0.673899837217,-0.673970667861,-0.674041492309,-0.674112310562,-0.674183122619,-0.674253928479,-0.674324728141,-0.674395521605,-0.67446630887,-0.674537089936,-0.674607864801,-0.674678633466,-0.674749395929,-0.674820152189,-0.674890902247,-0.674961646102,-0.675032383752,-0.675103115198,-0.675173840439,-0.675244559473,-0.6753152723,-0.675385978921,-0.675456679333,-0.675527373536,-0.675598061531,-0.675668743315,-0.675739418889,-0.675810088251,-0.675880751402,-0.67595140834,-0.676022059064,-0.676092703575,-0.676163341872,-0.676233973953,-0.676304599819,-0.676375219468,-0.6764458329,-0.676516440114,-0.67658704111,-0.676657635886,-0.676728224443,-0.67679880678,-0.676869382896,-0.67693995279,-0.677010516462,-0.677081073911,-0.677151625136,-0.677222170137,-0.677292708913,-0.677363241464,-0.677433767789,-0.677504287886,-0.677574801756,-0.677645309398,-0.677715810812,-0.677786305996,-0.677856794949,-0.677927277673,-0.677997754164,-0.678068224424,-0.678138688451,-0.678209146245,-0.678279597805,-0.67835004313,-0.67842048222,-0.678490915074,-0.678561341691,-0.678631762072,-0.678702176214,-0.678772584118,-0.678842985783,-0.678913381208,-0.678983770393,-0.679054153337,-0.679124530038,-0.679194900498,-0.679265264714,-0.679335622687,-0.679405974416,-0.679476319899,-0.679546659137,-0.679616992129,-0.679687318874,-0.679757639371,-0.67982795362,-0.679898261621,-0.679968563371,-0.680038858872,-0.680109148122,-0.68017943112,-0.680249707867,-0.680319978361,-0.680390242601,-0.680460500587,-0.680530752319,-0.680600997795,-0.680671237016,-0.68074146998,-0.680811696686,-0.680881917135,-0.680952131326,-0.681022339257,-0.681092540928,-0.681162736339,-0.681232925489,-0.681303108377,-0.681373285002,-0.681443455365,-0.681513619464,-0.681583777298,-0.681653928868,-0.681724074172,-0.681794213209,-0.68186434598,-0.681934472483,-0.682004592718,-0.682074706685,-0.682144814381,-0.682214915808,-0.682285010964,-0.682355099848,-0.682425182461,-0.6824952588,-0.682565328866,-0.682635392659,-0.682705450176,-0.682775501419,-0.682845546385,-0.682915585075,-0.682985617488,-0.683055643623,-0.683125663479,-0.683195677056,-0.683265684353,-0.68333568537,-0.683405680106,-0.68347566856,-0.683545650732,-0.683615626621,-0.683685596226,-0.683755559547,-0.683825516583,-0.683895467333,-0.683965411797,-0.684035349975,-0.684105281864,-0.684175207466,-0.684245126779,-0.684315039802,-0.684384946535,-0.684454846978,-0.684524741129,-0.684594628988,-0.684664510555,-0.684734385828,-0.684804254808,-0.684874117492,-0.684943973882,-0.685013823976,-0.685083667773,-0.685153505273,-0.685223336475,-0.685293161379,-0.685362979984,-0.685432792289,-0.685502598293,-0.685572397997,-0.685642191399,-0.685711978499,-0.685781759296,-0.685851533789,-0.685921301978,-0.685991063863,-0.686060819441,-0.686130568714,-0.68620031168,-0.686270048339,-0.686339778689,-0.686409502731,-0.686479220463,-0.686548931886,-0.686618636998,-0.686688335798,-0.686758028287,-0.686827714463,-0.686897394326,-0.686967067875,-0.68703673511,-0.68710639603,-0.687176050634,-0.687245698921,-0.687315340892,-0.687384976545,-0.687454605879,-0.687524228895,-0.687593845591,-0.687663455967,-0.687733060022,-0.687802657755,-0.687872249167,-0.687941834255,-0.68801141302,-0.688080985462,-0.688150551578,-0.688220111369,-0.688289664834,-0.688359211973,-0.688428752784,-0.688498287267,-0.688567815422,-0.688637337248,-0.688706852744,-0.688776361909,-0.688845864744,-0.688915361246,-0.688984851417,-0.689054335254,-0.689123812757,-0.689193283927,-0.689262748761,-0.68933220726,-0.689401659423,-0.689471105249,-0.689540544737,-0.689609977887,-0.689679404699,-0.689748825171,-0.689818239303,-0.689887647095,-0.689957048545,-0.690026443653,-0.690095832419,-0.690165214841,-0.69023459092,-0.690303960654,-0.690373324043,-0.690442681086,-0.690512031783,-0.690581376132,-0.690650714135,-0.690720045788,-0.690789371093,-0.690858690048,-0.690928002653,-0.690997308908,-0.69106660881,-0.691135902361,-0.691205189558,-0.691274470403,-0.691343744893,-0.691413013029,-0.691482274809,-0.691551530233,-0.691620779301,-0.691690022012,-0.691759258364,-0.691828488358,-0.691897711993,-0.691966929269,-0.692036140183,-0.692105344737,-0.692174542929,-0.692243734759,-0.692312920226,-0.692382099329,-0.692451272068,-0.692520438442,-0.692589598451,-0.692658752093,-0.692727899369,-0.692797040277,-0.692866174817,-0.692935302989,-0.693004424791,-0.693073540224,-0.693142649285,-0.693211751976,-0.693280848295,-0.693349938241,-0.693419021814,-0.693488099013,-0.693557169838,-0.693626234288,-0.693695292362,-0.69376434406,-0.693833389381,-0.693902428324,-0.69397146089,-0.694040487076,-0.694109506883,-0.69417852031,-0.694247527356,-0.69431652802,-0.694385522303,-0.694454510203,-0.69452349172,-0.694592466853,-0.694661435601,-0.694730397964,-0.694799353942,-0.694868303532,-0.694937246736,-0.695006183552,-0.69507511398,-0.695144038019,-0.695212955668,-0.695281866927,-0.695350771795,-0.695419670271,-0.695488562356,-0.695557448047,-0.695626327345,-0.695695200249,-0.695764066759,-0.695832926873,-0.695901780591,-0.695970627913,-0.696039468837,-0.696108303363,-0.696177131491,-0.69624595322,-0.69631476855,-0.696383577478,-0.696452380006,-0.696521176132,-0.696589965856,-0.696658749177,-0.696727526095,-0.696796296608,-0.696865060716,-0.696933818419,-0.697002569716,-0.697071314607,-0.69714005309,-0.697208785165,-0.697277510831,-0.697346230088,-0.697414942935,-0.697483649372,-0.697552349398,-0.697621043012,-0.697689730213,-0.697758411002,-0.697827085377,-0.697895753337,-0.697964414883,-0.698033070013,-0.698101718727,-0.698170361024,-0.698238996904,-0.698307626366,-0.698376249409,-0.698444866033,-0.698513476236,-0.69858208002,-0.698650677381,-0.698719268322,-0.698787852839,-0.698856430934,-0.698925002604,-0.698993567851,-0.699062126672,-0.699130679068,-0.699199225037,-0.69926776458,-0.699336297695,-0.699404824382,-0.69947334464,-0.699541858469,-0.699610365868,-0.699678866836,-0.699747361373,-0.699815849477,-0.69988433115,-0.699952806389,-0.700021275194,-0.700089737565,-0.700158193501,-0.700226643001,-0.700295086064,-0.700363522691,-0.70043195288,-0.700500376631,-0.700568793943,-0.700637204816,-0.700705609248,-0.70077400724,-0.700842398791,-0.700910783899,-0.700979162565,-0.701047534787,-0.701115900566,-0.7011842599,-0.701252612789,-0.701320959232,-0.701389299229,-0.701457632779,-0.701525959881,-0.701594280535,-0.70166259474,-0.701730902496,-0.701799203801,-0.701867498656,-0.701935787059,-0.70200406901,-0.702072344508,-0.702140613553,-0.702208876144,-0.702277132281,-0.702345381962,-0.702413625188,-0.702481861957,-0.702550092269,-0.702618316124,-0.70268653352,-0.702754744457,-0.702822948935,-0.702891146952,-0.702959338509,-0.703027523604,-0.703095702237,-0.703163874407,-0.703232040114,-0.703300199358,-0.703368352136,-0.703436498449,-0.703504638297,-0.703572771678,-0.703640898592,-0.703709019038,-0.703777133016,-0.703845240524,-0.703913341564,-0.703981436133,-0.704049524231,-0.704117605858,-0.704185681012,-0.704253749694,-0.704321811903,-0.704389867637,-0.704457916897,-0.704525959682,-0.704593995991,-0.704662025823,-0.704730049179,-0.704798066056,-0.704866076456,-0.704934080376,-0.705002077817,-0.705070068777,-0.705138053257,-0.705206031255,-0.705274002771,-0.705341967804,-0.705409926354,-0.70547787842,-0.705545824001,-0.705613763097,-0.705681695708,-0.705749621831,-0.705817541468,-0.705885454617,-0.705953361278,-0.706021261449,-0.706089155131,-0.706157042323,-0.706224923024,-0.706292797234,-0.706360664951,-0.706428526176,-0.706496380907,-0.706564229145,-0.706632070888,-0.706699906135,-0.706767734887,-0.706835557142,-0.706903372901,-0.706971182161,-0.707038984923,-0.707106781187,-0.70717457095,-0.707242354214,-0.707310130976,-0.707377901238,-0.707445664997,-0.707513422253,-0.707581173006,-0.707648917256,-0.707716655,-0.70778438624,-0.707852110974,-0.707919829201,-0.707987540921,-0.708055246134,-0.708122944838,-0.708190637033,-0.708258322719,-0.708326001895,-0.70839367456,-0.708461340713,-0.708529000354,-0.708596653483,-0.708664300099,-0.7087319402,-0.708799573788,-0.70886720086,-0.708934821416,-0.709002435456,-0.709070042978,-0.709137643984,-0.709205238471,-0.709272826439,-0.709340407888,-0.709407982816,-0.709475551224,-0.70954311311,-0.709610668475,-0.709678217317,-0.709745759636,-0.70981329543,-0.709880824701,-0.709948347446,-0.710015863666,-0.710083373359,-0.710150876526,-0.710218373164,-0.710285863275,-0.710353346857,-0.71042082391,-0.710488294432,-0.710555758424,-0.710623215884,-0.710690666813,-0.710758111209,-0.710825549072,-0.710892980401,-0.710960405196,-0.711027823456,-0.71109523518,-0.711162640368,-0.711230039019,-0.711297431133,-0.711364816708,-0.711432195745,-0.711499568243,-0.7115669342,-0.711634293617,-0.711701646493,-0.711768992827,-0.711836332619,-0.711903665867,-0.711970992572,-0.712038312733,-0.712105626348,-0.712172933418,-0.712240233942,-0.71230752792,-0.71237481535,-0.712442096231,-0.712509370565,-0.712576638349,-0.712643899583,-0.712711154267,-0.712778402399,-0.71284564398,-0.712912879009,-0.712980107484,-0.713047329406,-0.713114544774,-0.713181753587,-0.713248955845,-0.713316151547,-0.713383340692,-0.71345052328,-0.713517699309,-0.713584868781,-0.713652031693,-0.713719188046,-0.713786337838,-0.713853481069,-0.713920617738,-0.713987747846,-0.71405487139,-0.714121988372,-0.714189098789,-0.714256202641,-0.714323299928,-0.714390390649,-0.714457474804,-0.714524552392,-0.714591623411,-0.714658687863,-0.714725745745,-0.714792797058,-0.714859841801,-0.714926879972,-0.714993911573,-0.715060936601,-0.715127955056,-0.715194966939,-0.715261972247,-0.715328970981,-0.715395963139,-0.715462948722,-0.715529927729,-0.715596900158,-0.71566386601,-0.715730825284,-0.715797777979,-0.715864724094,-0.715931663629,-0.715998596584,-0.716065522957,-0.716132442748,-0.716199355957,-0.716266262583,-0.716333162625,-0.716400056082,-0.716466942955,-0.716533823242,-0.716600696943,-0.716667564056,-0.716734424583,-0.716801278521,-0.716868125871,-0.716934966631,-0.717001800802,-0.717068628381,-0.71713544937,-0.717202263767,-0.717269071572,-0.717335872784,-0.717402667402,-0.717469455425,-0.717536236854,-0.717603011688,-0.717669779926,-0.717736541566,-0.71780329661,-0.717870045056,-0.717936786903,-0.718003522151,-0.718070250799,-0.718136972847,-0.718203688294,-0.71827039714,-0.718337099383,-0.718403795023,-0.718470484061,-0.718537166494,-0.718603842322,-0.718670511545,-0.718737174162,-0.718803830173,-0.718870479577,-0.718937122373,-0.71900375856,-0.719070388139,-0.719137011108,-0.719203627467,-0.719270237216,-0.719336840353,-0.719403436878,-0.71947002679,-0.719536610089,-0.719603186774,-0.719669756845,-0.719736320301,-0.719802877141,-0.719869427365,-0.719935970972,-0.720002507961,-0.720069038333,-0.720135562085,-0.720202079219,-0.720268589732,-0.720335093625,-0.720401590897,-0.720468081546,-0.720534565574,-0.720601042978,-0.720667513759,-0.720733977916,-0.720800435448,-0.720866886354,-0.720933330634,-0.720999768288,-0.721066199315,-0.721132623713,-0.721199041483,-0.721265452624,-0.721331857135,-0.721398255016,-0.721464646266,-0.721531030884,-0.72159740887,-0.721663780224,-0.721730144944,-0.72179650303,-0.721862854481,-0.721929199298,-0.721995537478,-0.722061869022,-0.722128193929,-0.722194512199,-0.72226082383,-0.722327128822,-0.722393427175,-0.722459718887,-0.722526003959,-0.72259228239,-0.722658554179,-0.722724819325,-0.722791077828,-0.722857329687,-0.722923574902,-0.722989813472,-0.723056045397,-0.723122270675,-0.723188489307,-0.723254701291,-0.723320906627,-0.723387105314,-0.723453297353,-0.723519482741,-0.723585661479,-0.723651833566,-0.723717999001,-0.723784157784,-0.723850309915,-0.723916455391,-0.723982594214,-0.724048726382,-0.724114851895,-0.724180970751,-0.724247082951,-0.724313188495,-0.72437928738,-0.724445379607,-0.724511465175,-0.724577544084,-0.724643616332,-0.724709681919,-0.724775740846,-0.72484179311,-0.724907838712,-0.72497387765,-0.725039909925,-0.725105935535,-0.72517195448,-0.72523796676,-0.725303972373,-0.72536997132,-0.725435963599,-0.72550194921,-0.725567928152,-0.725633900425,-0.725699866028,-0.725765824961,-0.725831777223,-0.725897722813,-0.72596366173,-0.726029593975,-0.726095519546,-0.726161438444,-0.726227350666,-0.726293256213,-0.726359155084,-0.726425047279,-0.726490932796,-0.726556811636,-0.726622683798,-0.72668854928,-0.726754408083,-0.726820260206,-0.726886105648,-0.726951944408,-0.727017776487,-0.727083601883,-0.727149420595,-0.727215232624,-0.727281037969,-0.727346836628,-0.727412628602,-0.72747841389,-0.727544192491,-0.727609964404,-0.72767572963,-0.727741488167,-0.727807240014,-0.727872985172,-0.727938723639,-0.728004455415,-0.7280701805,-0.728135898892,-0.728201610591,-0.728267315597,-0.728333013909,-0.728398705526,-0.728464390448,-0.728530068674,-0.728595740204,-0.728661405036,-0.728727063171,-0.728792714607,-0.728858359345,-0.728923997383,-0.728989628721,-0.729055253358,-0.729120871293,-0.729186482527,-0.729252087059,-0.729317684887,-0.729383276012,-0.729448860432,-0.729514438147,-0.729580009157,-0.72964557346,-0.729711131057,-0.729776681947,-0.729842226128,-0.729907763601,-0.729973294365,-0.730038818419,-0.730104335763,-0.730169846395,-0.730235350317,-0.730300847526,-0.730366338022,-0.730431821805,-0.730497298874,-0.730562769228,-0.730628232867,-0.73069368979,-0.730759139997,-0.730824583487,-0.73089002026,-0.730955450314,-0.731020873649,-0.731086290265,-0.731151700162,-0.731217103337,-0.731282499791,-0.731347889524,-0.731413272534,-0.731478648821,-0.731544018385,-0.731609381224,-0.731674737338,-0.731740086728,-0.731805429391,-0.731870765327,-0.731936094537,-0.732001417018,-0.732066732771,-0.732132041795,-0.73219734409,-0.732262639654,-0.732327928488,-0.73239321059,-0.73245848596,-0.732523754598,-0.732589016502,-0.732654271672,-0.732719520109,-0.73278476181,-0.732849996775,-0.732915225005,-0.732980446497,-0.733045661252,-0.733110869269,-0.733176070548,-0.733241265087,-0.733306452887,-0.733371633946,-0.733436808264,-0.733501975841,-0.733567136675,-0.733632290766,-0.733697438115,-0.733762578719,-0.733827712578,-0.733892839693,-0.733957960061,-0.734023073684,-0.734088180559,-0.734153280687,-0.734218374066,-0.734283460697,-0.734348540578,-0.73441361371,-0.73447868009,-0.73454373972,-0.734608792598,-0.734673838723,-0.734738878096,-0.734803910715,-0.73486893658,-0.73493395569,-0.734998968044,-0.735063973643,-0.735128972485,-0.73519396457,-0.735258949898,-0.735323928467,-0.735388900277,-0.735453865327,-0.735518823618,-0.735583775147,-0.735648719916,-0.735713657922,-0.735778589166,-0.735843513646,-0.735908431363,-0.735973342316,-0.736038246504,-0.736103143926,-0.736168034582,-0.736232918472,-0.736297795594,-0.736362665948,-0.736427529534,-0.736492386351,-0.736557236398,-0.736622079675,-0.736686916181,-0.736751745915,-0.736816568877,-0.736881385067,-0.736946194484,-0.737010997126,-0.737075792994,-0.737140582087,-0.737205364405,-0.737270139946,-0.73733490871,-0.737399670697,-0.737464425906,-0.737529174337,-0.737593915988,-0.737658650859,-0.73772337895,-0.73778810026,-0.737852814788,-0.737917522535,-0.737982223498,-0.738046917678,-0.738111605074,-0.738176285686,-0.738240959512,-0.738305626552,-0.738370286807,-0.738434940274,-0.738499586954,-0.738564226845,-0.738628859948,-0.738693486262,-0.738758105785,-0.738822718519,-0.738887324461,-0.738951923611,-0.739016515969,-0.739081101534,-0.739145680306,-0.739210252284,-0.739274817467,-0.739339375854,-0.739403927446,-0.739468472242,-0.73953301024,-0.739597541441,-0.739662065843,-0.739726583447,-0.739791094251,-0.739855598256,-0.73992009546,-0.739984585862,-0.740049069463,-0.740113546261,-0.740178016257,-0.740242479449,-0.740306935836,-0.740371385419,-0.740435828197,-0.740500264169,-0.740564693334,-0.740629115692,-0.740693531242,-0.740757939984,-0.740822341918,-0.740886737041,-0.740951125355,-0.741015506858,-0.74107988155,-0.74114424943,-0.741208610497,-0.741272964751,-0.741337312192,-0.741401652819,-0.741465986631,-0.741530313627,-0.741594633807,-0.741658947171,-0.741723253718,-0.741787553447,-0.741851846357,-0.741916132449,-0.741980411721,-0.742044684173,-0.742108949804,-0.742173208614,-0.742237460602,-0.742301705767,-0.74236594411,-0.742430175629,-0.742494400323,-0.742558618193,-0.742622829237,-0.742687033455,-0.742751230847,-0.742815421411,-0.742879605148,-0.742943782056,-0.743007952135,-0.743072115385,-0.743136271804,-0.743200421393,-0.74326456415,-0.743328700076,-0.743392829169,-0.743456951429,-0.743521066855,-0.743585175447,-0.743649277203,-0.743713372125,-0.74377746021,-0.743841541459,-0.743905615871,-0.743969683445,-0.74403374418,-0.744097798076,-0.744161845133,-0.74422588535,-0.744289918725,-0.74435394526,-0.744417964952,-0.744481977802,-0.744545983809,-0.744609982972,-0.744673975291,-0.744737960765,-0.744801939394,-0.744865911176,-0.744929876112,-0.744993834201,-0.745057785441,-0.745121729834,-0.745185667377,-0.745249598071,-0.745313521914,-0.745377438907,-0.745441349049,-0.745505252338,-0.745569148775,-0.745633038359,-0.745696921089,-0.745760796965,-0.745824665986,-0.745888528152,-0.745952383461,-0.746016231914,-0.74608007351,-0.746143908248,-0.746207736127,-0.746271557148,-0.746335371309,-0.74639917861,-0.74646297905,-0.746526772628,-0.746590559345,-0.746654339199,-0.746718112191,-0.746781878318,-0.746845637581,-0.74690938998,-0.746973135513,-0.74703687418,-0.74710060598,-0.747164330913,-0.747228048979,-0.747291760176,-0.747355464504,-0.747419161963,-0.747482852551,-0.747546536269,-0.747610213115,-0.74767388309,-0.747737546192,-0.747801202421,-0.747864851777,-0.747928494258,-0.747992129864,-0.748055758595,-0.74811938045,-0.748182995429,-0.74824660353,-0.748310204754,-0.748373799099,-0.748437386566,-0.748500967153,-0.74856454086,-0.748628107686,-0.748691667631,-0.748755220695,-0.748818766875,-0.748882306173,-0.748945838588,-0.749009364118,-0.749072882763,-0.749136394523,-0.749199899398,-0.749263397385,-0.749326888486,-0.749390372699,-0.749453850024,-0.74951732046,-0.749580784006,-0.749644240663,-0.749707690429,-0.749771133304,-0.749834569287,-0.749897998378,-0.749961420576,-0.75002483588,-0.750088244291,-0.750151645806,-0.750215040427,-0.750278428151,-0.75034180898,-0.750405182911,-0.750468549945,-0.75053191008,-0.750595263317,-0.750658609655,-0.750721949092,-0.750785281629,-0.750848607265,-0.750911926,-0.750975237832,-0.751038542762,-0.751101840788,-0.75116513191,-0.751228416127,-0.75129169344,-0.751354963846,-0.751418227347,-0.75148148394,-0.751544733626,-0.751607976404,-0.751671212274,-0.751734441234,-0.751797663284,-0.751860878424,-0.751924086654,-0.751987287971,-0.752050482377,-0.75211366987,-0.752176850449,-0.752240024115,-0.752303190866,-0.752366350702,-0.752429503623,-0.752492649627,-0.752555788715,-0.752618920886,-0.752682046138,-0.752745164472,-0.752808275887,-0.752871380382,-0.752934477957,-0.752997568612,-0.753060652344,-0.753123729155,-0.753186799044,-0.753249862009,-0.75331291805,-0.753375967167,-0.75343900936,-0.753502044627,-0.753565072968,-0.753628094382,-0.753691108869,-0.753754116428,-0.753817117059,-0.753880110761,-0.753943097533,-0.754006077376,-0.754069050288,-0.754132016268,-0.754194975317,-0.754257927433,-0.754320872617,-0.754383810866,-0.754446742182,-0.754509666563,-0.754572584008,-0.754635494518,-0.754698398092,-0.754761294728,-0.754824184426,-0.754887067187,-0.754949943009,-0.755012811891,-0.755075673834,-0.755138528836,-0.755201376897,-0.755264218016,-0.755327052193,-0.755389879427,-0.755452699718,-0.755515513065,-0.755578319467,-0.755641118924,-0.755703911436,-0.755766697001,-0.75582947562,-0.755892247291,-0.755955012014,-0.756017769788,-0.756080520614,-0.756143264489,-0.756206001414,-0.756268731389,-0.756331454412,-0.756394170483,-0.756456879601,-0.756519581766,-0.756582276977,-0.756644965234,-0.756707646536,-0.756770320883,-0.756832988273,-0.756895648707,-0.756958302184,-0.757020948703,-0.757083588263,-0.757146220865,-0.757208846506,-0.757271465188,-0.75733407691,-0.757396681669,-0.757459279468,-0.757521870303,-0.757584454176,-0.757647031085,-0.75770960103,-0.757772164011,-0.757834720026,-0.757897269075,-0.757959811158,-0.758022346273,-0.758084874422,-0.758147395602,-0.758209909813,-0.758272417055,-0.758334917327,-0.758397410629,-0.75845989696,-0.758522376319,-0.758584848705,-0.75864731412,-0.75870977256,-0.758772224027,-0.75883466852,-0.758897106037,-0.758959536579,-0.759021960145,-0.759084376733,-0.759146786345,-0.759209188978,-0.759271584633,-0.759333973309,-0.759396355006,-0.759458729722,-0.759521097457,-0.759583458211,-0.759645811984,-0.759708158773,-0.75977049858,-0.759832831403,-0.759895157241,-0.759957476095,-0.760019787964,-0.760082092846,-0.760144390742,-0.760206681651,-0.760268965573,-0.760331242506,-0.76039351245,-0.760455775405,-0.76051803137,-0.760580280344,-0.760642522328,-0.760704757319,-0.760766985319,-0.760829206325,-0.760891420339,-0.760953627358,-0.761015827383,-0.761078020412,-0.761140206446,-0.761202385484,-0.761264557525,-0.761326722569,-0.761388880615,-0.761451031662,-0.76151317571,-0.761575312758,-0.761637442806,-0.761699565854,-0.761761681899,-0.761823790943,-0.761885892985,-0.761947988023,-0.762010076058,-0.762072157089,-0.762134231114,-0.762196298135,-0.762258358149,-0.762320411157,-0.762382457158,-0.762444496151,-0.762506528136,-0.762568553112,-0.762630571078,-0.762692582035,-0.762754585981,-0.762816582917,-0.76287857284,-0.762940555752,-0.76300253165,-0.763064500535,-0.763126462407,-0.763188417263,-0.763250365105,-0.763312305931,-0.763374239741,-0.763436166534,-0.76349808631,-0.763559999068,-0.763621904807,-0.763683803528,-0.763745695228,-0.763807579909,-0.763869457569,-0.763931328207,-0.763993191824,-0.764055048418,-0.764116897989,-0.764178740536,-0.764240576059,-0.764302404558,-0.764364226031,-0.764426040479,-0.7644878479,-0.764549648293,-0.76461144166,-0.764673227998,-0.764735007308,-0.764796779588,-0.764858544838,-0.764920303058,-0.764982054247,-0.765043798405,-0.76510553553,-0.765167265622,-0.765228988682,-0.765290704707,-0.765352413699,-0.765414115655,-0.765475810575,-0.76553749846,-0.765599179308,-0.765660853119,-0.765722519892,-0.765784179626,-0.765845832322,-0.765907477978,-0.765969116594,-0.76603074817,-0.766092372704,-0.766153990196,-0.766215600647,-0.766277204054,-0.766338800418,-0.766400389738,-0.766461972013,-0.766523547243,-0.766585115427,-0.766646676565,-0.766708230657,-0.7667697777,-0.766831317696,-0.766892850643,-0.766954376542,-0.76701589539,-0.767077407188,-0.767138911936,-0.767200409632,-0.767261900276,-0.767323383868,-0.767384860406,-0.767446329891,-0.767507792322,-0.767569247698,-0.767630696018,-0.767692137283,-0.767753571491,-0.767814998642,-0.767876418736,-0.767937831772,-0.767999237748,-0.768060636666,-0.768122028523,-0.768183413321,-0.768244791057,-0.768306161731,-0.768367525344,-0.768428881894,-0.768490231381,-0.768551573804,-0.768612909162,-0.768674237456,-0.768735558684,-0.768796872846,-0.768858179941,-0.76891947997,-0.76898077293,-0.769042058822,-0.769103337646,-0.769164609399,-0.769225874083,-0.769287131697,-0.769348382239,-0.76940962571,-0.769470862108,-0.769532091433,-0.769593313685,-0.769654528864,-0.769715736967,-0.769776937996,-0.769838131949,-0.769899318826,-0.769960498626,-0.770021671348,-0.770082836993,-0.77014399556,-0.770205147047,-0.770266291455,-0.770327428783,-0.77038855903,-0.770449682196,-0.77051079828,-0.770571907281,-0.7706330092,-0.770694104035,-0.770755191786,-0.770816272453,-0.770877346034,-0.77093841253,-0.770999471939,-0.771060524262,-0.771121569497,-0.771182607644,-0.771243638702,-0.771304662672,-0.771365679552,-0.771426689341,-0.77148769204,-0.771548687647,-0.771609676163,-0.771670657586,-0.771731631916,-0.771792599152,-0.771853559294,-0.771914512342,-0.771975458294,-0.77203639715,-0.77209732891,-0.772158253573,-0.772219171139,-0.772280081606,-0.772340984975,-0.772401881245,-0.772462770415,-0.772523652484,-0.772584527453,-0.77264539532,-0.772706256086,-0.772767109748,-0.772827956308,-0.772888795764,-0.772949628116,-0.773010453363,-0.773071271504,-0.77313208254,-0.773192886469,-0.773253683291,-0.773314473006,-0.773375255613,-0.77343603111,-0.773496799499,-0.773557560778,-0.773618314946,-0.773679062003,-0.773739801949,-0.773800534783,-0.773861260504,-0.773921979112,-0.773982690607,-0.774043394987,-0.774104092252,-0.774164782402,-0.774225465436,-0.774286141353,-0.774346810154,-0.774407471836,-0.774468126401,-0.774528773846,-0.774589414173,-0.774650047379,-0.774710673466,-0.774771292431,-0.774831904274,-0.774892508996,-0.774953106595,-0.775013697071,-0.775074280423,-0.77513485665,-0.775195425753,-0.77525598773,-0.775316542582,-0.775377090306,-0.775437630904,-0.775498164374,-0.775558690716,-0.775619209929,-0.775679722013,-0.775740226967,-0.77580072479,-0.775861215483,-0.775921699043,-0.775982175472,-0.776042644768,-0.776103106931,-0.77616356196,-0.776224009855,-0.776284450615,-0.776344884239,-0.776405310728,-0.77646573008,-0.776526142295,-0.776586547372,-0.776646945311,-0.776707336111,-0.776767719772,-0.776828096293,-0.776888465673,-0.776948827913,-0.777009183011,-0.777069530967,-0.77712987178,-0.77719020545,-0.777250531976,-0.777310851358,-0.777371163595,-0.777431468687,-0.777491766632,-0.777552057431,-0.777612341083,-0.777672617588,-0.777732886944,-0.777793149151,-0.777853404209,-0.777913652118,-0.777973892876,-0.778034126482,-0.778094352938,-0.778154572241,-0.778214784392,-0.778274989389,-0.778335187233,-0.778395377922,-0.778455561457,-0.778515737836,-0.778575907059,-0.778636069126,-0.778696224036,-0.778756371788,-0.778816512381,-0.778876645817,-0.778936772093,-0.778996891209,-0.779057003164,-0.779117107959,-0.779177205593,-0.779237296064,-0.779297379373,-0.779357455518,-0.7794175245,-0.779477586318,-0.779537640971,-0.779597688458,-0.77965772878,-0.779717761935,-0.779777787923,-0.779837806744,-0.779897818396,-0.77995782288,-0.780017820195,-0.78007781034,-0.780137793314,-0.780197769118,-0.78025773775,-0.780317699211,-0.780377653499,-0.780437600613,-0.780497540555,-0.780557473322,-0.780617398914,-0.780677317331,-0.780737228572,-0.780797132637,-0.780857029525,-0.780916919235,-0.780976801768,-0.781036677122,-0.781096545296,-0.781156406291,-0.781216260106,-0.78127610674,-0.781335946193,-0.781395778464,-0.781455603552,-0.781515421458,-0.78157523218,-0.781635035718,-0.781694832071,-0.781754621239,-0.781814403222,-0.781874178018,-0.781933945627,-0.781993706049,-0.782053459283,-0.782113205328,-0.782172944185,-0.782232675852,-0.782292400329,-0.782352117615,-0.78241182771,-0.782471530613,-0.782531226324,-0.782590914842,-0.782650596167,-0.782710270297,-0.782769937233,-0.782829596975,-0.78288924952,-0.782948894869,-0.783008533022,-0.783068163977,-0.783127787735,-0.783187404294,-0.783247013655,-0.783306615816,-0.783366210777,-0.783425798537,-0.783485379096,-0.783544952454,-0.78360451861,-0.783664077562,-0.783723629312,-0.783783173858,-0.783842711199,-0.783902241336,-0.783961764266,-0.784021279991,-0.78408078851,-0.784140289821,-0.784199783925,-0.78425927082,-0.784318750507,-0.784378222984,-0.784437688252,-0.784497146309,-0.784556597156,-0.78461604079,-0.784675477213,-0.784734906423,-0.78479432842,-0.784853743204,-0.784913150773,-0.784972551128,-0.785031944267,-0.78509133019,-0.785150708897,-0.785210080387,-0.78526944466,-0.785328801714,-0.78538815155,-0.785447494167,-0.785506829564,-0.785566157741,-0.785625478697,-0.785684792432,-0.785744098945,-0.785803398236,-0.785862690303,-0.785921975148,-0.785981252768,-0.786040523163,-0.786099786334,-0.786159042279,-0.786218290997,-0.786277532489,-0.786336766754,-0.786395993791,-0.786455213599,-0.786514426179,-0.786573631529,-0.786632829648,-0.786692020538,-0.786751204196,-0.786810380623,-0.786869549817,-0.786928711779,-0.786987866507,-0.787047014002,-0.787106154262,-0.787165287288,-0.787224413078,-0.787283531631,-0.787342642949,-0.787401747029,-0.787460843872,-0.787519933476,-0.787579015842,-0.787638090968,-0.787697158855,-0.787756219501,-0.787815272907,-0.787874319071,-0.787933357993,-0.787992389673,-0.788051414109,-0.788110431302,-0.788169441251,-0.788228443955,-0.788287439414,-0.788346427627,-0.788405408593,-0.788464382313,-0.788523348786,-0.78858230801,-0.788641259986,-0.788700204714,-0.788759142191,-0.788818072418,-0.788876995395,-0.788935911121,-0.788994819595,-0.789053720816,-0.789112614785,-0.7891715015,-0.789230380962,-0.789289253169,-0.789348118121,-0.789406975818,-0.789465826258,-0.789524669442,-0.789583505369,-0.789642334038,-0.789701155449,-0.789759969601,-0.789818776494,-0.789877576127,-0.789936368499,-0.789995153611,-0.790053931461,-0.790112702049,-0.790171465375,-0.790230221437,-0.790288970236,-0.790347711771,-0.790406446041,-0.790465173046,-0.790523892785,-0.790582605257,-0.790641310463,-0.790700008402,-0.790758699072,-0.790817382474,-0.790876058607,-0.790934727471,-0.790993389064,-0.791052043386,-0.791110690438,-0.791169330218,-0.791227962725,-0.79128658796,-0.791345205921,-0.791403816609,-0.791462420022,-0.79152101616,-0.791579605023,-0.791638186609,-0.791696760919,-0.791755327952,-0.791813887707,-0.791872440184,-0.791930985383,-0.791989523302,-0.792048053941,-0.7921065773,-0.792165093378,-0.792223602175,-0.79228210369,-0.792340597922,-0.792399084871,-0.792457564537,-0.792516036918,-0.792574502015,-0.792632959827,-0.792691410353,-0.792749853593,-0.792808289546,-0.792866718212,-0.79292513959,-0.792983553679,-0.793041960479,-0.79310035999,-0.793158752211,-0.793217137142,-0.793275514781,-0.793333885129,-0.793392248185,-0.793450603948,-0.793508952417,-0.793567293593,-0.793625627475,-0.793683954062,-0.793742273353,-0.793800585349,-0.793858890048,-0.79391718745,-0.793975477554,-0.794033760361,-0.794092035869,-0.794150304078,-0.794208564987,-0.794266818596,-0.794325064904,-0.794383303911,-0.794441535616,-0.794499760019,-0.794557977119,-0.794616186915,-0.794674389408,-0.794732584596,-0.794790772479,-0.794848953057,-0.794907126328,-0.794965292293,-0.795023450951,-0.795081602301,-0.795139746343,-0.795197883076,-0.7952560125,-0.795314134613,-0.795372249417,-0.79543035691,-0.795488457091,-0.79554654996,-0.795604635517,-0.795662713761,-0.795720784691,-0.795778848307,-0.795836904609,-0.795894953595,-0.795952995266,-0.79601102962,-0.796069056658,-0.796127076378,-0.796185088781,-0.796243093865,-0.79630109163,-0.796359082076,-0.796417065202,-0.796475041008,-0.796533009492,-0.796590970655,-0.796648924495,-0.796706871013,-0.796764810208,-0.79682274208,-0.796880666627,-0.796938583849,-0.796996493746,-0.797054396317,-0.797112291562,-0.79717017948,-0.79722806007,-0.797285933333,-0.797343799267,-0.797401657872,-0.797459509147,-0.797517353093,-0.797575189708,-0.797633018991,-0.797690840943,-0.797748655563,-0.79780646285,-0.797864262804,-0.797922055424,-0.79797984071,-0.798037618661,-0.798095389276,-0.798153152556,-0.798210908499,-0.798268657105,-0.798326398373,-0.798384132304,-0.798441858896,-0.798499578149,-0.798557290062,-0.798614994635,-0.798672691867,-0.798730381758,-0.798788064308,-0.798845739515,-0.798903407379,-0.7989610679,-0.799018721077,-0.799076366909,-0.799134005397,-0.799191636539,-0.799249260335,-0.799306876785,-0.799364485888,-0.799422087643,-0.79947968205,-0.799537269108,-0.799594848817,-0.799652421176,-0.799709986186,-0.799767543844,-0.799825094151,-0.799882637106,-0.799940172709,-0.799997700959,-0.800055221856,-0.800112735399,-0.800170241587,-0.80022774042,-0.800285231898,-0.80034271602,-0.800400192785,-0.800457662193,-0.800515124243,-0.800572578935,-0.800630026269,-0.800687466243,-0.800744898857,-0.800802324112,-0.800859742005,-0.800917152537,-0.800974555708,-0.801031951515,-0.80108933996,-0.801146721042,-0.80120409476,-0.801261461113,-0.801318820101,-0.801376171723,-0.80143351598,-0.801490852869,-0.801548182392,-0.801605504547,-0.801662819334,-0.801720126752,-0.801777426801,-0.80183471948,-0.801892004789,-0.801949282727,-0.802006553293,-0.802063816488,-0.802121072311,-0.80217832076,-0.802235561836,-0.802292795538,-0.802350021866,-0.802407240818,-0.802464452395,-0.802521656596,-0.80257885342,-0.802636042867,-0.802693224937,-0.802750399628,-0.802807566941,-0.802864726874,-0.802921879428,-0.802979024601,-0.803036162393,-0.803093292804,-0.803150415834,-0.803207531481,-0.803264639745,-0.803321740625,-0.803378834122,-0.803435920234,-0.803492998961,-0.803550070303,-0.803607134258,-0.803664190827,-0.803721240009,-0.803778281803,-0.803835316209,-0.803892343226,-0.803949362854,-0.804006375093,-0.804063379941,-0.804120377398,-0.804177367464,-0.804234350139,-0.80429132542,-0.804348293309,-0.804405253805,-0.804462206907,-0.804519152614,-0.804576090926,-0.804633021843,-0.804689945364,-0.804746861488,-0.804803770215,-0.804860671545,-0.804917565476,-0.804974452009,-0.805031331143,-0.805088202877,-0.805145067211,-0.805201924144,-0.805258773676,-0.805315615806,-0.805372450534,-0.805429277859,-0.80548609778,-0.805542910298,-0.805599715412,-0.80565651312,-0.805713303423,-0.805770086321,-0.805826861811,-0.805883629895,-0.805940390571,-0.805997143839,-0.806053889699,-0.80611062815,-0.806167359191,-0.806224082821,-0.806280799042,-0.806337507851,-0.806394209248,-0.806450903233,-0.806507589806,-0.806564268965,-0.80662094071,-0.806677605041,-0.806734261958,-0.806790911459,-0.806847553544,-0.806904188213,-0.806960815464,-0.807017435299,-0.807074047716,-0.807130652714,-0.807187250293,-0.807243840452,-0.807300423192,-0.807356998511,-0.807413566409,-0.807470126886,-0.80752667994,-0.807583225572,-0.80763976378,-0.807696294565,-0.807752817926,-0.807809333862,-0.807865842373,-0.807922343458,-0.807978837117,-0.80803532335,-0.808091802154,-0.808148273531,-0.80820473748,-0.808261194,-0.808317643091,-0.808374084751,-0.808430518982,-0.808486945781,-0.808543365149,-0.808599777085,-0.808656181588,-0.808712578659,-0.808768968296,-0.808825350499,-0.808881725267,-0.8089380926,-0.808994452498,-0.80905080496,-0.809107149985,-0.809163487572,-0.809219817723,-0.809276140435,-0.809332455708,-0.809388763542,-0.809445063937,-0.809501356891,-0.809557642404,-0.809613920476,-0.809670191106,-0.809726454294,-0.80978271004,-0.809838958341,-0.809895199199,-0.809951432613,-0.810007658582,-0.810063877105,-0.810120088182,-0.810176291813,-0.810232487997,-0.810288676733,-0.810344858022,-0.810401031862,-0.810457198253,-0.810513357194,-0.810569508685,-0.810625652726,-0.810681789315,-0.810737918453,-0.810794040139,-0.810850154372,-0.810906261152,-0.810962360479,-0.811018452351,-0.811074536768,-0.811130613731,-0.811186683237,-0.811242745287,-0.811298799881,-0.811354847017,-0.811410886695,-0.811466918916,-0.811522943677,-0.811578960979,-0.811634970821,-0.811690973202,-0.811746968123,-0.811802955583,-0.81185893558,-0.811914908115,-0.811970873187,-0.812026830796,-0.81208278094,-0.81213872362,-0.812194658836,-0.812250586585,-0.812306506869,-0.812362419686,-0.812418325036,-0.812474222918,-0.812530113333,-0.812585996278,-0.812641871755,-0.812697739762,-0.812753600299,-0.812809453365,-0.81286529896,-0.812921137083,-0.812976967734,-0.813032790913,-0.813088606618,-0.813144414849,-0.813200215606,-0.813256008889,-0.813311794696,-0.813367573027,-0.813423343883,-0.813479107261,-0.813534863162,-0.813590611585,-0.81364635253,-0.813702085995,-0.813757811982,-0.813813530489,-0.813869241515,-0.81392494506,-0.813980641124,-0.814036329706,-0.814092010805,-0.814147684422,-0.814203350555,-0.814259009204,-0.814314660369,-0.814370304048,-0.814425940242,-0.81448156895,-0.814537190172,-0.814592803906,-0.814648410153,-0.814704008912,-0.814759600182,-0.814815183964,-0.814870760255,-0.814926329057,-0.814981890367,-0.815037444187,-0.815092990515,-0.815148529351,-0.815204060694,-0.815259584544,-0.8153151009,-0.815370609762,-0.81542611113,-0.815481605002,-0.815537091378,-0.815592570259,-0.815648041642,-0.815703505528,-0.815758961917,-0.815814410807,-0.815869852198,-0.81592528609,-0.815980712482,-0.816036131374,-0.816091542765,-0.816146946655,-0.816202343043,-0.816257731928,-0.816313113311,-0.81636848719,-0.816423853566,-0.816479212437,-0.816534563803,-0.816589907664,-0.816645244018,-0.816700572867,-0.816755894208,-0.816811208042,-0.816866514368,-0.816921813186,-0.816977104494,-0.817032388294,-0.817087664583,-0.817142933361,-0.817198194629,-0.817253448385,-0.817308694629,-0.817363933361,-0.817419164579,-0.817474388284,-0.817529604475,-0.817584813152,-0.817640014313,-0.817695207959,-0.817750394088,-0.817805572701,-0.817860743797,-0.817915907376,-0.817971063436,-0.818026211978,-0.818081353,-0.818136486503,-0.818191612486,-0.818246730948,-0.818301841889,-0.818356945309,-0.818412041206,-0.81846712958,-0.818522210432,-0.818577283759,-0.818632349563,-0.818687407842,-0.818742458595,-0.818797501823,-0.818852537525,-0.8189075657,-0.818962586347,-0.819017599467,-0.819072605059,-0.819127603122,-0.819182593656,-0.81923757666,-0.819292552134,-0.819347520077,-0.819402480489,-0.819457433369,-0.819512378716,-0.819567316531,-0.819622246813,-0.819677169561,-0.819732084774,-0.819786992453,-0.819841892596,-0.819896785204,-0.819951670275,-0.82000654781,-0.820061417807,-0.820116280266,-0.820171135187,-0.820225982569,-0.820280822412,-0.820335654715,-0.820390479478,-0.8204452967,-0.82050010638,-0.820554908519,-0.820609703115,-0.820664490168,-0.820719269678,-0.820774041644,-0.820828806066,-0.820883562943,-0.820938312274,-0.82099305406,-0.821047788299,-0.821102514991,-0.821157234136,-0.821211945733,-0.821266649781,-0.821321346281,-0.821376035231,-0.821430716632,-0.821485390482,-0.821540056781,-0.821594715528,-0.821649366724,-0.821704010367,-0.821758646457,-0.821813274994,-0.821867895977,-0.821922509406,-0.821977115279,-0.822031713597,-0.82208630436,-0.822140887565,-0.822195463214,-0.822250031306,-0.822304591839,-0.822359144814,-0.82241369023,-0.822468228087,-0.822522758383,-0.822577281119,-0.822631796295,-0.822686303908,-0.82274080396,-0.822795296449,-0.822849781376,-0.822904258739,-0.822958728538,-0.823013190772,-0.823067645442,-0.823122092546,-0.823176532084,-0.823230964056,-0.82328538846,-0.823339805298,-0.823394214567,-0.823448616268,-0.8235030104,-0.823557396962,-0.823611775954,-0.823666147376,-0.823720511227,-0.823774867507,-0.823829216215,-0.82388355735,-0.823937890912,-0.8239922169,-0.824046535315,-0.824100846156,-0.824155149421,-0.824209445111,-0.824263733225,-0.824318013762,-0.824372286723,-0.824426552106,-0.824480809911,-0.824535060137,-0.824589302785,-0.824643537853,-0.824697765342,-0.824751985249,-0.824806197576,-0.824860402322,-0.824914599485,-0.824968789066,-0.825022971065,-0.825077145479,-0.82513131231,-0.825185471556,-0.825239623218,-0.825293767294,-0.825347903784,-0.825402032688,-0.825456154004,-0.825510267734,-0.825564373875,-0.825618472428,-0.825672563392,-0.825726646767,-0.825780722552,-0.825834790746,-0.82588885135,-0.825942904362,-0.825996949782,-0.82605098761,-0.826105017845,-0.826159040486,-0.826213055534,-0.826267062987,-0.826321062846,-0.826375055109,-0.826429039776,-0.826483016847,-0.826536986321,-0.826590948197,-0.826644902476,-0.826698849157,-0.826752788238,-0.826806719721,-0.826860643603,-0.826914559885,-0.826968468567,-0.827022369647,-0.827076263125,-0.827130149001,-0.827184027274,-0.827237897943,-0.827291761009,-0.827345616471,-0.827399464328,-0.82745330458,-0.827507137226,-0.827560962265,-0.827614779698,-0.827668589524,-0.827722391741,-0.827776186351,-0.827829973352,-0.827883752743,-0.827937524525,-0.827991288697,-0.828045045258,-0.828098794207,-0.828152535545,-0.828206269271,-0.828259995384,-0.828313713884,-0.828367424771,-0.828421128043,-0.8284748237,-0.828528511742,-0.828582192169,-0.828635864979,-0.828689530173,-0.82874318775,-0.828796837709,-0.82885048005,-0.828904114772,-0.828957741875,-0.829011361359,-0.829064973222,-0.829118577465,-0.829172174087,-0.829225763087,-0.829279344465,-0.829332918221,-0.829386484353,-0.829440042862,-0.829493593747,-0.829547137008,-0.829600672643,-0.829654200653,-0.829707721037,-0.829761233795,-0.829814738925,-0.829868236428,-0.829921726303,-0.829975208549,-0.830028683167,-0.830082150155,-0.830135609513,-0.830189061241,-0.830242505338,-0.830295941803,-0.830349370637,-0.830402791838,-0.830456205406,-0.830509611341,-0.830563009642,-0.830616400309,-0.830669783341,-0.830723158737,-0.830776526498,-0.830829886622,-0.83088323911,-0.83093658396,-0.830989921172,-0.831043250746,-0.831096572682,-0.831149886978,-0.831203193634,-0.83125649265,-0.831309784026,-0.83136306776,-0.831416343852,-0.831469612303,-0.83152287311,-0.831576126274,-0.831629371795,-0.831682609672,-0.831735839904,-0.83178906249,-0.831842277432,-0.831895484727,-0.831948684375,-0.832001876376,-0.83205506073,-0.832108237436,-0.832161406493,-0.832214567901,-0.832267721659,-0.832320867768,-0.832374006226,-0.832427137033,-0.832480260188,-0.832533375692,-0.832586483543,-0.832639583741,-0.832692676286,-0.832745761176,-0.832798838413,-0.832851907994,-0.83290496992,-0.83295802419,-0.833011070804,-0.833064109761,-0.83311714106,-0.833170164702,-0.833223180685,-0.83327618901,-0.833329189675,-0.833382182681,-0.833435168026,-0.83348814571,-0.833541115733,-0.833594078095,-0.833647032794,-0.833699979831,-0.833752919204,-0.833805850914,-0.833858774959,-0.83391169134,-0.833964600056,-0.834017501106,-0.83407039449,-0.834123280207,-0.834176158258,-0.83422902864,-0.834281891355,-0.834334746401,-0.834387593778,-0.834440433486,-0.834493265524,-0.834546089891,-0.834598906587,-0.834651715612,-0.834704516965,-0.834757310645,-0.834810096652,-0.834862874986,-0.834915645647,-0.834968408632,-0.835021163943,-0.835073911579,-0.835126651539,-0.835179383822,-0.835232108429,-0.835284825358,-0.83533753461,-0.835390236183,-0.835442930078,-0.835495616294,-0.835548294829,-0.835600965685,-0.83565362886,-0.835706284354,-0.835758932166,-0.835811572296,-0.835864204743,-0.835916829508,-0.835969446589,-0.836022055985,-0.836074657698,-0.836127251725,-0.836179838066,-0.836232416722,-0.836284987691,-0.836337550974,-0.836390106568,-0.836442654475,-0.836495194694,-0.836547727224,-0.836600252064,-0.836652769214,-0.836705278674,-0.836757780444,-0.836810274522,-0.836862760908,-0.836915239602,-0.836967710603,-0.837020173911,-0.837072629525,-0.837125077445,-0.837177517671,-0.837229950201,-0.837282375035,-0.837334792174,-0.837387201616,-0.83743960336,-0.837491997408,-0.837544383757,-0.837596762407,-0.837649133359,-0.837701496611,-0.837753852163,-0.837806200015,-0.837858540166,-0.837910872615,-0.837963197363,-0.838015514408,-0.83806782375,-0.838120125389,-0.838172419324,-0.838224705555,-0.838276984081,-0.838329254902,-0.838381518017,-0.838433773425,-0.838486021127,-0.838538261122,-0.838590493409,-0.838642717989,-0.838694934859,-0.83874714402,-0.838799345472,-0.838851539214,-0.838903725245,-0.838955903565,-0.839008074174,-0.83906023707,-0.839112392254,-0.839164539726,-0.839216679484,-0.839268811527,-0.839320935857,-0.839373052472,-0.839425161371,-0.839477262555,-0.839529356022,-0.839581441772,-0.839633519805,-0.839685590121,-0.839737652718,-0.839789707597,-0.839841754756,-0.839893794196,-0.839945825916,-0.839997849915,-0.840049866193,-0.840101874749,-0.840153875583,-0.840205868695,-0.840257854084,-0.84030983175,-0.840361801691,-0.840413763908,-0.8404657184,-0.840517665167,-0.840569604208,-0.840621535522,-0.84067345911,-0.84072537497,-0.840777283103,-0.840829183508,-0.840881076183,-0.84093296113,-0.840984838347,-0.841036707833,-0.841088569589,-0.841140423614,-0.841192269908,-0.841244108469,-0.841295939298,-0.841347762394,-0.841399577756,-0.841451385384,-0.841503185278,-0.841554977437,-0.84160676186,-0.841658538548,-0.841710307499,-0.841762068714,-0.841813822191,-0.841865567931,-0.841917305932,-0.841969036194,-0.842020758718,-0.842072473501,-0.842124180545,-0.842175879848,-0.842227571409,-0.842279255229,-0.842330931308,-0.842382599643,-0.842434260236,-0.842485913085,-0.84253755819,-0.842589195551,-0.842640825167,-0.842692447037,-0.842744061162,-0.84279566754,-0.842847266172,-0.842898857056,-0.842950440192,-0.84300201558,-0.84305358322,-0.84310514311,-0.843156695251,-0.843208239642,-0.843259776282,-0.843311305171,-0.843362826308,-0.843414339694,-0.843465845327,-0.843517343207,-0.843568833333,-0.843620315706,-0.843671790324,-0.843723257188,-0.843774716296,-0.843826167648,-0.843877611244,-0.843929047084,-0.843980475166,-0.84403189549,-0.844083308056,-0.844134712864,-0.844186109912,-0.844237499201,-0.84428888073,-0.844340254499,-0.844391620506,-0.844442978752,-0.844494329236,-0.844545671957,-0.844597006916,-0.844648334111,-0.844699653543,-0.84475096521,-0.844802269113,-0.84485356525,-0.844904853621,-0.844956134226,-0.845007407065,-0.845058672137,-0.845109929441,-0.845161178976,-0.845212420744,-0.845263654742,-0.845314880971,-0.84536609943,-0.845417310118,-0.845468513036,-0.845519708182,-0.845570895556,-0.845622075158,-0.845673246987,-0.845724411043,-0.845775567326,-0.845826715834,-0.845877856567,-0.845928989525,-0.845980114708,-0.846031232115,-0.846082341745,-0.846133443598,-0.846184537674,-0.846235623971,-0.846286702491,-0.846337773231,-0.846388836192,-0.846439891373,-0.846490938774,-0.846541978394,-0.846593010233,-0.84664403429,-0.846695050565,-0.846746059058,-0.846797059767,-0.846848052693,-0.846899037834,-0.846950015192,-0.847000984764,-0.84705194655,-0.847102900551,-0.847153846766,-0.847204785193,-0.847255715833,-0.847306638686,-0.84735755375,-0.847408461025,-0.847459360512,-0.847510252208,-0.847561136115,-0.847612012231,-0.847662880555,-0.847713741089,-0.84776459383,-0.847815438779,-0.847866275935,-0.847917105297,-0.847967926866,-0.84801874064,-0.848069546619,-0.848120344803,-0.848171135192,-0.848221917784,-0.848272692579,-0.848323459578,-0.848374218779,-0.848424970181,-0.848475713785,-0.848526449591,-0.848577177596,-0.848627897802,-0.848678610207,-0.848729314812,-0.848780011615,-0.848830700616,-0.848881381815,-0.848932055212,-0.848982720805,-0.849033378594,-0.84908402858,-0.84913467076,-0.849185305136,-0.849235931706,-0.84928655047,-0.849337161428,-0.849387764579,-0.849438359922,-0.849488947457,-0.849539527185,-0.849590099103,-0.849640663212,-0.849691219512,-0.849741768001,-0.849792308679,-0.849842841547,-0.849893366603,-0.849943883847,-0.849994393278,-0.850044894897,-0.850095388702,-0.850145874693,-0.850196352869,-0.850246823231,-0.850297285778,-0.850347740509,-0.850398187424,-0.850448626522,-0.850499057802,-0.850549481266,-0.850599896911,-0.850650304737,-0.850700704745,-0.850751096933,-0.850801481302,-0.850851857849,-0.850902226576,-0.850952587482,-0.851002940566,-0.851053285828,-0.851103623267,-0.851153952883,-0.851204274675,-0.851254588643,-0.851304894787,-0.851355193105,-0.851405483598,-0.851455766266,-0.851506041106,-0.85155630812,-0.851606567307,-0.851656818666,-0.851707062196,-0.851757297898,-0.851807525771,-0.851857745814,-0.851907958027,-0.851958162409,-0.85200835896,-0.85205854768,-0.852108728568,-0.852158901624,-0.852209066847,-0.852259224236,-0.852309373792,-0.852359515513,-0.8524096494,-0.852459775451,-0.852509893667,-0.852560004047,-0.85261010659,-0.852660201296,-0.852710288165,-0.852760367196,-0.852810438388,-0.852860501742,-0.852910557256,-0.85296060493,-0.853010644765,-0.853060676758,-0.853110700911,-0.853160717221,-0.85321072569,-0.853260726316,-0.8533107191,-0.853360704039,-0.853410681135,-0.853460650387,-0.853510611793,-0.853560565355,-0.85361051107,-0.85366044894,-0.853710378962,-0.853760301138,-0.853810215466,-0.853860121946,-0.853910020578,-0.85395991136,-0.854009794293,-0.854059669377,-0.85410953661,-0.854159395992,-0.854209247523,-0.854259091202,-0.854308927029,-0.854358755003,-0.854408575125,-0.854458387392,-0.854508191806,-0.854557988365,-0.85460777707,-0.854657557919,-0.854707330912,-0.854757096049,-0.854806853329,-0.854856602752,-0.854906344317,-0.854956078025,-0.855005803873,-0.855055521863,-0.855105231993,-0.855154934263,-0.855204628673,-0.855254315222,-0.855303993909,-0.855353664735,-0.855403327699,-0.8554529828,-0.855502630037,-0.855552269412,-0.855601900922,-0.855651524567,-0.855701140348,-0.855750748263,-0.855800348313,-0.855849940496,-0.855899524812,-0.855949101261,-0.855998669842,-0.856048230555,-0.8560977834,-0.856147328375,-0.856196865481,-0.856246394717,-0.856295916083,-0.856345429577,-0.8563949352,-0.856444432952,-0.856493922831,-0.856543404838,-0.856592878971,-0.856642345231,-0.856691803616,-0.856741254128,-0.856790696764,-0.856840131525,-0.856889558409,-0.856938977418,-0.85698838855,-0.857037791804,-0.857087187181,-0.857136574679,-0.857185954299,-0.85723532604,-0.857284689901,-0.857334045883,-0.857383393984,-0.857432734204,-0.857482066543,-0.857531390999,-0.857580707574,-0.857630016266,-0.857679317075,-0.85772861,-0.857777895041,-0.857827172198,-0.85787644147,-0.857925702856,-0.857974956357,-0.858024201971,-0.858073439698,-0.858122669538,-0.858171891491,-0.858221105555,-0.858270311731,-0.858319510017,-0.858368700414,-0.858417882922,-0.858467057538,-0.858516224264,-0.858565383099,-0.858614534042,-0.858663677093,-0.858712812251,-0.858761939516,-0.858811058887,-0.858860170365,-0.858909273948,-0.858958369636,-0.859007457429,-0.859056537325,-0.859105609326,-0.85915467343,-0.859203729637,-0.859252777946,-0.859301818357,-0.85935085087,-0.859399875483,-0.859448892197,-0.859497901012,-0.859546901926,-0.859595894939,-0.859644880051,-0.859693857261,-0.859742826569,-0.859791787975,-0.859840741477,-0.859889687077,-0.859938624772,-0.859987554563,-0.860036476449,-0.860085390429,-0.860134296504,-0.860183194673,-0.860232084935,-0.860280967291,-0.860329841738,-0.860378708278,-0.860427566909,-0.860476417632,-0.860525260445,-0.860574095348,-0.860622922341,-0.860671741424,-0.860720552595,-0.860769355855,-0.860818151202,-0.860866938638,-0.86091571816,-0.860964489769,-0.861013253464,-0.861062009245,-0.861110757112,-0.861159497063,-0.861208229099,-0.861256953218,-0.861305669421,-0.861354377707,-0.861403078076,-0.861451770527,-0.861500455059,-0.861549131673,-0.861597800368,-0.861646461143,-0.861695113998,-0.861743758933,-0.861792395946,-0.861841025038,-0.861889646209,-0.861938259456,-0.861986864782,-0.862035462184,-0.862084051662,-0.862132633216,-0.862181206846,-0.862229772551,-0.86227833033,-0.862326880184,-0.862375422111,-0.862423956111,-0.862472482184,-0.86252100033,-0.862569510547,-0.862618012836,-0.862666507196,-0.862714993626,-0.862763472126,-0.862811942697,-0.862860405336,-0.862908860044,-0.862957306821,-0.863005745665,-0.863054176577,-0.863102599555,-0.863151014601,-0.863199421712,-0.863247820889,-0.863296212131,-0.863344595439,-0.86339297081,-0.863441338245,-0.863489697744,-0.863538049305,-0.86358639293,-0.863634728616,-0.863683056364,-0.863731376173,-0.863779688043,-0.863827991973,-0.863876287963,-0.863924576013,-0.863972856122,-0.864021128289,-0.864069392514,-0.864117648797,-0.864165897137,-0.864214137534,-0.864262369987,-0.864310594496,-0.864358811061,-0.86440701968,-0.864455220354,-0.864503413082,-0.864551597864,-0.864599774699,-0.864647943587,-0.864696104527,-0.864744257519,-0.864792402563,-0.864840539658,-0.864888668803,-0.864936789998,-0.864984903243,-0.865033008537,-0.86508110588,-0.865129195272,-0.865177276711,-0.865225350198,-0.865273415731,-0.865321473312,-0.865369522938,-0.865417564611,-0.865465598328,-0.865513624091,-0.865561641897,-0.865609651748,-0.865657653642,-0.865705647579,-0.865753633559,-0.865801611581,-0.865849581645,-0.86589754375,-0.865945497896,-0.865993444082,-0.866041382309,-0.866089312575,-0.86613723488,-0.866185149223,-0.866233055605,-0.866280954025,-0.866328844481,-0.866376726975,-0.866424601505,-0.866472468072,-0.866520326674,-0.866568177311,-0.866616019982,-0.866663854688,-0.866711681428,-0.866759500201,-0.866807311007,-0.866855113845,-0.866902908716,-0.866950695618,-0.866998474552,-0.867046245516,-0.86709400851,-0.867141763534,-0.867189510588,-0.867237249671,-0.867284980782,-0.867332703921,-0.867380419088,-0.867428126282,-0.867475825503,-0.867523516751,-0.867571200024,-0.867618875323,-0.867666542646,-0.867714201995,-0.867761853367,-0.867809496763,-0.867857132183,-0.867904759625,-0.86795237909,-0.867999990577,-0.868047594085,-0.868095189614,-0.868142777164,-0.868190356734,-0.868237928324,-0.868285491934,-0.868333047562,-0.868380595209,-0.868428134873,-0.868475666556,-0.868523190255,-0.868570705971,-0.868618213704,-0.868665713452,-0.868713205216,-0.868760688995,-0.868808164788,-0.868855632595,-0.868903092416,-0.868950544251,-0.868997988098,-0.869045423957,-0.869092851828,-0.869140271711,-0.869187683605,-0.86923508751,-0.869282483424,-0.869329871349,-0.869377251282,-0.869424623225,-0.869471987176,-0.869519343135,-0.869566691101,-0.869614031075,-0.869661363056,-0.869708687042,-0.869756003035,-0.869803311033,-0.869850611035,-0.869897903043,-0.869945187054,-0.869992463069,-0.870039731088,-0.870086991109,-0.870134243132,-0.870181487157,-0.870228723184,-0.870275951212,-0.870323171241,-0.870370383269,-0.870417587298,-0.870464783325,-0.870511971352,-0.870559151377,-0.8706063234,-0.870653487421,-0.870700643438,-0.870747791453,-0.870794931464,-0.87084206347,-0.870889187472,-0.870936303469,-0.87098341146,-0.871030511446,-0.871077603425,-0.871124687398,-0.871171763363,-0.871218831321,-0.87126589127,-0.871312943212,-0.871359987144,-0.871407023067,-0.87145405098,-0.871501070883,-0.871548082775,-0.871595086656,-0.871642082526,-0.871689070383,-0.871736050229,-0.871783022061,-0.87182998588,-0.871876941686,-0.871923889477,-0.871970829254,-0.872017761016,-0.872064684763,-0.872111600493,-0.872158508208,-0.872205407906,-0.872252299586,-0.872299183249,-0.872346058894,-0.872392926521,-0.872439786129,-0.872486637717,-0.872533481286,-0.872580316835,-0.872627144363,-0.87267396387,-0.872720775356,-0.87276757882,-0.872814374261,-0.87286116168,-0.872907941076,-0.872954712448,-0.873001475796,-0.87304823112,-0.873094978418,-0.873141717692,-0.873188448939,-0.873235172161,-0.873281887356,-0.873328594524,-0.873375293664,-0.873421984777,-0.873468667861,-0.873515342917,-0.873562009943,-0.87360866894,-0.873655319907,-0.873701962843,-0.873748597749,-0.873795224623,-0.873841843465,-0.873888454276,-0.873935057053,-0.873981651798,-0.874028238509,-0.874074817186,-0.874121387829,-0.874167950438,-0.874214505011,-0.874261051548,-0.87430759005,-0.874354120515,-0.874400642943,-0.874447157334,-0.874493663687,-0.874540162002,-0.874586652278,-0.874633134516,-0.874679608713,-0.874726074872,-0.874772532989,-0.874818983066,-0.874865425102,-0.874911859097,-0.874958285049,-0.875004702959,-0.875051112826,-0.87509751465,-0.87514390843,-0.875190294165,-0.875236671857,-0.875283041503,-0.875329403104,-0.875375756659,-0.875422102168,-0.87546843963,-0.875514769045,-0.875561090413,-0.875607403732,-0.875653709003,-0.875700006226,-0.875746295399,-0.875792576522,-0.875838849595,-0.875885114618,-0.87593137159,-0.87597762051,-0.876023861379,-0.876070094195,-0.876116318959,-0.87616253567,-0.876208744327,-0.87625494493,-0.876301137479,-0.876347321973,-0.876393498412,-0.876439666796,-0.876485827123,-0.876531979394,-0.876578123608,-0.876624259764,-0.876670387863,-0.876716507904,-0.876762619886,-0.876808723809,-0.876854819673,-0.876900907477,-0.87694698722,-0.876993058903,-0.877039122525,-0.877085178085,-0.877131225583,-0.877177265019,-0.877223296392,-0.877269319701,-0.877315334947,-0.877361342129,-0.877407341246,-0.877453332299,-0.877499315286,-0.877545290207,-0.877591257062,-0.877637215851,-0.877683166572,-0.877729109226,-0.877775043812,-0.87782097033,-0.877866888779,-0.877912799159,-0.877958701469,-0.878004595709,-0.878050481879,-0.878096359978,-0.878142230005,-0.878188091961,-0.878233945845,-0.878279791657,-0.878325629395,-0.87837145906,-0.878417280651,-0.878463094168,-0.87850889961,-0.878554696977,-0.878600486269,-0.878646267485,-0.878692040625,-0.878737805687,-0.878783562673,-0.878829311581,-0.878875052411,-0.878920785162,-0.878966509835,-0.879012226429,-0.879057934942,-0.879103635376,-0.879149327729,-0.879195012001,-0.879240688192,-0.879286356301,-0.879332016328,-0.879377668272,-0.879423312133,-0.879468947911,-0.879514575604,-0.879560195214,-0.879605806739,-0.879651410178,-0.879697005532,-0.8797425928,-0.879788171982,-0.879833743076,-0.879879306084,-0.879924861004,-0.879970407836,-0.880015946579,-0.880061477233,-0.880106999798,-0.880152514274,-0.880198020659,-0.880243518953,-0.880289009157,-0.880334491269,-0.880379965289,-0.880425431217,-0.880470889052,-0.880516338794,-0.880561780443,-0.880607213998,-0.880652639458,-0.880698056824,-0.880743466094,-0.880788867269,-0.880834260348,-0.88087964533,-0.880925022216,-0.880970391004,-0.881015751694,-0.881061104287,-0.881106448781,-0.881151785176,-0.881197113471,-0.881242433667,-0.881287745763,-0.881333049758,-0.881378345652,-0.881423633444,-0.881468913135,-0.881514184723,-0.881559448209,-0.881604703592,-0.881649950871,-0.881695190046,-0.881740421117,-0.881785644083,-0.881830858944,-0.881876065699,-0.881921264348,-0.881966454891,-0.882011637327,-0.882056811656,-0.882101977877,-0.88214713599,-0.882192285994,-0.88223742789,-0.882282561676,-0.882327687352,-0.882372804919,-0.882417914374,-0.882463015719,-0.882508108952,-0.882553194074,-0.882598271083,-0.88264333998,-0.882688400763,-0.882733453433,-0.882778497989,-0.882823534431,-0.882868562758,-0.88291358297,-0.882958595066,-0.883003599047,-0.883048594911,-0.883093582658,-0.883138562288,-0.883183533801,-0.883228497195,-0.883273452471,-0.883318399628,-0.883363338666,-0.883408269584,-0.883453192382,-0.883498107059,-0.883543013616,-0.883587912051,-0.883632802365,-0.883677684556,-0.883722558625,-0.883767424571,-0.883812282393,-0.883857132091,-0.883901973666,-0.883946807116,-0.88399163244,-0.884036449639,-0.884081258713,-0.88412605966,-0.88417085248,-0.884215637173,-0.884260413739,-0.884305182177,-0.884349942486,-0.884394694667,-0.884439438718,-0.88448417464,-0.884528902432,-0.884573622094,-0.884618333624,-0.884663037024,-0.884707732292,-0.884752419428,-0.884797098431,-0.884841769301,-0.884886432039,-0.884931086642,-0.884975733112,-0.885020371447,-0.885065001647,-0.885109623711,-0.88515423764,-0.885198843433,-0.885243441089,-0.885288030609,-0.885332611991,-0.885377185235,-0.885421750341,-0.885466307308,-0.885510856136,-0.885555396825,-0.885599929374,-0.885644453783,-0.885688970051,-0.885733478178,-0.885777978164,-0.885822470007,-0.885866953709,-0.885911429268,-0.885955896683,-0.886000355955,-0.886044807084,-0.886089250067,-0.886133684907,-0.8861781116,-0.886222530149,-0.886266940551,-0.886311342807,-0.886355736917,-0.886400122879,-0.886444500693,-0.88648887036,-0.886533231878,-0.886577585247,-0.886621930467,-0.886666267537,-0.886710596458,-0.886754917228,-0.886799229847,-0.886843534314,-0.88688783063,-0.886932118794,-0.886976398806,-0.887020670664,-0.88706493437,-0.887109189921,-0.887153437319,-0.887197676562,-0.88724190765,-0.887286130582,-0.887330345359,-0.88737455198,-0.887418750444,-0.887462940752,-0.887507122901,-0.887551296894,-0.887595462728,-0.887639620403,-0.887683769919,-0.887727911276,-0.887772044473,-0.88781616951,-0.887860286387,-0.887904395102,-0.887948495656,-0.887992588048,-0.888036672278,-0.888080748345,-0.888124816249,-0.88816887599,-0.888212927566,-0.888256970979,-0.888301006227,-0.88834503331,-0.888389052227,-0.888433062978,-0.888477065564,-0.888521059982,-0.888565046233,-0.888609024317,-0.888652994233,-0.888696955981,-0.88874090956,-0.88878485497,-0.88882879221,-0.88887272128,-0.88891664218,-0.88896055491,-0.889004459468,-0.889048355855,-0.889092244069,-0.889136124112,-0.889179995981,-0.889223859678,-0.889267715201,-0.88931156255,-0.889355401724,-0.889399232724,-0.889443055549,-0.889486870198,-0.889530676671,-0.889574474968,-0.889618265088,-0.889662047031,-0.889705820796,-0.889749586383,-0.889793343792,-0.889837093022,-0.889880834073,-0.889924566944,-0.889968291635,-0.890012008146,-0.890055716476,-0.890099416625,-0.890143108592,-0.890186792378,-0.890230467981,-0.890274135401,-0.890317794637,-0.890361445691,-0.89040508856,-0.890448723245,-0.890492349745,-0.89053596806,-0.890579578189,-0.890623180132,-0.890666773889,-0.890710359459,-0.890753936841,-0.890797506036,-0.890841067043,-0.890884619862,-0.890928164492,-0.890971700932,-0.891015229183,-0.891058749244,-0.891102261115,-0.891145764795,-0.891189260283,-0.89123274758,-0.891276226685,-0.891319697597,-0.891363160317,-0.891406614843,-0.891450061176,-0.891493499315,-0.891536929259,-0.891580351009,-0.891623764563,-0.891667169922,-0.891710567084,-0.891753956051,-0.89179733682,-0.891840709392,-0.891884073767,-0.891927429944,-0.891970777922,-0.892014117701,-0.892057449282,-0.892100772662,-0.892144087843,-0.892187394823,-0.892230693602,-0.892273984181,-0.892317266557,-0.892360540732,-0.892403806704,-0.892447064474,-0.89249031404,-0.892533555403,-0.892576788562,-0.892620013516,-0.892663230265,-0.89270643881,-0.892749639149,-0.892792831282,-0.892836015208,-0.892879190928,-0.892922358441,-0.892965517746,-0.893008668843,-0.893051811732,-0.893094946412,-0.893138072883,-0.893181191144,-0.893224301196,-0.893267403037,-0.893310496667,-0.893353582086,-0.893396659294,-0.89343972829,-0.893482789074,-0.893525841644,-0.893568886002,-0.893611922146,-0.893654950077,-0.893697969793,-0.893740981294,-0.893783984581,-0.893826979651,-0.893869966506,-0.893912945145,-0.893955915567,-0.893998877772,-0.89404183176,-0.89408477753,-0.894127715081,-0.894170644414,-0.894213565528,-0.894256478422,-0.894299383097,-0.894342279551,-0.894385167785,-0.894428047798,-0.894470919589,-0.894513783159,-0.894556638506,-0.894599485631,-0.894642324533,-0.894685155212,-0.894727977667,-0.894770791897,-0.894813597903,-0.894856395685,-0.89489918524,-0.894941966571,-0.894984739675,-0.895027504552,-0.895070261203,-0.895113009626,-0.895155749822,-0.895198481789,-0.895241205528,-0.895283921039,-0.89532662832,-0.895369327371,-0.895412018192,-0.895454700783,-0.895497375143,-0.895540041272,-0.895582699169,-0.895625348834,-0.895667990267,-0.895710623467,-0.895753248434,-0.895795865167,-0.895838473666,-0.895881073931,-0.895923665961,-0.895966249756,-0.896008825316,-0.896051392639,-0.896093951727,-0.896136502577,-0.896179045191,-0.896221579567,-0.896264105705,-0.896306623604,-0.896349133266,-0.896391634688,-0.89643412787,-0.896476612813,-0.896519089516,-0.896561557978,-0.896604018199,-0.896646470179,-0.896688913917,-0.896731349412,-0.896773776665,-0.896816195676,-0.896858606442,-0.896901008965,-0.896943403244,-0.896985789279,-0.897028167068,-0.897070536613,-0.897112897911,-0.897155250964,-0.89719759577,-0.897239932329,-0.897282260641,-0.897324580705,-0.897366892522,-0.89740919609,-0.897451491409,-0.897493778479,-0.897536057299,-0.89757832787,-0.89762059019,-0.897662844259,-0.897705090077,-0.897747327644,-0.897789556959,-0.897831778021,-0.897873990831,-0.897916195388,-0.897958391691,-0.898000579741,-0.898042759536,-0.898084931077,-0.898127094362,-0.898169249393,-0.898211396167,-0.898253534685,-0.898295664947,-0.898337786952,-0.898379900699,-0.898422006189,-0.898464103421,-0.898506192394,-0.898548273108,-0.898590345563,-0.898632409759,-0.898674465694,-0.898716513369,-0.898758552783,-0.898800583936,-0.898842606827,-0.898884621457,-0.898926627824,-0.898968625928,-0.899010615769,-0.899052597347,-0.89909457066,-0.89913653571,-0.899178492495,-0.899220441014,-0.899262381269,-0.899304313257,-0.899346236979,-0.899388152435,-0.899430059624,-0.899471958545,-0.899513849198,-0.899555731584,-0.899597605701,-0.899639471549,-0.899681329127,-0.899723178436,-0.899765019475,-0.899806852244,-0.899848676742,-0.899890492968,-0.899932300923,-0.899974100606,-0.900015892016,-0.900057675154,-0.900099450019,-0.90014121661,-0.900182974927,-0.90022472497,-0.900266466738,-0.900308200231,-0.900349925449,-0.900391642391,-0.900433351056,-0.900475051445,-0.900516743558,-0.900558427392,-0.900600102949,-0.900641770228,-0.900683429229,-0.90072507995,-0.900766722392,-0.900808356555,-0.900849982438,-0.90089160004,-0.900933209361,-0.900974810401,-0.90101640316,-0.901057987636,-0.901099563831,-0.901141131742,-0.901182691371,-0.901224242716,-0.901265785777,-0.901307320554,-0.901348847046,-0.901390365253,-0.901431875175,-0.901473376811,-0.901514870161,-0.901556355225,-0.901597832001,-0.90163930049,-0.901680760692,-0.901722212606,-0.901763656231,-0.901805091567,-0.901846518614,-0.901887937371,-0.901929347839,-0.901970750016,-0.902012143902,-0.902053529498,-0.902094906802,-0.902136275814,-0.902177636533,-0.902218988961,-0.902260333095,-0.902301668935,-0.902342996482,-0.902384315735,-0.902425626694,-0.902466929357,-0.902508223725,-0.902549509798,-0.902590787574,-0.902632057054,-0.902673318237,-0.902714571123,-0.902755815712,-0.902797052002,-0.902838279995,-0.902879499688,-0.902920711082,-0.902961914177,-0.903003108973,-0.903044295468,-0.903085473662,-0.903126643555,-0.903167805147,-0.903208958438,-0.903250103426,-0.903291240112,-0.903332368495,-0.903373488574,-0.90341460035,-0.903455703822,-0.90349679899,-0.903537885853,-0.903578964411,-0.903620034663,-0.903661096609,-0.903702150249,-0.903743195583,-0.903784232609,-0.903825261328,-0.90386628174,-0.903907293843,-0.903948297638,-0.903989293123,-0.9040302803,-0.904071259167,-0.904112229724,-0.90415319197,-0.904194145906,-0.90423509153,-0.904276028843,-0.904316957844,-0.904357878533,-0.904398790909,-0.904439694972,-0.904480590721,-0.904521478157,-0.904562357279,-0.904603228086,-0.904644090578,-0.904684944755,-0.904725790616,-0.904766628162,-0.90480745739,-0.904848278302,-0.904889090897,-0.904929895174,-0.904970691134,-0.905011478775,-0.905052258097,-0.9050930291,-0.905133791784,-0.905174546148,-0.905215292192,-0.905256029916,-0.905296759318,-0.905337480399,-0.905378193159,-0.905418897596,-0.905459593711,-0.905500281504,-0.905540960973,-0.905581632118,-0.90562229494,-0.905662949437,-0.90570359561,-0.905744233458,-0.90578486298,-0.905825484176,-0.905866097047,-0.90590670159,-0.905947297807,-0.905987885697,-0.906028465259,-0.906069036493,-0.906109599398,-0.906150153975,-0.906190700223,-0.906231238141,-0.906271767729,-0.906312288987,-0.906352801915,-0.906393306511,-0.906433802776,-0.906474290709,-0.90651477031,-0.906555241579,-0.906595704515,-0.906636159117,-0.906676605386,-0.906717043321,-0.906757472922,-0.906797894188,-0.906838307119,-0.906878711714,-0.906919107974,-0.906959495897,-0.906999875484,-0.907040246734,-0.907080609646,-0.907120964221,-0.907161310458,-0.907201648356,-0.907241977915,-0.907282299136,-0.907322612016,-0.907362916557,-0.907403212758,-0.907443500618,-0.907483780137,-0.907524051314,-0.90756431415,-0.907604568643,-0.907644814795,-0.907685052603,-0.907725282068,-0.907765503189,-0.907805715966,-0.907845920399,-0.907886116488,-0.907926304231,-0.907966483629,-0.90800665468,-0.908046817386,-0.908086971745,-0.908127117757,-0.908167255422,-0.908207384739,-0.908247505709,-0.908287618329,-0.908327722601,-0.908367818524,-0.908407906097,-0.908447985321,-0.908488056194,-0.908528118716,-0.908568172888,-0.908608218708,-0.908648256176,-0.908688285293,-0.908728306056,-0.908768318467,-0.908808322525,-0.908848318229,-0.90888830558,-0.908928284576,-0.908968255217,-0.909008217503,-0.909048171434,-0.909088117009,-0.909128054228,-0.909167983091,-0.909207903596,-0.909247815744,-0.909287719535,-0.909327614968,-0.909367502042,-0.909407380758,-0.909447251114,-0.909487113112,-0.909526966749,-0.909566812026,-0.909606648943,-0.909646477498,-0.909686297693,-0.909726109525,-0.909765912996,-0.909805708105,-0.90984549485,-0.909885273233,-0.909925043252,-0.909964804907,-0.910004558198,-0.910044303125,-0.910084039686,-0.910123767883,-0.910163487713,-0.910203199178,-0.910242902276,-0.910282597007,-0.910322283372,-0.910361961368,-0.910401630997,-0.910441292258,-0.91048094515,-0.910520589673,-0.910560225827,-0.910599853612,-0.910639473026,-0.91067908407,-0.910718686743,-0.910758281044,-0.910797866975,-0.910837444533,-0.91087701372,-0.910916574533,-0.910956126974,-0.910995671042,-0.911035206735,-0.911074734055,-0.911114253001,-0.911153763571,-0.911193265767,-0.911232759586,-0.911272245031,-0.911311722098,-0.91135119079,-0.911390651104,-0.911430103041,-0.911469546601,-0.911508981782,-0.911548408585,-0.911587827009,-0.911627237054,-0.91166663872,-0.911706032005,-0.911745416911,-0.911784793436,-0.91182416158,-0.911863521343,-0.911902872724,-0.911942215723,-0.91198155034,-0.912020876574,-0.912060194424,-0.912099503892,-0.912138804975,-0.912178097675,-0.91221738199,-0.91225665792,-0.912295925464,-0.912335184623,-0.912374435396,-0.912413677783,-0.912452911783,-0.912492137396,-0.912531354622,-0.912570563459,-0.912609763909,-0.91264895597,-0.912688139642,-0.912727314925,-0.912766481818,-0.912805640322,-0.912844790435,-0.912883932157,-0.912923065488,-0.912962190428,-0.913001306977,-0.913040415133,-0.913079514896,-0.913118606267,-0.913157689245,-0.913196763829,-0.913235830019,-0.913274887815,-0.913313937216,-0.913352978222,-0.913392010833,-0.913431035049,-0.913470050868,-0.91350905829,-0.913548057316,-0.913587047945,-0.913626030177,-0.91366500401,-0.913703969445,-0.913742926482,-0.91378187512,-0.913820815358,-0.913859747197,-0.913898670636,-0.913937585674,-0.913976492312,-0.914015390549,-0.914054280384,-0.914093161817,-0.914132034849,-0.914170899478,-0.914209755704,-0.914248603526,-0.914287442945,-0.914326273961,-0.914365096571,-0.914403910778,-0.914442716579,-0.914481513975,-0.914520302965,-0.914559083549,-0.914597855727,-0.914636619498,-0.914675374862,-0.914714121818,-0.914752860366,-0.914791590506,-0.914830312238,-0.914869025561,-0.914907730474,-0.914946426978,-0.914985115072,-0.915023794755,-0.915062466028,-0.915101128889,-0.91513978334,-0.915178429378,-0.915217067005,-0.915255696218,-0.915294317019,-0.915332929407,-0.915371533382,-0.915410128942,-0.915448716088,-0.91548729482,-0.915525865136,-0.915564427038,-0.915602980523,-0.915641525593,-0.915680062246,-0.915718590483,-0.915757110302,-0.915795621704,-0.915834124688,-0.915872619254,-0.915911105402,-0.91594958313,-0.91598805244,-0.916026513329,-0.916064965799,-0.916103409849,-0.916141845478,-0.916180272686,-0.916218691473,-0.916257101838,-0.916295503781,-0.916333897301,-0.916372282399,-0.916410659074,-0.916449027325,-0.916487387153,-0.916525738556,-0.916564081535,-0.916602416089,-0.916640742218,-0.916679059921,-0.916717369198,-0.916755670049,-0.916793962474,-0.916832246471,-0.916870522041,-0.916908789184,-0.916947047898,-0.916985298184,-0.917023540041,-0.91706177347,-0.917099998468,-0.917138215037,-0.917176423176,-0.917214622885,-0.917252814162,-0.917290997008,-0.917329171423,-0.917367337406,-0.917405494957,-0.917443644075,-0.91748178476,-0.917519917012,-0.91755804083,-0.917596156214,-0.917634263164,-0.917672361679,-0.917710451759,-0.917748533404,-0.917786606613,-0.917824671385,-0.917862727722,-0.917900775621,-0.917938815084,-0.917976846109,-0.918014868696,-0.918052882845,-0.918090888555,-0.918128885827,-0.918166874659,-0.918204855051,-0.918242827004,-0.918280790517,-0.918318745588,-0.918356692219,-0.918394630408,-0.918432560156,-0.918470481462,-0.918508394325,-0.918546298746,-0.918584194723,-0.918622082257,-0.918659961348,-0.918697831994,-0.918735694196,-0.918773547952,-0.918811393264,-0.91884923013,-0.918887058551,-0.918924878525,-0.918962690052,-0.919000493133,-0.919038287766,-0.919076073952,-0.91911385169,-0.91915162098,-0.919189381821,-0.919227134212,-0.919264878155,-0.919302613648,-0.919340340691,-0.919378059283,-0.919415769425,-0.919453471116,-0.919491164355,-0.919528849142,-0.919566525478,-0.919604193361,-0.919641852791,-0.919679503768,-0.919717146291,-0.919754780361,-0.919792405976,-0.919830023137,-0.919867631843,-0.919905232094,-0.919942823889,-0.919980407229,-0.920017982112,-0.920055548538,-0.920093106508,-0.92013065602,-0.920168197074,-0.920205729671,-0.920243253809,-0.920280769489,-0.920318276709,-0.92035577547,-0.920393265772,-0.920430747613,-0.920468220994,-0.920505685914,-0.920543142373,-0.920580590371,-0.920618029907,-0.920655460981,-0.920692883592,-0.920730297741,-0.920767703426,-0.920805100648,-0.920842489406,-0.9208798697,-0.920917241529,-0.920954604894,-0.920991959793,-0.921029306227,-0.921066644194,-0.921103973696,-0.921141294731,-0.921178607299,-0.921215911399,-0.921253207033,-0.921290494198,-0.921327772894,-0.921365043123,-0.921402304882,-0.921439558172,-0.921476802992,-0.921514039342,-0.921551267222,-0.921588486631,-0.921625697569,-0.921662900036,-0.921700094031,-0.921737279554,-0.921774456604,-0.921811625182,-0.921848785286,-0.921885936918,-0.921923080075,-0.921960214758,-0.921997340967,-0.922034458701,-0.92207156796,-0.922108668743,-0.922145761051,-0.922182844882,-0.922219920237,-0.922256987115,-0.922294045516,-0.922331095439,-0.922368136885,-0.922405169852,-0.922442194341,-0.922479210351,-0.922516217881,-0.922553216932,-0.922590207503,-0.922627189594,-0.922664163205,-0.922701128334,-0.922738084982,-0.922775033148,-0.922811972833,-0.922848904035,-0.922885826755,-0.922922740991,-0.922959646745,-0.922996544014,-0.9230334328,-0.923070313101,-0.923107184918,-0.92314404825,-0.923180903096,-0.923217749457,-0.923254587331,-0.92329141672,-0.923328237621,-0.923365050036,-0.923401853963,-0.923438649402,-0.923475436354,-0.923512214817,-0.923548984791,-0.923585746276,-0.923622499272,-0.923659243778,-0.923695979794,-0.92373270732,-0.923769426355,-0.923806136898,-0.923842838951,-0.923879532511,-0.92391621758,-0.923952894156,-0.923989562239,-0.924026221829,-0.924062872926,-0.924099515529,-0.924136149637,-0.924172775252,-0.924209392371,-0.924246000996,-0.924282601125,-0.924319192758,-0.924355775895,-0.924392350535,-0.924428916679,-0.924465474325,-0.924502023474,-0.924538564125,-0.924575096279,-0.924611619933,-0.924648135089,-0.924684641745,-0.924721139902,-0.92475762956,-0.924794110717,-0.924830583373,-0.924867047529,-0.924903503183,-0.924939950336,-0.924976388987,-0.925012819136,-0.925049240783,-0.925085653926,-0.925122058567,-0.925158454703,-0.925194842336,-0.925231221465,-0.92526759209,-0.925303954209,-0.925340307823,-0.925376652932,-0.925412989535,-0.925449317631,-0.925485637221,-0.925521948305,-0.925558250881,-0.925594544949,-0.92563083051,-0.925667107562,-0.925703376106,-0.925739636141,-0.925775887667,-0.925812130683,-0.92584836519,-0.925884591186,-0.925920808672,-0.925957017647,-0.92599321811,-0.926029410062,-0.926065593503,-0.926101768431,-0.926137934846,-0.926174092749,-0.926210242138,-0.926246383014,-0.926282515376,-0.926318639224,-0.926354754558,-0.926390861376,-0.926426959679,-0.926463049467,-0.926499130739,-0.926535203495,-0.926571267734,-0.926607323457,-0.926643370662,-0.92667940935,-0.92671543952,-0.926751461171,-0.926787474305,-0.926823478919,-0.926859475014,-0.92689546259,-0.926931441646,-0.926967412182,-0.927003374197,-0.927039327691,-0.927075272665,-0.927111209117,-0.927147137047,-0.927183056455,-0.92721896734,-0.927254869703,-0.927290763542,-0.927326648858,-0.92736252565,-0.927398393919,-0.927434253662,-0.927470104881,-0.927505947575,-0.927541781743,-0.927577607386,-0.927613424502,-0.927649233093,-0.927685033156,-0.927720824692,-0.927756607701,-0.927792382182,-0.927828148135,-0.92786390556,-0.927899654456,-0.927935394823,-0.92797112666,-0.928006849968,-0.928042564746,-0.928078270993,-0.92811396871,-0.928149657895,-0.92818533855,-0.928221010672,-0.928256674263,-0.928292329321,-0.928327975847,-0.928363613839,-0.928399243299,-0.928434864224,-0.928470476616,-0.928506080473,-0.928541675796,-0.928577262584,-0.928612840836,-0.928648410553,-0.928683971734,-0.928719524379,-0.928755068487,-0.928790604058,-0.928826131092,-0.928861649588,-0.928897159547,-0.928932660967,-0.928968153849,-0.929003638192,-0.929039113995,-0.929074581259,-0.929110039984,-0.929145490168,-0.929180931811,-0.929216364914,-0.929251789475,-0.929287205496,-0.929322612974,-0.92935801191,-0.929393402304,-0.929428784155,-0.929464157462,-0.929499522227,-0.929534878447,-0.929570226124,-0.929605565256,-0.929640895843,-0.929676217885,-0.929711531382,-0.929746836334,-0.929782132739,-0.929817420598,-0.92985269991,-0.929887970675,-0.929923232893,-0.929958486563,-0.929993731685,-0.930028968259,-0.930064196284,-0.93009941576,-0.930134626687,-0.930169829065,-0.930205022892,-0.930240208169,-0.930275384896,-0.930310553072,-0.930345712696,-0.93038086377,-0.930416006291,-0.93045114026,-0.930486265676,-0.93052138254,-0.93055649085,-0.930591590607,-0.930626681811,-0.93066176446,-0.930696838554,-0.930731904094,-0.930766961079,-0.930802009508,-0.930837049382,-0.9308720807,-0.930907103461,-0.930942117665,-0.930977123313,-0.931012120403,-0.931047108936,-0.93108208891,-0.931117060326,-0.931152023184,-0.931186977483,-0.931221923222,-0.931256860402,-0.931291789022,-0.931326709081,-0.93136162058,-0.931396523518,-0.931431417895,-0.931466303711,-0.931501180965,-0.931536049656,-0.931570909785,-0.931605761351,-0.931640604354,-0.931675438794,-0.93171026467,-0.931745081982,-0.931779890729,-0.931814690912,-0.931849482529,-0.931884265582,-0.931919040068,-0.931953805989,-0.931988563343,-0.932023312131,-0.932058052351,-0.932092784005,-0.932127507091,-0.932162221609,-0.932196927558,-0.932231624939,-0.932266313752,-0.932300993995,-0.932335665668,-0.932370328772,-0.932404983305,-0.932439629268,-0.932474266661,-0.932508895482,-0.932543515732,-0.93257812741,-0.932612730516,-0.932647325049,-0.93268191101,-0.932716488398,-0.932751057213,-0.932785617454,-0.932820169121,-0.932854712213,-0.932889246731,-0.932923772674,-0.932958290042,-0.932992798835,-0.933027299051,-0.933061790692,-0.933096273755,-0.933130748242,-0.933165214152,-0.933199671485,-0.933234120239,-0.933268560416,-0.933302992014,-0.933337415033,-0.933371829474,-0.933406235335,-0.933440632616,-0.933475021317,-0.933509401438,-0.933543772979,-0.933578135938,-0.933612490317,-0.933646836113,-0.933681173328,-0.933715501961,-0.933749822011,-0.933784133478,-0.933818436362,-0.933852730663,-0.93388701638,-0.933921293513,-0.933955562061,-0.933989822025,-0.934024073403,-0.934058316197,-0.934092550404,-0.934126776026,-0.934160993061,-0.93419520151,-0.934229401372,-0.934263592646,-0.934297775334,-0.934331949433,-0.934366114944,-0.934400271866,-0.9344344202,-0.934468559945,-0.9345026911,-0.934536813665,-0.93457092764,-0.934605033025,-0.93463912982,-0.934673218023,-0.934707297635,-0.934741368655,-0.934775431084,-0.93480948492,-0.934843530163,-0.934877566814,-0.934911594872,-0.934945614336,-0.934979625206,-0.935013627482,-0.935047621163,-0.93508160625,-0.935115582742,-0.935149550638,-0.935183509939,-0.935217460644,-0.935251402752,-0.935285336264,-0.935319261179,-0.935353177496,-0.935387085216,-0.935420984338,-0.935454874862,-0.935488756787,-0.935522630114,-0.935556494841,-0.93559035097,-0.935624198498,-0.935658037426,-0.935691867754,-0.935725689481,-0.935759502607,-0.935793307132,-0.935827103055,-0.935860890377,-0.935894669096,-0.935928439213,-0.935962200726,-0.935995953637,-0.936029697944,-0.936063433647,-0.936097160746,-0.936130879241,-0.936164589131,-0.936198290416,-0.936231983096,-0.93626566717,-0.936299342638,-0.9363330095,-0.936366667756,-0.936400317404,-0.936433958445,-0.936467590879,-0.936501214705,-0.936534829923,-0.936568436532,-0.936602034533,-0.936635623924,-0.936669204707,-0.936702776879,-0.936736340442,-0.936769895394,-0.936803441736,-0.936836979467,-0.936870508586,-0.936904029095,-0.936937540991,-0.936971044275,-0.937004538947,-0.937038025006,-0.937071502452,-0.937104971284,-0.937138431503,-0.937171883108,-0.937205326099,-0.937238760475,-0.937272186236,-0.937305603382,-0.937339011913,-0.937372411827,-0.937405803126,-0.937439185808,-0.937472559873,-0.937505925321,-0.937539282152,-0.937572630366,-0.937605969961,-0.937639300938,-0.937672623297,-0.937705937036,-0.937739242156,-0.937772538657,-0.937805826538,-0.937839105799,-0.93787237644,-0.93790563846,-0.937938891859,-0.937972136636,-0.938005372792,-0.938038600326,-0.938071819238,-0.938105029527,-0.938138231193,-0.938171424236,-0.938204608655,-0.938237784451,-0.938270951623,-0.93830411017,-0.938337260093,-0.938370401391,-0.938403534063,-0.93843665811,-0.938469773531,-0.938502880325,-0.938535978494,-0.938569068035,-0.938602148949,-0.938635221236,-0.938668284895,-0.938701339926,-0.938734386328,-0.938767424102,-0.938800453247,-0.938833473763,-0.938866485649,-0.938899488906,-0.938932483532,-0.938965469528,-0.938998446893,-0.939031415627,-0.939064375729,-0.9390973272,-0.939130270039,-0.939163204246,-0.93919612982,-0.939229046761,-0.939261955069,-0.939294854743,-0.939327745784,-0.93936062819,-0.939393501962,-0.9394263671,-0.939459223602,-0.939492071469,-0.939524910701,-0.939557741296,-0.939590563256,-0.939623376579,-0.939656181265,-0.939688977314,-0.939721764725,-0.939754543499,-0.939787313635,-0.939820075132,-0.939852827991,-0.939885572211,-0.939918307792,-0.939951034733,-0.939983753034,-0.940016462695,-0.940049163716,-0.940081856096,-0.940114539835,-0.940147214933,-0.940179881389,-0.940212539203,-0.940245188375,-0.940277828904,-0.94031046079,-0.940343084034,-0.940375698634,-0.94040830459,-0.940440901902,-0.94047349057,-0.940506070593,-0.940538641972,-0.940571204705,-0.940603758792,-0.940636304234,-0.940668841029,-0.940701369179,-0.940733888681,-0.940766399536,-0.940798901744,-0.940831395305,-0.940863880217,-0.940896356482,-0.940928824098,-0.940961283065,-0.940993733382,-0.941026175051,-0.94105860807,-0.941091032438,-0.941123448157,-0.941155855225,-0.941188253642,-0.941220643407,-0.941253024521,-0.941285396984,-0.941317760794,-0.941350115952,-0.941382462457,-0.94141480031,-0.941447129509,-0.941479450054,-0.941511761946,-0.941544065183,-0.941576359766,-0.941608645694,-0.941640922967,-0.941673191585,-0.941705451547,-0.941737702853,-0.941769945503,-0.941802179496,-0.941834404832,-0.941866621512,-0.941898829534,-0.941931028898,-0.941963219604,-0.941995401652,-0.942027575041,-0.942059739771,-0.942091895842,-0.942124043254,-0.942156182005,-0.942188312097,-0.942220433528,-0.942252546299,-0.942284650408,-0.942316745857,-0.942348832643,-0.942380910768,-0.942412980231,-0.942445041031,-0.942477093168,-0.942509136643,-0.942541171454,-0.942573197601,-0.942605215085,-0.942637223904,-0.942669224059,-0.942701215549,-0.942733198374,-0.942765172533,-0.942797138027,-0.942829094855,-0.942861043016,-0.942892982511,-0.942924913339,-0.9429568355,-0.942988748994,-0.943020653819,-0.943052549977,-0.943084437466,-0.943116316287,-0.943148186438,-0.943180047921,-0.943211900734,-0.943243744877,-0.94327558035,-0.943307407153,-0.943339225285,-0.943371034746,-0.943402835536,-0.943434627654,-0.943466411101,-0.943498185875,-0.943529951977,-0.943561709406,-0.943593458162,-0.943625198245,-0.943656929654,-0.943688652389,-0.94372036645,-0.943752071837,-0.943783768549,-0.943815456586,-0.943847135947,-0.943878806633,-0.943910468643,-0.943942121976,-0.943973766634,-0.944005402614,-0.944037029917,-0.944068648543,-0.944100258491,-0.944131859761,-0.944163452353,-0.944195036267,-0.944226611501,-0.944258178057,-0.944289735933,-0.944321285129,-0.944352825646,-0.944384357482,-0.944415880637,-0.944447395112,-0.944478900905,-0.944510398017,-0.944541886447,-0.944573366196,-0.944604837261,-0.944636299645,-0.944667753345,-0.944699198362,-0.944730634696,-0.944762062346,-0.944793481312,-0.944824891594,-0.944856293191,-0.944887686103,-0.94491907033,-0.944950445871,-0.944981812727,-0.945013170896,-0.945044520379,-0.945075861176,-0.945107193285,-0.945138516708,-0.945169831442,-0.945201137489,-0.945232434848,-0.945263723519,-0.945295003501,-0.945326274794,-0.945357537398,-0.945388791312,-0.945420036536,-0.945451273071,-0.945482500914,-0.945513720068,-0.94554493053,-0.945576132301,-0.945607325381,-0.945638509768,-0.945669685464,-0.945700852467,-0.945732010777,-0.945763160395,-0.945794301319,-0.94582543355,-0.945856557087,-0.94588767193,-0.945918778078,-0.945949875532,-0.945980964291,-0.946012044354,-0.946043115722,-0.946074178394,-0.94610523237,-0.94613627765,-0.946167314233,-0.946198342119,-0.946229361308,-0.946260371799,-0.946291373592,-0.946322366688,-0.946353351084,-0.946384326783,-0.946415293782,-0.946446252082,-0.946477201682,-0.946508142583,-0.946539074784,-0.946569998284,-0.946600913083,-0.946631819182,-0.946662716579,-0.946693605275,-0.946724485269,-0.946755356561,-0.94678621915,-0.946817073037,-0.946847918221,-0.946878754702,-0.946909582479,-0.946940401552,-0.946971211922,-0.947002013587,-0.947032806547,-0.947063590803,-0.947094366353,-0.947125133198,-0.947155891336,-0.947186640769,-0.947217381496,-0.947248113516,-0.947278836829,-0.947309551435,-0.947340257333,-0.947370954524,-0.947401643006,-0.947432322781,-0.947462993846,-0.947493656203,-0.947524309851,-0.947554954789,-0.947585591018,-0.947616218536,-0.947646837344,-0.947677447442,-0.947708048829,-0.947738641505,-0.947769225469,-0.947799800721,-0.947830367262,-0.94786092509,-0.947891474206,-0.947922014609,-0.947952546299,-0.947983069276,-0.948013583539,-0.948044089088,-0.948074585922,-0.948105074043,-0.948135553448,-0.948166024138,-0.948196486113,-0.948226939373,-0.948257383916,-0.948287819744,-0.948318246855,-0.948348665249,-0.948379074926,-0.948409475886,-0.948439868128,-0.948470251652,-0.948500626459,-0.948530992547,-0.948561349916,-0.948591698566,-0.948622038497,-0.948652369708,-0.9486826922,-0.948713005971,-0.948743311023,-0.948773607353,-0.948803894963,-0.948834173851,-0.948864444018,-0.948894705463,-0.948924958186,-0.948955202187,-0.948985437465,-0.949015664021,-0.949045881853,-0.949076090961,-0.949106291347,-0.949136483008,-0.949166665944,-0.949196840157,-0.949227005644,-0.949257162406,-0.949287310444,-0.949317449755,-0.94934758034,-0.9493777022,-0.949407815332,-0.949437919738,-0.949468015417,-0.949498102369,-0.949528180593,-0.949558250089,-0.949588310857,-0.949618362897,-0.949648406208,-0.94967844079,-0.949708466643,-0.949738483766,-0.94976849216,-0.949798491823,-0.949828482756,-0.949858464959,-0.94988843843,-0.94991840317,-0.949948359179,-0.949978306457,-0.950008245002,-0.950038174815,-0.950068095895,-0.950098008243,-0.950127911857,-0.950157806738,-0.950187692886,-0.950217570299,-0.950247438979,-0.950277298924,-0.950307150134,-0.950336992609,-0.950366826349,-0.950396651353,-0.950426467621,-0.950456275154,-0.950486073949,-0.950515864009,-0.950545645331,-0.950575417916,-0.950605181764,-0.950634936874,-0.950664683245,-0.950694420879,-0.950724149774,-0.95075386993,-0.950783581347,-0.950813284024,-0.950842977962,-0.95087266316,-0.950902339618,-0.950932007335,-0.950961666312,-0.950991316547,-0.951020958041,-0.951050590794,-0.951080214804,-0.951109830073,-0.951139436599,-0.951169034383,-0.951198623423,-0.95122820372,-0.951257775274,-0.951287338084,-0.95131689215,-0.951346437472,-0.951375974049,-0.951405501882,-0.951435020969,-0.951464531311,-0.951494032907,-0.951523525757,-0.951553009861,-0.951582485219,-0.95161195183,-0.951641409694,-0.95167085881,-0.951700299179,-0.9517297308,-0.951759153673,-0.951788567798,-0.951817973174,-0.951847369801,-0.951876757679,-0.951906136808,-0.951935507187,-0.951964868816,-0.951994221694,-0.952023565822,-0.9520529012,-0.952082227826,-0.952111545701,-0.952140854824,-0.952170155195,-0.952199446814,-0.952228729681,-0.952258003795,-0.952287269157,-0.952316525765,-0.952345773619,-0.95237501272,-0.952404243066,-0.952433464659,-0.952462677497,-0.95249188158,-0.952521076908,-0.95255026348,-0.952579441297,-0.952608610358,-0.952637770663,-0.952666922211,-0.952696065003,-0.952725199038,-0.952754324315,-0.952783440835,-0.952812548597,-0.952841647601,-0.952870737847,-0.952899819334,-0.952928892063,-0.952957956032,-0.952987011242,-0.953016057692,-0.953045095382,-0.953074124312,-0.953103144482,-0.953132155891,-0.953161158539,-0.953190152425,-0.95321913755,-0.953248113914,-0.953277081515,-0.953306040354,-0.953334990431,-0.953363931744,-0.953392864295,-0.953421788082,-0.953450703105,-0.953479609365,-0.95350850686,-0.953537395591,-0.953566275557,-0.953595146758,-0.953624009194,-0.953652862865,-0.953681707769,-0.953710543908,-0.95373937128,-0.953768189886,-0.953796999725,-0.953825800797,-0.953854593101,-0.953883376638,-0.953912151407,-0.953940917408,-0.95396967464,-0.953998423104,-0.954027162799,-0.954055893724,-0.95408461588,-0.954113329267,-0.954142033883,-0.954170729729,-0.954199416804,-0.954228095109,-0.954256764643,-0.954285425405,-0.954314077396,-0.954342720615,-0.954371355061,-0.954399980736,-0.954428597638,-0.954457205767,-0.954485805122,-0.954514395704,-0.954542977513,-0.954571550548,-0.954600114808,-0.954628670294,-0.954657217005,-0.954685754941,-0.954714284102,-0.954742804488,-0.954771316097,-0.954799818931,-0.954828312988,-0.954856798269,-0.954885274772,-0.954913742499,-0.954942201448,-0.95497065162,-0.954999093014,-0.95502752563,-0.955055949467,-0.955084364526,-0.955112770805,-0.955141168306,-0.955169557027,-0.955197936968,-0.955226308129,-0.955254670511,-0.955283024111,-0.955311368931,-0.95533970497,-0.955368032227,-0.955396350703,-0.955424660398,-0.95545296131,-0.95548125344,-0.955509536787,-0.955537811351,-0.955566077133,-0.955594334131,-0.955622582345,-0.955650821776,-0.955679052422,-0.955707274284,-0.955735487361,-0.955763691654,-0.955791887161,-0.955820073883,-0.955848251819,-0.955876420969,-0.955904581333,-0.95593273291,-0.955960875701,-0.955989009705,-0.956017134921,-0.95604525135,-0.956073358991,-0.956101457844,-0.956129547909,-0.956157629186,-0.956185701673,-0.956213765372,-0.956241820281,-0.956269866401,-0.95629790373,-0.95632593227,-0.95635395202,-0.956381962978,-0.956409965146,-0.956437958523,-0.956465943109,-0.956493918902,-0.956521885904,-0.956549844114,-0.956577793531,-0.956605734156,-0.956633665988,-0.956661589027,-0.956689503272,-0.956717408723,-0.956745305381,-0.956773193244,-0.956801072313,-0.956828942588,-0.956856804067,-0.956884656751,-0.956912500639,-0.956940335732,-0.956968162029,-0.95699597953,-0.957023788234,-0.957051588141,-0.957079379251,-0.957107161564,-0.95713493508,-0.957162699798,-0.957190455717,-0.957218202839,-0.957245941162,-0.957273670686,-0.957301391411,-0.957329103336,-0.957356806463,-0.957384500789,-0.957412186315,-0.957439863041,-0.957467530967,-0.957495190091,-0.957522840414,-0.957550481937,-0.957578114657,-0.957605738576,-0.957633353692,-0.957660960006,-0.957688557518,-0.957716146227,-0.957743726132,-0.957771297234,-0.957798859533,-0.957826413028,-0.957853957718,-0.957881493604,-0.957909020686,-0.957936538962,-0.957964048434,-0.9579915491,-0.95801904096,-0.958046524015,-0.958073998263,-0.958101463705,-0.95812892034,-0.958156368169,-0.95818380719,-0.958211237404,-0.95823865881,-0.958266071408,-0.958293475198,-0.95832087018,-0.958348256352,-0.958375633716,-0.958403002271,-0.958430362017,-0.958457712952,-0.958485055078,-0.958512388394,-0.958539712899,-0.958567028593,-0.958594335476,-0.958621633549,-0.95864892281,-0.958676203259,-0.958703474896,-0.958730737721,-0.958757991733,-0.958785236933,-0.95881247332,-0.958839700894,-0.958866919654,-0.958894129601,-0.958921330733,-0.958948523052,-0.958975706556,-0.959002881245,-0.959030047119,-0.959057204178,-0.959084352422,-0.95911149185,-0.959138622462,-0.959165744258,-0.959192857237,-0.9592199614,-0.959247056745,-0.959274143274,-0.959301220985,-0.959328289878,-0.959355349954,-0.959382401211,-0.95940944365,-0.95943647727,-0.959463502071,-0.959490518053,-0.959517525216,-0.959544523559,-0.959571513082,-0.959598493785,-0.959625465667,-0.959652428729,-0.95967938297,-0.959706328389,-0.959733264988,-0.959760192764,-0.959787111719,-0.959814021851,-0.959840923161,-0.959867815649,-0.959894699313,-0.959921574155,-0.959948440173,-0.959975297367,-0.960002145738,-0.960028985284,-0.960055816006,-0.960082637903,-0.960109450976,-0.960136255223,-0.960163050645,-0.960189837241,-0.960216615012,-0.960243383956,-0.960270144074,-0.960296895366,-0.96032363783,-0.960350371468,-0.960377096278,-0.960403812261,-0.960430519416,-0.960457217742,-0.960483907241,-0.96051058791,-0.960537259752,-0.960563922763,-0.960590576946,-0.960617222299,-0.960643858823,-0.960670486516,-0.960697105379,-0.960723715411,-0.960750316613,-0.960776908984,-0.960803492523,-0.960830067231,-0.960856633108,-0.960883190152,-0.960909738364,-0.960936277743,-0.96096280829,-0.960989330004,-0.961015842885,-0.961042346932,-0.961068842146,-0.961095328525,-0.96112180607,-0.961148274781,-0.961174734658,-0.961201185699,-0.961227627905,-0.961254061276,-0.961280485811,-0.961306901511,-0.961333308374,-0.961359706401,-0.961386095591,-0.961412475944,-0.96143884746,-0.961465210139,-0.961491563981,-0.961517908984,-0.961544245149,-0.961570572477,-0.961596890965,-0.961623200615,-0.961649501426,-0.961675793397,-0.961702076529,-0.961728350821,-0.961754616274,-0.961780872885,-0.961807120657,-0.961833359588,-0.961859589677,-0.961885810926,-0.961912023333,-0.961938226899,-0.961964421622,-0.961990607503,-0.962016784542,-0.962042952739,-0.962069112092,-0.962095262602,-0.962121404269,-0.962147537092,-0.962173661072,-0.962199776207,-0.962225882498,-0.962251979944,-0.962278068546,-0.962304148302,-0.962330219214,-0.962356281279,-0.962382334499,-0.962408378873,-0.962434414401,-0.962460441082,-0.962486458917,-0.962512467904,-0.962538468044,-0.962564459337,-0.962590441782,-0.96261641538,-0.962642380129,-0.962668336029,-0.962694283081,-0.962720221284,-0.962746150638,-0.962772071143,-0.962797982798,-0.962823885603,-0.962849779559,-0.962875664663,-0.962901540918,-0.962927408321,-0.962953266874,-0.962979116575,-0.963004957425,-0.963030789423,-0.963056612569,-0.963082426863,-0.963108232304,-0.963134028893,-0.963159816628,-0.963185595511,-0.96321136554,-0.963237126716,-0.963262879038,-0.963288622505,-0.963314357118,-0.963340082877,-0.963365799781,-0.96339150783,-0.963417207023,-0.963442897361,-0.963468578844,-0.96349425147,-0.96351991524,-0.963545570153,-0.96357121621,-0.96359685341,-0.963622481753,-0.963648101238,-0.963673711866,-0.963699313636,-0.963724906547,-0.963750490601,-0.963776065795,-0.963801632131,-0.963827189608,-0.963852738226,-0.963878277984,-0.963903808882,-0.96392933092,-0.963954844098,-0.963980348416,-0.964005843873,-0.964031330469,-0.964056808204,-0.964082277077,-0.964107737089,-0.964133188239,-0.964158630526,-0.964184063952,-0.964209488515,-0.964234904215,-0.964260311052,-0.964285709025,-0.964311098136,-0.964336478382,-0.964361849765,-0.964387212283,-0.964412565937,-0.964437910726,-0.96446324665,-0.964488573709,-0.964513891903,-0.964539201231,-0.964564501694,-0.96458979329,-0.96461507602,-0.964640349883,-0.96466561488,-0.964690871009,-0.964716118272,-0.964741356667,-0.964766586194,-0.964791806853,-0.964817018645,-0.964842221567,-0.964867415622,-0.964892600807,-0.964917777123,-0.96494294457,-0.964968103147,-0.964993252855,-0.965018393692,-0.96504352566,-0.965068648757,-0.965093762983,-0.965118868338,-0.965143964822,-0.965169052435,-0.965194131176,-0.965219201045,-0.965244262042,-0.965269314167,-0.965294357419,-0.965319391798,-0.965344417305,-0.965369433938,-0.965394441698,-0.965419440584,-0.965444430596,-0.965469411734,-0.965494383997,-0.965519347386,-0.9655443019,-0.965569247539,-0.965594184303,-0.965619112191,-0.965644031204,-0.96566894134,-0.9656938426,-0.965718734984,-0.965743618491,-0.965768493121,-0.965793358874,-0.96581821575,-0.965843063748,-0.965867902868,-0.96589273311,-0.965917554474,-0.965942366959,-0.965967170566,-0.965991965294,-0.966016751142,-0.966041528111,-0.966066296201,-0.96609105541,-0.96611580574,-0.966140547189,-0.966165279758,-0.966190003445,-0.966214718252,-0.966239424178,-0.966264121222,-0.966288809384,-0.966313488665,-0.966338159063,-0.966362820579,-0.966387473212,-0.966412116963,-0.96643675183,-0.966461377814,-0.966485994915,-0.966510603132,-0.966535202465,-0.966559792914,-0.966584374478,-0.966608947158,-0.966633510953,-0.966658065863,-0.966682611887,-0.966707149026,-0.966731677279,-0.966756196647,-0.966780707128,-0.966805208722,-0.96682970143,-0.966854185251,-0.966878660185,-0.966903126232,-0.966927583391,-0.966952031662,-0.966976471045,-0.96700090154,-0.967025323146,-0.967049735864,-0.967074139693,-0.967098534633,-0.967122920683,-0.967147297844,-0.967171666115,-0.967196025496,-0.967220375986,-0.967244717586,-0.967269050296,-0.967293374114,-0.967317689042,-0.967341995078,-0.967366292222,-0.967390580475,-0.967414859835,-0.967439130304,-0.96746339188,-0.967487644563,-0.967511888353,-0.96753612325,-0.967560349253,-0.967584566363,-0.967608774579,-0.967632973902,-0.967657164329,-0.967681345863,-0.967705518501,-0.967729682245,-0.967753837093,-0.967777983047,-0.967802120104,-0.967826248266,-0.967850367531,-0.967874477901,-0.967898579374,-0.96792267195,-0.967946755629,-0.967970830411,-0.967994896296,-0.968018953283,-0.968043001372,-0.968067040563,-0.968091070856,-0.968115092251,-0.968139104746,-0.968163108343,-0.968187103041,-0.968211088839,-0.968235065738,-0.968259033737,-0.968282992836,-0.968306943034,-0.968330884332,-0.96835481673,-0.968378740226,-0.968402654822,-0.968426560516,-0.968450457308,-0.968474345199,-0.968498224188,-0.968522094274,-0.968545955458,-0.96856980774,-0.968593651118,-0.968617485594,-0.968641311166,-0.968665127834,-0.968688935599,-0.96871273446,-0.968736524416,-0.968760305469,-0.968784077616,-0.968807840859,-0.968831595196,-0.968855340629,-0.968879077155,-0.968902804776,-0.968926523492,-0.9689502333,-0.968973934203,-0.968997626199,-0.969021309288,-0.96904498347,-0.969068648745,-0.969092305113,-0.969115952572,-0.969139591124,-0.969163220768,-0.969186841503,-0.96921045333,-0.969234056248,-0.969257650257,-0.969281235357,-0.969304811547,-0.969328378828,-0.969351937199,-0.969375486659,-0.96939902721,-0.96942255885,-0.969446081579,-0.969469595397,-0.969493100305,-0.9695165963,-0.969540083385,-0.969563561557,-0.969587030817,-0.969610491166,-0.969633942601,-0.969657385124,-0.969680818734,-0.969704243431,-0.969727659215,-0.969751066085,-0.969774464042,-0.969797853084,-0.969821233213,-0.969844604427,-0.969867966726,-0.969891320111,-0.96991466458,-0.969938000134,-0.969961326773,-0.969984644496,-0.970007953303,-0.970031253195,-0.970054544169,-0.970077826228,-0.970101099369,-0.970124363594,-0.970147618901,-0.970170865291,-0.970194102763,-0.970217331318,-0.970240550955,-0.970263761673,-0.970286963473,-0.970310156354,-0.970333340316,-0.970356515359,-0.970379681483,-0.970402838688,-0.970425986972,-0.970449126337,-0.970472256781,-0.970495378306,-0.970518490909,-0.970541594592,-0.970564689354,-0.970587775194,-0.970610852113,-0.970633920111,-0.970656979186,-0.97068002934,-0.970703070571,-0.97072610288,-0.970749126266,-0.970772140729,-0.970795146269,-0.970818142886,-0.970841130579,-0.970864109348,-0.970887079193,-0.970910040115,-0.970932992111,-0.970955935184,-0.970978869331,-0.971001794553,-0.97102471085,-0.971047618222,-0.971070516668,-0.971093406188,-0.971116286782,-0.97113915845,-0.971162021191,-0.971184875005,-0.971207719893,-0.971230555853,-0.971253382887,-0.971276200992,-0.97129901017,-0.97132181042,-0.971344601741,-0.971367384135,-0.971390157599,-0.971412922135,-0.971435677742,-0.97145842442,-0.971481162168,-0.971503890986,-0.971526610875,-0.971549321833,-0.971572023862,-0.97159471696,-0.971617401127,-0.971640076363,-0.971662742668,-0.971685400042,-0.971708048484,-0.971730687995,-0.971753318574,-0.97177594022,-0.971798552934,-0.971821156716,-0.971843751564,-0.97186633748,-0.971888914463,-0.971911482512,-0.971934041628,-0.97195659181,-0.971979133057,-0.972001665371,-0.97202418875,-0.972046703195,-0.972069208704,-0.972091705279,-0.972114192918,-0.972136671622,-0.97215914139,-0.972181602223,-0.972204054119,-0.972226497079,-0.972248931102,-0.972271356189,-0.972293772339,-0.972316179552,-0.972338577827,-0.972360967165,-0.972383347565,-0.972405719027,-0.972428081552,-0.972450435137,-0.972472779784,-0.972495115493,-0.972517442262,-0.972539760093,-0.972562068983,-0.972584368935,-0.972606659946,-0.972628942018,-0.972651215149,-0.97267347934,-0.97269573459,-0.9727179809,-0.972740218268,-0.972762446696,-0.972784666182,-0.972806876726,-0.972829078328,-0.972851270989,-0.972873454707,-0.972895629482,-0.972917795315,-0.972939952206,-0.972962100153,-0.972984239157,-0.973006369217,-0.973028490334,-0.973050602507,-0.973072705735,-0.97309480002,-0.97311688536,-0.973138961755,-0.973161029206,-0.973183087711,-0.973205137271,-0.973227177886,-0.973249209555,-0.973271232278,-0.973293246055,-0.973315250885,-0.973337246769,-0.973359233707,-0.973381211697,-0.973403180741,-0.973425140837,-0.973447091985,-0.973469034186,-0.973490967439,-0.973512891744,-0.9735348071,-0.973556713508,-0.973578610967,-0.973600499478,-0.973622379039,-0.973644249651,-0.973666111313,-0.973687964026,-0.973709807788,-0.973731642601,-0.973753468463,-0.973775285375,-0.973797093336,-0.973818892346,-0.973840682405,-0.973862463512,-0.973884235668,-0.973905998872,-0.973927753125,-0.973949498425,-0.973971234773,-0.973992962168,-0.974014680611,-0.9740363901,-0.974058090637,-0.97407978222,-0.97410146485,-0.974123138525,-0.974144803247,-0.974166459015,-0.974188105829,-0.974209743688,-0.974231372592,-0.974252992541,-0.974274603536,-0.974296205575,-0.974317798658,-0.974339382786,-0.974360957957,-0.974382524173,-0.974404081432,-0.974425629735,-0.974447169081,-0.97446869947,-0.974490220902,-0.974511733377,-0.974533236894,-0.974554731454,-0.974576217056,-0.974597693699,-0.974619161384,-0.974640620111,-0.974662069879,-0.974683510689,-0.974704942539,-0.974726365429,-0.974747779361,-0.974769184333,-0.974790580344,-0.974811967396,-0.974833345488,-0.974854714619,-0.974876074789,-0.974897425999,-0.974918768247,-0.974940101534,-0.97496142586,-0.974982741224,-0.975004047627,-0.975025345067,-0.975046633545,-0.975067913061,-0.975089183614,-0.975110445204,-0.975131697831,-0.975152941495,-0.975174176196,-0.975195401933,-0.975216618706,-0.975237826516,-0.975259025361,-0.975280215241,-0.975301396158,-0.975322568109,-0.975343731095,-0.975364885117,-0.975386030173,-0.975407166263,-0.975428293388,-0.975449411546,-0.975470520739,-0.975491620965,-0.975512712225,-0.975533794518,-0.975554867844,-0.975575932204,-0.975596987595,-0.97561803402,-0.975639071476,-0.975660099965,-0.975681119486,-0.975702130039,-0.975723131623,-0.975744124238,-0.975765107885,-0.975786082562,-0.975807048271,-0.975828005009,-0.975848952779,-0.975869891578,-0.975890821408,-0.975911742267,-0.975932654156,-0.975953557075,-0.975974451022,-0.975995335999,-0.976016212005,-0.976037079039,-0.976057937102,-0.976078786193,-0.976099626312,-0.976120457459,-0.976141279634,-0.976162092836,-0.976182897066,-0.976203692322,-0.976224478606,-0.976245255916,-0.976266024253,-0.976286783617,-0.976307534006,-0.976328275422,-0.976349007863,-0.97636973133,-0.976390445822,-0.97641115134,-0.976431847883,-0.97645253545,-0.976473214042,-0.976493883659,-0.9765145443,-0.976535195965,-0.976555838653,-0.976576472366,-0.976597097102,-0.976617712862,-0.976638319644,-0.97665891745,-0.976679506278,-0.976700086129,-0.976720657002,-0.976741218897,-0.976761771815,-0.976782315754,-0.976802850715,-0.976823376697,-0.976843893701,-0.976864401725,-0.976884900771,-0.976905390837,-0.976925871924,-0.976946344031,-0.976966807158,-0.976987261305,-0.977007706471,-0.977028142658,-0.977048569863,-0.977068988088,-0.977089397332,-0.977109797595,-0.977130188876,-0.977150571176,-0.977170944494,-0.97719130883,-0.977211664184,-0.977232010555,-0.977252347944,-0.977272676351,-0.977292995774,-0.977313306214,-0.977333607671,-0.977353900145,-0.977374183635,-0.977394458142,-0.977414723664,-0.977434980202,-0.977455227756,-0.977475466325,-0.977495695909,-0.977515916509,-0.977536128123,-0.977556330752,-0.977576524396,-0.977596709053,-0.977616884725,-0.977637051411,-0.977657209111,-0.977677357825,-0.977697497551,-0.977717628291,-0.977737750044,-0.97775786281,-0.977777966588,-0.977798061379,-0.977818147183,-0.977838223998,-0.977858291825,-0.977878350664,-0.977898400515,-0.977918441377,-0.97793847325,-0.977958496134,-0.977978510029,-0.977998514935,-0.978018510851,-0.978038497777,-0.978058475713,-0.978078444659,-0.978098404615,-0.978118355581,-0.978138297556,-0.97815823054,-0.978178154533,-0.978198069534,-0.978217975545,-0.978237872564,-0.978257760591,-0.978277639626,-0.978297509669,-0.97831737072,-0.978337222778,-0.978357065843,-0.978376899916,-0.978396724996,-0.978416541082,-0.978436348175,-0.978456146275,-0.978475935381,-0.978495715492,-0.97851548661,-0.978535248733,-0.978555001862,-0.978574745997,-0.978594481136,-0.97861420728,-0.978633924429,-0.978653632583,-0.978673331741,-0.978693021904,-0.97871270307,-0.978732375241,-0.978752038415,-0.978771692592,-0.978791337773,-0.978810973957,-0.978830601144,-0.978850219334,-0.978869828527,-0.978889428721,-0.978909019919,-0.978928602118,-0.978948175319,-0.978967739522,-0.978987294726,-0.979006840932,-0.979026378139,-0.979045906347,-0.979065425556,-0.979084935765,-0.979104436975,-0.979123929185,-0.979143412395,-0.979162886606,-0.979182351816,-0.979201808025,-0.979221255234,-0.979240693442,-0.979260122649,-0.979279542855,-0.97929895406,-0.979318356263,-0.979337749464,-0.979357133664,-0.979376508861,-0.979395875057,-0.97941523225,-0.97943458044,-0.979453919628,-0.979473249812,-0.979492570994,-0.979511883172,-0.979531186347,-0.979550480518,-0.979569765685,-0.979589041849,-0.979608309008,-0.979627567163,-0.979646816313,-0.979666056459,-0.979685287599,-0.979704509735,-0.979723722866,-0.979742926991,-0.97976212211,-0.979781308224,-0.979800485331,-0.979819653433,-0.979838812528,-0.979857962617,-0.9798771037,-0.979896235775,-0.979915358843,-0.979934472905,-0.979953577958,-0.979972674005,-0.979991761043,-0.980010839074,-0.980029908097,-0.980048968112,-0.980068019118,-0.980087061115,-0.980106094104,-0.980125118084,-0.980144133055,-0.980163139016,-0.980182135968,-0.980201123911,-0.980220102843,-0.980239072766,-0.980258033678,-0.98027698558,-0.980295928472,-0.980314862353,-0.980333787223,-0.980352703082,-0.98037160993,-0.980390507767,-0.980409396592,-0.980428276405,-0.980447147207,-0.980466008996,-0.980484861773,-0.980503705538,-0.98052254029,-0.98054136603,-0.980560182756,-0.98057899047,-0.98059778917,-0.980616578857,-0.98063535953,-0.980654131189,-0.980672893834,-0.980691647465,-0.980710392082,-0.980729127685,-0.980747854272,-0.980766571845,-0.980785280403,-0.980803979946,-0.980822670473,-0.980841351985,-0.980860024482,-0.980878687962,-0.980897342426,-0.980915987874,-0.980934624306,-0.980953251721,-0.98097187012,-0.980990479502,-0.981009079866,-0.981027671213,-0.981046253543,-0.981064826856,-0.98108339115,-0.981101946427,-0.981120492686,-0.981139029926,-0.981157558148,-0.981176077352,-0.981194587536,-0.981213088702,-0.981231580849,-0.981250063976,-0.981268538084,-0.981287003172,-0.981305459241,-0.981323906289,-0.981342344318,-0.981360773326,-0.981379193314,-0.981397604281,-0.981416006227,-0.981434399152,-0.981452783057,-0.98147115794,-0.981489523801,-0.981507880641,-0.981526228459,-0.981544567255,-0.981562897028,-0.98158121778,-0.981599529509,-0.981617832215,-0.981636125899,-0.98165441056,-0.981672686197,-0.981690952811,-0.981709210402,-0.981727458969,-0.981745698512,-0.981763929031,-0.981782150526,-0.981800362996,-0.981818566443,-0.981836760864,-0.981854946261,-0.981873122632,-0.981891289979,-0.9819094483,-0.981927597595,-0.981945737865,-0.98196386911,-0.981981991328,-0.98200010452,-0.982018208685,-0.982036303824,-0.982054389937,-0.982072467022,-0.982090535081,-0.982108594113,-0.982126644117,-0.982144685093,-0.982162717042,-0.982180739963,-0.982198753856,-0.982216758721,-0.982234754558,-0.982252741366,-0.982270719146,-0.982288687896,-0.982306647618,-0.982324598311,-0.982342539974,-0.982360472608,-0.982378396212,-0.982396310786,-0.98241421633,-0.982432112845,-0.982450000328,-0.982467878782,-0.982485748205,-0.982503608597,-0.982521459958,-0.982539302287,-0.982557135586,-0.982574959853,-0.982592775089,-0.982610581292,-0.982628378464,-0.982646166604,-0.982663945711,-0.982681715786,-0.982699476829,-0.982717228838,-0.982734971815,-0.982752705758,-0.982770430669,-0.982788146546,-0.982805853389,-0.982823551199,-0.982841239974,-0.982858919716,-0.982876590423,-0.982894252096,-0.982911904735,-0.982929548339,-0.982947182908,-0.982964808441,-0.98298242494,-0.983000032403,-0.983017630831,-0.983035220223,-0.983052800579,-0.983070371899,-0.983087934184,-0.983105487431,-0.983123031642,-0.983140566817,-0.983158092955,-0.983175610055,-0.983193118119,-0.983210617145,-0.983228107134,-0.983245588085,-0.983263059999,-0.983280522874,-0.983297976712,-0.983315421511,-0.983332857272,-0.983350283994,-0.983367701677,-0.983385110322,-0.983402509927,-0.983419900493,-0.98343728202,-0.983454654507,-0.983472017955,-0.983489372362,-0.98350671773,-0.983524054058,-0.983541381345,-0.983558699591,-0.983576008797,-0.983593308962,-0.983610600087,-0.98362788217,-0.983645155211,-0.983662419212,-0.98367967417,-0.983696920087,-0.983714156962,-0.983731384795,-0.983748603586,-0.983765813334,-0.98378301404,-0.983800205703,-0.983817388323,-0.9838345619,-0.983851726434,-0.983868881924,-0.983886028371,-0.983903165774,-0.983920294134,-0.983937413449,-0.983954523721,-0.983971624948,-0.98398871713,-0.984005800268,-0.984022874361,-0.98403993941,-0.984056995413,-0.984074042371,-0.984091080283,-0.98410810915,-0.984125128972,-0.984142139747,-0.984159141476,-0.98417613416,-0.984193117797,-0.984210092387,-0.984227057931,-0.984244014428,-0.984260961878,-0.98427790028,-0.984294829636,-0.984311749944,-0.984328661205,-0.984345563418,-0.984362456583,-0.984379340699,-0.984396215768,-0.984413081789,-0.98442993876,-0.984446786684,-0.984463625558,-0.984480455383,-0.984497276159,-0.984514087886,-0.984530890564,-0.984547684192,-0.98456446877,-0.984581244298,-0.984598010776,-0.984614768204,-0.984631516582,-0.984648255909,-0.984664986185,-0.984681707411,-0.984698419586,-0.984715122709,-0.984731816781,-0.984748501802,-0.984765177771,-0.984781844688,-0.984798502554,-0.984815151367,-0.984831791128,-0.984848421837,-0.984865043494,-0.984881656097,-0.984898259648,-0.984914854146,-0.984931439591,-0.984948015982,-0.98496458332,-0.984981141605,-0.984997690835,-0.985014231012,-0.985030762135,-0.985047284204,-0.985063797218,-0.985080301178,-0.985096796083,-0.985113281933,-0.985129758728,-0.985146226469,-0.985162685154,-0.985179134783,-0.985195575357,-0.985212006876,-0.985228429338,-0.985244842745,-0.985261247095,-0.985277642389,-0.985294028626,-0.985310405807,-0.985326773932,-0.985343132999,-0.985359483009,-0.985375823962,-0.985392155858,-0.985408478696,-0.985424792476,-0.985441097199,-0.985457392864,-0.98547367947,-0.985489957018,-0.985506225508,-0.98552248494,-0.985538735312,-0.985554976626,-0.985571208881,-0.985587432076,-0.985603646213,-0.985619851289,-0.985636047307,-0.985652234264,-0.985668412162,-0.985684580999,-0.985700740776,-0.985716891493,-0.98573303315,-0.985749165746,-0.985765289281,-0.985781403755,-0.985797509168,-0.985813605519,-0.98582969281,-0.985845771038,-0.985861840206,-0.985877900311,-0.985893951354,-0.985909993335,-0.985926026254,-0.985942050111,-0.985958064905,-0.985974070636,-0.985990067304,-0.98600605491,-0.986022033452,-0.986038002931,-0.986053963346,-0.986069914698,-0.986085856986,-0.98610179021,-0.986117714371,-0.986133629467,-0.986149535498,-0.986165432465,-0.986181320368,-0.986197199206,-0.986213068979,-0.986228929686,-0.986244781329,-0.986260623906,-0.986276457418,-0.986292281864,-0.986308097245,-0.986323903559,-0.986339700807,-0.986355488989,-0.986371268105,-0.986387038154,-0.986402799137,-0.986418551053,-0.986434293902,-0.986450027683,-0.986465752398,-0.986481468045,-0.986497174625,-0.986512872136,-0.986528560581,-0.986544239957,-0.986559910265,-0.986575571505,-0.986591223676,-0.986606866779,-0.986622500813,-0.986638125778,-0.986653741675,-0.986669348502,-0.98668494626,-0.986700534949,-0.986716114568,-0.986731685117,-0.986747246597,-0.986762799007,-0.986778342346,-0.986793876615,-0.986809401814,-0.986824917943,-0.986840425,-0.986855922987,-0.986871411903,-0.986886891748,-0.986902362521,-0.986917824223,-0.986933276854,-0.986948720413,-0.9869641549,-0.986979580315,-0.986994996658,-0.987010403928,-0.987025802127,-0.987041191253,-0.987056571306,-0.987071942286,-0.987087304193,-0.987102657028,-0.987118000789,-0.987133335477,-0.987148661091,-0.987163977631,-0.987179285098,-0.987194583491,-0.987209872809,-0.987225153054,-0.987240424224,-0.987255686319,-0.98727093934,-0.987286183287,-0.987301418158,-0.987316643954,-0.987331860675,-0.987347068321,-0.987362266891,-0.987377456385,-0.987392636804,-0.987407808147,-0.987422970414,-0.987438123605,-0.987453267719,-0.987468402757,-0.987483528718,-0.987498645603,-0.98751375341,-0.987528852141,-0.987543941794,-0.987559022371,-0.987574093869,-0.987589156291,-0.987604209634,-0.9876192539,-0.987634289087,-0.987649315197,-0.987664332228,-0.987679340181,-0.987694339055,-0.987709328851,-0.987724309568,-0.987739281206,-0.987754243765,-0.987769197244,-0.987784141645,-0.987799076965,-0.987814003206,-0.987828920368,-0.987843828449,-0.987858727451,-0.987873617372,-0.987888498213,-0.987903369973,-0.987918232653,-0.987933086252,-0.98794793077,-0.987962766207,-0.987977592563,-0.987992409838,-0.988007218031,-0.988022017143,-0.988036807173,-0.988051588122,-0.988066359988,-0.988081122772,-0.988095876474,-0.988110621094,-0.988125356631,-0.988140083086,-0.988154800457,-0.988169508746,-0.988184207952,-0.988198898075,-0.988213579114,-0.98822825107,-0.988242913942,-0.988257567731,-0.988272212435,-0.988286848056,-0.988301474593,-0.988316092045,-0.988330700413,-0.988345299697,-0.988359889895,-0.988374471009,-0.988389043038,-0.988403605982,-0.988418159841,-0.988432704615,-0.988447240303,-0.988461766905,-0.988476284422,-0.988490792853,-0.988505292198,-0.988519782456,-0.988534263629,-0.988548735715,-0.988563198714,-0.988577652627,-0.988592097453,-0.988606533192,-0.988620959844,-0.988635377409,-0.988649785887,-0.988664185277,-0.98867857558,-0.988692956794,-0.988707328921,-0.98872169196,-0.988736045911,-0.988750390774,-0.988764726548,-0.988779053234,-0.988793370831,-0.988807679339,-0.988821978758,-0.988836269089,-0.98885055033,-0.988864822482,-0.988879085544,-0.988893339517,-0.9889075844,-0.988921820194,-0.988936046897,-0.98895026451,-0.988964473033,-0.988978672466,-0.988992862808,-0.98900704406,-0.989021216221,-0.989035379291,-0.98904953327,-0.989063678158,-0.989077813955,-0.98909194066,-0.989106058273,-0.989120166796,-0.989134266226,-0.989148356564,-0.989162437811,-0.989176509965,-0.989190573027,-0.989204626996,-0.989218671873,-0.989232707657,-0.989246734349,-0.989260751947,-0.989274760452,-0.989288759865,-0.989302750183,-0.989316731409,-0.989330703541,-0.989344666579,-0.989358620523,-0.989372565373,-0.989386501129,-0.989400427791,-0.989414345359,-0.989428253832,-0.989442153211,-0.989456043494,-0.989469924683,-0.989483796777,-0.989497659776,-0.989511513679,-0.989525358487,-0.9895391942,-0.989553020817,-0.989566838338,-0.989580646764,-0.989594446093,-0.989608236326,-0.989622017463,-0.989635789504,-0.989649552448,-0.989663306295,-0.989677051046,-0.989690786699,-0.989704513256,-0.989718230716,-0.989731939078,-0.989745638343,-0.98975932851,-0.98977300958,-0.989786681552,-0.989800344426,-0.989813998202,-0.989827642879,-0.989841278459,-0.98985490494,-0.989868522322,-0.989882130606,-0.989895729791,-0.989909319878,-0.989922900865,-0.989936472753,-0.989950035542,-0.989963589231,-0.989977133821,-0.989990669311,-0.990004195701,-0.990017712992,-0.990031221182,-0.990044720272,-0.990058210262,-0.990071691152,-0.990085162941,-0.990098625629,-0.990112079217,-0.990125523704,-0.990138959089,-0.990152385374,-0.990165802557,-0.990179210639,-0.99019260962,-0.990205999498,-0.990219380275,-0.99023275195,-0.990246114523,-0.990259467994,-0.990272812363,-0.99028614763,-0.990299473793,-0.990312790855,-0.990326098813,-0.990339397669,-0.990352687421,-0.990365968071,-0.990379239617,-0.99039250206,-0.9904057554,-0.990418999635,-0.990432234768,-0.990445460796,-0.99045867772,-0.99047188554,-0.990485084256,-0.990498273868,-0.990511454375,-0.990524625778,-0.990537788076,-0.990550941269,-0.990564085358,-0.990577220341,-0.990590346219,-0.990603462992,-0.990616570659,-0.990629669221,-0.990642758677,-0.990655839027,-0.990668910272,-0.99068197241,-0.990695025443,-0.990708069369,-0.990721104188,-0.990734129902,-0.990747146508,-0.990760154008,-0.990773152401,-0.990786141687,-0.990799121866,-0.990812092938,-0.990825054902,-0.990838007759,-0.990850951508,-0.99086388615,-0.990876811684,-0.99088972811,-0.990902635428,-0.990915533638,-0.990928422739,-0.990941302732,-0.990954173617,-0.990967035392,-0.99097988806,-0.990992731618,-0.991005566067,-0.991018391407,-0.991031207638,-0.99104401476,-0.991056812772,-0.991069601674,-0.991082381467,-0.99109515215,-0.991107913723,-0.991120666186,-0.991133409539,-0.991146143782,-0.991158868914,-0.991171584936,-0.991184291847,-0.991196989647,-0.991209678336,-0.991222357915,-0.991235028382,-0.991247689738,-0.991260341983,-0.991272985116,-0.991285619138,-0.991298244048,-0.991310859846,-0.991323466532,-0.991336064107,-0.991348652569,-0.991361231919,-0.991373802156,-0.991386363281,-0.991398915294,-0.991411458193,-0.99142399198,-0.991436516654,-0.991449032215,-0.991461538662,-0.991474035997,-0.991486524218,-0.991499003325,-0.991511473319,-0.991523934199,-0.991536385965,-0.991548828617,-0.991561262155,-0.991573686579,-0.991586101888,-0.991598508083,-0.991610905163,-0.991623293129,-0.99163567198,-0.991648041716,-0.991660402337,-0.991672753843,-0.991685096234,-0.991697429509,-0.991709753669,-0.991722068713,-0.991734374642,-0.991746671455,-0.991758959152,-0.991771237732,-0.991783507197,-0.991795767545,-0.991808018777,-0.991820260893,-0.991832493892,-0.991844717774,-0.991856932539,-0.991869138188,-0.991881334719,-0.991893522134,-0.991905700431,-0.99191786961,-0.991930029672,-0.991942180617,-0.991954322444,-0.991966455153,-0.991978578744,-0.991990693216,-0.992002798571,-0.992014894808,-0.992026981926,-0.992039059925,-0.992051128806,-0.992063188569,-0.992075239212,-0.992087280737,-0.992099313142,-0.992111336428,-0.992123350596,-0.992135355643,-0.992147351571,-0.99215933838,-0.992171316069,-0.992183284638,-0.992195244087,-0.992207194416,-0.992219135625,-0.992231067713,-0.992242990681,-0.992254904529,-0.992266809256,-0.992278704863,-0.992290591348,-0.992302468713,-0.992314336957,-0.992326196079,-0.99233804608,-0.99234988696,-0.992361718719,-0.992373541356,-0.992385354871,-0.992397159264,-0.992408954536,-0.992420740685,-0.992432517713,-0.992444285618,-0.992456044401,-0.992467794061,-0.992479534599,-0.992491266014,-0.992502988306,-0.992514701476,-0.992526405522,-0.992538100446,-0.992549786246,-0.992561462923,-0.992573130476,-0.992584788906,-0.992596438213,-0.992608078395,-0.992619709454,-0.992631331389,-0.9926429442,-0.992654547887,-0.992666142449,-0.992677727887,-0.9926893042,-0.992700871389,-0.992712429454,-0.992723978393,-0.992735518208,-0.992747048897,-0.992758570462,-0.992770082901,-0.992781586215,-0.992793080403,-0.992804565466,-0.992816041403,-0.992827508215,-0.9928389659,-0.99285041446,-0.992861853893,-0.992873284201,-0.992884705382,-0.992896117437,-0.992907520365,-0.992918914167,-0.992930298842,-0.99294167439,-0.992953040811,-0.992964398105,-0.992975746273,-0.992987085312,-0.992998415225,-0.99300973601,-0.993021047668,-0.993032350198,-0.9930436436,-0.993054927875,-0.993066203021,-0.993077469039,-0.99308872593,-0.993099973692,-0.993111212325,-0.99312244183,-0.993133662207,-0.993144873455,-0.993156075574,-0.993167268564,-0.993178452426,-0.993189627158,-0.993200792761,-0.993211949235,-0.993223096579,-0.993234234794,-0.993245363879,-0.993256483835,-0.993267594661,-0.993278696356,-0.993289788922,-0.993300872358,-0.993311946664,-0.993323011839,-0.993334067884,-0.993345114798,-0.993356152582,-0.993367181235,-0.993378200757,-0.993389211148,-0.993400212408,-0.993411204537,-0.993422187535,-0.993433161402,-0.993444126137,-0.993455081741,-0.993466028213,-0.993476965553,-0.993487893761,-0.993498812838,-0.993509722782,-0.993520623595,-0.993531515275,-0.993542397822,-0.993553271238,-0.993564135521,-0.993574990671,-0.993585836688,-0.993596673573,-0.993607501325,-0.993618319943,-0.993629129429,-0.993639929781,-0.993650721,-0.993661503086,-0.993672276038,-0.993683039856,-0.993693794541,-0.993704540092,-0.993715276509,-0.993726003792,-0.993736721941,-0.993747430955,-0.993758130836,-0.993768821582,-0.993779503193,-0.99379017567,-0.993800839012,-0.993811493219,-0.993822138292,-0.993832774229,-0.993843401031,-0.993854018698,-0.99386462723,-0.993875226626,-0.993885816887,-0.993896398013,-0.993906970002,-0.993917532856,-0.993928086574,-0.993938631156,-0.993949166602,-0.993959692912,-0.993970210085,-0.993980718123,-0.993991217023,-0.994001706787,-0.994012187415,-0.994022658906,-0.99403312126,-0.994043574477,-0.994054018557,-0.994064453499,-0.994074879305,-0.994085295973,-0.994095703504,-0.994106101897,-0.994116491153,-0.994126871271,-0.994137242251,-0.994147604093,-0.994157956798,-0.994168300364,-0.994178634792,-0.994188960082,-0.994199276233,-0.994209583246,-0.994219881121,-0.994230169856,-0.994240449453,-0.994250719911,-0.99426098123,-0.994271233411,-0.994281476452,-0.994291710353,-0.994301935116,-0.994312150739,-0.994322357223,-0.994332554567,-0.994342742771,-0.994352921835,-0.99436309176,-0.994373252545,-0.994383404189,-0.994393546694,-0.994403680058,-0.994413804281,-0.994423919365,-0.994434025308,-0.99444412211,-0.994454209771,-0.994464288292,-0.994474357672,-0.994484417911,-0.994494469008,-0.994504510965,-0.99451454378,-0.994524567454,-0.994534581987,-0.994544587377,-0.994554583627,-0.994564570734,-0.9945745487,-0.994584517524,-0.994594477206,-0.994604427745,-0.994614369143,-0.994624301398,-0.994634224511,-0.994644138481,-0.994654043309,-0.994663938994,-0.994673825536,-0.994683702936,-0.994693571193,-0.994703430306,-0.994713280277,-0.994723121104,-0.994732952788,-0.994742775329,-0.994752588726,-0.99476239298,-0.99477218809,-0.994781974057,-0.994791750879,-0.994801518558,-0.994811277092,-0.994821026483,-0.994830766729,-0.994840497831,-0.994850219789,-0.994859932602,-0.994869636271,-0.994879330795,-0.994889016174,-0.994898692409,-0.994908359498,-0.994918017443,-0.994927666243,-0.994937305897,-0.994946936406,-0.99495655777,-0.994966169989,-0.994975773061,-0.994985366989,-0.99499495177,-0.995004527406,-0.995014093896,-0.99502365124,-0.995033199438,-0.99504273849,-0.995052268396,-0.995061789155,-0.995071300768,-0.995080803234,-0.995090296554,-0.995099780727,-0.995109255754,-0.995118721633,-0.995128178366,-0.995137625952,-0.99514706439,-0.995156493682,-0.995165913826,-0.995175324823,-0.995184726672,-0.995194119374,-0.995203502928,-0.995212877335,-0.995222242594,-0.995231598705,-0.995240945667,-0.995250283482,-0.995259612149,-0.995268931668,-0.995278242038,-0.99528754326,-0.995296835333,-0.995306118258,-0.995315392034,-0.995324656662,-0.99533391214,-0.99534315847,-0.995352395651,-0.995361623683,-0.995370842565,-0.995380052299,-0.995389252883,-0.995398444317,-0.995407626603,-0.995416799738,-0.995425963724,-0.99543511856,-0.995444264247,-0.995453400783,-0.995462528169,-0.995471646406,-0.995480755492,-0.995489855428,-0.995498946213,-0.995508027849,-0.995517100333,-0.995526163668,-0.995535217851,-0.995544262884,-0.995553298766,-0.995562325497,-0.995571343077,-0.995580351506,-0.995589350783,-0.99559834091,-0.995607321885,-0.995616293709,-0.995625256381,-0.995634209902,-0.995643154271,-0.995652089488,-0.995661015554,-0.995669932467,-0.995678840229,-0.995687738838,-0.995696628296,-0.995705508601,-0.995714379754,-0.995723241754,-0.995732094602,-0.995740938298,-0.99574977284,-0.99575859823,-0.995767414468,-0.995776221552,-0.995785019483,-0.995793808262,-0.995802587887,-0.995811358359,-0.995820119678,-0.995828871843,-0.995837614855,-0.995846348714,-0.995855073419,-0.99586378897,-0.995872495367,-0.995881192611,-0.9958898807,-0.995898559636,-0.995907229417,-0.995915890045,-0.995924541518,-0.995933183837,-0.995941817001,-0.995950441011,-0.995959055866,-0.995967661567,-0.995976258113,-0.995984845504,-0.99599342374,-0.996001992822,-0.996010552748,-0.996019103519,-0.996027645135,-0.996036177596,-0.996044700901,-0.996053215051,-0.996061720046,-0.996070215884,-0.996078702568,-0.996087180095,-0.996095648467,-0.996104107682,-0.996112557742,-0.996120998646,-0.996129430393,-0.996137852985,-0.99614626642,-0.996154670699,-0.996163065821,-0.996171451787,-0.996179828596,-0.996188196248,-0.996196554744,-0.996204904083,-0.996213244265,-0.99622157529,-0.996229897158,-0.996238209869,-0.996246513422,-0.996254807819,-0.996263093058,-0.996271369139,-0.996279636063,-0.99628789383,-0.996296142438,-0.99630438189,-0.996312612183,-0.996320833318,-0.996329045295,-0.996337248115,-0.996345441776,-0.996353626279,-0.996361801624,-0.99636996781,-0.996378124838,-0.996386272708,-0.996394411419,-0.996402540971,-0.996410661364,-0.996418772599,-0.996426874675,-0.996434967592,-0.99644305135,-0.996451125949,-0.996459191389,-0.996467247669,-0.99647529479,-0.996483332752,-0.996491361554,-0.996499381197,-0.99650739168,-0.996515393004,-0.996523385167,-0.996531368171,-0.996539342015,-0.996547306699,-0.996555262223,-0.996563208587,-0.996571145791,-0.996579073834,-0.996586992717,-0.99659490244,-0.996602803002,-0.996610694403,-0.996618576644,-0.996626449724,-0.996634313644,-0.996642168402,-0.996650014,-0.996657850437,-0.996665677712,-0.996673495827,-0.99668130478,-0.996689104572,-0.996696895203,-0.996704676672,-0.99671244898,-0.996720212126,-0.996727966111,-0.996735710933,-0.996743446594,-0.996751173094,-0.996758890431,-0.996766598606,-0.996774297619,-0.99678198747,-0.996789668159,-0.996797339686,-0.99680500205,-0.996812655252,-0.996820299291,-0.996827934168,-0.996835559882,-0.996843176434,-0.996850783822,-0.996858382048,-0.996865971111,-0.996873551011,-0.996881121748,-0.996888683322,-0.996896235732,-0.99690377898,-0.996911313064,-0.996918837984,-0.996926353741,-0.996933860335,-0.996941357765,-0.996948846031,-0.996956325134,-0.996963795073,-0.996971255848,-0.996978707459,-0.996986149906,-0.996993583189,-0.997001007307,-0.997008422262,-0.997015828052,-0.997023224678,-0.997030612139,-0.997037990436,-0.997045359569,-0.997052719536,-0.997060070339,-0.997067411978,-0.997074744451,-0.99708206776,-0.997089381903,-0.997096686882,-0.997103982696,-0.997111269344,-0.997118546827,-0.997125815145,-0.997133074297,-0.997140324284,-0.997147565106,-0.997154796762,-0.997162019252,-0.997169232576,-0.997176436735,-0.997183631728,-0.997190817555,-0.997197994217,-0.997205161712,-0.997212320041,-0.997219469204,-0.9972266092,-0.99723374003,-0.997240861694,-0.997247974192,-0.997255077523,-0.997262171688,-0.997269256685,-0.997276332517,-0.997283399181,-0.997290456679,-0.997297505009,-0.997304544173,-0.99731157417,-0.997318595,-0.997325606662,-0.997332609158,-0.997339602486,-0.997346586647,-0.99735356164,-0.997360527466,-0.997367484124,-0.997374431615,-0.997381369938,-0.997388299094,-0.997395219081,-0.997402129901,-0.997409031553,-0.997415924037,-0.997422807353,-0.997429681501,-0.997436546481,-0.997443402292,-0.997450248935,-0.99745708641,-0.997463914716,-0.997470733854,-0.997477543824,-0.997484344624,-0.997491136257,-0.99749791872,-0.997504692015,-0.99751145614,-0.997518211097,-0.997524956885,-0.997531693504,-0.997538420954,-0.997545139234,-0.997551848346,-0.997558548288,-0.99756523906,-0.997571920664,-0.997578593098,-0.997585256362,-0.997591910457,-0.997598555382,-0.997605191137,-0.997611817723,-0.997618435139,-0.997625043384,-0.99763164246,-0.997638232366,-0.997644813102,-0.997651384668,-0.997657947063,-0.997664500289,-0.997671044343,-0.997677579228,-0.997684104942,-0.997690621486,-0.997697128859,-0.997703627061,-0.997710116093,-0.997716595954,-0.997723066644,-0.997729528164,-0.997735980512,-0.997742423689,-0.997748857696,-0.997755282531,-0.997761698195,-0.997768104688,-0.99777450201,-0.997780890161,-0.99778726914,-0.997793638947,-0.997799999583,-0.997806351048,-0.99781269334,-0.997819026462,-0.997825350411,-0.997831665189,-0.997837970795,-0.997844267228,-0.99785055449,-0.99785683258,-0.997863101498,-0.997869361244,-0.997875611817,-0.997881853218,-0.997888085447,-0.997894308504,-0.997900522388,-0.997906727099,-0.997912922638,-0.997919109005,-0.997925286199,-0.99793145422,-0.997937613068,-0.997943762743,-0.997949903246,-0.997956034576,-0.997962156732,-0.997968269716,-0.997974373526,-0.997980468164,-0.997986553628,-0.997992629919,-0.997998697036,-0.99800475498,-0.998010803751,-0.998016843348,-0.998022873771,-0.998028895021,-0.998034907098,-0.99804091,-0.998046903729,-0.998052888284,-0.998058863665,-0.998064829872,-0.998070786905,-0.998076734765,-0.99808267345,-0.99808860296,-0.998094523297,-0.998100434459,-0.998106336447,-0.998112229261,-0.9981181129,-0.998123987365,-0.998129852655,-0.998135708771,-0.998141555712,-0.998147393478,-0.998153222069,-0.998159041486,-0.998164851728,-0.998170652795,-0.998176444686,-0.998182227403,-0.998188000945,-0.998193765312,-0.998199520503,-0.99820526652,-0.99821100336,-0.998216731026,-0.998222449516,-0.998228158831,-0.99823385897,-0.998239549934,-0.998245231722,-0.998250904335,-0.998256567771,-0.998262222032,-0.998267867118,-0.998273503027,-0.99827912976,-0.998284747318,-0.998290355699,-0.998295954905,-0.998301544934,-0.998307125787,-0.998312697464,-0.998318259964,-0.998323813289,-0.998329357436,-0.998334892408,-0.998340418203,-0.998345934821,-0.998351442263,-0.998356940528,-0.998362429617,-0.998367909529,-0.998373380264,-0.998378841822,-0.998384294203,-0.998389737407,-0.998395171435,-0.998400596285,-0.998406011958,-0.998411418454,-0.998416815773,-0.998422203915,-0.998427582879,-0.998432952667,-0.998438313276,-0.998443664708,-0.998449006963,-0.998454340041,-0.99845966394,-0.998464978662,-0.998470284207,-0.998475580573,-0.998480867762,-0.998486145773,-0.998491414606,-0.998496674262,-0.998501924739,-0.998507166038,-0.99851239816,-0.998517621103,-0.998522834868,-0.998528039454,-0.998533234863,-0.998538421093,-0.998543598145,-0.998548766018,-0.998553924713,-0.99855907423,-0.998564214568,-0.998569345727,-0.998574467708,-0.99857958051,-0.998584684133,-0.998589778578,-0.998594863843,-0.99859993993,-0.998605006838,-0.998610064567,-0.998615113117,-0.998620152488,-0.99862518268,-0.998630203693,-0.998635215526,-0.99864021818,-0.998645211655,-0.998650195951,-0.998655171067,-0.998660137004,-0.998665093761,-0.998670041339,-0.998674979737,-0.998679908956,-0.998684828995,-0.998689739854,-0.998694641534,-0.998699534034,-0.998704417353,-0.998709291494,-0.998714156454,-0.998719012234,-0.998723858834,-0.998728696254,-0.998733524494,-0.998738343554,-0.998743153434,-0.998747954133,-0.998752745652,-0.998757527991,-0.99876230115,-0.998767065128,-0.998771819925,-0.998776565542,-0.998781301979,-0.998786029235,-0.99879074731,-0.998795456205,-0.998800155919,-0.998804846452,-0.998809527805,-0.998814199976,-0.998818862967,-0.998823516777,-0.998828161406,-0.998832796854,-0.99883742312,-0.998842040206,-0.99884664811,-0.998851246834,-0.998855836376,-0.998860416737,-0.998864987916,-0.998869549914,-0.998874102731,-0.998878646366,-0.99888318082,-0.998887706093,-0.998892222183,-0.998896729092,-0.99890122682,-0.998905715366,-0.99891019473,-0.998914664912,-0.998919125913,-0.998923577731,-0.998928020368,-0.998932453823,-0.998936878096,-0.998941293187,-0.998945699096,-0.998950095822,-0.998954483367,-0.998958861729,-0.99896323091,-0.998967590908,-0.998971941723,-0.998976283356,-0.998980615807,-0.998984939076,-0.998989253162,-0.998993558066,-0.998997853787,-0.999002140325,-0.999006417681,-0.999010685854,-0.999014944845,-0.999019194652,-0.999023435277,-0.99902766672,-0.999031888979,-0.999036102055,-0.999040305949,-0.999044500659,-0.999048686187,-0.999052862532,-0.999057029693,-0.999061187671,-0.999065336466,-0.999069476078,-0.999073606507,-0.999077727753,-0.999081839815,-0.999085942694,-0.999090036389,-0.999094120901,-0.99909819623,-0.999102262375,-0.999106319336,-0.999110367114,-0.999114405709,-0.999118435119,-0.999122455346,-0.99912646639,-0.999130468249,-0.999134460925,-0.999138444417,-0.999142418725,-0.999146383849,-0.999150339789,-0.999154286545,-0.999158224118,-0.999162152506,-0.99916607171,-0.99916998173,-0.999173882566,-0.999177774217,-0.999181656685,-0.999185529968,-0.999189394067,-0.999193248981,-0.999197094711,-0.999200931257,-0.999204758618,-0.999208576795,-0.999212385787,-0.999216185595,-0.999219976218,-0.999223757657,-0.999227529911,-0.99923129298,-0.999235046865,-0.999238791564,-0.999242527079,-0.999246253409,-0.999249970555,-0.999253678515,-0.999257377291,-0.999261066881,-0.999264747287,-0.999268418507,-0.999272080543,-0.999275733393,-0.999279377058,-0.999283011538,-0.999286636833,-0.999290252943,-0.999293859867,-0.999297457606,-0.99930104616,-0.999304625528,-0.999308195711,-0.999311756709,-0.999315308521,-0.999318851147,-0.999322384588,-0.999325908844,-0.999329423914,-0.999332929798,-0.999336426497,-0.99933991401,-0.999343392337,-0.999346861478,-0.999350321434,-0.999353772204,-0.999357213788,-0.999360646186,-0.999364069399,-0.999367483425,-0.999370888265,-0.99937428392,-0.999377670388,-0.99938104767,-0.999384415766,-0.999387774676,-0.9993911244,-0.999394464938,-0.99939779629,-0.999401118455,-0.999404431434,-0.999407735226,-0.999411029833,-0.999414315253,-0.999417591486,-0.999420858533,-0.999424116394,-0.999427365068,-0.999430604555,-0.999433834857,-0.999437055971,-0.999440267899,-0.99944347064,-0.999446664195,-0.999449848562,-0.999453023744,-0.999456189738,-0.999459346546,-0.999462494166,-0.9994656326,-0.999468761847,-0.999471881907,-0.999474992781,-0.999478094467,-0.999481186966,-0.999484270278,-0.999487344404,-0.999490409342,-0.999493465093,-0.999496511657,-0.999499549033,-0.999502577223,-0.999505596225,-0.99950860604,-0.999511606668,-0.999514598109,-0.999517580362,-0.999520553428,-0.999523517306,-0.999526471997,-0.999529417501,-0.999532353817,-0.999535280946,-0.999538198887,-0.999541107641,-0.999544007207,-0.999546897585,-0.999549778776,-0.999552650779,-0.999555513595,-0.999558367223,-0.999561211663,-0.999564046915,-0.99956687298,-0.999569689857,-0.999572497546,-0.999575296047,-0.99957808536,-0.999580865485,-0.999583636423,-0.999586398172,-0.999589150734,-0.999591894107,-0.999594628292,-0.99959735329,-0.999600069099,-0.99960277572,-0.999605473153,-0.999608161398,-0.999610840455,-0.999613510323,-0.999616171003,-0.999618822495,-0.999621464799,-0.999624097914,-0.999626721841,-0.99962933658,-0.99963194213,-0.999634538492,-0.999637125666,-0.999639703651,-0.999642272447,-0.999644832055,-0.999647382475,-0.999649923706,-0.999652455748,-0.999654978602,-0.999657492267,-0.999659996744,-0.999662492032,-0.999664978131,-0.999667455042,-0.999669922763,-0.999672381297,-0.999674830641,-0.999677270796,-0.999679701763,-0.999682123541,-0.99968453613,-0.99968693953,-0.999689333741,-0.999691718763,-0.999694094597,-0.999696461241,-0.999698818696,-0.999701166963,-0.99970350604,-0.999705835928,-0.999708156627,-0.999710468137,-0.999712770458,-0.99971506359,-0.999717347532,-0.999719622286,-0.99972188785,-0.999724144225,-0.999726391411,-0.999728629407,-0.999730858214,-0.999733077832,-0.999735288261,-0.9997374895,-0.999739681549,-0.99974186441,-0.999744038081,-0.999746202562,-0.999748357855,-0.999750503957,-0.99975264087,-0.999754768594,-0.999756887128,-0.999758996472,-0.999761096627,-0.999763187593,-0.999765269369,-0.999767341955,-0.999769405351,-0.999771459558,-0.999773504575,-0.999775540403,-0.99977756704,-0.999779584488,-0.999781592747,-0.999783591815,-0.999785581694,-0.999787562382,-0.999789533881,-0.999791496191,-0.99979344931,-0.999795393239,-0.999797327979,-0.999799253528,-0.999801169888,-0.999803077058,-0.999804975037,-0.999806863827,-0.999808743427,-0.999810613836,-0.999812475056,-0.999814327085,-0.999816169925,-0.999818003574,-0.999819828034,-0.999821643303,-0.999823449382,-0.99982524627,-0.999827033969,-0.999828812478,-0.999830581796,-0.999832341924,-0.999834092862,-0.999835834609,-0.999837567166,-0.999839290533,-0.99984100471,-0.999842709696,-0.999844405492,-0.999846092098,-0.999847769513,-0.999849437738,-0.999851096772,-0.999852746616,-0.99985438727,-0.999856018733,-0.999857641006,-0.999859254088,-0.99986085798,-0.999862452681,-0.999864038192,-0.999865614512,-0.999867181641,-0.999868739581,-0.999870288329,-0.999871827887,-0.999873358254,-0.999874879431,-0.999876391417,-0.999877894212,-0.999879387817,-0.999880872231,-0.999882347454,-0.999883813487,-0.999885270329,-0.99988671798,-0.99988815644,-0.99988958571,-0.999891005789,-0.999892416677,-0.999893818374,-0.999895210881,-0.999896594197,-0.999897968321,-0.999899333256,-0.999900688999,-0.999902035551,-0.999903372912,-0.999904701083,-0.999906020062,-0.999907329851,-0.999908630449,-0.999909921856,-0.999911204071,-0.999912477096,-0.99991374093,-0.999914995573,-0.999916241025,-0.999917477286,-0.999918704356,-0.999919922235,-0.999921130922,-0.999922330419,-0.999923520725,-0.999924701839,-0.999925873763,-0.999927036495,-0.999928190036,-0.999929334386,-0.999930469545,-0.999931595513,-0.99993271229,-0.999933819875,-0.99993491827,-0.999936007473,-0.999937087485,-0.999938158305,-0.999939219935,-0.999940272373,-0.99994131562,-0.999942349676,-0.999943374541,-0.999944390214,-0.999945396696,-0.999946393987,-0.999947382086,-0.999948360994,-0.999949330711,-0.999950291236,-0.999951242571,-0.999952184714,-0.999953117665,-0.999954041425,-0.999954955994,-0.999955861371,-0.999956757557,-0.999957644552,-0.999958522355,-0.999959390967,-0.999960250387,-0.999961100616,-0.999961941654,-0.9999627735,-0.999963596155,-0.999964409618,-0.99996521389,-0.99996600897,-0.999966794859,-0.999967571556,-0.999968339062,-0.999969097377,-0.9999698465,-0.999970586431,-0.999971317171,-0.999972038719,-0.999972751076,-0.999973454241,-0.999974148215,-0.999974832997,-0.999975508588,-0.999976174987,-0.999976832194,-0.99997748021,-0.999978119035,-0.999978748667,-0.999979369109,-0.999979980358,-0.999980582416,-0.999981175283,-0.999981758957,-0.999982333441,-0.999982898732,-0.999983454832,-0.99998400174,-0.999984539457,-0.999985067982,-0.999985587315,-0.999986097457,-0.999986598407,-0.999987090165,-0.999987572732,-0.999988046107,-0.99998851029,-0.999988965282,-0.999989411082,-0.99998984769,-0.999990275107,-0.999990693332,-0.999991102365,-0.999991502206,-0.999991892856,-0.999992274314,-0.999992646581,-0.999993009655,-0.999993363538,-0.99999370823,-0.999994043729,-0.999994370037,-0.999994687153,-0.999994995077,-0.99999529381,-0.99999558335,-0.999995863699,-0.999996134857,-0.999996396822,-0.999996649596,-0.999996893178,-0.999997127568,-0.999997352767,-0.999997568774,-0.999997775589,-0.999997973212,-0.999998161643,-0.999998340883,-0.999998510931,-0.999998671787,-0.999998823452,-0.999998965924,-0.999999099205,-0.999999223294,-0.999999338192,-0.999999443897,-0.999999540411,-0.999999627733,-0.999999705863,-0.999999774801,-0.999999834548,-0.999999885103,-0.999999926466,-0.999999958637,-0.999999981616,-0.999999995404,-1.0,-0.999999995404,-0.999999981616,-0.999999958637,-0.999999926466,-0.999999885103,-0.999999834548,-0.999999774801,-0.999999705863,-0.999999627733,-0.999999540411,-0.999999443897,-0.999999338192,-0.999999223294,-0.999999099205,-0.999998965924,-0.999998823452,-0.999998671787,-0.999998510931,-0.999998340883,-0.999998161643,-0.999997973212,-0.999997775589,-0.999997568774,-0.999997352767,-0.999997127568,-0.999996893178,-0.999996649596,-0.999996396822,-0.999996134857,-0.999995863699,-0.99999558335,-0.99999529381,-0.999994995077,-0.999994687153,-0.999994370037,-0.999994043729,-0.99999370823,-0.999993363538,-0.999993009655,-0.999992646581,-0.999992274314,-0.999991892856,-0.999991502206,-0.999991102365,-0.999990693332,-0.999990275107,-0.99998984769,-0.999989411082,-0.999988965282,-0.99998851029,-0.999988046107,-0.999987572732,-0.999987090165,-0.999986598407,-0.999986097457,-0.999985587315,-0.999985067982,-0.999984539457,-0.99998400174,-0.999983454832,-0.999982898732,-0.999982333441,-0.999981758957,-0.999981175283,-0.999980582416,-0.999979980358,-0.999979369109,-0.999978748667,-0.999978119035,-0.99997748021,-0.999976832194,-0.999976174987,-0.999975508588,-0.999974832997,-0.999974148215,-0.999973454241,-0.999972751076,-0.999972038719,-0.999971317171,-0.999970586431,-0.9999698465,-0.999969097377,-0.999968339062,-0.999967571556,-0.999966794859,-0.99996600897,-0.99996521389,-0.999964409618,-0.999963596155,-0.9999627735,-0.999961941654,-0.999961100616,-0.999960250387,-0.999959390967,-0.999958522355,-0.999957644552,-0.999956757557,-0.999955861371,-0.999954955994,-0.999954041425,-0.999953117665,-0.999952184714,-0.999951242571,-0.999950291236,-0.999949330711,-0.999948360994,-0.999947382086,-0.999946393987,-0.999945396696,-0.999944390214,-0.999943374541,-0.999942349676,-0.99994131562,-0.999940272373,-0.999939219935,-0.999938158305,-0.999937087485,-0.999936007473,-0.99993491827,-0.999933819875,-0.99993271229,-0.999931595513,-0.999930469545,-0.999929334386,-0.999928190036,-0.999927036495,-0.999925873763,-0.999924701839,-0.999923520725,-0.999922330419,-0.999921130922,-0.999919922235,-0.999918704356,-0.999917477286,-0.999916241025,-0.999914995573,-0.99991374093,-0.999912477096,-0.999911204071,-0.999909921856,-0.999908630449,-0.999907329851,-0.999906020062,-0.999904701083,-0.999903372912,-0.999902035551,-0.999900688999,-0.999899333256,-0.999897968321,-0.999896594197,-0.999895210881,-0.999893818374,-0.999892416677,-0.999891005789,-0.99988958571,-0.99988815644,-0.99988671798,-0.999885270329,-0.999883813487,-0.999882347454,-0.999880872231,-0.999879387817,-0.999877894212,-0.999876391417,-0.999874879431,-0.999873358254,-0.999871827887,-0.999870288329,-0.999868739581,-0.999867181641,-0.999865614512,-0.999864038192,-0.999862452681,-0.99986085798,-0.999859254088,-0.999857641006,-0.999856018733,-0.99985438727,-0.999852746616,-0.999851096772,-0.999849437738,-0.999847769513,-0.999846092098,-0.999844405492,-0.999842709696,-0.99984100471,-0.999839290533,-0.999837567166,-0.999835834609,-0.999834092862,-0.999832341924,-0.999830581796,-0.999828812478,-0.999827033969,-0.99982524627,-0.999823449382,-0.999821643303,-0.999819828034,-0.999818003574,-0.999816169925,-0.999814327085,-0.999812475056,-0.999810613836,-0.999808743427,-0.999806863827,-0.999804975037,-0.999803077058,-0.999801169888,-0.999799253528,-0.999797327979,-0.999795393239,-0.99979344931,-0.999791496191,-0.999789533881,-0.999787562382,-0.999785581694,-0.999783591815,-0.999781592747,-0.999779584488,-0.99977756704,-0.999775540403,-0.999773504575,-0.999771459558,-0.999769405351,-0.999767341955,-0.999765269369,-0.999763187593,-0.999761096627,-0.999758996472,-0.999756887128,-0.999754768594,-0.99975264087,-0.999750503957,-0.999748357855,-0.999746202562,-0.999744038081,-0.99974186441,-0.999739681549,-0.9997374895,-0.999735288261,-0.999733077832,-0.999730858214,-0.999728629407,-0.999726391411,-0.999724144225,-0.99972188785,-0.999719622286,-0.999717347532,-0.99971506359,-0.999712770458,-0.999710468137,-0.999708156627,-0.999705835928,-0.99970350604,-0.999701166963,-0.999698818696,-0.999696461241,-0.999694094597,-0.999691718763,-0.999689333741,-0.99968693953,-0.99968453613,-0.999682123541,-0.999679701763,-0.999677270796,-0.999674830641,-0.999672381297,-0.999669922763,-0.999667455042,-0.999664978131,-0.999662492032,-0.999659996744,-0.999657492267,-0.999654978602,-0.999652455748,-0.999649923706,-0.999647382475,-0.999644832055,-0.999642272447,-0.999639703651,-0.999637125666,-0.999634538492,-0.99963194213,-0.99962933658,-0.999626721841,-0.999624097914,-0.999621464799,-0.999618822495,-0.999616171003,-0.999613510323,-0.999610840455,-0.999608161398,-0.999605473153,-0.99960277572,-0.999600069099,-0.99959735329,-0.999594628292,-0.999591894107,-0.999589150734,-0.999586398172,-0.999583636423,-0.999580865485,-0.99957808536,-0.999575296047,-0.999572497546,-0.999569689857,-0.99956687298,-0.999564046915,-0.999561211663,-0.999558367223,-0.999555513595,-0.999552650779,-0.999549778776,-0.999546897585,-0.999544007207,-0.999541107641,-0.999538198887,-0.999535280946,-0.999532353817,-0.999529417501,-0.999526471997,-0.999523517306,-0.999520553428,-0.999517580362,-0.999514598109,-0.999511606668,-0.99950860604,-0.999505596225,-0.999502577223,-0.999499549033,-0.999496511657,-0.999493465093,-0.999490409342,-0.999487344404,-0.999484270278,-0.999481186966,-0.999478094467,-0.999474992781,-0.999471881907,-0.999468761847,-0.9994656326,-0.999462494166,-0.999459346546,-0.999456189738,-0.999453023744,-0.999449848562,-0.999446664195,-0.99944347064,-0.999440267899,-0.999437055971,-0.999433834857,-0.999430604555,-0.999427365068,-0.999424116394,-0.999420858533,-0.999417591486,-0.999414315253,-0.999411029833,-0.999407735226,-0.999404431434,-0.999401118455,-0.99939779629,-0.999394464938,-0.9993911244,-0.999387774676,-0.999384415766,-0.99938104767,-0.999377670388,-0.99937428392,-0.999370888265,-0.999367483425,-0.999364069399,-0.999360646186,-0.999357213788,-0.999353772204,-0.999350321434,-0.999346861478,-0.999343392337,-0.99933991401,-0.999336426497,-0.999332929798,-0.999329423914,-0.999325908844,-0.999322384588,-0.999318851147,-0.999315308521,-0.999311756709,-0.999308195711,-0.999304625528,-0.99930104616,-0.999297457606,-0.999293859867,-0.999290252943,-0.999286636833,-0.999283011538,-0.999279377058,-0.999275733393,-0.999272080543,-0.999268418507,-0.999264747287,-0.999261066881,-0.999257377291,-0.999253678515,-0.999249970555,-0.999246253409,-0.999242527079,-0.999238791564,-0.999235046865,-0.99923129298,-0.999227529911,-0.999223757657,-0.999219976218,-0.999216185595,-0.999212385787,-0.999208576795,-0.999204758618,-0.999200931257,-0.999197094711,-0.999193248981,-0.999189394067,-0.999185529968,-0.999181656685,-0.999177774217,-0.999173882566,-0.99916998173,-0.99916607171,-0.999162152506,-0.999158224118,-0.999154286545,-0.999150339789,-0.999146383849,-0.999142418725,-0.999138444417,-0.999134460925,-0.999130468249,-0.99912646639,-0.999122455346,-0.999118435119,-0.999114405709,-0.999110367114,-0.999106319336,-0.999102262375,-0.99909819623,-0.999094120901,-0.999090036389,-0.999085942694,-0.999081839815,-0.999077727753,-0.999073606507,-0.999069476078,-0.999065336466,-0.999061187671,-0.999057029693,-0.999052862532,-0.999048686187,-0.999044500659,-0.999040305949,-0.999036102055,-0.999031888979,-0.99902766672,-0.999023435277,-0.999019194652,-0.999014944845,-0.999010685854,-0.999006417681,-0.999002140325,-0.998997853787,-0.998993558066,-0.998989253162,-0.998984939076,-0.998980615807,-0.998976283356,-0.998971941723,-0.998967590908,-0.99896323091,-0.998958861729,-0.998954483367,-0.998950095822,-0.998945699096,-0.998941293187,-0.998936878096,-0.998932453823,-0.998928020368,-0.998923577731,-0.998919125913,-0.998914664912,-0.99891019473,-0.998905715366,-0.99890122682,-0.998896729092,-0.998892222183,-0.998887706093,-0.99888318082,-0.998878646366,-0.998874102731,-0.998869549914,-0.998864987916,-0.998860416737,-0.998855836376,-0.998851246834,-0.99884664811,-0.998842040206,-0.99883742312,-0.998832796854,-0.998828161406,-0.998823516777,-0.998818862967,-0.998814199976,-0.998809527805,-0.998804846452,-0.998800155919,-0.998795456205,-0.99879074731,-0.998786029235,-0.998781301979,-0.998776565542,-0.998771819925,-0.998767065128,-0.99876230115,-0.998757527991,-0.998752745652,-0.998747954133,-0.998743153434,-0.998738343554,-0.998733524494,-0.998728696254,-0.998723858834,-0.998719012234,-0.998714156454,-0.998709291494,-0.998704417353,-0.998699534034,-0.998694641534,-0.998689739854,-0.998684828995,-0.998679908956,-0.998674979737,-0.998670041339,-0.998665093761,-0.998660137004,-0.998655171067,-0.998650195951,-0.998645211655,-0.99864021818,-0.998635215526,-0.998630203693,-0.99862518268,-0.998620152488,-0.998615113117,-0.998610064567,-0.998605006838,-0.99859993993,-0.998594863843,-0.998589778578,-0.998584684133,-0.99857958051,-0.998574467708,-0.998569345727,-0.998564214568,-0.99855907423,-0.998553924713,-0.998548766018,-0.998543598145,-0.998538421093,-0.998533234863,-0.998528039454,-0.998522834868,-0.998517621103,-0.99851239816,-0.998507166038,-0.998501924739,-0.998496674262,-0.998491414606,-0.998486145773,-0.998480867762,-0.998475580573,-0.998470284207,-0.998464978662,-0.99845966394,-0.998454340041,-0.998449006963,-0.998443664708,-0.998438313276,-0.998432952667,-0.998427582879,-0.998422203915,-0.998416815773,-0.998411418454,-0.998406011958,-0.998400596285,-0.998395171435,-0.998389737407,-0.998384294203,-0.998378841822,-0.998373380264,-0.998367909529,-0.998362429617,-0.998356940528,-0.998351442263,-0.998345934821,-0.998340418203,-0.998334892408,-0.998329357436,-0.998323813289,-0.998318259964,-0.998312697464,-0.998307125787,-0.998301544934,-0.998295954905,-0.998290355699,-0.998284747318,-0.99827912976,-0.998273503027,-0.998267867118,-0.998262222032,-0.998256567771,-0.998250904335,-0.998245231722,-0.998239549934,-0.99823385897,-0.998228158831,-0.998222449516,-0.998216731026,-0.99821100336,-0.99820526652,-0.998199520503,-0.998193765312,-0.998188000945,-0.998182227403,-0.998176444686,-0.998170652795,-0.998164851728,-0.998159041486,-0.998153222069,-0.998147393478,-0.998141555712,-0.998135708771,-0.998129852655,-0.998123987365,-0.9981181129,-0.998112229261,-0.998106336447,-0.998100434459,-0.998094523297,-0.99808860296,-0.99808267345,-0.998076734765,-0.998070786905,-0.998064829872,-0.998058863665,-0.998052888284,-0.998046903729,-0.99804091,-0.998034907098,-0.998028895021,-0.998022873771,-0.998016843348,-0.998010803751,-0.99800475498,-0.997998697036,-0.997992629919,-0.997986553628,-0.997980468164,-0.997974373526,-0.997968269716,-0.997962156732,-0.997956034576,-0.997949903246,-0.997943762743,-0.997937613068,-0.99793145422,-0.997925286199,-0.997919109005,-0.997912922638,-0.997906727099,-0.997900522388,-0.997894308504,-0.997888085447,-0.997881853218,-0.997875611817,-0.997869361244,-0.997863101498,-0.99785683258,-0.99785055449,-0.997844267228,-0.997837970795,-0.997831665189,-0.997825350411,-0.997819026462,-0.99781269334,-0.997806351048,-0.997799999583,-0.997793638947,-0.99778726914,-0.997780890161,-0.99777450201,-0.997768104688,-0.997761698195,-0.997755282531,-0.997748857696,-0.997742423689,-0.997735980512,-0.997729528164,-0.997723066644,-0.997716595954,-0.997710116093,-0.997703627061,-0.997697128859,-0.997690621486,-0.997684104942,-0.997677579228,-0.997671044343,-0.997664500289,-0.997657947063,-0.997651384668,-0.997644813102,-0.997638232366,-0.99763164246,-0.997625043384,-0.997618435139,-0.997611817723,-0.997605191137,-0.997598555382,-0.997591910457,-0.997585256362,-0.997578593098,-0.997571920664,-0.99756523906,-0.997558548288,-0.997551848346,-0.997545139234,-0.997538420954,-0.997531693504,-0.997524956885,-0.997518211097,-0.99751145614,-0.997504692015,-0.99749791872,-0.997491136257,-0.997484344624,-0.997477543824,-0.997470733854,-0.997463914716,-0.99745708641,-0.997450248935,-0.997443402292,-0.997436546481,-0.997429681501,-0.997422807353,-0.997415924037,-0.997409031553,-0.997402129901,-0.997395219081,-0.997388299094,-0.997381369938,-0.997374431615,-0.997367484124,-0.997360527466,-0.99735356164,-0.997346586647,-0.997339602486,-0.997332609158,-0.997325606662,-0.997318595,-0.99731157417,-0.997304544173,-0.997297505009,-0.997290456679,-0.997283399181,-0.997276332517,-0.997269256685,-0.997262171688,-0.997255077523,-0.997247974192,-0.997240861694,-0.99723374003,-0.9972266092,-0.997219469204,-0.997212320041,-0.997205161712,-0.997197994217,-0.997190817555,-0.997183631728,-0.997176436735,-0.997169232576,-0.997162019252,-0.997154796762,-0.997147565106,-0.997140324284,-0.997133074297,-0.997125815145,-0.997118546827,-0.997111269344,-0.997103982696,-0.997096686882,-0.997089381903,-0.99708206776,-0.997074744451,-0.997067411978,-0.997060070339,-0.997052719536,-0.997045359569,-0.997037990436,-0.997030612139,-0.997023224678,-0.997015828052,-0.997008422262,-0.997001007307,-0.996993583189,-0.996986149906,-0.996978707459,-0.996971255848,-0.996963795073,-0.996956325134,-0.996948846031,-0.996941357765,-0.996933860335,-0.996926353741,-0.996918837984,-0.996911313064,-0.99690377898,-0.996896235732,-0.996888683322,-0.996881121748,-0.996873551011,-0.996865971111,-0.996858382048,-0.996850783822,-0.996843176434,-0.996835559882,-0.996827934168,-0.996820299291,-0.996812655252,-0.99680500205,-0.996797339686,-0.996789668159,-0.99678198747,-0.996774297619,-0.996766598606,-0.996758890431,-0.996751173094,-0.996743446594,-0.996735710933,-0.996727966111,-0.996720212126,-0.99671244898,-0.996704676672,-0.996696895203,-0.996689104572,-0.99668130478,-0.996673495827,-0.996665677712,-0.996657850437,-0.996650014,-0.996642168402,-0.996634313644,-0.996626449724,-0.996618576644,-0.996610694403,-0.996602803002,-0.99659490244,-0.996586992717,-0.996579073834,-0.996571145791,-0.996563208587,-0.996555262223,-0.996547306699,-0.996539342015,-0.996531368171,-0.996523385167,-0.996515393004,-0.99650739168,-0.996499381197,-0.996491361554,-0.996483332752,-0.99647529479,-0.996467247669,-0.996459191389,-0.996451125949,-0.99644305135,-0.996434967592,-0.996426874675,-0.996418772599,-0.996410661364,-0.996402540971,-0.996394411419,-0.996386272708,-0.996378124838,-0.99636996781,-0.996361801624,-0.996353626279,-0.996345441776,-0.996337248115,-0.996329045295,-0.996320833318,-0.996312612183,-0.99630438189,-0.996296142438,-0.99628789383,-0.996279636063,-0.996271369139,-0.996263093058,-0.996254807819,-0.996246513422,-0.996238209869,-0.996229897158,-0.99622157529,-0.996213244265,-0.996204904083,-0.996196554744,-0.996188196248,-0.996179828596,-0.996171451787,-0.996163065821,-0.996154670699,-0.99614626642,-0.996137852985,-0.996129430393,-0.996120998646,-0.996112557742,-0.996104107682,-0.996095648467,-0.996087180095,-0.996078702568,-0.996070215884,-0.996061720046,-0.996053215051,-0.996044700901,-0.996036177596,-0.996027645135,-0.996019103519,-0.996010552748,-0.996001992822,-0.99599342374,-0.995984845504,-0.995976258113,-0.995967661567,-0.995959055866,-0.995950441011,-0.995941817001,-0.995933183837,-0.995924541518,-0.995915890045,-0.995907229417,-0.995898559636,-0.9958898807,-0.995881192611,-0.995872495367,-0.99586378897,-0.995855073419,-0.995846348714,-0.995837614855,-0.995828871843,-0.995820119678,-0.995811358359,-0.995802587887,-0.995793808262,-0.995785019483,-0.995776221552,-0.995767414468,-0.99575859823,-0.99574977284,-0.995740938298,-0.995732094602,-0.995723241754,-0.995714379754,-0.995705508601,-0.995696628296,-0.995687738838,-0.995678840229,-0.995669932467,-0.995661015554,-0.995652089488,-0.995643154271,-0.995634209902,-0.995625256381,-0.995616293709,-0.995607321885,-0.99559834091,-0.995589350783,-0.995580351506,-0.995571343077,-0.995562325497,-0.995553298766,-0.995544262884,-0.995535217851,-0.995526163668,-0.995517100333,-0.995508027849,-0.995498946213,-0.995489855428,-0.995480755492,-0.995471646406,-0.995462528169,-0.995453400783,-0.995444264247,-0.99543511856,-0.995425963724,-0.995416799738,-0.995407626603,-0.995398444317,-0.995389252883,-0.995380052299,-0.995370842565,-0.995361623683,-0.995352395651,-0.99534315847,-0.99533391214,-0.995324656662,-0.995315392034,-0.995306118258,-0.995296835333,-0.99528754326,-0.995278242038,-0.995268931668,-0.995259612149,-0.995250283482,-0.995240945667,-0.995231598705,-0.995222242594,-0.995212877335,-0.995203502928,-0.995194119374,-0.995184726672,-0.995175324823,-0.995165913826,-0.995156493682,-0.99514706439,-0.995137625952,-0.995128178366,-0.995118721633,-0.995109255754,-0.995099780727,-0.995090296554,-0.995080803234,-0.995071300768,-0.995061789155,-0.995052268396,-0.99504273849,-0.995033199438,-0.99502365124,-0.995014093896,-0.995004527406,-0.99499495177,-0.994985366989,-0.994975773061,-0.994966169989,-0.99495655777,-0.994946936406,-0.994937305897,-0.994927666243,-0.994918017443,-0.994908359498,-0.994898692409,-0.994889016174,-0.994879330795,-0.994869636271,-0.994859932602,-0.994850219789,-0.994840497831,-0.994830766729,-0.994821026483,-0.994811277092,-0.994801518558,-0.994791750879,-0.994781974057,-0.99477218809,-0.99476239298,-0.994752588726,-0.994742775329,-0.994732952788,-0.994723121104,-0.994713280277,-0.994703430306,-0.994693571193,-0.994683702936,-0.994673825536,-0.994663938994,-0.994654043309,-0.994644138481,-0.994634224511,-0.994624301398,-0.994614369143,-0.994604427745,-0.994594477206,-0.994584517524,-0.9945745487,-0.994564570734,-0.994554583627,-0.994544587377,-0.994534581987,-0.994524567454,-0.99451454378,-0.994504510965,-0.994494469008,-0.994484417911,-0.994474357672,-0.994464288292,-0.994454209771,-0.99444412211,-0.994434025308,-0.994423919365,-0.994413804281,-0.994403680058,-0.994393546694,-0.994383404189,-0.994373252545,-0.99436309176,-0.994352921835,-0.994342742771,-0.994332554567,-0.994322357223,-0.994312150739,-0.994301935116,-0.994291710353,-0.994281476452,-0.994271233411,-0.99426098123,-0.994250719911,-0.994240449453,-0.994230169856,-0.994219881121,-0.994209583246,-0.994199276233,-0.994188960082,-0.994178634792,-0.994168300364,-0.994157956798,-0.994147604093,-0.994137242251,-0.994126871271,-0.994116491153,-0.994106101897,-0.994095703504,-0.994085295973,-0.994074879305,-0.994064453499,-0.994054018557,-0.994043574477,-0.99403312126,-0.994022658906,-0.994012187415,-0.994001706787,-0.993991217023,-0.993980718123,-0.993970210085,-0.993959692912,-0.993949166602,-0.993938631156,-0.993928086574,-0.993917532856,-0.993906970002,-0.993896398013,-0.993885816887,-0.993875226626,-0.99386462723,-0.993854018698,-0.993843401031,-0.993832774229,-0.993822138292,-0.993811493219,-0.993800839012,-0.99379017567,-0.993779503193,-0.993768821582,-0.993758130836,-0.993747430955,-0.993736721941,-0.993726003792,-0.993715276509,-0.993704540092,-0.993693794541,-0.993683039856,-0.993672276038,-0.993661503086,-0.993650721,-0.993639929781,-0.993629129429,-0.993618319943,-0.993607501325,-0.993596673573,-0.993585836688,-0.993574990671,-0.993564135521,-0.993553271238,-0.993542397822,-0.993531515275,-0.993520623595,-0.993509722782,-0.993498812838,-0.993487893761,-0.993476965553,-0.993466028213,-0.993455081741,-0.993444126137,-0.993433161402,-0.993422187535,-0.993411204537,-0.993400212408,-0.993389211148,-0.993378200757,-0.993367181235,-0.993356152582,-0.993345114798,-0.993334067884,-0.993323011839,-0.993311946664,-0.993300872358,-0.993289788922,-0.993278696356,-0.993267594661,-0.993256483835,-0.993245363879,-0.993234234794,-0.993223096579,-0.993211949235,-0.993200792761,-0.993189627158,-0.993178452426,-0.993167268564,-0.993156075574,-0.993144873455,-0.993133662207,-0.99312244183,-0.993111212325,-0.993099973692,-0.99308872593,-0.993077469039,-0.993066203021,-0.993054927875,-0.9930436436,-0.993032350198,-0.993021047668,-0.99300973601,-0.992998415225,-0.992987085312,-0.992975746273,-0.992964398105,-0.992953040811,-0.99294167439,-0.992930298842,-0.992918914167,-0.992907520365,-0.992896117437,-0.992884705382,-0.992873284201,-0.992861853893,-0.99285041446,-0.9928389659,-0.992827508215,-0.992816041403,-0.992804565466,-0.992793080403,-0.992781586215,-0.992770082901,-0.992758570462,-0.992747048897,-0.992735518208,-0.992723978393,-0.992712429454,-0.992700871389,-0.9926893042,-0.992677727887,-0.992666142449,-0.992654547887,-0.9926429442,-0.992631331389,-0.992619709454,-0.992608078395,-0.992596438213,-0.992584788906,-0.992573130476,-0.992561462923,-0.992549786246,-0.992538100446,-0.992526405522,-0.992514701476,-0.992502988306,-0.992491266014,-0.992479534599,-0.992467794061,-0.992456044401,-0.992444285618,-0.992432517713,-0.992420740685,-0.992408954536,-0.992397159264,-0.992385354871,-0.992373541356,-0.992361718719,-0.99234988696,-0.99233804608,-0.992326196079,-0.992314336957,-0.992302468713,-0.992290591348,-0.992278704863,-0.992266809256,-0.992254904529,-0.992242990681,-0.992231067713,-0.992219135625,-0.992207194416,-0.992195244087,-0.992183284638,-0.992171316069,-0.99215933838,-0.992147351571,-0.992135355643,-0.992123350596,-0.992111336428,-0.992099313142,-0.992087280737,-0.992075239212,-0.992063188569,-0.992051128806,-0.992039059925,-0.992026981926,-0.992014894808,-0.992002798571,-0.991990693216,-0.991978578744,-0.991966455153,-0.991954322444,-0.991942180617,-0.991930029672,-0.99191786961,-0.991905700431,-0.991893522134,-0.991881334719,-0.991869138188,-0.991856932539,-0.991844717774,-0.991832493892,-0.991820260893,-0.991808018777,-0.991795767545,-0.991783507197,-0.991771237732,-0.991758959152,-0.991746671455,-0.991734374642,-0.991722068713,-0.991709753669,-0.991697429509,-0.991685096234,-0.991672753843,-0.991660402337,-0.991648041716,-0.99163567198,-0.991623293129,-0.991610905163,-0.991598508083,-0.991586101888,-0.991573686579,-0.991561262155,-0.991548828617,-0.991536385965,-0.991523934199,-0.991511473319,-0.991499003325,-0.991486524218,-0.991474035997,-0.991461538662,-0.991449032215,-0.991436516654,-0.99142399198,-0.991411458193,-0.991398915294,-0.991386363281,-0.991373802156,-0.991361231919,-0.991348652569,-0.991336064107,-0.991323466532,-0.991310859846,-0.991298244048,-0.991285619138,-0.991272985116,-0.991260341983,-0.991247689738,-0.991235028382,-0.991222357915,-0.991209678336,-0.991196989647,-0.991184291847,-0.991171584936,-0.991158868914,-0.991146143782,-0.991133409539,-0.991120666186,-0.991107913723,-0.99109515215,-0.991082381467,-0.991069601674,-0.991056812772,-0.99104401476,-0.991031207638,-0.991018391407,-0.991005566067,-0.990992731618,-0.99097988806,-0.990967035392,-0.990954173617,-0.990941302732,-0.990928422739,-0.990915533638,-0.990902635428,-0.99088972811,-0.990876811684,-0.99086388615,-0.990850951508,-0.990838007759,-0.990825054902,-0.990812092938,-0.990799121866,-0.990786141687,-0.990773152401,-0.990760154008,-0.990747146508,-0.990734129902,-0.990721104188,-0.990708069369,-0.990695025443,-0.99068197241,-0.990668910272,-0.990655839027,-0.990642758677,-0.990629669221,-0.990616570659,-0.990603462992,-0.990590346219,-0.990577220341,-0.990564085358,-0.990550941269,-0.990537788076,-0.990524625778,-0.990511454375,-0.990498273868,-0.990485084256,-0.99047188554,-0.99045867772,-0.990445460796,-0.990432234768,-0.990418999635,-0.9904057554,-0.99039250206,-0.990379239617,-0.990365968071,-0.990352687421,-0.990339397669,-0.990326098813,-0.990312790855,-0.990299473793,-0.99028614763,-0.990272812363,-0.990259467994,-0.990246114523,-0.99023275195,-0.990219380275,-0.990205999498,-0.99019260962,-0.990179210639,-0.990165802557,-0.990152385374,-0.990138959089,-0.990125523704,-0.990112079217,-0.990098625629,-0.990085162941,-0.990071691152,-0.990058210262,-0.990044720272,-0.990031221182,-0.990017712992,-0.990004195701,-0.989990669311,-0.989977133821,-0.989963589231,-0.989950035542,-0.989936472753,-0.989922900865,-0.989909319878,-0.989895729791,-0.989882130606,-0.989868522322,-0.98985490494,-0.989841278459,-0.989827642879,-0.989813998202,-0.989800344426,-0.989786681552,-0.98977300958,-0.98975932851,-0.989745638343,-0.989731939078,-0.989718230716,-0.989704513256,-0.989690786699,-0.989677051046,-0.989663306295,-0.989649552448,-0.989635789504,-0.989622017463,-0.989608236326,-0.989594446093,-0.989580646764,-0.989566838338,-0.989553020817,-0.9895391942,-0.989525358487,-0.989511513679,-0.989497659776,-0.989483796777,-0.989469924683,-0.989456043494,-0.989442153211,-0.989428253832,-0.989414345359,-0.989400427791,-0.989386501129,-0.989372565373,-0.989358620523,-0.989344666579,-0.989330703541,-0.989316731409,-0.989302750183,-0.989288759865,-0.989274760452,-0.989260751947,-0.989246734349,-0.989232707657,-0.989218671873,-0.989204626996,-0.989190573027,-0.989176509965,-0.989162437811,-0.989148356564,-0.989134266226,-0.989120166796,-0.989106058273,-0.98909194066,-0.989077813955,-0.989063678158,-0.98904953327,-0.989035379291,-0.989021216221,-0.98900704406,-0.988992862808,-0.988978672466,-0.988964473033,-0.98895026451,-0.988936046897,-0.988921820194,-0.9889075844,-0.988893339517,-0.988879085544,-0.988864822482,-0.98885055033,-0.988836269089,-0.988821978758,-0.988807679339,-0.988793370831,-0.988779053234,-0.988764726548,-0.988750390774,-0.988736045911,-0.98872169196,-0.988707328921,-0.988692956794,-0.98867857558,-0.988664185277,-0.988649785887,-0.988635377409,-0.988620959844,-0.988606533192,-0.988592097453,-0.988577652627,-0.988563198714,-0.988548735715,-0.988534263629,-0.988519782456,-0.988505292198,-0.988490792853,-0.988476284422,-0.988461766905,-0.988447240303,-0.988432704615,-0.988418159841,-0.988403605982,-0.988389043038,-0.988374471009,-0.988359889895,-0.988345299697,-0.988330700413,-0.988316092045,-0.988301474593,-0.988286848056,-0.988272212435,-0.988257567731,-0.988242913942,-0.98822825107,-0.988213579114,-0.988198898075,-0.988184207952,-0.988169508746,-0.988154800457,-0.988140083086,-0.988125356631,-0.988110621094,-0.988095876474,-0.988081122772,-0.988066359988,-0.988051588122,-0.988036807173,-0.988022017143,-0.988007218031,-0.987992409838,-0.987977592563,-0.987962766207,-0.98794793077,-0.987933086252,-0.987918232653,-0.987903369973,-0.987888498213,-0.987873617372,-0.987858727451,-0.987843828449,-0.987828920368,-0.987814003206,-0.987799076965,-0.987784141645,-0.987769197244,-0.987754243765,-0.987739281206,-0.987724309568,-0.987709328851,-0.987694339055,-0.987679340181,-0.987664332228,-0.987649315197,-0.987634289087,-0.9876192539,-0.987604209634,-0.987589156291,-0.987574093869,-0.987559022371,-0.987543941794,-0.987528852141,-0.98751375341,-0.987498645603,-0.987483528718,-0.987468402757,-0.987453267719,-0.987438123605,-0.987422970414,-0.987407808147,-0.987392636804,-0.987377456385,-0.987362266891,-0.987347068321,-0.987331860675,-0.987316643954,-0.987301418158,-0.987286183287,-0.98727093934,-0.987255686319,-0.987240424224,-0.987225153054,-0.987209872809,-0.987194583491,-0.987179285098,-0.987163977631,-0.987148661091,-0.987133335477,-0.987118000789,-0.987102657028,-0.987087304193,-0.987071942286,-0.987056571306,-0.987041191253,-0.987025802127,-0.987010403928,-0.986994996658,-0.986979580315,-0.9869641549,-0.986948720413,-0.986933276854,-0.986917824223,-0.986902362521,-0.986886891748,-0.986871411903,-0.986855922987,-0.986840425,-0.986824917943,-0.986809401814,-0.986793876615,-0.986778342346,-0.986762799007,-0.986747246597,-0.986731685117,-0.986716114568,-0.986700534949,-0.98668494626,-0.986669348502,-0.986653741675,-0.986638125778,-0.986622500813,-0.986606866779,-0.986591223676,-0.986575571505,-0.986559910265,-0.986544239957,-0.986528560581,-0.986512872136,-0.986497174625,-0.986481468045,-0.986465752398,-0.986450027683,-0.986434293902,-0.986418551053,-0.986402799137,-0.986387038154,-0.986371268105,-0.986355488989,-0.986339700807,-0.986323903559,-0.986308097245,-0.986292281864,-0.986276457418,-0.986260623906,-0.986244781329,-0.986228929686,-0.986213068979,-0.986197199206,-0.986181320368,-0.986165432465,-0.986149535498,-0.986133629467,-0.986117714371,-0.98610179021,-0.986085856986,-0.986069914698,-0.986053963346,-0.986038002931,-0.986022033452,-0.98600605491,-0.985990067304,-0.985974070636,-0.985958064905,-0.985942050111,-0.985926026254,-0.985909993335,-0.985893951354,-0.985877900311,-0.985861840206,-0.985845771038,-0.98582969281,-0.985813605519,-0.985797509168,-0.985781403755,-0.985765289281,-0.985749165746,-0.98573303315,-0.985716891493,-0.985700740776,-0.985684580999,-0.985668412162,-0.985652234264,-0.985636047307,-0.985619851289,-0.985603646213,-0.985587432076,-0.985571208881,-0.985554976626,-0.985538735312,-0.98552248494,-0.985506225508,-0.985489957018,-0.98547367947,-0.985457392864,-0.985441097199,-0.985424792476,-0.985408478696,-0.985392155858,-0.985375823962,-0.985359483009,-0.985343132999,-0.985326773932,-0.985310405807,-0.985294028626,-0.985277642389,-0.985261247095,-0.985244842745,-0.985228429338,-0.985212006876,-0.985195575357,-0.985179134783,-0.985162685154,-0.985146226469,-0.985129758728,-0.985113281933,-0.985096796083,-0.985080301178,-0.985063797218,-0.985047284204,-0.985030762135,-0.985014231012,-0.984997690835,-0.984981141605,-0.98496458332,-0.984948015982,-0.984931439591,-0.984914854146,-0.984898259648,-0.984881656097,-0.984865043494,-0.984848421837,-0.984831791128,-0.984815151367,-0.984798502554,-0.984781844688,-0.984765177771,-0.984748501802,-0.984731816781,-0.984715122709,-0.984698419586,-0.984681707411,-0.984664986185,-0.984648255909,-0.984631516582,-0.984614768204,-0.984598010776,-0.984581244298,-0.98456446877,-0.984547684192,-0.984530890564,-0.984514087886,-0.984497276159,-0.984480455383,-0.984463625558,-0.984446786684,-0.98442993876,-0.984413081789,-0.984396215768,-0.984379340699,-0.984362456583,-0.984345563418,-0.984328661205,-0.984311749944,-0.984294829636,-0.98427790028,-0.984260961878,-0.984244014428,-0.984227057931,-0.984210092387,-0.984193117797,-0.98417613416,-0.984159141476,-0.984142139747,-0.984125128972,-0.98410810915,-0.984091080283,-0.984074042371,-0.984056995413,-0.98403993941,-0.984022874361,-0.984005800268,-0.98398871713,-0.983971624948,-0.983954523721,-0.983937413449,-0.983920294134,-0.983903165774,-0.983886028371,-0.983868881924,-0.983851726434,-0.9838345619,-0.983817388323,-0.983800205703,-0.98378301404,-0.983765813334,-0.983748603586,-0.983731384795,-0.983714156962,-0.983696920087,-0.98367967417,-0.983662419212,-0.983645155211,-0.98362788217,-0.983610600087,-0.983593308962,-0.983576008797,-0.983558699591,-0.983541381345,-0.983524054058,-0.98350671773,-0.983489372362,-0.983472017955,-0.983454654507,-0.98343728202,-0.983419900493,-0.983402509927,-0.983385110322,-0.983367701677,-0.983350283994,-0.983332857272,-0.983315421511,-0.983297976712,-0.983280522874,-0.983263059999,-0.983245588085,-0.983228107134,-0.983210617145,-0.983193118119,-0.983175610055,-0.983158092955,-0.983140566817,-0.983123031642,-0.983105487431,-0.983087934184,-0.983070371899,-0.983052800579,-0.983035220223,-0.983017630831,-0.983000032403,-0.98298242494,-0.982964808441,-0.982947182908,-0.982929548339,-0.982911904735,-0.982894252096,-0.982876590423,-0.982858919716,-0.982841239974,-0.982823551199,-0.982805853389,-0.982788146546,-0.982770430669,-0.982752705758,-0.982734971815,-0.982717228838,-0.982699476829,-0.982681715786,-0.982663945711,-0.982646166604,-0.982628378464,-0.982610581292,-0.982592775089,-0.982574959853,-0.982557135586,-0.982539302287,-0.982521459958,-0.982503608597,-0.982485748205,-0.982467878782,-0.982450000328,-0.982432112845,-0.98241421633,-0.982396310786,-0.982378396212,-0.982360472608,-0.982342539974,-0.982324598311,-0.982306647618,-0.982288687896,-0.982270719146,-0.982252741366,-0.982234754558,-0.982216758721,-0.982198753856,-0.982180739963,-0.982162717042,-0.982144685093,-0.982126644117,-0.982108594113,-0.982090535081,-0.982072467022,-0.982054389937,-0.982036303824,-0.982018208685,-0.98200010452,-0.981981991328,-0.98196386911,-0.981945737865,-0.981927597595,-0.9819094483,-0.981891289979,-0.981873122632,-0.981854946261,-0.981836760864,-0.981818566443,-0.981800362996,-0.981782150526,-0.981763929031,-0.981745698512,-0.981727458969,-0.981709210402,-0.981690952811,-0.981672686197,-0.98165441056,-0.981636125899,-0.981617832215,-0.981599529509,-0.98158121778,-0.981562897028,-0.981544567255,-0.981526228459,-0.981507880641,-0.981489523801,-0.98147115794,-0.981452783057,-0.981434399152,-0.981416006227,-0.981397604281,-0.981379193314,-0.981360773326,-0.981342344318,-0.981323906289,-0.981305459241,-0.981287003172,-0.981268538084,-0.981250063976,-0.981231580849,-0.981213088702,-0.981194587536,-0.981176077352,-0.981157558148,-0.981139029926,-0.981120492686,-0.981101946427,-0.98108339115,-0.981064826856,-0.981046253543,-0.981027671213,-0.981009079866,-0.980990479502,-0.98097187012,-0.980953251721,-0.980934624306,-0.980915987874,-0.980897342426,-0.980878687962,-0.980860024482,-0.980841351985,-0.980822670473,-0.980803979946,-0.980785280403,-0.980766571845,-0.980747854272,-0.980729127685,-0.980710392082,-0.980691647465,-0.980672893834,-0.980654131189,-0.98063535953,-0.980616578857,-0.98059778917,-0.98057899047,-0.980560182756,-0.98054136603,-0.98052254029,-0.980503705538,-0.980484861773,-0.980466008996,-0.980447147207,-0.980428276405,-0.980409396592,-0.980390507767,-0.98037160993,-0.980352703082,-0.980333787223,-0.980314862353,-0.980295928472,-0.98027698558,-0.980258033678,-0.980239072766,-0.980220102843,-0.980201123911,-0.980182135968,-0.980163139016,-0.980144133055,-0.980125118084,-0.980106094104,-0.980087061115,-0.980068019118,-0.980048968112,-0.980029908097,-0.980010839074,-0.979991761043,-0.979972674005,-0.979953577958,-0.979934472905,-0.979915358843,-0.979896235775,-0.9798771037,-0.979857962617,-0.979838812528,-0.979819653433,-0.979800485331,-0.979781308224,-0.97976212211,-0.979742926991,-0.979723722866,-0.979704509735,-0.979685287599,-0.979666056459,-0.979646816313,-0.979627567163,-0.979608309008,-0.979589041849,-0.979569765685,-0.979550480518,-0.979531186347,-0.979511883172,-0.979492570994,-0.979473249812,-0.979453919628,-0.97943458044,-0.97941523225,-0.979395875057,-0.979376508861,-0.979357133664,-0.979337749464,-0.979318356263,-0.97929895406,-0.979279542855,-0.979260122649,-0.979240693442,-0.979221255234,-0.979201808025,-0.979182351816,-0.979162886606,-0.979143412395,-0.979123929185,-0.979104436975,-0.979084935765,-0.979065425556,-0.979045906347,-0.979026378139,-0.979006840932,-0.978987294726,-0.978967739522,-0.978948175319,-0.978928602118,-0.978909019919,-0.978889428721,-0.978869828527,-0.978850219334,-0.978830601144,-0.978810973957,-0.978791337773,-0.978771692592,-0.978752038415,-0.978732375241,-0.97871270307,-0.978693021904,-0.978673331741,-0.978653632583,-0.978633924429,-0.97861420728,-0.978594481136,-0.978574745997,-0.978555001862,-0.978535248733,-0.97851548661,-0.978495715492,-0.978475935381,-0.978456146275,-0.978436348175,-0.978416541082,-0.978396724996,-0.978376899916,-0.978357065843,-0.978337222778,-0.97831737072,-0.978297509669,-0.978277639626,-0.978257760591,-0.978237872564,-0.978217975545,-0.978198069534,-0.978178154533,-0.97815823054,-0.978138297556,-0.978118355581,-0.978098404615,-0.978078444659,-0.978058475713,-0.978038497777,-0.978018510851,-0.977998514935,-0.977978510029,-0.977958496134,-0.97793847325,-0.977918441377,-0.977898400515,-0.977878350664,-0.977858291825,-0.977838223998,-0.977818147183,-0.977798061379,-0.977777966588,-0.97775786281,-0.977737750044,-0.977717628291,-0.977697497551,-0.977677357825,-0.977657209111,-0.977637051411,-0.977616884725,-0.977596709053,-0.977576524396,-0.977556330752,-0.977536128123,-0.977515916509,-0.977495695909,-0.977475466325,-0.977455227756,-0.977434980202,-0.977414723664,-0.977394458142,-0.977374183635,-0.977353900145,-0.977333607671,-0.977313306214,-0.977292995774,-0.977272676351,-0.977252347944,-0.977232010555,-0.977211664184,-0.97719130883,-0.977170944494,-0.977150571176,-0.977130188876,-0.977109797595,-0.977089397332,-0.977068988088,-0.977048569863,-0.977028142658,-0.977007706471,-0.976987261305,-0.976966807158,-0.976946344031,-0.976925871924,-0.976905390837,-0.976884900771,-0.976864401725,-0.976843893701,-0.976823376697,-0.976802850715,-0.976782315754,-0.976761771815,-0.976741218897,-0.976720657002,-0.976700086129,-0.976679506278,-0.97665891745,-0.976638319644,-0.976617712862,-0.976597097102,-0.976576472366,-0.976555838653,-0.976535195965,-0.9765145443,-0.976493883659,-0.976473214042,-0.97645253545,-0.976431847883,-0.97641115134,-0.976390445822,-0.97636973133,-0.976349007863,-0.976328275422,-0.976307534006,-0.976286783617,-0.976266024253,-0.976245255916,-0.976224478606,-0.976203692322,-0.976182897066,-0.976162092836,-0.976141279634,-0.976120457459,-0.976099626312,-0.976078786193,-0.976057937102,-0.976037079039,-0.976016212005,-0.975995335999,-0.975974451022,-0.975953557075,-0.975932654156,-0.975911742267,-0.975890821408,-0.975869891578,-0.975848952779,-0.975828005009,-0.975807048271,-0.975786082562,-0.975765107885,-0.975744124238,-0.975723131623,-0.975702130039,-0.975681119486,-0.975660099965,-0.975639071476,-0.97561803402,-0.975596987595,-0.975575932204,-0.975554867844,-0.975533794518,-0.975512712225,-0.975491620965,-0.975470520739,-0.975449411546,-0.975428293388,-0.975407166263,-0.975386030173,-0.975364885117,-0.975343731095,-0.975322568109,-0.975301396158,-0.975280215241,-0.975259025361,-0.975237826516,-0.975216618706,-0.975195401933,-0.975174176196,-0.975152941495,-0.975131697831,-0.975110445204,-0.975089183614,-0.975067913061,-0.975046633545,-0.975025345067,-0.975004047627,-0.974982741224,-0.97496142586,-0.974940101534,-0.974918768247,-0.974897425999,-0.974876074789,-0.974854714619,-0.974833345488,-0.974811967396,-0.974790580344,-0.974769184333,-0.974747779361,-0.974726365429,-0.974704942539,-0.974683510689,-0.974662069879,-0.974640620111,-0.974619161384,-0.974597693699,-0.974576217056,-0.974554731454,-0.974533236894,-0.974511733377,-0.974490220902,-0.97446869947,-0.974447169081,-0.974425629735,-0.974404081432,-0.974382524173,-0.974360957957,-0.974339382786,-0.974317798658,-0.974296205575,-0.974274603536,-0.974252992541,-0.974231372592,-0.974209743688,-0.974188105829,-0.974166459015,-0.974144803247,-0.974123138525,-0.97410146485,-0.97407978222,-0.974058090637,-0.9740363901,-0.974014680611,-0.973992962168,-0.973971234773,-0.973949498425,-0.973927753125,-0.973905998872,-0.973884235668,-0.973862463512,-0.973840682405,-0.973818892346,-0.973797093336,-0.973775285375,-0.973753468463,-0.973731642601,-0.973709807788,-0.973687964026,-0.973666111313,-0.973644249651,-0.973622379039,-0.973600499478,-0.973578610967,-0.973556713508,-0.9735348071,-0.973512891744,-0.973490967439,-0.973469034186,-0.973447091985,-0.973425140837,-0.973403180741,-0.973381211697,-0.973359233707,-0.973337246769,-0.973315250885,-0.973293246055,-0.973271232278,-0.973249209555,-0.973227177886,-0.973205137271,-0.973183087711,-0.973161029206,-0.973138961755,-0.97311688536,-0.97309480002,-0.973072705735,-0.973050602507,-0.973028490334,-0.973006369217,-0.972984239157,-0.972962100153,-0.972939952206,-0.972917795315,-0.972895629482,-0.972873454707,-0.972851270989,-0.972829078328,-0.972806876726,-0.972784666182,-0.972762446696,-0.972740218268,-0.9727179809,-0.97269573459,-0.97267347934,-0.972651215149,-0.972628942018,-0.972606659946,-0.972584368935,-0.972562068983,-0.972539760093,-0.972517442262,-0.972495115493,-0.972472779784,-0.972450435137,-0.972428081552,-0.972405719027,-0.972383347565,-0.972360967165,-0.972338577827,-0.972316179552,-0.972293772339,-0.972271356189,-0.972248931102,-0.972226497079,-0.972204054119,-0.972181602223,-0.97215914139,-0.972136671622,-0.972114192918,-0.972091705279,-0.972069208704,-0.972046703195,-0.97202418875,-0.972001665371,-0.971979133057,-0.97195659181,-0.971934041628,-0.971911482512,-0.971888914463,-0.97186633748,-0.971843751564,-0.971821156716,-0.971798552934,-0.97177594022,-0.971753318574,-0.971730687995,-0.971708048484,-0.971685400042,-0.971662742668,-0.971640076363,-0.971617401127,-0.97159471696,-0.971572023862,-0.971549321833,-0.971526610875,-0.971503890986,-0.971481162168,-0.97145842442,-0.971435677742,-0.971412922135,-0.971390157599,-0.971367384135,-0.971344601741,-0.97132181042,-0.97129901017,-0.971276200992,-0.971253382887,-0.971230555853,-0.971207719893,-0.971184875005,-0.971162021191,-0.97113915845,-0.971116286782,-0.971093406188,-0.971070516668,-0.971047618222,-0.97102471085,-0.971001794553,-0.970978869331,-0.970955935184,-0.970932992111,-0.970910040115,-0.970887079193,-0.970864109348,-0.970841130579,-0.970818142886,-0.970795146269,-0.970772140729,-0.970749126266,-0.97072610288,-0.970703070571,-0.97068002934,-0.970656979186,-0.970633920111,-0.970610852113,-0.970587775194,-0.970564689354,-0.970541594592,-0.970518490909,-0.970495378306,-0.970472256781,-0.970449126337,-0.970425986972,-0.970402838688,-0.970379681483,-0.970356515359,-0.970333340316,-0.970310156354,-0.970286963473,-0.970263761673,-0.970240550955,-0.970217331318,-0.970194102763,-0.970170865291,-0.970147618901,-0.970124363594,-0.970101099369,-0.970077826228,-0.970054544169,-0.970031253195,-0.970007953303,-0.969984644496,-0.969961326773,-0.969938000134,-0.96991466458,-0.969891320111,-0.969867966726,-0.969844604427,-0.969821233213,-0.969797853084,-0.969774464042,-0.969751066085,-0.969727659215,-0.969704243431,-0.969680818734,-0.969657385124,-0.969633942601,-0.969610491166,-0.969587030817,-0.969563561557,-0.969540083385,-0.9695165963,-0.969493100305,-0.969469595397,-0.969446081579,-0.96942255885,-0.96939902721,-0.969375486659,-0.969351937199,-0.969328378828,-0.969304811547,-0.969281235357,-0.969257650257,-0.969234056248,-0.96921045333,-0.969186841503,-0.969163220768,-0.969139591124,-0.969115952572,-0.969092305113,-0.969068648745,-0.96904498347,-0.969021309288,-0.968997626199,-0.968973934203,-0.9689502333,-0.968926523492,-0.968902804776,-0.968879077155,-0.968855340629,-0.968831595196,-0.968807840859,-0.968784077616,-0.968760305469,-0.968736524416,-0.96871273446,-0.968688935599,-0.968665127834,-0.968641311166,-0.968617485594,-0.968593651118,-0.96856980774,-0.968545955458,-0.968522094274,-0.968498224188,-0.968474345199,-0.968450457308,-0.968426560516,-0.968402654822,-0.968378740226,-0.96835481673,-0.968330884332,-0.968306943034,-0.968282992836,-0.968259033737,-0.968235065738,-0.968211088839,-0.968187103041,-0.968163108343,-0.968139104746,-0.968115092251,-0.968091070856,-0.968067040563,-0.968043001372,-0.968018953283,-0.967994896296,-0.967970830411,-0.967946755629,-0.96792267195,-0.967898579374,-0.967874477901,-0.967850367531,-0.967826248266,-0.967802120104,-0.967777983047,-0.967753837093,-0.967729682245,-0.967705518501,-0.967681345863,-0.967657164329,-0.967632973902,-0.967608774579,-0.967584566363,-0.967560349253,-0.96753612325,-0.967511888353,-0.967487644563,-0.96746339188,-0.967439130304,-0.967414859835,-0.967390580475,-0.967366292222,-0.967341995078,-0.967317689042,-0.967293374114,-0.967269050296,-0.967244717586,-0.967220375986,-0.967196025496,-0.967171666115,-0.967147297844,-0.967122920683,-0.967098534633,-0.967074139693,-0.967049735864,-0.967025323146,-0.96700090154,-0.966976471045,-0.966952031662,-0.966927583391,-0.966903126232,-0.966878660185,-0.966854185251,-0.96682970143,-0.966805208722,-0.966780707128,-0.966756196647,-0.966731677279,-0.966707149026,-0.966682611887,-0.966658065863,-0.966633510953,-0.966608947158,-0.966584374478,-0.966559792914,-0.966535202465,-0.966510603132,-0.966485994915,-0.966461377814,-0.96643675183,-0.966412116963,-0.966387473212,-0.966362820579,-0.966338159063,-0.966313488665,-0.966288809384,-0.966264121222,-0.966239424178,-0.966214718252,-0.966190003445,-0.966165279758,-0.966140547189,-0.96611580574,-0.96609105541,-0.966066296201,-0.966041528111,-0.966016751142,-0.965991965294,-0.965967170566,-0.965942366959,-0.965917554474,-0.96589273311,-0.965867902868,-0.965843063748,-0.96581821575,-0.965793358874,-0.965768493121,-0.965743618491,-0.965718734984,-0.9656938426,-0.96566894134,-0.965644031204,-0.965619112191,-0.965594184303,-0.965569247539,-0.9655443019,-0.965519347386,-0.965494383997,-0.965469411734,-0.965444430596,-0.965419440584,-0.965394441698,-0.965369433938,-0.965344417305,-0.965319391798,-0.965294357419,-0.965269314167,-0.965244262042,-0.965219201045,-0.965194131176,-0.965169052435,-0.965143964822,-0.965118868338,-0.965093762983,-0.965068648757,-0.96504352566,-0.965018393692,-0.964993252855,-0.964968103147,-0.96494294457,-0.964917777123,-0.964892600807,-0.964867415622,-0.964842221567,-0.964817018645,-0.964791806853,-0.964766586194,-0.964741356667,-0.964716118272,-0.964690871009,-0.96466561488,-0.964640349883,-0.96461507602,-0.96458979329,-0.964564501694,-0.964539201231,-0.964513891903,-0.964488573709,-0.96446324665,-0.964437910726,-0.964412565937,-0.964387212283,-0.964361849765,-0.964336478382,-0.964311098136,-0.964285709025,-0.964260311052,-0.964234904215,-0.964209488515,-0.964184063952,-0.964158630526,-0.964133188239,-0.964107737089,-0.964082277077,-0.964056808204,-0.964031330469,-0.964005843873,-0.963980348416,-0.963954844098,-0.96392933092,-0.963903808882,-0.963878277984,-0.963852738226,-0.963827189608,-0.963801632131,-0.963776065795,-0.963750490601,-0.963724906547,-0.963699313636,-0.963673711866,-0.963648101238,-0.963622481753,-0.96359685341,-0.96357121621,-0.963545570153,-0.96351991524,-0.96349425147,-0.963468578844,-0.963442897361,-0.963417207023,-0.96339150783,-0.963365799781,-0.963340082877,-0.963314357118,-0.963288622505,-0.963262879038,-0.963237126716,-0.96321136554,-0.963185595511,-0.963159816628,-0.963134028893,-0.963108232304,-0.963082426863,-0.963056612569,-0.963030789423,-0.963004957425,-0.962979116575,-0.962953266874,-0.962927408321,-0.962901540918,-0.962875664663,-0.962849779559,-0.962823885603,-0.962797982798,-0.962772071143,-0.962746150638,-0.962720221284,-0.962694283081,-0.962668336029,-0.962642380129,-0.96261641538,-0.962590441782,-0.962564459337,-0.962538468044,-0.962512467904,-0.962486458917,-0.962460441082,-0.962434414401,-0.962408378873,-0.962382334499,-0.962356281279,-0.962330219214,-0.962304148302,-0.962278068546,-0.962251979944,-0.962225882498,-0.962199776207,-0.962173661072,-0.962147537092,-0.962121404269,-0.962095262602,-0.962069112092,-0.962042952739,-0.962016784542,-0.961990607503,-0.961964421622,-0.961938226899,-0.961912023333,-0.961885810926,-0.961859589677,-0.961833359588,-0.961807120657,-0.961780872885,-0.961754616274,-0.961728350821,-0.961702076529,-0.961675793397,-0.961649501426,-0.961623200615,-0.961596890965,-0.961570572477,-0.96154424515,-0.961517908984,-0.961491563981,-0.961465210139,-0.96143884746,-0.961412475944,-0.961386095591,-0.961359706401,-0.961333308374,-0.961306901511,-0.961280485811,-0.961254061276,-0.961227627905,-0.961201185699,-0.961174734658,-0.961148274781,-0.96112180607,-0.961095328525,-0.961068842146,-0.961042346932,-0.961015842885,-0.960989330004,-0.96096280829,-0.960936277743,-0.960909738364,-0.960883190152,-0.960856633108,-0.960830067231,-0.960803492523,-0.960776908984,-0.960750316613,-0.960723715411,-0.960697105379,-0.960670486516,-0.960643858823,-0.960617222299,-0.960590576946,-0.960563922763,-0.960537259752,-0.96051058791,-0.960483907241,-0.960457217742,-0.960430519416,-0.960403812261,-0.960377096278,-0.960350371468,-0.96032363783,-0.960296895366,-0.960270144074,-0.960243383956,-0.960216615012,-0.960189837241,-0.960163050645,-0.960136255223,-0.960109450976,-0.960082637903,-0.960055816006,-0.960028985284,-0.960002145738,-0.959975297367,-0.959948440173,-0.959921574155,-0.959894699313,-0.959867815649,-0.959840923161,-0.959814021851,-0.959787111719,-0.959760192764,-0.959733264988,-0.959706328389,-0.95967938297,-0.959652428729,-0.959625465667,-0.959598493785,-0.959571513082,-0.959544523559,-0.959517525216,-0.959490518053,-0.959463502071,-0.95943647727,-0.95940944365,-0.959382401211,-0.959355349954,-0.959328289878,-0.959301220985,-0.959274143274,-0.959247056745,-0.9592199614,-0.959192857237,-0.959165744258,-0.959138622462,-0.95911149185,-0.959084352422,-0.959057204178,-0.959030047119,-0.959002881245,-0.958975706556,-0.958948523052,-0.958921330733,-0.958894129601,-0.958866919654,-0.958839700894,-0.95881247332,-0.958785236933,-0.958757991733,-0.958730737721,-0.958703474896,-0.958676203259,-0.95864892281,-0.958621633549,-0.958594335476,-0.958567028593,-0.958539712899,-0.958512388394,-0.958485055078,-0.958457712952,-0.958430362017,-0.958403002271,-0.958375633716,-0.958348256352,-0.95832087018,-0.958293475198,-0.958266071408,-0.95823865881,-0.958211237404,-0.95818380719,-0.958156368169,-0.95812892034,-0.958101463705,-0.958073998263,-0.958046524015,-0.95801904096,-0.9579915491,-0.957964048434,-0.957936538962,-0.957909020686,-0.957881493604,-0.957853957718,-0.957826413028,-0.957798859533,-0.957771297234,-0.957743726132,-0.957716146227,-0.957688557518,-0.957660960006,-0.957633353692,-0.957605738576,-0.957578114657,-0.957550481937,-0.957522840414,-0.957495190091,-0.957467530967,-0.957439863041,-0.957412186315,-0.957384500789,-0.957356806463,-0.957329103336,-0.957301391411,-0.957273670686,-0.957245941162,-0.957218202839,-0.957190455717,-0.957162699798,-0.95713493508,-0.957107161564,-0.957079379251,-0.957051588141,-0.957023788234,-0.95699597953,-0.956968162029,-0.956940335732,-0.956912500639,-0.956884656751,-0.956856804067,-0.956828942588,-0.956801072313,-0.956773193244,-0.956745305381,-0.956717408723,-0.956689503272,-0.956661589027,-0.956633665988,-0.956605734156,-0.956577793531,-0.956549844114,-0.956521885904,-0.956493918902,-0.956465943109,-0.956437958523,-0.956409965146,-0.956381962978,-0.95635395202,-0.95632593227,-0.95629790373,-0.956269866401,-0.956241820281,-0.956213765372,-0.956185701673,-0.956157629186,-0.956129547909,-0.956101457844,-0.956073358991,-0.95604525135,-0.956017134921,-0.955989009705,-0.955960875701,-0.95593273291,-0.955904581333,-0.955876420969,-0.955848251819,-0.955820073883,-0.955791887161,-0.955763691654,-0.955735487361,-0.955707274284,-0.955679052422,-0.955650821776,-0.955622582345,-0.955594334131,-0.955566077133,-0.955537811351,-0.955509536787,-0.95548125344,-0.95545296131,-0.955424660398,-0.955396350703,-0.955368032227,-0.95533970497,-0.955311368931,-0.955283024111,-0.955254670511,-0.955226308129,-0.955197936968,-0.955169557027,-0.955141168306,-0.955112770805,-0.955084364526,-0.955055949467,-0.95502752563,-0.954999093014,-0.95497065162,-0.954942201448,-0.954913742499,-0.954885274772,-0.954856798269,-0.954828312988,-0.954799818931,-0.954771316097,-0.954742804488,-0.954714284102,-0.954685754941,-0.954657217005,-0.954628670294,-0.954600114808,-0.954571550548,-0.954542977513,-0.954514395704,-0.954485805122,-0.954457205767,-0.954428597638,-0.954399980736,-0.954371355061,-0.954342720615,-0.954314077396,-0.954285425405,-0.954256764643,-0.954228095109,-0.954199416804,-0.954170729729,-0.954142033883,-0.954113329267,-0.95408461588,-0.954055893724,-0.954027162799,-0.953998423104,-0.95396967464,-0.953940917408,-0.953912151407,-0.953883376638,-0.953854593101,-0.953825800797,-0.953796999725,-0.953768189886,-0.95373937128,-0.953710543908,-0.953681707769,-0.953652862865,-0.953624009194,-0.953595146758,-0.953566275557,-0.953537395591,-0.95350850686,-0.953479609365,-0.953450703105,-0.953421788082,-0.953392864295,-0.953363931744,-0.953334990431,-0.953306040354,-0.953277081515,-0.953248113914,-0.95321913755,-0.953190152425,-0.953161158539,-0.953132155891,-0.953103144482,-0.953074124312,-0.953045095382,-0.953016057692,-0.952987011242,-0.952957956032,-0.952928892063,-0.952899819334,-0.952870737847,-0.952841647601,-0.952812548597,-0.952783440835,-0.952754324315,-0.952725199038,-0.952696065003,-0.952666922211,-0.952637770663,-0.952608610358,-0.952579441297,-0.95255026348,-0.952521076908,-0.95249188158,-0.952462677497,-0.952433464659,-0.952404243066,-0.95237501272,-0.952345773619,-0.952316525765,-0.952287269157,-0.952258003795,-0.952228729681,-0.952199446814,-0.952170155195,-0.952140854824,-0.952111545701,-0.952082227826,-0.9520529012,-0.952023565822,-0.951994221694,-0.951964868816,-0.951935507187,-0.951906136808,-0.951876757679,-0.951847369801,-0.951817973174,-0.951788567798,-0.951759153673,-0.9517297308,-0.951700299179,-0.95167085881,-0.951641409694,-0.95161195183,-0.951582485219,-0.951553009861,-0.951523525757,-0.951494032907,-0.951464531311,-0.951435020969,-0.951405501882,-0.951375974049,-0.951346437472,-0.95131689215,-0.951287338084,-0.951257775274,-0.95122820372,-0.951198623423,-0.951169034383,-0.951139436599,-0.951109830073,-0.951080214804,-0.951050590794,-0.951020958041,-0.950991316547,-0.950961666312,-0.950932007335,-0.950902339618,-0.95087266316,-0.950842977962,-0.950813284024,-0.950783581347,-0.95075386993,-0.950724149774,-0.950694420879,-0.950664683245,-0.950634936874,-0.950605181764,-0.950575417916,-0.950545645331,-0.950515864009,-0.950486073949,-0.950456275154,-0.950426467621,-0.950396651353,-0.950366826349,-0.950336992609,-0.950307150134,-0.950277298924,-0.950247438979,-0.950217570299,-0.950187692886,-0.950157806738,-0.950127911857,-0.950098008243,-0.950068095895,-0.950038174815,-0.950008245002,-0.949978306457,-0.949948359179,-0.94991840317,-0.94988843843,-0.949858464959,-0.949828482756,-0.949798491823,-0.94976849216,-0.949738483766,-0.949708466643,-0.94967844079,-0.949648406208,-0.949618362897,-0.949588310857,-0.949558250089,-0.949528180593,-0.949498102369,-0.949468015417,-0.949437919738,-0.949407815332,-0.9493777022,-0.94934758034,-0.949317449755,-0.949287310444,-0.949257162406,-0.949227005644,-0.949196840157,-0.949166665944,-0.949136483008,-0.949106291347,-0.949076090961,-0.949045881853,-0.949015664021,-0.948985437465,-0.948955202187,-0.948924958186,-0.948894705463,-0.948864444018,-0.948834173851,-0.948803894963,-0.948773607353,-0.948743311023,-0.948713005971,-0.9486826922,-0.948652369708,-0.948622038497,-0.948591698566,-0.948561349916,-0.948530992547,-0.948500626459,-0.948470251652,-0.948439868128,-0.948409475886,-0.948379074926,-0.948348665249,-0.948318246855,-0.948287819744,-0.948257383916,-0.948226939373,-0.948196486113,-0.948166024138,-0.948135553448,-0.948105074043,-0.948074585922,-0.948044089088,-0.948013583539,-0.947983069276,-0.947952546299,-0.947922014609,-0.947891474206,-0.94786092509,-0.947830367262,-0.947799800721,-0.947769225469,-0.947738641505,-0.947708048829,-0.947677447442,-0.947646837344,-0.947616218536,-0.947585591018,-0.947554954789,-0.947524309851,-0.947493656203,-0.947462993846,-0.947432322781,-0.947401643006,-0.947370954524,-0.947340257333,-0.947309551435,-0.947278836829,-0.947248113516,-0.947217381496,-0.947186640769,-0.947155891336,-0.947125133198,-0.947094366353,-0.947063590803,-0.947032806547,-0.947002013587,-0.946971211922,-0.946940401552,-0.946909582479,-0.946878754702,-0.946847918221,-0.946817073037,-0.94678621915,-0.946755356561,-0.946724485269,-0.946693605275,-0.946662716579,-0.946631819182,-0.946600913083,-0.946569998284,-0.946539074784,-0.946508142583,-0.946477201682,-0.946446252082,-0.946415293782,-0.946384326783,-0.946353351084,-0.946322366688,-0.946291373592,-0.946260371799,-0.946229361308,-0.946198342119,-0.946167314233,-0.94613627765,-0.94610523237,-0.946074178394,-0.946043115722,-0.946012044354,-0.945980964291,-0.945949875532,-0.945918778078,-0.94588767193,-0.945856557087,-0.94582543355,-0.945794301319,-0.945763160395,-0.945732010777,-0.945700852467,-0.945669685464,-0.945638509768,-0.945607325381,-0.945576132301,-0.94554493053,-0.945513720068,-0.945482500914,-0.945451273071,-0.945420036536,-0.945388791312,-0.945357537398,-0.945326274794,-0.945295003501,-0.945263723519,-0.945232434848,-0.945201137489,-0.945169831442,-0.945138516708,-0.945107193285,-0.945075861176,-0.945044520379,-0.945013170896,-0.944981812727,-0.944950445871,-0.94491907033,-0.944887686103,-0.944856293191,-0.944824891594,-0.944793481312,-0.944762062346,-0.944730634696,-0.944699198362,-0.944667753345,-0.944636299645,-0.944604837261,-0.944573366196,-0.944541886447,-0.944510398017,-0.944478900905,-0.944447395112,-0.944415880637,-0.944384357482,-0.944352825646,-0.944321285129,-0.944289735933,-0.944258178057,-0.944226611501,-0.944195036267,-0.944163452353,-0.944131859761,-0.944100258491,-0.944068648543,-0.944037029917,-0.944005402614,-0.943973766634,-0.943942121976,-0.943910468643,-0.943878806633,-0.943847135947,-0.943815456586,-0.943783768549,-0.943752071837,-0.94372036645,-0.943688652389,-0.943656929654,-0.943625198245,-0.943593458162,-0.943561709406,-0.943529951977,-0.943498185875,-0.943466411101,-0.943434627654,-0.943402835536,-0.943371034746,-0.943339225285,-0.943307407153,-0.94327558035,-0.943243744877,-0.943211900734,-0.943180047921,-0.943148186438,-0.943116316287,-0.943084437466,-0.943052549977,-0.943020653819,-0.942988748994,-0.9429568355,-0.942924913339,-0.942892982511,-0.942861043016,-0.942829094855,-0.942797138027,-0.942765172533,-0.942733198374,-0.942701215549,-0.942669224059,-0.942637223904,-0.942605215085,-0.942573197601,-0.942541171454,-0.942509136643,-0.942477093168,-0.942445041031,-0.942412980231,-0.942380910768,-0.942348832643,-0.942316745857,-0.942284650408,-0.942252546299,-0.942220433528,-0.942188312097,-0.942156182005,-0.942124043254,-0.942091895842,-0.942059739771,-0.942027575041,-0.941995401652,-0.941963219604,-0.941931028898,-0.941898829534,-0.941866621512,-0.941834404832,-0.941802179496,-0.941769945503,-0.941737702853,-0.941705451547,-0.941673191585,-0.941640922967,-0.941608645694,-0.941576359766,-0.941544065183,-0.941511761946,-0.941479450054,-0.941447129509,-0.94141480031,-0.941382462457,-0.941350115952,-0.941317760794,-0.941285396984,-0.941253024521,-0.941220643407,-0.941188253642,-0.941155855225,-0.941123448157,-0.941091032438,-0.94105860807,-0.941026175051,-0.940993733382,-0.940961283065,-0.940928824098,-0.940896356482,-0.940863880217,-0.940831395305,-0.940798901744,-0.940766399536,-0.940733888681,-0.940701369179,-0.940668841029,-0.940636304234,-0.940603758792,-0.940571204705,-0.940538641972,-0.940506070593,-0.94047349057,-0.940440901902,-0.94040830459,-0.940375698634,-0.940343084034,-0.94031046079,-0.940277828904,-0.940245188375,-0.940212539203,-0.940179881389,-0.940147214933,-0.940114539835,-0.940081856096,-0.940049163716,-0.940016462695,-0.939983753034,-0.939951034733,-0.939918307792,-0.939885572211,-0.939852827991,-0.939820075132,-0.939787313635,-0.939754543499,-0.939721764725,-0.939688977314,-0.939656181265,-0.939623376579,-0.939590563256,-0.939557741296,-0.939524910701,-0.939492071469,-0.939459223602,-0.9394263671,-0.939393501962,-0.93936062819,-0.939327745784,-0.939294854743,-0.939261955069,-0.939229046761,-0.93919612982,-0.939163204246,-0.939130270039,-0.9390973272,-0.939064375729,-0.939031415627,-0.938998446893,-0.938965469528,-0.938932483532,-0.938899488906,-0.938866485649,-0.938833473763,-0.938800453247,-0.938767424102,-0.938734386328,-0.938701339926,-0.938668284895,-0.938635221236,-0.938602148949,-0.938569068035,-0.938535978494,-0.938502880325,-0.938469773531,-0.93843665811,-0.938403534063,-0.938370401391,-0.938337260093,-0.93830411017,-0.938270951623,-0.938237784451,-0.938204608655,-0.938171424236,-0.938138231193,-0.938105029527,-0.938071819238,-0.938038600326,-0.938005372792,-0.937972136636,-0.937938891859,-0.93790563846,-0.93787237644,-0.937839105799,-0.937805826538,-0.937772538657,-0.937739242156,-0.937705937036,-0.937672623297,-0.937639300938,-0.937605969961,-0.937572630366,-0.937539282152,-0.937505925321,-0.937472559873,-0.937439185808,-0.937405803126,-0.937372411827,-0.937339011913,-0.937305603382,-0.937272186236,-0.937238760475,-0.937205326099,-0.937171883108,-0.937138431503,-0.937104971284,-0.937071502452,-0.937038025006,-0.937004538947,-0.936971044275,-0.936937540991,-0.936904029095,-0.936870508586,-0.936836979467,-0.936803441736,-0.936769895394,-0.936736340442,-0.936702776879,-0.936669204707,-0.936635623924,-0.936602034533,-0.936568436532,-0.936534829923,-0.936501214705,-0.936467590879,-0.936433958445,-0.936400317404,-0.936366667756,-0.9363330095,-0.936299342638,-0.93626566717,-0.936231983096,-0.936198290416,-0.936164589131,-0.936130879241,-0.936097160746,-0.936063433647,-0.936029697944,-0.935995953637,-0.935962200726,-0.935928439213,-0.935894669096,-0.935860890377,-0.935827103055,-0.935793307132,-0.935759502607,-0.935725689481,-0.935691867754,-0.935658037426,-0.935624198498,-0.93559035097,-0.935556494841,-0.935522630114,-0.935488756787,-0.935454874862,-0.935420984338,-0.935387085216,-0.935353177496,-0.935319261179,-0.935285336264,-0.935251402752,-0.935217460644,-0.935183509939,-0.935149550638,-0.935115582742,-0.93508160625,-0.935047621163,-0.935013627482,-0.934979625206,-0.934945614336,-0.934911594872,-0.934877566814,-0.934843530163,-0.93480948492,-0.934775431084,-0.934741368655,-0.934707297635,-0.934673218023,-0.93463912982,-0.934605033025,-0.93457092764,-0.934536813665,-0.9345026911,-0.934468559945,-0.9344344202,-0.934400271866,-0.934366114944,-0.934331949433,-0.934297775334,-0.934263592646,-0.934229401372,-0.93419520151,-0.934160993061,-0.934126776026,-0.934092550404,-0.934058316197,-0.934024073403,-0.933989822025,-0.933955562061,-0.933921293513,-0.93388701638,-0.933852730663,-0.933818436362,-0.933784133478,-0.933749822011,-0.933715501961,-0.933681173328,-0.933646836113,-0.933612490317,-0.933578135938,-0.933543772979,-0.933509401438,-0.933475021317,-0.933440632616,-0.933406235335,-0.933371829474,-0.933337415033,-0.933302992014,-0.933268560416,-0.933234120239,-0.933199671485,-0.933165214152,-0.933130748242,-0.933096273755,-0.933061790692,-0.933027299051,-0.932992798835,-0.932958290042,-0.932923772674,-0.932889246731,-0.932854712213,-0.932820169121,-0.932785617454,-0.932751057213,-0.932716488398,-0.93268191101,-0.932647325049,-0.932612730516,-0.93257812741,-0.932543515732,-0.932508895482,-0.932474266661,-0.932439629268,-0.932404983305,-0.932370328772,-0.932335665668,-0.932300993995,-0.932266313752,-0.932231624939,-0.932196927558,-0.932162221609,-0.932127507091,-0.932092784005,-0.932058052351,-0.932023312131,-0.931988563343,-0.931953805989,-0.931919040068,-0.931884265582,-0.931849482529,-0.931814690912,-0.931779890729,-0.931745081982,-0.93171026467,-0.931675438794,-0.931640604354,-0.931605761351,-0.931570909785,-0.931536049656,-0.931501180965,-0.931466303711,-0.931431417895,-0.931396523518,-0.93136162058,-0.931326709081,-0.931291789022,-0.931256860402,-0.931221923222,-0.931186977483,-0.931152023184,-0.931117060326,-0.93108208891,-0.931047108936,-0.931012120403,-0.930977123313,-0.930942117665,-0.930907103461,-0.9308720807,-0.930837049382,-0.930802009508,-0.930766961079,-0.930731904094,-0.930696838554,-0.93066176446,-0.930626681811,-0.930591590607,-0.93055649085,-0.93052138254,-0.930486265676,-0.93045114026,-0.930416006291,-0.93038086377,-0.930345712696,-0.930310553072,-0.930275384896,-0.930240208169,-0.930205022892,-0.930169829065,-0.930134626687,-0.93009941576,-0.930064196284,-0.930028968259,-0.929993731685,-0.929958486563,-0.929923232893,-0.929887970675,-0.92985269991,-0.929817420598,-0.929782132739,-0.929746836334,-0.929711531382,-0.929676217885,-0.929640895843,-0.929605565256,-0.929570226124,-0.929534878447,-0.929499522227,-0.929464157462,-0.929428784155,-0.929393402304,-0.92935801191,-0.929322612974,-0.929287205496,-0.929251789475,-0.929216364914,-0.929180931811,-0.929145490168,-0.929110039984,-0.929074581259,-0.929039113995,-0.929003638192,-0.928968153849,-0.928932660967,-0.928897159547,-0.928861649588,-0.928826131092,-0.928790604058,-0.928755068487,-0.928719524379,-0.928683971734,-0.928648410553,-0.928612840836,-0.928577262584,-0.928541675796,-0.928506080473,-0.928470476616,-0.928434864224,-0.928399243299,-0.928363613839,-0.928327975847,-0.928292329321,-0.928256674263,-0.928221010672,-0.92818533855,-0.928149657895,-0.92811396871,-0.928078270993,-0.928042564746,-0.928006849968,-0.92797112666,-0.927935394823,-0.927899654456,-0.92786390556,-0.927828148135,-0.927792382182,-0.927756607701,-0.927720824692,-0.927685033156,-0.927649233093,-0.927613424502,-0.927577607386,-0.927541781743,-0.927505947575,-0.927470104881,-0.927434253662,-0.927398393919,-0.92736252565,-0.927326648858,-0.927290763542,-0.927254869703,-0.92721896734,-0.927183056455,-0.927147137047,-0.927111209117,-0.927075272665,-0.927039327691,-0.927003374197,-0.926967412182,-0.926931441646,-0.92689546259,-0.926859475014,-0.926823478919,-0.926787474305,-0.926751461171,-0.92671543952,-0.92667940935,-0.926643370662,-0.926607323457,-0.926571267734,-0.926535203495,-0.926499130739,-0.926463049467,-0.926426959679,-0.926390861376,-0.926354754558,-0.926318639224,-0.926282515376,-0.926246383014,-0.926210242138,-0.926174092749,-0.926137934846,-0.926101768431,-0.926065593503,-0.926029410062,-0.92599321811,-0.925957017647,-0.925920808672,-0.925884591186,-0.92584836519,-0.925812130683,-0.925775887667,-0.925739636141,-0.925703376106,-0.925667107562,-0.92563083051,-0.925594544949,-0.925558250881,-0.925521948305,-0.925485637221,-0.925449317631,-0.925412989535,-0.925376652932,-0.925340307823,-0.925303954209,-0.92526759209,-0.925231221465,-0.925194842336,-0.925158454703,-0.925122058567,-0.925085653926,-0.925049240783,-0.925012819136,-0.924976388987,-0.924939950336,-0.924903503183,-0.924867047529,-0.924830583373,-0.924794110717,-0.92475762956,-0.924721139902,-0.924684641745,-0.924648135089,-0.924611619933,-0.924575096279,-0.924538564125,-0.924502023474,-0.924465474325,-0.924428916679,-0.924392350535,-0.924355775895,-0.924319192758,-0.924282601125,-0.924246000996,-0.924209392371,-0.924172775252,-0.924136149637,-0.924099515529,-0.924062872926,-0.924026221829,-0.923989562239,-0.923952894156,-0.92391621758,-0.923879532511,-0.923842838951,-0.923806136898,-0.923769426355,-0.92373270732,-0.923695979794,-0.923659243778,-0.923622499272,-0.923585746276,-0.923548984791,-0.923512214817,-0.923475436354,-0.923438649402,-0.923401853963,-0.923365050036,-0.923328237621,-0.92329141672,-0.923254587331,-0.923217749457,-0.923180903096,-0.92314404825,-0.923107184918,-0.923070313101,-0.9230334328,-0.922996544014,-0.922959646745,-0.922922740991,-0.922885826755,-0.922848904035,-0.922811972833,-0.922775033148,-0.922738084982,-0.922701128334,-0.922664163205,-0.922627189594,-0.922590207503,-0.922553216932,-0.922516217881,-0.922479210351,-0.922442194341,-0.922405169852,-0.922368136885,-0.922331095439,-0.922294045516,-0.922256987115,-0.922219920237,-0.922182844882,-0.922145761051,-0.922108668743,-0.92207156796,-0.922034458701,-0.921997340967,-0.921960214758,-0.921923080075,-0.921885936918,-0.921848785286,-0.921811625182,-0.921774456604,-0.921737279554,-0.921700094031,-0.921662900036,-0.921625697569,-0.921588486631,-0.921551267222,-0.921514039342,-0.921476802992,-0.921439558172,-0.921402304882,-0.921365043123,-0.921327772894,-0.921290494198,-0.921253207033,-0.921215911399,-0.921178607299,-0.921141294731,-0.921103973696,-0.921066644194,-0.921029306227,-0.920991959793,-0.920954604894,-0.920917241529,-0.9208798697,-0.920842489406,-0.920805100648,-0.920767703426,-0.920730297741,-0.920692883592,-0.920655460981,-0.920618029907,-0.920580590371,-0.920543142373,-0.920505685914,-0.920468220994,-0.920430747613,-0.920393265772,-0.92035577547,-0.920318276709,-0.920280769489,-0.920243253809,-0.920205729671,-0.920168197074,-0.92013065602,-0.920093106508,-0.920055548538,-0.920017982112,-0.919980407229,-0.919942823889,-0.919905232094,-0.919867631843,-0.919830023137,-0.919792405976,-0.919754780361,-0.919717146291,-0.919679503768,-0.919641852791,-0.919604193361,-0.919566525478,-0.919528849142,-0.919491164355,-0.919453471116,-0.919415769425,-0.919378059283,-0.919340340691,-0.919302613648,-0.919264878155,-0.919227134212,-0.919189381821,-0.91915162098,-0.91911385169,-0.919076073952,-0.919038287766,-0.919000493133,-0.918962690052,-0.918924878525,-0.918887058551,-0.91884923013,-0.918811393264,-0.918773547952,-0.918735694196,-0.918697831994,-0.918659961348,-0.918622082257,-0.918584194723,-0.918546298746,-0.918508394325,-0.918470481462,-0.918432560156,-0.918394630408,-0.918356692219,-0.918318745588,-0.918280790517,-0.918242827004,-0.918204855051,-0.918166874659,-0.918128885827,-0.918090888555,-0.918052882845,-0.918014868696,-0.917976846109,-0.917938815084,-0.917900775621,-0.917862727722,-0.917824671385,-0.917786606613,-0.917748533404,-0.917710451759,-0.917672361679,-0.917634263164,-0.917596156214,-0.91755804083,-0.917519917012,-0.91748178476,-0.917443644075,-0.917405494957,-0.917367337406,-0.917329171423,-0.917290997008,-0.917252814162,-0.917214622885,-0.917176423176,-0.917138215037,-0.917099998468,-0.91706177347,-0.917023540041,-0.916985298184,-0.916947047898,-0.916908789184,-0.916870522041,-0.916832246471,-0.916793962474,-0.916755670049,-0.916717369198,-0.916679059921,-0.916640742218,-0.916602416089,-0.916564081535,-0.916525738556,-0.916487387153,-0.916449027325,-0.916410659074,-0.916372282399,-0.916333897301,-0.916295503781,-0.916257101838,-0.916218691473,-0.916180272686,-0.916141845478,-0.916103409849,-0.916064965799,-0.916026513329,-0.91598805244,-0.91594958313,-0.915911105402,-0.915872619254,-0.915834124688,-0.915795621704,-0.915757110302,-0.915718590483,-0.915680062246,-0.915641525593,-0.915602980523,-0.915564427038,-0.915525865136,-0.91548729482,-0.915448716088,-0.915410128942,-0.915371533382,-0.915332929407,-0.915294317019,-0.915255696218,-0.915217067005,-0.915178429378,-0.91513978334,-0.915101128889,-0.915062466028,-0.915023794755,-0.914985115072,-0.914946426978,-0.914907730474,-0.914869025561,-0.914830312238,-0.914791590506,-0.914752860366,-0.914714121818,-0.914675374862,-0.914636619498,-0.914597855727,-0.914559083549,-0.914520302965,-0.914481513975,-0.914442716579,-0.914403910778,-0.914365096571,-0.914326273961,-0.914287442945,-0.914248603526,-0.914209755704,-0.914170899478,-0.914132034849,-0.914093161817,-0.914054280384,-0.914015390549,-0.913976492312,-0.913937585674,-0.913898670636,-0.913859747197,-0.913820815358,-0.91378187512,-0.913742926482,-0.913703969445,-0.91366500401,-0.913626030177,-0.913587047945,-0.913548057316,-0.91350905829,-0.913470050868,-0.913431035049,-0.913392010833,-0.913352978222,-0.913313937216,-0.913274887815,-0.913235830019,-0.913196763829,-0.913157689245,-0.913118606267,-0.913079514896,-0.913040415133,-0.913001306977,-0.912962190428,-0.912923065488,-0.912883932157,-0.912844790435,-0.912805640322,-0.912766481818,-0.912727314925,-0.912688139642,-0.91264895597,-0.912609763909,-0.912570563459,-0.912531354622,-0.912492137396,-0.912452911783,-0.912413677783,-0.912374435396,-0.912335184623,-0.912295925464,-0.91225665792,-0.91221738199,-0.912178097675,-0.912138804975,-0.912099503892,-0.912060194424,-0.912020876574,-0.91198155034,-0.911942215723,-0.911902872724,-0.911863521343,-0.91182416158,-0.911784793436,-0.911745416911,-0.911706032005,-0.91166663872,-0.911627237054,-0.911587827009,-0.911548408585,-0.911508981782,-0.911469546601,-0.911430103041,-0.911390651104,-0.91135119079,-0.911311722098,-0.911272245031,-0.911232759586,-0.911193265767,-0.911153763571,-0.911114253001,-0.911074734055,-0.911035206735,-0.910995671042,-0.910956126974,-0.910916574533,-0.91087701372,-0.910837444533,-0.910797866975,-0.910758281044,-0.910718686743,-0.91067908407,-0.910639473026,-0.910599853612,-0.910560225827,-0.910520589673,-0.91048094515,-0.910441292258,-0.910401630997,-0.910361961368,-0.910322283372,-0.910282597007,-0.910242902276,-0.910203199178,-0.910163487713,-0.910123767883,-0.910084039686,-0.910044303125,-0.910004558198,-0.909964804907,-0.909925043252,-0.909885273233,-0.90984549485,-0.909805708105,-0.909765912996,-0.909726109525,-0.909686297693,-0.909646477498,-0.909606648943,-0.909566812026,-0.909526966749,-0.909487113112,-0.909447251114,-0.909407380758,-0.909367502042,-0.909327614968,-0.909287719535,-0.909247815744,-0.909207903596,-0.909167983091,-0.909128054228,-0.909088117009,-0.909048171434,-0.909008217503,-0.908968255217,-0.908928284576,-0.90888830558,-0.908848318229,-0.908808322525,-0.908768318467,-0.908728306056,-0.908688285293,-0.908648256176,-0.908608218708,-0.908568172888,-0.908528118716,-0.908488056194,-0.908447985321,-0.908407906097,-0.908367818524,-0.908327722601,-0.908287618329,-0.908247505709,-0.908207384739,-0.908167255422,-0.908127117757,-0.908086971745,-0.908046817386,-0.90800665468,-0.907966483629,-0.907926304231,-0.907886116488,-0.907845920399,-0.907805715966,-0.907765503189,-0.907725282068,-0.907685052603,-0.907644814795,-0.907604568643,-0.90756431415,-0.907524051314,-0.907483780137,-0.907443500618,-0.907403212758,-0.907362916557,-0.907322612016,-0.907282299136,-0.907241977915,-0.907201648356,-0.907161310458,-0.907120964221,-0.907080609646,-0.907040246734,-0.906999875484,-0.906959495897,-0.906919107974,-0.906878711714,-0.906838307119,-0.906797894188,-0.906757472922,-0.906717043321,-0.906676605386,-0.906636159117,-0.906595704515,-0.906555241579,-0.90651477031,-0.906474290709,-0.906433802776,-0.906393306511,-0.906352801915,-0.906312288987,-0.906271767729,-0.906231238141,-0.906190700223,-0.906150153975,-0.906109599398,-0.906069036493,-0.906028465259,-0.905987885697,-0.905947297807,-0.90590670159,-0.905866097047,-0.905825484176,-0.90578486298,-0.905744233458,-0.90570359561,-0.905662949437,-0.90562229494,-0.905581632118,-0.905540960973,-0.905500281504,-0.905459593711,-0.905418897596,-0.905378193159,-0.905337480399,-0.905296759318,-0.905256029916,-0.905215292192,-0.905174546148,-0.905133791784,-0.9050930291,-0.905052258097,-0.905011478775,-0.904970691134,-0.904929895174,-0.904889090897,-0.904848278302,-0.90480745739,-0.904766628162,-0.904725790616,-0.904684944755,-0.904644090578,-0.904603228086,-0.904562357279,-0.904521478157,-0.904480590721,-0.904439694972,-0.904398790909,-0.904357878533,-0.904316957844,-0.904276028843,-0.90423509153,-0.904194145906,-0.90415319197,-0.904112229724,-0.904071259167,-0.9040302803,-0.903989293123,-0.903948297638,-0.903907293843,-0.90386628174,-0.903825261328,-0.903784232609,-0.903743195583,-0.903702150249,-0.903661096609,-0.903620034663,-0.903578964411,-0.903537885853,-0.90349679899,-0.903455703822,-0.90341460035,-0.903373488574,-0.903332368495,-0.903291240112,-0.903250103426,-0.903208958438,-0.903167805147,-0.903126643555,-0.903085473662,-0.903044295468,-0.903003108973,-0.902961914177,-0.902920711082,-0.902879499688,-0.902838279995,-0.902797052002,-0.902755815712,-0.902714571123,-0.902673318237,-0.902632057054,-0.902590787574,-0.902549509798,-0.902508223725,-0.902466929357,-0.902425626694,-0.902384315735,-0.902342996482,-0.902301668935,-0.902260333095,-0.902218988961,-0.902177636533,-0.902136275814,-0.902094906802,-0.902053529498,-0.902012143902,-0.901970750016,-0.901929347839,-0.901887937371,-0.901846518614,-0.901805091567,-0.901763656231,-0.901722212606,-0.901680760692,-0.90163930049,-0.901597832001,-0.901556355225,-0.901514870161,-0.901473376811,-0.901431875175,-0.901390365253,-0.901348847046,-0.901307320554,-0.901265785777,-0.901224242716,-0.901182691371,-0.901141131742,-0.901099563831,-0.901057987636,-0.90101640316,-0.900974810401,-0.900933209361,-0.90089160004,-0.900849982438,-0.900808356555,-0.900766722392,-0.90072507995,-0.900683429229,-0.900641770228,-0.900600102949,-0.900558427392,-0.900516743558,-0.900475051445,-0.900433351056,-0.900391642391,-0.900349925449,-0.900308200231,-0.900266466738,-0.90022472497,-0.900182974927,-0.90014121661,-0.900099450019,-0.900057675154,-0.900015892016,-0.899974100606,-0.899932300923,-0.899890492968,-0.899848676742,-0.899806852244,-0.899765019475,-0.899723178436,-0.899681329127,-0.899639471549,-0.899597605701,-0.899555731584,-0.899513849198,-0.899471958545,-0.899430059624,-0.899388152435,-0.899346236979,-0.899304313257,-0.899262381269,-0.899220441014,-0.899178492495,-0.89913653571,-0.89909457066,-0.899052597347,-0.899010615769,-0.898968625928,-0.898926627824,-0.898884621457,-0.898842606827,-0.898800583936,-0.898758552783,-0.898716513369,-0.898674465694,-0.898632409759,-0.898590345563,-0.898548273108,-0.898506192394,-0.898464103421,-0.898422006189,-0.898379900699,-0.898337786952,-0.898295664947,-0.898253534685,-0.898211396167,-0.898169249393,-0.898127094362,-0.898084931077,-0.898042759536,-0.898000579741,-0.897958391691,-0.897916195388,-0.897873990831,-0.897831778021,-0.897789556959,-0.897747327644,-0.897705090077,-0.897662844259,-0.89762059019,-0.89757832787,-0.897536057299,-0.897493778479,-0.897451491409,-0.89740919609,-0.897366892522,-0.897324580705,-0.897282260641,-0.897239932329,-0.89719759577,-0.897155250964,-0.897112897911,-0.897070536613,-0.897028167068,-0.896985789279,-0.896943403244,-0.896901008965,-0.896858606442,-0.896816195676,-0.896773776665,-0.896731349412,-0.896688913917,-0.896646470179,-0.896604018199,-0.896561557978,-0.896519089516,-0.896476612813,-0.89643412787,-0.896391634688,-0.896349133266,-0.896306623604,-0.896264105705,-0.896221579567,-0.896179045191,-0.896136502577,-0.896093951727,-0.896051392639,-0.896008825316,-0.895966249756,-0.895923665961,-0.895881073931,-0.895838473666,-0.895795865167,-0.895753248434,-0.895710623467,-0.895667990267,-0.895625348834,-0.895582699169,-0.895540041272,-0.895497375143,-0.895454700783,-0.895412018192,-0.895369327371,-0.89532662832,-0.895283921039,-0.895241205528,-0.895198481789,-0.895155749822,-0.895113009626,-0.895070261203,-0.895027504552,-0.894984739675,-0.894941966571,-0.89489918524,-0.894856395685,-0.894813597903,-0.894770791897,-0.894727977667,-0.894685155212,-0.894642324533,-0.894599485631,-0.894556638506,-0.894513783159,-0.894470919589,-0.894428047798,-0.894385167785,-0.894342279551,-0.894299383097,-0.894256478422,-0.894213565528,-0.894170644414,-0.894127715081,-0.89408477753,-0.89404183176,-0.893998877772,-0.893955915567,-0.893912945145,-0.893869966506,-0.893826979651,-0.893783984581,-0.893740981294,-0.893697969793,-0.893654950077,-0.893611922146,-0.893568886002,-0.893525841644,-0.893482789074,-0.89343972829,-0.893396659294,-0.893353582086,-0.893310496667,-0.893267403037,-0.893224301196,-0.893181191144,-0.893138072883,-0.893094946412,-0.893051811732,-0.893008668843,-0.892965517746,-0.892922358441,-0.892879190928,-0.892836015208,-0.892792831282,-0.892749639149,-0.89270643881,-0.892663230265,-0.892620013516,-0.892576788562,-0.892533555403,-0.89249031404,-0.892447064474,-0.892403806704,-0.892360540732,-0.892317266557,-0.892273984181,-0.892230693602,-0.892187394823,-0.892144087843,-0.892100772662,-0.892057449282,-0.892014117701,-0.891970777922,-0.891927429944,-0.891884073767,-0.891840709392,-0.89179733682,-0.891753956051,-0.891710567084,-0.891667169922,-0.891623764563,-0.891580351009,-0.891536929259,-0.891493499315,-0.891450061176,-0.891406614843,-0.891363160317,-0.891319697597,-0.891276226685,-0.89123274758,-0.891189260283,-0.891145764795,-0.891102261115,-0.891058749244,-0.891015229183,-0.890971700932,-0.890928164492,-0.890884619862,-0.890841067043,-0.890797506036,-0.890753936841,-0.890710359459,-0.890666773889,-0.890623180132,-0.890579578189,-0.89053596806,-0.890492349745,-0.890448723245,-0.89040508856,-0.890361445691,-0.890317794637,-0.890274135401,-0.890230467981,-0.890186792378,-0.890143108592,-0.890099416625,-0.890055716476,-0.890012008146,-0.889968291635,-0.889924566944,-0.889880834073,-0.889837093022,-0.889793343792,-0.889749586383,-0.889705820796,-0.889662047031,-0.889618265088,-0.889574474968,-0.889530676671,-0.889486870198,-0.889443055549,-0.889399232724,-0.889355401724,-0.88931156255,-0.889267715201,-0.889223859678,-0.889179995981,-0.889136124112,-0.889092244069,-0.889048355855,-0.889004459468,-0.88896055491,-0.88891664218,-0.88887272128,-0.88882879221,-0.88878485497,-0.88874090956,-0.888696955981,-0.888652994233,-0.888609024317,-0.888565046233,-0.888521059982,-0.888477065564,-0.888433062978,-0.888389052227,-0.88834503331,-0.888301006227,-0.888256970979,-0.888212927566,-0.88816887599,-0.888124816249,-0.888080748345,-0.888036672278,-0.887992588048,-0.887948495656,-0.887904395102,-0.887860286387,-0.88781616951,-0.887772044473,-0.887727911276,-0.887683769919,-0.887639620403,-0.887595462728,-0.887551296894,-0.887507122901,-0.887462940752,-0.887418750444,-0.88737455198,-0.887330345359,-0.887286130582,-0.88724190765,-0.887197676562,-0.887153437319,-0.887109189921,-0.88706493437,-0.887020670664,-0.886976398806,-0.886932118794,-0.88688783063,-0.886843534314,-0.886799229847,-0.886754917228,-0.886710596458,-0.886666267537,-0.886621930467,-0.886577585247,-0.886533231878,-0.88648887036,-0.886444500693,-0.886400122879,-0.886355736917,-0.886311342807,-0.886266940551,-0.886222530149,-0.8861781116,-0.886133684907,-0.886089250067,-0.886044807084,-0.886000355955,-0.885955896683,-0.885911429268,-0.885866953709,-0.885822470007,-0.885777978164,-0.885733478178,-0.885688970051,-0.885644453783,-0.885599929374,-0.885555396825,-0.885510856136,-0.885466307308,-0.885421750341,-0.885377185235,-0.885332611991,-0.885288030609,-0.885243441089,-0.885198843433,-0.88515423764,-0.885109623711,-0.885065001647,-0.885020371447,-0.884975733112,-0.884931086642,-0.884886432039,-0.884841769301,-0.884797098431,-0.884752419428,-0.884707732292,-0.884663037024,-0.884618333624,-0.884573622094,-0.884528902432,-0.88448417464,-0.884439438718,-0.884394694667,-0.884349942486,-0.884305182177,-0.884260413739,-0.884215637173,-0.88417085248,-0.88412605966,-0.884081258713,-0.884036449639,-0.88399163244,-0.883946807116,-0.883901973666,-0.883857132091,-0.883812282393,-0.883767424571,-0.883722558625,-0.883677684556,-0.883632802365,-0.883587912051,-0.883543013616,-0.883498107059,-0.883453192382,-0.883408269584,-0.883363338666,-0.883318399628,-0.883273452471,-0.883228497195,-0.883183533801,-0.883138562288,-0.883093582658,-0.883048594911,-0.883003599047,-0.882958595066,-0.88291358297,-0.882868562758,-0.882823534431,-0.882778497989,-0.882733453433,-0.882688400763,-0.88264333998,-0.882598271083,-0.882553194074,-0.882508108952,-0.882463015719,-0.882417914374,-0.882372804919,-0.882327687352,-0.882282561676,-0.88223742789,-0.882192285994,-0.88214713599,-0.882101977877,-0.882056811656,-0.882011637327,-0.881966454891,-0.881921264348,-0.881876065699,-0.881830858944,-0.881785644083,-0.881740421117,-0.881695190046,-0.881649950871,-0.881604703592,-0.881559448209,-0.881514184723,-0.881468913135,-0.881423633444,-0.881378345652,-0.881333049758,-0.881287745763,-0.881242433667,-0.881197113471,-0.881151785176,-0.881106448781,-0.881061104287,-0.881015751694,-0.880970391004,-0.880925022216,-0.88087964533,-0.880834260348,-0.880788867269,-0.880743466094,-0.880698056824,-0.880652639458,-0.880607213998,-0.880561780443,-0.880516338794,-0.880470889052,-0.880425431217,-0.880379965289,-0.880334491269,-0.880289009157,-0.880243518953,-0.880198020659,-0.880152514274,-0.880106999798,-0.880061477233,-0.880015946579,-0.879970407836,-0.879924861004,-0.879879306084,-0.879833743076,-0.879788171982,-0.8797425928,-0.879697005532,-0.879651410178,-0.879605806739,-0.879560195214,-0.879514575604,-0.879468947911,-0.879423312133,-0.879377668272,-0.879332016328,-0.879286356301,-0.879240688192,-0.879195012001,-0.879149327729,-0.879103635376,-0.879057934942,-0.879012226429,-0.878966509835,-0.878920785162,-0.878875052411,-0.878829311581,-0.878783562673,-0.878737805687,-0.878692040625,-0.878646267485,-0.878600486269,-0.878554696977,-0.87850889961,-0.878463094168,-0.878417280651,-0.87837145906,-0.878325629395,-0.878279791657,-0.878233945845,-0.878188091961,-0.878142230005,-0.878096359978,-0.878050481879,-0.878004595709,-0.877958701469,-0.877912799159,-0.877866888779,-0.87782097033,-0.877775043812,-0.877729109226,-0.877683166572,-0.877637215851,-0.877591257062,-0.877545290207,-0.877499315286,-0.877453332299,-0.877407341246,-0.877361342129,-0.877315334947,-0.877269319701,-0.877223296392,-0.877177265019,-0.877131225583,-0.877085178085,-0.877039122525,-0.876993058903,-0.87694698722,-0.876900907477,-0.876854819673,-0.876808723809,-0.876762619886,-0.876716507904,-0.876670387863,-0.876624259764,-0.876578123608,-0.876531979394,-0.876485827123,-0.876439666796,-0.876393498412,-0.876347321973,-0.876301137479,-0.87625494493,-0.876208744327,-0.87616253567,-0.876116318959,-0.876070094195,-0.876023861379,-0.87597762051,-0.87593137159,-0.875885114618,-0.875838849595,-0.875792576522,-0.875746295399,-0.875700006226,-0.875653709003,-0.875607403732,-0.875561090413,-0.875514769045,-0.87546843963,-0.875422102168,-0.875375756659,-0.875329403104,-0.875283041503,-0.875236671857,-0.875190294165,-0.87514390843,-0.87509751465,-0.875051112826,-0.875004702959,-0.874958285049,-0.874911859097,-0.874865425102,-0.874818983066,-0.874772532989,-0.874726074872,-0.874679608713,-0.874633134516,-0.874586652278,-0.874540162002,-0.874493663687,-0.874447157334,-0.874400642943,-0.874354120515,-0.87430759005,-0.874261051548,-0.874214505011,-0.874167950438,-0.874121387829,-0.874074817186,-0.874028238509,-0.873981651798,-0.873935057053,-0.873888454276,-0.873841843465,-0.873795224623,-0.873748597749,-0.873701962843,-0.873655319907,-0.87360866894,-0.873562009943,-0.873515342917,-0.873468667861,-0.873421984777,-0.873375293664,-0.873328594524,-0.873281887356,-0.873235172161,-0.873188448939,-0.873141717692,-0.873094978418,-0.87304823112,-0.873001475796,-0.872954712448,-0.872907941076,-0.87286116168,-0.872814374261,-0.87276757882,-0.872720775356,-0.87267396387,-0.872627144363,-0.872580316835,-0.872533481286,-0.872486637717,-0.872439786129,-0.872392926521,-0.872346058894,-0.872299183249,-0.872252299586,-0.872205407906,-0.872158508208,-0.872111600493,-0.872064684763,-0.872017761016,-0.871970829254,-0.871923889477,-0.871876941686,-0.87182998588,-0.871783022061,-0.871736050229,-0.871689070383,-0.871642082526,-0.871595086656,-0.871548082775,-0.871501070883,-0.87145405098,-0.871407023067,-0.871359987144,-0.871312943212,-0.87126589127,-0.871218831321,-0.871171763363,-0.871124687398,-0.871077603425,-0.871030511446,-0.87098341146,-0.870936303469,-0.870889187472,-0.87084206347,-0.870794931464,-0.870747791453,-0.870700643438,-0.870653487421,-0.8706063234,-0.870559151377,-0.870511971352,-0.870464783325,-0.870417587298,-0.870370383269,-0.870323171241,-0.870275951212,-0.870228723184,-0.870181487157,-0.870134243132,-0.870086991109,-0.870039731088,-0.869992463069,-0.869945187054,-0.869897903043,-0.869850611035,-0.869803311033,-0.869756003035,-0.869708687042,-0.869661363056,-0.869614031075,-0.869566691101,-0.869519343135,-0.869471987176,-0.869424623225,-0.869377251282,-0.869329871349,-0.869282483424,-0.86923508751,-0.869187683605,-0.869140271711,-0.869092851828,-0.869045423957,-0.868997988098,-0.868950544251,-0.868903092416,-0.868855632595,-0.868808164788,-0.868760688995,-0.868713205216,-0.868665713452,-0.868618213704,-0.868570705971,-0.868523190255,-0.868475666556,-0.868428134873,-0.868380595209,-0.868333047562,-0.868285491934,-0.868237928324,-0.868190356734,-0.868142777164,-0.868095189614,-0.868047594085,-0.867999990577,-0.86795237909,-0.867904759625,-0.867857132183,-0.867809496763,-0.867761853367,-0.867714201995,-0.867666542646,-0.867618875323,-0.867571200024,-0.867523516751,-0.867475825503,-0.867428126282,-0.867380419088,-0.867332703921,-0.867284980782,-0.867237249671,-0.867189510588,-0.867141763534,-0.86709400851,-0.867046245516,-0.866998474552,-0.866950695618,-0.866902908716,-0.866855113845,-0.866807311007,-0.866759500201,-0.866711681428,-0.866663854688,-0.866616019982,-0.866568177311,-0.866520326674,-0.866472468072,-0.866424601505,-0.866376726975,-0.866328844481,-0.866280954025,-0.866233055605,-0.866185149223,-0.86613723488,-0.866089312575,-0.866041382309,-0.865993444082,-0.865945497896,-0.86589754375,-0.865849581645,-0.865801611581,-0.865753633559,-0.865705647579,-0.865657653642,-0.865609651748,-0.865561641897,-0.865513624091,-0.865465598328,-0.865417564611,-0.865369522938,-0.865321473312,-0.865273415731,-0.865225350198,-0.865177276711,-0.865129195272,-0.86508110588,-0.865033008537,-0.864984903243,-0.864936789998,-0.864888668803,-0.864840539658,-0.864792402563,-0.864744257519,-0.864696104527,-0.864647943587,-0.864599774699,-0.864551597864,-0.864503413082,-0.864455220354,-0.86440701968,-0.864358811061,-0.864310594496,-0.864262369987,-0.864214137534,-0.864165897137,-0.864117648797,-0.864069392514,-0.864021128289,-0.863972856122,-0.863924576013,-0.863876287963,-0.863827991973,-0.863779688043,-0.863731376173,-0.863683056364,-0.863634728616,-0.86358639293,-0.863538049305,-0.863489697744,-0.863441338245,-0.86339297081,-0.863344595439,-0.863296212131,-0.863247820889,-0.863199421712,-0.863151014601,-0.863102599555,-0.863054176577,-0.863005745665,-0.862957306821,-0.862908860044,-0.862860405336,-0.862811942697,-0.862763472126,-0.862714993626,-0.862666507196,-0.862618012836,-0.862569510547,-0.86252100033,-0.862472482184,-0.862423956111,-0.862375422111,-0.862326880184,-0.86227833033,-0.862229772551,-0.862181206846,-0.862132633216,-0.862084051662,-0.862035462184,-0.861986864782,-0.861938259456,-0.861889646209,-0.861841025038,-0.861792395946,-0.861743758933,-0.861695113998,-0.861646461143,-0.861597800368,-0.861549131673,-0.861500455059,-0.861451770527,-0.861403078076,-0.861354377707,-0.861305669421,-0.861256953218,-0.861208229099,-0.861159497063,-0.861110757112,-0.861062009245,-0.861013253464,-0.860964489769,-0.86091571816,-0.860866938638,-0.860818151202,-0.860769355855,-0.860720552595,-0.860671741424,-0.860622922341,-0.860574095348,-0.860525260445,-0.860476417632,-0.860427566909,-0.860378708278,-0.860329841738,-0.860280967291,-0.860232084935,-0.860183194673,-0.860134296504,-0.860085390429,-0.860036476449,-0.859987554563,-0.859938624772,-0.859889687077,-0.859840741477,-0.859791787975,-0.859742826569,-0.859693857261,-0.859644880051,-0.859595894939,-0.859546901926,-0.859497901012,-0.859448892197,-0.859399875483,-0.85935085087,-0.859301818357,-0.859252777946,-0.859203729637,-0.85915467343,-0.859105609326,-0.859056537325,-0.859007457429,-0.858958369636,-0.858909273948,-0.858860170365,-0.858811058887,-0.858761939516,-0.858712812251,-0.858663677093,-0.858614534042,-0.858565383099,-0.858516224264,-0.858467057538,-0.858417882922,-0.858368700414,-0.858319510017,-0.858270311731,-0.858221105555,-0.858171891491,-0.858122669538,-0.858073439698,-0.858024201971,-0.857974956357,-0.857925702856,-0.85787644147,-0.857827172198,-0.857777895041,-0.85772861,-0.857679317075,-0.857630016266,-0.857580707574,-0.857531390999,-0.857482066543,-0.857432734204,-0.857383393984,-0.857334045883,-0.857284689901,-0.85723532604,-0.857185954299,-0.857136574679,-0.857087187181,-0.857037791804,-0.85698838855,-0.856938977418,-0.856889558409,-0.856840131525,-0.856790696764,-0.856741254128,-0.856691803616,-0.856642345231,-0.856592878971,-0.856543404838,-0.856493922831,-0.856444432952,-0.8563949352,-0.856345429577,-0.856295916083,-0.856246394717,-0.856196865481,-0.856147328375,-0.8560977834,-0.856048230555,-0.855998669842,-0.855949101261,-0.855899524812,-0.855849940496,-0.855800348313,-0.855750748263,-0.855701140348,-0.855651524567,-0.855601900922,-0.855552269412,-0.855502630037,-0.8554529828,-0.855403327699,-0.855353664735,-0.855303993909,-0.855254315222,-0.855204628673,-0.855154934263,-0.855105231993,-0.855055521863,-0.855005803873,-0.854956078025,-0.854906344317,-0.854856602752,-0.854806853329,-0.854757096049,-0.854707330912,-0.854657557919,-0.85460777707,-0.854557988365,-0.854508191806,-0.854458387392,-0.854408575125,-0.854358755003,-0.854308927029,-0.854259091202,-0.854209247523,-0.854159395992,-0.85410953661,-0.854059669377,-0.854009794293,-0.85395991136,-0.853910020578,-0.853860121946,-0.853810215466,-0.853760301138,-0.853710378962,-0.85366044894,-0.85361051107,-0.853560565355,-0.853510611793,-0.853460650387,-0.853410681135,-0.853360704039,-0.8533107191,-0.853260726316,-0.85321072569,-0.853160717221,-0.853110700911,-0.853060676758,-0.853010644765,-0.85296060493,-0.852910557256,-0.852860501742,-0.852810438388,-0.852760367196,-0.852710288165,-0.852660201296,-0.85261010659,-0.852560004047,-0.852509893667,-0.852459775451,-0.8524096494,-0.852359515513,-0.852309373792,-0.852259224236,-0.852209066847,-0.852158901624,-0.852108728568,-0.85205854768,-0.85200835896,-0.851958162409,-0.851907958027,-0.851857745814,-0.851807525771,-0.851757297898,-0.851707062196,-0.851656818666,-0.851606567307,-0.85155630812,-0.851506041106,-0.851455766266,-0.851405483598,-0.851355193105,-0.851304894787,-0.851254588643,-0.851204274675,-0.851153952883,-0.851103623267,-0.851053285828,-0.851002940566,-0.850952587482,-0.850902226576,-0.850851857849,-0.850801481302,-0.850751096933,-0.850700704745,-0.850650304737,-0.850599896911,-0.850549481266,-0.850499057802,-0.850448626522,-0.850398187424,-0.850347740509,-0.850297285778,-0.850246823231,-0.850196352869,-0.850145874693,-0.850095388702,-0.850044894897,-0.849994393278,-0.849943883847,-0.849893366603,-0.849842841547,-0.849792308679,-0.849741768001,-0.849691219512,-0.849640663212,-0.849590099103,-0.849539527185,-0.849488947457,-0.849438359922,-0.849387764579,-0.849337161428,-0.84928655047,-0.849235931706,-0.849185305136,-0.84913467076,-0.84908402858,-0.849033378594,-0.848982720805,-0.848932055212,-0.848881381815,-0.848830700616,-0.848780011615,-0.848729314812,-0.848678610207,-0.848627897802,-0.848577177596,-0.848526449591,-0.848475713785,-0.848424970181,-0.848374218779,-0.848323459578,-0.848272692579,-0.848221917784,-0.848171135192,-0.848120344803,-0.848069546619,-0.84801874064,-0.847967926866,-0.847917105297,-0.847866275935,-0.847815438779,-0.84776459383,-0.847713741089,-0.847662880555,-0.847612012231,-0.847561136115,-0.847510252208,-0.847459360512,-0.847408461025,-0.84735755375,-0.847306638686,-0.847255715833,-0.847204785193,-0.847153846766,-0.847102900551,-0.84705194655,-0.847000984764,-0.846950015192,-0.846899037834,-0.846848052693,-0.846797059767,-0.846746059058,-0.846695050565,-0.84664403429,-0.846593010233,-0.846541978394,-0.846490938774,-0.846439891373,-0.846388836192,-0.846337773231,-0.846286702491,-0.846235623971,-0.846184537674,-0.846133443598,-0.846082341745,-0.846031232115,-0.845980114708,-0.845928989525,-0.845877856567,-0.845826715834,-0.845775567326,-0.845724411043,-0.845673246987,-0.845622075158,-0.845570895556,-0.845519708182,-0.845468513036,-0.845417310118,-0.84536609943,-0.845314880971,-0.845263654742,-0.845212420744,-0.845161178976,-0.845109929441,-0.845058672137,-0.845007407065,-0.844956134226,-0.844904853621,-0.84485356525,-0.844802269113,-0.84475096521,-0.844699653543,-0.844648334111,-0.844597006916,-0.844545671957,-0.844494329236,-0.844442978752,-0.844391620506,-0.844340254499,-0.84428888073,-0.844237499201,-0.844186109912,-0.844134712864,-0.844083308056,-0.84403189549,-0.843980475166,-0.843929047084,-0.843877611244,-0.843826167648,-0.843774716296,-0.843723257188,-0.843671790324,-0.843620315706,-0.843568833333,-0.843517343207,-0.843465845327,-0.843414339694,-0.843362826308,-0.843311305171,-0.843259776282,-0.843208239642,-0.843156695251,-0.84310514311,-0.84305358322,-0.84300201558,-0.842950440192,-0.842898857056,-0.842847266172,-0.84279566754,-0.842744061162,-0.842692447037,-0.842640825167,-0.842589195551,-0.84253755819,-0.842485913085,-0.842434260236,-0.842382599643,-0.842330931308,-0.842279255229,-0.842227571409,-0.842175879848,-0.842124180545,-0.842072473501,-0.842020758718,-0.841969036194,-0.841917305932,-0.841865567931,-0.841813822191,-0.841762068714,-0.841710307499,-0.841658538548,-0.84160676186,-0.841554977437,-0.841503185278,-0.841451385384,-0.841399577756,-0.841347762394,-0.841295939298,-0.841244108469,-0.841192269908,-0.841140423614,-0.841088569589,-0.841036707833,-0.840984838347,-0.84093296113,-0.840881076183,-0.840829183508,-0.840777283103,-0.84072537497,-0.84067345911,-0.840621535522,-0.840569604208,-0.840517665167,-0.8404657184,-0.840413763908,-0.840361801691,-0.84030983175,-0.840257854084,-0.840205868695,-0.840153875583,-0.840101874749,-0.840049866193,-0.839997849915,-0.839945825916,-0.839893794196,-0.839841754756,-0.839789707597,-0.839737652718,-0.839685590121,-0.839633519805,-0.839581441772,-0.839529356022,-0.839477262555,-0.839425161371,-0.839373052472,-0.839320935857,-0.839268811527,-0.839216679484,-0.839164539726,-0.839112392254,-0.83906023707,-0.839008074174,-0.838955903565,-0.838903725245,-0.838851539214,-0.838799345472,-0.83874714402,-0.838694934859,-0.838642717989,-0.838590493409,-0.838538261122,-0.838486021127,-0.838433773425,-0.838381518017,-0.838329254902,-0.838276984081,-0.838224705555,-0.838172419324,-0.838120125389,-0.83806782375,-0.838015514408,-0.837963197363,-0.837910872615,-0.837858540166,-0.837806200015,-0.837753852163,-0.837701496611,-0.837649133359,-0.837596762407,-0.837544383757,-0.837491997408,-0.83743960336,-0.837387201616,-0.837334792174,-0.837282375035,-0.837229950201,-0.837177517671,-0.837125077445,-0.837072629525,-0.837020173911,-0.836967710603,-0.836915239602,-0.836862760908,-0.836810274522,-0.836757780444,-0.836705278674,-0.836652769214,-0.836600252064,-0.836547727224,-0.836495194694,-0.836442654475,-0.836390106568,-0.836337550974,-0.836284987691,-0.836232416722,-0.836179838066,-0.836127251725,-0.836074657698,-0.836022055985,-0.835969446589,-0.835916829508,-0.835864204743,-0.835811572296,-0.835758932166,-0.835706284354,-0.83565362886,-0.835600965685,-0.835548294829,-0.835495616294,-0.835442930078,-0.835390236183,-0.83533753461,-0.835284825358,-0.835232108429,-0.835179383822,-0.835126651539,-0.835073911579,-0.835021163943,-0.834968408632,-0.834915645647,-0.834862874986,-0.834810096652,-0.834757310645,-0.834704516965,-0.834651715612,-0.834598906587,-0.834546089891,-0.834493265524,-0.834440433486,-0.834387593778,-0.834334746401,-0.834281891355,-0.83422902864,-0.834176158258,-0.834123280207,-0.83407039449,-0.834017501106,-0.833964600056,-0.83391169134,-0.833858774959,-0.833805850914,-0.833752919204,-0.833699979831,-0.833647032794,-0.833594078095,-0.833541115733,-0.83348814571,-0.833435168026,-0.833382182681,-0.833329189675,-0.83327618901,-0.833223180685,-0.833170164702,-0.83311714106,-0.833064109761,-0.833011070804,-0.83295802419,-0.83290496992,-0.832851907994,-0.832798838413,-0.832745761176,-0.832692676286,-0.832639583741,-0.832586483543,-0.832533375692,-0.832480260188,-0.832427137033,-0.832374006226,-0.832320867768,-0.832267721659,-0.832214567901,-0.832161406493,-0.832108237436,-0.83205506073,-0.832001876376,-0.831948684375,-0.831895484727,-0.831842277432,-0.83178906249,-0.831735839904,-0.831682609672,-0.831629371795,-0.831576126274,-0.83152287311,-0.831469612303,-0.831416343852,-0.83136306776,-0.831309784026,-0.83125649265,-0.831203193634,-0.831149886978,-0.831096572682,-0.831043250746,-0.830989921172,-0.83093658396,-0.83088323911,-0.830829886622,-0.830776526498,-0.830723158737,-0.830669783341,-0.830616400309,-0.830563009642,-0.830509611341,-0.830456205406,-0.830402791838,-0.830349370637,-0.830295941803,-0.830242505338,-0.830189061241,-0.830135609513,-0.830082150155,-0.830028683167,-0.829975208549,-0.829921726303,-0.829868236428,-0.829814738925,-0.829761233795,-0.829707721037,-0.829654200653,-0.829600672643,-0.829547137008,-0.829493593747,-0.829440042862,-0.829386484353,-0.829332918221,-0.829279344465,-0.829225763087,-0.829172174087,-0.829118577465,-0.829064973222,-0.829011361359,-0.828957741875,-0.828904114772,-0.82885048005,-0.828796837709,-0.82874318775,-0.828689530173,-0.828635864979,-0.828582192169,-0.828528511742,-0.8284748237,-0.828421128043,-0.828367424771,-0.828313713884,-0.828259995384,-0.828206269271,-0.828152535545,-0.828098794207,-0.828045045258,-0.827991288697,-0.827937524525,-0.827883752743,-0.827829973352,-0.827776186351,-0.827722391741,-0.827668589524,-0.827614779698,-0.827560962265,-0.827507137226,-0.82745330458,-0.827399464328,-0.827345616471,-0.827291761009,-0.827237897943,-0.827184027274,-0.827130149001,-0.827076263125,-0.827022369647,-0.826968468567,-0.826914559885,-0.826860643603,-0.826806719721,-0.826752788238,-0.826698849157,-0.826644902476,-0.826590948197,-0.826536986321,-0.826483016847,-0.826429039776,-0.826375055109,-0.826321062846,-0.826267062987,-0.826213055534,-0.826159040486,-0.826105017845,-0.82605098761,-0.825996949782,-0.825942904362,-0.82588885135,-0.825834790746,-0.825780722552,-0.825726646767,-0.825672563392,-0.825618472428,-0.825564373875,-0.825510267734,-0.825456154004,-0.825402032688,-0.825347903784,-0.825293767294,-0.825239623218,-0.825185471556,-0.82513131231,-0.825077145479,-0.825022971065,-0.824968789066,-0.824914599485,-0.824860402322,-0.824806197576,-0.824751985249,-0.824697765342,-0.824643537853,-0.824589302785,-0.824535060137,-0.824480809911,-0.824426552106,-0.824372286723,-0.824318013762,-0.824263733225,-0.824209445111,-0.824155149421,-0.824100846156,-0.824046535315,-0.8239922169,-0.823937890912,-0.82388355735,-0.823829216215,-0.823774867507,-0.823720511227,-0.823666147376,-0.823611775954,-0.823557396962,-0.8235030104,-0.823448616268,-0.823394214567,-0.823339805298,-0.82328538846,-0.823230964056,-0.823176532084,-0.823122092546,-0.823067645442,-0.823013190772,-0.822958728538,-0.822904258739,-0.822849781376,-0.822795296449,-0.82274080396,-0.822686303908,-0.822631796295,-0.822577281119,-0.822522758383,-0.822468228087,-0.82241369023,-0.822359144814,-0.822304591839,-0.822250031306,-0.822195463214,-0.822140887565,-0.82208630436,-0.822031713597,-0.821977115279,-0.821922509406,-0.821867895977,-0.821813274994,-0.821758646457,-0.821704010367,-0.821649366724,-0.821594715528,-0.821540056781,-0.821485390482,-0.821430716632,-0.821376035231,-0.821321346281,-0.821266649781,-0.821211945733,-0.821157234136,-0.821102514991,-0.821047788299,-0.82099305406,-0.820938312274,-0.820883562943,-0.820828806066,-0.820774041644,-0.820719269678,-0.820664490168,-0.820609703115,-0.820554908519,-0.82050010638,-0.8204452967,-0.820390479478,-0.820335654715,-0.820280822412,-0.820225982569,-0.820171135187,-0.820116280266,-0.820061417807,-0.82000654781,-0.819951670275,-0.819896785204,-0.819841892596,-0.819786992453,-0.819732084774,-0.819677169561,-0.819622246813,-0.819567316531,-0.819512378716,-0.819457433369,-0.819402480489,-0.819347520077,-0.819292552134,-0.81923757666,-0.819182593656,-0.819127603122,-0.819072605059,-0.819017599467,-0.818962586347,-0.8189075657,-0.818852537525,-0.818797501823,-0.818742458595,-0.818687407842,-0.818632349563,-0.818577283759,-0.818522210432,-0.81846712958,-0.818412041206,-0.818356945309,-0.818301841889,-0.818246730948,-0.818191612486,-0.818136486503,-0.818081353,-0.818026211978,-0.817971063436,-0.817915907376,-0.817860743797,-0.817805572701,-0.817750394088,-0.817695207959,-0.817640014313,-0.817584813152,-0.817529604475,-0.817474388284,-0.817419164579,-0.817363933361,-0.817308694629,-0.817253448385,-0.817198194629,-0.817142933361,-0.817087664583,-0.817032388294,-0.816977104494,-0.816921813186,-0.816866514368,-0.816811208042,-0.816755894208,-0.816700572867,-0.816645244018,-0.816589907664,-0.816534563803,-0.816479212437,-0.816423853566,-0.81636848719,-0.816313113311,-0.816257731928,-0.816202343043,-0.816146946655,-0.816091542765,-0.816036131374,-0.815980712482,-0.81592528609,-0.815869852198,-0.815814410807,-0.815758961917,-0.815703505528,-0.815648041642,-0.815592570259,-0.815537091378,-0.815481605002,-0.81542611113,-0.815370609762,-0.8153151009,-0.815259584544,-0.815204060694,-0.815148529351,-0.815092990515,-0.815037444187,-0.814981890367,-0.814926329057,-0.814870760255,-0.814815183964,-0.814759600182,-0.814704008912,-0.814648410153,-0.814592803906,-0.814537190172,-0.81448156895,-0.814425940242,-0.814370304048,-0.814314660369,-0.814259009204,-0.814203350555,-0.814147684422,-0.814092010805,-0.814036329706,-0.813980641124,-0.81392494506,-0.813869241515,-0.813813530489,-0.813757811982,-0.813702085995,-0.81364635253,-0.813590611585,-0.813534863162,-0.813479107261,-0.813423343883,-0.813367573027,-0.813311794696,-0.813256008889,-0.813200215606,-0.813144414849,-0.813088606618,-0.813032790913,-0.812976967734,-0.812921137083,-0.81286529896,-0.812809453365,-0.812753600299,-0.812697739762,-0.812641871755,-0.812585996278,-0.812530113333,-0.812474222918,-0.812418325036,-0.812362419686,-0.812306506869,-0.812250586585,-0.812194658836,-0.81213872362,-0.81208278094,-0.812026830796,-0.811970873187,-0.811914908115,-0.81185893558,-0.811802955583,-0.811746968123,-0.811690973202,-0.811634970821,-0.811578960979,-0.811522943677,-0.811466918916,-0.811410886695,-0.811354847017,-0.811298799881,-0.811242745287,-0.811186683237,-0.811130613731,-0.811074536768,-0.811018452351,-0.810962360479,-0.810906261152,-0.810850154372,-0.810794040139,-0.810737918453,-0.810681789315,-0.810625652726,-0.810569508685,-0.810513357194,-0.810457198253,-0.810401031862,-0.810344858022,-0.810288676733,-0.810232487997,-0.810176291813,-0.810120088182,-0.810063877105,-0.810007658582,-0.809951432613,-0.809895199199,-0.809838958341,-0.80978271004,-0.809726454294,-0.809670191106,-0.809613920476,-0.809557642404,-0.809501356891,-0.809445063937,-0.809388763542,-0.809332455708,-0.809276140435,-0.809219817723,-0.809163487572,-0.809107149985,-0.80905080496,-0.808994452498,-0.8089380926,-0.808881725267,-0.808825350499,-0.808768968296,-0.808712578659,-0.808656181588,-0.808599777085,-0.808543365149,-0.808486945781,-0.808430518982,-0.808374084751,-0.808317643091,-0.808261194,-0.80820473748,-0.808148273531,-0.808091802154,-0.80803532335,-0.807978837117,-0.807922343458,-0.807865842373,-0.807809333862,-0.807752817926,-0.807696294565,-0.80763976378,-0.807583225572,-0.80752667994,-0.807470126886,-0.807413566409,-0.807356998511,-0.807300423192,-0.807243840452,-0.807187250293,-0.807130652714,-0.807074047716,-0.807017435299,-0.806960815464,-0.806904188213,-0.806847553544,-0.806790911459,-0.806734261958,-0.806677605041,-0.80662094071,-0.806564268965,-0.806507589806,-0.806450903233,-0.806394209248,-0.806337507851,-0.806280799042,-0.806224082821,-0.806167359191,-0.80611062815,-0.806053889699,-0.805997143839,-0.805940390571,-0.805883629895,-0.805826861811,-0.805770086321,-0.805713303423,-0.80565651312,-0.805599715412,-0.805542910298,-0.80548609778,-0.805429277859,-0.805372450534,-0.805315615806,-0.805258773676,-0.805201924144,-0.805145067211,-0.805088202877,-0.805031331143,-0.804974452009,-0.804917565476,-0.804860671545,-0.804803770215,-0.804746861488,-0.804689945364,-0.804633021843,-0.804576090926,-0.804519152614,-0.804462206907,-0.804405253805,-0.804348293309,-0.80429132542,-0.804234350139,-0.804177367464,-0.804120377398,-0.804063379941,-0.804006375093,-0.803949362854,-0.803892343226,-0.803835316209,-0.803778281803,-0.803721240009,-0.803664190827,-0.803607134258,-0.803550070303,-0.803492998961,-0.803435920234,-0.803378834122,-0.803321740625,-0.803264639745,-0.803207531481,-0.803150415834,-0.803093292804,-0.803036162393,-0.802979024601,-0.802921879428,-0.802864726874,-0.802807566941,-0.802750399628,-0.802693224937,-0.802636042867,-0.80257885342,-0.802521656596,-0.802464452395,-0.802407240818,-0.802350021866,-0.802292795538,-0.802235561836,-0.80217832076,-0.802121072311,-0.802063816488,-0.802006553293,-0.801949282727,-0.801892004789,-0.80183471948,-0.801777426801,-0.801720126752,-0.801662819334,-0.801605504547,-0.801548182392,-0.801490852869,-0.80143351598,-0.801376171723,-0.801318820101,-0.801261461113,-0.80120409476,-0.801146721042,-0.80108933996,-0.801031951515,-0.800974555708,-0.800917152537,-0.800859742005,-0.800802324112,-0.800744898857,-0.800687466243,-0.800630026269,-0.800572578935,-0.800515124243,-0.800457662193,-0.800400192785,-0.80034271602,-0.800285231898,-0.80022774042,-0.800170241587,-0.800112735399,-0.800055221856,-0.799997700959,-0.799940172709,-0.799882637106,-0.799825094151,-0.799767543844,-0.799709986186,-0.799652421176,-0.799594848817,-0.799537269108,-0.79947968205,-0.799422087643,-0.799364485888,-0.799306876785,-0.799249260335,-0.799191636539,-0.799134005397,-0.799076366909,-0.799018721077,-0.7989610679,-0.798903407379,-0.798845739515,-0.798788064308,-0.798730381758,-0.798672691867,-0.798614994635,-0.798557290062,-0.798499578149,-0.798441858896,-0.798384132304,-0.798326398373,-0.798268657105,-0.798210908499,-0.798153152556,-0.798095389276,-0.798037618661,-0.79797984071,-0.797922055424,-0.797864262804,-0.79780646285,-0.797748655563,-0.797690840943,-0.797633018991,-0.797575189708,-0.797517353093,-0.797459509147,-0.797401657872,-0.797343799267,-0.797285933333,-0.79722806007,-0.79717017948,-0.797112291562,-0.797054396317,-0.796996493746,-0.796938583849,-0.796880666627,-0.79682274208,-0.796764810208,-0.796706871013,-0.796648924495,-0.796590970655,-0.796533009492,-0.796475041008,-0.796417065202,-0.796359082076,-0.79630109163,-0.796243093865,-0.796185088781,-0.796127076378,-0.796069056658,-0.79601102962,-0.795952995266,-0.795894953595,-0.795836904609,-0.795778848307,-0.795720784691,-0.795662713761,-0.795604635517,-0.79554654996,-0.795488457091,-0.79543035691,-0.795372249417,-0.795314134613,-0.7952560125,-0.795197883076,-0.795139746343,-0.795081602301,-0.795023450951,-0.794965292293,-0.794907126328,-0.794848953057,-0.794790772479,-0.794732584596,-0.794674389408,-0.794616186915,-0.794557977119,-0.794499760019,-0.794441535616,-0.794383303911,-0.794325064904,-0.794266818596,-0.794208564987,-0.794150304078,-0.794092035869,-0.794033760361,-0.793975477554,-0.79391718745,-0.793858890048,-0.793800585349,-0.793742273353,-0.793683954062,-0.793625627475,-0.793567293593,-0.793508952417,-0.793450603948,-0.793392248185,-0.793333885129,-0.793275514781,-0.793217137142,-0.793158752211,-0.79310035999,-0.793041960479,-0.792983553679,-0.79292513959,-0.792866718212,-0.792808289546,-0.792749853593,-0.792691410353,-0.792632959827,-0.792574502015,-0.792516036918,-0.792457564537,-0.792399084871,-0.792340597922,-0.79228210369,-0.792223602175,-0.792165093378,-0.7921065773,-0.792048053941,-0.791989523302,-0.791930985383,-0.791872440184,-0.791813887707,-0.791755327952,-0.791696760919,-0.791638186609,-0.791579605023,-0.79152101616,-0.791462420022,-0.791403816609,-0.791345205921,-0.79128658796,-0.791227962725,-0.791169330218,-0.791110690438,-0.791052043386,-0.790993389064,-0.790934727471,-0.790876058607,-0.790817382474,-0.790758699072,-0.790700008402,-0.790641310463,-0.790582605257,-0.790523892785,-0.790465173046,-0.790406446041,-0.790347711771,-0.790288970236,-0.790230221437,-0.790171465375,-0.790112702049,-0.790053931461,-0.789995153611,-0.789936368499,-0.789877576127,-0.789818776494,-0.789759969601,-0.789701155449,-0.789642334038,-0.789583505369,-0.789524669442,-0.789465826258,-0.789406975818,-0.789348118121,-0.789289253169,-0.789230380962,-0.7891715015,-0.789112614785,-0.789053720816,-0.788994819595,-0.788935911121,-0.788876995395,-0.788818072418,-0.788759142191,-0.788700204714,-0.788641259986,-0.78858230801,-0.788523348786,-0.788464382313,-0.788405408593,-0.788346427627,-0.788287439414,-0.788228443955,-0.788169441251,-0.788110431302,-0.788051414109,-0.787992389673,-0.787933357993,-0.787874319071,-0.787815272907,-0.787756219501,-0.787697158855,-0.787638090968,-0.787579015842,-0.787519933476,-0.787460843872,-0.787401747029,-0.787342642949,-0.787283531631,-0.787224413078,-0.787165287288,-0.787106154262,-0.787047014002,-0.786987866507,-0.786928711779,-0.786869549817,-0.786810380623,-0.786751204196,-0.786692020538,-0.786632829648,-0.786573631529,-0.786514426179,-0.786455213599,-0.786395993791,-0.786336766754,-0.786277532489,-0.786218290997,-0.786159042279,-0.786099786334,-0.786040523163,-0.785981252768,-0.785921975148,-0.785862690303,-0.785803398236,-0.785744098945,-0.785684792432,-0.785625478697,-0.785566157741,-0.785506829564,-0.785447494167,-0.78538815155,-0.785328801714,-0.78526944466,-0.785210080387,-0.785150708897,-0.78509133019,-0.785031944267,-0.784972551128,-0.784913150773,-0.784853743204,-0.78479432842,-0.784734906423,-0.784675477213,-0.78461604079,-0.784556597156,-0.784497146309,-0.784437688252,-0.784378222984,-0.784318750507,-0.78425927082,-0.784199783925,-0.784140289821,-0.78408078851,-0.784021279991,-0.783961764266,-0.783902241336,-0.783842711199,-0.783783173858,-0.783723629312,-0.783664077562,-0.78360451861,-0.783544952454,-0.783485379096,-0.783425798537,-0.783366210777,-0.783306615816,-0.783247013655,-0.783187404294,-0.783127787735,-0.783068163977,-0.783008533022,-0.782948894869,-0.78288924952,-0.782829596975,-0.782769937233,-0.782710270297,-0.782650596167,-0.782590914842,-0.782531226324,-0.782471530613,-0.78241182771,-0.782352117615,-0.782292400329,-0.782232675852,-0.782172944185,-0.782113205328,-0.782053459283,-0.781993706049,-0.781933945627,-0.781874178018,-0.781814403222,-0.781754621239,-0.781694832071,-0.781635035718,-0.78157523218,-0.781515421458,-0.781455603552,-0.781395778464,-0.781335946193,-0.78127610674,-0.781216260106,-0.781156406291,-0.781096545296,-0.781036677122,-0.780976801768,-0.780916919235,-0.780857029525,-0.780797132637,-0.780737228572,-0.780677317331,-0.780617398914,-0.780557473322,-0.780497540555,-0.780437600613,-0.780377653499,-0.780317699211,-0.78025773775,-0.780197769118,-0.780137793314,-0.78007781034,-0.780017820195,-0.77995782288,-0.779897818396,-0.779837806744,-0.779777787923,-0.779717761935,-0.77965772878,-0.779597688458,-0.779537640971,-0.779477586318,-0.7794175245,-0.779357455518,-0.779297379373,-0.779237296064,-0.779177205593,-0.779117107959,-0.779057003164,-0.778996891209,-0.778936772093,-0.778876645817,-0.778816512381,-0.778756371788,-0.778696224036,-0.778636069126,-0.778575907059,-0.778515737836,-0.778455561457,-0.778395377922,-0.778335187233,-0.778274989389,-0.778214784392,-0.778154572241,-0.778094352938,-0.778034126482,-0.777973892876,-0.777913652118,-0.777853404209,-0.777793149151,-0.777732886944,-0.777672617588,-0.777612341083,-0.777552057431,-0.777491766632,-0.777431468687,-0.777371163595,-0.777310851358,-0.777250531976,-0.77719020545,-0.77712987178,-0.777069530967,-0.777009183011,-0.776948827913,-0.776888465673,-0.776828096293,-0.776767719772,-0.776707336111,-0.776646945311,-0.776586547372,-0.776526142295,-0.77646573008,-0.776405310728,-0.776344884239,-0.776284450615,-0.776224009855,-0.77616356196,-0.776103106931,-0.776042644768,-0.775982175472,-0.775921699043,-0.775861215483,-0.77580072479,-0.775740226967,-0.775679722013,-0.775619209929,-0.775558690716,-0.775498164374,-0.775437630904,-0.775377090306,-0.775316542582,-0.77525598773,-0.775195425753,-0.77513485665,-0.775074280423,-0.775013697071,-0.774953106595,-0.774892508996,-0.774831904274,-0.774771292431,-0.774710673466,-0.774650047379,-0.774589414173,-0.774528773846,-0.774468126401,-0.774407471836,-0.774346810154,-0.774286141353,-0.774225465436,-0.774164782402,-0.774104092252,-0.774043394987,-0.773982690607,-0.773921979112,-0.773861260504,-0.773800534783,-0.773739801949,-0.773679062003,-0.773618314946,-0.773557560778,-0.773496799499,-0.77343603111,-0.773375255613,-0.773314473006,-0.773253683291,-0.773192886469,-0.77313208254,-0.773071271504,-0.773010453363,-0.772949628116,-0.772888795764,-0.772827956308,-0.772767109748,-0.772706256086,-0.77264539532,-0.772584527453,-0.772523652484,-0.772462770415,-0.772401881245,-0.772340984975,-0.772280081606,-0.772219171139,-0.772158253573,-0.77209732891,-0.77203639715,-0.771975458294,-0.771914512342,-0.771853559294,-0.771792599152,-0.771731631916,-0.771670657586,-0.771609676163,-0.771548687647,-0.77148769204,-0.771426689341,-0.771365679552,-0.771304662672,-0.771243638702,-0.771182607644,-0.771121569497,-0.771060524262,-0.770999471939,-0.77093841253,-0.770877346034,-0.770816272453,-0.770755191786,-0.770694104035,-0.7706330092,-0.770571907281,-0.77051079828,-0.770449682196,-0.77038855903,-0.770327428783,-0.770266291455,-0.770205147047,-0.77014399556,-0.770082836993,-0.770021671348,-0.769960498626,-0.769899318826,-0.769838131949,-0.769776937996,-0.769715736967,-0.769654528864,-0.769593313685,-0.769532091433,-0.769470862108,-0.76940962571,-0.769348382239,-0.769287131697,-0.769225874083,-0.769164609399,-0.769103337646,-0.769042058822,-0.76898077293,-0.76891947997,-0.768858179941,-0.768796872846,-0.768735558684,-0.768674237456,-0.768612909162,-0.768551573804,-0.768490231381,-0.768428881894,-0.768367525344,-0.768306161731,-0.768244791057,-0.768183413321,-0.768122028523,-0.768060636666,-0.767999237748,-0.767937831772,-0.767876418736,-0.767814998642,-0.767753571491,-0.767692137283,-0.767630696018,-0.767569247698,-0.767507792322,-0.767446329891,-0.767384860406,-0.767323383868,-0.767261900276,-0.767200409632,-0.767138911936,-0.767077407188,-0.76701589539,-0.766954376542,-0.766892850643,-0.766831317696,-0.7667697777,-0.766708230657,-0.766646676565,-0.766585115427,-0.766523547243,-0.766461972013,-0.766400389738,-0.766338800418,-0.766277204054,-0.766215600647,-0.766153990196,-0.766092372704,-0.76603074817,-0.765969116594,-0.765907477978,-0.765845832322,-0.765784179626,-0.765722519892,-0.765660853119,-0.765599179308,-0.76553749846,-0.765475810575,-0.765414115655,-0.765352413699,-0.765290704707,-0.765228988682,-0.765167265622,-0.76510553553,-0.765043798405,-0.764982054247,-0.764920303058,-0.764858544838,-0.764796779588,-0.764735007308,-0.764673227998,-0.76461144166,-0.764549648293,-0.7644878479,-0.764426040479,-0.764364226031,-0.764302404558,-0.764240576059,-0.764178740536,-0.764116897989,-0.764055048418,-0.763993191824,-0.763931328207,-0.763869457569,-0.763807579909,-0.763745695228,-0.763683803528,-0.763621904807,-0.763559999068,-0.76349808631,-0.763436166534,-0.763374239741,-0.763312305931,-0.763250365105,-0.763188417263,-0.763126462407,-0.763064500535,-0.76300253165,-0.762940555752,-0.76287857284,-0.762816582917,-0.762754585981,-0.762692582035,-0.762630571078,-0.762568553112,-0.762506528136,-0.762444496151,-0.762382457158,-0.762320411157,-0.762258358149,-0.762196298135,-0.762134231114,-0.762072157089,-0.762010076058,-0.761947988023,-0.761885892985,-0.761823790943,-0.761761681899,-0.761699565854,-0.761637442806,-0.761575312758,-0.76151317571,-0.761451031662,-0.761388880615,-0.761326722569,-0.761264557525,-0.761202385484,-0.761140206446,-0.761078020412,-0.761015827383,-0.760953627358,-0.760891420339,-0.760829206325,-0.760766985319,-0.760704757319,-0.760642522328,-0.760580280344,-0.76051803137,-0.760455775405,-0.76039351245,-0.760331242506,-0.760268965573,-0.760206681651,-0.760144390742,-0.760082092846,-0.760019787964,-0.759957476095,-0.759895157241,-0.759832831403,-0.75977049858,-0.759708158773,-0.759645811984,-0.759583458211,-0.759521097457,-0.759458729722,-0.759396355006,-0.759333973309,-0.759271584633,-0.759209188978,-0.759146786345,-0.759084376733,-0.759021960145,-0.758959536579,-0.758897106037,-0.75883466852,-0.758772224027,-0.75870977256,-0.75864731412,-0.758584848705,-0.758522376319,-0.75845989696,-0.758397410629,-0.758334917327,-0.758272417055,-0.758209909813,-0.758147395602,-0.758084874422,-0.758022346273,-0.757959811158,-0.757897269075,-0.757834720026,-0.757772164011,-0.75770960103,-0.757647031085,-0.757584454176,-0.757521870303,-0.757459279468,-0.757396681669,-0.75733407691,-0.757271465188,-0.757208846506,-0.757146220865,-0.757083588263,-0.757020948703,-0.756958302184,-0.756895648707,-0.756832988273,-0.756770320883,-0.756707646536,-0.756644965234,-0.756582276977,-0.756519581766,-0.756456879601,-0.756394170483,-0.756331454412,-0.756268731389,-0.756206001414,-0.756143264489,-0.756080520614,-0.756017769788,-0.755955012014,-0.755892247291,-0.75582947562,-0.755766697001,-0.755703911436,-0.755641118924,-0.755578319467,-0.755515513065,-0.755452699718,-0.755389879427,-0.755327052193,-0.755264218016,-0.755201376897,-0.755138528836,-0.755075673834,-0.755012811891,-0.754949943009,-0.754887067187,-0.754824184426,-0.754761294728,-0.754698398092,-0.754635494518,-0.754572584008,-0.754509666563,-0.754446742182,-0.754383810866,-0.754320872617,-0.754257927433,-0.754194975317,-0.754132016268,-0.754069050288,-0.754006077376,-0.753943097533,-0.753880110761,-0.753817117059,-0.753754116428,-0.753691108869,-0.753628094382,-0.753565072968,-0.753502044627,-0.75343900936,-0.753375967167,-0.75331291805,-0.753249862009,-0.753186799044,-0.753123729155,-0.753060652344,-0.752997568612,-0.752934477957,-0.752871380382,-0.752808275887,-0.752745164472,-0.752682046138,-0.752618920886,-0.752555788715,-0.752492649627,-0.752429503623,-0.752366350702,-0.752303190866,-0.752240024115,-0.752176850449,-0.75211366987,-0.752050482377,-0.751987287971,-0.751924086654,-0.751860878424,-0.751797663284,-0.751734441234,-0.751671212274,-0.751607976404,-0.751544733626,-0.75148148394,-0.751418227347,-0.751354963846,-0.75129169344,-0.751228416127,-0.75116513191,-0.751101840788,-0.751038542762,-0.750975237832,-0.750911926,-0.750848607265,-0.750785281629,-0.750721949092,-0.750658609655,-0.750595263317,-0.75053191008,-0.750468549945,-0.750405182911,-0.75034180898,-0.750278428151,-0.750215040427,-0.750151645806,-0.750088244291,-0.75002483588,-0.749961420576,-0.749897998378,-0.749834569287,-0.749771133304,-0.749707690429,-0.749644240663,-0.749580784006,-0.74951732046,-0.749453850024,-0.749390372699,-0.749326888486,-0.749263397385,-0.749199899398,-0.749136394523,-0.749072882763,-0.749009364118,-0.748945838588,-0.748882306173,-0.748818766875,-0.748755220695,-0.748691667631,-0.748628107686,-0.74856454086,-0.748500967153,-0.748437386566,-0.748373799099,-0.748310204754,-0.74824660353,-0.748182995429,-0.74811938045,-0.748055758595,-0.747992129864,-0.747928494258,-0.747864851777,-0.747801202421,-0.747737546192,-0.74767388309,-0.747610213115,-0.747546536269,-0.747482852551,-0.747419161963,-0.747355464504,-0.747291760176,-0.747228048979,-0.747164330913,-0.74710060598,-0.74703687418,-0.746973135513,-0.74690938998,-0.746845637581,-0.746781878318,-0.746718112191,-0.746654339199,-0.746590559345,-0.746526772628,-0.74646297905,-0.74639917861,-0.746335371309,-0.746271557148,-0.746207736127,-0.746143908248,-0.74608007351,-0.746016231914,-0.745952383461,-0.745888528152,-0.745824665986,-0.745760796965,-0.745696921089,-0.745633038359,-0.745569148775,-0.745505252338,-0.745441349049,-0.745377438907,-0.745313521914,-0.745249598071,-0.745185667377,-0.745121729834,-0.745057785441,-0.744993834201,-0.744929876112,-0.744865911176,-0.744801939394,-0.744737960765,-0.744673975291,-0.744609982972,-0.744545983809,-0.744481977802,-0.744417964952,-0.74435394526,-0.744289918725,-0.74422588535,-0.744161845133,-0.744097798076,-0.74403374418,-0.743969683445,-0.743905615871,-0.743841541459,-0.74377746021,-0.743713372125,-0.743649277203,-0.743585175447,-0.743521066855,-0.743456951429,-0.743392829169,-0.743328700076,-0.74326456415,-0.743200421393,-0.743136271804,-0.743072115385,-0.743007952135,-0.742943782056,-0.742879605148,-0.742815421411,-0.742751230847,-0.742687033455,-0.742622829237,-0.742558618193,-0.742494400323,-0.742430175629,-0.74236594411,-0.742301705767,-0.742237460602,-0.742173208614,-0.742108949804,-0.742044684173,-0.741980411721,-0.741916132449,-0.741851846357,-0.741787553447,-0.741723253718,-0.741658947171,-0.741594633807,-0.741530313627,-0.741465986631,-0.741401652819,-0.741337312192,-0.741272964751,-0.741208610497,-0.74114424943,-0.74107988155,-0.741015506858,-0.740951125355,-0.740886737041,-0.740822341918,-0.740757939984,-0.740693531242,-0.740629115692,-0.740564693334,-0.740500264169,-0.740435828197,-0.740371385419,-0.740306935836,-0.740242479449,-0.740178016257,-0.740113546261,-0.740049069463,-0.739984585862,-0.73992009546,-0.739855598256,-0.739791094251,-0.739726583447,-0.739662065843,-0.739597541441,-0.73953301024,-0.739468472242,-0.739403927446,-0.739339375854,-0.739274817467,-0.739210252284,-0.739145680306,-0.739081101534,-0.739016515969,-0.738951923611,-0.738887324461,-0.738822718519,-0.738758105785,-0.738693486262,-0.738628859948,-0.738564226845,-0.738499586954,-0.738434940274,-0.738370286807,-0.738305626552,-0.738240959512,-0.738176285686,-0.738111605074,-0.738046917678,-0.737982223498,-0.737917522535,-0.737852814788,-0.73778810026,-0.73772337895,-0.737658650859,-0.737593915988,-0.737529174337,-0.737464425906,-0.737399670697,-0.73733490871,-0.737270139946,-0.737205364405,-0.737140582087,-0.737075792994,-0.737010997126,-0.736946194484,-0.736881385067,-0.736816568877,-0.736751745915,-0.736686916181,-0.736622079675,-0.736557236398,-0.736492386351,-0.736427529534,-0.736362665948,-0.736297795594,-0.736232918472,-0.736168034582,-0.736103143926,-0.736038246504,-0.735973342316,-0.735908431363,-0.735843513646,-0.735778589166,-0.735713657922,-0.735648719916,-0.735583775147,-0.735518823618,-0.735453865327,-0.735388900277,-0.735323928467,-0.735258949898,-0.73519396457,-0.735128972485,-0.735063973643,-0.734998968044,-0.73493395569,-0.73486893658,-0.734803910715,-0.734738878096,-0.734673838723,-0.734608792598,-0.73454373972,-0.73447868009,-0.73441361371,-0.734348540578,-0.734283460697,-0.734218374066,-0.734153280687,-0.734088180559,-0.734023073684,-0.733957960061,-0.733892839693,-0.733827712578,-0.733762578719,-0.733697438115,-0.733632290766,-0.733567136675,-0.733501975841,-0.733436808264,-0.733371633946,-0.733306452887,-0.733241265087,-0.733176070548,-0.733110869269,-0.733045661252,-0.732980446497,-0.732915225005,-0.732849996775,-0.73278476181,-0.732719520109,-0.732654271672,-0.732589016502,-0.732523754598,-0.73245848596,-0.73239321059,-0.732327928488,-0.732262639654,-0.73219734409,-0.732132041795,-0.732066732771,-0.732001417018,-0.731936094537,-0.731870765327,-0.731805429391,-0.731740086728,-0.731674737338,-0.731609381224,-0.731544018385,-0.731478648821,-0.731413272534,-0.731347889524,-0.731282499791,-0.731217103337,-0.731151700162,-0.731086290265,-0.731020873649,-0.730955450314,-0.73089002026,-0.730824583487,-0.730759139997,-0.73069368979,-0.730628232867,-0.730562769228,-0.730497298874,-0.730431821805,-0.730366338022,-0.730300847526,-0.730235350317,-0.730169846395,-0.730104335763,-0.730038818419,-0.729973294365,-0.729907763601,-0.729842226128,-0.729776681947,-0.729711131057,-0.72964557346,-0.729580009157,-0.729514438147,-0.729448860432,-0.729383276012,-0.729317684887,-0.729252087059,-0.729186482527,-0.729120871293,-0.729055253358,-0.728989628721,-0.728923997383,-0.728858359345,-0.728792714607,-0.728727063171,-0.728661405036,-0.728595740204,-0.728530068674,-0.728464390448,-0.728398705526,-0.728333013909,-0.728267315597,-0.728201610591,-0.728135898892,-0.7280701805,-0.728004455415,-0.727938723639,-0.727872985172,-0.727807240014,-0.727741488167,-0.72767572963,-0.727609964404,-0.727544192491,-0.72747841389,-0.727412628602,-0.727346836628,-0.727281037969,-0.727215232624,-0.727149420595,-0.727083601883,-0.727017776487,-0.726951944408,-0.726886105648,-0.726820260206,-0.726754408083,-0.72668854928,-0.726622683798,-0.726556811636,-0.726490932796,-0.726425047279,-0.726359155084,-0.726293256213,-0.726227350666,-0.726161438444,-0.726095519546,-0.726029593975,-0.72596366173,-0.725897722813,-0.725831777223,-0.725765824961,-0.725699866028,-0.725633900425,-0.725567928152,-0.72550194921,-0.725435963599,-0.72536997132,-0.725303972373,-0.72523796676,-0.72517195448,-0.725105935535,-0.725039909925,-0.72497387765,-0.724907838712,-0.72484179311,-0.724775740846,-0.724709681919,-0.724643616332,-0.724577544084,-0.724511465175,-0.724445379607,-0.72437928738,-0.724313188495,-0.724247082951,-0.724180970751,-0.724114851895,-0.724048726382,-0.723982594214,-0.723916455391,-0.723850309915,-0.723784157784,-0.723717999001,-0.723651833566,-0.723585661479,-0.723519482741,-0.723453297353,-0.723387105314,-0.723320906627,-0.723254701291,-0.723188489307,-0.723122270675,-0.723056045397,-0.722989813472,-0.722923574902,-0.722857329687,-0.722791077828,-0.722724819325,-0.722658554179,-0.72259228239,-0.722526003959,-0.722459718887,-0.722393427175,-0.722327128822,-0.72226082383,-0.722194512199,-0.722128193929,-0.722061869022,-0.721995537478,-0.721929199298,-0.721862854481,-0.72179650303,-0.721730144944,-0.721663780224,-0.72159740887,-0.721531030884,-0.721464646266,-0.721398255016,-0.721331857135,-0.721265452624,-0.721199041483,-0.721132623713,-0.721066199315,-0.720999768288,-0.720933330634,-0.720866886354,-0.720800435448,-0.720733977916,-0.720667513759,-0.720601042978,-0.720534565574,-0.720468081546,-0.720401590897,-0.720335093625,-0.720268589732,-0.720202079219,-0.720135562085,-0.720069038333,-0.720002507961,-0.719935970972,-0.719869427365,-0.719802877141,-0.719736320301,-0.719669756845,-0.719603186774,-0.719536610089,-0.71947002679,-0.719403436878,-0.719336840353,-0.719270237216,-0.719203627467,-0.719137011108,-0.719070388139,-0.71900375856,-0.718937122373,-0.718870479577,-0.718803830173,-0.718737174162,-0.718670511545,-0.718603842322,-0.718537166494,-0.718470484061,-0.718403795023,-0.718337099383,-0.71827039714,-0.718203688294,-0.718136972847,-0.718070250799,-0.718003522151,-0.717936786903,-0.717870045056,-0.71780329661,-0.717736541566,-0.717669779926,-0.717603011688,-0.717536236854,-0.717469455425,-0.717402667402,-0.717335872784,-0.717269071572,-0.717202263767,-0.71713544937,-0.717068628381,-0.717001800802,-0.716934966631,-0.716868125871,-0.716801278521,-0.716734424583,-0.716667564056,-0.716600696943,-0.716533823242,-0.716466942955,-0.716400056082,-0.716333162625,-0.716266262583,-0.716199355957,-0.716132442748,-0.716065522957,-0.715998596584,-0.715931663629,-0.715864724094,-0.715797777979,-0.715730825284,-0.71566386601,-0.715596900158,-0.715529927729,-0.715462948722,-0.715395963139,-0.715328970981,-0.715261972247,-0.715194966939,-0.715127955056,-0.715060936601,-0.714993911573,-0.714926879972,-0.714859841801,-0.714792797058,-0.714725745745,-0.714658687863,-0.714591623411,-0.714524552392,-0.714457474804,-0.714390390649,-0.714323299928,-0.714256202641,-0.714189098789,-0.714121988372,-0.71405487139,-0.713987747846,-0.713920617738,-0.713853481069,-0.713786337838,-0.713719188046,-0.713652031693,-0.713584868781,-0.713517699309,-0.71345052328,-0.713383340692,-0.713316151547,-0.713248955845,-0.713181753587,-0.713114544774,-0.713047329406,-0.712980107484,-0.712912879009,-0.71284564398,-0.712778402399,-0.712711154267,-0.712643899583,-0.712576638349,-0.712509370565,-0.712442096231,-0.71237481535,-0.71230752792,-0.712240233942,-0.712172933418,-0.712105626348,-0.712038312733,-0.711970992572,-0.711903665867,-0.711836332619,-0.711768992827,-0.711701646493,-0.711634293617,-0.7115669342,-0.711499568243,-0.711432195745,-0.711364816708,-0.711297431133,-0.711230039019,-0.711162640368,-0.71109523518,-0.711027823456,-0.710960405196,-0.710892980401,-0.710825549072,-0.710758111209,-0.710690666813,-0.710623215884,-0.710555758424,-0.710488294432,-0.71042082391,-0.710353346857,-0.710285863275,-0.710218373164,-0.710150876526,-0.710083373359,-0.710015863666,-0.709948347446,-0.709880824701,-0.70981329543,-0.709745759636,-0.709678217317,-0.709610668475,-0.70954311311,-0.709475551224,-0.709407982816,-0.709340407888,-0.709272826439,-0.709205238471,-0.709137643984,-0.709070042978,-0.709002435456,-0.708934821416,-0.70886720086,-0.708799573788,-0.7087319402,-0.708664300099,-0.708596653483,-0.708529000354,-0.708461340713,-0.70839367456,-0.708326001895,-0.708258322719,-0.708190637033,-0.708122944838,-0.708055246134,-0.707987540921,-0.707919829201,-0.707852110974,-0.70778438624,-0.707716655,-0.707648917256,-0.707581173006,-0.707513422253,-0.707445664997,-0.707377901238,-0.707310130976,-0.707242354214,-0.70717457095,-0.707106781187,-0.707038984923,-0.706971182161,-0.706903372901,-0.706835557142,-0.706767734887,-0.706699906135,-0.706632070888,-0.706564229145,-0.706496380907,-0.706428526176,-0.706360664951,-0.706292797234,-0.706224923024,-0.706157042323,-0.706089155131,-0.706021261449,-0.705953361278,-0.705885454617,-0.705817541468,-0.705749621831,-0.705681695708,-0.705613763097,-0.705545824001,-0.70547787842,-0.705409926354,-0.705341967804,-0.705274002771,-0.705206031255,-0.705138053257,-0.705070068777,-0.705002077817,-0.704934080376,-0.704866076456,-0.704798066056,-0.704730049179,-0.704662025823,-0.704593995991,-0.704525959682,-0.704457916897,-0.704389867637,-0.704321811903,-0.704253749694,-0.704185681012,-0.704117605858,-0.704049524231,-0.703981436133,-0.703913341564,-0.703845240524,-0.703777133016,-0.703709019038,-0.703640898592,-0.703572771678,-0.703504638297,-0.703436498449,-0.703368352136,-0.703300199358,-0.703232040114,-0.703163874407,-0.703095702237,-0.703027523604,-0.702959338509,-0.702891146952,-0.702822948935,-0.702754744457,-0.70268653352,-0.702618316124,-0.702550092269,-0.702481861957,-0.702413625188,-0.702345381962,-0.702277132281,-0.702208876144,-0.702140613553,-0.702072344508,-0.70200406901,-0.701935787059,-0.701867498656,-0.701799203801,-0.701730902496,-0.70166259474,-0.701594280535,-0.701525959881,-0.701457632779,-0.701389299229,-0.701320959232,-0.701252612789,-0.7011842599,-0.701115900566,-0.701047534787,-0.700979162565,-0.700910783899,-0.700842398791,-0.70077400724,-0.700705609248,-0.700637204816,-0.700568793943,-0.700500376631,-0.70043195288,-0.700363522691,-0.700295086064,-0.700226643001,-0.700158193501,-0.700089737565,-0.700021275194,-0.699952806389,-0.69988433115,-0.699815849477,-0.699747361373,-0.699678866836,-0.699610365868,-0.699541858469,-0.69947334464,-0.699404824382,-0.699336297695,-0.69926776458,-0.699199225037,-0.699130679068,-0.699062126672,-0.698993567851,-0.698925002604,-0.698856430934,-0.698787852839,-0.698719268322,-0.698650677381,-0.69858208002,-0.698513476236,-0.698444866033,-0.698376249409,-0.698307626366,-0.698238996904,-0.698170361024,-0.698101718727,-0.698033070013,-0.697964414883,-0.697895753337,-0.697827085377,-0.697758411002,-0.697689730213,-0.697621043012,-0.697552349398,-0.697483649372,-0.697414942935,-0.697346230088,-0.697277510831,-0.697208785165,-0.69714005309,-0.697071314607,-0.697002569716,-0.696933818419,-0.696865060716,-0.696796296608,-0.696727526095,-0.696658749177,-0.696589965856,-0.696521176132,-0.696452380006,-0.696383577478,-0.69631476855,-0.69624595322,-0.696177131491,-0.696108303363,-0.696039468837,-0.695970627913,-0.695901780591,-0.695832926873,-0.695764066759,-0.695695200249,-0.695626327345,-0.695557448047,-0.695488562356,-0.695419670271,-0.695350771795,-0.695281866927,-0.695212955668,-0.695144038019,-0.69507511398,-0.695006183552,-0.694937246736,-0.694868303532,-0.694799353942,-0.694730397964,-0.694661435601,-0.694592466853,-0.69452349172,-0.694454510203,-0.694385522303,-0.69431652802,-0.694247527356,-0.69417852031,-0.694109506883,-0.694040487076,-0.69397146089,-0.693902428324,-0.693833389381,-0.69376434406,-0.693695292362,-0.693626234288,-0.693557169838,-0.693488099013,-0.693419021814,-0.693349938241,-0.693280848295,-0.693211751976,-0.693142649285,-0.693073540224,-0.693004424791,-0.692935302989,-0.692866174817,-0.692797040277,-0.692727899369,-0.692658752093,-0.692589598451,-0.692520438442,-0.692451272068,-0.692382099329,-0.692312920226,-0.692243734759,-0.692174542929,-0.692105344737,-0.692036140183,-0.691966929269,-0.691897711993,-0.691828488358,-0.691759258364,-0.691690022012,-0.691620779301,-0.691551530233,-0.691482274809,-0.691413013029,-0.691343744893,-0.691274470403,-0.691205189558,-0.691135902361,-0.69106660881,-0.690997308908,-0.690928002653,-0.690858690048,-0.690789371093,-0.690720045788,-0.690650714135,-0.690581376132,-0.690512031783,-0.690442681086,-0.690373324043,-0.690303960654,-0.69023459092,-0.690165214841,-0.690095832419,-0.690026443653,-0.689957048545,-0.689887647095,-0.689818239303,-0.689748825171,-0.689679404699,-0.689609977887,-0.689540544737,-0.689471105249,-0.689401659423,-0.68933220726,-0.689262748761,-0.689193283927,-0.689123812757,-0.689054335254,-0.688984851417,-0.688915361246,-0.688845864744,-0.688776361909,-0.688706852744,-0.688637337248,-0.688567815422,-0.688498287267,-0.688428752784,-0.688359211973,-0.688289664834,-0.688220111369,-0.688150551578,-0.688080985462,-0.68801141302,-0.687941834255,-0.687872249167,-0.687802657755,-0.687733060022,-0.687663455967,-0.687593845591,-0.687524228895,-0.687454605879,-0.687384976545,-0.687315340892,-0.687245698921,-0.687176050634,-0.68710639603,-0.68703673511,-0.686967067875,-0.686897394326,-0.686827714463,-0.686758028287,-0.686688335798,-0.686618636998,-0.686548931886,-0.686479220463,-0.686409502731,-0.686339778689,-0.686270048339,-0.68620031168,-0.686130568714,-0.686060819441,-0.685991063863,-0.685921301978,-0.685851533789,-0.685781759296,-0.685711978499,-0.685642191399,-0.685572397997,-0.685502598293,-0.685432792289,-0.685362979984,-0.685293161379,-0.685223336475,-0.685153505273,-0.685083667773,-0.685013823976,-0.684943973882,-0.684874117492,-0.684804254808,-0.684734385828,-0.684664510555,-0.684594628988,-0.684524741129,-0.684454846978,-0.684384946535,-0.684315039802,-0.684245126779,-0.684175207466,-0.684105281864,-0.684035349975,-0.683965411797,-0.683895467333,-0.683825516583,-0.683755559547,-0.683685596226,-0.683615626621,-0.683545650732,-0.68347566856,-0.683405680106,-0.68333568537,-0.683265684353,-0.683195677056,-0.683125663479,-0.683055643623,-0.682985617488,-0.682915585075,-0.682845546385,-0.682775501419,-0.682705450176,-0.682635392659,-0.682565328866,-0.6824952588,-0.682425182461,-0.682355099848,-0.682285010964,-0.682214915808,-0.682144814381,-0.682074706685,-0.682004592718,-0.681934472483,-0.68186434598,-0.681794213209,-0.681724074172,-0.681653928868,-0.681583777298,-0.681513619464,-0.681443455365,-0.681373285002,-0.681303108377,-0.681232925489,-0.681162736339,-0.681092540928,-0.681022339257,-0.680952131326,-0.680881917135,-0.680811696686,-0.68074146998,-0.680671237016,-0.680600997795,-0.680530752319,-0.680460500587,-0.680390242601,-0.680319978361,-0.680249707867,-0.68017943112,-0.680109148122,-0.680038858872,-0.679968563371,-0.679898261621,-0.67982795362,-0.679757639371,-0.679687318874,-0.679616992129,-0.679546659137,-0.679476319899,-0.679405974416,-0.679335622687,-0.679265264714,-0.679194900498,-0.679124530038,-0.679054153337,-0.678983770393,-0.678913381208,-0.678842985783,-0.678772584118,-0.678702176214,-0.678631762072,-0.678561341691,-0.678490915074,-0.67842048222,-0.67835004313,-0.678279597805,-0.678209146245,-0.678138688451,-0.678068224424,-0.677997754164,-0.677927277673,-0.677856794949,-0.677786305996,-0.677715810812,-0.677645309398,-0.677574801756,-0.677504287886,-0.677433767789,-0.677363241464,-0.677292708913,-0.677222170137,-0.677151625136,-0.677081073911,-0.677010516462,-0.67693995279,-0.676869382896,-0.67679880678,-0.676728224443,-0.676657635886,-0.67658704111,-0.676516440114,-0.6764458329,-0.676375219468,-0.676304599819,-0.676233973953,-0.676163341872,-0.676092703575,-0.676022059064,-0.67595140834,-0.675880751402,-0.675810088251,-0.675739418889,-0.675668743315,-0.675598061531,-0.675527373536,-0.675456679333,-0.675385978921,-0.6753152723,-0.675244559473,-0.675173840439,-0.675103115198,-0.675032383752,-0.674961646102,-0.674890902247,-0.674820152189,-0.674749395929,-0.674678633466,-0.674607864801,-0.674537089936,-0.67446630887,-0.674395521605,-0.674324728141,-0.674253928479,-0.674183122619,-0.674112310562,-0.674041492309,-0.673970667861,-0.673899837217,-0.673829000379,-0.673758157347,-0.673687308122,-0.673616452705,-0.673545591096,-0.673474723296,-0.673403849306,-0.673332969125,-0.673262082756,-0.673191190198,-0.673120291453,-0.67304938652,-0.6729784754,-0.672907558095,-0.672836634605,-0.67276570493,-0.672694769071,-0.672623827029,-0.672552878804,-0.672481924397,-0.672410963809,-0.67233999704,-0.672269024091,-0.672198044963,-0.672127059656,-0.672056068172,-0.671985070509,-0.67191406667,-0.671843056655,-0.671772040465,-0.671701018099,-0.67162998956,-0.671558954847,-0.671487913961,-0.671416866903,-0.671345813674,-0.671274754274,-0.671203688703,-0.671132616963,-0.671061539054,-0.670990454977,-0.670919364732,-0.67084826832,-0.670777165742,-0.670706056998,-0.67063494209,-0.670563821017,-0.67049269378,-0.67042156038,-0.670350420818,-0.670279275094,-0.670208123209,-0.670136965164,-0.670065800959,-0.669994630595,-0.669923454072,-0.669852271392,-0.669781082554,-0.66970988756,-0.66963868641,-0.669567479105,-0.669496265646,-0.669425046032,-0.669353820266,-0.669282588347,-0.669211350276,-0.669140106053,-0.66906885568,-0.668997599157,-0.668926336485,-0.668855067665,-0.668783792696,-0.66871251158,-0.668641224317,-0.668569930908,-0.668498631354,-0.668427325655,-0.668356013813,-0.668284695826,-0.668213371698,-0.668142041427,-0.668070705014,-0.667999362461,-0.667928013768,-0.667856658935,-0.667785297963,-0.667713930854,-0.667642557607,-0.667571178223,-0.667499792702,-0.667428401047,-0.667357003256,-0.667285599331,-0.667214189273,-0.667142773082,-0.667071350759,-0.666999922304,-0.666928487718,-0.666857047002,-0.666785600156,-0.666714147181,-0.666642688078,-0.666571222847,-0.66649975149,-0.666428274006,-0.666356790396,-0.666285300662,-0.666213804803,-0.66614230282,-0.666070794714,-0.665999280486,-0.665927760136,-0.665856233666,-0.665784701074,-0.665713162363,-0.665641617533,-0.665570066585,-0.665498509518,-0.665426946335,-0.665355377035,-0.665283801619,-0.665212220088,-0.665140632443,-0.665069038684,-0.664997438811,-0.664925832826,-0.66485422073,-0.664782602522,-0.664710978203,-0.664639347775,-0.664567711237,-0.664496068591,-0.664424419837,-0.664352764976,-0.664281104008,-0.664209436934,-0.664137763755,-0.664066084472,-0.663994399084,-0.663922707593,-0.663851009999,-0.663779306304,-0.663707596507,-0.66363588061,-0.663564158612,-0.663492430515,-0.66342069632,-0.663348956026,-0.663277209635,-0.663205457148,-0.663133698564,-0.663061933885,-0.662990163111,-0.662918386243,-0.662846603282,-0.662774814228,-0.662703019082,-0.662631217845,-0.662559410516,-0.662487597098,-0.66241577759,-0.662343951994,-0.662272120309,-0.662200282537,-0.662128438678,-0.662056588733,-0.661984732702,-0.661912870587,-0.661841002387,-0.661769128104,-0.661697247738,-0.66162536129,-0.66155346876,-0.66148157015,-0.661409665459,-0.661337754689,-0.66126583784,-0.661193914913,-0.661121985908,-0.661050050826,-0.660978109668,-0.660906162435,-0.660834209126,-0.660762249744,-0.660690284287,-0.660618312758,-0.660546335157,-0.660474351484,-0.66040236174,-0.660330365925,-0.660258364041,-0.660186356089,-0.660114342067,-0.660042321979,-0.659970295823,-0.659898263601,-0.659826225313,-0.659754180961,-0.659682130544,-0.659610074063,-0.659538011519,-0.659465942913,-0.659393868246,-0.659321787517,-0.659249700728,-0.659177607879,-0.659105508972,-0.659033404006,-0.658961292982,-0.658889175901,-0.658817052764,-0.658744923571,-0.658672788323,-0.658600647021,-0.658528499665,-0.658456346256,-0.658384186795,-0.658312021282,-0.658239849717,-0.658167672103,-0.658095488439,-0.658023298725,-0.657951102963,-0.657878901154,-0.657806693297,-0.657734479394,-0.657662259445,-0.657590033451,-0.657517801413,-0.657445563331,-0.657373319206,-0.657301069038,-0.657228812829,-0.657156550578,-0.657084282287,-0.657012007956,-0.656939727587,-0.656867441178,-0.656795148732,-0.656722850249,-0.656650545729,-0.656578235174,-0.656505918583,-0.656433595958,-0.6563612673,-0.656288932608,-0.656216591883,-0.656144245127,-0.65607189234,-0.655999533522,-0.655927168674,-0.655854797797,-0.655782420892,-0.655710037959,-0.655637648999,-0.655565254012,-0.655492853,-0.655420445962,-0.6553480329,-0.655275613814,-0.655203188705,-0.655130757573,-0.65505832042,-0.654985877245,-0.65491342805,-0.654840972835,-0.654768511601,-0.654696044349,-0.654623571078,-0.654551091791,-0.654478606487,-0.654406115167,-0.654333617832,-0.654261114482,-0.654188605119,-0.654116089742,-0.654043568353,-0.653971040953,-0.653898507541,-0.653825968118,-0.653753422686,-0.653680871244,-0.653608313795,-0.653535750337,-0.653463180872,-0.6533906054,-0.653318023923,-0.653245436441,-0.653172842954,-0.653100243463,-0.653027637969,-0.652955026473,-0.652882408975,-0.652809785475,-0.652737155975,-0.652664520476,-0.652591878977,-0.65251923148,-0.652446577984,-0.652373918492,-0.652301253003,-0.652228581519,-0.652155904039,-0.652083220565,-0.652010531097,-0.651937835636,-0.651865134182,-0.651792426737,-0.6517197133,-0.651646993873,-0.651574268456,-0.65150153705,-0.651428799656,-0.651356056274,-0.651283306905,-0.651210551549,-0.651137790207,-0.65106502288,-0.650992249569,-0.650919470274,-0.650846684996,-0.650773893736,-0.650701096494,-0.65062829327,-0.650555484067,-0.650482668883,-0.65040984772,-0.650337020579,-0.65026418746,-0.650191348364,-0.650118503292,-0.650045652244,-0.649972795221,-0.649899932223,-0.649827063252,-0.649754188307,-0.649681307391,-0.649608420502,-0.649535527643,-0.649462628813,-0.649389724013,-0.649316813244,-0.649243896507,-0.649170973802,-0.64909804513,-0.649025110492,-0.648952169888,-0.648879223319,-0.648806270786,-0.648733312289,-0.648660347829,-0.648587377406,-0.648514401022,-0.648441418677,-0.648368430372,-0.648295436107,-0.648222435882,-0.6481494297,-0.64807641756,-0.648003399463,-0.64793037541,-0.647857345401,-0.647784309437,-0.647711267519,-0.647638219647,-0.647565165822,-0.647492106045,-0.647419040316,-0.647345968637,-0.647272891007,-0.647199807427,-0.647126717899,-0.647053622422,-0.646980520998,-0.646907413627,-0.646834300309,-0.646761181046,-0.646688055839,-0.646614924687,-0.646541787591,-0.646468644552,-0.646395495572,-0.64632234065,-0.646249179787,-0.646176012983,-0.646102840241,-0.646029661559,-0.645956476939,-0.645883286382,-0.645810089888,-0.645736887458,-0.645663679092,-0.645590464792,-0.645517244557,-0.645444018389,-0.645370786288,-0.645297548255,-0.645224304291,-0.645151054395,-0.64507779857,-0.645004536816,-0.644931269132,-0.644857995521,-0.644784715982,-0.644711430516,-0.644638139125,-0.644564841807,-0.644491538566,-0.6444182294,-0.644344914311,-0.644271593299,-0.644198266365,-0.64412493351,-0.644051594734,-0.643978250039,-0.643904899424,-0.64383154289,-0.643758180438,-0.643684812069,-0.643611437784,-0.643538057582,-0.643464671465,-0.643391279434,-0.643317881489,-0.64324447763,-0.643171067859,-0.643097652176,-0.643024230582,-0.642950803077,-0.642877369662,-0.642803930339,-0.642730485106,-0.642657033966,-0.642583576919,-0.642510113965,-0.642436645105,-0.642363170341,-0.642289689671,-0.642216203098,-0.642142710622,-0.642069212244,-0.641995707963,-0.641922197782,-0.6418486817,-0.641775159719,-0.641701631838,-0.641628098059,-0.641554558382,-0.641481012809,-0.641407461338,-0.641333903973,-0.641260340712,-0.641186771557,-0.641113196508,-0.641039615566,-0.640966028732,-0.640892436007,-0.64081883739,-0.640745232883,-0.640671622487,-0.640598006201,-0.640524384028,-0.640450755966,-0.640377122018,-0.640303482184,-0.640229836464,-0.64015618486,-0.640082527371,-0.640008863998,-0.639935194743,-0.639861519606,-0.639787838587,-0.639714151688,-0.639640458908,-0.639566760249,-0.639493055711,-0.639419345295,-0.639345629002,-0.639271906831,-0.639198178785,-0.639124444864,-0.639050705068,-0.638976959397,-0.638903207854,-0.638829450437,-0.638755687149,-0.63868191799,-0.63860814296,-0.638534362059,-0.63846057529,-0.638386782652,-0.638312984146,-0.638239179773,-0.638165369533,-0.638091553428,-0.638017731457,-0.637943903622,-0.637870069923,-0.63779623036,-0.637722384936,-0.637648533649,-0.637574676501,-0.637500813493,-0.637426944625,-0.637353069898,-0.637279189313,-0.63720530287,-0.637131410569,-0.637057512413,-0.636983608401,-0.636909698533,-0.636835782812,-0.636761861236,-0.636687933808,-0.636614000527,-0.636540061395,-0.636466116412,-0.636392165579,-0.636318208896,-0.636244246364,-0.636170277984,-0.636096303756,-0.636022323682,-0.635948337761,-0.635874345995,-0.635800348384,-0.635726344929,-0.63565233563,-0.635578320489,-0.635504299505,-0.63543027268,-0.635356240015,-0.635282201509,-0.635208157164,-0.63513410698,-0.635060050958,-0.634985989099,-0.634911921403,-0.634837847872,-0.634763768504,-0.634689683303,-0.634615592267,-0.634541495398,-0.634467392697,-0.634393284164,-0.634319169799,-0.634245049604,-0.634170923579,-0.634096791725,-0.634022654043,-0.633948510532,-0.633874361195,-0.633800206031,-0.633726045041,-0.633651878227,-0.633577705588,-0.633503527125,-0.633429342839,-0.633355152731,-0.633280956801,-0.63320675505,-0.633132547479,-0.633058334088,-0.632984114878,-0.632909889851,-0.632835659005,-0.632761422343,-0.632687179864,-0.63261293157,-0.632538677461,-0.632464417538,-0.632390151801,-0.632315880252,-0.63224160289,-0.632167319717,-0.632093030734,-0.63201873594,-0.631944435337,-0.631870128925,-0.631795816705,-0.631721498678,-0.631647174844,-0.631572845204,-0.631498509759,-0.631424168509,-0.631349821456,-0.631275468599,-0.63120110994,-0.631126745478,-0.631052375216,-0.630977999153,-0.63090361729,-0.630829229628,-0.630754836168,-0.63068043691,-0.630606031855,-0.630531621003,-0.630457204356,-0.630382781914,-0.630308353677,-0.630233919647,-0.630159479824,-0.630085034208,-0.630010582801,-0.629936125603,-0.629861662614,-0.629787193837,-0.62971271927,-0.629638238915,-0.629563752772,-0.629489260843,-0.629414763128,-0.629340259627,-0.629265750341,-0.629191235272,-0.629116714419,-0.629042187783,-0.628967655365,-0.628893117166,-0.628818573186,-0.628744023427,-0.628669467888,-0.62859490657,-0.628520339475,-0.628445766602,-0.628371187953,-0.628296603527,-0.628222013327,-0.628147417352,-0.628072815604,-0.627998208082,-0.627923594788,-0.627848975722,-0.627774350885,-0.627699720278,-0.627625083901,-0.627550441755,-0.627475793841,-0.627401140159,-0.62732648071,-0.627251815495,-0.627177144515,-0.627102467769,-0.627027785259,-0.626953096986,-0.62687840295,-0.626803703152,-0.626728997592,-0.626654286272,-0.626579569192,-0.626504846352,-0.626430117753,-0.626355383397,-0.626280643283,-0.626205897412,-0.626131145786,-0.626056388404,-0.625981625268,-0.625906856378,-0.625832081735,-0.625757301339,-0.625682515191,-0.625607723292,-0.625532925643,-0.625458122244,-0.625383313096,-0.625308498199,-0.625233677555,-0.625158851164,-0.625084019026,-0.625009181143,-0.624934337515,-0.624859488142,-0.624784633026,-0.624709772168,-0.624634905566,-0.624560033224,-0.62448515514,-0.624410271317,-0.624335381754,-0.624260486452,-0.624185585412,-0.624110678635,-0.624035766121,-0.623960847871,-0.623885923886,-0.623810994166,-0.623736058713,-0.623661117526,-0.623586170606,-0.623511217955,-0.623436259572,-0.623361295459,-0.623286325616,-0.623211350044,-0.623136368744,-0.623061381715,-0.62298638896,-0.622911390479,-0.622836386271,-0.622761376339,-0.622686360683,-0.622611339302,-0.622536312199,-0.622461279374,-0.622386240827,-0.62231119656,-0.622236146572,-0.622161090865,-0.622086029439,-0.622010962295,-0.621935889433,-0.621860810855,-0.621785726561,-0.621710636551,-0.621635540827,-0.621560439389,-0.621485332238,-0.621410219374,-0.621335100798,-0.621259976511,-0.621184846514,-0.621109710806,-0.62103456939,-0.620959422265,-0.620884269433,-0.620809110893,-0.620733946647,-0.620658776696,-0.620583601039,-0.620508419679,-0.620433232614,-0.620358039847,-0.620282841378,-0.620207637207,-0.620132427335,-0.620057211763,-0.619981990492,-0.619906763522,-0.619831530854,-0.619756292488,-0.619681048426,-0.619605798668,-0.619530543215,-0.619455282067,-0.619380015225,-0.61930474269,-0.619229464462,-0.619154180543,-0.619078890932,-0.619003595631,-0.618928294641,-0.618852987961,-0.618777675593,-0.618702357537,-0.618627033794,-0.618551704365,-0.61847636925,-0.618401028451,-0.618325681967,-0.6182503298,-0.61817497195,-0.618099608417,-0.618024239204,-0.617948864309,-0.617873483735,-0.617798097481,-0.617722705548,-0.617647307938,-0.61757190465,-0.617496495686,-0.617421081045,-0.61734566073,-0.61727023474,-0.617194803076,-0.617119365739,-0.61704392273,-0.616968474049,-0.616893019697,-0.616817559674,-0.616742093982,-0.616666622621,-0.616591145592,-0.616515662895,-0.616440174531,-0.616364680501,-0.616289180805,-0.616213675445,-0.616138164421,-0.616062647733,-0.615987125382,-0.61591159737,-0.615836063696,-0.615760524361,-0.615684979367,-0.615609428713,-0.615533872401,-0.615458310431,-0.615382742804,-0.61530716952,-0.615231590581,-0.615156005986,-0.615080415737,-0.615004819834,-0.614929218279,-0.614853611071,-0.614777998211,-0.614702379701,-0.61462675554,-0.61455112573,-0.614475490271,-0.614399849164,-0.61432420241,-0.614248550008,-0.614172891961,-0.614097228268,-0.614021558931,-0.61394588395,-0.613870203325,-0.613794517058,-0.613718825149,-0.613643127599,-0.613567424408,-0.613491715578,-0.613416001109,-0.613340281001,-0.613264555255,-0.613188823873,-0.613113086854,-0.613037344199,-0.61296159591,-0.612885841986,-0.612810082429,-0.61273431724,-0.612658546417,-0.612582769964,-0.61250698788,-0.612431200166,-0.612355406822,-0.61227960785,-0.61220380325,-0.612127993022,-0.612052177169,-0.611976355689,-0.611900528584,-0.611824695854,-0.611748857501,-0.611673013525,-0.611597163926,-0.611521308706,-0.611445447865,-0.611369581403,-0.611293709322,-0.611217831622,-0.611141948304,-0.611066059369,-0.610990164816,-0.610914264648,-0.610838358864,-0.610762447465,-0.610686530453,-0.610610607827,-0.610534679588,-0.610458745738,-0.610382806276,-0.610306861204,-0.610230910522,-0.610154954231,-0.610078992332,-0.610003024825,-0.60992705171,-0.60985107299,-0.609775088664,-0.609699098733,-0.609623103198,-0.609547102059,-0.609471095317,-0.609395082973,-0.609319065028,-0.609243041482,-0.609167012336,-0.609090977591,-0.609014937247,-0.608938891305,-0.608862839766,-0.608786782631,-0.608710719899,-0.608634651573,-0.608558577652,-0.608482498137,-0.608406413029,-0.608330322329,-0.608254226037,-0.608178124155,-0.608102016682,-0.608025903619,-0.607949784968,-0.607873660728,-0.607797530901,-0.607721395488,-0.607645254488,-0.607569107903,-0.607492955733,-0.607416797979,-0.607340634643,-0.607264465723,-0.607188291222,-0.607112111139,-0.607035925477,-0.606959734234,-0.606883537412,-0.606807335012,-0.606731127035,-0.60665491348,-0.606578694349,-0.606502469643,-0.606426239361,-0.606350003506,-0.606273762077,-0.606197515076,-0.606121262502,-0.606045004357,-0.605968740642,-0.605892471356,-0.605816196502,-0.605739916078,-0.605663630087,-0.605587338529,-0.605511041404,-0.605434738714,-0.605358430459,-0.605282116639,-0.605205797255,-0.605129472309,-0.605053141801,-0.604976805731,-0.6049004641,-0.604824116909,-0.604747764159,-0.60467140585,-0.604595041983,-0.604518672558,-0.604442297577,-0.60436591704,-0.604289530948,-0.604213139302,-0.604136742101,-0.604060339348,-0.603983931042,-0.603907517184,-0.603831097776,-0.603754672817,-0.603678242308,-0.603601806251,-0.603525364646,-0.603448917493,-0.603372464793,-0.603296006547,-0.603219542756,-0.60314307342,-0.60306659854,-0.602990118117,-0.602913632152,-0.602837140644,-0.602760643596,-0.602684141007,-0.602607632878,-0.60253111921,-0.602454600004,-0.60237807526,-0.602301544979,-0.602225009162,-0.60214846781,-0.602071920922,-0.601995368501,-0.601918810546,-0.601842247059,-0.601765678039,-0.601689103488,-0.601612523407,-0.601535937795,-0.601459346655,-0.601382749986,-0.601306147789,-0.601229540065,-0.601152926815,-0.601076308039,-0.600999683738,-0.600923053913,-0.600846418564,-0.600769777693,-0.600693131299,-0.600616479384,-0.600539821948,-0.600463158992,-0.600386490517,-0.600309816523,-0.600233137011,-0.600156451982,-0.600079761437,-0.600003065375,-0.599926363799,-0.599849656708,-0.599772944104,-0.599696225986,-0.599619502356,-0.599542773215,-0.599466038563,-0.599389298401,-0.599312552729,-0.599235801548,-0.59915904486,-0.599082282664,-0.599005514961,-0.598928741752,-0.598851963039,-0.59877517882,-0.598698389098,-0.598621593873,-0.598544793146,-0.598467986916,-0.598391175186,-0.598314357955,-0.598237535225,-0.598160706996,-0.598083873269,-0.598007034045,-0.597930189323,-0.597853339106,-0.597776483393,-0.597699622186,-0.597622755484,-0.59754588329,-0.597469005603,-0.597392122424,-0.597315233754,-0.597238339593,-0.597161439943,-0.597084534804,-0.597007624177,-0.596930708062,-0.59685378646,-0.596776859373,-0.596699926799,-0.596622988741,-0.596546045199,-0.596469096174,-0.596392141666,-0.596315181676,-0.596238216205,-0.596161245253,-0.596084268822,-0.596007286911,-0.595930299522,-0.595853306656,-0.595776308312,-0.595699304492,-0.595622295197,-0.595545280427,-0.595468260183,-0.595391234465,-0.595314203275,-0.595237166612,-0.595160124479,-0.595083076875,-0.5950060238,-0.594928965257,-0.594851901245,-0.594774831766,-0.594697756819,-0.594620676407,-0.594543590528,-0.594466499185,-0.594389402377,-0.594312300106,-0.594235192372,-0.594158079176,-0.594080960519,-0.594003836401,-0.593926706823,-0.593849571785,-0.59377243129,-0.593695285336,-0.593618133925,-0.593540977058,-0.593463814735,-0.593386646958,-0.593309473725,-0.59323229504,-0.593155110901,-0.593077921311,-0.593000726268,-0.592923525776,-0.592846319833,-0.59276910844,-0.5926918916,-0.592614669311,-0.592537441575,-0.592460208393,-0.592382969764,-0.592305725691,-0.592228476174,-0.592151221212,-0.592073960808,-0.591996694962,-0.591919423674,-0.591842146946,-0.591764864777,-0.591687577169,-0.591610284122,-0.591532985637,-0.591455681715,-0.591378372357,-0.591301057562,-0.591223737333,-0.591146411669,-0.591069080572,-0.590991744041,-0.590914402078,-0.590837054684,-0.590759701859,-0.590682343604,-0.590604979919,-0.590527610805,-0.590450236264,-0.590372856295,-0.5902954709,-0.590218080079,-0.590140683832,-0.590063282161,-0.589985875067,-0.589908462549,-0.589831044609,-0.589753621248,-0.589676192466,-0.589598758263,-0.589521318641,-0.5894438736,-0.589366423141,-0.589288967265,-0.589211505973,-0.589134039264,-0.58905656714,-0.588979089602,-0.58890160665,-0.588824118285,-0.588746624507,-0.588669125318,-0.588591620718,-0.588514110708,-0.588436595288,-0.588359074459,-0.588281548223,-0.588204016579,-0.588126479528,-0.588048937072,-0.58797138921,-0.587893835943,-0.587816277273,-0.5877387132,-0.587661143725,-0.587583568848,-0.587505988569,-0.587428402891,-0.587350811813,-0.587273215337,-0.587195613462,-0.58711800619,-0.587040393521,-0.586962775456,-0.586885151996,-0.586807523142,-0.586729888893,-0.586652249252,-0.586574604218,-0.586496953793,-0.586419297976,-0.58634163677,-0.586263970174,-0.586186298189,-0.586108620815,-0.586030938055,-0.585953249908,-0.585875556375,-0.585797857456,-0.585720153154,-0.585642443467,-0.585564728397,-0.585487007945,-0.585409282111,-0.585331550896,-0.585253814301,-0.585176072327,-0.585098324973,-0.585020572242,-0.584942814133,-0.584865050648,-0.584787281786,-0.584709507549,-0.584631727938,-0.584553942953,-0.584476152595,-0.584398356864,-0.584320555762,-0.584242749289,-0.584164937446,-0.584087120233,-0.584009297651,-0.583931469701,-0.583853636384,-0.5837757977,-0.583697953651,-0.583620104236,-0.583542249456,-0.583464389313,-0.583386523806,-0.583308652938,-0.583230776707,-0.583152895116,-0.583075008164,-0.582997115853,-0.582919218184,-0.582841315156,-0.582763406771,-0.582685493029,-0.582607573931,-0.582529649478,-0.58245171967,-0.582373784509,-0.582295843995,-0.582217898128,-0.58213994691,-0.582061990341,-0.581984028421,-0.581906061153,-0.581828088535,-0.581750110569,-0.581672127256,-0.581594138597,-0.581516144591,-0.581438145241,-0.581360140546,-0.581282130507,-0.581204115125,-0.581126094401,-0.581048068335,-0.580970036929,-0.580892000182,-0.580813958096,-0.580735910671,-0.580657857908,-0.580579799808,-0.580501736371,-0.580423667598,-0.580345593491,-0.580267514049,-0.580189429273,-0.580111339164,-0.580033243723,-0.57995514295,-0.579877036847,-0.579798925413,-0.579720808651,-0.579642686559,-0.579564559139,-0.579486426393,-0.579408288319,-0.57933014492,-0.579251996196,-0.579173842148,-0.579095682775,-0.57901751808,-0.578939348063,-0.578861172724,-0.578782992065,-0.578704806085,-0.578626614786,-0.578548418169,-0.578470216233,-0.578392008981,-0.578313796412,-0.578235578527,-0.578157355327,-0.578079126813,-0.578000892985,-0.577922653845,-0.577844409392,-0.577766159628,-0.577687904553,-0.577609644168,-0.577531378474,-0.577453107472,-0.577374831161,-0.577296549544,-0.57721826262,-0.57713997039,-0.577061672856,-0.576983370017,-0.576905061875,-0.57682674843,-0.576748429682,-0.576670105634,-0.576591776285,-0.576513441636,-0.576435101688,-0.576356756441,-0.576278405897,-0.576200050055,-0.576121688917,-0.576043322484,-0.575964950756,-0.575886573734,-0.575808191418,-0.575729803809,-0.575651410909,-0.575573012717,-0.575494609235,-0.575416200463,-0.575337786402,-0.575259367052,-0.575180942415,-0.575102512491,-0.57502407728,-0.574945636784,-0.574867191004,-0.574788739939,-0.574710283591,-0.57463182196,-0.574553355048,-0.574474882854,-0.57439640538,-0.574317922626,-0.574239434593,-0.574160941282,-0.574082442693,-0.574003938827,-0.573925429686,-0.573846915269,-0.573768395577,-0.573689870611,-0.573611340372,-0.57353280486,-0.573454264077,-0.573375718023,-0.573297166698,-0.573218610104,-0.57314004824,-0.573061481109,-0.57298290871,-0.572904331045,-0.572825748113,-0.572747159916,-0.572668566454,-0.572589967729,-0.572511363741,-0.57243275449,-0.572354139977,-0.572275520204,-0.57219689517,-0.572118264877,-0.572039629325,-0.571960988515,-0.571882342447,-0.571803691123,-0.571725034543,-0.571646372708,-0.571567705618,-0.571489033275,-0.571410355679,-0.57133167283,-0.57125298473,-0.571174291379,-0.571095592778,-0.571016888928,-0.570938179828,-0.570859465481,-0.570780745887,-0.570702021046,-0.57062329096,-0.570544555628,-0.570465815052,-0.570387069232,-0.57030831817,-0.570229561865,-0.570150800319,-0.570072033533,-0.569993261506,-0.56991448424,-0.569835701736,-0.569756913993,-0.569678121014,-0.569599322798,-0.569520519347,-0.569441710661,-0.56936289674,-0.569284077586,-0.5692052532,-0.569126423581,-0.569047588731,-0.568968748651,-0.56888990334,-0.568811052801,-0.568732197033,-0.568653336037,-0.568574469815,-0.568495598366,-0.568416721692,-0.568337839793,-0.56825895267,-0.568180060324,-0.568101162755,-0.568022259964,-0.567943351952,-0.56786443872,-0.567785520268,-0.567706596597,-0.567627667708,-0.567548733601,-0.567469794278,-0.567390849738,-0.567311899983,-0.567232945014,-0.567153984831,-0.567075019434,-0.566996048825,-0.566917073004,-0.566838091973,-0.566759105731,-0.56668011428,-0.566601117619,-0.566522115751,-0.566443108675,-0.566364096393,-0.566285078905,-0.566206056212,-0.566127028314,-0.566047995212,-0.565968956908,-0.565889913401,-0.565810864693,-0.565731810784,-0.565652751674,-0.565573687366,-0.565494617859,-0.565415543154,-0.565336463251,-0.565257378153,-0.565178287858,-0.565099192369,-0.565020091685,-0.564940985808,-0.564861874738,-0.564782758476,-0.564703637022,-0.564624510378,-0.564545378544,-0.564466241521,-0.564387099309,-0.564307951909,-0.564228799323,-0.56414964155,-0.564070478592,-0.563991310449,-0.563912137122,-0.563832958611,-0.563753774918,-0.563674586043,-0.563595391987,-0.56351619275,-0.563436988334,-0.563357778739,-0.563278563965,-0.563199344014,-0.563120118886,-0.563040888582,-0.562961653102,-0.562882412448,-0.56280316662,-0.562723915619,-0.562644659446,-0.562565398101,-0.562486131584,-0.562406859898,-0.562327583042,-0.562248301017,-0.562169013824,-0.562089721464,-0.562010423937,-0.561931121245,-0.561851813387,-0.561772500365,-0.561693182179,-0.56161385883,-0.561534530319,-0.561455196646,-0.561375857813,-0.561296513819,-0.561217164666,-0.561137810355,-0.561058450886,-0.560979086259,-0.560899716477,-0.560820341538,-0.560740961445,-0.560661576197,-0.560582185796,-0.560502790242,-0.560423389537,-0.56034398368,-0.560264572672,-0.560185156514,-0.560105735208,-0.560026308753,-0.55994687715,-0.559867440401,-0.559787998505,-0.559708551464,-0.559629099278,-0.559549641948,-0.559470179475,-0.559390711859,-0.559311239102,-0.559231761203,-0.559152278164,-0.559072789986,-0.558993296668,-0.558913798213,-0.55883429462,-0.55875478589,-0.558675272025,-0.558595753024,-0.558516228889,-0.55843669962,-0.558357165218,-0.558277625683,-0.558198081017,-0.558118531221,-0.558038976294,-0.557959416237,-0.557879851053,-0.55780028074,-0.5577207053,-0.557641124733,-0.557561539041,-0.557481948224,-0.557402352283,-0.557322751218,-0.55724314503,-0.55716353372,-0.557083917289,-0.557004295737,-0.556924669066,-0.556845037275,-0.556765400366,-0.556685758339,-0.556606111196,-0.556526458936,-0.55644680156,-0.55636713907,-0.556287471466,-0.556207798749,-0.556128120919,-0.556048437977,-0.555968749924,-0.555889056761,-0.555809358488,-0.555729655107,-0.555649946617,-0.55557023302,-0.555490514316,-0.555410790506,-0.555331061591,-0.555251327571,-0.555171588448,-0.555091844222,-0.555012094893,-0.554932340463,-0.554852580932,-0.554772816301,-0.55469304657,-0.554613271741,-0.554533491814,-0.55445370679,-0.55437391667,-0.554294121454,-0.554214321142,-0.554134515737,-0.554054705238,-0.553974889647,-0.553895068963,-0.553815243188,-0.553735412323,-0.553655576367,-0.553575735323,-0.55349588919,-0.55341603797,-0.553336181663,-0.55325632027,-0.553176453791,-0.553096582227,-0.55301670558,-0.552936823849,-0.552856937036,-0.552777045142,-0.552697148166,-0.55261724611,-0.552537338974,-0.55245742676,-0.552377509467,-0.552297587097,-0.552217659651,-0.552137727129,-0.552057789531,-0.551977846859,-0.551897899114,-0.551817946295,-0.551737988405,-0.551658025443,-0.55157805741,-0.551498084307,-0.551418106135,-0.551338122894,-0.551258134586,-0.551178141211,-0.551098142769,-0.551018139262,-0.55093813069,-0.550858117053,-0.550778098354,-0.550698074592,-0.550618045768,-0.550538011882,-0.550457972937,-0.550377928931,-0.550297879867,-0.550217825744,-0.550137766564,-0.550057702327,-0.549977633035,-0.549897558687,-0.549817479284,-0.549737394827,-0.549657305318,-0.549577210756,-0.549497111143,-0.549417006478,-0.549336896764,-0.549256782,-0.549176662188,-0.549096537327,-0.54901640742,-0.548936272466,-0.548856132466,-0.548775987421,-0.548695837333,-0.5486156822,-0.548535522025,-0.548455356808,-0.548375186549,-0.54829501125,-0.548214830912,-0.548134645534,-0.548054455118,-0.547974259664,-0.547894059173,-0.547813853646,-0.547733643084,-0.547653427487,-0.547573206857,-0.547492981193,-0.547412750496,-0.547332514768,-0.547252274009,-0.54717202822,-0.547091777401,-0.547011521554,-0.546931260678,-0.546850994775,-0.546770723846,-0.546690447891,-0.546610166911,-0.546529880906,-0.546449589878,-0.546369293827,-0.546288992754,-0.54620868666,-0.546128375545,-0.54604805941,-0.545967738256,-0.545887412083,-0.545807080893,-0.545726744686,-0.545646403463,-0.545566057224,-0.54548570597,-0.545405349703,-0.545324988422,-0.545244622129,-0.545164250824,-0.545083874508,-0.545003493181,-0.544923106845,-0.544842715501,-0.544762319148,-0.544681917788,-0.544601511421,-0.544521100048,-0.544440683671,-0.544360262288,-0.544279835903,-0.544199404514,-0.544118968123,-0.544038526731,-0.543958080338,-0.543877628945,-0.543797172553,-0.543716711162,-0.543636244774,-0.543555773389,-0.543475297007,-0.54339481563,-0.543314329258,-0.543233837893,-0.543153341534,-0.543072840182,-0.542992333838,-0.542911822504,-0.542831306179,-0.542750784865,-0.542670258561,-0.54258972727,-0.542509190991,-0.542428649726,-0.542348103474,-0.542267552238,-0.542186996017,-0.542106434812,-0.542025868625,-0.541945297455,-0.541864721304,-0.541784140172,-0.541703554061,-0.54162296297,-0.5415423669,-0.541461765853,-0.541381159829,-0.541300548828,-0.541219932853,-0.541139311902,-0.541058685977,-0.540978055079,-0.540897419208,-0.540816778366,-0.540736132552,-0.540655481768,-0.540574826015,-0.540494165293,-0.540413499602,-0.540332828945,-0.54025215332,-0.54017147273,-0.540090787174,-0.540010096655,-0.539929401171,-0.539848700725,-0.539767995316,-0.539687284946,-0.539606569616,-0.539525849325,-0.539445124075,-0.539364393867,-0.539283658701,-0.539202918578,-0.539122173499,-0.539041423464,-0.538960668474,-0.538879908531,-0.538799143634,-0.538718373785,-0.538637598984,-0.538556819232,-0.538476034529,-0.538395244877,-0.538314450277,-0.538233650728,-0.538152846232,-0.538072036789,-0.5379912224,-0.537910403067,-0.537829578789,-0.537748749567,-0.537667915402,-0.537587076296,-0.537506232248,-0.537425383259,-0.53734452933,-0.537263670463,-0.537182806656,-0.537101937913,-0.537021064232,-0.536940185615,-0.536859302062,-0.536778413575,-0.536697520154,-0.5366166218,-0.536535718513,-0.536454810295,-0.536373897146,-0.536292979066,-0.536212056057,-0.536131128119,-0.536050195253,-0.53596925746,-0.53588831474,-0.535807367095,-0.535726414524,-0.53564545703,-0.535564494611,-0.53548352727,-0.535402555007,-0.535321577823,-0.535240595718,-0.535159608693,-0.535078616749,-0.534997619887,-0.534916618107,-0.534835611411,-0.534754599798,-0.53467358327,-0.534592561827,-0.534511535471,-0.534430504201,-0.534349468019,-0.534268426926,-0.534187380921,-0.534106330006,-0.534025274182,-0.53394421345,-0.533863147809,-0.533782077261,-0.533701001807,-0.533619921447,-0.533538836183,-0.533457746014,-0.533376650941,-0.533295550966,-0.533214446089,-0.533133336311,-0.533052221633,-0.532971102054,-0.532889977577,-0.532808848202,-0.532727713929,-0.532646574759,-0.532565430693,-0.532484281733,-0.532403127877,-0.532321969128,-0.532240805486,-0.532159636952,-0.532078463526,-0.531997285209,-0.531916102003,-0.531834913907,-0.531753720923,-0.531672523051,-0.531591320292,-0.531510112646,-0.531428900115,-0.5313476827,-0.5312664604,-0.531185233217,-0.531104001151,-0.531022764204,-0.530941522376,-0.530860275667,-0.530779024079,-0.530697767612,-0.530616506266,-0.530535240044,-0.530453968945,-0.53037269297,-0.53029141212,-0.530210126396,-0.530128835798,-0.530047540328,-0.529966239985,-0.529884934771,-0.529803624686,-0.529722309732,-0.529640989908,-0.529559665216,-0.529478335657,-0.52939700123,-0.529315661938,-0.52923431778,-0.529152968758,-0.529071614872,-0.528990256122,-0.52890889251,-0.528827524037,-0.528746150703,-0.528664772508,-0.528583389455,-0.528502001542,-0.528420608772,-0.528339211145,-0.528257808661,-0.528176401321,-0.528094989127,-0.528013572079,-0.527932150177,-0.527850723423,-0.527769291816,-0.527687855359,-0.527606414051,-0.527524967893,-0.527443516887,-0.527362061032,-0.52728060033,-0.527199134782,-0.527117664387,-0.527036189148,-0.526954709064,-0.526873224136,-0.526791734365,-0.526710239753,-0.526628740298,-0.526547236004,-0.526465726869,-0.526384212895,-0.526302694083,-0.526221170433,-0.526139641946,-0.526058108623,-0.525976570464,-0.525895027471,-0.525813479644,-0.525731926984,-0.525650369491,-0.525568807167,-0.525487240012,-0.525405668026,-0.525324091212,-0.525242509568,-0.525160923097,-0.525079331798,-0.524997735673,-0.524916134723,-0.524834528947,-0.524752918347,-0.524671302924,-0.524589682678,-0.524508057611,-0.524426427722,-0.524344793013,-0.524263153484,-0.524181509136,-0.52409985997,-0.524018205986,-0.523936547186,-0.52385488357,-0.523773215139,-0.523691541893,-0.523609863834,-0.523528180962,-0.523446493278,-0.523364800782,-0.523283103476,-0.523201401359,-0.523119694434,-0.5230379827,-0.522956266159,-0.52287454481,-0.522792818656,-0.522711087696,-0.522629351931,-0.522547611363,-0.522465865991,-0.522384115817,-0.522302360841,-0.522220601065,-0.522138836488,-0.522057067112,-0.521975292937,-0.521893513965,-0.521811730195,-0.521729941629,-0.521648148267,-0.52156635011,-0.521484547159,-0.521402739415,-0.521320926879,-0.52123910955,-0.52115728743,-0.52107546052,-0.52099362882,-0.520911792332,-0.520829951055,-0.520748104991,-0.52066625414,-0.520584398504,-0.520502538082,-0.520420672876,-0.520338802887,-0.520256928114,-0.52017504856,-0.520093164224,-0.520011275108,-0.519929381211,-0.519847482536,-0.519765579082,-0.519683670851,-0.519601757843,-0.519519840059,-0.5194379175,-0.519355990166,-0.519274058058,-0.519192121177,-0.519110179524,-0.519028233099,-0.518946281904,-0.518864325938,-0.518782365203,-0.5187003997,-0.518618429429,-0.518536454391,-0.518454474586,-0.518372490016,-0.518290500681,-0.518208506583,-0.518126507721,-0.518044504096,-0.51796249571,-0.517880482562,-0.517798464655,-0.517716441988,-0.517634414562,-0.517552382378,-0.517470345437,-0.51738830374,-0.517306257287,-0.517224206079,-0.517142150116,-0.5170600894,-0.516978023932,-0.516895953711,-0.51681387874,-0.516731799018,-0.516649714546,-0.516567625325,-0.516485531356,-0.51640343264,-0.516321329177,-0.516239220968,-0.516157108014,-0.516074990315,-0.515992867873,-0.515910740688,-0.515828608761,-0.515746472092,-0.515664330683,-0.515582184534,-0.515500033646,-0.515417878019,-0.515335717655,-0.515253552554,-0.515171382717,-0.515089208145,-0.515007028838,-0.514924844797,-0.514842656023,-0.514760462517,-0.514678264279,-0.51459606131,-0.514513853611,-0.514431641183,-0.514349424027,-0.514267202142,-0.514184975531,-0.514102744193,-0.51402050813,-0.513938267342,-0.51385602183,-0.513773771595,-0.513691516637,-0.513609256958,-0.513526992557,-0.513444723437,-0.513362449596,-0.513280171038,-0.513197887761,-0.513115599767,-0.513033307056,-0.51295100963,-0.512868707489,-0.512786400634,-0.512704089065,-0.512621772783,-0.51253945179,-0.512457126086,-0.512374795671,-0.512292460546,-0.512210120713,-0.512127776172,-0.512045426923,-0.511963072967,-0.511880714306,-0.511798350939,-0.511715982869,-0.511633610094,-0.511551232617,-0.511468850438,-0.511386463557,-0.511304071976,-0.511221675695,-0.511139274715,-0.511056869037,-0.510974458661,-0.510892043589,-0.51080962382,-0.510727199357,-0.510644770198,-0.510562336346,-0.510479897801,-0.510397454564,-0.510315006635,-0.510232554016,-0.510150096707,-0.510067634708,-0.509985168021,-0.509902696647,-0.509820220585,-0.509737739837,-0.509655254404,-0.509572764287,-0.509490269485,-0.50940777,-0.509325265833,-0.509242756984,-0.509160243455,-0.509077725245,-0.508995202356,-0.508912674789,-0.508830142543,-0.508747605621,-0.508665064022,-0.508582517748,-0.508499966799,-0.508417411175,-0.508334850879,-0.50825228591,-0.50816971627,-0.508087141958,-0.508004562976,-0.507921979325,-0.507839391005,-0.507756798017,-0.507674200362,-0.50759159804,-0.507508991053,-0.507426379401,-0.507343763084,-0.507261142105,-0.507178516462,-0.507095886158,-0.507013251193,-0.506930611567,-0.506847967282,-0.506765318338,-0.506682664736,-0.506600006476,-0.50651734356,-0.506434675988,-0.506352003761,-0.50626932688,-0.506186645345,-0.506103959158,-0.506021268318,-0.505938572827,-0.505855872686,-0.505773167895,-0.505690458455,-0.505607744367,-0.505525025632,-0.50544230225,-0.505359574222,-0.505276841548,-0.505194104231,-0.505111362269,-0.505028615665,-0.504945864419,-0.504863108531,-0.504780348003,-0.504697582835,-0.504614813028,-0.504532038582,-0.504449259499,-0.50436647578,-0.504283687424,-0.504200894433,-0.504118096807,-0.504035294548,-0.503952487655,-0.503869676131,-0.503786859975,-0.503704039188,-0.503621213772,-0.503538383726,-0.503455549051,-0.50337270975,-0.503289865821,-0.503207017266,-0.503124164086,-0.503041306281,-0.502958443852,-0.5028755768,-0.502792705126,-0.50270982883,-0.502626947914,-0.502544062377,-0.502461172221,-0.502378277447,-0.502295378055,-0.502212474046,-0.50212956542,-0.50204665218,-0.501963734324,-0.501880811855,-0.501797884772,-0.501714953077,-0.50163201677,-0.501549075853,-0.501466130325,-0.501383180188,-0.501300225442,-0.501217266089,-0.501134302128,-0.501051333561,-0.500968360389,-0.500885382611,-0.50080240023,-0.500719413245,-0.500636421658,-0.500553425469,-0.50047042468,-0.50038741929,-0.5003044093,-0.500221394712,-0.500138375526,-0.500055351742,-0.499972323363,-0.499889290387,-0.499806252817,-0.499723210653,-0.499640163895,-0.499557112545,-0.499474056603,-0.49939099607,-0.499307930946,-0.499224861234,-0.499141786932,-0.499058708042,-0.498975624565,-0.498892536502,-0.498809443853,-0.498726346619,-0.4986432448,-0.498560138399,-0.498477027414,-0.498393911848,-0.498310791701,-0.498227666973,-0.498144537665,-0.498061403779,-0.497978265315,-0.497895122273,-0.497811974655,-0.497728822461,-0.497645665692,-0.497562504349,-0.497479338433,-0.497396167943,-0.497312992882,-0.497229813249,-0.497146629046,-0.497063440274,-0.496980246932,-0.496897049023,-0.496813846546,-0.496730639502,-0.496647427893,-0.496564211718,-0.496480990979,-0.496397765677,-0.496314535811,-0.496231301384,-0.496148062396,-0.496064818847,-0.495981570738,-0.495898318071,-0.495815060845,-0.495731799061,-0.495648532722,-0.495565261826,-0.495481986375,-0.49539870637,-0.495315421811,-0.495232132699,-0.495148839035,-0.49506554082,-0.494982238054,-0.494898930739,-0.494815618875,-0.494732302462,-0.494648981502,-0.494565655995,-0.494482325942,-0.494398991344,-0.494315652202,-0.494232308516,-0.494148960287,-0.494065607516,-0.493982250204,-0.493898888351,-0.493815521958,-0.493732151026,-0.493648775556,-0.493565395549,-0.493482011004,-0.493398621924,-0.493315228309,-0.493231830159,-0.493148427475,-0.493065020259,-0.49298160851,-0.49289819223,-0.492814771419,-0.492731346079,-0.492647916209,-0.492564481811,-0.492481042886,-0.492397599433,-0.492314151455,-0.492230698951,-0.492147241923,-0.492063780372,-0.491980314297,-0.4918968437,-0.491813368582,-0.491729888943,-0.491646404784,-0.491562916107,-0.49147942291,-0.491395925197,-0.491312422966,-0.491228916219,-0.491145404957,-0.491061889181,-0.490978368891,-0.490894844088,-0.490811314773,-0.490727780946,-0.490644242608,-0.490560699761,-0.490477152405,-0.49039360054,-0.490310044167,-0.490226483288,-0.490142917903,-0.490059348012,-0.489975773617,-0.489892194719,-0.489808611317,-0.489725023413,-0.489641431007,-0.489557834101,-0.489474232695,-0.48939062679,-0.489307016386,-0.489223401485,-0.489139782087,-0.489056158193,-0.488972529804,-0.48888889692,-0.488805259542,-0.488721617671,-0.488637971309,-0.488554320454,-0.488470665109,-0.488387005274,-0.48830334095,-0.488219672138,-0.488135998838,-0.488052321051,-0.487968638778,-0.487884952019,-0.487801260776,-0.48771756505,-0.48763386484,-0.487550160148,-0.487466450975,-0.487382737321,-0.487299019187,-0.487215296574,-0.487131569483,-0.487047837914,-0.486964101868,-0.486880361346,-0.486796616349,-0.486712866877,-0.486629112932,-0.486545354513,-0.486461591622,-0.48637782426,-0.486294052427,-0.486210276124,-0.486126495353,-0.486042710112,-0.485958920404,-0.48587512623,-0.485791327589,-0.485707524483,-0.485623716912,-0.485539904878,-0.485456088381,-0.485372267421,-0.485288442,-0.485204612119,-0.485120777777,-0.485036938976,-0.484953095717,-0.484869248001,-0.484785395827,-0.484701539198,-0.484617678113,-0.484533812574,-0.484449942581,-0.484366068135,-0.484282189237,-0.484198305888,-0.484114418087,-0.484030525837,-0.483946629138,-0.483862727991,-0.483778822396,-0.483694912354,-0.483610997866,-0.483527078933,-0.483443155555,-0.483359227734,-0.48327529547,-0.483191358763,-0.483107417616,-0.483023472027,-0.482939521999,-0.482855567532,-0.482771608626,-0.482687645283,-0.482603677503,-0.482519705287,-0.482435728636,-0.482351747551,-0.482267762031,-0.482183772079,-0.482099777695,-0.482015778879,-0.481931775633,-0.481847767957,-0.481763755852,-0.481679739319,-0.481595718358,-0.48151169297,-0.481427663157,-0.481343628918,-0.481259590255,-0.481175547168,-0.481091499659,-0.481007447727,-0.480923391374,-0.4808393306,-0.480755265407,-0.480671195795,-0.480587121764,-0.480503043316,-0.480418960451,-0.480334873171,-0.480250781475,-0.480166685365,-0.480082584841,-0.479998479905,-0.479914370556,-0.479830256797,-0.479746138626,-0.479662016046,-0.479577889057,-0.47949375766,-0.479409621856,-0.479325481644,-0.479241337027,-0.479157188005,-0.479073034579,-0.478988876749,-0.478904714516,-0.478820547881,-0.478736376845,-0.478652201409,-0.478568021573,-0.478483837338,-0.478399648705,-0.478315455675,-0.478231258248,-0.478147056425,-0.478062850207,-0.477978639595,-0.477894424589,-0.477810205191,-0.477725981401,-0.47764175322,-0.477557520648,-0.477473283687,-0.477389042337,-0.477304796598,-0.477220546473,-0.477136291961,-0.477052033063,-0.47696776978,-0.476883502114,-0.476799230063,-0.47671495363,-0.476630672816,-0.47654638762,-0.476462098044,-0.476377804088,-0.476293505753,-0.476209203041,-0.476124895951,-0.476040584485,-0.475956268643,-0.475871948427,-0.475787623836,-0.475703294872,-0.475618961535,-0.475534623827,-0.475450281747,-0.475365935297,-0.475281584478,-0.47519722929,-0.475112869735,-0.475028505812,-0.474944137522,-0.474859764868,-0.474775387848,-0.474691006464,-0.474606620717,-0.474522230608,-0.474437836137,-0.474353437305,-0.474269034112,-0.474184626561,-0.474100214651,-0.474015798383,-0.473931377757,-0.473846952776,-0.473762523439,-0.473678089748,-0.473593651702,-0.473509209303,-0.473424762552,-0.47334031145,-0.473255855996,-0.473171396192,-0.473086932039,-0.473002463538,-0.472917990689,-0.472833513493,-0.47274903195,-0.472664546063,-0.47258005583,-0.472495561254,-0.472411062335,-0.472326559073,-0.47224205147,-0.472157539526,-0.472073023242,-0.471988502619,-0.471903977658,-0.471819448359,-0.471734914723,-0.471650376751,-0.471565834443,-0.471481287802,-0.471396736826,-0.471312181517,-0.471227621877,-0.471143057904,-0.471058489601,-0.470973916969,-0.470889340007,-0.470804758717,-0.470720173099,-0.470635583155,-0.470550988884,-0.470466390289,-0.470381787369,-0.470297180125,-0.470212568558,-0.47012795267,-0.47004333246,-0.469958707929,-0.469874079079,-0.46978944591,-0.469704808422,-0.469620166617,-0.469535520496,-0.469450870058,-0.469366215306,-0.469281556239,-0.469196892859,-0.469112225165,-0.46902755316,-0.468942876844,-0.468858196217,-0.468773511281,-0.468688822036,-0.468604128483,-0.468519430622,-0.468434728455,-0.468350021982,-0.468265311204,-0.468180596122,-0.468095876736,-0.468011153048,-0.467926425058,-0.467841692767,-0.467756956176,-0.467672215285,-0.467587470095,-0.467502720608,-0.467417966823,-0.467333208742,-0.467248446365,-0.467163679694,-0.467078908728,-0.466994133469,-0.466909353917,-0.466824570074,-0.46673978194,-0.466654989516,-0.466570192802,-0.466485391799,-0.466400586509,-0.466315776932,-0.466230963068,-0.466146144919,-0.466061322486,-0.465976495768,-0.465891664767,-0.465806829484,-0.465721989919,-0.465637146073,-0.465552297948,-0.465467445543,-0.46538258886,-0.465297727898,-0.46521286266,-0.465127993146,-0.465043119357,-0.464958241293,-0.464873358955,-0.464788472344,-0.464703581461,-0.464618686306,-0.464533786881,-0.464448883186,-0.464363975222,-0.464279062989,-0.464194146489,-0.464109225722,-0.464024300689,-0.463939371391,-0.463854437828,-0.463769500002,-0.463684557913,-0.463599611562,-0.463514660949,-0.463429706076,-0.463344746944,-0.463259783552,-0.463174815902,-0.463089843995,-0.463004867831,-0.462919887411,-0.462834902736,-0.462749913807,-0.462664920624,-0.462579923189,-0.462494921502,-0.462409915563,-0.462324905375,-0.462239890936,-0.462154872249,-0.462069849314,-0.461984822131,-0.461899790702,-0.461814755028,-0.461729715108,-0.461644670945,-0.461559622538,-0.461474569888,-0.461389512997,-0.461304451865,-0.461219386492,-0.46113431688,-0.46104924303,-0.460964164941,-0.460879082616,-0.460793996054,-0.460708905256,-0.460623810224,-0.460538710958,-0.460453607459,-0.460368499727,-0.460283387764,-0.46019827157,-0.460113151146,-0.460028026493,-0.459942897611,-0.459857764501,-0.459772627165,-0.459687485602,-0.459602339814,-0.459517189802,-0.459432035566,-0.459346877106,-0.459261714425,-0.459176547522,-0.459091376398,-0.459006201055,-0.458921021492,-0.458835837712,-0.458750649713,-0.458665457498,-0.458580261067,-0.458495060421,-0.45840985556,-0.458324646486,-0.458239433199,-0.4581542157,-0.45806899399,-0.457983768069,-0.457898537938,-0.457813303599,-0.457728065051,-0.457642822297,-0.457557575335,-0.457472324168,-0.457387068796,-0.457301809219,-0.45721654544,-0.457131277457,-0.457046005273,-0.456960728888,-0.456875448302,-0.456790163517,-0.456704874533,-0.456619581351,-0.456534283972,-0.456448982397,-0.456363676626,-0.45627836666,-0.456193052501,-0.456107734148,-0.456022411602,-0.455937084865,-0.455851753937,-0.455766418819,-0.455681079512,-0.455595736016,-0.455510388333,-0.455425036462,-0.455339680406,-0.455254320163,-0.455168955737,-0.455083587126,-0.454998214333,-0.454912837357,-0.4548274562,-0.454742070862,-0.454656681344,-0.454571287647,-0.454485889772,-0.454400487719,-0.45431508149,-0.454229671084,-0.454144256504,-0.454058837749,-0.45397341482,-0.453887987718,-0.453802556445,-0.453717121,-0.453631681385,-0.4535462376,-0.453460789646,-0.453375337524,-0.453289881235,-0.453204420779,-0.453118956157,-0.453033487371,-0.45294801442,-0.452862537306,-0.452777056029,-0.452691570591,-0.452606080991,-0.452520587231,-0.452435089312,-0.452349587234,-0.452264080998,-0.452178570605,-0.452093056055,-0.45200753735,-0.451922014491,-0.451836487477,-0.45175095631,-0.451665420991,-0.45157988152,-0.451494337898,-0.451408790127,-0.451323238206,-0.451237682136,-0.451152121919,-0.451066557555,-0.450980989045,-0.45089541639,-0.45080983959,-0.450724258646,-0.450638673559,-0.45055308433,-0.45046749096,-0.450381893449,-0.450296291799,-0.450210686009,-0.450125076081,-0.450039462016,-0.449953843814,-0.449868221476,-0.449782595003,-0.449696964395,-0.449611329655,-0.449525690781,-0.449440047776,-0.449354400639,-0.449268749372,-0.449183093975,-0.44909743445,-0.449011770796,-0.448926103016,-0.448840431109,-0.448754755076,-0.448669074918,-0.448583390637,-0.448497702232,-0.448412009704,-0.448326313055,-0.448240612285,-0.448154907395,-0.448069198386,-0.447983485257,-0.447897768012,-0.447812046649,-0.44772632117,-0.447640591575,-0.447554857866,-0.447469120043,-0.447383378108,-0.447297632059,-0.4472118819,-0.447126127629,-0.447040369249,-0.44695460676,-0.446868840162,-0.446783069457,-0.446697294645,-0.446611515728,-0.446525732705,-0.446439945577,-0.446354154346,-0.446268359013,-0.446182559577,-0.44609675604,-0.446010948403,-0.445925136666,-0.44583932083,-0.445753500896,-0.445667676865,-0.445581848737,-0.445496016514,-0.445410180196,-0.445324339783,-0.445238495278,-0.44515264668,-0.44506679399,-0.444980937209,-0.444895076338,-0.444809211377,-0.444723342328,-0.444637469191,-0.444551591967,-0.444465710657,-0.444379825262,-0.444293935782,-0.444208042218,-0.44412214457,-0.444036242841,-0.44395033703,-0.443864427139,-0.443778513167,-0.443692595117,-0.443606672988,-0.443520746781,-0.443434816498,-0.443348882139,-0.443262943705,-0.443177001196,-0.443091054614,-0.443005103959,-0.442919149232,-0.442833190433,-0.442747227565,-0.442661260626,-0.442575289619,-0.442489314544,-0.442403335401,-0.442317352192,-0.442231364918,-0.442145373578,-0.442059378174,-0.441973378707,-0.441887375178,-0.441801367586,-0.441715355934,-0.441629340222,-0.44154332045,-0.44145729662,-0.441371268732,-0.441285236787,-0.441199200785,-0.441113160729,-0.441027116617,-0.440941068452,-0.440855016234,-0.440768959964,-0.440682899642,-0.440596835269,-0.440510766847,-0.440424694375,-0.440338617856,-0.440252537288,-0.440166452675,-0.440080364015,-0.43999427131,-0.43990817456,-0.439822073767,-0.439735968932,-0.439649860054,-0.439563747135,-0.439477630176,-0.439391509178,-0.43930538414,-0.439219255065,-0.439133121952,-0.439046984803,-0.438960843618,-0.438874698398,-0.438788549145,-0.438702395858,-0.438616238539,-0.438530077188,-0.438443911806,-0.438357742394,-0.438271568952,-0.438185391483,-0.438099209985,-0.438013024461,-0.43792683491,-0.437840641334,-0.437754443734,-0.43766824211,-0.437582036463,-0.437495826794,-0.437409613103,-0.437323395392,-0.437237173661,-0.437150947911,-0.437064718143,-0.436978484357,-0.436892246555,-0.436806004737,-0.436719758904,-0.436633509057,-0.436547255196,-0.436460997323,-0.436374735438,-0.436288469542,-0.436202199635,-0.436115925719,-0.436029647794,-0.435943365862,-0.435857079922,-0.435770789976,-0.435684496025,-0.435598198069,-0.435511896108,-0.435425590145,-0.43533928018,-0.435252966213,-0.435166648245,-0.435080326277,-0.43499400031,-0.434907670344,-0.434821336381,-0.434734998422,-0.434648656466,-0.434562310515,-0.43447596057,-0.434389606631,-0.434303248699,-0.434216886775,-0.43413052086,-0.434044150955,-0.43395777706,-0.433871399176,-0.433785017304,-0.433698631444,-0.433612241599,-0.433525847767,-0.433439449951,-0.433353048151,-0.433266642367,-0.433180232601,-0.433093818853,-0.433007401124,-0.432920979416,-0.432834553727,-0.432748124061,-0.432661690416,-0.432575252795,-0.432488811198,-0.432402365625,-0.432315916077,-0.432229462556,-0.432143005062,-0.432056543596,-0.431970078158,-0.43188360875,-0.431797135372,-0.431710658025,-0.43162417671,-0.431537691427,-0.431451202178,-0.431364708963,-0.431278211783,-0.431191710639,-0.431105205531,-0.431018696461,-0.430932183429,-0.430845666436,-0.430759145483,-0.43067262057,-0.430586091698,-0.430499558869,-0.430413022083,-0.43032648134,-0.430239936642,-0.430153387989,-0.430066835383,-0.429980278823,-0.429893718311,-0.429807153847,-0.429720585433,-0.429634013069,-0.429547436756,-0.429460856494,-0.429374272285,-0.42928768413,-0.429201092028,-0.429114495981,-0.42902789599,-0.428941292055,-0.428854684178,-0.428768072359,-0.428681456598,-0.428594836897,-0.428508213257,-0.428421585678,-0.428334954161,-0.428248318707,-0.428161679316,-0.42807503599,-0.427988388729,-0.427901737534,-0.427815082406,-0.427728423345,-0.427641760353,-0.42755509343,-0.427468422577,-0.427381747795,-0.427295069085,-0.427208386447,-0.427121699882,-0.427035009391,-0.426948314975,-0.426861616634,-0.42677491437,-0.426688208183,-0.426601498074,-0.426514784044,-0.426428066093,-0.426341344223,-0.426254618434,-0.426167888727,-0.426081155102,-0.425994417562,-0.425907676105,-0.425820930734,-0.425734181448,-0.42564742825,-0.425560671138,-0.425473910116,-0.425387145182,-0.425300376338,-0.425213603585,-0.425126826924,-0.425040046355,-0.424953261879,-0.424866473496,-0.424779681209,-0.424692885017,-0.424606084922,-0.424519280923,-0.424432473023,-0.424345661221,-0.424258845519,-0.424172025917,-0.424085202416,-0.423998375017,-0.42391154372,-0.423824708528,-0.423737869439,-0.423651026456,-0.423564179578,-0.423477328807,-0.423390474144,-0.423303615589,-0.423216753143,-0.423129886807,-0.423043016581,-0.422956142467,-0.422869264466,-0.422782382577,-0.422695496802,-0.422608607142,-0.422521713598,-0.422434816169,-0.422347914858,-0.422261009665,-0.42217410059,-0.422087187635,-0.4220002708,-0.421913350086,-0.421826425494,-0.421739497024,-0.421652564679,-0.421565628457,-0.42147868836,-0.42139174439,-0.421304796545,-0.421217844829,-0.42113088924,-0.421043929781,-0.420956966452,-0.420869999253,-0.420783028186,-0.42069605325,-0.420609074448,-0.42052209178,-0.420435105247,-0.420348114849,-0.420261120587,-0.420174122462,-0.420087120475,-0.420000114627,-0.419913104918,-0.419826091349,-0.419739073922,-0.419652052636,-0.419565027493,-0.419477998493,-0.419390965638,-0.419303928928,-0.419216888363,-0.419129843945,-0.419042795675,-0.418955743553,-0.41886868758,-0.418781627757,-0.418694564084,-0.418607496563,-0.418520425194,-0.418433349978,-0.418346270916,-0.418259188009,-0.418172101257,-0.418085010662,-0.417997916223,-0.417910817942,-0.41782371582,-0.417736609858,-0.417649500055,-0.417562386414,-0.417475268935,-0.417388147618,-0.417301022464,-0.417213893475,-0.417126760651,-0.417039623993,-0.416952483502,-0.416865339178,-0.416778191022,-0.416691039035,-0.416603883218,-0.416516723572,-0.416429560098,-0.416342392795,-0.416255221666,-0.41616804671,-0.41608086793,-0.415993685324,-0.415906498895,-0.415819308643,-0.415732114569,-0.415644916674,-0.415557714958,-0.415470509422,-0.415383300068,-0.415296086895,-0.415208869905,-0.415121649098,-0.415034424476,-0.414947196039,-0.414859963788,-0.414772727723,-0.414685487846,-0.414598244157,-0.414510996658,-0.414423745348,-0.414336490229,-0.414249231301,-0.414161968566,-0.414074702024,-0.413987431676,-0.413900157523,-0.413812879565,-0.413725597803,-0.413638312238,-0.413551022872,-0.413463729704,-0.413376432736,-0.413289131968,-0.413201827401,-0.413114519036,-0.413027206874,-0.412939890915,-0.412852571161,-0.412765247612,-0.412677920268,-0.412590589132,-0.412503254203,-0.412415915483,-0.412328572971,-0.41224122667,-0.412153876579,-0.4120665227,-0.411979165034,-0.41189180358,-0.41180443834,-0.411717069316,-0.411629696507,-0.411542319914,-0.411454939538,-0.411367555381,-0.411280167442,-0.411192775723,-0.411105380224,-0.411017980946,-0.410930577891,-0.410843171058,-0.410755760449,-0.410668346064,-0.410580927905,-0.410493505971,-0.410406080264,-0.410318650785,-0.410231217535,-0.410143780514,-0.410056339722,-0.409968895162,-0.409881446833,-0.409793994737,-0.409706538874,-0.409619079245,-0.409531615851,-0.409444148692,-0.40935667777,-0.409269203086,-0.409181724639,-0.409094242431,-0.409006756463,-0.408919266736,-0.40883177325,-0.408744276005,-0.408656775004,-0.408569270247,-0.408481761734,-0.408394249466,-0.408306733445,-0.40821921367,-0.408131690143,-0.408044162865,-0.407956631836,-0.407869097057,-0.407781558529,-0.407694016253,-0.40760647023,-0.40751892046,-0.407431366944,-0.407343809683,-0.407256248677,-0.407168683929,-0.407081115438,-0.406993543204,-0.40690596723,-0.406818387516,-0.406730804063,-0.40664321687,-0.40655562594,-0.406468031273,-0.40638043287,-0.406292830732,-0.406205224859,-0.406117615252,-0.406030001912,-0.40594238484,-0.405854764037,-0.405767139503,-0.40567951124,-0.405591879248,-0.405504243527,-0.405416604079,-0.405328960905,-0.405241314005,-0.40515366338,-0.405066009031,-0.404978350959,-0.404890689164,-0.404803023648,-0.40471535441,-0.404627681453,-0.404540004777,-0.404452324382,-0.404364640269,-0.404276952439,-0.404189260894,-0.404101565633,-0.404013866658,-0.403926163969,-0.403838457568,-0.403750747454,-0.403663033629,-0.403575316094,-0.403487594849,-0.403399869896,-0.403312141235,-0.403224408866,-0.403136672791,-0.40304893301,-0.402961189525,-0.402873442336,-0.402785691444,-0.402697936849,-0.402610178553,-0.402522416556,-0.402434650859,-0.402346881464,-0.402259108369,-0.402171331578,-0.40208355109,-0.401995766905,-0.401907979026,-0.401820187453,-0.401732392186,-0.401644593226,-0.401556790575,-0.401468984233,-0.4013811742,-0.401293360478,-0.401205543067,-0.401117721969,-0.401029897184,-0.400942068712,-0.400854236555,-0.400766400714,-0.400678561188,-0.40059071798,-0.40050287109,-0.400415020518,-0.400327166266,-0.400239308334,-0.400151446723,-0.400063581434,-0.399975712468,-0.399887839825,-0.399799963506,-0.399712083513,-0.399624199846,-0.399536312505,-0.399448421492,-0.399360526807,-0.399272628452,-0.399184726426,-0.399096820731,-0.399008911368,-0.398920998337,-0.398833081639,-0.398745161276,-0.398657237247,-0.398569309554,-0.398481378197,-0.398393443177,-0.398305504496,-0.398217562153,-0.39812961615,-0.398041666488,-0.397953713167,-0.397865756188,-0.397777795552,-0.397689831259,-0.397601863311,-0.397513891709,-0.397425916452,-0.397337937543,-0.397249954981,-0.397161968768,-0.397073978904,-0.39698598539,-0.396897988228,-0.396809987417,-0.396721982958,-0.396633974854,-0.396545963103,-0.396457947707,-0.396369928668,-0.396281905985,-0.396193879659,-0.396105849692,-0.396017816083,-0.395929778835,-0.395841737947,-0.395753693421,-0.395665645257,-0.395577593457,-0.39548953802,-0.395401478948,-0.395313416241,-0.395225349901,-0.395137279928,-0.395049206323,-0.394961129087,-0.394873048221,-0.394784963724,-0.394696875599,-0.394608783847,-0.394520688466,-0.39443258946,-0.394344486828,-0.394256380571,-0.394168270691,-0.394080157187,-0.393992040061,-0.393903919314,-0.393815794945,-0.393727666957,-0.39363953535,-0.393551400125,-0.393463261282,-0.393375118823,-0.393286972747,-0.393198823057,-0.393110669753,-0.393022512835,-0.392934352304,-0.392846188162,-0.392758020409,-0.392669849046,-0.392581674073,-0.392493495492,-0.392405313303,-0.392317127507,-0.392228938105,-0.392140745098,-0.392052548486,-0.391964348271,-0.391876144453,-0.391787937033,-0.391699726011,-0.391611511389,-0.391523293168,-0.391435071348,-0.391346845929,-0.391258616914,-0.391170384302,-0.391082148095,-0.390993908293,-0.390905664897,-0.390817417908,-0.390729167326,-0.390640913153,-0.39055265539,-0.390464394036,-0.390376129094,-0.390287860563,-0.390199588444,-0.39011131274,-0.390023033449,-0.389934750573,-0.389846464113,-0.38975817407,-0.389669880444,-0.389581583236,-0.389493282448,-0.389404978079,-0.389316670131,-0.389228358604,-0.3891400435,-0.389051724819,-0.388963402562,-0.388875076729,-0.388786747322,-0.388698414342,-0.388610077788,-0.388521737663,-0.388433393966,-0.388345046699,-0.388256695862,-0.388168341457,-0.388079983483,-0.387991621943,-0.387903256836,-0.387814888164,-0.387726515926,-0.387638140125,-0.387549760761,-0.387461377835,-0.387372991347,-0.387284601299,-0.38719620769,-0.387107810523,-0.387019409797,-0.386931005514,-0.386842597675,-0.38675418628,-0.386665771329,-0.386577352825,-0.386488930767,-0.386400505157,-0.386312075995,-0.386223643282,-0.386135207019,-0.386046767207,-0.385958323846,-0.385869876938,-0.385781426482,-0.385692972481,-0.385604514935,-0.385516053844,-0.38542758921,-0.385339121032,-0.385250649313,-0.385162174053,-0.385073695252,-0.384985212912,-0.384896727034,-0.384808237617,-0.384719744663,-0.384631248173,-0.384542748148,-0.384454244587,-0.384365737494,-0.384277226867,-0.384188712707,-0.384100195017,-0.384011673796,-0.383923149045,-0.383834620765,-0.383746088957,-0.383657553622,-0.38356901476,-0.383480472373,-0.383391926461,-0.383303377024,-0.383214824065,-0.383126267583,-0.383037707579,-0.382949144055,-0.382860577011,-0.382772006447,-0.382683432365,-0.382594854766,-0.382506273649,-0.382417689017,-0.38232910087,-0.382240509209,-0.382151914034,-0.382063315346,-0.381974713147,-0.381886107436,-0.381797498215,-0.381708885485,-0.381620269247,-0.3815316495,-0.381443026247,-0.381354399487,-0.381265769222,-0.381177135453,-0.38108849818,-0.380999857404,-0.380911213126,-0.380822565346,-0.380733914067,-0.380645259287,-0.380556601009,-0.380467939233,-0.380379273959,-0.38029060519,-0.380201932924,-0.380113257164,-0.38002457791,-0.379935895163,-0.379847208924,-0.379758519193,-0.379669825972,-0.37958112926,-0.37949242906,-0.379403725372,-0.379315018196,-0.379226307533,-0.379137593385,-0.379048875752,-0.378960154634,-0.378871430034,-0.37878270195,-0.378693970385,-0.37860523534,-0.378516496814,-0.378427754809,-0.378339009325,-0.378250260364,-0.378161507926,-0.378072752012,-0.377983992623,-0.37789522976,-0.377806463423,-0.377717693613,-0.377628920332,-0.377540143579,-0.377451363356,-0.377362579664,-0.377273792503,-0.377185001874,-0.377096207778,-0.377007410216,-0.376918609189,-0.376829804697,-0.376740996741,-0.376652185323,-0.376563370442,-0.3764745521,-0.376385730298,-0.376296905036,-0.376208076315,-0.376119244136,-0.3760304085,-0.375941569407,-0.375852726859,-0.375763880856,-0.375675031399,-0.375586178489,-0.375497322127,-0.375408462313,-0.375319599049,-0.375230732334,-0.375141862171,-0.37505298856,-0.374964111501,-0.374875230995,-0.374786347044,-0.374697459647,-0.374608568807,-0.374519674523,-0.374430776797,-0.374341875629,-0.37425297102,-0.374164062971,-0.374075151483,-0.373986236557,-0.373897318193,-0.373808396392,-0.373719471155,-0.373630542483,-0.373541610377,-0.373452674837,-0.373363735864,-0.37327479346,-0.373185847624,-0.373096898359,-0.373007945663,-0.37291898954,-0.372830029988,-0.37274106701,-0.372652100605,-0.372563130775,-0.37247415752,-0.372385180842,-0.372296200741,-0.372207217218,-0.372118230273,-0.372029239908,-0.371940246124,-0.37185124892,-0.371762248299,-0.371673244261,-0.371584236806,-0.371495225936,-0.371406211651,-0.371317193952,-0.37122817284,-0.371139148316,-0.37105012038,-0.370961089034,-0.370872054278,-0.370783016113,-0.37069397454,-0.370604929559,-0.370515881172,-0.370426829379,-0.370337774182,-0.37024871558,-0.370159653575,-0.370070588168,-0.369981519359,-0.369892447149,-0.369803371539,-0.36971429253,-0.369625210123,-0.369536124318,-0.369447035117,-0.36935794252,-0.369268846527,-0.369179747141,-0.369090644361,-0.369001538188,-0.368912428624,-0.368823315668,-0.368734199323,-0.368645079588,-0.368555956464,-0.368466829953,-0.368377700055,-0.368288566771,-0.368199430102,-0.368110290049,-0.368021146612,-0.367931999792,-0.36784284959,-0.367753696007,-0.367664539043,-0.3675753787,-0.367486214979,-0.367397047879,-0.367307877403,-0.36721870355,-0.367129526322,-0.36704034572,-0.366951161743,-0.366861974394,-0.366772783673,-0.36668358958,-0.366594392117,-0.366505191284,-0.366415987082,-0.366326779513,-0.366237568576,-0.366148354272,-0.366059136604,-0.36596991557,-0.365880691173,-0.365791463412,-0.365702232289,-0.365612997805,-0.36552375996,-0.365434518755,-0.365345274191,-0.365256026269,-0.36516677499,-0.365077520354,-0.364988262363,-0.364899001016,-0.364809736316,-0.364720468262,-0.364631196856,-0.364541922098,-0.364452643989,-0.364363362531,-0.364274077723,-0.364184789567,-0.364095498064,-0.364006203213,-0.363916905017,-0.363827603476,-0.363738298591,-0.363648990362,-0.36355967879,-0.363470363877,-0.363381045623,-0.363291724029,-0.363202399096,-0.363113070824,-0.363023739214,-0.362934404268,-0.362845065985,-0.362755724367,-0.362666379415,-0.36257703113,-0.362487679511,-0.362398324561,-0.36230896628,-0.362219604668,-0.362130239727,-0.362040871458,-0.36195149986,-0.361862124936,-0.361772746685,-0.361683365109,-0.361593980209,-0.361504591985,-0.361415200438,-0.361325805568,-0.361236407378,-0.361147005867,-0.361057601037,-0.360968192888,-0.360878781421,-0.360789366637,-0.360699948537,-0.360610527121,-0.36052110239,-0.360431674346,-0.360342242988,-0.360252808319,-0.360163370338,-0.360073929046,-0.359984484445,-0.359895036535,-0.359805585317,-0.359716130791,-0.359626672959,-0.359537211822,-0.35944774738,-0.359358279633,-0.359268808584,-0.359179334232,-0.359089856579,-0.359000375625,-0.358910891371,-0.358821403819,-0.358731912968,-0.358642418819,-0.358552921374,-0.358463420634,-0.358373916598,-0.358284409268,-0.358194898645,-0.35810538473,-0.358015867523,-0.357926347025,-0.357836823237,-0.35774729616,-0.357657765795,-0.357568232142,-0.357478695203,-0.357389154977,-0.357299611467,-0.357210064672,-0.357120514594,-0.357030961233,-0.356941404591,-0.356851844668,-0.356762281464,-0.356672714982,-0.35658314522,-0.356493572182,-0.356403995866,-0.356314416274,-0.356224833408,-0.356135247267,-0.356045657852,-0.355956065165,-0.355866469205,-0.355776869975,-0.355687267475,-0.355597661705,-0.355508052666,-0.35541844036,-0.355328824787,-0.355239205948,-0.355149583843,-0.355059958474,-0.354970329842,-0.354880697946,-0.354791062789,-0.35470142437,-0.354611782691,-0.354522137753,-0.354432489556,-0.354342838101,-0.354253183389,-0.35416352542,-0.354073864197,-0.353984199719,-0.353894531987,-0.353804861002,-0.353715186765,-0.353625509277,-0.353535828538,-0.353446144549,-0.353356457312,-0.353266766827,-0.353177073095,-0.353087376116,-0.352997675892,-0.352907972424,-0.352818265711,-0.352728555755,-0.352638842557,-0.352549126118,-0.352459406438,-0.352369683519,-0.35227995736,-0.352190227964,-0.35210049533,-0.35201075946,-0.351921020354,-0.351831278013,-0.351741532439,-0.351651783631,-0.351562031591,-0.35147227632,-0.351382517818,-0.351292756086,-0.351202991125,-0.351113222935,-0.351023451519,-0.350933676876,-0.350843899007,-0.350754117913,-0.350664333596,-0.350574546055,-0.350484755292,-0.350394961307,-0.350305164101,-0.350215363675,-0.350125560031,-0.350035753168,-0.349945943087,-0.34985612979,-0.349766313277,-0.349676493549,-0.349586670607,-0.349496844452,-0.349407015084,-0.349317182505,-0.349227346714,-0.349137507714,-0.349047665505,-0.348957820087,-0.348867971461,-0.348778119629,-0.348688264591,-0.348598406348,-0.3485085449,-0.348418680249,-0.348328812396,-0.348238941341,-0.348149067085,-0.348059189629,-0.347969308973,-0.347879425119,-0.347789538067,-0.347699647819,-0.347609754375,-0.347519857735,-0.347429957901,-0.347340054874,-0.347250148654,-0.347160239242,-0.347070326639,-0.346980410846,-0.346890491863,-0.346800569692,-0.346710644334,-0.346620715788,-0.346530784056,-0.346440849139,-0.346350911038,-0.346260969753,-0.346171025285,-0.346081077636,-0.345991126805,-0.345901172794,-0.345811215604,-0.345721255235,-0.345631291688,-0.345541324964,-0.345451355064,-0.345361381989,-0.345271405739,-0.345181426316,-0.345091443719,-0.345001457951,-0.344911469012,-0.344821476902,-0.344731481622,-0.344641483174,-0.344551481559,-0.344461476776,-0.344371468826,-0.344281457712,-0.344191443433,-0.34410142599,-0.344011405384,-0.343921381616,-0.343831354687,-0.343741324598,-0.343651291349,-0.343561254941,-0.343471215375,-0.343381172652,-0.343291126773,-0.343201077738,-0.343111025549,-0.343020970206,-0.34293091171,-0.342840850062,-0.342750785262,-0.342660717312,-0.342570646212,-0.342480571964,-0.342390494567,-0.342300414024,-0.342210330333,-0.342120243498,-0.342030153518,-0.341940060393,-0.341849964126,-0.341759864717,-0.341669762166,-0.341579656475,-0.341489547644,-0.341399435674,-0.341309320566,-0.34121920232,-0.341129080939,-0.341038956421,-0.340948828769,-0.340858697983,-0.340768564064,-0.340678427013,-0.34058828683,-0.340498143517,-0.340407997074,-0.340317847501,-0.340227694801,-0.340137538974,-0.340047380019,-0.33995721794,-0.339867052735,-0.339776884407,-0.339686712955,-0.339596538381,-0.339506360686,-0.33941617987,-0.339325995934,-0.339235808879,-0.339145618705,-0.339055425415,-0.338965229008,-0.338875029485,-0.338784826848,-0.338694621096,-0.338604412231,-0.338514200254,-0.338423985165,-0.338333766966,-0.338243545656,-0.338153321238,-0.338063093711,-0.337972863077,-0.337882629336,-0.33779239249,-0.337702152538,-0.337611909483,-0.337521663324,-0.337431414063,-0.337341161701,-0.337250906237,-0.337160647674,-0.337070386011,-0.33698012125,-0.336889853392,-0.336799582437,-0.336709308387,-0.336619031241,-0.336528751001,-0.336438467668,-0.336348181243,-0.336257891726,-0.336167599118,-0.33607730342,-0.335987004633,-0.335896702757,-0.335806397794,-0.335716089745,-0.335625778609,-0.335535464389,-0.335445147085,-0.335354826697,-0.335264503226,-0.335174176674,-0.335083847041,-0.334993514328,-0.334903178536,-0.334812839666,-0.334722497718,-0.334632152693,-0.334541804592,-0.334451453417,-0.334361099167,-0.334270741844,-0.334180381448,-0.33409001798,-0.333999651442,-0.333909281834,-0.333818909156,-0.33372853341,-0.333638154596,-0.333547772716,-0.33345738777,-0.333366999759,-0.333276608683,-0.333186214544,-0.333095817343,-0.333005417079,-0.332915013755,-0.332824607371,-0.332734197927,-0.332643785426,-0.332553369866,-0.33246295125,-0.332372529578,-0.33228210485,-0.332191677069,-0.332101246234,-0.332010812346,-0.331920375407,-0.331829935416,-0.331739492376,-0.331649046286,-0.331558597148,-0.331468144962,-0.33137768973,-0.331287231451,-0.331196770128,-0.33110630576,-0.331015838349,-0.330925367895,-0.330834894399,-0.330744417862,-0.330653938285,-0.330563455669,-0.330472970014,-0.330382481322,-0.330291989593,-0.330201494828,-0.330110997028,-0.330020496193,-0.329929992325,-0.329839485424,-0.329748975492,-0.329658462529,-0.329567946535,-0.329477427512,-0.329386905461,-0.329296380382,-0.329205852276,-0.329115321144,-0.329024786987,-0.328934249806,-0.328843709601,-0.328753166373,-0.328662620124,-0.328572070854,-0.328481518563,-0.328390963253,-0.328300404925,-0.328209843579,-0.328119279216,-0.328028711837,-0.327938141443,-0.327847568035,-0.327756991613,-0.327666412179,-0.327575829733,-0.327485244275,-0.327394655808,-0.327304064331,-0.327213469845,-0.327122872352,-0.327032271853,-0.326941668347,-0.326851061836,-0.32676045232,-0.326669839801,-0.32657922428,-0.326488605756,-0.326397984232,-0.326307359707,-0.326216732183,-0.326126101661,-0.32603546814,-0.325944831623,-0.32585419211,-0.325763549602,-0.325672904099,-0.325582255603,-0.325491604115,-0.325400949634,-0.325310292162,-0.3252196317,-0.325128968249,-0.32503830181,-0.324947632382,-0.324856959968,-0.324766284568,-0.324675606182,-0.324584924813,-0.324494240459,-0.324403553123,-0.324312862805,-0.324222169507,-0.324131473228,-0.324040773969,-0.323950071732,-0.323859366518,-0.323768658326,-0.323677947159,-0.323587233016,-0.3234965159,-0.323405795809,-0.323315072746,-0.323224346711,-0.323133617705,-0.323042885729,-0.322952150783,-0.322861412869,-0.322770671988,-0.322679928139,-0.322589181325,-0.322498431545,-0.322407678801,-0.322316923094,-0.322226164423,-0.322135402791,-0.322044638198,-0.321953870645,-0.321863100133,-0.321772326662,-0.321681550233,-0.321590770847,-0.321499988506,-0.321409203209,-0.321318414958,-0.321227623754,-0.321136829597,-0.321046032488,-0.320955232428,-0.320864429418,-0.320773623458,-0.320682814551,-0.320592002695,-0.320501187893,-0.320410370144,-0.320319549451,-0.320228725813,-0.320137899232,-0.320047069708,-0.319956237242,-0.319865401836,-0.319774563489,-0.319683722203,-0.319592877978,-0.319502030816,-0.319411180717,-0.319320327682,-0.319229471712,-0.319138612808,-0.31904775097,-0.318956886199,-0.318866018497,-0.318775147864,-0.318684274301,-0.318593397808,-0.318502518387,-0.318411636039,-0.318320750763,-0.318229862562,-0.318138971436,-0.318048077385,-0.317957180411,-0.317866280514,-0.317775377696,-0.317684471956,-0.317593563297,-0.317502651718,-0.317411737221,-0.317320819806,-0.317229899475,-0.317138976228,-0.317048050065,-0.316957120989,-0.316866188998,-0.316775254096,-0.316684316281,-0.316593375556,-0.316502431921,-0.316411485376,-0.316320535923,-0.316229583563,-0.316138628296,-0.316047670123,-0.315956709045,-0.315865745062,-0.315774778176,-0.315683808388,-0.315592835698,-0.315501860108,-0.315410881617,-0.315319900227,-0.315228915938,-0.315137928753,-0.31504693867,-0.314955945692,-0.314864949818,-0.314773951051,-0.31468294939,-0.314591944836,-0.314500937391,-0.314409927055,-0.314318913829,-0.314227897714,-0.314136878711,-0.31404585682,-0.313954832043,-0.31386380438,-0.313772773831,-0.313681740399,-0.313590704083,-0.313499664885,-0.313408622805,-0.313317577845,-0.313226530004,-0.313135479285,-0.313044425687,-0.312953369212,-0.31286230986,-0.312771247632,-0.312680182529,-0.312589114553,-0.312498043703,-0.31240696998,-0.312315893386,-0.312224813922,-0.312133731587,-0.312042646384,-0.311951558312,-0.311860467372,-0.311769373567,-0.311678276895,-0.311587177359,-0.311496074958,-0.311404969695,-0.311313861569,-0.311222750581,-0.311131636733,-0.311040520025,-0.310949400458,-0.310858278032,-0.31076715275,-0.31067602461,-0.310584893616,-0.310493759766,-0.310402623062,-0.310311483506,-0.310220341096,-0.310129195836,-0.310038047725,-0.309946896764,-0.309855742954,-0.309764586295,-0.30967342679,-0.309582264438,-0.309491099241,-0.309399931198,-0.309308760312,-0.309217586583,-0.309126410011,-0.309035230598,-0.308944048345,-0.308852863252,-0.308761675319,-0.308670484549,-0.308579290942,-0.308488094498,-0.308396895218,-0.308305693104,-0.308214488156,-0.308123280375,-0.308032069761,-0.307940856317,-0.307849640042,-0.307758420937,-0.307667199003,-0.307575974241,-0.307484746652,-0.307393516237,-0.307302282996,-0.307211046931,-0.307119808042,-0.307028566329,-0.306937321795,-0.306846074439,-0.306754824263,-0.306663571267,-0.306572315453,-0.30648105682,-0.306389795371,-0.306298531105,-0.306207264024,-0.306115994128,-0.306024721418,-0.305933445896,-0.305842167561,-0.305750886415,-0.305659602459,-0.305568315693,-0.305477026119,-0.305385733736,-0.305294438547,-0.305203140551,-0.30511183975,-0.305020536145,-0.304929229735,-0.304837920523,-0.304746608509,-0.304655293694,-0.304563976079,-0.304472655663,-0.30438133245,-0.304290006438,-0.30419867763,-0.304107346025,-0.304016011625,-0.303924674431,-0.303833334443,-0.303741991662,-0.30365064609,-0.303559297726,-0.303467946572,-0.303376592629,-0.303285235897,-0.303193876377,-0.30310251407,-0.303011148978,-0.3029197811,-0.302828410438,-0.302737036992,-0.302645660763,-0.302554281753,-0.302462899962,-0.30237151539,-0.302280128039,-0.30218873791,-0.302097345003,-0.302005949319,-0.301914550859,-0.301823149625,-0.301731745615,-0.301640338833,-0.301548929277,-0.30145751695,-0.301366101852,-0.301274683984,-0.301183263347,-0.301091839941,-0.301000413768,-0.300908984828,-0.300817553122,-0.300726118651,-0.300634681416,-0.300543241417,-0.300451798656,-0.300360353133,-0.30026890485,-0.300177453806,-0.300086000003,-0.299994543442,-0.299903084124,-0.299811622048,-0.299720157217,-0.299628689631,-0.299537219291,-0.299445746198,-0.299354270352,-0.299262791754,-0.299171310406,-0.299079826308,-0.298988339461,-0.298896849865,-0.298805357523,-0.298713862433,-0.298622364598,-0.298530864018,-0.298439360694,-0.298347854627,-0.298256345817,-0.298164834266,-0.298073319974,-0.297981802943,-0.297890283172,-0.297798760664,-0.297707235418,-0.297615707435,-0.297524176717,-0.297432643264,-0.297341107077,-0.297249568157,-0.297158026505,-0.297066482122,-0.296974935008,-0.296883385164,-0.296791832591,-0.29670027729,-0.296608719262,-0.296517158508,-0.296425595028,-0.296334028823,-0.296242459895,-0.296150888244,-0.29605931387,-0.295967736775,-0.29587615696,-0.295784574425,-0.295692989171,-0.295601401199,-0.295509810511,-0.295418217106,-0.295326620985,-0.29523502215,-0.295143420601,-0.295051816339,-0.294960209366,-0.294868599681,-0.294776987285,-0.294685372181,-0.294593754367,-0.294502133846,-0.294410510617,-0.294318884683,-0.294227256043,-0.294135624698,-0.29404399065,-0.2939523539,-0.293860714447,-0.293769072293,-0.293677427439,-0.293585779886,-0.293494129634,-0.293402476684,-0.293310821037,-0.293219162694,-0.293127501656,-0.293035837924,-0.292944171498,-0.29285250238,-0.292760830569,-0.292669156068,-0.292577478876,-0.292485798996,-0.292394116426,-0.292302431169,-0.292210743226,-0.292119052596,-0.292027359281,-0.291935663282,-0.2918439646,-0.291752263235,-0.291660559188,-0.291568852461,-0.291477143053,-0.291385430966,-0.291293716201,-0.291201998759,-0.291110278639,-0.291018555844,-0.290926830374,-0.29083510223,-0.290743371412,-0.290651637922,-0.290559901761,-0.290468162928,-0.290376421426,-0.290284677254,-0.290192930415,-0.290101180908,-0.290009428734,-0.289917673895,-0.289825916391,-0.289734156223,-0.289642393391,-0.289550627898,-0.289458859743,-0.289367088927,-0.289275315451,-0.289183539317,-0.289091760524,-0.288999979074,-0.288908194968,-0.288816408206,-0.288724618789,-0.288632826719,-0.288541031995,-0.288449234619,-0.288357434592,-0.288265631915,-0.288173826587,-0.288082018611,-0.287990207987,-0.287898394715,-0.287806578798,-0.287714760235,-0.287622939027,-0.287531115176,-0.287439288681,-0.287347459545,-0.287255627767,-0.287163793349,-0.287071956291,-0.286980116595,-0.286888274261,-0.286796429289,-0.286704581682,-0.286612731439,-0.286520878562,-0.286429023051,-0.286337164908,-0.286245304132,-0.286153440725,-0.286061574688,-0.285969706022,-0.285877834727,-0.285785960804,-0.285694084255,-0.285602205079,-0.285510323278,-0.285418438853,-0.285326551805,-0.285234662133,-0.28514276984,-0.285050874926,-0.284958977392,-0.284867077238,-0.284775174466,-0.284683269077,-0.284591361071,-0.284499450449,-0.284407537211,-0.28431562136,-0.284223702895,-0.284131781818,-0.284039858129,-0.283947931829,-0.283856002919,-0.2837640714,-0.283672137273,-0.283580200538,-0.283488261197,-0.283396319249,-0.283304374697,-0.283212427541,-0.283120477782,-0.28302852542,-0.282936570457,-0.282844612893,-0.282752652729,-0.282660689967,-0.282568724606,-0.282476756647,-0.282384786093,-0.282292812942,-0.282200837197,-0.282108858858,-0.282016877926,-0.281924894402,-0.281832908286,-0.28174091958,-0.281648928284,-0.281556934399,-0.281464937926,-0.281372938866,-0.281280937219,-0.281188932988,-0.281096926171,-0.281004916771,-0.280912904788,-0.280820890222,-0.280728873076,-0.280636853349,-0.280544831042,-0.280452806157,-0.280360778694,-0.280268748654,-0.280176716038,-0.280084680846,-0.27999264308,-0.279900602741,-0.279808559828,-0.279716514344,-0.279624466288,-0.279532415663,-0.279440362467,-0.279348306704,-0.279256248372,-0.279164187474,-0.27907212401,-0.27898005798,-0.278887989387,-0.278795918229,-0.278703844509,-0.278611768228,-0.278519689385,-0.278427607982,-0.27833552402,-0.2782434375,-0.278151348422,-0.278059256787,-0.277967162597,-0.277875065852,-0.277782966552,-0.277690864699,-0.277598760293,-0.277506653336,-0.277414543828,-0.277322431771,-0.277230317164,-0.277138200009,-0.277046080306,-0.276953958057,-0.276861833262,-0.276769705923,-0.276677576039,-0.276585443612,-0.276493308643,-0.276401171132,-0.276309031081,-0.27621688849,-0.27612474336,-0.276032595692,-0.275940445487,-0.275848292746,-0.275756137468,-0.275663979657,-0.275571819311,-0.275479656432,-0.275387491021,-0.275295323079,-0.275203152607,-0.275110979605,-0.275018804074,-0.274926626015,-0.274834445429,-0.274742262317,-0.274650076679,-0.274557888517,-0.274465697831,-0.274373504623,-0.274281308892,-0.274189110641,-0.274096909869,-0.274004706577,-0.273912500767,-0.27382029244,-0.273728081595,-0.273635868234,-0.273543652358,-0.273451433968,-0.273359213064,-0.273266989648,-0.27317476372,-0.273082535281,-0.272990304331,-0.272898070873,-0.272805834906,-0.272713596431,-0.27262135545,-0.272529111963,-0.272436865971,-0.272344617474,-0.272252366475,-0.272160112972,-0.272067856969,-0.271975598464,-0.271883337459,-0.271791073956,-0.271698807954,-0.271606539455,-0.271514268459,-0.271421994967,-0.271329718981,-0.2712374405,-0.271145159527,-0.271052876061,-0.270960590104,-0.270868301656,-0.270776010718,-0.270683717291,-0.270591421377,-0.270499122975,-0.270406822087,-0.270314518713,-0.270222212854,-0.270129904512,-0.270037593687,-0.269945280379,-0.269852964591,-0.269760646322,-0.269668325573,-0.269576002346,-0.26948367664,-0.269391348458,-0.269299017799,-0.269206684665,-0.269114349057,-0.269022010975,-0.26892967042,-0.268837327394,-0.268744981896,-0.268652633928,-0.26856028349,-0.268467930584,-0.268375575211,-0.26828321737,-0.268190857063,-0.268098494292,-0.268006129056,-0.267913761356,-0.267821391194,-0.26772901857,-0.267636643486,-0.267544265941,-0.267451885937,-0.267359503474,-0.267267118554,-0.267174731178,-0.267082341345,-0.266989949058,-0.266897554317,-0.266805157122,-0.266712757475,-0.266620355376,-0.266527950827,-0.266435543828,-0.266343134379,-0.266250722483,-0.266158308139,-0.266065891349,-0.265973472113,-0.265881050432,-0.265788626308,-0.26569619974,-0.26560377073,-0.265511339279,-0.265418905387,-0.265326469056,-0.265234030286,-0.265141589077,-0.265049145432,-0.26495669935,-0.264864250833,-0.264771799882,-0.264679346496,-0.264586890678,-0.264494432428,-0.264401971746,-0.264309508635,-0.264217043093,-0.264124575124,-0.264032104726,-0.263939631901,-0.263847156651,-0.263754678975,-0.263662198875,-0.263569716351,-0.263477231404,-0.263384744036,-0.263292254247,-0.263199762037,-0.263107267409,-0.263014770362,-0.262922270897,-0.262829769016,-0.262737264719,-0.262644758006,-0.26255224888,-0.26245973734,-0.262367223388,-0.262274707024,-0.262182188249,-0.262089667065,-0.261997143471,-0.261904617469,-0.26181208906,-0.261719558244,-0.261627025023,-0.261534489397,-0.261441951366,-0.261349410933,-0.261256868097,-0.26116432286,-0.261071775223,-0.260979225186,-0.260886672749,-0.260794117915,-0.260701560684,-0.260609001056,-0.260516439033,-0.260423874615,-0.260331307804,-0.2602387386,-0.260146167003,-0.260053593015,-0.259961016637,-0.25986843787,-0.259775856714,-0.25968327317,-0.259590687239,-0.259498098922,-0.25940550822,-0.259312915133,-0.259220319663,-0.25912772181,-0.259035121575,-0.258942518959,-0.258849913963,-0.258757306588,-0.258664696834,-0.258572084703,-0.258479470195,-0.258386853311,-0.258294234052,-0.258201612419,-0.258108988413,-0.258016362034,-0.257923733283,-0.257831102162,-0.257738468671,-0.257645832811,-0.257553194582,-0.257460553986,-0.257367911024,-0.257275265696,-0.257182618003,-0.257089967946,-0.256997315526,-0.256904660743,-0.2568120036,-0.256719344096,-0.256626682232,-0.256534018009,-0.256441351428,-0.25634868249,-0.256256011196,-0.256163337546,-0.256070661542,-0.255977983184,-0.255885302473,-0.25579261941,-0.255699933995,-0.255607246231,-0.255514556117,-0.255421863654,-0.255329168844,-0.255236471686,-0.255143772183,-0.255051070334,-0.254958366141,-0.254865659605,-0.254772950725,-0.254680239504,-0.254587525942,-0.25449481004,-0.254402091799,-0.254309371219,-0.254216648301,-0.254123923047,-0.254031195457,-0.253938465532,-0.253845733273,-0.253752998681,-0.253660261756,-0.2535675225,-0.253474780913,-0.253382036996,-0.25328929075,-0.253196542175,-0.253103791274,-0.253011038046,-0.252918282492,-0.252825524613,-0.252732764411,-0.252640001886,-0.252547237038,-0.252454469869,-0.25236170038,-0.25226892857,-0.252176154442,-0.252083377996,-0.251990599233,-0.251897818154,-0.25180503476,-0.25171224905,-0.251619461028,-0.251526670692,-0.251433878044,-0.251341083085,-0.251248285816,-0.251155486238,-0.251062684351,-0.250969880156,-0.250877073654,-0.250784264847,-0.250691453734,-0.250598640317,-0.250505824596,-0.250413006573,-0.250320186248,-0.250227363622,-0.250134538696,-0.250041711471,-0.249948881948,-0.249856050127,-0.24976321601,-0.249670379597,-0.249577540889,-0.249484699886,-0.249391856591,-0.249299011003,-0.249206163124,-0.249113312954,-0.249020460494,-0.248927605746,-0.248834748709,-0.248741889385,-0.248649027775,-0.248556163879,-0.248463297698,-0.248370429234,-0.248277558487,-0.248184685457,-0.248091810146,-0.247998932555,-0.247906052685,-0.247813170535,-0.247720286108,-0.247627399404,-0.247534510423,-0.247441619168,-0.247348725638,-0.247255829834,-0.247162931758,-0.247070031409,-0.24697712879,-0.246884223901,-0.246791316742,-0.246698407315,-0.24660549562,-0.246512581659,-0.246419665431,-0.246326746939,-0.246233826182,-0.246140903162,-0.24604797788,-0.245955050336,-0.245862120531,-0.245769188466,-0.245676254142,-0.245583317561,-0.245490378721,-0.245397437625,-0.245304494274,-0.245211548668,-0.245118600807,-0.245025650694,-0.244932698329,-0.244839743712,-0.244746786844,-0.244653827727,-0.244560866362,-0.244467902748,-0.244374936887,-0.24428196878,-0.244188998427,-0.24409602583,-0.24400305099,-0.243910073906,-0.24381709458,-0.243724113014,-0.243631129207,-0.243538143161,-0.243445154876,-0.243352164353,-0.243259171594,-0.243166176599,-0.243073179368,-0.242980179903,-0.242887178205,-0.242794174274,-0.242701168112,-0.242608159718,-0.242515149095,-0.242422136243,-0.242329121162,-0.242236103854,-0.242143084319,-0.242050062558,-0.241957038573,-0.241864012364,-0.241770983931,-0.241677953276,-0.2415849204,-0.241491885303,-0.241398847986,-0.241305808451,-0.241212766697,-0.241119722726,-0.241026676539,-0.240933628137,-0.24084057752,-0.240747524689,-0.240654469645,-0.240561412389,-0.240468352922,-0.240375291244,-0.240282227358,-0.240189161262,-0.240096092959,-0.240003022449,-0.239909949733,-0.239816874811,-0.239723797685,-0.239630718356,-0.239537636824,-0.239444553091,-0.239351467156,-0.239258379021,-0.239165288687,-0.239072196155,-0.238979101425,-0.238886004499,-0.238792905377,-0.23869980406,-0.238606700549,-0.238513594844,-0.238420486948,-0.238327376859,-0.23823426458,-0.238141150112,-0.238048033454,-0.237954914608,-0.237861793575,-0.237768670356,-0.237675544951,-0.237582417362,-0.237489287588,-0.237396155632,-0.237303021494,-0.237209885174,-0.237116746674,-0.237023605994,-0.236930463136,-0.2368373181,-0.236744170887,-0.236651021498,-0.236557869934,-0.236464716195,-0.236371560283,-0.236278402198,-0.236185241941,-0.236092079513,-0.235998914916,-0.235905748149,-0.235812579213,-0.23571940811,-0.23562623484,-0.235533059405,-0.235439881805,-0.23534670204,-0.235253520112,-0.235160336022,-0.23506714977,-0.234973961358,-0.234880770785,-0.234787578054,-0.234694383165,-0.234601186118,-0.234507986915,-0.234414785556,-0.234321582043,-0.234228376376,-0.234135168556,-0.234041958584,-0.23394874646,-0.233855532186,-0.233762315763,-0.233669097191,-0.233575876471,-0.233482653604,-0.233389428591,-0.233296201432,-0.233202972129,-0.233109740683,-0.233016507094,-0.232923271363,-0.232830033492,-0.23273679348,-0.232643551328,-0.232550307039,-0.232457060612,-0.232363812048,-0.232270561348,-0.232177308513,-0.232084053545,-0.231990796442,-0.231897537208,-0.231804275842,-0.231711012345,-0.231617746719,-0.231524478963,-0.231431209079,-0.231337937069,-0.231244662931,-0.231151386668,-0.231058108281,-0.230964827769,-0.230871545135,-0.230778260378,-0.230684973501,-0.230591684502,-0.230498393385,-0.230405100148,-0.230311804794,-0.230218507323,-0.230125207735,-0.230031906033,-0.229938602216,-0.229845296285,-0.229751988242,-0.229658678087,-0.229565365821,-0.229472051444,-0.229378734959,-0.229285416365,-0.229192095664,-0.229098772856,-0.229005447942,-0.228912120923,-0.2288187918,-0.228725460574,-0.228632127245,-0.228538791815,-0.228445454284,-0.228352114653,-0.228258772924,-0.228165429096,-0.228072083171,-0.22797873515,-0.227885385033,-0.227792032821,-0.227698678516,-0.227605322117,-0.227511963627,-0.227418603045,-0.227325240373,-0.227231875611,-0.227138508761,-0.227045139823,-0.226951768798,-0.226858395687,-0.226765020491,-0.22667164321,-0.226578263846,-0.226484882399,-0.22639149887,-0.22629811326,-0.226204725571,-0.226111335802,-0.226017943954,-0.22592455003,-0.225831154028,-0.225737755951,-0.225644355799,-0.225550953572,-0.225457549273,-0.225364142901,-0.225270734458,-0.225177323944,-0.22508391136,-0.224990496707,-0.224897079986,-0.224803661198,-0.224710240344,-0.224616817424,-0.22452339244,-0.224429965392,-0.22433653628,-0.224243105107,-0.224149671873,-0.224056236578,-0.223962799224,-0.223869359811,-0.223775918341,-0.223682474813,-0.22358902923,-0.223495581591,-0.223402131898,-0.223308680152,-0.223215226353,-0.223121770502,-0.2230283126,-0.222934852648,-0.222841390647,-0.222747926598,-0.222654460502,-0.222560992358,-0.222467522169,-0.222374049935,-0.222280575658,-0.222187099337,-0.222093620973,-0.222000140568,-0.221906658123,-0.221813173638,-0.221719687114,-0.221626198552,-0.221532707953,-0.221439215318,-0.221345720647,-0.221252223942,-0.221158725203,-0.221065224431,-0.220971721627,-0.220878216792,-0.220784709927,-0.220691201032,-0.220597690109,-0.220504177158,-0.22041066218,-0.220317145177,-0.220223626148,-0.220130105095,-0.220036582018,-0.219943056919,-0.219849529799,-0.219756000657,-0.219662469496,-0.219568936315,-0.219475401117,-0.219381863901,-0.219288324668,-0.21919478342,-0.219101240157,-0.21900769488,-0.21891414759,-0.218820598288,-0.218727046974,-0.21863349365,-0.218539938316,-0.218446380974,-0.218352821623,-0.218259260266,-0.218165696902,-0.218072131533,-0.21797856416,-0.217884994783,-0.217791423403,-0.217697850021,-0.217604274638,-0.217510697256,-0.217417117873,-0.217323536493,-0.217229953114,-0.217136367739,-0.217042780369,-0.216949191003,-0.216855599643,-0.216762006289,-0.216668410944,-0.216574813606,-0.216481214278,-0.21638761296,-0.216294009653,-0.216200404358,-0.216106797076,-0.216013187808,-0.215919576553,-0.215825963314,-0.215732348092,-0.215638730886,-0.215545111698,-0.215451490529,-0.21535786738,-0.215264242251,-0.215170615143,-0.215076986058,-0.214983354995,-0.214889721957,-0.214796086943,-0.214702449955,-0.214608810994,-0.21451517006,-0.214421527154,-0.214327882277,-0.21423423543,-0.214140586614,-0.214046935829,-0.213953283078,-0.213859628359,-0.213765971675,-0.213672313026,-0.213578652412,-0.213484989836,-0.213391325297,-0.213297658797,-0.213203990337,-0.213110319916,-0.213016647537,-0.2129229732,-0.212829296905,-0.212735618654,-0.212641938448,-0.212548256288,-0.212454572173,-0.212360886106,-0.212267198087,-0.212173508116,-0.212079816196,-0.211986122326,-0.211892426507,-0.211798728741,-0.211705029028,-0.211611327369,-0.211517623765,-0.211423918217,-0.211330210725,-0.211236501291,-0.211142789916,-0.211049076599,-0.210955361343,-0.210861644147,-0.210767925013,-0.210674203942,-0.210580480935,-0.210486755992,-0.210393029114,-0.210299300302,-0.210205569557,-0.21011183688,-0.210018102272,-0.209924365734,-0.209830627265,-0.209736886868,-0.209643144543,-0.209549400292,-0.209455654114,-0.20936190601,-0.209268155983,-0.209174404032,-0.209080650158,-0.208986894362,-0.208893136645,-0.208799377009,-0.208705615453,-0.208611851978,-0.208518086586,-0.208424319278,-0.208330550053,-0.208236778914,-0.208143005861,-0.208049230894,-0.207955454015,-0.207861675225,-0.207767894524,-0.207674111913,-0.207580327394,-0.207486540966,-0.207392752631,-0.20729896239,-0.207205170243,-0.207111376192,-0.207017580237,-0.20692378238,-0.20682998262,-0.206736180959,-0.206642377398,-0.206548571937,-0.206454764578,-0.206360955321,-0.206267144167,-0.206173331118,-0.206079516173,-0.205985699334,-0.205891880602,-0.205798059977,-0.20570423746,-0.205610413053,-0.205516586756,-0.20542275857,-0.205328928495,-0.205235096533,-0.205141262685,-0.205047426951,-0.204953589332,-0.20485974983,-0.204765908444,-0.204672065176,-0.204578220027,-0.204484372998,-0.204390524089,-0.204296673301,-0.204202820635,-0.204108966093,-0.204015109674,-0.20392125138,-0.203827391212,-0.20373352917,-0.203639665255,-0.203545799469,-0.203451931811,-0.203358062284,-0.203264190887,-0.203170317622,-0.203076442489,-0.20298256549,-0.202888686625,-0.202794805895,-0.202700923302,-0.202607038844,-0.202513152525,-0.202419264344,-0.202325374303,-0.202231482401,-0.202137588641,-0.202043693023,-0.201949795548,-0.201855896217,-0.20176199503,-0.201668091988,-0.201574187093,-0.201480280345,-0.201386371745,-0.201292461294,-0.201198548993,-0.201104634842,-0.201010718843,-0.200916800996,-0.200822881302,-0.200728959763,-0.200635036378,-0.20054111115,-0.200447184078,-0.200353255163,-0.200259324407,-0.20016539181,-0.200071457373,-0.199977521097,-0.199883582983,-0.199789643032,-0.199695701244,-0.199601757621,-0.199507812163,-0.199413864871,-0.199319915747,-0.19922596479,-0.199132012002,-0.199038057383,-0.198944100935,-0.198850142659,-0.198756182554,-0.198662220623,-0.198568256866,-0.198474291283,-0.198380323876,-0.198286354646,-0.198192383593,-0.198098410718,-0.198004436022,-0.197910459507,-0.197816481172,-0.197722501019,-0.197628519048,-0.197534535261,-0.197440549659,-0.197346562241,-0.197252573009,-0.197158581965,-0.197064589108,-0.19697059444,-0.196876597961,-0.196782599672,-0.196688599575,-0.19659459767,-0.196500593958,-0.19640658844,-0.196312581116,-0.196218571988,-0.196124561056,-0.196030548321,-0.195936533785,-0.195842517448,-0.19574849931,-0.195654479373,-0.195560457638,-0.195466434105,-0.195372408776,-0.195278381651,-0.19518435273,-0.195090322016,-0.194996289509,-0.194902255209,-0.194808219117,-0.194714181235,-0.194620141563,-0.194526100103,-0.194432056854,-0.194338011818,-0.194243964996,-0.194149916388,-0.194055865996,-0.19396181382,-0.193867759861,-0.19377370412,-0.193679646598,-0.193585587296,-0.193491526214,-0.193397463354,-0.193303398716,-0.193209332302,-0.193115264111,-0.193021194145,-0.192927122405,-0.192833048892,-0.192738973607,-0.192644896549,-0.192550817721,-0.192456737123,-0.192362654756,-0.192268570621,-0.192174484719,-0.19208039705,-0.191986307615,-0.191892216416,-0.191798123453,-0.191704028728,-0.19160993224,-0.19151583399,-0.191421733981,-0.191327632212,-0.191233528684,-0.191139423398,-0.191045316356,-0.190951207557,-0.190857097004,-0.190762984696,-0.190668870634,-0.19057475482,-0.190480637254,-0.190386517938,-0.190292396871,-0.190198274056,-0.190104149492,-0.19001002318,-0.189915895122,-0.189821765319,-0.18972763377,-0.189633500478,-0.189539365443,-0.189445228665,-0.189351090146,-0.189256949887,-0.189162807888,-0.18906866415,-0.188974518674,-0.188880371462,-0.188786222513,-0.188692071829,-0.18859791941,-0.188503765258,-0.188409609373,-0.188315451757,-0.188221292409,-0.188127131332,-0.188032968525,-0.18793880399,-0.187844637727,-0.187750469738,-0.187656300023,-0.187562128583,-0.187467955419,-0.187373780531,-0.187279603922,-0.187185425591,-0.18709124554,-0.186997063768,-0.186902880278,-0.18680869507,-0.186714508145,-0.186620319504,-0.186526129147,-0.186431937076,-0.186337743291,-0.186243547794,-0.186149350584,-0.186055151663,-0.185960951033,-0.185866748693,-0.185772544644,-0.185678338888,-0.185584131425,-0.185489922257,-0.185395711383,-0.185301498805,-0.185207284524,-0.185113068541,-0.185018850856,-0.18492463147,-0.184830410385,-0.1847361876,-0.184641963118,-0.184547736939,-0.184453509063,-0.184359279491,-0.184265048226,-0.184170815266,-0.184076580613,-0.183982344269,-0.183888106233,-0.183793866507,-0.183699625092,-0.183605381988,-0.183511137197,-0.183416890719,-0.183322642555,-0.183228392705,-0.183134141172,-0.183039887955,-0.182945633056,-0.182851376475,-0.182757118214,-0.182662858272,-0.182568596652,-0.182474333353,-0.182380068377,-0.182285801725,-0.182191533397,-0.182097263395,-0.182002991719,-0.18190871837,-0.181814443348,-0.181720166656,-0.181625888293,-0.181531608261,-0.18143732656,-0.181343043192,-0.181248758156,-0.181154471455,-0.181060183088,-0.180965893058,-0.180871601363,-0.180777308007,-0.180683012988,-0.180588716309,-0.18049441797,-0.180400117972,-0.180305816315,-0.180211513002,-0.180117208031,-0.180022901406,-0.179928593125,-0.179834283191,-0.179739971603,-0.179645658364,-0.179551343473,-0.179457026932,-0.179362708741,-0.179268388902,-0.179174067415,-0.179079744281,-0.1789854195,-0.178891093075,-0.178796765005,-0.178702435292,-0.178608103936,-0.178513770939,-0.178419436301,-0.178325100022,-0.178230762105,-0.178136422549,-0.178042081356,-0.177947738526,-0.177853394061,-0.177759047961,-0.177664700227,-0.17757035086,-0.177475999861,-0.17738164723,-0.177287292969,-0.177192937079,-0.177098579559,-0.177004220412,-0.176909859638,-0.176815497238,-0.176721133212,-0.176626767562,-0.176532400289,-0.176438031393,-0.176343660875,-0.176249288736,-0.176154914977,-0.176060539599,-0.175966162603,-0.175871783989,-0.175777403759,-0.175683021913,-0.175588638452,-0.175494253377,-0.175399866689,-0.175305478389,-0.175211088478,-0.175116696956,-0.175022303824,-0.174927909083,-0.174833512735,-0.17473911478,-0.174644715218,-0.174550314051,-0.17445591128,-0.174361506905,-0.174267100928,-0.174172693348,-0.174078284168,-0.173983873387,-0.173889461008,-0.17379504703,-0.173700631454,-0.173606214282,-0.173511795514,-0.173417375152,-0.173322953195,-0.173228529645,-0.173134104503,-0.173039677769,-0.172945249445,-0.172850819531,-0.172756388029,-0.172661954938,-0.172567520261,-0.172473083997,-0.172378646148,-0.172284206714,-0.172189765697,-0.172095323097,-0.172000878915,-0.171906433152,-0.171811985809,-0.171717536887,-0.171623086386,-0.171528634308,-0.171434180654,-0.171339725423,-0.171245268618,-0.171150810238,-0.171056350285,-0.17096188876,-0.170867425664,-0.170772960997,-0.17067849476,-0.170584026954,-0.170489557581,-0.17039508664,-0.170300614133,-0.170206140061,-0.170111664424,-0.170017187224,-0.169922708461,-0.169828228136,-0.16973374625,-0.169639262803,-0.169544777798,-0.169450291234,-0.169355803112,-0.169261313434,-0.1691668222,-0.169072329411,-0.168977835068,-0.168883339172,-0.168788841724,-0.168694342724,-0.168599842173,-0.168505340073,-0.168410836423,-0.168316331226,-0.168221824482,-0.168127316191,-0.168032806355,-0.167938294975,-0.167843782051,-0.167749267584,-0.167654751575,-0.167560234025,-0.167465714935,-0.167371194305,-0.167276672137,-0.167182148432,-0.16708762319,-0.166993096412,-0.166898568099,-0.166804038252,-0.166709506872,-0.166614973959,-0.166520439515,-0.16642590354,-0.166331366036,-0.166236827003,-0.166142286441,-0.166047744353,-0.165953200738,-0.165858655598,-0.165764108933,-0.165669560745,-0.165575011034,-0.1654804598,-0.165385907046,-0.165291352772,-0.165196796978,-0.165102239666,-0.165007680836,-0.16491312049,-0.164818558628,-0.16472399525,-0.164629430359,-0.164534863954,-0.164440296037,-0.164345726609,-0.16425115567,-0.164156583221,-0.164062009263,-0.163967433797,-0.163872856825,-0.163778278345,-0.163683698361,-0.163589116871,-0.163494533879,-0.163399949383,-0.163305363385,-0.163210775887,-0.163116186888,-0.16302159639,-0.162927004393,-0.162832410899,-0.162737815908,-0.162643219421,-0.162548621439,-0.162454021963,-0.162359420994,-0.162264818533,-0.16217021458,-0.162075609136,-0.161981002202,-0.16188639378,-0.16179178387,-0.161697172472,-0.161602559588,-0.161507945219,-0.161413329366,-0.161318712028,-0.161224093208,-0.161129472906,-0.161034851122,-0.160940227859,-0.160845603116,-0.160750976895,-0.160656349196,-0.160561720021,-0.160467089369,-0.160372457243,-0.160277823642,-0.160183188569,-0.160088552023,-0.159993914005,-0.159899274517,-0.159804633559,-0.159709991132,-0.159615347237,-0.159520701875,-0.159426055047,-0.159331406753,-0.159236756995,-0.159142105773,-0.159047453088,-0.158952798942,-0.158858143334,-0.158763486266,-0.158668827739,-0.158574167753,-0.15847950631,-0.15838484341,-0.158290179054,-0.158195513243,-0.158100845978,-0.15800617726,-0.15791150709,-0.157816835468,-0.157722162395,-0.157627487873,-0.157532811902,-0.157438134483,-0.157343455616,-0.157248775304,-0.157154093546,-0.157059410343,-0.156964725697,-0.156870039608,-0.156775352077,-0.156680663105,-0.156585972693,-0.156491280842,-0.156396587552,-0.156301892824,-0.15620719666,-0.15611249906,-0.156017800025,-0.155923099556,-0.155828397654,-0.15573369432,-0.155638989554,-0.155544283357,-0.155449575731,-0.155354866676,-0.155260156193,-0.155165444282,-0.155070730946,-0.154976016184,-0.154881299997,-0.154786582387,-0.154691863355,-0.1545971429,-0.154502421024,-0.154407697728,-0.154312973013,-0.154218246879,-0.154123519328,-0.154028790361,-0.153934059977,-0.153839328178,-0.153744594966,-0.15364986034,-0.153555124302,-0.153460386852,-0.153365647992,-0.153270907723,-0.153176166044,-0.153081422957,-0.152986678464,-0.152891932564,-0.152797185258,-0.152702436549,-0.152607686435,-0.152512934919,-0.152418182001,-0.152323427682,-0.152228671963,-0.152133914845,-0.152039156328,-0.151944396414,-0.151849635103,-0.151754872397,-0.151660108295,-0.151565342799,-0.151470575911,-0.15137580763,-0.151281037957,-0.151186266894,-0.151091494442,-0.1509967206,-0.150901945371,-0.150807168755,-0.150712390752,-0.150617611364,-0.150522830592,-0.150428048436,-0.150333264897,-0.150238479977,-0.150143693675,-0.150048905994,-0.149954116933,-0.149859326494,-0.149764534677,-0.149669741484,-0.149574946915,-0.149480150972,-0.149385353654,-0.149290554963,-0.1491957549,-0.149100953465,-0.14900615066,-0.148911346486,-0.148816540942,-0.148721734031,-0.148626925753,-0.148532116108,-0.148437305099,-0.148342492725,-0.148247678987,-0.148152863887,-0.148058047424,-0.147963229601,-0.147868410418,-0.147773589876,-0.147678767976,-0.147583944718,-0.147489120103,-0.147394294133,-0.147299466808,-0.147204638129,-0.147109808097,-0.147014976713,-0.146920143977,-0.146825309891,-0.146730474455,-0.146635637671,-0.146540799539,-0.14644596006,-0.146351119234,-0.146256277064,-0.146161433549,-0.146066588691,-0.14597174249,-0.145876894947,-0.145782046064,-0.14568719584,-0.145592344277,-0.145497491376,-0.145402637138,-0.145307781563,-0.145212924653,-0.145118066408,-0.145023206829,-0.144928345916,-0.144833483672,-0.144738620097,-0.144643755191,-0.144548888955,-0.144454021391,-0.144359152499,-0.14426428228,-0.144169410735,-0.144074537865,-0.143979663671,-0.143884788153,-0.143789911312,-0.14369503315,-0.143600153667,-0.143505272865,-0.143410390743,-0.143315507303,-0.143220622545,-0.143125736471,-0.143030849082,-0.142935960378,-0.14284107036,-0.142746179029,-0.142651286386,-0.142556392431,-0.142461497167,-0.142366600593,-0.14227170271,-0.142176803519,-0.142081903022,-0.141987001219,-0.14189209811,-0.141797193698,-0.141702287982,-0.141607380963,-0.141512472643,-0.141417563022,-0.141322652102,-0.141227739882,-0.141132826364,-0.141037911549,-0.140942995437,-0.14084807803,-0.140753159328,-0.140658239333,-0.140563318044,-0.140468395464,-0.140373471592,-0.140278546431,-0.140183619979,-0.14008869224,-0.139993763212,-0.139898832898,-0.139803901298,-0.139708968412,-0.139614034243,-0.13951909879,-0.139424162055,-0.139329224038,-0.139234284741,-0.139139344164,-0.139044402308,-0.138949459173,-0.138854514762,-0.138759569074,-0.138664622111,-0.138569673873,-0.138474724362,-0.138379773578,-0.138284821522,-0.138189868194,-0.138094913597,-0.13799995773,-0.137905000595,-0.137810042192,-0.137715082522,-0.137620121586,-0.137525159386,-0.137430195921,-0.137335231194,-0.137240265204,-0.137145297952,-0.13705032944,-0.136955359668,-0.136860388637,-0.136765416348,-0.136670442802,-0.136575468,-0.136480491942,-0.13638551463,-0.136290536064,-0.136195556246,-0.136100575176,-0.136005592854,-0.135910609283,-0.135815624462,-0.135720638393,-0.135625651076,-0.135530662513,-0.135435672704,-0.13534068165,-0.135245689352,-0.135150695811,-0.135055701028,-0.134960705003,-0.134865707738,-0.134770709233,-0.134675709489,-0.134580708507,-0.134485706288,-0.134390702834,-0.134295698143,-0.134200692219,-0.134105685061,-0.13401067667,-0.133915667047,-0.133820656194,-0.13372564411,-0.133630630797,-0.133535616256,-0.133440600488,-0.133345583493,-0.133250565272,-0.133155545827,-0.133060525157,-0.132965503265,-0.13287048015,-0.132775455814,-0.132680430257,-0.132585403481,-0.132490375487,-0.132395346274,-0.132300315844,-0.132205284199,-0.132110251338,-0.132015217263,-0.131920181974,-0.131825145473,-0.13173010776,-0.131635068837,-0.131540028703,-0.13144498736,-0.131349944809,-0.131254901051,-0.131159856086,-0.131064809916,-0.130969762541,-0.130874713962,-0.13077966418,-0.130684613196,-0.13058956101,-0.130494507625,-0.13039945304,-0.130304397256,-0.130209340275,-0.130114282096,-0.130019222722,-0.129924162153,-0.129829100389,-0.129734037432,-0.129638973283,-0.129543907942,-0.12944884141,-0.129353773688,-0.129258704778,-0.129163634679,-0.129068563393,-0.128973490921,-0.128878417263,-0.12878334242,-0.128688266394,-0.128593189185,-0.128498110794,-0.128403031222,-0.128307950469,-0.128212868537,-0.128117785427,-0.128022701139,-0.127927615674,-0.127832529033,-0.127737441218,-0.127642352228,-0.127547262065,-0.127452170729,-0.127357078222,-0.127261984545,-0.127166889697,-0.127071793681,-0.126976696497,-0.126881598145,-0.126786498628,-0.126691397945,-0.126596296097,-0.126501193086,-0.126406088912,-0.126310983576,-0.126215877079,-0.126120769422,-0.126025660606,-0.125930550631,-0.125835439498,-0.12574032721,-0.125645213765,-0.125550099165,-0.125454983412,-0.125359866505,-0.125264748446,-0.125169629235,-0.125074508874,-0.124979387363,-0.124884264704,-0.124789140897,-0.124694015942,-0.124598889842,-0.124503762596,-0.124408634205,-0.124313504672,-0.124218373995,-0.124123242177,-0.124028109218,-0.123932975119,-0.12383783988,-0.123742703503,-0.123647565989,-0.123552427339,-0.123457287552,-0.123362146631,-0.123267004576,-0.123171861388,-0.123076717068,-0.122981571617,-0.122886425035,-0.122791277323,-0.122696128483,-0.122600978515,-0.12250582742,-0.122410675199,-0.122315521853,-0.122220367383,-0.122125211789,-0.122030055073,-0.121934897235,-0.121839738276,-0.121744578197,-0.121649416999,-0.121554254683,-0.12145909125,-0.1213639267,-0.121268761035,-0.121173594255,-0.121078426361,-0.120983257354,-0.120888087236,-0.120792916006,-0.120697743666,-0.120602570216,-0.120507395658,-0.120412219992,-0.120317043219,-0.120221865341,-0.120126686357,-0.120031506269,-0.119936325078,-0.119841142785,-0.119745959389,-0.119650774894,-0.119555589298,-0.119460402604,-0.119365214811,-0.119270025921,-0.119174835935,-0.119079644854,-0.118984452678,-0.118889259408,-0.118794065045,-0.118698869591,-0.118603673045,-0.11850847541,-0.118413276685,-0.118318076871,-0.11822287597,-0.118127673983,-0.118032470909,-0.117937266751,-0.117842061508,-0.117746855183,-0.117651647775,-0.117556439285,-0.117461229715,-0.117366019066,-0.117270807338,-0.117175594531,-0.117080380648,-0.116985165688,-0.116889949653,-0.116794732544,-0.116699514361,-0.116604295106,-0.116509074778,-0.11641385338,-0.116318630912,-0.116223407374,-0.116128182769,-0.116032957095,-0.115937730356,-0.11584250255,-0.11574727368,-0.115652043746,-0.115556812749,-0.115461580689,-0.115366347569,-0.115271113388,-0.115175878147,-0.115080641848,-0.114985404491,-0.114890166077,-0.114794926607,-0.114699686081,-0.114604444502,-0.114509201869,-0.114413958183,-0.114318713446,-0.114223467658,-0.11412822082,-0.114032972933,-0.113937723998,-0.113842474016,-0.113747222987,-0.113651970913,-0.113556717794,-0.113461463631,-0.113366208425,-0.113270952178,-0.113175694889,-0.113080436559,-0.112985177191,-0.112889916784,-0.112794655339,-0.112699392857,-0.11260412934,-0.112508864787,-0.112413599201,-0.112318332581,-0.112223064928,-0.112127796244,-0.11203252653,-0.111937255786,-0.111841984012,-0.111746711211,-0.111651437383,-0.111556162528,-0.111460886648,-0.111365609743,-0.111270331815,-0.111175052864,-0.111079772891,-0.110984491897,-0.110889209883,-0.11079392685,-0.110698642798,-0.110603357729,-0.110508071643,-0.110412784541,-0.110317496424,-0.110222207294,-0.11012691715,-0.110031625994,-0.109936333827,-0.109841040649,-0.109745746461,-0.109650451265,-0.109555155061,-0.10945985785,-0.109364559632,-0.10926926041,-0.109173960183,-0.109078658952,-0.108983356719,-0.108888053485,-0.108792749249,-0.108697444013,-0.108602137778,-0.108506830545,-0.108411522315,-0.108316213088,-0.108220902865,-0.108125591648,-0.108030279437,-0.107934966233,-0.107839652036,-0.107744336849,-0.107649020671,-0.107553703504,-0.107458385348,-0.107363066204,-0.107267746073,-0.107172424957,-0.107077102855,-0.106981779769,-0.1068864557,-0.106791130648,-0.106695804615,-0.106600477601,-0.106505149607,-0.106409820634,-0.106314490683,-0.106219159755,-0.106123827851,-0.106028494971,-0.105933161116,-0.105837826288,-0.105742490487,-0.105647153713,-0.105551815969,-0.105456477255,-0.105361137571,-0.105265796919,-0.105170455299,-0.105075112713,-0.10497976916,-0.104884424643,-0.104789079162,-0.104693732717,-0.10459838531,-0.104503036942,-0.104407687613,-0.104312337325,-0.104216986077,-0.104121633872,-0.10402628071,-0.103930926591,-0.103835571517,-0.103740215489,-0.103644858507,-0.103549500573,-0.103454141686,-0.103358781849,-0.103263421062,-0.103168059325,-0.10307269664,-0.102977333008,-0.102881968429,-0.102786602905,-0.102691236436,-0.102595869022,-0.102500500666,-0.102405131368,-0.102309761128,-0.102214389948,-0.102119017829,-0.10202364477,-0.101928270774,-0.101832895841,-0.101737519973,-0.101642143168,-0.10154676543,-0.101451386758,-0.101356007154,-0.101260626618,-0.101165245151,-0.101069862755,-0.100974479429,-0.100879095176,-0.100783709995,-0.100688323887,-0.100592936854,-0.100497548897,-0.100402160016,-0.100306770211,-0.100211379485,-0.100115987838,-0.100020595271,-0.0999252017837,-0.0998298073783,-0.0997344120553,-0.0996390158156,-0.0995436186601,-0.0994482205895,-0.0993528216049,-0.099257421707,-0.0991620208967,-0.099066619175,-0.0989712165427,-0.0988758130007,-0.0987804085498,-0.098685003191,-0.098589596925,-0.0984941897529,-0.0983987816754,-0.0983033726934,-0.0982079628079,-0.0981125520196,-0.0980171403296,-0.0979217277385,-0.0978263142474,-0.0977308998571,-0.0976354845685,-0.0975400683825,-0.0974446512998,-0.0973492333215,-0.0972538144484,-0.0971583946813,-0.0970629740212,-0.0969675524688,-0.0968721300252,-0.0967767066912,-0.0966812824676,-0.0965858573553,-0.0964904313553,-0.0963950044683,-0.0962995766952,-0.096204148037,-0.0961087184946,-0.0960132880687,-0.0959178567602,-0.0958224245702,-0.0957269914993,-0.0956315575485,-0.0955361227188,-0.0954406870108,-0.0953452504256,-0.095249812964,-0.0951543746269,-0.0950589354152,-0.0949634953296,-0.0948680543712,-0.0947726125408,-0.0946771698393,-0.0945817262675,-0.0944862818264,-0.0943908365167,-0.0942953903394,-0.0941999432954,-0.0941044953855,-0.0940090466106,-0.0939135969716,-0.0938181464694,-0.0937226951048,-0.0936272428788,-0.0935317897921,-0.0934363358457,-0.0933408810405,-0.0932454253773,-0.093149968857,-0.0930545114805,-0.0929590532487,-0.0928635941624,-0.0927681342225,-0.0926726734299,-0.0925772117855,-0.0924817492901,-0.0923862859447,-0.0922908217501,-0.0921953567071,-0.0920998908167,-0.0920044240798,-0.0919089564971,-0.0918134880697,-0.0917180187983,-0.0916225486839,-0.0915270777273,-0.0914316059294,-0.0913361332911,-0.0912406598132,-0.0911451854967,-0.0910497103424,-0.0909542343511,-0.0908587575239,-0.0907632798615,-0.0906678013648,-0.0905723220347,-0.0904768418721,-0.0903813608779,-0.0902858790529,-0.0901903963979,-0.090094912914,-0.089999428602,-0.0899039434627,-0.089808457497,-0.0897129707058,-0.08961748309,-0.0895219946505,-0.0894265053881,-0.0893310153037,-0.0892355243981,-0.0891400326724,-0.0890445401273,-0.0889490467637,-0.0888535525825,-0.0887580575846,-0.0886625617709,-0.0885670651421,-0.0884715676993,-0.0883760694433,-0.088280570375,-0.0881850704952,-0.0880895698048,-0.0879940683047,-0.0878985659958,-0.0878030628789,-0.087707558955,-0.0876120542249,-0.0875165486895,-0.0874210423496,-0.0873255352062,-0.0872300272601,-0.0871345185122,-0.0870390089634,-0.0869434986145,-0.0868479874665,-0.0867524755202,-0.0866569627765,-0.0865614492363,-0.0864659349003,-0.0863704197697,-0.0862749038451,-0.0861793871275,-0.0860838696177,-0.0859883513167,-0.0858928322253,-0.0857973123444,-0.0857017916749,-0.0856062702176,-0.0855107479735,-0.0854152249433,-0.085319701128,-0.0852241765285,-0.0851286511456,-0.0850331249803,-0.0849375980333,-0.0848420703056,-0.0847465417981,-0.0846510125116,-0.0845554824469,-0.0844599516051,-0.0843644199869,-0.0842688875933,-0.0841733544251,-0.0840778204832,-0.0839822857685,-0.0838867502818,-0.083791214024,-0.0836956769961,-0.0836001391988,-0.0835046006332,-0.0834090612999,-0.0833135212,-0.0832179803343,-0.0831224387036,-0.0830268963089,-0.0829313531511,-0.0828358092309,-0.0827402645494,-0.0826447191073,-0.0825491729056,-0.0824536259451,-0.0823580782266,-0.0822625297512,-0.0821669805197,-0.0820714305328,-0.0819758797916,-0.0818803282969,-0.0817847760496,-0.0816892230505,-0.0815936693005,-0.0814981148006,-0.0814025595515,-0.0813070035542,-0.0812114468096,-0.0811158893185,-0.0810203310817,-0.0809247721003,-0.080829212375,-0.0807336519067,-0.0806380906964,-0.0805425287448,-0.080446966053,-0.0803514026216,-0.0802558384517,-0.0801602735441,-0.0800647078997,-0.0799691415193,-0.0798735744039,-0.0797780065543,-0.0796824379714,-0.0795868686561,-0.0794912986092,-0.0793957278317,-0.0793001563244,-0.0792045840882,-0.0791090111239,-0.0790134374325,-0.0789178630148,-0.0788222878717,-0.0787267120041,-0.0786311354129,-0.0785355580988,-0.078439980063,-0.0783444013061,-0.0782488218291,-0.0781532416328,-0.0780576607182,-0.077962079086,-0.0778664967373,-0.0777709136729,-0.0776753298935,-0.0775797454003,-0.0774841601939,-0.0773885742753,-0.0772929876453,-0.0771974003049,-0.0771018122549,-0.0770062234962,-0.0769106340297,-0.0768150438563,-0.0767194529767,-0.076623861392,-0.076528269103,-0.0764326761105,-0.0763370824155,-0.0762414880189,-0.0761458929214,-0.076050297124,-0.0759547006275,-0.075859103433,-0.0757635055411,-0.0756679069528,-0.075572307669,-0.0754767076906,-0.0753811070184,-0.0752855056533,-0.0751899035962,-0.0750943008479,-0.0749986974094,-0.0749030932816,-0.0748074884652,-0.0747118829613,-0.0746162767706,-0.074520669894,-0.0744250623325,-0.0743294540868,-0.074233845158,-0.0741382355468,-0.0740426252541,-0.0739470142809,-0.073851402628,-0.0737557902962,-0.0736601772865,-0.0735645635997,-0.0734689492367,-0.0733733341984,-0.0732777184857,-0.0731821020994,-0.0730864850405,-0.0729908673097,-0.072895248908,-0.0727996298364,-0.0727040100955,-0.0726083896864,-0.0725127686098,-0.0724171468668,-0.0723215244581,-0.0722259013846,-0.0721302776472,-0.0720346532469,-0.0719390281844,-0.0718434024607,-0.0717477760766,-0.071652149033,-0.0715565213308,-0.0714608929708,-0.0713652639541,-0.0712696342813,-0.0711740039534,-0.0710783729714,-0.070982741336,-0.0708871090481,-0.0707914761086,-0.0706958425185,-0.0706002082785,-0.0705045733896,-0.0704089378526,-0.0703133016685,-0.070217664838,-0.0701220273621,-0.0700263892417,-0.0699307504776,-0.0698351110707,-0.0697394710219,-0.0696438303321,-0.0695481890021,-0.0694525470328,-0.0693569044252,-0.06926126118,-0.0691656172982,-0.0690699727807,-0.0689743276283,-0.0688786818418,-0.0687830354223,-0.0686873883705,-0.0685917406874,-0.0684960923738,-0.0684004434305,-0.0683047938586,-0.0682091436588,-0.0681134928321,-0.0680178413792,-0.0679221893012,-0.0678265365988,-0.067730883273,-0.0676352293246,-0.0675395747545,-0.0674439195637,-0.0673482637529,-0.067252607323,-0.067156950275,-0.0670612926096,-0.0669656343279,-0.0668699754306,-0.0667743159187,-0.066678655793,-0.0665829950544,-0.0664873337038,-0.066391671742,-0.06629600917,-0.0662003459886,-0.0661046821988,-0.0660090178013,-0.065913352797,-0.0658176871869,-0.0657220209718,-0.0656263541526,-0.0655306867302,-0.0654350187054,-0.0653393500792,-0.0652436808524,-0.0651480110259,-0.0650523406005,-0.0649566695772,-0.0648609979569,-0.0647653257403,-0.0646696529285,-0.0645739795222,-0.0644783055224,-0.0643826309299,-0.0642869557456,-0.0641912799704,-0.0640956036051,-0.0639999266507,-0.063904249108,-0.063808570978,-0.0637128922614,-0.0636172129592,-0.0635215330722,-0.0634258526014,-0.0633301715475,-0.0632344899116,-0.0631388076944,-0.0630431248968,-0.0629474415198,-0.0628517575642,-0.0627560730308,-0.0626603879206,-0.0625647022345,-0.0624690159732,-0.0623733291378,-0.062277641729,-0.0621819537478,-0.0620862651951,-0.0619905760716,-0.0618948863784,-0.0617991961162,-0.061703505286,-0.0616078138886,-0.0615121219249,-0.0614164293958,-0.0613207363022,-0.061225042645,-0.0611293484249,-0.061033653643,-0.0609379583001,-0.0608422623971,-0.0607465659348,-0.0606508689141,-0.0605551713359,-0.0604594732012,-0.0603637745107,-0.0602680752653,-0.060172375466,-0.0600766751136,-0.059980974209,-0.059885272753,-0.0597895707466,-0.0596938681907,-0.059598165086,-0.0595024614335,-0.0594067572341,-0.0593110524886,-0.059215347198,-0.059119641363,-0.0590239349847,-0.0589282280638,-0.0588325206012,-0.0587368125979,-0.0586411040547,-0.0585453949724,-0.0584496853521,-0.0583539751944,-0.0582582645004,-0.0581625532709,-0.0580668415068,-0.0579711292089,-0.0578754163782,-0.0577797030155,-0.0576839891217,-0.0575882746977,-0.0574925597444,-0.0573968442626,-0.0573011282532,-0.0572054117171,-0.0571096946552,-0.0570139770683,-0.0569182589574,-0.0568225403233,-0.0567268211669,-0.0566311014891,-0.0565353812907,-0.0564396605727,-0.0563439393359,-0.0562482175812,-0.0561524953095,-0.0560567725216,-0.0559610492185,-0.055865325401,-0.05576960107,-0.0556738762264,-0.055578150871,-0.0554824250048,-0.0553866986286,-0.0552909717432,-0.0551952443497,-0.0550995164488,-0.0550037880415,-0.0549080591285,-0.0548123297109,-0.0547165997894,-0.054620869365,-0.0545251384386,-0.0544294070109,-0.054333675083,-0.0542379426556,-0.0541422097297,-0.0540464763061,-0.0539507423857,-0.0538550079695,-0.0537592730582,-0.0536635376527,-0.053567801754,-0.0534720653629,-0.0533763284804,-0.0532805911071,-0.0531848532442,-0.0530891148924,-0.0529933760526,-0.0528976367257,-0.0528018969125,-0.0527061566141,-0.0526104158311,-0.0525146745646,-0.0524189328154,-0.0523231905843,-0.0522274478723,-0.0521317046803,-0.052035961009,-0.0519402168595,-0.0518444722325,-0.051748727129,-0.0516529815499,-0.0515572354959,-0.051461488968,-0.0513657419672,-0.0512699944941,-0.0511742465499,-0.0510784981352,-0.050982749251,-0.0508869998982,-0.0507912500777,-0.0506954997903,-0.0505997490369,-0.0505039978184,-0.0504082461357,-0.0503124939897,-0.0502167413812,-0.0501209883111,-0.0500252347803,-0.0499294807897,-0.0498337263401,-0.0497379714325,-0.0496422160677,-0.0495464602466,-0.0494507039701,-0.049354947239,-0.0492591900543,-0.0491634324168,-0.0490676743274,-0.048971915787,-0.0488761567964,-0.0487803973566,-0.0486846374684,-0.0485888771327,-0.0484931163504,-0.0483973551224,-0.0483015934495,-0.0482058313326,-0.0481100687726,-0.0480143057704,-0.0479185423269,-0.0478227784429,-0.0477270141193,-0.047631249357,-0.047535484157,-0.0474397185199,-0.0473439524469,-0.0472481859386,-0.0471524189961,-0.0470566516201,-0.0469608838116,-0.0468651155715,-0.0467693469005,-0.0466735777997,-0.0465778082699,-0.0464820383119,-0.0463862679267,-0.0462904971151,-0.046194725878,-0.0460989542163,-0.0460031821309,-0.0459074096226,-0.0458116366924,-0.045715863341,-0.0456200895695,-0.0455243153786,-0.0454285407693,-0.0453327657424,-0.0452369902988,-0.0451412144394,-0.0450454381651,-0.0449496614767,-0.0448538843752,-0.0447581068613,-0.0446623289361,-0.0445665506003,-0.0444707718549,-0.0443749927008,-0.0442792131387,-0.0441834331696,-0.0440876527945,-0.043991872014,-0.0438960908292,-0.0438003092409,-0.0437045272501,-0.0436087448575,-0.043512962064,-0.0434171788706,-0.0433213952781,-0.0432256112874,-0.0431298268994,-0.043034042115,-0.0429382569349,-0.0428424713602,-0.0427466853918,-0.0426508990304,-0.0425551122769,-0.0424593251323,-0.0423635375974,-0.0422677496731,-0.0421719613603,-0.0420761726599,-0.0419803835727,-0.0418845940997,-0.0417888042416,-0.0416930139995,-0.0415972233741,-0.0415014323663,-0.0414056409771,-0.0413098492073,-0.0412140570577,-0.0411182645294,-0.0410224716231,-0.0409266783397,-0.0408308846801,-0.0407350906452,-0.0406392962359,-0.0405435014531,-0.0404477062976,-0.0403519107703,-0.040256114872,-0.0401603186038,-0.0400645219664,-0.0399687249608,-0.0398729275877,-0.0397771298482,-0.039681331743,-0.0395855332731,-0.0394897344394,-0.0393939352426,-0.0392981356838,-0.0392023357637,-0.0391065354833,-0.0390107348435,-0.038914933845,-0.0388191324889,-0.0387233307759,-0.038627528707,-0.0385317262831,-0.038435923505,-0.0383401203736,-0.0382443168897,-0.0381485130544,-0.0380527088683,-0.0379569043325,-0.0378610994479,-0.0377652942152,-0.0376694886353,-0.0375736827093,-0.0374778764378,-0.0373820698219,-0.0372862628624,-0.0371904555601,-0.037094647916,-0.0369988399309,-0.0369030316057,-0.0368072229414,-0.0367114139387,-0.0366156045985,-0.0365197949218,-0.0364239849094,-0.0363281745623,-0.0362323638812,-0.036136552867,-0.0360407415207,-0.0359449298431,-0.0358491178351,-0.0357533054976,-0.0356574928315,-0.0355616798376,-0.0354658665169,-0.0353700528701,-0.0352742388982,-0.0351784246021,-0.0350826099826,-0.0349867950407,-0.0348909797772,-0.034795164193,-0.0346993482889,-0.0346035320659,-0.0345077155248,-0.0344118986665,-0.034316081492,-0.034220264002,-0.0341244461974,-0.0340286280792,-0.0339328096482,-0.0338369909053,-0.0337411718514,-0.0336453524873,-0.033549532814,-0.0334537128323,-0.0333578925431,-0.0332620719473,-0.0331662510457,-0.0330704298393,-0.0329746083289,-0.0328787865154,-0.0327829643997,-0.0326871419827,-0.0325913192652,-0.0324954962481,-0.0323996729324,-0.0323038493188,-0.0322080254083,-0.0321122012018,-0.0320163767,-0.031920551904,-0.0318247268146,-0.0317289014327,-0.0316330757591,-0.0315372497948,-0.0314414235406,-0.0313455969973,-0.031249770166,-0.0311539430474,-0.0310581156424,-0.030962287952,-0.030866459977,-0.0307706317182,-0.0306748031766,-0.0305789743531,-0.0304831452485,-0.0303873158637,-0.0302914861995,-0.030195656257,-0.0300998260369,-0.0300039955401,-0.0299081647675,-0.02981233372,-0.0297165023985,-0.0296206708039,-0.0295248389369,-0.0294290067986,-0.0293331743898,-0.0292373417114,-0.0291415087642,-0.0290456755491,-0.0289498420671,-0.028854008319,-0.0287581743056,-0.028662340028,-0.0285665054868,-0.0284706706831,-0.0283748356177,-0.0282790002914,-0.0281831647053,-0.02808732886,-0.0279914927567,-0.027895656396,-0.0277998197789,-0.0277039829062,-0.027608145779,-0.0275123083979,-0.027416470764,-0.0273206328781,-0.027224794741,-0.0271289563537,-0.027033117717,-0.0269372788319,-0.0268414396991,-0.0267456003196,-0.0266497606943,-0.026553920824,-0.0264580807097,-0.0263622403521,-0.0262663997523,-0.026170558911,-0.0260747178291,-0.0259788765076,-0.0258830349473,-0.025787193149,-0.0256913511138,-0.0255955088423,-0.0254996663357,-0.0254038235946,-0.02530798062,-0.0252121374128,-0.0251162939739,-0.0250204503041,-0.0249246064043,-0.0248287622754,-0.0247329179183,-0.0246370733338,-0.0245412285229,-0.0244453834864,-0.0243495382252,-0.0242536927402,-0.0241578470323,-0.0240620011023,-0.0239661549511,-0.0238703085797,-0.0237744619888,-0.0236786151794,-0.0235827681524,-0.0234869209086,-0.0233910734489,-0.0232952257742,-0.0231993778853,-0.0231035297833,-0.0230076814688,-0.0229118329429,-0.0228159842064,-0.0227201352602,-0.0226242861051,-0.0225284367421,-0.0224325871719,-0.0223367373956,-0.022240887414,-0.022145037228,-0.0220491868384,-0.0219533362461,-0.021857485452,-0.021761634457,-0.021665783262,-0.0215699318679,-0.0214740802755,-0.0213782284857,-0.0212823764994,-0.0211865243174,-0.0210906719408,-0.0209948193702,-0.0208989666067,-0.0208031136511,-0.0207072605043,-0.0206114071671,-0.0205155536405,-0.0204196999253,-0.0203238460224,-0.0202279919327,-0.0201321376571,-0.0200362831964,-0.0199404285515,-0.0198445737234,-0.0197487187128,-0.0196528635207,-0.019557008148,-0.0194611525955,-0.0193652968642,-0.0192694409548,-0.0191735848683,-0.0190777286056,-0.0189818721675,-0.0188860155549,-0.0187901587688,-0.0186943018099,-0.0185984446792,-0.0185025873775,-0.0184067299058,-0.0183108722649,-0.0182150144556,-0.018119156479,-0.0180232983358,-0.0179274400269,-0.0178315815532,-0.0177357229157,-0.0176398641151,-0.0175440051524,-0.0174481460284,-0.017352286744,-0.0172564273001,-0.0171605676976,-0.0170647079374,-0.0169688480203,-0.0168729879473,-0.0167771277191,-0.0166812673368,-0.0165854068011,-0.016489546113,-0.0163936852733,-0.0162978242829,-0.0162019631427,-0.0161061018535,-0.0160102404164,-0.015914378832,-0.0158185171014,-0.0157226552254,-0.0156267932049,-0.0155309310407,-0.0154350687338,-0.015339206285,-0.0152433436952,-0.0151474809653,-0.0150516180961,-0.0149557550886,-0.0148598919437,-0.0147640286621,-0.0146681652449,-0.0145723016928,-0.0144764380067,-0.0143805741876,-0.0142847102364,-0.0141888461538,-0.0140929819408,-0.0139971175982,-0.013901253127,-0.0138053885281,-0.0137095238022,-0.0136136589503,-0.0135177939733,-0.013421928872,-0.0133260636473,-0.0132301983002,-0.0131343328315,-0.013038467242,-0.0129426015327,-0.0128467357044,-0.012750869758,-0.0126550036944,-0.0125591375145,-0.0124632712192,-0.0123674048093,-0.0122715382857,-0.0121756716493,-0.0120798049011,-0.0119839380417,-0.0118880710723,-0.0117922039935,-0.0116963368064,-0.0116004695117,-0.0115046021104,-0.0114087346034,-0.0113128669915,-0.0112169992756,-0.0111211314566,-0.0110252635354,-0.0109293955129,-0.0108335273899,-0.0107376591673,-0.010641790846,-0.0105459224269,-0.0104500539108,-0.0103541852987,-0.0102583165915,-0.0101624477899,-0.0100665788949,-0.00997070990742,-0.00987484082827,-0.00977897165835,-0.00968310239854,-0.00958723304973,-0.00949136361279,-0.00939549408862,-0.00929962447808,-0.00920375478206,-0.00910788500144,-0.00901201513711,-0.00891614518993,-0.00882027516081,-0.00872440505061,-0.00862853486021,-0.00853266459051,-0.00843679424237,-0.00834092381668,-0.00824505331433,-0.00814918273619,-0.00805331208315,-0.00795744135608,-0.00786157055586,-0.00776569968339,-0.00766982873953,-0.00757395772518,-0.0074780866412,-0.00738221548849,-0.00728634426793,-0.00719047298039,-0.00709460162675,-0.00699873020791,-0.00690285872473,-0.0068069871781,-0.00671111556891,-0.00661524389803,-0.00651937216634,-0.00642350037473,-0.00632762852407,-0.00623175661525,-0.00613588464915,-0.00604001262666,-0.00594414054864,-0.00584826841598,-0.00575239622957,-0.00565652399029,-0.00556065169901,-0.00546477935662,-0.005368906964,-0.00527303452202,-0.00517716203158,-0.00508128949356,-0.00498541690882,-0.00488954427826,-0.00479367160276,-0.0046977988832,-0.00460192612045,-0.0045060533154,-0.00441018046894,-0.00431430758194,-0.00421843465528,-0.00412256168984,-0.00402668868652,-0.00393081564618,-0.00383494256971,-0.00373906945799,-0.0036431963119,-0.00354732313232,-0.00345144992014,-0.00335557667623,-0.00325970340148,-0.00316383009676,-0.00306795676297,-0.00297208340097,-0.00287621001166,-0.0027803365959,-0.0026844631546,-0.00258858968861,-0.00249271619884,-0.00239684268615,-0.00230096915143,-0.00220509559556,-0.00210922201942,-0.00201334842389,-0.00191747480986,-0.0018216011782,-0.0017257275298,-0.00162985386553,-0.00153398018629,-0.00143810649294,-0.00134223278637,-0.00124635906747,-0.00115048533711,-0.00105461159618,-0.000958737845554,-0.000862864086114,-0.000766990318743,-0.000671116544322,-0.000575242763732,-0.000479368977855,-0.000383495187572,-0.000287621393764,-0.000191747597311,-9.58737990961e-05,0.0,9.5873799096e-05}; + +} diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/sineTable.h b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/sineTable.h new file mode 100644 index 0000000..138cbaf --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/sineTable.h @@ -0,0 +1,15 @@ +/* + * sineTable.h + * atomSynthesis + * + * Created by Chris on 10/11/2011. + * Copyright 2011 Goldsmiths Creative Computing. All rights reserved. + * + */ +#pragma once + +namespace waveTable { + +extern float sine65536[65538]; + +} diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/voiceSpace.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/voiceSpace.hpp new file mode 100644 index 0000000..005017a --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/synth/voiceSpace.hpp @@ -0,0 +1,18 @@ +#ifndef MEMLLIB_SYNTH_VOICESPACE_HPP +#define MEMLLIB_SYNTH_VOICESPACE_HPP + + +#include + +namespace VoiceSpaces { + using Fn = void(*)(std::span); + using VoiceSpaceList = std::span; + + struct VoiceSpace { + char name[16]="default"; + Fn mappingFunction = nullptr; + }; + +}; + +#endif // MEMLLIB_SYNTH_VOICESPACE_HPP \ No newline at end of file diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/CircularBuffer.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/CircularBuffer.hpp new file mode 100644 index 0000000..e21186e --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/CircularBuffer.hpp @@ -0,0 +1,50 @@ +#ifndef MEMLLIB_UTILS_CIRCULAR_BUFFER_HPP +#define MEMLLIB_UTILS_CIRCULAR_BUFFER_HPP + + + +template +class CircularBuffer { +private: + static_assert((N & (N - 1)) == 0, "Buffer size must be a power of 2"); + T buffer[N]; + size_t head = 0; + +public: + // Initialize buffer with zeros + CircularBuffer() : buffer() { + // Zero-initialize all elements + for (size_t i = 0; i < N; i++) { + buffer[i] = T(); + } + } + + // O(1) push operation - always overwrites oldest value + inline void __attribute__((always_inline)) push(T value) { + buffer[head] = value; + head = (head + 1) & (N - 1); + } + + // Copy contents to external array - no allocations + inline void __attribute__((always_inline)) copyTo(T dest[]) const { + for (size_t i = 0; i < N; i++) { + dest[i] = buffer[(head + i) & (N - 1)]; + } + } + + // Direct array-like access + inline T& __attribute__((always_inline)) operator[](size_t index) { + return buffer[(head + index) & (N - 1)]; + } + + inline const __attribute__((always_inline)) T& operator[](size_t index) const { + return buffer[(head + index) & (N - 1)]; + } + + // Always returns N since buffer is always full + inline constexpr size_t __attribute__((always_inline)) size() const { + return N; + } +}; + +#endif // MEMLLIB_UTILS_CIRCULAR_BUFFER_HPP diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/Debounce.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/Debounce.hpp new file mode 100644 index 0000000..a4f67f6 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/Debounce.hpp @@ -0,0 +1,66 @@ +#ifndef __DEBOUNCE_HPP__ +#define __DEBOUNCE_HPP__ + +#include + +class ButtonDebounce { +private: + static constexpr unsigned long kHaltTime_ms = 50; + unsigned long lastPressTime_ms = 0; + +public: + bool debounce() { + unsigned long currentTime = millis(); + if (currentTime - lastPressTime_ms >= kHaltTime_ms) { + lastPressTime_ms = currentTime; + return true; + } + return false; + } + void setState(bool pressed) { + if (pressed) { + lastPressTime_ms = millis() - kHaltTime_ms; + } else { + lastPressTime_ms = millis(); + } + } +}; + +class ToggleDebounce { +private: + static constexpr unsigned long kHaltTime_ms = 50; + unsigned long lastChangeTime_ms = 0; + bool lastState = false; + bool lastState_internal_ = false; + bool stateChanged = false; + +public: + bool debounce(bool currentState) { + unsigned long currentTime = millis(); + bool shouldUpdate = false; + + //Serial.println(String("Pin state: ") + (currentState ? "1" : "0")); + //Serial.println(String("Last state: ") + (lastState_internal_ ? "1" : "0")); + //Serial.println(String("Time since last change: ") + (currentTime - lastChangeTime_ms) + " ms"); + + if (currentState != lastState_internal_ && + currentTime - lastChangeTime_ms >= kHaltTime_ms) { + lastChangeTime_ms = currentTime; + lastState = currentState; + shouldUpdate = true; + //Serial.println(String("State updated to ") + (lastState ? "1" : "0")); + } + lastState_internal_ = currentState; + return shouldUpdate; + } + + bool getState() const { + return lastState; + } + void setState(bool state) { + lastState = state; + lastChangeTime_ms = millis() - kHaltTime_ms; + } +}; + +#endif // __DEBOUNCE_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/Format.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/Format.hpp new file mode 100644 index 0000000..021df07 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/Format.hpp @@ -0,0 +1,171 @@ +#ifndef __FORMAT_HPP__ +#define __FORMAT_HPP__ + + +#include +#include +#include + +template +void formatNumber(char* buf, T value) { + if constexpr(std::is_floating_point_v) { + if (isnan(value)) { + strcpy(buf, " NaN "); + return; + } + if (isinf(value)) { + strcpy(buf, " Inf "); + return; + } + + float absVal = fabs(value); + if (absVal < 1e-10) { + strcpy(buf, " 0 "); + return; + } + if (absVal >= 1e10) { + strcpy(buf, " OVER"); + return; + } + + char tempBuf[16]; + if (absVal >= 0.001f && absVal < 10.0f) { + dtostrf(value, 5, 3, tempBuf); + } else if (absVal >= 10.0f && absVal < 100.0f) { + dtostrf(value, 5, 2, tempBuf); + } else if (absVal >= 100.0f && absVal < 1000.0f) { + dtostrf(value, 5, 1, tempBuf); + } else { + // Handle scientific notation manually with controlled width + int exponent = floor(log10(absVal)); + float mantissa = value / pow(10, exponent); + if (value < 0) mantissa = -mantissa; + + // Ensure mantissa is in range [-9.9, 9.9] + while (abs(mantissa) >= 10.0f) { + mantissa /= 10.0f; + exponent += 1; + } + + // Validate exponent range + if (exponent > 9 || exponent < -9) { + strcpy(buf, " OVER"); + return; + } + + // Format scientific notation without snprintf + bool negative = mantissa < 0; + mantissa = abs(mantissa); + + // Format mantissa as single digit + int digit = round(mantissa); + if (digit == 10) { + digit = 1; + exponent += 1; + } + + // Validate exponent range again after adjustment + if (exponent > 9 || exponent < -9) { + strcpy(buf, " OVER"); + return; + } + + // Build string manually: [-]#e±# + buf[0] = negative ? '-' : ' '; + buf[1] = '0' + digit; + buf[2] = 'e'; + buf[3] = (exponent < 0) ? '-' : '+'; + buf[4] = '0' + abs(exponent); + buf[5] = '\0'; + return; + } + strncpy(buf, tempBuf, 5); + buf[5] = '\0'; + + } else { + if constexpr(std::is_unsigned_v) { + if (value < 10000) { // Changed from 1000 + // Format small unsigned integers directly + if (value < 10) { + // Single digit centered + buf[0] = buf[1] = ' '; + buf[2] = '0' + value; + buf[3] = buf[4] = ' '; + } else { + // Two to four digits right-justified + char tmp[5]; // Increased buffer size + utoa(value, tmp, 10); + size_t len = strlen(tmp); + memset(buf, ' ', 5); + memcpy(buf + (5 - len), tmp, len); // Changed from 4 to 5 + } + buf[5] = '\0'; + } else { + // Handle large unsigned integers with scientific notation + float fVal = static_cast(value); + int exponent = floor(log10(fVal)); + float mantissa = fVal / pow(10, exponent); + if (exponent > 9) { + strcpy(buf, " OVER"); + } else { + int whole = round(mantissa); + buf[0] = ' '; + buf[1] = '0' + whole; + buf[2] = 'e'; + buf[3] = '+'; + buf[4] = '0' + exponent; + buf[5] = '\0'; + } + } + } else { // signed integers + if (std::abs(static_cast(value)) < 10000) { // Changed from 1000 + // Format small signed integers directly + if (std::abs(static_cast(value)) < 10) { + // Single digit with possible sign + buf[0] = buf[1] = ' '; + if (value < 0) { + buf[1] = '-'; + buf[2] = '0' - value; + } else { + buf[2] = '0' + value; + } + buf[3] = buf[4] = ' '; + } else { + // Two to four digits with possible sign + char tmp[6]; // Increased buffer size for sign + itoa(value, tmp, 10); + size_t len = strlen(tmp); + memset(buf, ' ', 5); + memcpy(buf + (5 - len), tmp, len); + } + buf[5] = '\0'; + } else { + float fVal = static_cast(value); + int exponent = floor(log10(std::abs(fVal))); + float mantissa = fVal / pow(10, exponent); + if (exponent > 9) { + strcpy(buf, " OVER"); + } else { + int whole = round(mantissa); + buf[0] = (value < 0) ? '-' : ' '; + buf[1] = '0' + std::abs(whole); + buf[2] = 'e'; + buf[3] = '+'; + buf[4] = '0' + exponent; + buf[5] = '\0'; + } + } + } + } + + // Right padding for short results + size_t len = strlen(buf); + if (len < 5) { + memmove(buf + (5-len), buf, len); + memset(buf, ' ', 5-len); + } + buf[5] = '\0'; +} + + +#endif // __FORMAT_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/Maths.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/Maths.cpp new file mode 100644 index 0000000..e9fdb6f --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/Maths.cpp @@ -0,0 +1,427 @@ +#include "Maths.hpp" + + +int where(const std::vector& integers, size_t integer) { + const size_t size = integers.size(); + for (size_t i = 0; i < size; ++i) { + if (integers[i] == integer) { + return static_cast(i); + } + } + return -1; +} + + +namespace Tests { + +// Tolerance for floating point comparisons +constexpr float EPSILON = 1e-6f; + +// Helper to check if two float values are equal within a small epsilon +static bool floatEquals(float a, float b, float epsilon = EPSILON) { + return fabsf(a - b) < epsilon; +} + +// Unit tests for the median absolute deviation functions +bool testMedianAbsoluteDeviation() { + bool allTestsPassed = true; + const int TEST_SIZE = 32; // Size for medianAbsoluteDeviationFast32 + + // Test case 1: Normal distribution data + { + DEBUG_PRINTLN("Test case 1: Normal distribution data"); + float testData[TEST_SIZE] = {5.1f, 3.7f, 8.2f, 4.9f, 6.3f, 7.0f, 2.5f, 9.1f, + 5.4f, 6.8f, 7.2f, 4.3f, 3.6f, 8.9f, 5.5f, 6.0f, + 5.1f, 3.7f, 8.2f, 4.9f, 6.3f, 7.0f, 2.5f, 9.1f, + 5.4f, 6.8f, 7.2f, 4.3f, 3.6f, 8.9f, 5.5f, 6.0f}; + + // Create copy for the regular MAD function + std::vector testVector(testData, testData + TEST_SIZE); + + // Calculate MAD using both methods + float madRegular = medianAbsoluteDeviation(testVector); + float madFast = medianAbsoluteDeviationFast32(testData); + + DEBUG_PRINTF("Regular MAD: %.6f, Fast MAD: %.6f\n", madRegular, madFast); + + if (!floatEquals(madRegular, madFast)) { + DEBUG_PRINTLN("FAIL: MAD values don't match!"); + allTestsPassed = false; + } + } + + // Test case 2: Already sorted data + { + DEBUG_PRINTLN("Test case 2: Already sorted data"); + float testData[TEST_SIZE] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, + 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, + 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f, 23.0f, 24.0f, + 25.0f, 26.0f, 27.0f, 28.0f, 29.0f, 30.0f, 31.0f, 32.0f}; + + std::vector testVector(testData, testData + TEST_SIZE); + float expectedMAD = 8.0f; // For 1-32, median is 16.5, MAD should be 8.0 + + float madRegular = medianAbsoluteDeviation(testVector); + float madFast = medianAbsoluteDeviationFast32(testData); + + DEBUG_PRINTF("Regular MAD: %.6f, Fast MAD: %.6f, Expected: %.6f\n", madRegular, madFast, expectedMAD); + + if (!floatEquals(madRegular, madFast) || !floatEquals(madRegular, expectedMAD)) { + DEBUG_PRINTLN("FAIL: MAD values don't match expected value for sorted data!"); + allTestsPassed = false; + } + } + + // Test case 3: Reverse sorted data + { + DEBUG_PRINTLN("Test case 3: Reverse sorted data"); + float testData[TEST_SIZE] = {32.0f, 31.0f, 30.0f, 29.0f, 28.0f, 27.0f, 26.0f, 25.0f, + 24.0f, 23.0f, 22.0f, 21.0f, 20.0f, 19.0f, 18.0f, 17.0f, + 16.0f, 15.0f, 14.0f, 13.0f, 12.0f, 11.0f, 10.0f, 9.0f, + 8.0f, 7.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f}; + + std::vector testVector(testData, testData + TEST_SIZE); + float expectedMAD = 8.0f; // Same as sorted case, just reversed + + float madRegular = medianAbsoluteDeviation(testVector); + float madFast = medianAbsoluteDeviationFast32(testData); + + DEBUG_PRINTF("Regular MAD: %.6f, Fast MAD: %.6f, Expected: %.6f\n", madRegular, madFast, expectedMAD); + + if (!floatEquals(madRegular, madFast) || !floatEquals(madRegular, expectedMAD)) { + DEBUG_PRINTLN("FAIL: MAD values don't match expected value for reverse sorted data!"); + allTestsPassed = false; + } + } + + // Test case 4: Constant data (all values the same) + { + DEBUG_PRINTLN("Test case 4: Constant data"); + float testData[TEST_SIZE]; + for (int i = 0; i < TEST_SIZE; i++) { + testData[i] = 5.0f; + } + + std::vector testVector(testData, testData + TEST_SIZE); + float expectedMAD = 0.0f; // All deviations are zero + + float madRegular = medianAbsoluteDeviation(testVector); + float madFast = medianAbsoluteDeviationFast32(testData); + + DEBUG_PRINTF("Regular MAD: %.6f, Fast MAD: %.6f, Expected: %.6f\n", madRegular, madFast, expectedMAD); + + if (!floatEquals(madRegular, expectedMAD) || !floatEquals(madFast, expectedMAD)) { + DEBUG_PRINTLN("FAIL: MAD for constant data should be 0!"); + allTestsPassed = false; + } + } + + // Test case 5: Extreme values + { + DEBUG_PRINTLN("Test case 5: Extreme values"); + float testData[TEST_SIZE] = {1e30f, -1e30f, 1e-30f, -1e-30f, 1e20f, -1e20f, 1e-20f, -1e-20f, + 1e10f, -1e10f, 1e-10f, -1e-10f, 1000.0f, -1000.0f, 0.001f, -0.001f, + 1e30f, -1e30f, 1e-30f, -1e-30f, 1e20f, -1e20f, 1e-20f, -1e-20f, + 1e10f, -1e10f, 1e-10f, -1e-10f, 1000.0f, -1000.0f, 0.001f, -0.001f}; + + std::vector testVector(testData, testData + TEST_SIZE); + + float madRegular = medianAbsoluteDeviation(testVector); + float madFast = medianAbsoluteDeviationFast32(testData); + + DEBUG_PRINTF("Regular MAD: %.6g, Fast MAD: %.6g\n", madRegular, madFast); + + // Allow larger epsilon for extreme values due to potential numerical issues + if (!floatEquals(madRegular, madFast, 1e-5f * fabsf(madRegular))) { + DEBUG_PRINTLN("FAIL: MAD values don't match for extreme values!"); + allTestsPassed = false; + } + } + + // Test case 6: Negative values + { + DEBUG_PRINTLN("Test case 6: Negative values"); + float testData[TEST_SIZE] = {-5.1f, -3.7f, -8.2f, -4.9f, -6.3f, -7.0f, -2.5f, -9.1f, + -5.4f, -6.8f, -7.2f, -4.3f, -3.6f, -8.9f, -5.5f, -6.0f, + -5.1f, -3.7f, -8.2f, -4.9f, -6.3f, -7.0f, -2.5f, -9.1f, + -5.4f, -6.8f, -7.2f, -4.3f, -3.6f, -8.9f, -5.5f, -6.0f}; + + std::vector testVector(testData, testData + TEST_SIZE); + + float madRegular = medianAbsoluteDeviation(testVector); + float madFast = medianAbsoluteDeviationFast32(testData); + + DEBUG_PRINTF("Regular MAD: %.6f, Fast MAD: %.6f\n", madRegular, madFast); + + if (!floatEquals(madRegular, madFast)) { + DEBUG_PRINTLN("FAIL: MAD values don't match for negative values!"); + allTestsPassed = false; + } + } + + // Test case 7: Alternating values + { + DEBUG_PRINTLN("Test case 7: Alternating values"); + float testData[TEST_SIZE]; + for (int i = 0; i < TEST_SIZE; i++) { + testData[i] = (i % 2 == 0) ? 1.0f : 10.0f; + } + + std::vector testVector(testData, testData + TEST_SIZE); + float expectedMAD = 4.5f; // Median is 5.5, deviations are 4.5 for all values + + float madRegular = medianAbsoluteDeviation(testVector); + float madFast = medianAbsoluteDeviationFast32(testData); + + DEBUG_PRINTF("Regular MAD: %.6f, Fast MAD: %.6f, Expected: %.6f\n", madRegular, madFast, expectedMAD); + + if (!floatEquals(madRegular, madFast) || !floatEquals(madRegular, expectedMAD)) { + DEBUG_PRINTLN("FAIL: MAD values don't match expected value for alternating values!"); + allTestsPassed = false; + } + } + + // Test case 8: Nearly identical values (precision test) + { + DEBUG_PRINTLN("Test case 8: Nearly identical values"); + float baseVal = 5.0f; + float testData[TEST_SIZE]; + + for (int i = 0; i < TEST_SIZE; i++) { + testData[i] = baseVal + (i * 0.0001f); // Small increments + } + + std::vector testVector(testData, testData + TEST_SIZE); + + float madRegular = medianAbsoluteDeviation(testVector); + float madFast = medianAbsoluteDeviationFast32(testData); + + DEBUG_PRINTF("Regular MAD: %.8f, Fast MAD: %.8f\n", madRegular, madFast); + + if (!floatEquals(madRegular, madFast, EPSILON)) { + DEBUG_PRINTLN("FAIL: MAD values don't match for nearly identical values!"); + allTestsPassed = false; + } + } + + if (allTestsPassed) { + DEBUG_PRINTLN("All median absolute deviation tests PASSED!"); + + // Performance profiling + DEBUG_PRINTLN("\n=== Performance Profiling ==="); + const int PROFILE_ITERATIONS = 1000; + + // Test data for profiling + float profileData[TEST_SIZE] = {5.1f, 3.7f, 8.2f, 4.9f, 6.3f, 7.0f, 2.5f, 9.1f, + 5.4f, 6.8f, 7.2f, 4.3f, 3.6f, 8.9f, 5.5f, 6.0f, + 5.1f, 3.7f, 8.2f, 4.9f, 6.3f, 7.0f, 2.5f, 9.1f, + 5.4f, 6.8f, 7.2f, 4.3f, 3.6f, 8.9f, 5.5f, 6.0f}; + + // Profile regular MAD function + uint32_t startTime = time_us_32(); + for (int i = 0; i < PROFILE_ITERATIONS; i++) { + std::vector testVector(profileData, profileData + TEST_SIZE); + volatile float result = medianAbsoluteDeviation(testVector); + (void)result; // Prevent optimization + } + uint32_t regularTime = time_us_32() - startTime; + + // Profile fast MAD function + startTime = time_us_32(); + for (int i = 0; i < PROFILE_ITERATIONS; i++) { + volatile float result = medianAbsoluteDeviationFast32(profileData); + (void)result; // Prevent optimization + } + uint32_t fastTime = time_us_32() - startTime; + + // Calculate averages and percentage difference + float avgRegular = (float)regularTime / PROFILE_ITERATIONS; + float avgFast = (float)fastTime / PROFILE_ITERATIONS; + + DEBUG_PRINTF("Regular MAD average time: %.2f µs\n", avgRegular); + DEBUG_PRINTF("Fast MAD average time: %.2f µs\n", avgFast); + + if (avgFast < avgRegular) { + float speedup = (avgRegular / avgFast - 1.0f) * 100.0f; + DEBUG_PRINTF("Fast MAD is %.1f%% faster than regular MAD\n", speedup); + } else { + float slowdown = (avgFast / avgRegular - 1.0f) * 100.0f; + DEBUG_PRINTF("Fast MAD is %.1f%% slower than regular MAD\n", slowdown); + } + } else { + DEBUG_PRINTLN("Some median absolute deviation tests FAILED!"); + } + + return allTestsPassed; +} + +// Unit tests for the mean absolute deviation function +bool testMeanAbsoluteDeviation() { + bool allTestsPassed = true; + const int TEST_SIZE = 32; // Size for comparison with fast median + + DEBUG_PRINTLN("\n=== Mean Absolute Deviation Tests ==="); + + // Test case 1: Normal distribution data + { + DEBUG_PRINTLN("Test case 1: Normal distribution data"); + float testData[TEST_SIZE] = {5.1f, 3.7f, 8.2f, 4.9f, 6.3f, 7.0f, 2.5f, 9.1f, + 5.4f, 6.8f, 7.2f, 4.3f, 3.6f, 8.9f, 5.5f, 6.0f, + 5.1f, 3.7f, 8.2f, 4.9f, 6.3f, 7.0f, 2.5f, 9.1f, + 5.4f, 6.8f, 7.2f, 4.3f, 3.6f, 8.9f, 5.5f, 6.0f}; + + float meanAD = meanAbsoluteDeviation(testData, TEST_SIZE); + DEBUG_PRINTF("Mean AD: %.6f\n", meanAD); + + // Basic sanity check - should be positive + if (meanAD <= 0.0f) { + DEBUG_PRINTLN("FAIL: Mean AD should be positive!"); + allTestsPassed = false; + } + } + + // Test case 2: Constant data (all values the same) + { + DEBUG_PRINTLN("Test case 2: Constant data"); + float testData[TEST_SIZE]; + for (int i = 0; i < TEST_SIZE; i++) { + testData[i] = 5.0f; + } + + float meanAD = meanAbsoluteDeviation(testData, TEST_SIZE); + float expectedMAD = 0.0f; // All deviations are zero + + DEBUG_PRINTF("Mean AD: %.6f, Expected: %.6f\n", meanAD, expectedMAD); + + if (!floatEquals(meanAD, expectedMAD)) { + DEBUG_PRINTLN("FAIL: Mean AD for constant data should be 0!"); + allTestsPassed = false; + } + } + + // Test case 3: Known values test + { + DEBUG_PRINTLN("Test case 3: Known values test"); + float testData[4] = {1.0f, 2.0f, 3.0f, 4.0f}; + // Mean = 2.5, deviations = {1.5, 0.5, 0.5, 1.5}, mean deviation = 1.0 + float expectedMAD = 1.0f; + + float meanAD = meanAbsoluteDeviation(testData, 4); + + DEBUG_PRINTF("Mean AD: %.6f, Expected: %.6f\n", meanAD, expectedMAD); + + if (!floatEquals(meanAD, expectedMAD)) { + DEBUG_PRINTLN("FAIL: Mean AD doesn't match expected value!"); + allTestsPassed = false; + } + } + + // Test case 4: Negative values + { + DEBUG_PRINTLN("Test case 4: Negative values"); + float testData[TEST_SIZE] = {-5.1f, -3.7f, -8.2f, -4.9f, -6.3f, -7.0f, -2.5f, -9.1f, + -5.4f, -6.8f, -7.2f, -4.3f, -3.6f, -8.9f, -5.5f, -6.0f, + -5.1f, -3.7f, -8.2f, -4.9f, -6.3f, -7.0f, -2.5f, -9.1f, + -5.4f, -6.8f, -7.2f, -4.3f, -3.6f, -8.9f, -5.5f, -6.0f}; + + float meanAD = meanAbsoluteDeviation(testData, TEST_SIZE); + + DEBUG_PRINTF("Mean AD: %.6f\n", meanAD); + + if (meanAD <= 0.0f) { + DEBUG_PRINTLN("FAIL: Mean AD should be positive for negative values!"); + allTestsPassed = false; + } + } + + // Test case 5: Single element + { + DEBUG_PRINTLN("Test case 5: Single element"); + float testData[1] = {42.0f}; + float expectedMAD = 0.0f; // Deviation from itself is zero + + float meanAD = meanAbsoluteDeviation(testData, 1); + + DEBUG_PRINTF("Mean AD: %.6f, Expected: %.6f\n", meanAD, expectedMAD); + + if (!floatEquals(meanAD, expectedMAD)) { + DEBUG_PRINTLN("FAIL: Mean AD for single element should be 0!"); + allTestsPassed = false; + } + } + + // Test case 6: Two elements + { + DEBUG_PRINTLN("Test case 6: Two elements"); + float testData[2] = {1.0f, 3.0f}; + // Mean = 2.0, deviations = {1.0, 1.0}, mean deviation = 1.0 + float expectedMAD = 1.0f; + + float meanAD = meanAbsoluteDeviation(testData, 2); + + DEBUG_PRINTF("Mean AD: %.6f, Expected: %.6f\n", meanAD, expectedMAD); + + if (!floatEquals(meanAD, expectedMAD)) { + DEBUG_PRINTLN("FAIL: Mean AD for two elements doesn't match expected!"); + allTestsPassed = false; + } + } + + // Performance comparison with median AD + if (allTestsPassed) { + DEBUG_PRINTLN("\n=== Performance Comparison: Mean AD vs Median AD ==="); + const int PROFILE_ITERATIONS = 1000; + + // Test data for profiling + float profileData[TEST_SIZE] = {5.1f, 3.7f, 8.2f, 4.9f, 6.3f, 7.0f, 2.5f, 9.1f, + 5.4f, 6.8f, 7.2f, 4.3f, 3.6f, 8.9f, 5.5f, 6.0f, + 5.1f, 3.7f, 8.2f, 4.9f, 6.3f, 7.0f, 2.5f, 9.1f, + 5.4f, 6.8f, 7.2f, 4.3f, 3.6f, 8.9f, 5.5f, 6.0f}; + + // Profile Mean AD function + uint32_t startTime = time_us_32(); + for (int i = 0; i < PROFILE_ITERATIONS; i++) { + volatile float result = meanAbsoluteDeviation(profileData, TEST_SIZE); + (void)result; // Prevent optimization + } + uint32_t meanTime = time_us_32() - startTime; + + // Profile Median AD function + startTime = time_us_32(); + for (int i = 0; i < PROFILE_ITERATIONS; i++) { + volatile float result = medianAbsoluteDeviationFast32(profileData); + (void)result; // Prevent optimization + } + uint32_t medianTime = time_us_32() - startTime; + + // Calculate averages and percentage difference + float avgMean = (float)meanTime / PROFILE_ITERATIONS; + float avgMedian = (float)medianTime / PROFILE_ITERATIONS; + + DEBUG_PRINTF("Mean AD average time: %.2f µs\n", avgMean); + DEBUG_PRINTF("Median AD average time: %.2f µs\n", avgMedian); + + if (avgMean < avgMedian) { + float speedup = (avgMedian / avgMean - 1.0f) * 100.0f; + DEBUG_PRINTF("Mean AD is %.1f%% faster than Median AD\n", speedup); + } else { + float slowdown = (avgMean / avgMedian - 1.0f) * 100.0f; + DEBUG_PRINTF("Mean AD is %.1f%% slower than Median AD\n", slowdown); + } + + // Show actual computed values for comparison + float meanResult = meanAbsoluteDeviation(profileData, TEST_SIZE); + float medianResult = medianAbsoluteDeviationFast32(profileData); + DEBUG_PRINTF("Mean AD result: %.6f, Median AD result: %.6f\n", meanResult, medianResult); + } + + if (allTestsPassed) { + DEBUG_PRINTLN("All mean absolute deviation tests PASSED!"); + } else { + DEBUG_PRINTLN("Some mean absolute deviation tests FAILED!"); + } + + return allTestsPassed; +} + +} \ No newline at end of file diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/Maths.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/Maths.hpp new file mode 100644 index 0000000..81d59ed --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/Maths.hpp @@ -0,0 +1,180 @@ +#ifndef __MATHS_HPP__ +#define __MATHS_HPP__ + +#include +#include +#include +#include +#include "../PicoDefs.hpp" +#include + + +inline float medianAbsoluteDeviation(std::vector& data) noexcept { + const size_t N = data.size(); + + // Find median + const size_t mid = N >> 1; + std::nth_element(data.begin(), data.begin() + mid, data.end()); + + float median; + if (!(N & 0x1)) { + // Even size: need both middle elements + std::nth_element(data.begin(), data.begin() + mid - 1, data.begin() + mid); + median = (data[mid - 1] + data[mid]) * 0.5f; + } else { + // Odd size: just the middle element + median = data[mid]; + } + + // Convert to absolute deviations in-place + for (auto& val : data) { + val = std::abs(val - median); + } + + // Find median of absolute deviations + std::nth_element(data.begin(), data.begin() + mid, data.end()); + + if (!(N & 0x1)) { + std::nth_element(data.begin(), data.begin() + mid - 1, data.begin() + mid); + return (data[mid - 1] + data[mid]) * 0.5f; + } else { + return data[mid]; + } +} + +inline int __attribute__((always_inline)) partition(float* arr, int left, int right) { + float pivot = arr[right]; + int i = left; + + for (int j = left; j < right; j++) { + if (arr[j] <= pivot) { + float temp = arr[i]; + arr[i] = arr[j]; + arr[j] = temp; + i++; + } + } + + float temp = arr[i]; + arr[i] = arr[right]; + arr[right] = temp; + + return i; +} + +// Quick select median helper function - O(n) average time complexity +inline float __attribute__((always_inline)) quickSelectMedian(float* arr, int n) { + if (n % 2 == 1) { + // Odd size - find the middle element + int k = n / 2; + int left = 0; + int right = n - 1; + + while (left < right) { + int pivotIndex = partition(arr, left, right); + if (pivotIndex == k) { + break; + } else if (pivotIndex < k) { + left = pivotIndex + 1; + } else { + right = pivotIndex - 1; + } + } + return arr[k]; + } else { + // Even size - need to find two middle elements and average them + int k1 = n / 2 - 1; + int k2 = n / 2; + + // Find k1-th element (lower middle) + int left = 0; + int right = n - 1; + while (left < right) { + int pivotIndex = partition(arr, left, right); + if (pivotIndex == k1) { + break; + } else if (pivotIndex < k1) { + left = pivotIndex + 1; + } else { + right = pivotIndex - 1; + } + } + float val1 = arr[k1]; + + // Find k2-th element (upper middle) in the remaining array + left = k1 + 1; + right = n - 1; + float val2 = arr[k2]; + for (int i = left; i <= right; i++) { + if (arr[i] < val2) { + val2 = arr[i]; + } + } + + return (val1 + val2) * 0.5f; + } +} + +inline float __attribute__((always_inline)) __not_in_flash_func(medianAbsoluteDeviationFast32)(const float* data) { + float __attribute__((aligned(16))) work[32]; + + // Copy data to work buffer + memcpy(work, data, 32 * sizeof(float)); + + // Use median-of-medians approach for O(n) selection + float median = quickSelectMedian(work, 32); + + // Calculate absolute deviations + for (int i = 0; i < 32; i++) { + work[i] = fabsf(data[i] - median); + } + + // Find median of absolute deviations + return quickSelectMedian(work, 32); +} + +// Efficient Mean Absolute Deviation function - O(n) complexity +inline float __attribute__((always_inline)) __not_in_flash_func(meanAbsoluteDeviation)(const float* data, int size) { + // Calculate mean in first pass + float sum = 0.0f; + + // Unroll loop for better performance on RP2350 + int i = 0; + for (; i < size - 3; i += 4) { + sum += data[i] + data[i + 1] + data[i + 2] + data[i + 3]; + } + + // Handle remaining elements + for (; i < size; i++) { + sum += data[i]; + } + + float mean = sum / size; + + // Calculate mean of absolute deviations in second pass + sum = 0.0f; + i = 0; + for (; i < size - 3; i += 4) { + sum += fabsf(data[i] - mean) + fabsf(data[i + 1] - mean) + + fabsf(data[i + 2] - mean) + fabsf(data[i + 3] - mean); + } + + // Handle remaining elements + for (; i < size; i++) { + sum += fabsf(data[i] - mean); + } + + return sum / size; +} + +int where(const std::vector& integers, size_t integer); + + +namespace Tests { + +bool testMedianAbsoluteDeviation(); +bool testMeanAbsoluteDeviation(); + +} // namespace Tests + +#endif // __MATHS_HPP__ diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/MedianFilter.h b/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/MedianFilter.h new file mode 100644 index 0000000..b6075fc --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/MedianFilter.h @@ -0,0 +1,72 @@ +#ifndef MEDIANFILTER +#define MEDIANFILTER + +#include +#include +#include +#include +#include + +template +class MedianFilter +{ +public: + MedianFilter(std::size_t filterSize) { + init(filterSize); + } + + MedianFilter() { + init(3); + } + + void init(std::size_t fSize) { + filterSize_ = fSize; + circularBuffer_ = std::vector(filterSize_, 0); + centreIndex = static_cast(fSize / 2); + reset(); + } + + void reset(T value = 0) { + std::fill(circularBuffer_.begin(), circularBuffer_.end(), value); + currentIndex_ = 0; + } + + T process(T inputValue) + { + + // Store the new value in the circular buffer + circularBuffer_[currentIndex_] = inputValue; + // Move to the next index in the circular buffer + currentIndex_++; + if (currentIndex_ == filterSize_) { + currentIndex_ = 0; + } + + //copy + // auto tmpVector = std::copy(circularBuffer_.begin(), circularBuffer_.end()); + auto tmpVector = circularBuffer_; + std::nth_element(tmpVector.begin(), tmpVector.begin()+centreIndex, tmpVector.end()); + // Calculate and return the moving average + return tmpVector[centreIndex]; + } + + float std() { + float sum = std::accumulate(std::begin(circularBuffer_), std::end(circularBuffer_), 0.0); + float m = sum / circularBuffer_.size(); + + float accum = 0.0; + std::for_each (std::begin(circularBuffer_), std::end(circularBuffer_), [&](const float d) { + accum += (d - m) * (d - m); + }); + + return sqrt(accum / (circularBuffer_.size()-1)); + } + +private: + std::size_t filterSize_; + std::vector circularBuffer_; + std::size_t currentIndex_ = 0; + size_t centreIndex=0; +}; + +#endif \ No newline at end of file diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/PrintVector.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/PrintVector.hpp new file mode 100644 index 0000000..ae71646 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/PrintVector.hpp @@ -0,0 +1,66 @@ +#ifndef __PRINT_VECTOR_HPP__ +#define __PRINT_VECTOR_HPP__ + + +#include +#include + +// Helper function to print a vector of floats with indentation +void printVector(const std::vector& vec, int indentLevel = 0) { + // Print leading spaces for indentation + for (int i = 0; i < indentLevel; ++i) { + DEBUG_PRINT(" "); // Each indent level adds 2 spaces + } + + DEBUG_PRINT("{ "); + for (size_t i = 0; i < vec.size(); ++i) { + DEBUG_PRINT(vec[i], 4); // Print float with 4 decimal places + if (i != vec.size() - 1) { + DEBUG_PRINT(", "); + } + } + DEBUG_PRINT(" }"); +} + +// Function to print a vector of vectors of floats with indentation +void printVectorOfVectors(const std::vector>& vec, int indentLevel = 0) { + for (int i = 0; i < indentLevel; ++i) { + DEBUG_PRINT(" "); + } + DEBUG_PRINTLN("{"); + for (size_t i = 0; i < vec.size(); ++i) { + printVector(vec[i], indentLevel + 1); // Indent inner vectors more + if (i != vec.size() - 1) { + DEBUG_PRINT(", "); + } + DEBUG_PRINTLN(); // Move to the next line after printing a vector + } + // Print the final closing brace with indentation + for (int i = 0; i < indentLevel; ++i) { + DEBUG_PRINT(" "); + } + DEBUG_PRINTLN("}"); +} + +// Function to print a vector of vectors of vectors of floats with indentation +void printVectorOfVectorOfVectors(const std::vector>>& vec, int indentLevel = 0) { + for (int i = 0; i < indentLevel; ++i) { + DEBUG_PRINT(" "); + } + DEBUG_PRINTLN("{"); + for (size_t i = 0; i < vec.size(); ++i) { + printVectorOfVectors(vec[i], indentLevel + 1); // Indent inner vector of vectors more + if (i != vec.size() - 1) { + DEBUG_PRINT(", "); + } + DEBUG_PRINTLN(); // Move to the next line after printing a sub-vector of vectors + } + // Print the final closing brace with indentation + for (int i = 0; i < indentLevel; ++i) { + DEBUG_PRINT(" "); + } + DEBUG_PRINTLN("}"); +} + + +#endif diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/SLIP.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/SLIP.hpp new file mode 100644 index 0000000..91bd889 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/SLIP.hpp @@ -0,0 +1,179 @@ +// +// Copyright (c) 2010 Christopher Baker +// Copyright (c) 2016 Antoine Villeret +// +// SPDX-License-Identifier: MIT +// + + +#pragma once + + +#include "Arduino.h" + + +/// \brief A Serial Line Internet Protocol (SLIP) Encoder. +/// +/// Serial Line Internet Protocol (SLIP) is a packet framing protocol: SLIP +/// defines a sequence of characters that frame IP packets on a serial line and +/// nothing more. It provides no addressing, packet type identification, error +/// detection, correction or compression mechanisms. Because the protocol does +/// so little its implementation is trivial and fast. +/// +/// \sa http://tools.ietf.org/html/rfc1055 +class SLIP +{ +public: + /// \brief Encode a byte buffer with the SLIP encoder. + /// \param buffer A pointer to the unencoded buffer to encode. + /// \param size The number of bytes in the \p buffer. + /// \param encodedBuffer The buffer for the encoded bytes. + /// \returns The number of bytes written to the \p encodedBuffer. + /// \warning The encodedBuffer must have at least getEncodedBufferSize() + /// allocated. + static size_t encode(const uint8_t* buffer, + size_t size, + uint8_t* encodedBuffer) + { + if (size == 0) + return 0; + + size_t read_index = 0; + size_t write_index = 0; + + // Double-ENDed, flush any data that may have accumulated due to line + // noise. + encodedBuffer[write_index++] = END; + + while (read_index < size) + { + if(buffer[read_index] == END) + { + encodedBuffer[write_index++] = ESC; + encodedBuffer[write_index++] = ESC_END; + read_index++; + } + else if(buffer[read_index] == ESC) + { + encodedBuffer[write_index++] = ESC; + encodedBuffer[write_index++] = ESC_ESC; + read_index++; + } + else + { + encodedBuffer[write_index++] = buffer[read_index++]; + } + } + + encodedBuffer[write_index++] = END; + + return write_index; + } + + /// \brief Decode a SLIP-encoded buffer. + /// \param encodedBuffer A pointer to the \p encodedBuffer to decode. + /// \param size The number of bytes in the \p encodedBuffer. + /// \param decodedBuffer The target buffer for the decoded bytes. + /// \param maxOut Maximum bytes to write to decodedBuffer. + /// \returns The number of bytes written to the \p decodedBuffer. + /// \warning decodedBuffer must have a minimum capacity of maxOut. + static size_t decode(const uint8_t* encodedBuffer, + size_t size, + uint8_t* decodedBuffer, + size_t maxOut) + { + if (size == 0 || maxOut == 0) + return 0; + + size_t read_index = 0; + size_t write_index = 0; + + while (read_index < size && write_index < maxOut) + { + if (encodedBuffer[read_index] == END) + { + // flush or done + read_index++; + } + else if (encodedBuffer[read_index] == ESC) + { + if (read_index + 1 < size) + { + if (encodedBuffer[read_index+1] == ESC_END) + { + decodedBuffer[write_index++] = END; + read_index += 2; + } + else if (encodedBuffer[read_index+1] == ESC_ESC) + { + decodedBuffer[write_index++] = ESC; + read_index += 2; + } + else + { + // This case is considered a protocol violation. + read_index++; + } + } + else + { + // Incomplete escape sequence + break; + } + } + else + { + decodedBuffer[write_index++] = encodedBuffer[read_index++]; + } + } + + return write_index; + } + + // Keep the old interface for backward compatibility + static size_t decode(const uint8_t* encodedBuffer, + size_t size, + uint8_t* decodedBuffer) + { + return decode(encodedBuffer, size, decodedBuffer, SIZE_MAX); + } + + /// \brief Get the maximum encoded buffer size for an unencoded buffer size. + /// + /// SLIP has a start and end markers (192 and 219). Marker value is + /// replaced by 2 bytes in the encoded buffer. So in the worst case of + /// sending a buffer with only '192' or '219', the encoded buffer length + /// will be 2 * buffer.size() + 2. + /// + /// \param unencodedBufferSize The size of the buffer to be encoded. + /// \returns the maximum size of the required encoded buffer. + static size_t getEncodedBufferSize(size_t unencodedBufferSize) + { + return unencodedBufferSize * 2 + 2; + } + + /// \brief Key constants used in the SLIP protocol. + enum + { + /// \brief The decimal END character (octal 0300). + /// + /// Indicates the end of a packet. + END = 192, + + /// \brief The decimal ESC character (octal 0333). + /// + /// Indicates byte stuffing. + ESC = 219, + + /// \brief The decimal ESC_END character (octal 0334). + /// + /// ESC ESC_END means END data byte. + ESC_END = 220, + + /// \brief The decimal ESC_ESC character (ocatal 0335). + /// + /// ESC ESC_ESC means ESC data byte. + ESC_ESC = 221 + }; + +}; diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/perf.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/perf.hpp new file mode 100644 index 0000000..044d716 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/perf.hpp @@ -0,0 +1,144 @@ +#ifndef PERF_MEASURE_HPP +#define PERF_MEASURE_HPP + +#include "pico/stdlib.h" +#include "hardware/timer.h" + +// Configuration +#define PERF_ENABLED 1 // Set to 0 to completely disable (zero overhead) +#define PERF_WINDOW_SIZE 64 // Number of samples to average (must be power of 2) + +// Performance measurement structure +struct PerfCounter { + uint32_t accumulator; // Running sum for mean calculation + uint32_t sample_count; // Total samples (wraps at PERF_WINDOW_SIZE) + uint32_t mean_cycles; // Rolling mean + uint32_t last_cycles; // Most recent measurement + const char* name; +}; + +// Storage for performance counters (define in your .cpp file) +#define MAX_PERF_COUNTERS 16 +extern PerfCounter perf_counters[MAX_PERF_COUNTERS]; +extern uint8_t perf_counter_count; + +// Initialize a performance counter +inline void perf_init_counter(PerfCounter* counter, const char* name) { + counter->accumulator = 0; + counter->sample_count = 0; + counter->mean_cycles = 0; + counter->last_cycles = 0; + counter->name = name; +} + +// Fast update using exponential moving average +inline void perf_update_stats(PerfCounter* counter, uint32_t cycles) { + counter->last_cycles = cycles; + counter->sample_count++; + + // Simple rolling average: accumulate until window full, then reset + counter->accumulator += cycles; + + if ((counter->sample_count & (PERF_WINDOW_SIZE - 1)) == 0) { + // Window complete - calculate mean and reset + counter->mean_cycles = counter->accumulator >> __builtin_ctz(PERF_WINDOW_SIZE); + counter->accumulator = 0; + } +} + +#if PERF_ENABLED + +// Declare a performance counter +#define PERF_DECLARE(name) \ + static PerfCounter perf_##name __attribute__((section(".uninitialized_data"))); \ + static bool perf_##name##_initialized = false; + +// Initialize counter (call once, e.g., in init()) +#define PERF_INIT(name) \ + do { \ + if (!perf_##name##_initialized) { \ + perf_init_counter(&perf_##name, #name); \ + if (perf_counter_count < MAX_PERF_COUNTERS) { \ + perf_counters[perf_counter_count++] = perf_##name; \ + } \ + perf_##name##_initialized = true; \ + } \ + } while(0) + +// Start timing a segment +#define PERF_BEGIN(name) \ + uint32_t perf_start_##name = time_us_32(); + +// End timing and update statistics +#define PERF_END(name) \ + do { \ + uint32_t perf_end_##name = time_us_32(); \ + uint32_t perf_cycles_##name = perf_end_##name - perf_start_##name; \ + perf_update_stats(&perf_##name, perf_cycles_##name); \ + } while(0) + + +// Get performance data (thread-safe read) +#define PERF_GET_MEAN(name) (perf_##name.mean_cycles) +#define PERF_GET_LAST(name) (perf_##name.last_cycles) +#define PERF_GET_COUNT(name) (perf_##name.sample_count) + +#else // PERF_ENABLED == 0 + +// No-op versions (zero overhead when disabled) +#define PERF_DECLARE(name) +#define PERF_INIT(name) +#define PERF_BEGIN(name) +#define PERF_END(name) +#define PERF_SCOPE(name) +#define PERF_GET_MEAN(name) (0) +#define PERF_GET_LAST(name) (0) +#define PERF_GET_COUNT(name) (0) + +#endif // PERF_ENABLED + +// // Print all counters (call from monitoring thread/process) +// inline void perf_print_all() { +// printf("\n=== Performance Statistics (window=%d) ===\n", PERF_WINDOW_SIZE); +// printf("%-20s %10s %10s %10s\n", "Name", "Mean(us)", "Last(us)", "Count"); +// printf("-------------------------------------------------------\n"); + +// for (uint8_t i = 0; i < perf_counter_count; i++) { +// PerfCounter* c = &perf_counters[i]; +// if (c->sample_count > 0) { +// printf("%-20s %10u %10u %10u\n", +// c->name, +// c->mean_cycles, +// c->last_cycles, +// c->sample_count); +// } +// } +// printf("=======================================================\n\n"); +// } + +// // Print single counter (lightweight) +// inline void perf_print(const char* name, PerfCounter* counter) { +// printf("%s: mean=%uus last=%uus count=%u\n", +// name, counter->mean_cycles, counter->last_cycles, counter->sample_count); +// } + +// // Reset all counters +// inline void perf_reset_all() { +// for (uint8_t i = 0; i < perf_counter_count; i++) { +// perf_init_counter(&perf_counters[i], perf_counters[i].name); +// } +// } + +// // JSON output (lightweight) +// inline void perf_print_json() { +// printf("{\"perf\":["); +// for (uint8_t i = 0; i < perf_counter_count; i++) { +// PerfCounter* c = &perf_counters[i]; +// printf("{\"n\":\"%s\",\"m\":%u,\"l\":%u,\"c\":%u}", +// c->name, c->mean_cycles, c->last_cycles, c->sample_count); +// if (i < perf_counter_count - 1) printf(","); +// } +// printf("]}\n"); +// } + +#endif // PERF_MEASURE_HPP \ No newline at end of file diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/sharedMem.cpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/sharedMem.cpp new file mode 100644 index 0000000..2e0d162 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/sharedMem.cpp @@ -0,0 +1,11 @@ +#include "sharedMem.hpp" + +namespace sharedMem { +#if OLD_LISTENING_MODE + volatile float f0; + volatile float f1; + volatile float f2; + volatile float f3; +#endif +} + diff --git a/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/sharedMem.hpp b/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/sharedMem.hpp new file mode 100644 index 0000000..9386eaa --- /dev/null +++ b/firmware/MEMLNaut-NISPS/lib/memllib/src/utils/sharedMem.hpp @@ -0,0 +1,72 @@ +#ifndef SHAREDMEM_HPP +#define SHAREDMEM_HPP + +#include "pico/multicore.h" + +#include + +#define OLD_LISTENING_MODE 0 + +// Add your shared memory related declarations and includes here + +namespace sharedMem { +#if OLD_LISTENING_MODE + extern volatile float f0; + extern volatile float f1; + extern volatile float f2; + extern volatile float f3; +#endif +} + +template +class SharedBuffer { +public: + SharedBuffer() { + mutex_init(&mutex_); + for (size_t i = 0; i < bufferSize; ++i) { + buffer_[i] = T(); // Initialize buffer with default values + } + } + + inline void writeNonBlocking(const std::vector &data) + { + writeNonBlocking(data.data(), data.size()); + } + + inline void writeNonBlocking(const T* data, size_t size) + { + if (size > bufferSize) { + return; // Prevent overflow + } + if (mutex_try_enter(&mutex_, nullptr)) { + for (size_t i = 0; i < size; ++i) { + buffer_[i] = data[i]; + } + mutex_exit(&mutex_); + } + } + + inline void readNonBlocking(std::vector &data) + { + readNonBlocking(data.data(), data.size()); + } + + inline void readNonBlocking(T* data, size_t size) + { + if (size > bufferSize) { + return; // Prevent overflow + } + if (mutex_try_enter(&mutex_, nullptr)) { + for (size_t i = 0; i < size; ++i) { + data[i] = buffer_[i]; + } + mutex_exit(&mutex_); + } + } + +protected: + mutex_t mutex_; + volatile T buffer_[bufferSize]; +}; + +#endif // SHAREDMEM_HPP \ No newline at end of file diff --git a/firmware/MEMLNaut-NISPS/platformio.ini b/firmware/MEMLNaut-NISPS/platformio.ini new file mode 100644 index 0000000..18b85b1 --- /dev/null +++ b/firmware/MEMLNaut-NISPS/platformio.ini @@ -0,0 +1,160 @@ +; firmware/MEMLNaut-NISPS/platformio.ini — MEMLNaut-NISPS firmware, PlatformIO build. +; +; One [env:] per firmware variant. The variant list here IS the +; registry — there is no separate .ino comment-registry to keep in sync. +; Each normal-mode env sets MEMLNAUT_MODE_TYPE to one of the type aliases +; declared in glue/mode_select.hpp; the `selftest` env sets NISPS_SELFTEST=1 +; instead (see src/main.cpp for the fork). +; +; Build one variant: pio run -e pafsynth +; Build a bare `pio run` (no -e): only the hardware's current shipped variant +; (`default_envs` below). Build everything: `pio run -e a -e b -e c ...` (list +; every env; PlatformIO has no "all" shorthand) or scripts/build-firmware.sh +; --all. +; +; NOTE on `pio run`'s own "Flash: NN%" console line: for this board, PlatformIO's +; generic size checker (builder/tools/piosize.py) counts any PROGBITS+ALLOC +; section toward "flash used" — which double-counts .data (it's genuinely +; flash-resident AND ram-resident: its initialiser image lives in flash, its +; runtime copy lives in RAM). Arduino-CLI's own "Sketch uses" line does not +; do this (flash = .text + .rodata only). For modes with large MLP nets +; (.data-heavy), PlatformIO's console number reads far larger than +; arduino-cli's for the identical binary — not a real regression. Compare +; `arm-none-eabi-size -A` section-by-section (text+rodata vs. data+bss) if +; a number here looks alarming. + +[platformio] +default_envs = slpworkshop + +[env] +; earlephilhower's arduino-pico core via the community PlatformIO platform +; wrapper (the same pattern firmware/useq-celium/main/platformio.ini uses). +; platform_packages pins the EXACT framework + toolchain versions this repo's +; arduino-cli setup uses today (boards.txt v5.5.1 / toolchain 4.1.0-1aec55e, +; gcc 14.3.0) so PlatformIO and arduino-cli produce comparable binaries. +platform = https://github.com/maxgerhardt/platform-raspberrypi.git +platform_packages = + earlephilhower/framework-arduinopico @ https://github.com/earlephilhower/arduino-pico.git#5.5.1 +board = solderparty_rp2350_stamp_xl +framework = arduino +board_build.core = earlephilhower +; Matches the board's default 150 MHz menu.freq entry (arduino-cli FQBN +; leaves this at its default too — see boards.txt menu.freq.150). +board_build.f_cpu = 150000000L + +; arduino-cli builds this firmware with FQBN +; rp2040:rp2040:solderparty_rp2350_stamp_xl:opt=Optimize3 (-O3) plus +; --build-property compiler.cpp.extra_flags=-std=gnu++20. The arduino-pico +; PlatformIO builder appends its OWN default `-std=gnu++17 -Os` AFTER project +; build_flags (verified via `pio run -v`: project flags land first, then the +; framework's, and GCC honours the LAST -std/-O on the command line) — so +; build_unflags is required to actually remove them; simply listing our own +; flags in build_flags is not enough to win. +build_unflags = + -std=gnu++17 + -Os +build_flags = + -std=gnu++20 + -O3 + ; nisps/ stays platform-neutral at the repo root (shared with the WASM + ; build) — reached via -I, never copied or symlinked into firmware/. + -I${PROJECT_DIR}/../.. + ; glue/ headers, reached as "glue/x.hpp" from src/main.cpp. + -I${PROJECT_DIR} + ; ---- TFT_eSPI hardware config (was: setup-firmware-toolchain.sh mutating + ; the GLOBALLY installed TFT_eSPI library's User_Setup.h). USER_SETUP_LOADED + ; makes TFT_eSPI's User_Setup_Select.h skip its own bundled setup files + ; entirely (see TFT_eSPI/User_Setup_Select.h: "Lets PlatformIO users define + ; settings in platformio.ini") — this is TFT_eSPI's own documented recipe, + ; not a repo-invented hack. Values below are the MEMLNaut panel config that + ; used to live in + ; src/memllib/hardware/memlnaut/Setup9999_MEMLNaut.h.renameme. + -D USER_SETUP_LOADED=1 + -D USER_SETUP_ID=60 + -D ILI9341_DRIVER=1 + -D TFT_MISO=16 + -D TFT_MOSI=3 + -D TFT_SCLK=2 + -D TFT_CS=20 + -D TFT_DC=18 + -D TFT_RST=22 + -D TOUCH_CS=21 + -D LOAD_GLCD=1 + -D LOAD_FONT2=1 + -D LOAD_FONT4=1 + -D LOAD_FONT6=1 + -D LOAD_FONT7=1 + -D LOAD_FONT8=1 + -D LOAD_GFXFF=1 + -D SMOOTH_FONT=1 + -D SPI_FREQUENCY=70000000 + -D SPI_READ_FREQUENCY=20000000 + -D SPI_TOUCH_FREQUENCY=2500000 +; Pinned to the exact versions setup-firmware-toolchain.sh installs via +; arduino-cli today (arduino-cli lib list), for a fair size comparison. +; TFT_eWidget@0.0.5 isn't in the PlatformIO registry (it only carries 0.0.6+), +; so it's pinned straight from upstream's matching git tag instead. +lib_deps = + bodmer/TFT_eSPI@2.5.43 + https://github.com/Bodmer/TFT_eWidget.git#v0.0.5 + FortySevenEffects/MIDI Library@5.0.2 +upload_protocol = picotool +monitor_speed = 115200 + +; ===================================================================== +; Normal-mode variants — one nisps::modes::*Mode each. +; ===================================================================== + +[env:soundanalysismidi] +build_flags = ${env.build_flags} -D MEMLNAUT_MODE_TYPE=MEMLNautModeSoundAnalysisMIDI + +[env:xiasri] +build_flags = ${env.build_flags} -D MEMLNAUT_MODE_TYPE=MEMLNautModeXIASRI + +[env:verbfx] +build_flags = ${env.build_flags} -D MEMLNAUT_MODE_TYPE=MEMLNautModeVerbFX + +[env:breakor] +build_flags = ${env.build_flags} -D MEMLNAUT_MODE_TYPE=MEMLNautModeBreakOr + +[env:elysiamorfs] +build_flags = ${env.build_flags} -D MEMLNAUT_MODE_TYPE=MEMLNautModeElysiamorfs + +[env:channelstrip] +build_flags = ${env.build_flags} -D MEMLNAUT_MODE_TYPE=MEMLNautModeChannelStrip + +[env:pafsynth] +build_flags = ${env.build_flags} -D MEMLNAUT_MODE_TYPE=MEMLNautModePAFSynth + +[env:memlcelium] +build_flags = ${env.build_flags} -D MEMLNAUT_MODE_TYPE=MEMLNautModeMEMLCelium + +[env:slpworkshop] +build_flags = ${env.build_flags} -D MEMLNAUT_MODE_TYPE=MEMLNautModeSLPWorkshop + +; ---- External-synth MIDI-CC variants (joystick -> MLP -> MIDI CC) ---- + +[env:extsynthsub37] +build_flags = ${env.build_flags} -D MEMLNAUT_MODE_TYPE=MEMLNautModeExtSynthSub37 + +[env:extsynthsubphatty] +build_flags = ${env.build_flags} -D MEMLNAUT_MODE_TYPE=MEMLNautModeExtSynthSubPhatty + +[env:extsynthpro12] +build_flags = ${env.build_flags} -D MEMLNAUT_MODE_TYPE=MEMLNautModeExtSynthPro12 + +[env:extsynthanalogkeys] +build_flags = ${env.build_flags} -D MEMLNAUT_MODE_TYPE=MEMLNautModeExtSynthAnalogKeys + +[env:extsynthhydrasynth] +build_flags = ${env.build_flags} -D MEMLNAUT_MODE_TYPE=MEMLNautModeExtSynthHydrasynth + +[env:extsynthjd800] +build_flags = ${env.build_flags} -D MEMLNAUT_MODE_TYPE=MEMLNautModeExtSynthJD800 + +; ===================================================================== +; SelfTest — guided hardware bring-up rig (no engine, no ML). +; ===================================================================== + +[env:selftest] +build_flags = ${env.build_flags} -D NISPS_SELFTEST=1 diff --git a/firmware/MEMLNaut-NISPS/MEMLNaut-NISPS.ino b/firmware/MEMLNaut-NISPS/src/main.cpp similarity index 77% rename from firmware/MEMLNaut-NISPS/MEMLNaut-NISPS.ino rename to firmware/MEMLNaut-NISPS/src/main.cpp index 42fcf58..3fbee37 100644 --- a/firmware/MEMLNaut-NISPS/MEMLNaut-NISPS.ino +++ b/firmware/MEMLNaut-NISPS/src/main.cpp @@ -1,28 +1,36 @@ -// firmware/MEMLNaut-NISPS.ino — Thin entry point. +// firmware/MEMLNaut-NISPS/src/main.cpp — Thin entry point. // -// The heavy lifting now lives under: +// The heavy lifting lives under: // - nisps/... — platform-agnostic ML, DSP, engines, modes -// - firmware/glue/... — hardware bindings (audio driver, MIDI, -// peripherals, output router) +// (repo root; reached via -I, see platformio.ini) +// - firmware/MEMLNaut-NISPS/glue/... — hardware bindings (audio driver, MIDI, +// peripherals, output router) +// - firmware/MEMLNaut-NISPS/lib/memllib/ — vendored hardware-abstraction library +// (PlatformIO private library; see +// lib/memllib/VENDORED.md) // // This file does only: -// 1. Pick a mode at compile time (`MEMLNAUT_MODE_TYPE`). -// 2. Instantiate it (in `AUDIO_MEM` so it lives in SRAM). -// 3. setup() / loop() on core 0: +// 1. Instantiate the mode selected at compile time by the active PlatformIO +// env (`-DMEMLNAUT_MODE_TYPE=...`, or `-DNISPS_SELFTEST=1` for the +// guided hardware self-test — see platformio.ini, one [env] per variant). +// 2. setup() / loop() on core 0: // - boot board // - bind peripherals → mode.set_input // - bind MIDI in → mode.note_on/update_bpm/... // - run mode.tick_control() at ML cadence (5ms) -// 4. setup1() / loop1() on core 1: +// 3. setup1() / loop1() on core 1: // - register the audio bridge so AudioDriver streams into mode.process // - pump engine events / drain MIDI out at sub-ms cadence // ---- Hardware ---- -#include "src/memllib/PicoDefs.hpp" -#include "src/memllib/audio/AudioDriver.hpp" -#include "src/memllib/hardware/memlnaut/MEMLNaut.hpp" -#include "src/memllib/interface/MIDIInOut.hpp" -#include "src/memllib/utils/perf.hpp" +// main.cpp is a plain .cpp (PlatformIO builds src/ as-is; no .ino -> +// preprocessed-sketch step), so Arduino.h is no longer supplied implicitly. +#include +#include "PicoDefs.hpp" +#include "audio/AudioDriver.hpp" +#include "hardware/memlnaut/MEMLNaut.hpp" +#include "interface/MIDIInOut.hpp" +#include "utils/perf.hpp" #include "hardware/structs/bus_ctrl.h" // ---- Glue ---- @@ -34,29 +42,14 @@ #include "glue/settings_view.hpp" // ---- Mode selection ---- -// Build script rewrites which line is uncommented. -// #define MEMLNAUT_MODE_TYPE MEMLNautModeSoundAnalysisMIDI -// #define MEMLNAUT_MODE_TYPE MEMLNautModeXIASRI -// #define MEMLNAUT_MODE_TYPE MEMLNautModeVerbFX -// #define MEMLNAUT_MODE_TYPE MEMLNautModeBreakOr -// #define MEMLNAUT_MODE_TYPE MEMLNautModeElysiamorfs -// #define MEMLNAUT_MODE_TYPE MEMLNautModeChannelStrip -// #define MEMLNAUT_MODE_TYPE MEMLNautModePAFSynth -// #define MEMLNAUT_MODE_TYPE MEMLNautModeMEMLCelium -#define MEMLNAUT_MODE_TYPE MEMLNautModeSLPWorkshop -// ---- External-synth MIDI-CC variants (control an external hardware synth) ---- -// #define MEMLNAUT_MODE_TYPE MEMLNautModeExtSynthSub37 -// #define MEMLNAUT_MODE_TYPE MEMLNautModeExtSynthSubPhatty -// #define MEMLNAUT_MODE_TYPE MEMLNautModeExtSynthPro12 -// #define MEMLNAUT_MODE_TYPE MEMLNautModeExtSynthAnalogKeys -// #define MEMLNAUT_MODE_TYPE MEMLNautModeExtSynthHydrasynth -// #define MEMLNAUT_MODE_TYPE MEMLNautModeExtSynthJD800 -// #define MEMLNAUT_MODE_TYPE MEMLNautModeSelfTest - -// NISPS_SELFTEST == 1 iff the selected variant is the guided hardware self-test -// (see glue/mode_select.hpp). Must be computed AFTER the mode #define above so -// MEMLNAUT_MODE_TYPE is in scope for the token paste. -#define NISPS_SELFTEST NISPS_ST_CAT(MEMLNAUT_MODE_TYPE) +// MEMLNAUT_MODE_TYPE and NISPS_SELFTEST are supplied by the active PlatformIO +// [env] (platformio.ini), one env per firmware variant — no in-source mode +// registry, no build-time file rewriting. NISPS_SELFTEST is left undefined +// (== 0 in the #if below) by every normal-mode env; only the `selftest` env +// defines it. +#ifndef NISPS_SELFTEST +#define NISPS_SELFTEST 0 +#endif #include diff --git a/firmware/MEMLNaut-NISPS/src/memllib/PicoDefs.hpp b/firmware/MEMLNaut-NISPS/src/memllib/PicoDefs.hpp deleted file mode 120000 index 0992361..0000000 --- a/firmware/MEMLNaut-NISPS/src/memllib/PicoDefs.hpp +++ /dev/null @@ -1 +0,0 @@ -../../../../src/memllib/PicoDefs.hpp \ No newline at end of file diff --git a/firmware/MEMLNaut-NISPS/src/memllib/audio b/firmware/MEMLNaut-NISPS/src/memllib/audio deleted file mode 120000 index 02de189..0000000 --- a/firmware/MEMLNaut-NISPS/src/memllib/audio +++ /dev/null @@ -1 +0,0 @@ -../../../../src/memllib/audio \ No newline at end of file diff --git a/firmware/MEMLNaut-NISPS/src/memllib/hardware b/firmware/MEMLNaut-NISPS/src/memllib/hardware deleted file mode 120000 index 57af9e9..0000000 --- a/firmware/MEMLNaut-NISPS/src/memllib/hardware +++ /dev/null @@ -1 +0,0 @@ -../../../../src/memllib/hardware \ No newline at end of file diff --git a/firmware/MEMLNaut-NISPS/src/memllib/interface b/firmware/MEMLNaut-NISPS/src/memllib/interface deleted file mode 120000 index f06cd8f..0000000 --- a/firmware/MEMLNaut-NISPS/src/memllib/interface +++ /dev/null @@ -1 +0,0 @@ -../../../../src/memllib/interface \ No newline at end of file diff --git a/firmware/MEMLNaut-NISPS/src/memllib/synth b/firmware/MEMLNaut-NISPS/src/memllib/synth deleted file mode 120000 index 83d0830..0000000 --- a/firmware/MEMLNaut-NISPS/src/memllib/synth +++ /dev/null @@ -1 +0,0 @@ -../../../../src/memllib/synth \ No newline at end of file diff --git a/firmware/MEMLNaut-NISPS/src/memllib/utils b/firmware/MEMLNaut-NISPS/src/memllib/utils deleted file mode 120000 index eaecdb6..0000000 --- a/firmware/MEMLNaut-NISPS/src/memllib/utils +++ /dev/null @@ -1 +0,0 @@ -../../../../src/memllib/utils \ No newline at end of file diff --git a/firmware/MEMLNaut-NISPS/src/nisps/core b/firmware/MEMLNaut-NISPS/src/nisps/core deleted file mode 120000 index 2266cb4..0000000 --- a/firmware/MEMLNaut-NISPS/src/nisps/core +++ /dev/null @@ -1 +0,0 @@ -../../../../nisps/core \ No newline at end of file diff --git a/firmware/MEMLNaut-NISPS/src/nisps/dsp b/firmware/MEMLNaut-NISPS/src/nisps/dsp deleted file mode 120000 index 67d8491..0000000 --- a/firmware/MEMLNaut-NISPS/src/nisps/dsp +++ /dev/null @@ -1 +0,0 @@ -../../../../nisps/dsp \ No newline at end of file diff --git a/firmware/MEMLNaut-NISPS/src/nisps/engines b/firmware/MEMLNaut-NISPS/src/nisps/engines deleted file mode 120000 index 47f21e0..0000000 --- a/firmware/MEMLNaut-NISPS/src/nisps/engines +++ /dev/null @@ -1 +0,0 @@ -../../../../nisps/engines \ No newline at end of file diff --git a/firmware/MEMLNaut-NISPS/src/nisps/midi b/firmware/MEMLNaut-NISPS/src/nisps/midi deleted file mode 120000 index 322465d..0000000 --- a/firmware/MEMLNaut-NISPS/src/nisps/midi +++ /dev/null @@ -1 +0,0 @@ -../../../../nisps/midi \ No newline at end of file diff --git a/firmware/MEMLNaut-NISPS/src/nisps/ml b/firmware/MEMLNaut-NISPS/src/nisps/ml deleted file mode 120000 index b44a260..0000000 --- a/firmware/MEMLNaut-NISPS/src/nisps/ml +++ /dev/null @@ -1 +0,0 @@ -../../../../nisps/ml \ No newline at end of file diff --git a/firmware/MEMLNaut-NISPS/src/nisps/modes b/firmware/MEMLNaut-NISPS/src/nisps/modes deleted file mode 120000 index e911c5d..0000000 --- a/firmware/MEMLNaut-NISPS/src/nisps/modes +++ /dev/null @@ -1 +0,0 @@ -../../../../nisps/modes \ No newline at end of file diff --git a/firmware/README.md b/firmware/README.md index 31cbbcb..03d6cdc 100644 --- a/firmware/README.md +++ b/firmware/README.md @@ -1,41 +1,59 @@ -# `firmware/` — Arduino sketch + hardware glue +# `firmware/` — PlatformIO firmware + hardware glue Thin shell around `nisps/`. The platform-agnostic ML / DSP / engines / modes live there; this directory contains: -- `MEMLNaut-NISPS.ino` — entry point. Picks one mode at compile time, hosts the dual-core lifecycle (Core 0: ML + UI, Core 1: audio + MIDI), and connects glue to mode. -- `glue/audio_driver.hpp` — bridges memllib's `AudioDriver` block callback to `Mode::process(stereosample_t)`. Templated trampoline so no virtual dispatch in audio path. -- `glue/peripherals.hpp` — wires MEMLNaut joystick / pots / buttons to `Mode::set_input(idx, value)` and the ML primitives (`draw_weights`, `move_weights`, `train`, `reset`). -- `glue/midi_io.hpp` — binds incoming MIDI to `mode.note_on/note_off/update_bpm/set_playing` (where supported); drains outgoing `ControlEvent`s from the mode's ring buffer to the MIDI UART. -- `glue/output_router.hpp` — drains engine events + mode events; called from `loop1()`. -- `glue/mode_select.hpp` — type aliases mapping `MEMLNautMode` identifiers to `nisps::modes::Mode` C++ types. Build script rewrites `MEMLNAUT_MODE_TYPE` between the alternatives. +- `MEMLNaut-NISPS/platformio.ini` — the build: one `[env:]` per firmware variant (the variant list here IS the registry). See the file itself for the full flag/library rationale. +- `MEMLNaut-NISPS/src/main.cpp` — entry point. Picks one mode at compile time via `MEMLNAUT_MODE_TYPE` (a per-env build flag, not an in-source registry), hosts the dual-core lifecycle (Core 0: ML + UI, Core 1: audio + MIDI), and connects glue to mode. +- `MEMLNaut-NISPS/glue/audio_driver.hpp` — bridges memllib's `AudioDriver` block callback to `Mode::process(stereosample_t)`. Templated trampoline so no virtual dispatch in audio path. +- `MEMLNaut-NISPS/glue/peripherals.hpp` — wires MEMLNaut joystick / pots / buttons to `Mode::set_input(idx, value)` and the ML primitives (`draw_weights`, `move_weights`, `train`, `reset`). +- `MEMLNaut-NISPS/glue/midi_io.hpp` — binds incoming MIDI to `mode.note_on/note_off/update_bpm/set_playing` (where supported); drains outgoing `ControlEvent`s from the mode's ring buffer to the MIDI UART. +- `MEMLNaut-NISPS/glue/output_router.hpp` — drains engine events + mode events; called from `loop1()`. +- `MEMLNaut-NISPS/glue/mode_select.hpp` — type aliases mapping `MEMLNautMode` identifiers to `nisps::modes::Mode` C++ types. The active alias is chosen per PlatformIO env (`-DMEMLNAUT_MODE_TYPE=...`), not by rewriting a source file. +- `MEMLNaut-NISPS/glue/selftest.hpp` — the guided hardware self-test rig (`selftest` env, `-DNISPS_SELFTEST=1`). +- `MEMLNaut-NISPS/lib/memllib/` — **vendored** hardware-abstraction library (audio driver, TFT display, MIDI I/O, peripherals). Not a submodule — see `lib/memllib/VENDORED.md` for provenance and the re-sync procedure. +- `useq-celium/` — standalone RP2040 firmware for the uSEQ-Celium USB→CV/gate converter (separate PlatformIO project; unrelated to the MEMLNaut-NISPS build described here). ## Building ```bash scripts/build-firmware.sh # interactive variant prompt -scripts/build-firmware.sh PAFSynth # build a specific variant -scripts/build-and-flash-firmware.sh # build + flash via UF2 +scripts/build-firmware.sh pafsynth # build a specific variant +scripts/build-firmware.sh --all # build every variant +scripts/build-and-flash-firmware.sh # build + flash via picotool ``` -Target: `rp2040:rp2040:solderparty_rp2350_stamp_xl:opt=Optimize3` with `compiler.cpp.extra_flags=-std=gnu++20`. +These wrap `pio` (PlatformIO Core). If `pio` isn't on `PATH`, run through +`nix-shell -p platformio-core --run '...'` — **not** `nix-shell -p platformio`, +which wraps the CLI in a bubblewrap FHS sandbox that fails without a working +user namespace (containers/sandboxes). `platformio-core` is the same CLI, +unwrapped. First build downloads the RP2350 platform + toolchain + libraries +into `~/.platformio` (hundreds of MB) — be patient once, fast after. + +Target board: `solderparty_rp2350_stamp_xl` (RP2350, Cortex-M33), `-O3`, +`-std=gnu++20`. See `platformio.ini` for the exact flag/version pins. ## Include paths -Arduino-CLI compiles every `*.cpp` / `*.hpp` reachable from the sketch directory and from any submodule under `src/`. Headers under `nisps/` are included via relative path (`#include "../../nisps/..."`). No `-I` flag injection needed. +- `nisps/` (platform-neutral, shared with the WASM build) is reached via + `-I${PROJECT_DIR}/../..` (repo root) — never copied or symlinked into + `firmware/`. Includes look like `#include "nisps/core/perf.hpp"`. +- `lib/memllib/` is a PlatformIO private library (`library.properties` + + `src/` — the standard Arduino 1.5 layout, required for PlatformIO to + recursively compile its nested subdirectories; see `VENDORED.md`). Its + `src/` becomes the include root: `#include "audio/AudioDriver.hpp"`, no + `memllib/` or `src/` prefix. +- `glue/` is reached via `-I${PROJECT_DIR}`: `#include "glue/audio_driver.hpp"`. -`src/memllib` is the only git submodule; the `firmware-common.sh` wrapper rejects builds when it drifts from the recorded revision. +There is no git submodule anywhere in this tree. ## Verification -You cannot test on hardware from a sandbox. We verify three things: +You cannot test on hardware from a sandbox. We verify: -1. `arduino-cli compile` succeeds for at least three modes (PAFSynth, ChannelStrip, BreakOr). -2. Host C++ tests in `nisps/build` still pass — the firmware refactor must not perturb the platform-agnostic library. -3. `git grep` confirms no remaining references to deleted root-level files. - -## Removed - -- Root-level `MEMLNaut-NISPS.ino`, `IMLInterface.hpp`, `*AudioApp.hpp`, `XiasriAnalysis.{cpp,hpp}` — replaced by `nisps/engines/*` and `firmware/MEMLNaut-NISPS.ino`. -- Root-level `modes/MEMLNautMode*.hpp` and `modes/AudioApps/` — replaced by `nisps/modes/*` and the `mode_select.hpp` type aliases. -- Root-level `voicespaces/` — replaced by static voice space data inlined into engines (`nisps/engines/paf_synth.hpp` etc.). -- `src/memlp/` submodule — replaced by `nisps/ml/`. +1. Every `[env:...]` in `platformio.ini` builds (`scripts/build-firmware.sh --all`). +2. Flash/RAM sizes are comparable to an arduino-cli build of the same source + at the same commit — use `arm-none-eabi-size -A` (text+rodata vs. + data+bss) rather than `pio run`'s own console "Flash: NN%" line, which + double-counts `.data` for this board (see the note in `platformio.ini`). +3. Host C++ tests in `nisps/build` still pass — the firmware build system + must not perturb the platform-agnostic library (`scripts/run-all-tests.sh`). diff --git a/scripts/build-and-flash-firmware.sh b/scripts/build-and-flash-firmware.sh index 831569c..30d5d22 100755 --- a/scripts/build-and-flash-firmware.sh +++ b/scripts/build-and-flash-firmware.sh @@ -6,12 +6,11 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" usage() { cat <<'EOF' Usage: - scripts/build-and-flash-firmware.sh scripts/build-and-flash-firmware.sh [variant] - scripts/build-and-flash-firmware.sh --variant VARIANT [mountpoint] + scripts/build-and-flash-firmware.sh --variant VARIANT -If no mountpoint is provided, the flash step auto-detects a standard UF2 -bootloader location such as /run/media/$USER/RP2350 or /run/media/$USER/RPI-RP2. +Builds then flashes (via PlatformIO's picotool upload protocol) the given +firmware variant. Put the board in bootloader mode first. EOF } @@ -20,11 +19,12 @@ if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then exit 0 fi +# shellcheck source=./firmware-common.sh source "$SCRIPT_DIR/firmware-common.sh" +ensure_pio load_firmware_variants variant_arg="${MEMLNAUT_FIRMWARE_VARIANT:-}" -mountpoint="" while [[ $# -gt 0 ]]; do case "$1" in @@ -41,27 +41,18 @@ while [[ $# -gt 0 ]]; do shift ;; *) - if [[ -z "$variant_arg" ]] && resolve_firmware_variant "$1" >/dev/null 2>&1; then + if [[ -z "$variant_arg" ]]; then variant_arg="$1" - elif [[ -z "$mountpoint" ]]; then - mountpoint="$1" + shift else usage >&2 exit 1 fi - shift ;; esac done -if [[ -n "$variant_arg" ]]; then - "$SCRIPT_DIR/build-firmware.sh" --variant "$variant_arg" -else - "$SCRIPT_DIR/build-firmware.sh" -fi +selected="$(choose_firmware_variant "$variant_arg")" -if [[ -n "$mountpoint" ]]; then - "$SCRIPT_DIR/flash-firmware.sh" "$mountpoint" -else - "$SCRIPT_DIR/flash-firmware.sh" -fi +"$SCRIPT_DIR/build-firmware.sh" --variant "$selected" +"$SCRIPT_DIR/flash-firmware.sh" --variant "$selected" diff --git a/scripts/build-firmware-arch.sh b/scripts/build-firmware-arch.sh deleted file mode 100755 index 66d7a1c..0000000 --- a/scripts/build-firmware-arch.sh +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env bash -# -# build-firmware-arch.sh — build the MEMLNaut RP2350 firmware on Arch Linux -# (incl. Omarchy). Checks + installs system deps via pacman/yay, brings up the -# arduino-cli toolchain + rp2040 core, and compiles a firmware variant. -# -# Idempotent: safe to re-run. This is a thin Arch-specific front-end around the -# cross-platform scripts/setup-firmware-toolchain.sh + scripts/build-firmware.sh. -# -# Usage: -# scripts/build-firmware-arch.sh [VARIANT] # default VARIANT=PAFSynth -# scripts/build-firmware-arch.sh --setup-only # toolchain only, no compile -# scripts/build-firmware-arch.sh --list # list firmware variants -# -# The rp2040 core download is large (hundreds of MB — it bundles arm-none-eabi -# GCC). Run on your laptop, on mains power, with a good connection. - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" - -VARIANT="PAFSynth" -SETUP_ONLY=0 -for arg in "$@"; do - case "$arg" in - --setup-only) SETUP_ONLY=1 ;; - --list) grep -oE '"[A-Za-z0-9]+"' "$REPO_ROOT/scripts/build-firmware.sh" 2>/dev/null | head; exit 0 ;; - -h|--help) sed -n '2,18p' "$0"; exit 0 ;; - -*) echo "unknown flag: $arg" >&2; exit 2 ;; - *) VARIANT="$arg" ;; - esac -done - -log() { printf '\n\033[1;36m==> %s\033[0m\n' "$*"; } -warn() { printf '\033[1;33mwarning: %s\033[0m\n' "$*" >&2; } -die() { printf '\033[1;31merror: %s\033[0m\n' "$*" >&2; exit 1; } - -# ---- 0. sanity: are we on Arch? ---------------------------------------- -command -v pacman >/dev/null 2>&1 || die "pacman not found — this script is for Arch Linux / Omarchy. Use scripts/setup-firmware-toolchain.sh on other distros." - -# ---- 1. system deps via pacman ----------------------------------------- -# The rp2040 core ships its own arm-none-eabi GCC, so we only need the basics -# (git/curl/unzip) + python (some core post-install steps want it). -need_pkgs=() -for bin_pkg in "git:git" "curl:curl" "unzip:unzip" "python:python"; do - bin="${bin_pkg%%:*}"; pkg="${bin_pkg##*:}" - command -v "$bin" >/dev/null 2>&1 || need_pkgs+=("$pkg") -done -if (( ${#need_pkgs[@]} )); then - log "Installing system deps via pacman: ${need_pkgs[*]}" - sudo pacman -S --needed --noconfirm "${need_pkgs[@]}" -else - log "System deps present (git, curl, unzip, python)" -fi - -# ---- 2. arduino-cli ----------------------------------------------------- -# Prefer the official binary (matches the cross-platform setup script's pin); -# fall back to AUR (yay) if the user already has arduino-cli from there. -if ! command -v arduino-cli >/dev/null 2>&1; then - if command -v yay >/dev/null 2>&1; then - log "Installing arduino-cli from the AUR (yay)" - yay -S --needed --noconfirm arduino-cli || warn "yay install failed; the toolchain script will fetch the official binary into ~/.local/bin" - else - log "arduino-cli not found; the toolchain script will install it into ~/.local/bin" - fi -fi - -# ---- 3. submodule bring-up ---------------------------------------------- -# memllib provides the audio/synth/hardware tree the sketch compiles against. -log "Checking the memllib submodule" -git -C "$REPO_ROOT" submodule update --init --recursive -if [[ ! -e "$REPO_ROOT/firmware/MEMLNaut-NISPS/src/memllib/hardware/memlnaut" ]]; then - die "src/memllib looks empty after submodule init — check the submodule pin and remote." -fi - -# ---- 4. toolchain bring-up (delegates the heavy lifting) ---------------- -log "Bringing up the arduino-cli toolchain + rp2040 core + libraries" -if (( SETUP_ONLY )); then - "$REPO_ROOT/scripts/setup-firmware-toolchain.sh" --no-build - log "Setup complete (--setup-only). Run without --setup-only to compile." - exit 0 -fi -"$REPO_ROOT/scripts/setup-firmware-toolchain.sh" --no-build - -# ---- 5. build the requested variant ------------------------------------ -export PATH="$HOME/.local/bin:$PATH" -log "Building firmware variant: $VARIANT" -"$REPO_ROOT/scripts/build-firmware.sh" "$VARIANT" - -log "Done. Flash with: scripts/flash-firmware.sh (hold BOOTSEL while plugging in the RP2350)." diff --git a/scripts/build-firmware.sh b/scripts/build-firmware.sh index f13838b..4f85d58 100755 --- a/scripts/build-firmware.sh +++ b/scripts/build-firmware.sh @@ -9,26 +9,36 @@ if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then cat <<'EOF' Usage: scripts/build-firmware.sh [variant] - scripts/build-firmware.sh --variant VARIANT [extra arduino-cli compile args...] - scripts/build-firmware.sh [variant] -- [extra arduino-cli compile args...] + scripts/build-firmware.sh --all + scripts/build-firmware.sh --variant VARIANT [extra `pio run` args...] + scripts/build-firmware.sh [variant] -- [extra `pio run` args...] -Builds the MEMLNaut firmware with the repo's known-good RP2350 target and C++20 flag. -If no variant is provided and the script is run in a TTY, it prompts from the parsed -MEMLNaut mode list in MEMLNaut-NISPS.ino and rewrites the active mode before building. +Builds the MEMLNaut firmware via PlatformIO (firmware/MEMLNaut-NISPS/platformio.ini). +If no variant is provided and the script is run in a TTY, it prompts from the +[env:...] sections in platformio.ini. --all builds every variant in one +PlatformIO invocation. + +Requires `pio` (PlatformIO Core) on PATH — see +scripts/setup-firmware-toolchain.sh, or run under: + nix-shell -p platformio-core --run 'scripts/build-firmware.sh ...' EOF exit 0 fi -ensure_arduino_cli -ensure_submodules_ready +ensure_pio variant_arg="${MEMLNAUT_FIRMWARE_VARIANT:-}" -compile_extra=() +build_all=0 +run_extra=() load_firmware_variants while [[ $# -gt 0 ]]; do case "$1" in + --all) + build_all=1 + shift + ;; --variant) if [[ $# -lt 2 ]]; then echo "error: --variant requires a value" >&2 @@ -43,40 +53,58 @@ while [[ $# -gt 0 ]]; do ;; --) shift - compile_extra+=("$@") + run_extra+=("$@") break ;; + -*) + # Looks like a passthrough flag for `pio run` (e.g. -v), not a variant. + run_extra+=("$1") + shift + ;; *) - if [[ -z "$variant_arg" ]] && resolve_firmware_variant "$1" >/dev/null 2>&1; then - variant_arg="$1" - else - compile_extra+=("$1") + # A bare word is an attempted variant name, not passthrough — resolve it + # now so a typo fails loudly instead of turning into a confusing + # "Got unexpected extra argument" error from `pio run` later. + if [[ -n "$variant_arg" ]]; then + echo "error: unexpected extra argument: $1 (variant already set to $variant_arg)" >&2 + exit 1 fi + variant_arg="$(resolve_firmware_variant "$1")" || { + echo "error: unknown firmware variant: $1" >&2 + echo "available variants (from $PLATFORMIO_INI):" >&2 + for v in "${FIRMWARE_VARIANTS[@]}"; do + echo " - $v" >&2 + done + exit 1 + } shift ;; esac done -set_firmware_variant "$variant_arg" -mkdir -p "$BUILD_DIR" +if [[ "$build_all" -eq 1 ]]; then + echo "Building ALL firmware variants: ${FIRMWARE_VARIANTS[*]}" + env_args=() + for v in "${FIRMWARE_VARIANTS[@]}"; do + env_args+=(-e "$v") + done + run_pio run "${env_args[@]}" "${run_extra[@]}" + echo + echo "UF2s ready under:" + for v in "${FIRMWARE_VARIANTS[@]}"; do + echo " $FIRMWARE_PROJECT_DIR/.pio/build/$v/firmware.uf2" + done + exit 0 +fi + +selected="$(choose_firmware_variant "$variant_arg")" echo "Building firmware:" -echo " sketch: $SKETCH_PATH" -echo " fqbn: $FQBN" -echo " out: $BUILD_DIR" -echo " variant: $(variant_display_name "$ACTIVE_FIRMWARE_VARIANT")" +echo " project: $FIRMWARE_PROJECT_DIR" +echo " variant: $selected" -compile_args=( - compile - --fqbn "$FQBN" - --build-property "$CXX20_BUILD_PROPERTY" - --output-dir "$BUILD_DIR" - "$SKETCH_PATH" -) -compile_args+=("${compile_extra[@]}") - -arduino-cli "${compile_args[@]}" +run_pio run -e "$selected" "${run_extra[@]}" echo echo "UF2 ready at:" -echo " $UF2_PATH_DEFAULT" +echo " $FIRMWARE_PROJECT_DIR/.pio/build/$selected/firmware.uf2" diff --git a/scripts/firmware-common.sh b/scripts/firmware-common.sh index 602284f..0e00360 100755 --- a/scripts/firmware-common.sh +++ b/scripts/firmware-common.sh @@ -4,226 +4,64 @@ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" -SKETCH_PATH="${MEMLNAUT_FIRMWARE_SKETCH:-$REPO_ROOT/firmware/MEMLNaut-NISPS/MEMLNaut-NISPS.ino}" -SKETCH_NAME="$(basename "$SKETCH_PATH")" -BUILD_DIR="${MEMLNAUT_FIRMWARE_BUILD_DIR:-/tmp/memlnaut-firmware-build}" -UF2_PATH_DEFAULT="${MEMLNAUT_FIRMWARE_UF2:-$BUILD_DIR/${SKETCH_NAME}.uf2}" - -FQBN="${MEMLNAUT_FIRMWARE_FQBN:-rp2040:rp2040:solderparty_rp2350_stamp_xl:opt=Optimize3}" -CXX20_BUILD_PROPERTY="${MEMLNAUT_FIRMWARE_CXX20_PROPERTY:-compiler.cpp.extra_flags=-std=gnu++20}" -UF2_LABEL_CANDIDATES=("${MEMLNAUT_FIRMWARE_UF2_LABEL_1:-RP2350}" "${MEMLNAUT_FIRMWARE_UF2_LABEL_2:-RPI-RP2}" "${MEMLNAUT_FIRMWARE_UF2_LABEL_3:-RP2040}") +# PlatformIO project directory (contains platformio.ini). One [env:] +# per firmware variant defined there — that file IS the variant registry, +# there is no separate in-source list to keep in sync. +FIRMWARE_PROJECT_DIR="${MEMLNAUT_FIRMWARE_PROJECT_DIR:-$REPO_ROOT/firmware/MEMLNaut-NISPS}" +PLATFORMIO_INI="$FIRMWARE_PROJECT_DIR/platformio.ini" FIRMWARE_VARIANTS=() -ACTIVE_FIRMWARE_VARIANT="" +ACTIVE_FIRMWARE_VARIANT="" # platformio.ini's [platformio] default_envs, if set -ensure_arduino_cli() { - if ! command -v arduino-cli >/dev/null 2>&1; then - echo "error: arduino-cli is not installed or not on PATH" >&2 - exit 1 - fi -} - -ensure_git() { - if ! command -v git >/dev/null 2>&1; then - echo "error: git is not installed or not on PATH" >&2 - exit 1 - fi -} - -ensure_submodules_ready() { - ensure_git - - local status - status="$(git -C "$REPO_ROOT" submodule status --recursive)" - if grep -qE '^[+-]' <<<"$status"; then - echo "error: submodules are not initialized or not at the recorded revision" >&2 - echo "run: git submodule update --init --recursive" >&2 - exit 1 - fi -} - -resolve_path() { - local path="$1" - - if [[ "$path" = /* ]]; then - printf '%s\n' "$path" - else - printf '%s\n' "$(pwd)/$path" - fi -} - -find_boot_mount() { - local candidates=( - "/run/media/${USER}/RP2350" - "/run/media/${USER}/RPI-RP2" - "/media/${USER}/RP2350" - "/media/${USER}/RPI-RP2" - "/mnt/RP2350" - "/mnt/RPI-RP2" - ) - local candidate - - for candidate in "${candidates[@]}"; do - if [[ -d "$candidate" ]]; then - printf '%s\n' "$candidate" - return 0 - fi - done - - local base - for base in "/run/media/${USER}" "/media/${USER}" "/mnt"; do - [[ -d "$base" ]] || continue - candidate="$(find "$base" -maxdepth 2 -type f -name INFO_UF2.TXT -printf '%h\n' 2>/dev/null | head -n 1 || true)" - if [[ -n "$candidate" ]]; then - printf '%s\n' "$candidate" - return 0 - fi - done - - return 1 -} - -is_known_uf2_label() { - local label="$1" - local candidate - - for candidate in "${UF2_LABEL_CANDIDATES[@]}"; do - if [[ -n "$candidate" && "$label" == "$candidate" ]]; then - return 0 - fi - done - - return 1 -} - -find_boot_block_device() { - local line - local dev_path="" - local dev_fstype="" - local dev_label="" - local dev_mountpoints="" - - while IFS= read -r line; do - dev_path="" - dev_fstype="" - dev_label="" - dev_mountpoints="" - eval "$( - sed -E \ - -e 's/(^|[[:space:]])PATH=/\1dev_path=/' \ - -e 's/(^|[[:space:]])FSTYPE=/\1dev_fstype=/' \ - -e 's/(^|[[:space:]])LABEL=/\1dev_label=/' \ - -e 's/(^|[[:space:]])MOUNTPOINTS=/\1dev_mountpoints=/' \ - <<<"$line" - )" - - [[ -n "$dev_path" ]] || continue - [[ "$dev_fstype" == "vfat" || "$dev_fstype" == "msdos" || "$dev_fstype" == "fat" ]] || continue - is_known_uf2_label "$dev_label" || continue - - printf '%s\n' "$dev_path" - return 0 - done < <(lsblk -P -o PATH,FSTYPE,LABEL,MOUNTPOINTS 2>/dev/null || true) - - return 1 -} - -mount_boot_block_device() { - local device_path="$1" - local mount_output="" - local mounted_path="" - - if command -v udisksctl >/dev/null 2>&1; then - mount_output="$(udisksctl mount -b "$device_path" 2>/dev/null || true)" - mounted_path="$(sed -nE "s#.* at (.+)\.?#\1#p" <<<"$mount_output" | tail -n 1)" - if [[ -n "$mounted_path" && -d "$mounted_path" ]]; then - printf '%s\n' "$mounted_path" - return 0 - fi - fi - - return 1 -} - -ensure_boot_mount() { - local mountpoint="" - local device_path="" - - mountpoint="$(find_boot_mount || true)" - if [[ -n "$mountpoint" ]]; then - printf '%s\n' "$mountpoint" +ensure_pio() { + if command -v pio >/dev/null 2>&1; then return 0 fi - - device_path="$(find_boot_block_device || true)" - if [[ -z "$device_path" ]]; then - return 1 - fi - - mountpoint="$(mount_boot_block_device "$device_path" || true)" - if [[ -n "$mountpoint" ]]; then - printf '%s\n' "$mountpoint" - return 0 - fi - - mountpoint="$(find_boot_mount || true)" - if [[ -n "$mountpoint" ]]; then - printf '%s\n' "$mountpoint" - return 0 - fi - - return 1 + echo "error: pio (PlatformIO Core) is not installed or not on PATH" >&2 + echo " This machine uses nix. Run commands through:" >&2 + echo " nix-shell -p platformio-core --run ''" >&2 + echo " (NOT 'nix-shell -p platformio' — that package wraps the CLI in a" >&2 + echo " bubblewrap FHS sandbox that needs a real user namespace and fails" >&2 + echo " under containerised/sandboxed shells. platformio-core is the same" >&2 + echo " CLI, unwrapped, and works everywhere.)" >&2 + exit 1 } -assert_boot_mount() { - local mountpoint="$1" - - if [[ ! -d "$mountpoint" ]]; then - echo "error: bootloader mount does not exist: $mountpoint" >&2 - exit 1 - fi - - if [[ ! -f "$mountpoint/INFO_UF2.TXT" && ! -f "$mountpoint/INDEX.HTM" ]]; then - echo "error: $mountpoint does not look like an RP2040/RP2350 UF2 boot volume" >&2 - exit 1 - fi +# Runs `pio` against the firmware project dir without requiring the caller's +# cwd to be there. Always goes through nix-shell so callers don't need pio +# pre-installed on PATH. +run_pio() { + ensure_pio + pio "$@" -d "$FIRMWARE_PROJECT_DIR" } load_firmware_variants() { - mapfile -t FIRMWARE_VARIANTS < <( - grep -E '^[[:space:]]*(//[[:space:]]*)?#define[[:space:]]+MEMLNAUT_MODE_TYPE[[:space:]]+MEMLNautMode[A-Za-z0-9_]+' "$SKETCH_PATH" \ - | sed -E 's/^[[:space:]]*(\/\/[[:space:]]*)?#define[[:space:]]+MEMLNAUT_MODE_TYPE[[:space:]]+//' - ) + if [[ ! -f "$PLATFORMIO_INI" ]]; then + echo "error: platformio.ini not found: $PLATFORMIO_INI" >&2 + exit 1 + fi + mapfile -t FIRMWARE_VARIANTS < <( + grep -E '^\[env:[A-Za-z0-9_]+\]' "$PLATFORMIO_INI" | sed -E 's/^\[env:([A-Za-z0-9_]+)\]$/\1/' + ) if [[ ${#FIRMWARE_VARIANTS[@]} -eq 0 ]]; then - echo "error: could not find any MEMLNaut mode variants in $SKETCH_PATH" >&2 + echo "error: no [env:] sections found in $PLATFORMIO_INI" >&2 exit 1 fi ACTIVE_FIRMWARE_VARIANT="$( - grep -E '^[[:space:]]*#define[[:space:]]+MEMLNAUT_MODE_TYPE[[:space:]]+MEMLNautMode[A-Za-z0-9_]+' "$SKETCH_PATH" \ - | sed -E 's/^[[:space:]]*#define[[:space:]]+MEMLNAUT_MODE_TYPE[[:space:]]+//' \ - | head -n 1 + grep -E '^\s*default_envs\s*=' "$PLATFORMIO_INI" | head -n1 \ + | sed -E 's/^\s*default_envs\s*=\s*//' | tr -d '[:space:]' )" } -variant_display_name() { - local variant="$1" - printf '%s\n' "${variant#MEMLNautMode}" -} - -variant_alias() { - variant_display_name "$1" | tr '[:upper:]' '[:lower:]' -} - resolve_firmware_variant() { local requested="$1" - local requested_lower - local variant + local requested_lower variant requested_lower="$(printf '%s' "$requested" | tr '[:upper:]' '[:lower:]')" for variant in "${FIRMWARE_VARIANTS[@]}"; do - if [[ "$requested" == "$variant" || "$requested_lower" == "$(printf '%s' "$variant" | tr '[:upper:]' '[:lower:]')" || "$requested_lower" == "$(variant_alias "$variant")" ]]; then + if [[ "$requested_lower" == "$(printf '%s' "$variant" | tr '[:upper:]' '[:lower:]')" ]]; then printf '%s\n' "$variant" return 0 fi @@ -248,9 +86,9 @@ choose_firmware_variant() { fi echo "error: unknown firmware variant: $requested" >&2 - echo "available variants:" >&2 + echo "available variants (from $PLATFORMIO_INI):" >&2 for variant in "${FIRMWARE_VARIANTS[@]}"; do - echo " - $(variant_display_name "$variant") ($variant)" >&2 + echo " - $variant" >&2 done exit 1 fi @@ -260,9 +98,9 @@ choose_firmware_variant() { local idx=1 for variant in "${FIRMWARE_VARIANTS[@]}"; do if [[ "$variant" == "$ACTIVE_FIRMWARE_VARIANT" ]]; then - printf ' %d) %s (%s, current)\n' "$idx" "$(variant_display_name "$variant")" "$variant" >&"$tty_fd" + printf ' %d) %s (default)\n' "$idx" "$variant" >&"$tty_fd" else - printf ' %d) %s (%s)\n' "$idx" "$(variant_display_name "$variant")" "$variant" >&"$tty_fd" + printf ' %d) %s\n' "$idx" "$variant" >&"$tty_fd" fi idx=$((idx + 1)) done @@ -286,52 +124,11 @@ choose_firmware_variant() { fi if [[ -n "$ACTIVE_FIRMWARE_VARIANT" ]]; then - echo "No variant specified and no interactive terminal available; using current variant: $(variant_display_name "$ACTIVE_FIRMWARE_VARIANT")" >&2 + echo "No variant specified and no interactive terminal available; using platformio.ini's default_envs: $ACTIVE_FIRMWARE_VARIANT" >&2 printf '%s\n' "$ACTIVE_FIRMWARE_VARIANT" return 0 fi - echo "error: no variant specified and no active variant found in $SKETCH_PATH" >&2 + echo "error: no variant specified, no interactive terminal, and no default_envs set in $PLATFORMIO_INI" >&2 exit 1 } - -set_firmware_variant() { - local requested="$1" - local selected - - selected="$(choose_firmware_variant "$requested")" - "${PYTHON:-python3}" - "$SKETCH_PATH" "$selected" <<'PY' -from pathlib import Path -import re -import sys - -sketch_path = Path(sys.argv[1]) -selected = sys.argv[2] - -pattern = re.compile(r'^(\s*)(//\s*)?#define(\s+MEMLNAUT_MODE_TYPE\s+)(MEMLNautMode[A-Za-z0-9_]+)(\s*)$') -lines = sketch_path.read_text().splitlines() -updated = [] -found_selected = False - -for line in lines: - match = pattern.match(line) - if not match: - updated.append(line) - continue - - indent, _, middle, variant, trailing = match.groups() - if variant == selected: - updated.append(f"{indent}#define{middle}{variant}{trailing}") - found_selected = True - else: - updated.append(f"{indent}// #define{middle}{variant}{trailing}") - -if not found_selected: - raise SystemExit(f"selected variant not found in sketch: {selected}") - -sketch_path.write_text("\n".join(updated) + "\n") -PY - - ACTIVE_FIRMWARE_VARIANT="$selected" - echo "Selected firmware variant: $(variant_display_name "$selected") ($selected)" -} diff --git a/scripts/flash-firmware.sh b/scripts/flash-firmware.sh index 5289c2b..b94ca14 100755 --- a/scripts/flash-firmware.sh +++ b/scripts/flash-firmware.sh @@ -8,70 +8,59 @@ source "$SCRIPT_DIR/firmware-common.sh" usage() { cat <<'EOF' Usage: - scripts/flash-firmware.sh - scripts/flash-firmware.sh [mountpoint] - scripts/flash-firmware.sh [uf2-path] [mountpoint] + scripts/flash-firmware.sh [variant] + scripts/flash-firmware.sh --variant VARIANT -Defaults: - uf2-path -> /tmp/memlnaut-firmware-build/MEMLNaut-NISPS.ino.uf2 - mountpoint -> auto-detect from standard UF2 bootloader locations +Builds (if stale) and flashes the given firmware variant via PlatformIO's +`picotool` upload protocol (platformio.ini `upload_protocol = picotool`). +picotool talks to the RP2040/2350 USB bootloader directly — no BOOTSEL-mode +mount-point detection or UF2-file-copy step required. + +Put the board in bootloader mode (hold BOOTSEL while plugging in, or the +board's reset-to-bootloader combo) before running this. EOF } -uf2_path="$UF2_PATH_DEFAULT" -mountpoint="" - if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then usage exit 0 fi -case $# in - 0) - ;; - 1) - if [[ -f "$1" || "$1" == *.uf2 ]]; then - uf2_path="$1" - else - mountpoint="$1" - fi - ;; - 2) - uf2_path="$1" - mountpoint="$2" - ;; - *) - usage >&2 - exit 1 - ;; -esac +ensure_pio -uf2_path="$(resolve_path "$uf2_path")" -if [[ ! -f "$uf2_path" ]]; then - echo "error: UF2 file not found: $uf2_path" >&2 - echo "run scripts/build-firmware.sh first, or pass an explicit UF2 path" >&2 - exit 1 -fi +variant_arg="${MEMLNAUT_FIRMWARE_VARIANT:-}" -if [[ -z "$mountpoint" ]]; then - mountpoint="$(ensure_boot_mount || true)" -fi +while [[ $# -gt 0 ]]; do + case "$1" in + --variant) + if [[ $# -lt 2 ]]; then + echo "error: --variant requires a value" >&2 + exit 1 + fi + variant_arg="$2" + shift 2 + ;; + --variant=*) + variant_arg="${1#*=}" + shift + ;; + *) + if [[ -z "$variant_arg" ]]; then + variant_arg="$1" + shift + else + usage >&2 + exit 1 + fi + ;; + esac +done -if [[ -z "$mountpoint" ]]; then - echo "error: could not find or mount a UF2 bootloader volume" >&2 - echo "put the board in bootloader mode, or pass the mountpoint explicitly" >&2 - exit 1 -fi - -mountpoint="$(resolve_path "$mountpoint")" -assert_boot_mount "$mountpoint" +selected="$(choose_firmware_variant "$variant_arg")" echo "Flashing firmware:" -echo " uf2: $uf2_path" -echo " mountpoint: $mountpoint" +echo " project: $FIRMWARE_PROJECT_DIR" +echo " variant: $selected" +echo " (board must be in BOOTSEL/bootloader mode)" -cp "$uf2_path" "$mountpoint/" -sync - -echo -echo "Flash copy completed." +run_pio run -e "$selected" -t upload diff --git a/scripts/setup-firmware-toolchain.sh b/scripts/setup-firmware-toolchain.sh index 1599b15..12e3da2 100755 --- a/scripts/setup-firmware-toolchain.sh +++ b/scripts/setup-firmware-toolchain.sh @@ -1,36 +1,35 @@ #!/usr/bin/env bash # -# setup-firmware-toolchain.sh — one-shot bring-up of the MEMLNaut firmware -# build environment. Idempotent: safe to re-run. +# setup-firmware-toolchain.sh — bring-up check for the MEMLNaut firmware +# PlatformIO build. Idempotent: safe to re-run. # -# It will: -# 1. Initialise the git submodule (memllib). -# 2. Install arduino-cli (to ~/.local/bin) if it is not already on PATH. -# 3. Install the earlephilhower rp2040 core (provides the -# solderparty_rp2350_stamp_xl board + the ARM GCC toolchain). -# 4. Install the Arduino libraries the firmware needs -# (TFT_eSPI, TFT_eWidget, MIDI Library). -# 5. Drop the MEMLNaut-specific TFT_eSPI config (ILI9341, 320x240, MEMLNaut -# pins) into the installed TFT_eSPI library as User_Setup.h, backing up -# the stock one first. memllib `#include ` directly, so this -# is the load-bearing step that makes the display compile + work. -# 6. Optionally compile the SelfTest firmware to verify the whole chain. +# There is very little left to "set up": memllib is vendored into +# firmware/MEMLNaut-NISPS/lib/memllib (no submodule to init), and PlatformIO +# bootstraps its own platform + toolchain + libraries (TFT_eSPI, TFT_eWidget, +# MIDI Library, all version-pinned in platformio.ini) into ~/.platformio on +# first build — no global Arduino library-directory mutation, no manual +# TFT_eSPI User_Setup.h copy (that config is now `-D` build flags in +# platformio.ini). +# +# This script just: +# 1. Checks `pio` (PlatformIO Core) is reachable. +# 2. Optionally compiles the `selftest` variant to verify the whole chain +# (downloads ~1-2 GB of platform/toolchain packages on first run). # # Usage: -# scripts/setup-firmware-toolchain.sh # full setup + verify build -# scripts/setup-firmware-toolchain.sh --no-build # setup only, skip the build +# scripts/setup-firmware-toolchain.sh # verify via a SelfTest build +# scripts/setup-firmware-toolchain.sh --no-build # just check `pio` is reachable # -# Run this on your firmware build machine (Linux or macOS), NOT inside a -# sandbox. The rp2040 core download is large (hundreds of MB: it bundles the -# arm-none-eabi GCC toolchain). +# This machine uses nix. If `pio` isn't already on PATH, run this script (and +# the other firmware scripts) through: +# nix-shell -p platformio-core --run 'scripts/setup-firmware-toolchain.sh' +# NOT `nix-shell -p platformio` — that package wraps the CLI in a bubblewrap +# FHS sandbox that fails under containerised/sandboxed shells (no working user +# namespace). `platformio-core` is the same CLI, unwrapped. set -euo pipefail -# ---- config ------------------------------------------------------------- -RP2040_INDEX_URL="https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json" -ARDUINO_LIBS=("TFT_eSPI" "TFT_eWidget" "MIDI Library") DO_BUILD=1 - for arg in "$@"; do case "$arg" in --no-build) DO_BUILD=0 ;; @@ -40,81 +39,29 @@ for arg in "$@"; do done SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" -TFT_SETUP_SRC="$REPO_ROOT/firmware/MEMLNaut-NISPS/src/memllib/hardware/memlnaut/Setup9999_MEMLNaut.h.renameme" +# shellcheck source=./firmware-common.sh +source "$SCRIPT_DIR/firmware-common.sh" log() { printf '\n\033[1;36m==> %s\033[0m\n' "$*"; } -warn() { printf '\033[1;33mwarning: %s\033[0m\n' "$*" >&2; } die() { printf '\033[1;31merror: %s\033[0m\n' "$*" >&2; exit 1; } -# ---- 1. submodules ------------------------------------------------------ -log "Initialising git submodule (memllib)" -command -v git >/dev/null 2>&1 || die "git is not installed" -git -C "$REPO_ROOT" submodule update --init --recursive +log "Checking for PlatformIO Core (pio)" +ensure_pio +log "pio found: $(command -v pio) ($(pio --version 2>&1 | head -1))" -[[ -f "$TFT_SETUP_SRC" ]] || die "TFT setup file missing after submodule init: $TFT_SETUP_SRC" - -# ---- 2. arduino-cli ----------------------------------------------------- -if ! command -v arduino-cli >/dev/null 2>&1; then - log "Installing arduino-cli into ~/.local/bin" - mkdir -p "$HOME/.local/bin" - curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh \ - | BINDIR="$HOME/.local/bin" sh - export PATH="$HOME/.local/bin:$PATH" - command -v arduino-cli >/dev/null 2>&1 || die "arduino-cli install failed" - warn "arduino-cli was installed to ~/.local/bin — add it to your shell PATH permanently:" - warn " echo 'export PATH=\"\$HOME/.local/bin:\$PATH\"' >> ~/.bashrc # or ~/.zshrc" -else - log "arduino-cli already present: $(command -v arduino-cli) ($(arduino-cli version | head -1))" -fi - -# ---- 3. rp2040 core (earlephilhower) ------------------------------------ -# Pass the board index via --additional-urls so we don't mutate the user's -# global arduino-cli config. -log "Installing rp2040:rp2040 core (this downloads the ARM toolchain — be patient)" -arduino-cli core update-index --additional-urls "$RP2040_INDEX_URL" -if arduino-cli core list 2>/dev/null | grep -q '^rp2040:rp2040'; then - log "rp2040:rp2040 already installed — checking for upgrade" - arduino-cli core upgrade rp2040:rp2040 --additional-urls "$RP2040_INDEX_URL" || true -else - arduino-cli core install rp2040:rp2040 --additional-urls "$RP2040_INDEX_URL" -fi - -# ---- 4. Arduino libraries ---------------------------------------------- -log "Installing Arduino libraries: ${ARDUINO_LIBS[*]}" -arduino-cli lib update-index -for lib in "${ARDUINO_LIBS[@]}"; do - arduino-cli lib install "$lib" -done - -# ---- 5. MEMLNaut TFT_eSPI User_Setup ------------------------------------ -log "Configuring TFT_eSPI for the MEMLNaut display" -USER_DIR="$(arduino-cli config get directories.user 2>/dev/null || true)" -[[ -n "$USER_DIR" ]] || USER_DIR="$HOME/Arduino" -TFT_DIR="$USER_DIR/libraries/TFT_eSPI" -[[ -d "$TFT_DIR" ]] || die "TFT_eSPI library dir not found at $TFT_DIR (did lib install fail?)" - -TFT_SETUP_DST="$TFT_DIR/User_Setup.h" -if [[ -f "$TFT_SETUP_DST" && ! -f "$TFT_SETUP_DST.orig" ]]; then - cp "$TFT_SETUP_DST" "$TFT_SETUP_DST.orig" - log "Backed up stock User_Setup.h -> User_Setup.h.orig" -fi -cp "$TFT_SETUP_SRC" "$TFT_SETUP_DST" -log "Installed MEMLNaut User_Setup.h into $TFT_DIR" - -# ---- 6. verify build ---------------------------------------------------- if [[ "$DO_BUILD" -eq 1 ]]; then - log "Verifying: compiling the SelfTest firmware" - if "$REPO_ROOT/scripts/build-firmware.sh" SelfTest; then - log "SelfTest firmware built successfully ✔" + log "Verifying: compiling the SelfTest firmware (first run downloads the RP2350 platform/toolchain into ~/.platformio — hundreds of MB, be patient)" + if "$SCRIPT_DIR/build-firmware.sh" selftest; then + log "SelfTest firmware built successfully" echo echo "Next: flash it with" - echo " scripts/flash-firmware.sh" - echo "or build a normal mode, e.g. scripts/build-firmware.sh PAFSynth" + echo " scripts/flash-firmware.sh selftest" + echo "or build a normal mode, e.g. scripts/build-firmware.sh pafsynth" + echo "or build every variant: scripts/build-firmware.sh --all" else - die "SelfTest build failed — see the arduino-cli output above. Toolchain/libs are installed; this is a compile error to debug." + die "SelfTest build failed — see the pio output above. This is a compile error to debug, not a missing-toolchain problem (pio bootstraps its own toolchain)." fi else - log "Setup complete (build skipped). Verify with:" - echo " scripts/build-firmware.sh SelfTest" + log "Setup check complete (build skipped). Verify with:" + echo " scripts/build-firmware.sh selftest" fi diff --git a/src/memllib b/src/memllib deleted file mode 160000 index e291192..0000000 --- a/src/memllib +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e291192d8e4f2fca7b79670c4df9c2ec8bdf03cd