proxmark3/fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.high.gold
iZsh 3b2fee43ea New LF edge detection algorithm + lowpass filter
This is a new LF edge detection algorithm for the FPGA.

- It uses a low-pass IIR filter to clean the signal
(see https://fail0verflow.com/blog/2014/proxmark3-fpga-iir-filter.html)
- The algorithm is able to detect consecutive peaks in the same
  direction
- It uses an envelope follower to dynamically adjust the peak thresholds
- The main threshold used in the envelope follower can be set from the ARM side

fpga/lf_edge_detect.v,
fpga/lp20khz_1MSa_iir_filter.v,
fpga/min_max_tracker.v: New file.

fpga/lo_edge_detect.v, fpga/fpga_lf.v: Modify accordingly.

armsrc/apps.h (FPGA_CMD_SET_USER_BYTE1,
FPGA_CMD_SET_EDGE_DETECT_THRESHOLD): New FPGA command.
fpga/fpga_lf.v: Modify accordingly/Add a 8bit user register.

fpga/fpga_lf.bit: Update accordingly.

fpga/tests: New directory for testbenches

fpga/tests/Makefile: New file. It compiles the testbenches
and runs all the tests by default (comparing with the golden output)

fpga/tests/tb_lp20khz_1MSa_iir_filter.v,
fpga/tests/tb_min_max_tracker.v,
fpga/tests/tb_lf_edge_detect.v: New testbenches

fpga/tests/plot_edgedetect.py: New script to plot the results from
the edge detection tests.

fpga/tests/tb_data: New directory for data and golden outputs
2014-06-27 14:27:03 +02:00

1 line
26 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????トトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌヌナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニニナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナナタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタタノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネネノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノノ